From ec9dc296465529bdc099a84fe3110d7d37cd3f4d Mon Sep 17 00:00:00 2001 From: bryanthaboi Date: Thu, 20 Aug 2026 08:27:25 -0400 Subject: [PATCH] Pokemon Silver as a full launcher version, plus launcher mods-list and title-tempo fixes Silver: derived import manifest (tools/make_silver_manifest.py re-resolves the Gold manifest's symbols from pokesilver.sym), silver GameVersion row, generation-keyed extractor routing, required-files override, edition save stamping (a Silver playthrough no longer writes into the Gold save), checkver-driven edition data, SILVER/KAMON/OSCAR/MAX presets, GOLD rival default, edition credits banner, Lugia title screen (OAM layouts, bob, trail, palettes as title.lua data keys with Gold defaults so old caches need no re-import), packaging for every build target, docs, and tests. Launcher: the installed-mods list is one continuous scroll (rows culled to the viewport) instead of a pager with an inner scroll viewport; the pad cursor's edge-scroll no longer runs it to the bottom. The game dropdown shows just the initial and caret. Find-tab behavior unchanged. Title tempo: a sprite-anim frame shows duration+1 ticks (engine/sprite_anims/core.asm GetSpriteAnimFrame), which locks both editions' 64-tick wing beat to the 64-tick sine bob; the title screens no longer run fast and out of phase. --- CONTRIBUTING-mods.md | 22 +- README.md | 17 +- build-linux-arm-sbc.sh | 2 + build-rg34xxsp.sh | 3 + docs/mod-api-gen2-compat.md | 7 +- docs/modding.md | 2 +- docs/new-features.md | 1 + docs/preparing-your-mod-for-gen2.md | 2 +- docs/required-to-function.md | 6 +- docs/switch-install.md | 20 +- docs/switch-transfer.md | 7 +- main.lua | 11 +- mobile/ANDROID.md | 8 +- .../res/drawable-hdpi/ic_shortcut_silver.png | Bin 0 -> 5258 bytes .../res/drawable-mdpi/ic_shortcut_silver.png | Bin 0 -> 3015 bytes .../res/drawable-xhdpi/ic_shortcut_silver.png | Bin 0 -> 8193 bytes .../drawable-xxhdpi/ic_shortcut_silver.png | Bin 0 -> 15334 bytes .../drawable-xxxhdpi/ic_shortcut_silver.png | Bin 0 -> 24076 bytes .../app/src/main/res/values/colors.xml | 1 + scripts/build.sh | 4 +- scripts/build_android.sh | 54 + scripts/linux-arm64/build_appimage.sh | 2 + .../linux-arm64/selftest_build_linux_arm64.sh | 2 + scripts/pack_love.sh | 2 + scripts/run.sh | 4 +- scripts/switch/pack_sd_zip.sh | 14 +- scripts/switch/selftest_build_switch.sh | 4 +- src/core/Game2.lua | 4 +- src/core/GameVersion.lua | 22 +- src/core/LaunchOptions.lua | 1 + src/core/TouchControls.lua | 2 +- src/core/gen2/Save.lua | 36 +- src/debug/SwitchDiagnostics.lua | 6 +- src/import/ExtractThread.lua | 3 +- src/import/LauncherSettings.lua | 11 +- src/import/LauncherView.lua | 307 +- src/import/RomExtractorGen2.lua | 149 +- src/import/RomImporter.lua | 23 +- src/save_convert/SaveConvert.lua | 5 +- src/sync/SyncMods.lua | 2 +- src/ui/TouchControlsEditor.lua | 11 +- src/ui/gen2/Credits.lua | 17 +- src/ui/gen2/GoldSilverIntro.lua | 4 +- src/ui/gen2/MainMenu.lua | 2 +- src/ui/gen2/NamePick.lua | 16 +- src/ui/gen2/OakSpeech.lua | 8 +- src/ui/gen2/PcMenu.lua | 2 +- src/ui/gen2/SaveMenu.lua | 2 +- src/ui/gen2/TitleState.lua | 85 +- src/ui/kit/Theme.lua | 7 +- src/world/gen2/World.lua | 26 +- .../engine/android_shortcuts_payload_test.lua | 11 +- tests/engine/gate_gen2_mod_api.lua | 1 + tests/engine/launcher_gold_touch_rows.lua | 79 +- tests/engine/launcher_scroll_test.lua | 79 +- tests/engine/mod_targets_tests.lua | 20 +- .../rom_importer_nx_saves_inbox_test.lua | 4 +- tests/engine/uwp_baseroms_test.lua | 6 +- tests/gen2_halloffame_test.lua | 6 + tests/gen2_hof_continue_test.lua | 2 + tests/gen2_save_test.lua | 56 +- tests/save_editor_gen2_tests.lua | 56 +- tests/save_editor_mod_tests.lua | 10 + tools/generate_android_icons.py | 3 +- tools/make_silver_manifest.py | 94 + tools/modkit.py | 5 +- tools/rom_data.py | 3 +- tools/rom_manifest_silver.json | 17702 ++++++++++++++++ 68 files changed, 18617 insertions(+), 466 deletions(-) create mode 100644 mobile/android/app/src/main/res/drawable-hdpi/ic_shortcut_silver.png create mode 100644 mobile/android/app/src/main/res/drawable-mdpi/ic_shortcut_silver.png create mode 100644 mobile/android/app/src/main/res/drawable-xhdpi/ic_shortcut_silver.png create mode 100644 mobile/android/app/src/main/res/drawable-xxhdpi/ic_shortcut_silver.png create mode 100644 mobile/android/app/src/main/res/drawable-xxxhdpi/ic_shortcut_silver.png create mode 100644 tools/make_silver_manifest.py create mode 100644 tools/rom_manifest_silver.json diff --git a/CONTRIBUTING-mods.md b/CONTRIBUTING-mods.md index 4eb92f16..40147fae 100644 --- a/CONTRIBUTING-mods.md +++ b/CONTRIBUTING-mods.md @@ -140,17 +140,17 @@ ship text. ### 4. `games` (and the legacy `gen2compat`) -Pokemon Gold is Gen 2, and it runs its own battle engine, overworld, script -VM and save format. The mod API is shared across both generations (same hook -names, same event names, same registry names) but Gold cannot serve all of it -yet, so Gen 2 is opt-in. Say which games the mod is for: +Pokemon Gold and Silver are Gen 2, and they run their own battle engine, +overworld, script VM and save format. The mod API is shared across both +generations (same hook names, same event names, same registry names) but Gen 2 +cannot serve all of it yet, so it is opt-in. Say which games the mod is for: ```json "games": ["gen1", "gen2"] ``` -Each entry is a version id (`"red"`, `"blue"`, `"yellow"`, `"gold"`), a -generation (`"gen1"`, `"gen2"`) or `"all"`; +Each entry is a version id (`"red"`, `"blue"`, `"yellow"`, `"gold"`, +`"silver"`), a generation (`"gen1"`, `"gen2"`) or `"all"`; `src/mods/ModTargets.lua` resolves them off `GameVersion.ORDER` so nothing restates the game list. `python3 tools/modkit.py scaffold my_mod --games gen1,gen2` writes the key for you. The mod still installs to one directory, @@ -159,10 +159,10 @@ gen1,gen2` writes the key for you. The mod still installs to one directory, Absent means Gen 1 only, which is what every mod written before the key existed was tested as. `"gen2compat": true` is the legacy spelling, still accepted and purely additive (it *adds* the Gen 2 games), so no manifest can lose a game it -already ran on. On a Gold boot a mod claiming no Gen 2 game is not loaded at -all: the manager lists it as `ENABLED (NOT THIS GAME)` and says why, because a -mod that half-applies reads as a broken mod. Claim Gen 2 once you have actually -run your mod on Gold. +already ran on. On a Gold or Silver boot a mod claiming no Gen 2 game is not +loaded at all: the manager lists it as `ENABLED (NOT THIS GAME)` and says why, +because a mod that half-applies reads as a broken mod. Claim Gen 2 once you +have actually run your mod on Gold or Silver. Every token is enforced, per game: the loader gates on the same `ModTargets.supports` answer both mod surfaces draw, so `"games": ["blue"]` @@ -173,7 +173,7 @@ before the key existed changes behavior; list both generations or say `"all"` when you mean everywhere. `docs/mod-api-gen2-compat.md` is the compatibility matrix: what works on Gold -today (40 of the 46 registries, 40 event and 43 hook names shared with Gen 1, +and Silver today (40 of the 46 registries, 40 event and 43 hook names shared with Gen 1, and 24 Gen 2-only ones), which registries have no Gen 2 home and drop their writes with a report, and which hooks and events are still to come. `docs/preparing-your-mod-for-gen2.md` is the step-by-step migration guide for a diff --git a/README.md b/README.md index 630c6fc6..9ef1a048 100644 --- a/README.md +++ b/README.md @@ -57,14 +57,14 @@ And before you say, "that's not a recomp", you're wrong. Recomp is an acronym. * This project does not include a ROM, emulate the Game Boy, transpile assembly, -or download a disassembly. A canonical US Poke Red, Blue, Yellow, or Gold ROM -is the only game content input. +or download a disassembly. A canonical US Poke Red, Blue, Yellow, Gold, or +Silver ROM is the only game content input. The ROM is verified, used during import, and then released from memory. It is not copied into the cache. Later launches load the private generated cache and -do not ask for the ROM again. Red, Blue, Yellow, and Gold can all be imported -side by side. Gold is Gen 2 Phase 1 (import + launcher; see -`docs/gold-phase1.md`): the Gen 2 engine is still under construction. +do not ask for the ROM again. Red, Blue, Yellow, Gold, and Silver can all be +imported side by side. Gold and Silver are Gen 2 Phase 1 (import + launcher; +see `docs/gold-phase1.md`): the Gen 2 engine is still under construction. ## Quick Start @@ -72,13 +72,14 @@ Open the desktop app. On first boot, choose your legally obtained `.gb` / `.gbc` file or drop it onto the window. Import takes a few seconds and the game starts automatically. -Only the canonical US Red, Blue, Yellow (1 MiB), and Gold (2 MiB) ROMs are -accepted. The importer verifies SHA-1 before creating any game data: +Only the canonical US Red, Blue, Yellow (1 MiB), Gold, and Silver (2 MiB) +ROMs are accepted. The importer verifies SHA-1 before creating any game data: - Red: `ea9bcae617fdf159b045185467ae58b2e4a48b9a` - Blue: `d7037c83e1ae5b39bde3c30787637ba1d4c48ce2` - Yellow: `cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1` - Gold: `d8b8a3600a465308c9953dfa04f0081c05bdcb94` +- Silver: `49b163f7e57702bc939d642a18f591de55d92dae` The packaged app contains neither a ROM nor pre-extracted game data. Music, sound effects, and cries are synthesized while the game runs from compact @@ -219,7 +220,7 @@ entry: a desktop shortcut per game, a Steam entry, or a handheld frontend. | Option | Effect | | --- | --- | -| `--game=red` | boot Red, skipping the launcher (`blue` and `yellow` too, or just `r` / `b` / `y`) | +| `--game=red` | boot Red, skipping the launcher (`blue`, `yellow`, `gold` and `silver` too, or just `r` / `b` / `y` / `g` / `s`) | | `--slot=2` | load that save slot; takes a slot number or a slot id | | `--launcher` | open the launcher anyway, so you can edit a shortcut you already made | diff --git a/build-linux-arm-sbc.sh b/build-linux-arm-sbc.sh index 3da19638..0884f27d 100755 --- a/build-linux-arm-sbc.sh +++ b/build-linux-arm-sbc.sh @@ -133,6 +133,8 @@ mkdir -p "$GAME_SRC" (cd "$SOURCE_DIR" && zip -q -9 -r "$WORK/game-payload.zip" \ main.lua conf.lua src libs data assets tools/save-editor \ tools/rom_manifest.json tools/rom_manifest_blue.json \ + tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ + tools/rom_manifest_silver.json \ -x '*.DS_Store' 'data/generated/*' 'assets/generated/*') if unzip -Z1 "$WORK/game-payload.zip" \ | grep -Eq '^(data|assets)/generated/[^/]+|^(data|assets)/generated/.+/'; then diff --git a/build-rg34xxsp.sh b/build-rg34xxsp.sh index 01a62b53..7adb421f 100755 --- a/build-rg34xxsp.sh +++ b/build-rg34xxsp.sh @@ -92,6 +92,7 @@ mkdir -p "$GAME_SRC" main.lua conf.lua src libs data assets tools/save-editor \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ + tools/rom_manifest_silver.json \ -x '*.DS_Store' 'data/generated/*' 'assets/generated/*') payload_list="$(unzip -Z1 "$WORK/game-payload.zip")" printf '%s\n' "$payload_list" \ @@ -99,6 +100,8 @@ printf '%s\n' "$payload_list" \ && fail "payload unexpectedly contains generated ROM data" printf '%s\n' "$payload_list" | grep -qxF "tools/rom_manifest_gold.json" \ || fail "payload is missing tools/rom_manifest_gold.json" +printf '%s\n' "$payload_list" | grep -qxF "tools/rom_manifest_silver.json" \ + || fail "payload is missing tools/rom_manifest_silver.json" unzip -q "$WORK/game-payload.zip" -d "$GAME_SRC" rm -f "$WORK/game-payload.zip" diff --git a/docs/mod-api-gen2-compat.md b/docs/mod-api-gen2-compat.md index 1994d8a9..e2fc6855 100644 --- a/docs/mod-api-gen2-compat.md +++ b/docs/mod-api-gen2-compat.md @@ -55,9 +55,10 @@ The short version, for an author deciding what to write: ``` `games` is an optional array of version ids (`"red"`, `"blue"`, `"yellow"`, -`"gold"`), generations (`"gen1"`, `"gen2"`, case-insensitive) or `"all"`. -`src/mods/ModTargets.lua` resolves the tokens off `GameVersion.ORDER` and -`GameVersion.generation`, so nothing anywhere restates the game list. +`"gold"`, `"silver"`), generations (`"gen1"`, `"gen2"`, case-insensitive) or +`"all"`. `src/mods/ModTargets.lua` resolves the tokens off `GameVersion.ORDER` +and `GameVersion.generation`, so nothing anywhere restates the game list. +`"gen2"` now expands to both Gold and Silver. `Manifest.validate` stores the resolved, ORDER-sorted ids on `manifest.games` and **derives** `manifest.gen2compat` from them, which is the one field the loader's gate reads. diff --git a/docs/modding.md b/docs/modding.md index c487e5c2..4016e1f1 100644 --- a/docs/modding.md +++ b/docs/modding.md @@ -81,7 +81,7 @@ Every mod contains a root `manifest.json` defining its metadata, supported games | `entry` | `string` | Entry Lua file path relative to mod root (usually `"main.lua"`). | | `profile` | `string` | Mod profile: `"content"`, `"overhaul"`, or `"total_conversion"`. | | `category` | `string` | Categorization chip (e.g. `"GAMEPLAY"`, `"CONTENT"`, `"UI"`, `"AUDIO"`). | -| `games` | `array` | Supported game versions: `["gen1"]`, `["gen2"]`, `["red"]`, `["blue"]`, `["yellow"]`, `["gold"]`, or `["all"]`. | +| `games` | `array` | Supported game versions: `["gen1"]`, `["gen2"]`, `["red"]`, `["blue"]`, `["yellow"]`, `["gold"]`, `["silver"]`, or `["all"]`. | | `game_version`| `string` | Semver range of required engine version (e.g. `">=0.0.0-dev <2.0.0"`). | | `priority` | `integer` | Load priority order (lower numbers load earlier; dependencies always precede dependents regardless of priority). | | `dependencies` | `array` | Hard required dependencies. A mod will not load if a required dependency is missing or disabled for the active game. | diff --git a/docs/new-features.md b/docs/new-features.md index 7ab7c658..2e636bb5 100644 --- a/docs/new-features.md +++ b/docs/new-features.md @@ -16,5 +16,6 @@ Features intentionally added beyond the original Pokémon Red, Blue, and Yellow ## Gen 2 Specifics +* **Pokémon Silver** as an importable, launcher-selectable version alongside Gold * **Mod manager** with Gen 1 mod adapters, per-game targeting, and `modkit gen2check` * **Followers** for mods, plus Gen 2-only registries and hooks diff --git a/docs/preparing-your-mod-for-gen2.md b/docs/preparing-your-mod-for-gen2.md index cf4eec9d..382a3d21 100644 --- a/docs/preparing-your-mod-for-gen2.md +++ b/docs/preparing-your-mod-for-gen2.md @@ -176,7 +176,7 @@ something the filesystem encodes. | token | means | | --- | --- | -| `"red"`, `"blue"`, `"yellow"`, `"gold"` | that one game (a version id from `GameVersion.ORDER`) | +| `"red"`, `"blue"`, `"yellow"`, `"gold"`, `"silver"` | that one game (a version id from `GameVersion.ORDER`) | | `"gen1"`, `"gen2"` | every game of that generation (case-insensitive; `"gen 2"` also parses) | | `"all"` | every game this engine has | diff --git a/docs/required-to-function.md b/docs/required-to-function.md index bc681949..84475d8e 100644 --- a/docs/required-to-function.md +++ b/docs/required-to-function.md @@ -1,7 +1,8 @@ # What This Port Requires The packaged desktop app requires one user-supplied input on first boot: a -canonical 1 MiB US Pokemon Red, Blue, or Yellow ROM. +canonical 1 MiB US Pokemon Red, Blue, or Yellow ROM, or a canonical 2 MiB US +Pokemon Gold or Silver ROM. The importer verifies the SHA-1 for the game (see `src/core/GameVersion.lua` for specific hashes). Other revisions and Virtual Console releases are rejected @@ -15,7 +16,8 @@ Python and Pillow are not required by the packaged app. Assembly removes high-level names and some relationships that the Lua port needs. The version-specific files `tools/rom_manifest.json`, -`tools/rom_manifest_blue.json`, and `tools/rom_manifest_yellow.json` therefore +`tools/rom_manifest_blue.json`, `tools/rom_manifest_yellow.json`, +`tools/rom_manifest_gold.json`, and `tools/rom_manifest_silver.json` therefore contain: - the ROM symbol addresses actually read by the extractor diff --git a/docs/switch-install.md b/docs/switch-install.md index 2567cf2c..a9ad0ade 100644 --- a/docs/switch-install.md +++ b/docs/switch-install.md @@ -91,14 +91,14 @@ Do **not** launch from the Album applet path for normal play. This project ships **no** game data. On first launch: -1. Put your own legally obtained Pokémon Red, Blue (`.gb`), Yellow, or - Gold (`.gbc`) dump into `switch/gen1recomp/pokemon-love2d/imports/` (the - launcher also shows the live save-dir path). All four can sit in the +1. Put your own legally obtained Pokémon Red, Blue (`.gb`), Yellow, Gold, or + Silver (`.gbc`) dump into `switch/gen1recomp/pokemon-love2d/imports/` (the + launcher also shows the live save-dir path). All five can sit in the same folder. -2. Use **Scan again** on that game's tab (Red / Blue / Yellow / Gold). - Rescan matches by ROM SHA-1 for the open tab only. A Red dump never - imports from the Yellow tab (and vice versa). Gold is Beta in the - launcher; a clean US Gold dump is enough to Play. +2. Use **Scan again** on that game's tab (Red / Blue / Yellow / Gold / + Silver). Rescan matches by ROM SHA-1 for the open tab only. A Red dump + never imports from the Yellow tab (and vice versa). Gold and Silver are + Beta in the launcher; a clean US dump of either is enough to Play. ## 5. Import / Export a raw `.sav` @@ -111,10 +111,12 @@ SD / FTP, same transfer methods as ROMs. Paths are **per game**: | Blue | `imports/saves/blue/` | `exports/blue/` | | Yellow | `imports/saves/yellow/` | `exports/yellow/` | | Gold | `imports/saves/gold/` | `exports/gold/` | +| Silver | `imports/saves/silver/` | `exports/silver/` | (Under the save dir `pokemon-love2d/`. The zip already creates these folders. -Gold cart `.sav` import/export is not supported yet -- the folders exist so -MTP browsing matches the other games. Gold progress still saves in-engine.) +Gold and Silver cart `.sav` import/export is not supported yet -- the folders +exist so MTP browsing matches the other games. Gold and Silver progress still +saves in-engine.) 1. Copy a Gen 1 `.sav` (32 KB) into that game's inbox under the save dir ([switch-transfer.md](switch-transfer.md)). diff --git a/docs/switch-transfer.md b/docs/switch-transfer.md index 1c027086..798a8f85 100644 --- a/docs/switch-transfer.md +++ b/docs/switch-transfer.md @@ -22,8 +22,8 @@ Player install (what to download, title override) stays in | Loose iteration pair | `sdmc:/switch/gen1recomp/gen1recomp.nro` **and** `game.love` beside it | | ROM inbox | LÖVE save dir → `imports/` (launcher shows the live `getSaveDirectory()` path; under MTP often `1: SD Card//imports/`) | | Mod zip inbox | Same save dir → `imports/mods/` then MODS → **Scan again** | -| Save `.sav` inbox | Same save dir → `imports/saves/red\|blue\|yellow\|gold/` then that game's SAVE FILES → **Import save** (Gold cart `.sav` not supported yet) | -| Save exports | Same save dir → `exports/red\|blue\|yellow\|gold/` (pull after **Export save**; Gold cart `.sav` not supported yet) | +| Save `.sav` inbox | Same save dir → `imports/saves/red\|blue\|yellow\|gold\|silver/` then that game's SAVE FILES → **Import save** (Gold / Silver cart `.sav` not supported yet) | +| Save exports | Same save dir → `exports/red\|blue\|yellow\|gold\|silver/` (pull after **Export save**; Gold / Silver cart `.sav` not supported yet) | | Opt-in diagnostics | Empty `switch-debug.txt` in the save dir → `switch.log` | | Lua error log | `lua-error.log` in the save dir | @@ -54,7 +54,8 @@ macOS, not a Mac-only requirement. 3. Create `switch/gen1recomp/` if needed; extract the release zip at SD root (or copy NRO / `game.love` for loose). 4. For ROMs/mods/saves, open the save-dir `imports/`, `imports/mods/`, - `imports/saves//`, or `exports//` + `imports/saves//`, or + `exports//` path the launcher prints. 5. Wait for the queue; refresh; exit MTP responder; title-override launch. diff --git a/main.lua b/main.lua index 87d81589..b820766c 100644 --- a/main.lua +++ b/main.lua @@ -386,11 +386,12 @@ function bootGame(version) love.window.setTitle(Version.title( GameVersion.info().displayName .. " (Gen 1 Recompilation Project)")) end - -- Gold: Gen 1 Game:load cannot consume a Gen 2 cache -- different generated - -- tables, save shape and screen registry -- so Gold boots its own service - -- owner, which mounts src/world/gen2 (walk / warps / connections) and the - -- Gen 2 screens instead of src/core/Game.lua's Gen 1 wiring. - if GameVersion.isGold() then + -- Gen 2: Gen 1 Game:load cannot consume a Gen 2 cache -- different generated + -- tables, save shape and screen registry -- so Gold and Silver boot their + -- own service owner, which mounts src/world/gen2 (walk / warps / + -- connections) and the Gen 2 screens instead of src/core/Game.lua's Gen 1 + -- wiring. + if GameVersion.generation() == 2 then Game = require("src.core.Game2").new() Game:load() else diff --git a/mobile/ANDROID.md b/mobile/ANDROID.md index b234058b..7680c614 100644 --- a/mobile/ANDROID.md +++ b/mobile/ANDROID.md @@ -109,10 +109,10 @@ The APK lands under `app/build/outputs/apk/embedNoRecord/debug/`. `app/src/embed/assets/game.love` - zip of `main.lua`, `conf.lua`, `src/`, `libs/` (the vendored FlexLove toolkit the launcher UI needs), `data/`, -`assets/`, and the Red, Blue, and Yellow ROM manifests. The Android -packer verifies the Yellow manifest before it packages; if a partial source -export omitted it, it restores the file from this checkout's Git data and then -falls back to the project's GitHub copy. Generated game data, +`assets/`, and the Red, Blue, Yellow, Gold, and Silver ROM manifests. The +Android packer verifies the Yellow, Gold, and Silver manifests before it +packages; if a partial source export omitted one, it restores the file from +this checkout's Git data and then falls back to the project's GitHub copy. Generated game data, scripts, tests, and mobile build sources are excluded. ## Branding (applied by the build script) diff --git a/mobile/android/app/src/main/res/drawable-hdpi/ic_shortcut_silver.png b/mobile/android/app/src/main/res/drawable-hdpi/ic_shortcut_silver.png new file mode 100644 index 0000000000000000000000000000000000000000..30a113e3463ffc5674c6995263d9be0c72c45822 GIT binary patch literal 5258 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 Qy#N3J07*qoM6N<$f|Sn|8vprB@B0F`l$M< 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 literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/drawable-xxhdpi/ic_shortcut_silver.png b/mobile/android/app/src/main/res/drawable-xxhdpi/ic_shortcut_silver.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ea7d4d085cff7498ba4f5be02edae80dd31ca7 GIT binary patch literal 15334 zcmV+N*l+bSK@}Iw6pR5Fh~(5D*OrK?FZUaNLG*LG;rZ$88+vQvsKsprbQ5 zt~es-fGjR710o_2WJ@4y*&+MZ`(FF@zTdg;ovQP0zv{45n+E&*QmN{<-goc+p8ebh zOwklg(G(pnGG6Y1mSxegKKki=Jn8n^Z-3d>oTAA=7him_98VKK(J+i+)oyUxZMP9{ zrs!{oZhM(yen@U%S(eW*j6!GUXluA8^1e(qcY4vX8uIx(?VaK_ZxAvKgN8E~iG`oY z#?!xPYpdO8Sr&04%P@?J632Ks;Mw0Z{NbQK_^os%*E%#bghHY43WVPjy)MWC2t)Pt z4G8#sIn(F=VS7vTGgn-31%U`xU3HbGNb^^`o@JQ?o_$?|mzieZx~h0kZJE7ceq8jC`qU=@qS z+{%+r38qu=56zlhf5T6I`qRMWmtRhLi@MdJIFJFuC>p(q&!y4{BauiJLZP6)THqlf zF&K?T(bUugzrP|QoT71vCgAY!u=<#$k~FWGXpBwMG%U;V@7S@uIAeP27jL`mwwpI? z+C<^fq2Xvi|F)k5dN>+9<=Yt}6F;MD}?-x?W)f!^L; zbai!A4MaqaWU!7pYGFQ;iJ!RWh}kb(am5w>tFF4Lz=zO(o>QMr+&eTBDUKFe)9G|o z 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%0D3L%c%ubY6EFpdh(y~&J)+;lH)cgUC>T`u$AZX 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 Ef^!)ItN;K2 literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_shortcut_silver.png b/mobile/android/app/src/main/res/drawable-xxxhdpi/ic_shortcut_silver.png new file mode 100644 index 0000000000000000000000000000000000000000..b0efbbe14796791dcccdb983fd933ca75971068c GIT binary patch literal 24076 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 #FDD835 #D4AF37 + #BEC6D2 diff --git a/scripts/build.sh b/scripts/build.sh index a110d55c..0336ea78 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -71,6 +71,7 @@ rm -f "$LOVE_FILE" main.lua conf.lua src data assets tools/save-editor \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ + tools/rom_manifest_silver.json \ -x '*.DS_Store' 'data/generated/*' 'assets/generated/*') # Materialize the listing once and grep the file: piping unzip straight into # grep -q under `set -o pipefail` SIGPIPEs unzip when grep exits early on a @@ -90,7 +91,8 @@ for required in tools/save-editor/App.lua tools/save-editor/Kit.lua \ tools/save-editor/panels/Party.lua \ src/ui/kit/Kit.lua \ tools/rom_manifest.json tools/rom_manifest_blue.json \ - tools/rom_manifest_yellow.json tools/rom_manifest_gold.json; do + tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ + tools/rom_manifest_silver.json; do grep -qxF "$required" "$LOVE_LISTING" \ || fail "game.love is missing $required" done diff --git a/scripts/build_android.sh b/scripts/build_android.sh index 6644f3d5..1661cfc5 100755 --- a/scripts/build_android.sh +++ b/scripts/build_android.sh @@ -30,6 +30,8 @@ YELLOW_MANIFEST_RELATIVE="tools/rom_manifest_yellow.json" YELLOW_MANIFEST_URL="${YELLOW_MANIFEST_URL:-https://raw.githubusercontent.com/bryanthaboi/gen1recomp/main/tools/rom_manifest_yellow.json}" GOLD_MANIFEST_RELATIVE="tools/rom_manifest_gold.json" GOLD_MANIFEST_URL="${GOLD_MANIFEST_URL:-https://raw.githubusercontent.com/bryanthaboi/gen1recomp/main/tools/rom_manifest_gold.json}" +SILVER_MANIFEST_RELATIVE="tools/rom_manifest_silver.json" +SILVER_MANIFEST_URL="${SILVER_MANIFEST_URL:-https://raw.githubusercontent.com/bryanthaboi/gen1recomp/main/tools/rom_manifest_silver.json}" VERSION="" PACKAGE_ONLY=false @@ -177,6 +179,54 @@ ensure_gold_manifest() { fail "Gold import manifest is unavailable. Git recovery failed and could not download $GOLD_MANIFEST_URL" } +silver_manifest_is_valid() { + local path="$1" + python3 - "$path" <<'PY' +import json, pathlib, sys + +try: + manifest = json.loads(pathlib.Path(sys.argv[1]).read_text()) +except (OSError, ValueError): + raise SystemExit(1) + +raise SystemExit(0 if manifest.get("romSha1") == + "49b163f7e57702bc939d642a18f591de55d92dae" else 1) +PY +} + +ensure_silver_manifest() { + local manifest="$ROOT/$SILVER_MANIFEST_RELATIVE" + local staged + staged="$(mktemp)" + + if silver_manifest_is_valid "$manifest"; then + rm -f "$staged" + return + fi + + warn "Silver import manifest is missing or invalid; recovering it before packaging" + if git -C "$ROOT" show "HEAD:$SILVER_MANIFEST_RELATIVE" > "$staged" 2>/dev/null \ + && silver_manifest_is_valid "$staged"; then + mkdir -p "$(dirname "$manifest")" + mv "$staged" "$manifest" + say "restored Silver import manifest from this checkout's Git data" + return + fi + + if command -v curl >/dev/null 2>&1 \ + && curl --fail --location --retry 2 --connect-timeout 15 \ + --output "$staged" "$SILVER_MANIFEST_URL" \ + && silver_manifest_is_valid "$staged"; then + mkdir -p "$(dirname "$manifest")" + mv "$staged" "$manifest" + say "downloaded Silver import manifest from the project repository" + return + fi + + rm -f "$staged" + fail "Silver import manifest is unavailable. Git recovery failed and could not download $SILVER_MANIFEST_URL" +} + # --------------------------------------------------------------- branding # love-android 11.5+ reads app id / name / orientation from gradle.properties. # Manifest still gets permission trims. Re-applied every build so refreshing @@ -242,6 +292,7 @@ pack_game_love() { say "packing game.love for love-android embed flavor" ensure_yellow_manifest ensure_gold_manifest + ensure_silver_manifest mkdir -p "$EMBED_ASSETS" rm -f "$LOVE_FILE" # tools/save-editor ships with the app: the launcher's Edit button on a save @@ -256,6 +307,7 @@ pack_game_love() { main.lua conf.lua src data assets tools/save-editor \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ + tools/rom_manifest_silver.json \ -x '*.DS_Store' -x '*/.git/*' -x '*/.DS_Store' \ -x 'data/generated/*' -x 'assets/generated/*') # List once and match against the captured text: piping unzip straight into @@ -277,6 +329,8 @@ pack_game_love() { || fail "game.love is missing the Yellow ROM import manifest" grep -qx 'tools/rom_manifest_gold.json' <<< "$archive_entries" \ || fail "game.love is missing the Gold ROM import manifest" + grep -qx 'tools/rom_manifest_silver.json' <<< "$archive_entries" \ + || fail "game.love is missing the Silver ROM import manifest" # This gate exists because the launcher's UI toolkit once lived outside # src/ (libs/flexlove) and was added to scripts/build.sh's payload and to # no other packager, so Android and iOS built an APK/IPA whose launcher diff --git a/scripts/linux-arm64/build_appimage.sh b/scripts/linux-arm64/build_appimage.sh index a83548f5..59d59a71 100755 --- a/scripts/linux-arm64/build_appimage.sh +++ b/scripts/linux-arm64/build_appimage.sh @@ -366,6 +366,8 @@ cp "$IN/game.love" "$APPDIR/game.love" unzip -Z1 "$APPDIR/game.love" > "$WORK/love-listing.txt" grep -qxF "tools/rom_manifest_gold.json" "$WORK/love-listing.txt" \ || fail "game.love is missing tools/rom_manifest_gold.json" +grep -qxF "tools/rom_manifest_silver.json" "$WORK/love-listing.txt" \ + || fail "game.love is missing tools/rom_manifest_silver.json" # The .desktop's Icon= resolves against the AppDir root by basename, and # .DirIcon is what appimaged and file-manager thumbnailers read. cp "$IN/icon.png" "$APPDIR/$APP_NAME.png" diff --git a/scripts/linux-arm64/selftest_build_linux_arm64.sh b/scripts/linux-arm64/selftest_build_linux_arm64.sh index 5b4ab651..8320222b 100755 --- a/scripts/linux-arm64/selftest_build_linux_arm64.sh +++ b/scripts/linux-arm64/selftest_build_linux_arm64.sh @@ -169,5 +169,7 @@ unzip -p "$temp_dir/game.love" src/core/Version.lua \ || fail "shared payload version was not stamped" grep -qxF "tools/rom_manifest_gold.json" "$temp_dir/love-listing.txt" \ || fail "shared payload is missing tools/rom_manifest_gold.json" +grep -qxF "tools/rom_manifest_silver.json" "$temp_dir/love-listing.txt" \ + || fail "shared payload is missing tools/rom_manifest_silver.json" say "Linux arm64 self-test passed" diff --git a/scripts/pack_love.sh b/scripts/pack_love.sh index beff791e..a32653b5 100755 --- a/scripts/pack_love.sh +++ b/scripts/pack_love.sh @@ -50,6 +50,7 @@ rm -f "$OUTPUT" main.lua conf.lua src data assets tools/save-editor \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ + tools/rom_manifest_silver.json \ -x '*.DS_Store' 'data/generated/*' 'assets/generated/*') if [ -f "$ROOT/PATCH_NOTES.md" ]; then (cd "$ROOT" && zip -q "$OUTPUT" PATCH_NOTES.md) @@ -94,6 +95,7 @@ for required in tools/save-editor/App.lua tools/save-editor/Kit.lua \ tools/save-editor/panels/Party.lua \ tools/rom_manifest.json tools/rom_manifest_blue.json \ tools/rom_manifest_yellow.json tools/rom_manifest_gold.json \ + tools/rom_manifest_silver.json \ src/ui/kit/Kit.lua \ src/import/LauncherView.lua; do grep -qxF "$required" "$LISTING" \ diff --git a/scripts/run.sh b/scripts/run.sh index 49276927..6cfefde1 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -17,7 +17,9 @@ fail() { printf '\033[1;31merror:\033[0m %s\n' "$*" >&2; exit 1; } if [ ! -f "$ROOT/data/generated/maps.lua" ] \ && [ ! -f "$ROOT/blue/data/generated/maps.lua" ] \ - && [ ! -f "$ROOT/yellow/data/generated/maps.lua" ]; then + && [ ! -f "$ROOT/yellow/data/generated/maps.lua" ] \ + && [ ! -f "$ROOT/gold/data/generated/maps.lua" ] \ + && [ ! -f "$ROOT/silver/data/generated/maps.lua" ]; then fail "generated data missing, run scripts/setup.sh first" fi diff --git a/scripts/switch/pack_sd_zip.sh b/scripts/switch/pack_sd_zip.sh index eb9d4b53..1d0478a9 100755 --- a/scripts/switch/pack_sd_zip.sh +++ b/scripts/switch/pack_sd_zip.sh @@ -71,15 +71,15 @@ First install or update (same steps): your saves, imported ROMs, mods, and options. Re-extracting only replaces the NRO(s) and these help files. 3. Launch with title override (hold R on HOME, open any title → hbmenu). - 4. Copy a legal Pokemon Red/Blue .gb or Yellow/Gold .gbc into: + 4. Copy a legal Pokemon Red/Blue .gb or Yellow/Gold/Silver .gbc into: switch/gen1recomp/pokemon-love2d/imports/ then use Scan again in the launcher if needed. Inboxes (drop files here via MTP / SD / FTP): imports/ — ROM .gb / .gbc imports/mods/ — community mod .zip - imports/saves/red|blue|yellow|gold/ — raw .sav import (Gold cart .sav not yet) - exports/red|blue|yellow|gold/ — pull after Export save (Gold not yet) + imports/saves/red|blue|yellow|gold|silver/ — raw .sav import (Gold/Silver cart .sav not yet) + exports/red|blue|yellow|gold|silver/ — pull after Export save (Gold/Silver not yet) Full guide: https://github.com/bryanthaboi/gen1recomp/blob/main/docs/switch-install.md EOF @@ -92,7 +92,7 @@ write_readme() { } write_readme "$SAVE_ROOT/imports/README.txt" \ - "Put a legal Pokemon Red/Blue .gb or Yellow/Gold .gbc here, then Scan again in the launcher." + "Put a legal Pokemon Red/Blue .gb or Yellow/Gold/Silver .gbc here, then Scan again in the launcher." write_readme "$SAVE_ROOT/imports/mods/README.txt" \ "Put community mod .zip files here, then MODS → Scan again." write_readme "$SAVE_ROOT/imports/saves/red/README.txt" \ @@ -103,6 +103,8 @@ write_readme "$SAVE_ROOT/imports/saves/yellow/README.txt" \ "Put a Yellow .sav (32 KB) here, then Yellow tab → SAVE FILES → Import save." write_readme "$SAVE_ROOT/imports/saves/gold/README.txt" \ "Gold cart .sav import is not supported yet. Folder reserved so MTP matches the other games." +write_readme "$SAVE_ROOT/imports/saves/silver/README.txt" \ + "Silver cart .sav import is not supported yet. Folder reserved so MTP matches the other games." write_readme "$SAVE_ROOT/exports/red/README.txt" \ "After Export save (Red), copy the .sav out of this folder via MTP / SD / FTP." write_readme "$SAVE_ROOT/exports/blue/README.txt" \ @@ -111,6 +113,8 @@ write_readme "$SAVE_ROOT/exports/yellow/README.txt" \ "After Export save (Yellow), copy the .sav out of this folder via MTP / SD / FTP." write_readme "$SAVE_ROOT/exports/gold/README.txt" \ "Gold cart .sav export is not supported yet. Folder reserved so MTP matches the other games." +write_readme "$SAVE_ROOT/exports/silver/README.txt" \ + "Silver cart .sav export is not supported yet. Folder reserved so MTP matches the other games." rm -f "$OUT_ZIP" ( @@ -140,10 +144,12 @@ REQUIRED=( "switch/gen1recomp/pokemon-love2d/imports/saves/blue/README.txt" "switch/gen1recomp/pokemon-love2d/imports/saves/yellow/README.txt" "switch/gen1recomp/pokemon-love2d/imports/saves/gold/README.txt" + "switch/gen1recomp/pokemon-love2d/imports/saves/silver/README.txt" "switch/gen1recomp/pokemon-love2d/exports/red/README.txt" "switch/gen1recomp/pokemon-love2d/exports/blue/README.txt" "switch/gen1recomp/pokemon-love2d/exports/yellow/README.txt" "switch/gen1recomp/pokemon-love2d/exports/gold/README.txt" + "switch/gen1recomp/pokemon-love2d/exports/silver/README.txt" ) for rel in "${REQUIRED[@]}"; do printf '%s\n' "$LISTING" | grep -Fq "$rel" || fail "zip missing $rel" diff --git a/scripts/switch/selftest_build_switch.sh b/scripts/switch/selftest_build_switch.sh index 9554cdd4..946a1107 100755 --- a/scripts/switch/selftest_build_switch.sh +++ b/scripts/switch/selftest_build_switch.sh @@ -271,10 +271,12 @@ for rel in \ "switch/gen1recomp/pokemon-love2d/imports/saves/blue/README.txt" \ "switch/gen1recomp/pokemon-love2d/imports/saves/yellow/README.txt" \ "switch/gen1recomp/pokemon-love2d/imports/saves/gold/README.txt" \ + "switch/gen1recomp/pokemon-love2d/imports/saves/silver/README.txt" \ "switch/gen1recomp/pokemon-love2d/exports/red/README.txt" \ "switch/gen1recomp/pokemon-love2d/exports/blue/README.txt" \ "switch/gen1recomp/pokemon-love2d/exports/yellow/README.txt" \ - "switch/gen1recomp/pokemon-love2d/exports/gold/README.txt" + "switch/gen1recomp/pokemon-love2d/exports/gold/README.txt" \ + "switch/gen1recomp/pokemon-love2d/exports/silver/README.txt" do printf '%s\n' "$ZIP_LIST" | grep -Fq "$rel" || PACK_MISSING="${PACK_MISSING} ${rel}" done diff --git a/src/core/Game2.lua b/src/core/Game2.lua index f95fca7c..fb6c1c12 100644 --- a/src/core/Game2.lua +++ b/src/core/Game2.lua @@ -3,7 +3,7 @@ -- everything under src/*/gen2 reaches shared services through here. Gen 1 -- Game:load cannot consume a Gen 2 cache -- different generated tables, save -- shape and screen registry -- so main.lua's bootGame picks this owner when --- GameVersion.isGold(), and the two never branch into each other. +-- GameVersion.generation() == 2, and the two never branch into each other. -- -- Boot: copyright → GameFreak Presents → GS intro stub → title -- (tilemap + Ho-Oh flap / clouds / trails) → Oak speech (Marill + shrink) @@ -1702,7 +1702,7 @@ function Game2:hotkey(key) self:writeSave() return true elseif key == "f2" then - local loaded = Save.load("gold") + local loaded = Save.load() if loaded then self:continueGame(loaded) end return true elseif key == "1" then diff --git a/src/core/GameVersion.lua b/src/core/GameVersion.lua index 8ec25399..b6435b86 100644 --- a/src/core/GameVersion.lua +++ b/src/core/GameVersion.lua @@ -1,5 +1,5 @@ -- Which game this process is running: Red (the historical default), Blue, --- Yellow, or Gold. One source of truth for everything that differs by +-- Yellow, Gold, or Silver. One source of truth for everything that differs by -- version -- the accepted ROM hash, the import manifest, where the -- extracted cache lives, and the save-file suffix -- so the importer, -- cache mount, SaveData, title screen and palette all agree. @@ -8,7 +8,8 @@ -- saves are untouched, but its extracted cache lives under red/ like Blue, -- Yellow, and Gold (issue #899); a legacy root cache is moved into red/ once -- by CacheFs.migrateLegacyRedCache. All supported versions can be imported --- and selected side by side. Gold is Gen 2 (see docs/gold-phase1.md). +-- and selected side by side. Gold and Silver are Gen 2 (see +-- docs/gold-phase1.md). -- -- Zero requires, so it loads during love.conf and under plain Lua for tools -- and tests. The active version is a process-global set once at boot from @@ -61,13 +62,26 @@ GameVersion.VERSIONS = { manifest = "tools/rom_manifest_gold.json", cachePrefix = "gold/", -- gold/data/generated, gold/assets/generated saveSuffix = "_gold", -- save_gold.lua / .bak / .tmp - -- The only row that carries one; absent reads as 1 (GameVersion.generation) + -- Absent reads as 1 (GameVersion.generation) + generation = 2, + }, + -- Gold's engine with edition-selected data; the manifest is derived from + -- Gold's by tools/make_silver_manifest.py. + silver = { + id = "silver", + label = "Silver", + displayName = "Pokemon Silver", + launcherName = "Silver (Beta)", + sha1 = "49b163f7e57702bc939d642a18f591de55d92dae", + manifest = "tools/rom_manifest_silver.json", + cachePrefix = "silver/", -- silver/data/generated, silver/assets/generated + saveSuffix = "_silver", -- save_silver.lua / .bak / .tmp generation = 2, }, } -- Launcher column order. -GameVersion.ORDER = { "red", "blue", "yellow", "gold" } +GameVersion.ORDER = { "red", "blue", "yellow", "gold", "silver" } GameVersion.current = "red" diff --git a/src/core/LaunchOptions.lua b/src/core/LaunchOptions.lua index 0bc98a3c..7317ba8a 100644 --- a/src/core/LaunchOptions.lua +++ b/src/core/LaunchOptions.lua @@ -39,6 +39,7 @@ local function normalizeVersion(v) b = "blue", blue = "blue", y = "yellow", yellow = "yellow", g = "gold", gold = "gold", + s = "silver", silver = "silver", } v = alias[v] or v if GameVersion.VERSIONS and not GameVersion.VERSIONS[v] then return nil end diff --git a/src/core/TouchControls.lua b/src/core/TouchControls.lua index dd9c679a..32190f90 100644 --- a/src/core/TouchControls.lua +++ b/src/core/TouchControls.lua @@ -218,7 +218,7 @@ function TouchControls.defaultLayout(ww, wh, ox, oy, scale) local ssW = dpadW * 0.30 local margin = dpadW * 0.12 local ok, GameVersion = pcall(require, "src.core.GameVersion") - if ok and GameVersion.isGold and GameVersion.isGold() then + if ok and GameVersion.generation and GameVersion.generation() == 2 then margin = math.max(margin, math.min(ww * 0.10, 72)) end return { diff --git a/src/core/gen2/Save.lua b/src/core/gen2/Save.lua index 29d7d661..beda404a 100644 --- a/src/core/gen2/Save.lua +++ b/src/core/gen2/Save.lua @@ -103,7 +103,7 @@ Save.PLAYER_STATES = { } local function saveNames(version) - version = version or "gold" + version = version or GameVersion.get() -- Resolve the ACTIVE SLOT the same way SaveData does, and only fall back to -- the flat save_.lua when no slot is registered. -- @@ -133,16 +133,22 @@ local function fs() return love.filesystem end --- A fresh Gold save. `opts` carries what the intro collected: player name, +-- The blank-name fallback is the first PlayerNameArray row, which differs +-- per edition -- data/player_names.asm:12-23. +function Save.defaultPlayerName(version) + return (version or GameVersion.get()) == "silver" and "SILVER" or "GOLD" +end + +-- A fresh Gen 2 save. `opts` carries what the intro collected: player name, -- rival name, and the options the OPTION screen was left on. function Save.newGame(opts) opts = opts or {} local save = { format = Save.FORMAT, - version = "gold", + version = GameVersion.get(), generation = 2, player = { - name = opts.playerName or "GOLD", + name = opts.playerName or Save.defaultPlayerName(), -- _ResetWRAM rolls wPlayerID out of hRandomSub/hRandomAdd -- (engine/menus/intro_menu.asm:41-49). id = opts.trainerId or rand(0, 65535), @@ -374,10 +380,13 @@ end function Save.normalize(save) if type(save) ~= "table" then return nil end save.format = save.format or Save.FORMAT - save.version = "gold" + if not (GameVersion.VERSIONS[save.version] + and GameVersion.generation(save.version) == 2) then + save.version = GameVersion.get() + end save.generation = 2 save.player = save.player or {} - save.player.name = save.player.name or "GOLD" + save.player.name = save.player.name or Save.defaultPlayerName(save.version) save.player.id = save.player.id or rand(0, 65535) save.player.money = math.max(0, math.min(save.player.money or 0, Save.MAX_MONEY)) save.player.coins = math.max(0, math.min(save.player.coins or 0, Save.MAX_COINS)) @@ -753,21 +762,24 @@ end -- copy is the witness that survives a crash mid-replace. function Save.save(save) if type(save) ~= "table" then return false, "no save" end - if (save.version or "gold") == "gold" then + Save.normalize(save) + local version = save.version + do local ok, SaveData = pcall(require, "src.core.SaveData") - if ok and SaveData.activeSlot and not SaveData.activeSlot("gold") then - local id = SaveData.createSlot and SaveData.createSlot("gold") - if id and SaveData.setActiveSlot then SaveData.setActiveSlot("gold", id) end + if ok and SaveData.activeSlot and not SaveData.activeSlot(version) then + local id = SaveData.createSlot and SaveData.createSlot(version) + if id and SaveData.setActiveSlot then + SaveData.setActiveSlot(version, id) + end end end - local main, backup, tmp = saveNames(save.version) + local main, backup, tmp = saveNames(version) local f = fs() if not f then return false, "no filesystem" end -- saveNames may now return a saves//.lua path, and -- love.filesystem.write does not create missing parent directories. local dir = main:match("^(.*)/[^/]+$") if dir and f.createDirectory then f.createDirectory(dir) end - Save.normalize(save) save.savedAt = os.time() local encoded = SaveSerializer.encode(save) if f.getInfo(main) then diff --git a/src/debug/SwitchDiagnostics.lua b/src/debug/SwitchDiagnostics.lua index 8d60a147..04ed4403 100644 --- a/src/debug/SwitchDiagnostics.lua +++ b/src/debug/SwitchDiagnostics.lua @@ -249,10 +249,12 @@ function SwitchDiagnostics.probeAssets(version) end -- Shallow listing so we can see if the extract tree exists at all. - local roots = { "yellow", "blue", "gold", "assets", "yellow/assets/generated", + local roots = { "yellow", "blue", "gold", "silver", "assets", + "yellow/assets/generated", "yellow/assets/generated/sprites", "blue/assets/generated/sprites", "gold/assets/generated", "gold/assets/generated/sprites", - "gold/data/generated" } + "gold/data/generated", "silver/assets/generated", + "silver/data/generated" } for _, dir in ipairs(roots) do local info = filesystem.getInfo(dir) if info and info.type == "directory" and filesystem.getDirectoryItems then diff --git a/src/import/ExtractThread.lua b/src/import/ExtractThread.lua index 26eb84dc..b1bf99b2 100644 --- a/src/import/ExtractThread.lua +++ b/src/import/ExtractThread.lua @@ -27,7 +27,8 @@ local ok, err = pcall(function() CacheFs.prefix = prefix local manifest = require("src.import.RomManifest").decode(version) - local RomExtractor = version == "gold" + local RomExtractor = + require("src.core.GameVersion").generation(version) == 2 and require("src.import.RomExtractorGen2") or require("src.import.RomExtractor") diff --git a/src/import/LauncherSettings.lua b/src/import/LauncherSettings.lua index a73d7eed..6c95b6c7 100644 --- a/src/import/LauncherSettings.lua +++ b/src/import/LauncherSettings.lua @@ -573,9 +573,10 @@ end -- opened on the Gold tab used to offer a dozen controls that did nothing -- and hide the seven that the cart itself has. -- --- The block lives in options.lua under `gold`, which is exactly where --- src/core/gen2/Save.lua loadOptions reads it, so an edit here is live on the --- next boot the same way a Gen 1 edit is. Ladders mirror +-- The block lives in options.lua under `gold` (the historical key; Gold and +-- Silver share it the way the Gen 1 games share the flat namespace), which is +-- exactly where src/core/gen2/Save.lua loadOptions reads it, so an edit here +-- is live on the next boot the same way a Gen 1 edit is. Ladders mirror -- src/ui/gen2/OptionsMenu.lua's ROWS; when editing one, keep the two in sync. local GEN2_KEY = "gold" @@ -722,7 +723,9 @@ end function LauncherSettings.open(hooks, version) local opts = SaveData.loadOptions() local sections - if version == "gold" then + local GameVersion = require("src.core.GameVersion") + if GameVersion.VERSIONS[version] + and GameVersion.generation(version) == 2 then local block = opts[GEN2_KEY] if type(block) ~= "table" then block = {} diff --git a/src/import/LauncherView.lua b/src/import/LauncherView.lua index b66b8844..171848e4 100644 --- a/src/import/LauncherView.lua +++ b/src/import/LauncherView.lua @@ -14,9 +14,9 @@ -- height, and flex-shrink compressing text until it overlapped. -- -- THE RULES THIS FILE FOLLOWS: --- * Lists paginate (Kit.pager). The installed-mod list also scrolls inside --- its viewport, so each of its pages can hold at least ten entries without --- requiring a tall window. Pages still bound how many mod rows we visit. +-- * Short lists paginate (Kit.pager, perPage from Kit.rowsThatFit); the +-- installed-mod list is one continuous scroll instead, drawing only the +-- rows inside the region viewport so the window bounds the frame cost. -- * Every click handler only QUEUES work (imp._uiActions); update() drains -- the queue, so an action that tears the view down (Play, Edit save) -- never runs inside the frame that dispatched it. @@ -45,9 +45,6 @@ local COMMUNITY_URL = "https://bois.icu" local ACT_DEDUP = 0.35 -- Finger travel past this (px) is a drag, not a tap. local TAP_SLOP2 = 16 * 16 --- Installed mods should not turn into a one- or two-item pager on a compact --- display. Keep a useful page size, then let the list viewport scroll. -local MIN_MODS_PER_PAGE = 10 local MIN_SKIN_ROWS = 4 local SKIN_FORMAT_LABEL = { native = "GEN1", @@ -81,15 +78,6 @@ local function setTabScroll(imp, value) imp._tabScroll[tabKeyOf(imp)] = clamp(value, 0, tabScrollMax(imp)) end -local function modListWantsWheel(imp, wheel) - if imp.tab ~= "mods" or (imp._modScrollMax or 0) <= 0 then return false end - if not inRect(imp._modListRect, Kit.mouseX, Kit.mouseY) then return false end - if not inRect(imp._tabRegionRect, Kit.mouseX, Kit.mouseY) then return false end - local at = clamp(imp.modScroll or 0, 0, imp._modScrollMax) - if wheel < 0 then return at < imp._modScrollMax end - return at > 0 -end - -- ------------------------------------------------------------- lifecycle local function ensureState(imp) @@ -192,9 +180,6 @@ function LauncherView.touchpressed(imp, id, x, y) imp._touchAt = imp._touchAt or {} imp._touchAt[tostring(id)] = { x = x, y = y, - modsList = imp.tab == "mods" and (imp._modScrollMax or 0) > 0 - and inRect(imp._modListRect, x, y) - and inRect(imp._tabRegionRect, x, y), region = tabScrollMax(imp) > 0 and inRect(imp._tabRegionRect, x, y), } end @@ -207,19 +192,9 @@ function LauncherView.touchmoved(imp, id, x, y) if ddx * ddx + ddy * ddy > TAP_SLOP2 then start.dragged = true end - -- A drag that began in the installed-mod viewport scrolls that page's - -- rows. Its pager remains available for moving to the next ten-plus - -- entries; a drag elsewhere keeps the normal short-window page scroll. if start.dragged then local last = start.lastY or start.y local move = -(y - last) - if start.modsList then - local listMax = imp._modScrollMax or 0 - local at, leftover = Kit.scrollHandoff( - clamp(imp.modScroll or 0, 0, listMax), listMax, move) - imp.modScroll = at - move = leftover - end if move ~= 0 and start.region then local at, leftover = Kit.scrollHandoff(tabScrollAt(imp), tabScrollMax(imp), move) @@ -343,7 +318,7 @@ end local CART_COLOR = { red = PAL.railRed, blue = PAL.railBlue, yellow = PAL.railGold, - gold = PAL.railAmber, + gold = PAL.railAmber, silver = PAL.railSilver, } local function cartColor(version) return CART_COLOR[version] or PAL.green @@ -942,6 +917,8 @@ local GAME_TABS = { label = "Yellow" }, { id = "gold", key = "tab-gold", letter = "G", color = PAL.railAmber, label = "Gold" }, + { id = "silver", key = "tab-silver", letter = "S", color = PAL.railSilver, + label = "Silver" }, } local HEADER_TABS = { @@ -1108,16 +1085,11 @@ local function buildHeader(imp, m) local tabGap = math.floor(6 * m.s) local tabRowGap = math.floor(4 * m.s) - -- the cartridge dropdown, sized to its longest label so switching games - -- never reflows the row + -- the cartridge dropdown: just the game's initial and the caret; the + -- popup list carries the full names local chrome0 = headerChrome(imp) local game = currentGame(imp) - local labelW = 0 - for _, g in ipairs(GAME_TABS) do - labelW = math.max(labelW, Kit.textWidth("tab", Strings(g.label))) - end - local dropW = math.min(tabRight - tabLeft, - tabH + labelW + math.floor(34 * m.s)) + local dropW = math.min(tabRight - tabLeft, tabH + math.floor(24 * m.s)) chrome0.game.color = game.color chrome0.game.letter = game.letter chrome0.game.active = imp.tab == game.id @@ -1127,7 +1099,7 @@ local function buildHeader(imp, m) -- flip with it or it vanishes into the cartridge colour local gameInvert = chrome0.game.active or gameHot chrome0.game.ring = gameHot and not chrome0.game.active or nil - btn(imp, tx, ty, dropW, tabH, "tab-game", Strings(game.label), chrome0.game) + btn(imp, tx, ty, dropW, tabH, "tab-game", "", chrome0.game) do local cw = math.floor(7 * m.s) local ccx = tx + dropW - math.floor(14 * m.s) @@ -1958,7 +1930,6 @@ local function buildModsPanel(imp, x, y, w, availH, m) cy = cy + buildModScopeRow(imp, x, cy, w, m) if #mods == 0 then - imp.modScroll, imp._modScrollMax, imp._modListRect = 0, 0, nil Kit.emptyBox(x, cy, w, math.floor(110 * m.s), imp:_modsEmptyHint()) return (cy - y) + math.floor(110 * m.s) end @@ -1999,159 +1970,139 @@ local function buildModsPanel(imp, x, y, w, availH, m) end -- A mod row is a fixed height: its details first, then a dedicated second - -- line of per-game checkboxes. Fixed because a page of uniform rows is - -- what lets perPage come from the viewport. + -- line of per-game checkboxes. Fixed row heights are what make the + -- cull below plain arithmetic. local togH = math.floor(26 * m.s) local gamesLabel = Strings("Enable for:") local textH = Kit.textHeight("button") + math.floor(4 * m.s) + Kit.textHeight("small") + math.floor(2 * m.s) + Kit.textHeight("small") local rowH = math.floor(8 * m.s) + textH + math.floor(8 * m.s) + togH + math.floor(8 * m.s) - local pagerH = math.max(Kit.tapMin(), math.floor(30 * m.s)) - local listH = availH - (cy - y) - pagerH - gap - local perPage = Kit.rowsThatFit(listH, rowH, gap, MIN_MODS_PER_PAGE, 20) - local first, last, cur, pages = Kit.pageBounds(page(imp, "mods"), #mods, perPage) - setPage(imp, "mods", cur) local listTop = cy - local shown = math.max(0, last - first + 1) - local contentH = shown * rowH + math.max(0, shown - 1) * gap - local scrollMax = math.max(0, contentH - listH) - local scroll = clamp(imp.modScroll or 0, 0, scrollMax) - local lr = imp._modListRect - if not lr then lr = {}; imp._modListRect = lr end - lr.x, lr.y, lr.w, lr.h = x, listTop, w, listH - imp._modScrollMax = scrollMax - if scrollMax > 0 and (Kit.wheelY or 0) ~= 0 and not Kit.blockClicks - and Kit.hit(x, listTop, w, listH) then - scroll = clamp(scroll - Kit.wheelY * math.floor(48 * m.s), 0, scrollMax) - Kit.wheelY = 0 - elseif scrollMax == 0 then - local wheelPage = Kit.wheelPage(x, listTop, w, listH, cur, #mods, perPage) - if wheelPage ~= cur then imp.modScroll = 0 end - setPage(imp, "mods", wheelPage) - end - imp.modScroll = scroll - Kit.pushClip(x, listTop, w, listH) - for i = first, last do + -- One continuous list: every row is laid out, the region scroll moves + -- through all of it, and only rows inside the region's viewport draw -- + -- so the per-frame cost stays bounded by the window, not the list. + local view = imp._tabRegionRect + local viewTop = view and view.y or listTop + local viewBot = view and (view.y + view.h) or (listTop + availH) + for i = 1, #mods do local mod = mods[i] - local ry = listTop + (i - first) * (rowH + gap) - scroll - local rowKey = rowKeyFor(imp, "mod-row-", mod.id) - local isFullyDisabled = true - if mod.enabledByVersion then - for _, on in pairs(mod.enabledByVersion) do - if on then isFullyDisabled = false; break end + local ry = listTop + (i - 1) * (rowH + gap) + if ry + rowH >= viewTop and ry <= viewBot then + local rowKey = rowKeyFor(imp, "mod-row-", mod.id) + local isFullyDisabled = true + if mod.enabledByVersion then + for _, on in pairs(mod.enabledByVersion) do + if on then isFullyDisabled = false; break end + end + else + isFullyDisabled = not mod.enabled end - else - isFullyDisabled = not mod.enabled - end - local focused = Kit.focusable(rowKey, x, ry, w, rowH) - local hot = focused or Kit.hover(x, ry, w, rowH) - if isFullyDisabled then - Kit.card(x, ry, w, rowH, hot and "mutedHot" or "muted") - else - Kit.card(x, ry, w, rowH, hot) - end - local pad = math.floor(12 * m.s) - local px, inner = x + pad, w - 2 * pad - local ly = ry + math.floor(10 * m.s) - - local togGap = math.floor(5 * m.s) + 1 - local info = mod.github and mod.github ~= "" and imp:_modUpdateInfo(mod.id) - - -- These answer separate games, not a single shared install flag. The - -- importer receives the game id so an experimental confirmation also - -- applies only to the checkbox the player pressed. - local flipped = false - local gamesY = ry + math.floor(8 * m.s) + textH + math.floor(8 * m.s) - Kit.text("micro", gamesLabel, px, - gamesY + (togH - Kit.textHeight("micro")) / 2, PAL.muted) - local tx = px + Kit.textWidth("micro", gamesLabel) + math.floor(10 * m.s) - for _, game in ipairs(GameVersion.ORDER) do - local togKey = "mod-toggle-" .. mod.id .. "-" .. game - if modGameCheckbox(tx, gamesY, togH, - mod.enabledByVersion and mod.enabledByVersion[game] == true, - game, togKey, not safeMode) then - local version = game - queueAction(imp, togKey, function() imp:_toggleMod(mod.id, nil, version) end) - flipped = true + local focused = Kit.focusable(rowKey, x, ry, w, rowH) + local hot = focused or Kit.hover(x, ry, w, rowH) + if isFullyDisabled then + Kit.card(x, ry, w, rowH, hot and "mutedHot" or "muted") + else + Kit.card(x, ry, w, rowH, hot) end - tx = tx + togH + togGap - end - -- The checkboxes sit inside the row's rect, so their press also passes the - -- row hit test; `flipped` gates the row action to everywhere else. - if not flipped - and (Kit.press(x, ry, w, rowH) or Kit._activateId == rowKey) then - local id = mod.id - queueAction(imp, rowKey, function() imp._modActions = id end) - end - local textW = inner + local pad = math.floor(12 * m.s) + local px, inner = x + pad, w - 2 * pad + local ly = ry + math.floor(10 * m.s) - local badgeW = Kit.textWidth("micro", mod.badge) + math.floor(12 * m.s) - -- the games the mod is for, beside its category: the same chip the - -- in-game manager shows (src/mods/ModTargets.lua) - local gamesW = mod.targets - and Kit.textWidth("micro", mod.targets) + math.floor(12 * m.s) or 0 - local nameShown = Kit.ellipsize("button", mod.name, - textW - badgeW - gamesW - math.floor(12 * m.s)) - local headingCol = isFullyDisabled and PAL.muted or PAL.heading - Kit.text("button", nameShown, px, ly, headingCol) - local tagX = px + Kit.textWidth("button", nameShown) + math.floor(8 * m.s) - Kit.tag(tagX, ly, badgeW, Kit.textHeight("button"), mod.badge, - mod.experimental and PAL.yellow or PAL.muted) - if mod.targets then - Kit.tag(tagX + badgeW + math.floor(4 * m.s), ly, gamesW, - Kit.textHeight("button"), mod.targets, - mod.targetsHere == false and PAL.steel or PAL.blue) - end - ly = ly + Kit.textHeight("button") + math.floor(4 * m.s) + local togGap = math.floor(5 * m.s) + 1 + local info = mod.github and mod.github ~= "" and imp:_modUpdateInfo(mod.id) - -- version + status + update state - local statusText, statusCol = modStatusColor(mod.status) - local line = "v" .. tostring(mod.version or "?") .. " " .. statusText - Kit.text("small", line, px, ly, statusCol) - local lx = px + Kit.textWidth("small", line) + math.floor(12 * m.s) - if imp:_modInfoPending(mod.id) then - -- An inline spinner, because this row's release check is genuinely in - -- flight -- the list stays usable while it resolves. - Loader.dot(lx, ly, Kit.textHeight("small")) - Kit.text("small", Strings("Checking..."), - lx + Kit.textHeight("small") + math.floor(6 * m.s), ly, PAL.muted) - elseif info and info.status == "available" then - Kit.text("small", Strings("v%s available", tostring(info.latest)), - lx, ly, PAL.yellow) - elseif info and info.status == "current" then - Kit.text("small", Strings("up to date"), lx, ly, PAL.muted) - elseif info and info.status == "error" then - Kit.text("small", Strings("check failed"), lx, ly, PAL.red) - end - ly = ly + Kit.textHeight("small") + math.floor(2 * m.s) - - -- one line of description, or the download stats when we have them - -- (download count in green so popularity reads at a glance) - if info and info.downloads then - local d = info.dates - local dl = ModUpdate.downloadsLine(info.downloads.total) - local dates = ModUpdate.datesLine(d and d.first, d and d.latest) - local segs = {} - if dl then segs[#segs + 1] = { dl, PAL.green } end - if dates then - segs[#segs + 1] = { (dl and " - " or "") .. dates, PAL.detail } + -- These answer separate games, not a single shared install flag. The + -- importer receives the game id so an experimental confirmation also + -- applies only to the checkbox the player pressed. + local flipped = false + local gamesY = ry + math.floor(8 * m.s) + textH + math.floor(8 * m.s) + Kit.text("micro", gamesLabel, px, + gamesY + (togH - Kit.textHeight("micro")) / 2, PAL.muted) + local tx = px + Kit.textWidth("micro", gamesLabel) + math.floor(10 * m.s) + for _, game in ipairs(GameVersion.ORDER) do + local togKey = "mod-toggle-" .. mod.id .. "-" .. game + if modGameCheckbox(tx, gamesY, togH, + mod.enabledByVersion and mod.enabledByVersion[game] == true, + game, togKey, not safeMode) then + local version = game + queueAction(imp, togKey, function() imp:_toggleMod(mod.id, nil, version) end) + flipped = true + end + tx = tx + togH + togGap + end + -- The checkboxes sit inside the row's rect, so their press also passes the + -- row hit test; `flipped` gates the row action to everywhere else. + if not flipped + and (Kit.press(x, ry, w, rowH) or Kit._activateId == rowKey) then + local id = mod.id + queueAction(imp, rowKey, function() imp._modActions = id end) + end + local textW = inner + + local badgeW = Kit.textWidth("micro", mod.badge) + math.floor(12 * m.s) + -- the games the mod is for, beside its category: the same chip the + -- in-game manager shows (src/mods/ModTargets.lua) + local gamesW = mod.targets + and Kit.textWidth("micro", mod.targets) + math.floor(12 * m.s) or 0 + local nameShown = Kit.ellipsize("button", mod.name, + textW - badgeW - gamesW - math.floor(12 * m.s)) + local headingCol = isFullyDisabled and PAL.muted or PAL.heading + Kit.text("button", nameShown, px, ly, headingCol) + local tagX = px + Kit.textWidth("button", nameShown) + math.floor(8 * m.s) + Kit.tag(tagX, ly, badgeW, Kit.textHeight("button"), mod.badge, + mod.experimental and PAL.yellow or PAL.muted) + if mod.targets then + Kit.tag(tagX + badgeW + math.floor(4 * m.s), ly, gamesW, + Kit.textHeight("button"), mod.targets, + mod.targetsHere == false and PAL.steel or PAL.blue) + end + ly = ly + Kit.textHeight("button") + math.floor(4 * m.s) + + -- version + status + update state + local statusText, statusCol = modStatusColor(mod.status) + local line = "v" .. tostring(mod.version or "?") .. " " .. statusText + Kit.text("small", line, px, ly, statusCol) + local lx = px + Kit.textWidth("small", line) + math.floor(12 * m.s) + if imp:_modInfoPending(mod.id) then + -- An inline spinner, because this row's release check is genuinely in + -- flight -- the list stays usable while it resolves. + Loader.dot(lx, ly, Kit.textHeight("small")) + Kit.text("small", Strings("Checking..."), + lx + Kit.textHeight("small") + math.floor(6 * m.s), ly, PAL.muted) + elseif info and info.status == "available" then + Kit.text("small", Strings("v%s available", tostring(info.latest)), + lx, ly, PAL.yellow) + elseif info and info.status == "current" then + Kit.text("small", Strings("up to date"), lx, ly, PAL.muted) + elseif info and info.status == "error" then + Kit.text("small", Strings("check failed"), lx, ly, PAL.red) + end + ly = ly + Kit.textHeight("small") + math.floor(2 * m.s) + + -- one line of description, or the download stats when we have them + -- (download count in green so popularity reads at a glance) + if info and info.downloads then + local d = info.dates + local dl = ModUpdate.downloadsLine(info.downloads.total) + local dates = ModUpdate.datesLine(d and d.first, d and d.latest) + local segs = {} + if dl then segs[#segs + 1] = { dl, PAL.green } end + if dates then + segs[#segs + 1] = { (dl and " - " or "") .. dates, PAL.detail } + end + segLine("small", segs, px, ly, textW) + elseif (mod.description or "") ~= "" then + Kit.text("small", Kit.ellipsize("small", mod.description, textW), + px, ly, PAL.detail) end - segLine("small", segs, px, ly, textW) - elseif (mod.description or "") ~= "" then - Kit.text("small", Kit.ellipsize("small", mod.description, textW), - px, ly, PAL.detail) end end - Kit.popClip() - local pagerY = listTop + listH + gap - local newPage, newPagerH = Kit.pager(x, pagerY, w, cur, #mods, perPage, "mods") - if newPage ~= cur then imp.modScroll = 0 end - setPage(imp, "mods", newPage) - return pagerY + newPagerH - y + local contentH = #mods * rowH + (#mods - 1) * gap + return (listTop + contentH + gap) - y end -- ---------------------------------------------------------- find mods panel @@ -4782,8 +4733,7 @@ function LauncherView.draw(imp) Kit.blockClicks = modalUp(imp) local step = Kit.scrollStep(m.s) - local nested = modListWantsWheel(imp, Kit.wheelY or 0) - if not nested then + do local rect = imp._tabRegionRect if rect then setTabScroll(imp, (Kit.scrollWheel(tabScrollAt(imp), tabScrollMax(imp), @@ -4791,8 +4741,7 @@ function LauncherView.draw(imp) end end local scroll = math.max(0, math.min(imp._pageScroll or 0, scrollMax)) - if scrollMax > 0 and (Kit.wheelY or 0) ~= 0 and not nested - and not Kit.blockClicks then + if scrollMax > 0 and (Kit.wheelY or 0) ~= 0 and not Kit.blockClicks then local moved = math.max(0, math.min(scroll - Kit.wheelY * step, scrollMax)) if moved ~= scroll then scroll = moved @@ -4800,7 +4749,7 @@ function LauncherView.draw(imp) end end imp._pageScroll, imp._pageScrollMax = scroll, scrollMax - if (Kit.wheelY or 0) ~= 0 and not nested and not Kit.blockClicks + if (Kit.wheelY or 0) ~= 0 and not Kit.blockClicks and tabScrollMax(imp) > 0 then local was = tabScrollAt(imp) local to = Kit.scrollClamp(was - Kit.wheelY * step, tabScrollMax(imp)) diff --git a/src/import/RomExtractorGen2.lua b/src/import/RomExtractorGen2.lua index 4cc2eb73..4171d681 100644 --- a/src/import/RomExtractorGen2.lua +++ b/src/import/RomExtractorGen2.lua @@ -4,6 +4,7 @@ -- (species order IS dex order, pics/tilesets are lz3-compressed rather than -- pkmncompress'd, maps are grouped instead of flat). See docs/gold-phase1.md. local bit = require("bit") +local GameVersion = require("src.core.GameVersion") local ImageWriter = require("src.import.ImageWriter") local LuaWriter = require("src.import.LuaWriter") local Rom = require("src.import.Rom") @@ -168,6 +169,10 @@ function RomExtractorGen2.new(romData, manifest, progress) symbols = manifest.symbols, progress = progress, stage = 0, + -- _GOLD / _SILVER: the labels are shared, the data behind a handful of + -- them is not (gfx/misc.asm:9-20 vs :46-57). + edition = GameVersion.forSha1(manifest.romSha1) == "silver" + and "silver" or "gold", }, RomExtractorGen2) end @@ -1641,22 +1646,40 @@ function RomExtractorGen2:extractTitle() return 3 end - -- pret gfx/title/title_bg_gold.pal / title_fg.pal (5 BG pals, 2 OBJ pals). - local BG_PALS = { + local silver = self.edition == "silver" + + -- pret gfx/title/title_bg_gold.pal / title_bg_silver.pal (5 BG pals); + -- GSTitleBGPals is the edition-selected include (engine/gfx/color.asm:1234). + local BG_PALS = silver and { + { { 31, 31, 31 }, { 0, 12, 15 }, { 4, 8, 21 }, { 0, 0, 0 } }, + { { 31, 21, 0 }, { 15, 17, 15 }, { 4, 8, 21 }, { 0, 0, 17 } }, + { { 31, 31, 31 }, { 31, 0, 0 }, { 4, 8, 21 }, { 0, 0, 0 } }, + { { 31, 31, 31 }, { 24, 23, 25 }, { 4, 8, 21 }, { 8, 8, 9 } }, + { { 31, 31, 31 }, { 5, 10, 11 }, { 0, 12, 15 }, { 0, 0, 0 } }, + } or { { { 31, 31, 31 }, { 18, 23, 31 }, { 15, 20, 31 }, { 0, 0, 0 } }, { { 31, 21, 0 }, { 12, 14, 12 }, { 15, 20, 31 }, { 0, 0, 17 } }, { { 31, 31, 31 }, { 31, 0, 0 }, { 15, 20, 31 }, { 0, 0, 0 } }, { { 31, 31, 31 }, { 29, 25, 0 }, { 15, 20, 31 }, { 17, 10, 1 } }, { { 31, 31, 31 }, { 23, 26, 31 }, { 18, 23, 31 }, { 0, 0, 0 } }, } - -- title_fg.pal: pal 0 = Ho-Oh silhouette (shades 1-3 are the same brown); - -- pal 1 = gold trail sparks (OAM_PAL1 on GSTitleTrail). + -- title_fg.pal, shared (GSTitleOBPals, engine/gfx/color.asm:1241): pal 0 = + -- Ho-Oh silhouette; pal 1 = gold trail sparks (OAM_PAL1 on GSTitleTrail). local OBJ_HOOH = { { 31, 31, 31 }, { 7, 6, 3 }, { 7, 6, 3 }, { 7, 6, 3 }, } local OBJ_TRAIL = { { 31, 31, 31 }, { 31, 31, 0 }, { 26, 22, 0 }, { 0, 0, 0 }, } + -- engine/movie/title.asm:134-141 + CopyPals (home/palettes.asm:190): + -- DmgToCgbObjPal0 %11100000 makes Silver's OBJ pal 0 {c0, c0, c2, c3}. + if silver then + OBJ_HOOH = { + OBJ_HOOH[1], OBJ_HOOH[1], OBJ_HOOH[3], OBJ_HOOH[4], + } + -- .OAMData_GSTitleTrail is attribute 0, not OAM_PAL1 (oam.asm:834-837). + OBJ_TRAIL = OBJ_HOOH + end local function palColor(pal, shade) local c = pal[shade + 1] or pal[4] @@ -1671,8 +1694,9 @@ function RomExtractorGen2:extractTitle() -- solid BLACK silhouette on a monochrome screen rather than the shaded pose -- a straight decode gives. rOBP1 (%11111000) carries the gold trail. local DMG_BGP = { 0, 2, 1, 3 } - local DMG_OBP0 = { 3, 3, 3, 3 } - local DMG_OBP1 = { 0, 2, 3, 3 } + -- engine/movie/title.asm:105-115: Silver writes %11110000 to both OBPs. + local DMG_OBP0 = silver and { 0, 0, 3, 3 } or { 3, 3, 3, 3 } + local DMG_OBP1 = silver and { 0, 0, 3, 3 } or { 0, 2, 3, 3 } -- ImageWriter's four hardware shades, by shade number. local DMG_SHADE = { 1, 2 / 3, 1 / 3, 0 } @@ -1776,6 +1800,28 @@ function RomExtractorGen2:extractTitle() -- Ho-Oh frames from OAMData_GSIntroHoOh1..5 (data/sprite_anims/oam.asm). local hoohTiles = tilesFrom2bpp(self:decompressLz3Symbol("TitleScreenGFX4"), true) + -- .OAMData_GSIntroLugia1 / 2 (data/sprite_anims/oam.asm:736-773); the + -- spriteanimoam vtile offset is added per frame (core.asm:224-227). + local LUGIA_1 = { + { -5, -2, 0, 0, 0x00 }, { -5, 0, 0, 0, 0x02 }, + { -4, -2, 0, 0, 0x04 }, { -4, 0, 0, 0, 0x06 }, + { -3, -1, 0, 0, 0x08 }, { -2, -1, 0, 0, 0x0a }, + { -1, -2, 0, 0, 0x0c }, { -1, 0, 0, 0, 0x0e }, + { 0, -2, 0, 0, 0x10 }, { 0, 0, 0, 0, 0x12 }, + { 1, -2, 0, 0, 0x14 }, { 1, 0, 0, 0, 0x16 }, + { 2, -2, 0, 0, 0x18 }, { 2, 0, 0, 0, 0x1a }, + { 3, -1, 0, 0, 0x1c }, { 4, -1, 0, 0, 0x1e }, + } + local LUGIA_2 = { + { -5, -2, 0, 0, 0x00 }, { -5, 0, 0, 0, 0x02 }, + { -4, -2, 0, 0, 0x04 }, { -4, 0, 0, 0, 0x06 }, + { -3, -1, 0, 0, 0x08 }, { -2, -1, 0, 0, 0x0a }, + { -1, -2, 0, 0, 0x0c }, { -1, 0, 0, 0, 0x0e }, + { 0, -2, 0, 0, 0x10 }, { 0, 0, 0, 0, 0x12 }, + { 1, -2, 0, 0, 0x14 }, { 1, 0, 0, 0, 0x16 }, + { 2, -2, 0, 0, 0x18 }, { 2, 0, 0, 0, 0x1a }, + { 3, -2, 0, 0, 0x1c }, { 4, -2, 0, 0, 0x1e }, + } local HOOH_FRAMES = { { -- 1 { -4, -1, 0, 0, 0x00 }, { -3, -2, 0, 0, 0x02 }, { -3, 0, 0, 0, 0x04 }, @@ -1823,22 +1869,36 @@ function RomExtractorGen2:extractTitle() { 3, -2, 0, 0, 0x22 }, { 3, 0, 0, 0, 0x24 }, }, } - -- Frameset_GSIntroHoOhLugia (Gold): 1,2,3,4,3,5 with these durations. - local HOOH_SEQUENCE = { + -- Silver's five oamsets, as {layout, vtile base} (oam.asm:103-107). + local LUGIA_FRAMES = { + { LUGIA_1, 0x00 }, { LUGIA_1, 0x20 }, { LUGIA_2, 0x40 }, + { LUGIA_2, 0x60 }, { LUGIA_1, 0x00 }, + } + -- Frameset_GSIntroHoOhLugia (data/sprite_anims/framesets.asm:376-396): + -- Gold 1,2,3,4,3,5; Silver 2,1,2,3,3,4,4,3,2 on a faster clock. + local HOOH_SEQUENCE = silver and { + { 2, 3 }, { 1, 7 }, { 2, 7 }, { 3, 7 }, { 3, 7 }, + { 4, 7 }, { 4, 7 }, { 3, 7 }, { 2, 3 }, + } or { { 1, 10 }, { 2, 9 }, { 3, 10 }, { 4, 10 }, { 3, 9 }, { 5, 10 }, } local hoohPaths, hoohGrayPaths = {}, {} - local originX, originY = 32, 24 - for fi, oam in ipairs(HOOH_FRAMES) do + -- Lugia1/2 span x tiles -5..4, four tiles wider than Ho-Oh's -4..3. + local originX, originY = silver and 40 or 32, 24 + local poseW = silver and 80 or 64 + local frames = silver and LUGIA_FRAMES or HOOH_FRAMES + for fi, entry in ipairs(frames) do + local oam = silver and entry[1] or entry + local base = silver and entry[2] or 0 -- The pose starts EMPTY, not white: an OBJ's colour 0 is transparent -- wherever it falls, so a gap enclosed by the bird shows the sky through -- exactly like one outside it, and there is no matte to flood-fill. - local pose = ImageWriter.blank(64, 64, 0, 0, 0, 0) + local pose = ImageWriter.blank(poseW, 64, 0, 0, 0, 0) for _, spr in ipairs(oam) do local px = originX + spr[1] * 8 + spr[3] local py = originY + spr[2] * 8 + spr[4] - blitSprite(pose, hoohTiles[spr[5] + 1], px, py) - blitSprite(pose, hoohTiles[spr[5] + 2], px, py + 8) + blitSprite(pose, hoohTiles[base + spr[5] + 1], px, py) + blitSprite(pose, hoohTiles[base + spr[5] + 2], px, py + 8) end local tinted = colorize(pose, function() return OBJ_HOOH end) local rel = ("title/hooh_%d.png"):format(fi) @@ -1855,14 +1915,20 @@ function RomExtractorGen2:extractTitle() end self:tick("Title screen", 3, 5) - -- Trail: TitleScreenGFX3 is raw 2bpp (8 tiles); Gold OAM uses one 8x16 - -- on OAM_PAL1 (gold), not the Ho-Oh silhouette pal. + -- Trail: TitleScreenGFX3 is raw 2bpp; Gold's OAM is one 8x16, Silver's two + -- side by side, and only 4 of Silver's 8 copied tiles exist (title.asm:43). local trailSym = self:symbol("TitleScreenGFX3") - local trailRaw = self.rom:bytes(trailSym.bank, trailSym.address, 8 * 16) + local trailTileCount = silver and 4 or 8 + local trailRaw = + self.rom:bytes(trailSym.bank, trailSym.address, trailTileCount * 16) local trailTiles = tilesFrom2bpp(trailRaw, true) - local trail = ImageWriter.blank(8, 16, 0, 0, 0, 0) + local trail = ImageWriter.blank(silver and 16 or 8, 16, 0, 0, 0, 0) blitSprite(trail, trailTiles[1], 0, 0) blitSprite(trail, trailTiles[2], 0, 8) + if silver then + blitSprite(trail, trailTiles[3], 8, 0) + blitSprite(trail, trailTiles[4], 8, 8) + end local trailTint = colorize(trail, function() return OBJ_TRAIL end) self:save(trailTint, "title/trail.png") self:save(throughRegister(trail, DMG_OBP1), "title/trail_gray.png") @@ -1908,8 +1974,11 @@ function RomExtractorGen2:extractTitle() cloudsGray = "assets/generated/title/clouds_gray.png", hoohFramesGray = hoohGrayPaths, trailGray = "assets/generated/title/trail_gray.png", - -- Frameset_GSIntroHoOhLugia (Gold), frame index 1-based + duration frames. + -- Frameset_GSIntroHoOhLugia, frame index 1-based + duration frames. hoohSequence = HOOH_SEQUENCE, + -- AnimSeq_GSIntroHoOhLugia (engine/sprite_anims/functions.asm:820-838). + hoohBobAmplitude = silver and 8 or 2, + hoohBobStep = silver and -1 or 1, -- `depixel 12, 11` (engine/movie/title.asm). Two traps, and the port had -- fallen into both, which is what put Ho-Oh off-centre: -- * ldpixel's own comment calls its first tile argument the X one and is @@ -1919,19 +1988,45 @@ function RomExtractorGen2:extractTitle() -- the cursor two rows up on the box screen. So this is x 88, y 96. -- * those are OAM coordinates, which are biased; a drawn object sits at -- (x - 8, y - 16) on screen. - -- The pose canvas holds its own origin at (32, 24), so the sheet's corner - -- is (88 - 8 - 32, 96 - 16 - 24) -- and the bird's 64px width then lands - -- centred on the screen, 48 to 112. - hoohX = 48, - hoohY = 56, + -- The pose canvas holds its own origin, so the sheet's corner is + -- (88 - 8 - originX, 96 - 16 - originY) -- and the pose's width then lands + -- centred on the screen (Ho-Oh 48..112, Lugia 40..120). + hoohX = 80 - originX, + hoohY = 80 - originY, trail = "assets/generated/title/trail.png", copyright = "assets/generated/title/copyright.png", copyrightSplash = "assets/generated/title/copyright_splash.png", - -- ScrollTitleScreenClouds: Gold decrements the cloud-band SCX every - -- 8 vblanks, so the strip slides 1px right. Silver does the same - -- decrement every frame. - cloudScrollEvery = 8, + -- ScrollTitleScreenClouds (engine/menus/intro_menu.asm:917-928): Gold + -- decrements the cloud-band SCX every 8 vblanks, so the strip slides 1px + -- right. Silver does the same decrement every frame. + cloudScrollEvery = silver and 1 or 8, cloudY = 88, + -- BG pal 0 colour 2: the sky the widescreen bands have to match. + sky = { + BG_PALS[1][3][1] / 31, BG_PALS[1][3][2] / 31, BG_PALS[1][3][3] / 31, + }, + -- The fill under the cloud/wave band: Gold's cloud field is BG pal 0 + -- colour 0 (white), Silver's sea floor is colour 3 (black). + below = silver and { + BG_PALS[1][4][1] / 31, BG_PALS[1][4][2] / 31, BG_PALS[1][4][3] / 31, + } or { + BG_PALS[1][1][1] / 31, BG_PALS[1][1][2] / 31, BG_PALS[1][1][3] / 31, + }, + -- UpdateTitleTrailSprite (engine/menus/intro_menu.asm:1069-1124). Silver's + -- `depixel 15, 11, 4, 0` is OAM (88, 124), less the bias and the (-16, -8) + -- corner .OAMData_GSTitleTrail draws from. + trailMode = silver and "silver" or "gold", + trailSpawns = silver and { { 72, 100 } } or { + { 80, 88 }, { 104, 88 }, { 104, 88 }, { 120, 88 }, + { 120, 88 }, { 88, 88 }, + }, + trailSpawnEvery = 4, + trailStepX = 4, + trailStepY = silver and 0 or 1, + -- AnimSeq_GSTitleTrail (functions.asm:784-813) with wIntroSceneTimer 0. + trailBobAmplitude = silver and 3 or 2, + trailPhaseStep = silver and 7 or 3, + trailPhase = silver and 0 or nil, } self:write("title", data) return data diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua index 8b1e3bea..e123987f 100644 --- a/src/import/RomImporter.lua +++ b/src/import/RomImporter.lua @@ -142,6 +142,8 @@ local VERSION_REQUIRED_FILES_OVERRIDE = { "assets/generated/audio/programs.bin", }, } +-- Same Gen 2 extract, so a Silver cache is complete when the same files exist. +VERSION_REQUIRED_FILES_OVERRIDE.silver = VERSION_REQUIRED_FILES_OVERRIDE.gold -- "Split-screen ROM selector" first-run palette (matches the FirstRun mockup): -- a dark neon arcade panel, one column per game. @@ -335,7 +337,7 @@ function RomImporter.syncAndroidShortcuts(activeVersion) return false end - local allVersions = { "red", "blue", "yellow", "gold" } + local allVersions = GameVersion.ORDER local ready = {} local seen = {} @@ -1360,11 +1362,10 @@ function RomImporter.new(onComplete, opts) saveNotice = {}, -- MODS panel state (pass 3): mods is the cached LauncherMods.list() array -- (refreshed lazily on first draw and after any toggle/install/delete); - -- modScroll is the current paged list's inner scroll offset (px, clamped - -- in draw); modNotice is the last install/delete result { ok, text }. + -- modNotice is the last install/delete result { ok, text }. -- requiredImportNotice stays inside the imported-files modal so validation -- failures are visible beside the file picker that caused them. - mods = nil, modScroll = 0, modNotice = nil, requiredImportNotice = nil, + mods = nil, modNotice = nil, requiredImportNotice = nil, -- Which game the MODS panel is answering for (a GameVersion id, nil = -- every game). Rows resolve their enable-state and their "runs here" -- verdict against it (src/mods/ModTargets.lua). @@ -1420,7 +1421,8 @@ function RomImporter.new(onComplete, opts) self.returning[version] = (not ready) and marker ~= nil and marker ~= markerFor(version) self.romName[version] = "pokemon_" .. info.id - .. ((info.id == "yellow" or info.id == "gold") and ".gbc" or ".gb") + .. ((info.id == "yellow" or GameVersion.generation(version) == 2) + and ".gbc" or ".gb") end RomImporter.syncAndroidShortcuts() self:_applyLastVersionTab() @@ -1685,7 +1687,7 @@ function RomImporter:startData(data, displayName) end if not isAcceptedRomSize(#data) then self:setError(("Expected a 1 MiB Game Boy ROM (Red/Blue/Yellow) or a " - .. "2 MiB Game Boy Color ROM (Gold); this file is %.2f MiB.") + .. "2 MiB Game Boy Color ROM (Gold/Silver); this file is %.2f MiB.") :format(#data / 1024 / 1024)) return end @@ -1693,7 +1695,8 @@ function RomImporter:startData(data, displayName) local version = GameVersion.forSha1(actualHash) if not version then self:setError(("Unsupported ROM (SHA-1 %s). This needs a clean US Pokemon " - .. "Red, Blue, Yellow, or Gold dump; patched, trimmed or \"fixed\" dumps " + .. "Red, Blue, Yellow, Gold, or Silver dump; patched, trimmed or " + .. "\"fixed\" dumps " .. "(tagged [b] or [BF]) never verify."):format(actualHash)) return end @@ -1770,7 +1773,7 @@ function RomImporter:_startExtractCoroutine(version, info, prefix, displayName) local CacheFs = require("src.import.CacheFs") CacheFs.prefix = prefix local manifest = require("src.import.RomManifest").decode(version) - local RomExtractor = version == "gold" + local RomExtractor = GameVersion.generation(version) == 2 and require("src.import.RomExtractorGen2") or require("src.import.RomExtractor") local extractor = RomExtractor.new(self.romData, manifest, @@ -2755,7 +2758,8 @@ function RomImporter:resumeAfterOverlay() end function RomImporter:_cycleTab(delta) - local order = { "red", "blue", "yellow", "gold", "mods", "find", "skins" } + local order = { "red", "blue", "yellow", "gold", "silver", + "mods", "find", "skins" } local idx = 1 for i, id in ipairs(order) do if id == self.tab then idx = i; break end @@ -3121,7 +3125,6 @@ function RomImporter:_switchTab(id) self.tab = id self._findSearchFocus = false self._skinUrlFocus = false - self._modScrollMax, self._modListRect = 0, nil self:_disarmTextInput() -- the skins list is cheap and can change behind the launcher's back -- (an export, a hand-dropped folder), so re-read it on every visit diff --git a/src/save_convert/SaveConvert.lua b/src/save_convert/SaveConvert.lua index 476b4794..e022faba 100644 --- a/src/save_convert/SaveConvert.lua +++ b/src/save_convert/SaveConvert.lua @@ -228,7 +228,10 @@ SaveConvert.mergeDefaults = mergeDefaults -- codec exists yet. Both directions answer with a plain message the -- launcher's save card renders as-is, instead of pushing a Gen 2 save -- table through Gen 1 offsets and surfacing a codec traceback. -local GEN2_SAV_UNSUPPORTED = { gold = "Pokemon Gold" } +local GEN2_SAV_UNSUPPORTED = { + gold = "Pokemon Gold", + silver = "Pokemon Silver", +} -- importSav(bytes, version, gameVersion) -> saveTable, err -- bytes: the raw 32768-byte SRAM string. Validates size and the main-data diff --git a/src/sync/SyncMods.lua b/src/sync/SyncMods.lua index 018c80c5..6366556a 100644 --- a/src/sync/SyncMods.lua +++ b/src/sync/SyncMods.lua @@ -5,7 +5,7 @@ SyncMods.REV = 1 local function versions() local ok, GameVersion = pcall(require, "src.core.GameVersion") if ok and GameVersion and GameVersion.ORDER then return GameVersion.ORDER end - return { "red", "blue", "yellow", "gold" } + return { "red", "blue", "yellow", "gold", "silver" } end local function defaultDeps() diff --git a/src/ui/TouchControlsEditor.lua b/src/ui/TouchControlsEditor.lua index f48905f2..a490746d 100644 --- a/src/ui/TouchControlsEditor.lua +++ b/src/ui/TouchControlsEditor.lua @@ -73,7 +73,10 @@ function Editor.load(opts) } local optsTbl = SaveData.loadOptions() local applied = optsTbl - if opts.version == "gold" then + local GameVersion = require("src.core.GameVersion") + local gen2 = GameVersion.VERSIONS[opts.version] + and GameVersion.generation(opts.version) == 2 + if gen2 then local gold = type(optsTbl.gold) == "table" and optsTbl.gold or {} applied = { touchControls = gold.touchControls, @@ -151,7 +154,9 @@ local function persist() skin = cfg.skin, layouts = cfg.layouts, } - if Editor.version == "gold" then + local GameVersion = require("src.core.GameVersion") + if GameVersion.VERSIONS[Editor.version] + and GameVersion.generation(Editor.version) == 2 then opts.gold = type(opts.gold) == "table" and opts.gold or {} opts.gold.touchControls = block else @@ -569,7 +574,7 @@ function Editor.new(game) local state = { game = game, isOpaque = true } Editor.hostPoll = true Editor.load({ - version = "gold", + version = require("src.core.GameVersion").get(), hostPoll = true, onClose = function() Editor.hostPoll = false diff --git a/src/ui/gen2/Credits.lua b/src/ui/gen2/Credits.lua index 8a04726b..97ca86ba 100644 --- a/src/ui/gen2/Credits.lua +++ b/src/ui/gen2/Credits.lua @@ -189,11 +189,18 @@ defineString("CREDIT_END", "END") -- STAFF and everything after it is a heading. Anything BELOW this id is a -- person as far as ParseCredits is concerned. -Credits.STAFF = defineString("STAFF", { - " #MON", - " GOLD VERSION", - " PORT STAFF", -}) +-- Credits_Staff differs per edition, including the centring spaces +-- (data/credits_strings.asm:54-60). +Credits.STAFF = defineString("STAFF", + require("src.core.GameVersion").get() == "silver" and { + " #MON", + " SILVER VERSION", + " PORT STAFF", + } or { + " #MON", + " GOLD VERSION", + " PORT STAFF", + }) defineString("DIRECTOR", " DIRECTOR") defineString("PROGRAMMING", " PROGRAMMING") defineString("ENGINE_DESIGN", " ENGINE DESIGN") diff --git a/src/ui/gen2/GoldSilverIntro.lua b/src/ui/gen2/GoldSilverIntro.lua index 4d9b6ac3..b8eeb39f 100644 --- a/src/ui/gen2/GoldSilverIntro.lua +++ b/src/ui/gen2/GoldSilverIntro.lua @@ -147,8 +147,8 @@ function GoldSilverIntro.new(game, opts) -- the movie's full 2335 frames over an empty screen and reads exactly -- like "the intro does not work". Say so instead: the fix is a -- re-import, and nothing else in the boot chain will mention it. - Logger.warn("gold intro: no intro.lua in the cache -- re-import Gold " - .. "or the movie plays blank") + Logger.warn("gen2 intro: no intro.lua in the cache -- re-import " + .. "this version or the movie plays blank") end self.images = {} self.sheets = {} diff --git a/src/ui/gen2/MainMenu.lua b/src/ui/gen2/MainMenu.lua index c8fb68fc..d6f97b70 100644 --- a/src/ui/gen2/MainMenu.lua +++ b/src/ui/gen2/MainMenu.lua @@ -56,7 +56,7 @@ function MainMenu.new(game, opts) self.save = opts.save if self.save == nil and opts.hasSave ~= false then - local loaded = Save.load("gold") + local loaded = Save.load() self.save = loaded end self.hasSave = opts.hasSave diff --git a/src/ui/gen2/NamePick.lua b/src/ui/gen2/NamePick.lua index e9f1011d..ccfe5ff8 100644 --- a/src/ui/gen2/NamePick.lua +++ b/src/ui/gen2/NamePick.lua @@ -34,8 +34,14 @@ local NamePick = {} NamePick.__index = NamePick NamePick.isOpaque = true --- data/player_names.asm PlayerNameArray, Gold's half of the IF. +-- data/player_names.asm PlayerNameArray, one half of the IF per edition. local PRESETS = { "GOLD", "HIRO", "TAYLOR", "KARL" } +local PRESETS_SILVER = { "SILVER", "KAMON", "OSCAR", "MAX" } + +local function presetsFor() + local silver = require("src.core.GameVersion").get() == "silver" + return silver and PRESETS_SILVER or PRESETS +end -- menu_coords 0, 0, 10, TEXTBOX_Y - 1 (TEXTBOX_Y = 12). local BOX_X1, BOX_Y1, BOX_X2, BOX_Y2 = 0, 0, 10, 11 @@ -60,7 +66,7 @@ function NamePick.new(game, opts) self.game = game self.onDone = opts.onDone self.items = { "NEW NAME" } - for _, name in ipairs(opts.presets or PRESETS) do + for _, name in ipairs(opts.presets or presetsFor()) do self.items[#self.items + 1] = name end -- `db 1 ; default option`: the cursor starts on NEW NAME, not on a preset. @@ -106,7 +112,7 @@ function NamePick:openNaming() if name and #name > 0 then self:choose(name) else - self:choose(self.items[2] or "GOLD") + self:choose(self.items[2] or presetsFor()[1]) end end, }) @@ -146,7 +152,7 @@ function NamePick:update(_dt) if self.fontOk then self:openNaming() else - self:choose(self.items[2] or "GOLD") + self:choose(self.items[2] or presetsFor()[1]) end else -- A preset returns through MovePlayerPicLeft, so the pic walks back @@ -227,5 +233,7 @@ function NamePick:drawWidescreen(winW, winH) end NamePick.PRESETS = PRESETS +NamePick.PRESETS_SILVER = PRESETS_SILVER +NamePick.presetsFor = presetsFor return NamePick diff --git a/src/ui/gen2/OakSpeech.lua b/src/ui/gen2/OakSpeech.lua index 00684b3a..a68f6ebb 100644 --- a/src/ui/gen2/OakSpeech.lua +++ b/src/ui/gen2/OakSpeech.lua @@ -72,8 +72,8 @@ end -- Naming presets are boot config the same way Gen 1 reads them -- (field.boot.namePresets), so a total conversion that replaces the list once --- replaces it for both games; NamePick.PRESETS (data/player_names.asm --- PlayerNameArray) is Gold's fallback. +-- replaces it for both games; NamePick.presetsFor (data/player_names.asm +-- PlayerNameArray) is the running edition's fallback. local function namePresets(game, who, fallback) local boot = game and game.data and game.data.field and game.data.field.boot @@ -351,9 +351,9 @@ function OakSpeech:openNamePick(step) picColors = self.playerColors, presets = step.presets or namePresets(self.game, step.presetsWho or step.who or "player", - step.presetsFallback or NamePick.PRESETS), + step.presetsFallback or NamePick.presetsFor()), onDone = function(name) - name = name or "GOLD" + name = name or NamePick.presetsFor()[1] self.game.save.player.name = name self.game.stack:pop() -- NamePick self.busy = false diff --git a/src/ui/gen2/PcMenu.lua b/src/ui/gen2/PcMenu.lua index 06c724ad..3d283807 100644 --- a/src/ui/gen2/PcMenu.lua +++ b/src/ui/gen2/PcMenu.lua @@ -181,7 +181,7 @@ function PcMenu:beginChangeBox(index) self.saveTimer = 0 self.saved = nil local existed = self.saveExists - if existed == nil then existed = Save.exists("gold") end + if existed == nil then existed = Save.exists() end self.existed = existed end diff --git a/src/ui/gen2/SaveMenu.lua b/src/ui/gen2/SaveMenu.lua index bd745d63..31811fed 100644 --- a/src/ui/gen2/SaveMenu.lua +++ b/src/ui/gen2/SaveMenu.lua @@ -71,7 +71,7 @@ function SaveMenu.new(game, opts) self.onDone = opts.onDone self.writer = opts.writer or Save.save local existed = opts.existed - if existed == nil then existed = Save.exists("gold") end + if existed == nil then existed = Save.exists() end self.existed = existed -- confirm -> overwrite (only when a file exists) -> saving -> done self.phase = "confirm" diff --git a/src/ui/gen2/TitleState.lua b/src/ui/gen2/TitleState.lua index fe8f1cd7..32b36d69 100644 --- a/src/ui/gen2/TitleState.lua +++ b/src/ui/gen2/TitleState.lua @@ -2,6 +2,7 @@ -- wing-flap (Frameset_GSIntroHoOhLugia), spark trails, A/Start to continue. -- drawWidescreen fills the window with sky/clouds so widescreen has no -- pillarbox voids; the 160x144 art stays aspect-centered on top. +-- Every Gold/Silver difference arrives as a title.lua key, defaulted to Gold. -- src/render/Assets.lua is the mod-override choke point: a raw -- love.graphics.newImage skips overrides/ and AssetTransform output. @@ -16,7 +17,7 @@ local TitleState = {} TitleState.__index = TitleState TitleState.isOpaque = true --- title_bg_gold.pal mid-sky shade (sampled from composed title_screen.png). +-- title_bg_gold.pal mid-sky shade, for a cache built before title.sky existed. local SKY = { 123 / 255, 165 / 255, 255 / 255, 1 } -- ...and its grey stand-in, for when COLOR is not GBC. The title art is the -- one thing in the port baked with its colours in (see the extractor), so the @@ -61,6 +62,15 @@ function TitleState.new(game, opts) self.hoohY = tonumber(title.hoohY) or 56 self.cloudY = tonumber(title.cloudY) or 88 self.cloudScrollEvery = tonumber(title.cloudScrollEvery) or 8 + -- AnimSeq_GSIntroHoOhLugia (engine/sprite_anims/functions.asm:820-838). + self.hoohBobAmplitude = tonumber(title.hoohBobAmplitude) or 2 + self.hoohBobStep = tonumber(title.hoohBobStep) or 1 + local sky = title.sky + self.sky = (type(sky) == "table" and #sky >= 3) + and { sky[1], sky[2], sky[3], 1 } or SKY + local below = title.below + self.below = (type(below) == "table" and #below >= 3) + and { below[1], below[2], below[3], 1 } or { 1, 1, 1, 1 } self.hoohColor, self.hoohGray = {}, {} local paths = title.hoohFrames @@ -80,8 +90,12 @@ function TitleState.new(game, opts) self.sequence = title.hoohSequence or { { 1, 10 }, { 2, 9 }, { 3, 10 }, { 4, 10 }, { 3, 9 }, { 5, 10 }, } + -- A frame shows duration + 1 ticks: GetSpriteAnimFrame stores the byte on + -- the advancing tick and only decrements on the ones after + -- (engine/sprite_anims/core.asm:400-434). Both editions' framesets total + -- 64 ticks with it, locking the wing beat to the 64-tick sine bob. self.seqIndex = 1 - self.seqLeft = self.sequence[1] and self.sequence[1][2] or 10 + self.seqLeft = (self.sequence[1] and self.sequence[1][2] or 10) + 1 self.frame = 1 -- AnimSeq_GSIntroHoOhLugia's SPRITEANIMSTRUCT_VAR1. @@ -89,12 +103,21 @@ function TitleState.new(game, opts) self.frameCounter = 0 self.cloudScroll = 0 self.trails = {} - -- UpdateTitleTrailSprite / TitleTrailCoords (intro_menu.asm), in pixels. - self.trailSpawns = { + -- UpdateTitleTrailSprite / TitleTrailCoords (intro_menu.asm:1069-1124), in + -- pixels. + self.trailSpawns = title.trailSpawns or { { 80, 88 }, { 104, 88 }, { 104, 88 }, { 120, 88 }, { 120, 88 }, { 88, 88 }, } self.trailSpawnIndex = 1 + -- AnimSeq_GSTitleTrail (engine/sprite_anims/functions.asm:720-818). + self.trailMode = title.trailMode or "gold" + self.trailSpawnEvery = tonumber(title.trailSpawnEvery) or 4 + self.trailStepX = tonumber(title.trailStepX) or 4 + self.trailStepY = tonumber(title.trailStepY) or 1 + self.trailBobAmplitude = tonumber(title.trailBobAmplitude) or 2 + self.trailPhaseStep = tonumber(title.trailPhaseStep) or 3 + self.trailPhase = tonumber(title.trailPhase) -- How far past the 160px frame trails may fly (GB pixels); set each draw. self.trailMaxX = 200 self.musicStarted = false @@ -119,47 +142,56 @@ function TitleState:enter() end end --- AnimSeq_GSIntroHoOhLugia (engine/sprite_anims/functions.asm): VAR1 counts up --- one per frame and the struct's Y offset becomes `d * sin(VAR1 * pi/32)` with --- d = 2 on Gold (Silver counts DOWN with d = 8). Sprites_Sine hands back the --- byte the ASM leaves in a, so the down half of the wave arrives in two's --- complement and has to be read as a signed pixel delta here. -function TitleState:hoohBob() - local value = SpriteAnims.sine(self.hoohPhase, 2) - if value >= 0x80 then value = value - 0x100 end +-- Sprites_Sine hands back the byte the ASM leaves in a, so the down half of +-- the wave arrives in two's complement and is a signed pixel delta here. +local function signed(value) + if value >= 0x80 then return value - 0x100 end return value end +-- AnimSeq_GSIntroHoOhLugia (engine/sprite_anims/functions.asm:820-838). +function TitleState:hoohBob() + return signed(SpriteAnims.sine(self.hoohPhase, self.hoohBobAmplitude)) +end + function TitleState:advanceHooh() - self.hoohPhase = (self.hoohPhase + 1) % 256 + self.hoohPhase = (self.hoohPhase + self.hoohBobStep) % 256 self.seqLeft = self.seqLeft - 1 if self.seqLeft > 0 then return end self.seqIndex = self.seqIndex + 1 if self.seqIndex > #self.sequence then self.seqIndex = 1 end local step = self.sequence[self.seqIndex] self.frame = step[1] - self.seqLeft = step[2] + self.seqLeft = step[2] + 1 end function TitleState:spawnTrail() if not (self.trailColor or self.trailGray) then return end - if self.frameCounter % 4 ~= 0 then return end + if #self.trailSpawns == 0 then return end + if self.frameCounter % self.trailSpawnEvery ~= 0 then return end local spawn = self.trailSpawns[self.trailSpawnIndex] self.trailSpawnIndex = self.trailSpawnIndex % #self.trailSpawns + 1 if not spawn then return end self.trails[#self.trails + 1] = { - x = spawn[1], y = spawn[2], phase = love.math.random(0, 255), + x = spawn[1], y = spawn[2], + phase = self.trailPhase or love.math.random(0, 255), } end function TitleState:stepTrails() local alive = {} local maxX = self.trailMaxX or 200 + local silver = self.trailMode == "silver" for _, t in ipairs(self.trails) do - t.x = t.x + 4 - t.y = t.y + 1 - t.phase = t.phase + 3 - t.drawY = t.y + math.floor(math.sin(t.phase / 16) * 2) + t.x = t.x + self.trailStepX + t.y = t.y + self.trailStepY + t.phase = t.phase + self.trailPhaseStep + if silver then + t.drawY = t.y + signed(SpriteAnims.sine(t.phase, self.trailBobAmplitude)) + else + t.drawY = t.y + + math.floor(math.sin(t.phase / 16) * self.trailBobAmplitude) + end if t.x < maxX then alive[#alive + 1] = t end end self.trails = alive @@ -254,14 +286,17 @@ function TitleState:drawWidescreen(winW, winH) -- Let trails fly into the side bands. self.trailMaxX = math.ceil((winW - ox) / scale) + 16 - -- Sky above the cloud line, paper white below : edge to edge. The fill has - -- to match whichever baked set is showing, or the surround would stay blue - -- around a grey screen. - local sky = self:gray() and SKY_GRAY or SKY + -- Sky above the cloud line, title.below under it (Gold's white cloud + -- field, Silver's black sea) : edge to edge. The fill has to match + -- whichever baked set is showing, or the surround would stay blue around a + -- grey screen. + local sky = self:gray() and SKY_GRAY or self.sky G.setColor(sky[1], sky[2], sky[3], 1) G.rectangle("fill", 0, 0, winW, math.max(0, cloudTop)) - G.setColor(1, 1, 1, 1) + local below = self.below + G.setColor(below[1], below[2], below[3], 1) G.rectangle("fill", 0, cloudTop, winW, winH - cloudTop) + G.setColor(1, 1, 1, 1) -- Clouds across the full window width, aligned to the GB cloud band. G.push() diff --git a/src/ui/kit/Theme.lua b/src/ui/kit/Theme.lua index 6773e3e0..d786b85c 100644 --- a/src/ui/kit/Theme.lua +++ b/src/ui/kit/Theme.lua @@ -64,6 +64,7 @@ local PAL = { railBlue = { 70, 150, 255 }, railGold = { 255, 203, 5 }, -- Yellow cartridge (bright) railAmber = { 218, 145, 32 }, -- Gold cartridge (deeper metal) + railSilver = { 190, 198, 210 }, -- Silver cartridge (cool light metal) } -- Semantic aliases kept so ported call sites read the same as before. PAL.cardBorder = PAL.line @@ -321,10 +322,12 @@ function Theme.meter(x, y, w, h, pct, c) end -- The 4px version rail across the top of both windows: the only brand --- colour on screen (Red / Blue / Yellow / Gold cartridge colours). +-- colour on screen (Red / Blue / Yellow / Gold / Silver cartridge colours). function Theme.versionRail(x, y, w, h) if not G then return end - local bars = { PAL.railRed, PAL.railBlue, PAL.railGold, PAL.railAmber } + local bars = { + PAL.railRed, PAL.railBlue, PAL.railGold, PAL.railAmber, PAL.railSilver, + } local seg = w / #bars for i, c in ipairs(bars) do Theme.fill(x + (i - 1) * seg, y, seg, h, c, 1) diff --git a/src/world/gen2/World.lua b/src/world/gen2/World.lua index e9ec799b..a35795f0 100644 --- a/src/world/gen2/World.lua +++ b/src/world/gen2/World.lua @@ -1569,11 +1569,11 @@ function World:readVar(varId) end -- Script_checkver: 0 for Gold, 1 for Silver (constants/misc_constants.asm --- GS_VERSION). Only the Goldenrod prize counters and a handful of gift mons --- read it, and the port has no Silver cache yet, so an unset version is Gold. +-- GS_VERSION). function World:gsVersion() + local GameVersion = require("src.core.GameVersion") local save = self.game and self.game.save - local version = (save and save.version) or "gold" + local version = (save and save.version) or GameVersion.get() return version == "silver" and 1 or 0 end @@ -6633,8 +6633,9 @@ function World:nameRival(onDone) if save then save.rival = save.rival or {} -- NameRival ends on `ld hl, wRivalName / ld de, .DefaultName / call - -- InitName`, and .DefaultName is "SILVER@" on Gold - -- (engine/events/specials.asm:80-91). The default has to be written + -- InitName`, and .DefaultName is "SILVER@" on Gold and "GOLD@" on + -- Silver (engine/events/specials.asm:80-94). The default has to be + -- written -- HERE rather than ridden in from the seed: wRivalName starts as -- InitializeNPCNames' "???" (src/core/gen2/Save.lua), which is what the -- pre-naming Cherrygrove battle prints. @@ -6646,7 +6647,7 @@ function World:nameRival(onDone) if name and name:gsub(" ", "") ~= "" then save.rival.name = name else - save.rival.name = "SILVER" + save.rival.name = self:gsVersion() == 1 and "GOLD" or "SILVER" end end if onDone then onDone(name) end @@ -10026,8 +10027,11 @@ function World:draw() G.clear(0.07, 0.05, 0.02, 1) if not self.mapImage or not self.player then - G.setColor(0.85, 0.57, 0.13, 1) - G.printf("POKEMON GOLD", 0, math.floor(h * 0.38), w, "center") + local silver = self:gsVersion() == 1 + if silver then G.setColor(0.74, 0.78, 0.83, 1) + else G.setColor(0.85, 0.57, 0.13, 1) end + G.printf(silver and "POKEMON SILVER" or "POKEMON GOLD", + 0, math.floor(h * 0.38), w, "center") G.setColor(0.92, 0.90, 0.82, 1) G.printf(self.status or "No map.", 0, math.floor(h * 0.48), w, "center") @@ -10140,8 +10144,10 @@ function World:draw() -- The survey overlay is a developer aid, not part of the game: POKEPORT_DEV -- (or the F3 toggle) shows it, a normal boot does not. if self.showDebugHud then - G.setColor(0.85, 0.57, 0.13, 1) - G.printf("POKEMON GOLD", 0, 10, w, "center") + local silver = self:gsVersion() == 1 + if silver then G.setColor(0.74, 0.78, 0.83, 1) + else G.setColor(0.85, 0.57, 0.13, 1) end + G.printf(silver and "POKEMON SILVER" or "POKEMON GOLD", 0, 10, w, "center") G.setColor(0.92, 0.90, 0.82, 1) local label = string.format("%s (%d,%d) %s · %s · zoom %s", self.map.id, p.cellX, p.cellY, p.facing, diff --git a/tests/engine/android_shortcuts_payload_test.lua b/tests/engine/android_shortcuts_payload_test.lua index 46da7e7c..9af54c09 100644 --- a/tests/engine/android_shortcuts_payload_test.lua +++ b/tests/engine/android_shortcuts_payload_test.lua @@ -41,12 +41,21 @@ end -- Mock isReady RomImporter.isReady = function(v) return v == "red" or v == "gold" or v == "blue" or v == "yellow" + or v == "silver" end local ok = RomImporter.syncAndroidShortcuts("gold") check(ok == true, "syncAndroidShortcuts returns true on Android") check(#capturedShortcuts == 4, "syncAndroidShortcuts caps at 4 items") check(capturedShortcuts[1] == "gold", "activeVersion 'gold' is placed first") +check(capturedShortcuts[2] == "red" and capturedShortcuts[3] == "blue" + and capturedShortcuts[4] == "yellow", + "the rest follow GameVersion.ORDER until the cap") + +capturedShortcuts = nil +RomImporter.syncAndroidShortcuts("silver") +check(#capturedShortcuts == 4, "a fifth ready game does not widen the payload") +check(capturedShortcuts[1] == "silver", "activeVersion 'silver' is placed first") -- Test with subset of ready games (e.g. only Red and Gold) RomImporter.isReady = function(v) @@ -78,4 +87,4 @@ end love.system.getLaunchGame = savedGetLaunchGame love.system.updateShortcuts = nil -print("8/8 checks passed (android_shortcuts_payload_test)") +T.finish("android_shortcuts_payload_test") diff --git a/tests/engine/gate_gen2_mod_api.lua b/tests/engine/gate_gen2_mod_api.lua index 0da5fc1e..6fbceec5 100644 --- a/tests/engine/gate_gen2_mod_api.lua +++ b/tests/engine/gate_gen2_mod_api.lua @@ -23,6 +23,7 @@ T.eq(GameVersion.generation("red"), 1, "Red is Gen 1") T.eq(GameVersion.generation("blue"), 1, "Blue is Gen 1") T.eq(GameVersion.generation("yellow"), 1, "Yellow is Gen 1") T.eq(GameVersion.generation("gold"), 2, "Gold is Gen 2") +T.eq(GameVersion.generation("silver"), 2, "Silver is Gen 2") -- ------- 2. manifest: gen2compat is opt-in and defaults off diff --git a/tests/engine/launcher_gold_touch_rows.lua b/tests/engine/launcher_gold_touch_rows.lua index 441e92b8..d54713b4 100644 --- a/tests/engine/launcher_gold_touch_rows.lua +++ b/tests/engine/launcher_gold_touch_rows.lua @@ -39,45 +39,54 @@ end local edited = 0 local hooks = { editTouchControls = function() edited = edited + 1 end } -local gold = LauncherSettings.open(hooks, "gold") -check(has(gold, "TOUCH PAD"), "Gold's gear offers TOUCH PAD") -check(has(gold, "VIBRATION"), "and VIBRATION") -check(has(gold, "TOUCH CONTROLS"), "and the layout editor") -check(has(gold, "VOID FILL"), "and VOID FILL") +for _, version in ipairs({ "gold", "silver" }) do + local model = LauncherSettings.open(hooks, version) + check(has(model, "TOUCH PAD"), version .. " gear offers TOUCH PAD") + check(has(model, "VIBRATION"), version .. " and VIBRATION") + check(has(model, "TOUCH CONTROLS"), version .. " and the layout editor") + check(has(model, "VOID FILL"), version .. " and VOID FILL") -local voidFill = findRow(gold, "VOID FILL") -eq(voidFill.value(), "FADE ", "VOID FILL defaults to FADE") -voidFill.step(1) -eq(gold.opts.gold.voidFill, "water", "right stores water in the gold block") -eq(voidFill.value(), "WATER", "and the row reads WATER") -voidFill.step(-1) -eq(gold.opts.gold.voidFill, "fade", "left restores fade") + local voidFill = findRow(model, "VOID FILL") + eq(voidFill.value(), "FADE ", version .. " VOID FILL defaults to FADE") + voidFill.step(1) + eq(model.opts.gold.voidFill, "water", + version .. " right stores water in the gold block") + eq(voidFill.value(), "WATER", version .. " and the row reads WATER") + voidFill.step(-1) + eq(model.opts.gold.voidFill, "fade", version .. " left restores fade") --- Every write has to land in the gold block: the flat keys beside it are --- Red's, and Gold's boot never reads them (src/core/gen2/Save.lua:299). --- loadOptions seeds the flat Gen 1 defaults, so the check is that the Gold --- rows leave them exactly as they found them. -local flatPad = gold.opts.touchControls -local flatBuzz = gold.opts.haptics + -- Every write has to land in the gen2 block: the flat keys beside it are + -- Red's, and no Gen 2 boot reads them (src/core/gen2/Save.lua:299). + -- loadOptions seeds the flat Gen 1 defaults, so the check is that the Gen 2 + -- rows leave them exactly as they found them. + local flatPad = model.opts.touchControls + local flatBuzz = model.opts.haptics -local pad = findRow(gold, "TOUCH PAD") -local before = pad.value() -pad.step(1) -check(pad.value() ~= before, "stepping TOUCH PAD flips it") -check(type(gold.opts.gold) == "table", "into the gold block") -eq(gold.opts.gold.touchControls.enabled, false, "which now carries enabled") -eq(gold.opts.touchControls, flatPad, "leaving the flat Gen 1 key alone") + local pad = findRow(model, "TOUCH PAD") + local before = pad.value() + pad.step(1) + check(pad.value() ~= before, version .. " stepping TOUCH PAD flips it") + check(type(model.opts.gold) == "table", version .. " into the gold block") + eq(model.opts.gold.touchControls.enabled, false, + version .. " which now carries enabled") + eq(model.opts.touchControls, flatPad, + version .. " leaving the flat Gen 1 key alone") + eq(model.opts.silver, nil, + version .. " and inventing no second Gen 2 block beside it") -local buzz = findRow(gold, "VIBRATION") -local buzzBefore = buzz.value() -buzz.step(1) -check(buzz.value() ~= buzzBefore, "stepping VIBRATION moves the level") -eq(gold.opts.gold.haptics, TouchControls.normalizeHaptics(gold.opts.gold.haptics), - "VIBRATION stores a level the shared module knows") -eq(gold.opts.haptics, flatBuzz, "also without touching Red's") + local buzz = findRow(model, "VIBRATION") + local buzzBefore = buzz.value() + buzz.step(1) + check(buzz.value() ~= buzzBefore, version .. " stepping VIBRATION moves the level") + eq(model.opts.gold.haptics, + TouchControls.normalizeHaptics(model.opts.gold.haptics), + version .. " VIBRATION stores a level the shared module knows") + eq(model.opts.haptics, flatBuzz, version .. " also without touching Red's") -findRow(gold, "TOUCH CONTROLS").action() -eq(edited, 1, "the editor row reaches the host hook") + edited = 0 + findRow(model, "TOUCH CONTROLS").action() + eq(edited, 1, version .. " the editor row reaches the host hook") +end -- The Gen 1 gear is untouched by the extraction: same three rows, still on -- the flat table. @@ -94,6 +103,8 @@ eq(findRow(red, "TOUCH PAD").value() ~= nil, true, "and reading it back") -- rather than dead, on both sides. eq(has(LauncherSettings.open(nil, "gold"), "TOUCH CONTROLS"), false, "no hook, no editor row on Gold") +eq(has(LauncherSettings.open(nil, "silver"), "TOUCH CONTROLS"), false, + "nor on Silver") eq(has(LauncherSettings.open(nil, "red"), "TOUCH CONTROLS"), false, "nor on Red") -- The Edit row hands the screen to the host, and the host has to know WHICH diff --git a/tests/engine/launcher_scroll_test.lua b/tests/engine/launcher_scroll_test.lua index c74e4cce..0816897c 100644 --- a/tests/engine/launcher_scroll_test.lua +++ b/tests/engine/launcher_scroll_test.lua @@ -155,28 +155,34 @@ modImp.mods = mods modImp._ensureMods = function() return mods end LauncherView.draw(modImp) LauncherView.draw(modImp) -check((modImp._modScrollMax or 0) > 0, - "60 mods overflow the list viewport inside the panel") -local list = modImp._modListRect -check(list.x + list.w - <= modImp._tabRegionRect.x + modImp._tabRegionRect.w - Kit.scrollBarW(), - "the rows stop short of the region's scrollbar gutter") -pointer(list.x + 10, list.y + 10) +local reg = modImp._tabRegionRect +check((modImp._tabScrollMax.mods or 0) > reg.h, + "60 installed mods are ONE continuous list: the region's travel spans " + .. "the whole list, not one page of it") +eq(modImp._pages.mods, nil, "and no page state is ever minted for it") +pointer(reg.x + 10, reg.y + 40) modImp._wheelY = -1 LauncherView.draw(modImp) -check((modImp.modScroll or 0) > 0, "a notch over the mod list scrolls the list") -eq(modImp._tabScroll.mods or 0, 0, "not the panel region around it") -eq(modImp._pageScroll, 0, "and not the page behind that") +check((modImp._tabScroll.mods or 0) > 0, + "a notch over the region scrolls the list like any other tab") +eq(modImp._pageScroll, 0, "without reaching the page behind it") + +modImp._tabScroll.mods = modImp._tabScrollMax.mods +LauncherView.draw(modImp) +pointer(reg.x + 10, reg.y + reg.h * 0.5) +modImp._wheelY = -1 +LauncherView.draw(modImp) +eq(modImp._pages.mods, nil, + "bottoming the list out never auto-advances any pager") +eq(modImp._tabScroll.mods, modImp._tabScrollMax.mods, + "the list just rests at its end") modImp._modActions = "mod1" -local shielded = modImp.modScroll -local shieldedPage = modImp._pageScroll -pointer(list.x + 10, list.y + 10) +local shieldedAt = modImp._tabScroll.mods modImp._wheelY = -1 LauncherView.draw(modImp) -eq(modImp.modScroll, shielded, "a shielded mod list ignores the notch") -eq(modImp._tabScroll.mods or 0, 0, "and so does the region under the scrim") -eq(modImp._pageScroll, shieldedPage, "and the page behind that") +eq(modImp._tabScroll.mods, shieldedAt, + "a shielded mod list ignores the notch under the scrim") modImp._modActions = nil modImp._wheelY = 0 LauncherView.draw(modImp) @@ -225,32 +231,27 @@ dragMods.mods = mods dragMods._ensureMods = function() return mods end LauncherView.draw(dragMods) LauncherView.draw(dragMods) -local dlist = dragMods._modListRect -local dListMax = dragMods._modScrollMax +local dreg = dragMods._tabRegionRect local dRegionMax = dragMods._tabScrollMax.mods -check(dListMax > 0 and dRegionMax > 0, - "the mods tab has both an inner list and a region to scroll") -LauncherView.touchpressed(dragMods, 7, dlist.x + 20, dlist.y + 30) -LauncherView.touchmoved(dragMods, 7, dlist.x + 20, dlist.y + 30 - 60) -eq(dragMods.modScroll, math.min(60, dListMax), - "the first pixels of the drag move the list") -eq(dragMods._tabScroll.mods or 0, 0, "and nothing else") -LauncherView.touchmoved(dragMods, 7, dlist.x + 20, - dlist.y + 30 - 60 - dListMax - dRegionMax * 2) -eq(dragMods.modScroll, dListMax, "carrying on saturates the list") -eq(dragMods._tabScroll.mods, dRegionMax, - "then the same gesture walks the region to its bottom") +check(dRegionMax > 0, "the mods region scrolls its overscan like any tab") +LauncherView.touchpressed(dragMods, 7, dreg.x + 20, dreg.y + 30) +LauncherView.touchmoved(dragMods, 7, dreg.x + 20, dreg.y + 30 - 60) +eq(dragMods._tabScroll.mods, math.min(60, dRegionMax), + "a drag moves the region by the finger's travel") +LauncherView.touchmoved(dragMods, 7, dreg.x + 20, + dreg.y + 30 - 60 - dRegionMax * 2) +eq(dragMods._tabScroll.mods, dRegionMax, "carrying on saturates the region") check((dragMods._pageScroll or 0) > 0, "and only then reaches the page") -LauncherView.touchreleased(dragMods, 7, dlist.x + 20, dlist.y - 900) +LauncherView.touchreleased(dragMods, 7, dreg.x + 20, dreg.y - 900) dragMods._skins = { { id = "s1", source = "user", controls = 8, pages = 1 } } for i = 2, 12 do dragMods._skins[i] = { id = "s" .. i, source = "user", controls = 8, pages = 1 } end dragMods._ensureSkins = function() return dragMods._skins end -dragMods.modScroll = 0 -local heldModScroll = dragMods.modScroll -local overList = dlist.y + 30 +local heldModsPage = dragMods._pages.mods or 1 +local heldModsAt = dragMods._tabScroll.mods +local overList = dreg.y + 60 dragMods:_switchTab("skins") LauncherView.draw(dragMods) LauncherView.draw(dragMods) @@ -260,8 +261,10 @@ LauncherView.touchpressed(dragMods, 9, sreg.x + 20, overList) LauncherView.touchmoved(dragMods, 9, sreg.x + 20, overList - 200) check((dragMods._tabScroll.skins or 0) > 0, "a drag on the skins tab scrolls the skins tab") -eq(dragMods.modScroll, heldModScroll, - "and leaves the mod list where the player parked it") +eq(dragMods._pages.mods or 1, heldModsPage, + "and leaves the mod list on the page the player parked it") +eq(dragMods._tabScroll.mods, heldModsAt, + "with its region offset held for the return trip") LauncherView.touchreleased(dragMods, 9, sreg.x + 20, sreg.y - 400) love.graphics.polygon = love.graphics.polygon or function() end @@ -308,8 +311,8 @@ local view = read("src/import/LauncherView.lua") check(view:find("Kit.scrollBegin(", 1, true) ~= nil, "the panel dispatch opens a scroll region") check(view:find("Kit.scrollEnd(", 1, true) ~= nil, "and closes it") -check(view:find("modListWantsWheel", 1, true) ~= nil, - "the nested mod list is asked before the region takes a notch") +check(view:find("modListWantsWheel", 1, true) == nil, + "no nested list steals the wheel from the region any more") check(view:find("start.region", 1, true) ~= nil, "a touch drag that began in the region scrolls the region") check(view:find("Kit.scrollGutter(", 1, true) ~= nil, diff --git a/tests/engine/mod_targets_tests.lua b/tests/engine/mod_targets_tests.lua index dd1c9a7f..87f8fc93 100644 --- a/tests/engine/mod_targets_tests.lua +++ b/tests/engine/mod_targets_tests.lua @@ -32,11 +32,13 @@ do "a version id names exactly that game") eq(table.concat(ModTargets.expand("GEN1"), ","), "red,blue,yellow", "gen1 is every Gen 1 game, case-insensitive") - eq(table.concat(ModTargets.expand("gen2"), ","), "gold", + eq(table.concat(ModTargets.expand("gen2"), ","), "gold,silver", "gen2 is every Gen 2 game") + eq(table.concat(ModTargets.expand("silver"), ","), "silver", + "and each of them names itself") eq(table.concat(ModTargets.expand("all"), ","), table.concat(GameVersion.ORDER, ","), "all is the launcher order itself") - eq(ModTargets.expand("silver"), nil, "a game this engine has no cache for") + eq(ModTargets.expand("crystal"), nil, "a game this engine has no cache for") eq(ModTargets.expand("gen9"), nil, "a generation with no games is unknown") eq(ModTargets.expand(7), nil, "a non-string token is not a game") end @@ -56,7 +58,7 @@ end do eq(list(mf({})), "red,blue,yellow", "a manifest with no games key is Gen 1, which is what it was tested as") - eq(list(mf({ gen2compat = true })), "red,blue,yellow,gold", + eq(list(mf({ gen2compat = true })), "red,blue,yellow,gold,silver", "gen2compat keeps Gen 1 and adds Gen 2") eq(mf({}).gen2compat, false, "and the derived flag agrees") eq(mf({ gen2compat = true }).gen2compat, true, "both ways") @@ -67,14 +69,14 @@ end do local gen2 = mf({ games = { "gen2" } }) - eq(list(gen2), "gold", "games can name Gen 2 alone") + eq(list(gen2), "gold,silver", "games can name Gen 2 alone") eq(gen2.gen2compat, true, "which IS the gen2compat claim the gate reads") local both = mf({ games = { "gen1", "gen2" } }) - eq(list(both), "red,blue,yellow,gold", "or both generations") + eq(list(both), "red,blue,yellow,gold,silver", "or both generations") local one = mf({ games = { "blue" } }) eq(list(one), "blue", "or one single game") eq(one.gen2compat, false, "a Gen 1 game is not a Gen 2 claim") - eq(list(mf({ games = { "red" }, gen2compat = true })), "red,gold", + eq(list(mf({ games = { "red" }, gen2compat = true })), "red,gold,silver", "an old gen2compat beside a new games list still adds its game") end @@ -224,10 +226,12 @@ do local bad = ModProfile.decode(require("src.core.SaveSerializer").encode({ format = "g1rmodlist", formatVersion = 1, profile = { name = "P", enabledByVersion = { - gold = { a = true }, silver = { a = true }, red = "nope" } }, + gold = { a = true }, silver = { a = true }, crystal = { a = true }, + red = "nope" } }, })) eq(bad.enabledByVersion.gold.a, true, "a shared file's known game is kept") - eq(bad.enabledByVersion.silver, nil, "an unknown game is dropped on read") + eq(bad.enabledByVersion.silver.a, true, "every one of them, not just the first") + eq(bad.enabledByVersion.crystal, nil, "an unknown game is dropped on read") eq(bad.enabledByVersion.red, nil, "and so is a bucket that is not a table") end diff --git a/tests/engine/rom_importer_nx_saves_inbox_test.lua b/tests/engine/rom_importer_nx_saves_inbox_test.lua index 5bdba458..5a22437e 100644 --- a/tests/engine/rom_importer_nx_saves_inbox_test.lua +++ b/tests/engine/rom_importer_nx_saves_inbox_test.lua @@ -59,7 +59,7 @@ package.loaded["src.import.RomImporter"] = nil RomImporter = require("src.import.RomImporter") local function clearSavesInbox() - for _, ver in ipairs({ "red", "blue", "yellow", "gold" }) do + for _, ver in ipairs({ "red", "blue", "yellow", "gold", "silver" }) do local dir = "imports/saves/" .. ver for _, name in ipairs(love.filesystem.getDirectoryItems(dir) or {}) do love.filesystem.remove(dir .. "/" .. name) @@ -137,6 +137,8 @@ check(createdDirs["imports/saves/yellow"] == true, "RES-01: ensureSavesInboxDir creates imports/saves/yellow/") check(createdDirs["imports/saves/gold"] == true, "RES-01: ensureSavesInboxDir creates imports/saves/gold/") +check(createdDirs["imports/saves/silver"] == true, + "RES-01: ensureSavesInboxDir creates imports/saves/silver/") -- NXSAV-02: notice/hint includes save dir + per-game imports/saves// MTP path ri = freshImporter() diff --git a/tests/engine/uwp_baseroms_test.lua b/tests/engine/uwp_baseroms_test.lua index 83f13e11..abe735a3 100644 --- a/tests/engine/uwp_baseroms_test.lua +++ b/tests/engine/uwp_baseroms_test.lua @@ -81,7 +81,8 @@ local function importer(ready) }, RomImporter) end -local allReady = importer({ red = true, blue = true, yellow = true, gold = true }) +local allReady = importer({ red = true, blue = true, yellow = true, gold = true, + silver = true }) allReady:_queueBaseRomScan() eq(allReady.baseRomScan.state, "done", "ready launcher skips discovery") eq(listings, 0, "ready launcher does not enumerate baseroms") @@ -123,7 +124,8 @@ eq(picks, 0, "missing detected ROM does not open the picker unexpectedly") missing:choose("red") eq(picks, 1, "the next import attempt falls back to the native picker") -local rescanned = importer({ red = true, blue = true, yellow = true, gold = true }) +local rescanned = importer({ red = true, blue = true, yellow = true, gold = true, + silver = true }) rescanned.baseRoms.red = { path = "baseroms/z-red.gb", name = "z-red.gb" } rescanned:reimport("red") check(rescanned.baseRoms.red == nil, "re-import clears the detected ROM") diff --git a/tests/gen2_halloffame_test.lua b/tests/gen2_halloffame_test.lua index 720bd4b3..a849d1a5 100644 --- a/tests/gen2_halloffame_test.lua +++ b/tests/gen2_halloffame_test.lua @@ -31,10 +31,14 @@ require("src.core.Logger").warn = function() end local Core = require("src.core.gen2.HallOfFame") local Credits = require("src.ui.gen2.Credits") +local GameVersion = require("src.core.GameVersion") local HallOfFame = require("src.ui.gen2.HallOfFame") local Save = require("src.core.gen2.Save") local Screens = require("src.ui.Screens") +local priorVersion = GameVersion.get() +GameVersion.set("gold") + -- ---- fixtures ------------------------------------------------------------- local POKEMON = { @@ -711,4 +715,6 @@ else eq(creditsData.palettes[1][1][1], 255, "and set 1 colour 0 is white") end +GameVersion.set(priorVersion) + S.finish() diff --git a/tests/gen2_hof_continue_test.lua b/tests/gen2_hof_continue_test.lua index 807e9e87..453eed31 100644 --- a/tests/gen2_hof_continue_test.lua +++ b/tests/gen2_hof_continue_test.lua @@ -76,6 +76,8 @@ local function makeWorld() local game = { data = { audio = {}, screens = registry }, save = { + version = "gold", + generation = 2, player = { name = "GOLD" }, party = { { species = "TYPHLOSION", level = 50, hp = 120, otId = 33333 } }, diff --git a/tests/gen2_save_test.lua b/tests/gen2_save_test.lua index e2b80b2b..6493b63f 100644 --- a/tests/gen2_save_test.lua +++ b/tests/gen2_save_test.lua @@ -28,6 +28,9 @@ love.filesystem = { local GameVersion = require("src.core.GameVersion") local Save = require("src.core.gen2.Save") +local priorVersion = GameVersion.get() +GameVersion.set("gold") + local failures, checks = 0, 0 local function check(name, got, want) checks = checks + 1 @@ -48,6 +51,11 @@ check("main file", main, "save_gold.lua") check("backup file", backup, "save_gold.lua.bak") check("staged file", tmp, "save_gold.lua.tmp") check("gold suffix", GameVersion.saveSuffix("gold"), "_gold") +local sMain, sBackup, sTmp = Save.filenames("silver") +check("silver main file", sMain, "save_silver.lua") +check("silver backup file", sBackup, "save_silver.lua.bak") +check("silver staged file", sTmp, "save_silver.lua.tmp") +check("silver suffix", GameVersion.saveSuffix("silver"), "_silver") -- Red keeps its historical un-suffixed name, so the two can never collide. check("red is unsuffixed", GameVersion.saveSuffix("red"), "") @@ -104,7 +112,13 @@ check("defaults are copied", Save.defaultOptions().textSpeed, "MID") -- A sparse or hand-edited save must come back indexable rather than crashing -- the first screen that reads it. local sparse = Save.normalize({ player = {} }) -check("normalized version", sparse.version, "gold") +check("normalized version", sparse.version, GameVersion.get()) +check("a Gen 2 version already on the table is kept", + Save.normalize({ version = "silver", player = {} }).version, "silver") +check("and a Gen 1 one is replaced by the running edition", + Save.normalize({ version = "red", player = {} }).version, "gold") +check("as is a version this engine does not have", + Save.normalize({ version = "crystal", player = {} }).version, "gold") check("party exists", type(sparse.party), "table") check("inventory exists", type(sparse.inventory), "table") check("pokedex seen exists", type(sparse.pokedex.seen), "table") @@ -478,6 +492,46 @@ do files = {} end +-- ------- the same save, run as Silver +-- +-- The blank name is the edition's own first PlayerNameArray row +-- (data/player_names.asm:12-23). +do + GameVersion.set("silver") + files = {} + + local born = Save.newGame({}) + check("a silver boot stamps silver", born.version, "silver") + check("still generation 2", born.generation, 2) + check("with the edition's own preset name", born.player.name, "SILVER") + check("gold's preset is unchanged", Save.defaultPlayerName("gold"), "GOLD") + check("and silver's is its own", Save.defaultPlayerName("silver"), "SILVER") + check("the running edition answers with no argument", + Save.defaultPlayerName(), "SILVER") + + check("a version-less save takes the running edition", + Save.normalize({ player = {} }).version, "silver") + check("and a gold save keeps gold on a silver boot", + Save.normalize({ version = "gold", player = {} }).version, "gold") + + check("no silver save yet", Save.exists("silver"), false) + check("silver save wrote", Save.save(born), true) + check("silver save exists now", Save.exists("silver"), true) + check("gold is untouched by it", Save.exists("gold"), false) + + local main = Save.filenames("silver") + check("the silver file is silver's own", main, "saves/silver/slot1.lua") + check("and it is the file on disk", files[main] ~= nil, true) + local back = Save.load("silver") + check("silver round-trips", back and back.player.name, "SILVER") + check("keeping its stamp", back.version, "silver") + + files = {} + GameVersion.set("gold") +end + +GameVersion.set(priorVersion) + print(("gen2 save: %d checks, %d failures"):format(checks, failures)) -- Raise rather than os.exit: tests/run_tests.lua dofiles this file, so an -- exit here takes the whole tier down with it and silently skips every diff --git a/tests/save_editor_gen2_tests.lua b/tests/save_editor_gen2_tests.lua index db9474d8..b1877437 100644 --- a/tests/save_editor_gen2_tests.lua +++ b/tests/save_editor_gen2_tests.lua @@ -71,13 +71,17 @@ local data = { maps = {}, } -local function newState() +local function newState(version) + version = version or "gold" + local prior = GameVersion.get() + GameVersion.set(version) local S = State.new() S.data = data S.cat = Catalog.build(data) S.save = Save2.newGame() - S.version = "gold" + S.version = version Gen.ensureBoxes(S.save) + GameVersion.set(prior) return S end @@ -85,10 +89,19 @@ do GameVersion.set("gold") eq(Gen.of({ generation = 2 }), 2, "Gen.of generation field") eq(Gen.of({ version = "gold" }), 2, "Gen.of version gold") + eq(Gen.of({ version = "silver" }), 2, "Gen.of version silver") eq(Gen.of(SaveData.newGame()), 1, "Gen.of gen1 newGame") eq(Gen.of(Save2.newGame()), 2, "Gen.of gold newGame") end +do + GameVersion.set("silver") + eq(Save2.newGame().version, "silver", "a silver boot stamps silver") + eq(Save2.newGame().player.name, "SILVER", "with silver's preset name") + eq(Gen.of(Save2.newGame()), 2, "Gen.of silver newGame") + GameVersion.set("gold") +end + do local S = newState() check(Ops.speciesUsable(S, "CYNDAQUIL"), "spa/spd species is usable") @@ -103,36 +116,37 @@ do check(not Ops.speciesUsable(S1, "BROKEN"), "partial record is not usable") end -do - local S = newState() +for _, version in ipairs({ "gold", "silver" }) do + local S = newState(version) Ops.partyAdd(S) - eq(#S.save.party, 1, "partyAdd on gold") + eq(#S.save.party, 1, "partyAdd on " .. version) local mon = S.save.party[1] - eq(mon.species, "CYNDAQUIL", "first catalog species") - check(mon.experience ~= nil, "gold mon has experience") - check(mon.exp == nil or mon.experience ~= nil, "does not rely on gen1 exp") + eq(mon.species, "CYNDAQUIL", version .. " first catalog species") + check(mon.experience ~= nil, version .. " mon has experience") + check(mon.exp == nil or mon.experience ~= nil, + version .. " does not rely on gen1 exp") check(mon.stats.specialAttack and mon.stats.specialDefense, - "gold stats have spa/spd") - check(mon.happiness ~= nil, "gold mon has happiness") - eq(mon.ot, S.save.player.name, "stampOT copies player name") + version .. " stats have spa/spd") + check(mon.happiness ~= nil, version .. " mon has happiness") + eq(mon.ot, S.save.player.name, version .. " stampOT copies player name") Ops.setLevel(S, mon, 20) - eq(mon.level, 20, "setLevel 20") - check(mon.experience > 0, "experience resynced") + eq(mon.level, 20, version .. " setLevel 20") + check(mon.experience > 0, version .. " experience resynced") Ops.setHappiness(S, mon, 200) - eq(mon.happiness, 200, "happiness 200") + eq(mon.happiness, 200, version .. " happiness 200") Ops.setPokerus(S, mon, 15) - eq(mon.pokerus, 15, "pokerus byte") + eq(mon.pokerus, 15, version .. " pokerus byte") Ops.setHeldItem(S, mon, "POTION") - eq(mon.item, "POTION", "held item") + eq(mon.item, "POTION", version .. " held item") - eq(mon.name, "CYNDAQUIL", "new mon copies species display name") + eq(mon.name, "CYNDAQUIL", version .. " new mon copies species display name") Ops.setSpecies(S, mon, "TOTODILE") - eq(mon.species, "TOTODILE", "setSpecies id") - eq(mon.name, "TOTODILE", "setSpecies rewrites the Gold display name") - check(mon.nickname == nil, "setSpecies does not invent a nickname") - eq(mon.types[1], "WATER", "setSpecies rewrites copied types") + eq(mon.species, "TOTODILE", version .. " setSpecies id") + eq(mon.name, "TOTODILE", version .. " setSpecies rewrites the display name") + check(mon.nickname == nil, version .. " setSpecies does not invent a nickname") + eq(mon.types[1], "WATER", version .. " setSpecies rewrites copied types") end do diff --git a/tests/save_editor_mod_tests.lua b/tests/save_editor_mod_tests.lua index 9ba1d482..1fac297f 100644 --- a/tests/save_editor_mod_tests.lua +++ b/tests/save_editor_mod_tests.lua @@ -149,12 +149,22 @@ local ok, err = pcall(function() local Ops = require("Ops") check(not ModTargets.supports({}, "gold"), "legacy gen1-only fixture does not support gold") + check(not ModTargets.supports({}, "silver"), + "nor silver") check(not ModTargets.supports({ games = { "red" } }, "gold"), "explicit gen1 games list does not support gold") + check(not ModTargets.supports({ games = { "red" } }, "silver"), + "nor silver") check(ModTargets.supports({ games = { "gold" } }, "gold"), "gold-targeted manifest supports gold") + check(not ModTargets.supports({ games = { "gold" } }, "silver"), + "and names one edition, not the generation") + check(ModTargets.supports({ games = { "gold", "silver" } }, "silver"), + "a whole-Gen-2 games list supports silver") check(ModTargets.supports({ gen2compat = true }, "gold"), "gen2compat legacy still supports gold") + check(ModTargets.supports({ gen2compat = true }, "silver"), + "and silver with it") local goldS = { data = { diff --git a/tools/generate_android_icons.py b/tools/generate_android_icons.py index 9cf412c8..43db6e53 100644 --- a/tools/generate_android_icons.py +++ b/tools/generate_android_icons.py @@ -25,6 +25,7 @@ SHELL_COLORS = { "blue": {"main": (35, 125, 235), "dark": (20, 85, 175), "light": (80, 165, 255)}, "yellow": {"main": (255, 205, 10), "dark": (210, 160, 0), "light": (255, 230, 80)}, "gold": {"main": (225, 170, 40), "dark": (170, 120, 20), "light": (245, 200, 80)}, + "silver": {"main": (185, 190, 200), "dark": (130, 135, 145), "light": (225, 230, 240)}, } def extract_cleaned_love_emblem(): @@ -186,7 +187,7 @@ def main(): fg = create_adaptive_foreground(sizes["adaptive"]) fg.save(os.path.join(drawable_dir, "ic_launcher_foreground.png"), "PNG") - for ver in ("red", "blue", "yellow", "gold"): + for ver in ("red", "blue", "yellow", "gold", "silver"): cart = render_3d_cartridge(ver, sizes["shortcut"]) cart.save(os.path.join(drawable_dir, f"ic_shortcut_{ver}.png"), "PNG") diff --git a/tools/make_silver_manifest.py b/tools/make_silver_manifest.py new file mode 100644 index 00000000..9b9c70f1 --- /dev/null +++ b/tools/make_silver_manifest.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +"""Derive the Pokemon Silver import manifest from the shipped Gold manifest. + +Gold and Silver are assembled from one pokegold source tree; every constant +block, charmap entry, map id, and symbol NAME is identical between the two +builds, and the edition differences (wild encounter tables, the alternate +front pics in gfx/pics_silver.asm, the title screen art, preset player +names, a handful of map texts) are all ROM data that the importer decodes +from the Silver cart at import time. So rather than re-parsing pokegold +from scratch like tools/make_gold_manifest.py does, this takes the shipped +Gold manifest verbatim and overrides only what genuinely differs: + + * romSha1 -- Silver's ROM hash (pret/pokegold's byte-exact build). + * symbols -- every symbol re-resolved from pokesilver.sym, because the + edition-selected data blocks have different sizes and shift + their neighbours (e.g. the compressed front pics). + +Usage: python3 tools/make_silver_manifest.py +Default paths: Gold manifest beside this script; symbols at +/Users/bryanbassett/Documents/development/pokegold-symbols/pokesilver.sym +(a pokegold checkout's own `make silver` build emits an identical one). +""" + +from __future__ import annotations + +import argparse +import copy +import json +import os +import sys + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +from rom_data import CANONICAL_SILVER_SHA1, SymbolTable # noqa: E402 + +DEV = "/Users/bryanbassett/Documents/development" +DEFAULT_GOLD = os.path.join(os.path.dirname(__file__), "rom_manifest_gold.json") +DEFAULT_OUT = os.path.join( + os.path.dirname(__file__), "rom_manifest_silver.json") +DEFAULT_SYMBOLS = os.path.join(DEV, "pokegold-symbols/pokesilver.sym") + + +def derive(gold, symbols_path): + """Return the Silver manifest derived from the Gold manifest dict.""" + silver = copy.deepcopy(gold) + silver["romSha1"] = CANONICAL_SILVER_SHA1 + + silver_symbols = SymbolTable(symbols_path) + resolved, missing = {}, [] + for name in gold["symbols"]: + symbol = silver_symbols.by_name.get(name) + if symbol is None: + missing.append(name) + continue + resolved[name] = [symbol.bank, symbol.address] + if missing: + raise SystemExit( + "pokesilver.sym is missing symbols the manifest needs: " + + ", ".join(sorted(missing)[:10]) + + (" ..." if len(missing) > 10 else "")) + silver["symbols"] = resolved + + # Sanity: the edition pic banks must actually have moved something. If + # every address matches Gold's, the --symbols file is almost certainly + # pokegold.sym, and the import would decode Gold data out of a Silver ROM. + if all(resolved[n] == gold["symbols"][n] for n in resolved): + raise SystemExit( + f"{symbols_path} resolves every symbol to Gold's address; " + "is it really pokesilver.sym?") + + return silver + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--gold", default=DEFAULT_GOLD, + help="shipped Gold manifest to derive from") + parser.add_argument("--symbols", default=DEFAULT_SYMBOLS, + help="pokesilver.sym symbol file") + parser.add_argument("--out", default=DEFAULT_OUT) + args = parser.parse_args() + + with open(args.gold, encoding="utf-8") as f: + gold = json.load(f) + + silver = derive(gold, os.path.abspath(args.symbols)) + with open(args.out, "w", encoding="utf-8", newline="\n") as f: + json.dump(silver, f, ensure_ascii=False, indent=2, sort_keys=True) + f.write("\n") + print(f"wrote {args.out}") + + +if __name__ == "__main__": + main() diff --git a/tools/modkit.py b/tools/modkit.py index 64b212d5..1fb6ac97 100644 --- a/tools/modkit.py +++ b/tools/modkit.py @@ -741,7 +741,7 @@ def imported_data_dir(repo): return path if _generated_data_dir_ok(path) else None version = (os.environ.get("POKEPORT_VERSION") or "red").lower() - if version not in ("red", "blue", "yellow"): + if version not in ("red", "blue", "yellow", "gold", "silver"): version = "red" candidates = [ @@ -2393,7 +2393,8 @@ UPVALUE_CALL = re.compile( UPVALUE_ARGS = re.compile( r"""^\s*([A-Za-z_]\w*)\s*\.\s*(\w+)\s*,\s*["'](\w+)["']""") VERSION_MATCH = re.compile( - r"""[=~]=\s*["'](red|blue|yellow)["']|["'](red|blue|yellow)["']\s*[=~]=""") + r"""[=~]=\s*["'](red|blue|yellow|gold|silver)["']""" + r"""|["'](red|blue|yellow|gold|silver)["']\s*[=~]=""") def _line_of(body, offset): diff --git a/tools/rom_data.py b/tools/rom_data.py index c889723a..2e9375d5 100644 --- a/tools/rom_data.py +++ b/tools/rom_data.py @@ -11,8 +11,9 @@ from dataclasses import dataclass CANONICAL_RED_SHA1 = "ea9bcae617fdf159b045185467ae58b2e4a48b9a" CANONICAL_BLUE_SHA1 = "d7037c83e1ae5b39bde3c30787637ba1d4c48ce2" CANONICAL_YELLOW_SHA1 = "cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1" -# Gold is Gen 2: a 2 MiB cart, twice the size of the Gen 1 ROMs above. +# Gold and Silver are Gen 2: 2 MiB carts, twice the size of the Gen 1 ROMs above. CANONICAL_GOLD_SHA1 = "d8b8a3600a465308c9953dfa04f0081c05bdcb94" +CANONICAL_SILVER_SHA1 = "49b163f7e57702bc939d642a18f591de55d92dae" ROM_BANK_SIZE = 0x4000 diff --git a/tools/rom_manifest_silver.json b/tools/rom_manifest_silver.json new file mode 100644 index 00000000..2992385f --- /dev/null +++ b/tools/rom_manifest_silver.json @@ -0,0 +1,17702 @@ +{ + "charmap": { + "0": "", + "10": "ザ", + "100": "", + "101": "", + "102": "", + "103": "", + "104": "", + "105": "", + "106": "", + "107": "", + "108": "", + "109": "", + "11": "ジ", + "110": "ぃ", + "111": "ぅ", + "112": "", + "113": "", + "114": "“", + "115": "”", + "116": "·", + "117": "…", + "118": "ぁ", + "119": "ぇ", + "12": "ズ", + "120": "ぉ", + "121": "┌", + "122": "─", + "123": "┐", + "124": "│", + "125": "└", + "126": "┘", + "127": " ", + "128": "A", + "129": "B", + "13": "ゼ", + "130": "C", + "131": "D", + "132": "E", + "133": "F", + "134": "G", + "135": "H", + "136": "I", + "137": "J", + "138": "K", + "139": "L", + "14": "ゾ", + "140": "M", + "141": "N", + "142": "O", + "143": "P", + "144": "Q", + "145": "R", + "146": "S", + "147": "T", + "148": "U", + "149": "V", + "15": "ダ", + "150": "W", + "151": "X", + "152": "Y", + "153": "Z", + "154": "(", + "155": ")", + "156": ":", + "157": ";", + "158": "[", + "159": "]", + "16": "ヂ", + "160": "a", + "161": "b", + "162": "c", + "163": "d", + "164": "e", + "165": "f", + "166": "g", + "167": "h", + "168": "i", + "169": "j", + "17": "ヅ", + "170": "k", + "171": "l", + "172": "m", + "173": "n", + "174": "o", + "175": "p", + "176": "q", + "177": "r", + "178": "s", + "179": "t", + "18": "デ", + "180": "u", + "181": "v", + "182": "w", + "183": "x", + "184": "y", + "185": "z", + "186": "こ", + "187": "さ", + "188": "し", + "189": "す", + "19": "ド", + "190": "せ", + "191": "そ", + "192": "Ä", + "193": "Ö", + "194": "Ü", + "195": "ä", + "196": "ö", + "197": "ü", + "198": "に", + "199": "ぬ", + "20": "", + "200": "ね", + "201": "の", + "202": "は", + "203": "ひ", + "204": "ふ", + "205": "へ", + "206": "ほ", + "207": "ま", + "208": "'d", + "209": "'l", + "210": "'m", + "211": "'r", + "212": "'s", + "213": "'t", + "214": "'v", + "215": "ら", + "216": "り", + "217": "る", + "218": "れ", + "219": "ろ", + "22": "", + "220": "わ", + "221": "を", + "222": "ん", + "223": "←", + "224": "'", + "225": "", + "226": "", + "227": "-", + "228": "゚", + "229": "゙", + "230": "?", + "231": "!", + "232": ".", + "233": "&", + "234": "é", + "235": "→", + "236": "▷", + "237": "▶", + "238": "▼", + "239": "♂", + "24": "", + "240": "¥", + "241": "×", + "242": ".", + "243": "/", + "244": ",", + "245": "♀", + "246": "0", + "247": "1", + "248": "2", + "249": "3", + "25": "バ", + "250": "4", + "251": "5", + "252": "6", + "253": "7", + "254": "8", + "255": "9", + "26": "ビ", + "27": "ブ", + "28": "ボ", + "29": "", + "30": "", + "31": "", + "34": "", + "35": "", + "36": "", + "37": "", + "38": "が", + "39": "ぎ", + "40": "ぐ", + "41": "げ", + "42": "ご", + "43": "ざ", + "44": "じ", + "45": "ず", + "46": "ぜ", + "47": "ぞ", + "48": "だ", + "49": "ぢ", + "5": "ガ", + "50": "づ", + "51": "で", + "52": "ど", + "53": "", + "54": "", + "55": "", + "56": "", + "57": "", + "58": "ば", + "59": "び", + "6": "ギ", + "60": "ぶ", + "61": "べ", + "62": "ぼ", + "63": "", + "64": "パ", + "65": "ピ", + "66": "プ", + "67": "ポ", + "68": "ぱ", + "69": "ぴ", + "7": "グ", + "70": "ぷ", + "71": "ぺ", + "72": "ぽ", + "73": "", + "74": "", + "75": "<_CONT>", + "76": "", + "78": "", + "79": "", + "8": "ゲ", + "80": "@", + "81": "", + "82": "", + "83": "", + "84": "POKé", + "85": "", + "86": "<……>", + "87": "", + "88": "", + "89": "", + "9": "ゴ", + "90": "", + "91": "", + "92": "", + "93": "", + "94": "", + "95": "", + "96": "", + "97": "", + "98": "", + "99": "" + }, + "constants": { + "battleAnimBgPaletteOrder": [ + "PAL_BATTLE_BG_PLAYER", + "PAL_BATTLE_BG_ENEMY", + "PAL_BATTLE_BG_ENEMY_HP", + "PAL_BATTLE_BG_PLAYER_HP", + "PAL_BATTLE_BG_EXP", + "PAL_BATTLE_BG_5", + "PAL_BATTLE_BG_6", + "PAL_BATTLE_BG_TEXT" + ], + "battleAnimFramesetOrder": [ + "BATTLE_ANIM_FRAMESET_HIT_BIG", + "BATTLE_ANIM_FRAMESET_HIT", + "BATTLE_ANIM_FRAMESET_HIT_SMALL", + "BATTLE_ANIM_FRAMESET_PUNCH", + "BATTLE_ANIM_FRAMESET_KICK", + "BATTLE_ANIM_FRAMESET_PALM", + "BATTLE_ANIM_FRAMESET_FANG", + "BATTLE_ANIM_FRAMESET_PUNCH_SHAKE", + "BATTLE_ANIM_FRAMESET_BALL_POOF", + "BATTLE_ANIM_FRAMESET_POKE_BALL_1", + "BATTLE_ANIM_FRAMESET_POKE_BALL_2", + "BATTLE_ANIM_FRAMESET_POKE_BALL_3", + "BATTLE_ANIM_FRAMESET_POKE_BALL_4", + "BATTLE_ANIM_FRAMESET_POKE_BALL_5", + "BATTLE_ANIM_FRAMESET_DRAGON_RAGE", + "BATTLE_ANIM_FRAMESET_FLAMETHROWER", + "BATTLE_ANIM_FRAMESET_EMBER", + "BATTLE_ANIM_FRAMESET_BURNED", + "BATTLE_ANIM_FRAMESET_BLIZZARD", + "BATTLE_ANIM_FRAMESET_ICE", + "BATTLE_ANIM_FRAMESET_ICE_BEAM", + "BATTLE_ANIM_FRAMESET_POWDER_SNOW", + "BATTLE_ANIM_FRAMESET_RAZOR_LEAF_1", + "BATTLE_ANIM_FRAMESET_RAZOR_LEAF_2", + "BATTLE_ANIM_FRAMESET_EXPLOSION", + "BATTLE_ANIM_FRAMESET_BIG_ROCK", + "BATTLE_ANIM_FRAMESET_SMALL_ROCK", + "BATTLE_ANIM_FRAMESET_STRENGTH", + "BATTLE_ANIM_FRAMESET_SKULL_CROSSBONE", + "BATTLE_ANIM_FRAMESET_ACID", + "BATTLE_ANIM_FRAMESET_POISON_DROPLET_UNUSED", + "BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE", + "BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE_BURST", + "BATTLE_ANIM_FRAMESET_SMALL_BUBBLE", + "BATTLE_ANIM_FRAMESET_PULSING_BUBBLE", + "BATTLE_ANIM_FRAMESET_SURF", + "BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1", + "BATTLE_ANIM_FRAMESET_MUSIC_NOTE_2", + "BATTLE_ANIM_FRAMESET_MUSIC_NOTE_3", + "BATTLE_ANIM_FRAMESET_WATER_GUN_1", + "BATTLE_ANIM_FRAMESET_WATER_GUN_2", + "BATTLE_ANIM_FRAMESET_WATER_GUN_3", + "BATTLE_ANIM_FRAMESET_HYDRO_PUMP", + "BATTLE_ANIM_FRAMESET_POWDER", + "BATTLE_ANIM_FRAMESET_BEAM", + "BATTLE_ANIM_FRAMESET_BEAM_TIP", + "BATTLE_ANIM_FRAMESET_ICE_BUILDUP", + "BATTLE_ANIM_FRAMESET_FROZEN", + "BATTLE_ANIM_FRAMESET_CIRCLING_SPARKLE", + "BATTLE_ANIM_FRAMESET_THUNDER_CENTER", + "BATTLE_ANIM_FRAMESET_THUNDER_LEFT", + "BATTLE_ANIM_FRAMESET_THUNDER_RIGHT", + "BATTLE_ANIM_FRAMESET_THUNDER_WAVE_DISABLE", + "BATTLE_ANIM_FRAMESET_THUNDER_WAVE_EXTRA", + "BATTLE_ANIM_FRAMESET_THUNDERBOLT_SPARKS", + "BATTLE_ANIM_FRAMESET_THUNDERBOLT_CORE", + "BATTLE_ANIM_FRAMESET_THUNDERSHOCK_SPARKS", + "BATTLE_ANIM_FRAMESET_THUNDERSHOCK_CORE", + "BATTLE_ANIM_FRAMESET_CLAMP", + "BATTLE_ANIM_FRAMESET_CLAMP_FLIPPED", + "BATTLE_ANIM_FRAMESET_BITE_1", + "BATTLE_ANIM_FRAMESET_BITE_2", + "BATTLE_ANIM_FRAMESET_CUT_DOWN_LEFT", + "BATTLE_ANIM_FRAMESET_CUT_DOWN_RIGHT", + "BATTLE_ANIM_FRAMESET_CUT_UP_RIGHT", + "BATTLE_ANIM_FRAMESET_CUT_LONG_DOWN_LEFT", + "BATTLE_ANIM_FRAMESET_CUT_LONG_DOWN_RIGHT", + "BATTLE_ANIM_FRAMESET_CHARGE_ORB_1", + "BATTLE_ANIM_FRAMESET_ABSORB_CENTER", + "BATTLE_ANIM_FRAMESET_GUST", + "BATTLE_ANIM_FRAMESET_VINE_WHIP_1", + "BATTLE_ANIM_FRAMESET_VINE_WHIP_2", + "BATTLE_ANIM_FRAMESET_RAZOR_WIND_1", + "BATTLE_ANIM_FRAMESET_RAZOR_WIND_2", + "BATTLE_ANIM_FRAMESET_SONICBOOM_JP", + "BATTLE_ANIM_FRAMESET_WARP", + "BATTLE_ANIM_FRAMESET_CHARGE_ORB_2", + "BATTLE_ANIM_FRAMESET_EGG", + "BATTLE_ANIM_FRAMESET_EGG_WOBBLE", + "BATTLE_ANIM_FRAMESET_EGG_CRACKED_TOP", + "BATTLE_ANIM_FRAMESET_EGG_CRACKED_BOTTOM", + "BATTLE_ANIM_FRAMESET_FOCUS", + "BATTLE_ANIM_FRAMESET_BIND_1", + "BATTLE_ANIM_FRAMESET_BIND_2", + "BATTLE_ANIM_FRAMESET_BIND_3", + "BATTLE_ANIM_FRAMESET_BIND_4", + "BATTLE_ANIM_FRAMESET_LEECH_SEED_1", + "BATTLE_ANIM_FRAMESET_LEECH_SEED_2", + "BATTLE_ANIM_FRAMESET_LEECH_SEED_3", + "BATTLE_ANIM_FRAMESET_SOUND_1", + "BATTLE_ANIM_FRAMESET_SOUND_2", + "BATTLE_ANIM_FRAMESET_SOUND_3", + "BATTLE_ANIM_FRAMESET_WAVE", + "BATTLE_ANIM_FRAMESET_CONFUSE_RAY_1", + "BATTLE_ANIM_FRAMESET_CONFUSE_RAY_2", + "BATTLE_ANIM_FRAMESET_LEER", + "BATTLE_ANIM_FRAMESET_REFLECT", + "BATTLE_ANIM_FRAMESET_CHICK_1", + "BATTLE_ANIM_FRAMESET_CHICK_2", + "BATTLE_ANIM_FRAMESET_AMNESIA_1", + "BATTLE_ANIM_FRAMESET_AMNESIA_2", + "BATTLE_ANIM_FRAMESET_AMNESIA_3", + "BATTLE_ANIM_FRAMESET_ASLEEP", + "BATTLE_ANIM_FRAMESET_DIG_SAND", + "BATTLE_ANIM_FRAMESET_DIG_PILE", + "BATTLE_ANIM_FRAMESET_SAND", + "BATTLE_ANIM_FRAMESET_STRING_SHOT_1", + "BATTLE_ANIM_FRAMESET_STRING_SHOT_2", + "BATTLE_ANIM_FRAMESET_STRING_SHOT_3", + "BATTLE_ANIM_FRAMESET_PARALYZED", + "BATTLE_ANIM_FRAMESET_PARALYZED_FLIPPED", + "BATTLE_ANIM_FRAMESET_HAZE", + "BATTLE_ANIM_FRAMESET_MIST", + "BATTLE_ANIM_FRAMESET_HORN", + "BATTLE_ANIM_FRAMESET_NEEDLE", + "BATTLE_ANIM_FRAMESET_FLOWER", + "BATTLE_ANIM_FRAMESET_BARRAGE_BALL", + "BATTLE_ANIM_FRAMESET_PAY_DAY", + "BATTLE_ANIM_FRAMESET_HEART", + "BATTLE_ANIM_FRAMESET_SPINNING_BONE", + "BATTLE_ANIM_FRAMESET_STAR", + "BATTLE_ANIM_FRAMESET_SPOON", + "BATTLE_ANIM_FRAMESET_SPARKLE", + "BATTLE_ANIM_FRAMESET_SKY_ATTACK", + "BATTLE_ANIM_FRAMESET_LICK", + "BATTLE_ANIM_FRAMESET_WITHDRAW_SHELL", + "BATTLE_ANIM_FRAMESET_SHRINKING_CHARGE_ORB", + "BATTLE_ANIM_FRAMESET_CONVERSION", + "BATTLE_ANIM_FRAMESET_SWORD", + "BATTLE_ANIM_FRAMESET_SPEED_LINE_1", + "BATTLE_ANIM_FRAMESET_SPEED_LINE_2", + "BATTLE_ANIM_FRAMESET_SPEED_LINE_3", + "BATTLE_ANIM_FRAMESET_SEISMIC_TOSS", + "BATTLE_ANIM_FRAMESET_SHARPEN", + "BATTLE_ANIM_FRAMESET_DEFENSE_CURL", + "BATTLE_ANIM_FRAMESET_METRONOME_HAND", + "BATTLE_ANIM_FRAMESET_AGILITY", + "BATTLE_ANIM_FRAMESET_COTTON", + "BATTLE_ANIM_FRAMESET_MILK_BOTTLE", + "BATTLE_ANIM_FRAMESET_SPIKE", + "BATTLE_ANIM_FRAMESET_ANGER_VEIN", + "BATTLE_ANIM_FRAMESET_HEAL_BELL", + "BATTLE_ANIM_FRAMESET_BATON_PASS", + "BATTLE_ANIM_FRAMESET_LOCK_ON_1", + "BATTLE_ANIM_FRAMESET_LOCK_ON_2", + "BATTLE_ANIM_FRAMESET_LOCK_ON_3", + "BATTLE_ANIM_FRAMESET_LOCK_ON_4", + "BATTLE_ANIM_FRAMESET_MIND_READER_1", + "BATTLE_ANIM_FRAMESET_MIND_READER_2", + "BATTLE_ANIM_FRAMESET_MIND_READER_3", + "BATTLE_ANIM_FRAMESET_MIND_READER_4", + "BATTLE_ANIM_FRAMESET_SAFEGUARD", + "BATTLE_ANIM_FRAMESET_MEGAPHONE_UNUSED", + "BATTLE_ANIM_FRAMESET_ITEM_BAG", + "BATTLE_ANIM_FRAMESET_SPIDER_WEB", + "BATTLE_ANIM_FRAMESET_UNUSED_CAKE", + "BATTLE_ANIM_FRAMESET_IMP", + "BATTLE_ANIM_FRAMESET_IMP_FLIPPED", + "BATTLE_ANIM_FRAMESET_CHERUB", + "BATTLE_ANIM_FRAMESET_PENCIL", + "BATTLE_ANIM_FRAMESET_ENCORE_HAND", + "BATTLE_ANIM_FRAMESET_ENCORE_HAND_FLIPPED", + "BATTLE_ANIM_FRAMESET_DESTINY_BOND", + "BATTLE_ANIM_FRAMESET_MORNING_SUN", + "BATTLE_ANIM_FRAMESET_GLIMMER", + "BATTLE_ANIM_FRAMESET_MOONLIGHT", + "BATTLE_ANIM_FRAMESET_CROSS_CHOP_1", + "BATTLE_ANIM_FRAMESET_CROSS_CHOP_2", + "BATTLE_ANIM_FRAMESET_ZAP_CANNON", + "BATTLE_ANIM_FRAMESET_CURSE_NAIL", + "BATTLE_ANIM_FRAMESET_FORESIGHT_SHINE", + "BATTLE_ANIM_FRAMESET_RAPID_SPIN", + "BATTLE_ANIM_FRAMESET_SWAGGER", + "BATTLE_ANIM_FRAMESET_MEAN_LOOK", + "BATTLE_ANIM_FRAMESET_UPSIDE_DOWN_PUNCH", + "BATTLE_ANIM_FRAMESET_GROWING_SPARKLE", + "BATTLE_ANIM_FRAMESET_RAIN", + "BATTLE_ANIM_FRAMESET_PSYCH_UP", + "BATTLE_ANIM_FRAMESET_SPIRAL_UNUSED", + "BATTLE_ANIM_FRAMESET_AEROBLAST", + "BATTLE_ANIM_FRAMESET_SANDSTORM", + "BATTLE_ANIM_FRAMESET_ENEMYFEET_1ROW", + "BATTLE_ANIM_FRAMESET_PLAYERHEAD_1ROW", + "BATTLE_ANIM_FRAMESET_ENEMYFEET_2ROW", + "BATTLE_ANIM_FRAMESET_PLAYERHEAD_2ROW" + ], + "battleAnimFuncOrder": [ + "BATTLE_ANIM_FUNC_NULL", + "BATTLE_ANIM_FUNC_USER_TO_TARGET", + "BATTLE_ANIM_FUNC_USER_TO_TARGET_DISAPPEAR", + "BATTLE_ANIM_FUNC_MOVE_IN_CIRCLE", + "BATTLE_ANIM_FUNC_WAVE_TO_TARGET", + "BATTLE_ANIM_FUNC_THROW_TO_TARGET", + "BATTLE_ANIM_FUNC_THROW_TO_TARGET_DISAPPEAR", + "BATTLE_ANIM_FUNC_DROP", + "BATTLE_ANIM_FUNC_USER_TO_TARGET_SPIN", + "BATTLE_ANIM_FUNC_SHAKE", + "BATTLE_ANIM_FUNC_FIRE_BLAST", + "BATTLE_ANIM_FUNC_RAZOR_LEAF", + "BATTLE_ANIM_FUNC_BUBBLE", + "BATTLE_ANIM_FUNC_SURF", + "BATTLE_ANIM_FUNC_SING", + "BATTLE_ANIM_FUNC_WATER_GUN", + "BATTLE_ANIM_FUNC_EMBER", + "BATTLE_ANIM_FUNC_POWDER", + "BATTLE_ANIM_FUNC_POKEBALL", + "BATTLE_ANIM_FUNC_POKEBALL_BLOCKED", + "BATTLE_ANIM_FUNC_RECOVER", + "BATTLE_ANIM_FUNC_THUNDER_WAVE", + "BATTLE_ANIM_FUNC_CLAMP_ENCORE", + "BATTLE_ANIM_FUNC_BITE", + "BATTLE_ANIM_FUNC_SOLAR_BEAM", + "BATTLE_ANIM_FUNC_GUST", + "BATTLE_ANIM_FUNC_RAZOR_WIND", + "BATTLE_ANIM_FUNC_KICK", + "BATTLE_ANIM_FUNC_ABSORB", + "BATTLE_ANIM_FUNC_EGG", + "BATTLE_ANIM_FUNC_MOVE_UP", + "BATTLE_ANIM_FUNC_WRAP", + "BATTLE_ANIM_FUNC_LEECH_SEED", + "BATTLE_ANIM_FUNC_SOUND", + "BATTLE_ANIM_FUNC_CONFUSE_RAY", + "BATTLE_ANIM_FUNC_DIZZY", + "BATTLE_ANIM_FUNC_AMNESIA", + "BATTLE_ANIM_FUNC_FLOAT_UP", + "BATTLE_ANIM_FUNC_DIG", + "BATTLE_ANIM_FUNC_STRING", + "BATTLE_ANIM_FUNC_PARALYZED", + "BATTLE_ANIM_FUNC_SPIRAL_DESCENT", + "BATTLE_ANIM_FUNC_POISON_GAS", + "BATTLE_ANIM_FUNC_HORN", + "BATTLE_ANIM_FUNC_NEEDLE", + "BATTLE_ANIM_FUNC_PETAL_DANCE", + "BATTLE_ANIM_FUNC_THIEF_PAYDAY", + "BATTLE_ANIM_FUNC_ABSORB_CIRCLE", + "BATTLE_ANIM_FUNC_BONEMERANG", + "BATTLE_ANIM_FUNC_SHINY", + "BATTLE_ANIM_FUNC_SKY_ATTACK", + "BATTLE_ANIM_FUNC_GROWTH_SWORDS_DANCE", + "BATTLE_ANIM_FUNC_SMOKE_FLAME_WHEEL", + "BATTLE_ANIM_FUNC_PRESENT_SMOKESCREEN", + "BATTLE_ANIM_FUNC_STRENGTH_SEISMIC_TOSS", + "BATTLE_ANIM_FUNC_SPEED_LINE", + "BATTLE_ANIM_FUNC_SLUDGE", + "BATTLE_ANIM_FUNC_METRONOME_HAND", + "BATTLE_ANIM_FUNC_METRONOME_SPARKLE_SKETCH", + "BATTLE_ANIM_FUNC_AGILITY", + "BATTLE_ANIM_FUNC_SACRED_FIRE", + "BATTLE_ANIM_FUNC_SAFEGUARD_PROTECT", + "BATTLE_ANIM_FUNC_LOCK_ON_MIND_READER", + "BATTLE_ANIM_FUNC_SPIKES", + "BATTLE_ANIM_FUNC_HEAL_BELL_NOTES", + "BATTLE_ANIM_FUNC_BATON_PASS", + "BATTLE_ANIM_FUNC_CONVERSION", + "BATTLE_ANIM_FUNC_ENCORE_BELLY_DRUM", + "BATTLE_ANIM_FUNC_SWAGGER_MORNING_SUN", + "BATTLE_ANIM_FUNC_HIDDEN_POWER", + "BATTLE_ANIM_FUNC_CURSE", + "BATTLE_ANIM_FUNC_PERISH_SONG", + "BATTLE_ANIM_FUNC_RAPID_SPIN", + "BATTLE_ANIM_FUNC_BETA_PURSUIT", + "BATTLE_ANIM_FUNC_RAIN_SANDSTORM", + "BATTLE_ANIM_FUNC_BATTLE_ANIM_OBJ_B0", + "BATTLE_ANIM_FUNC_PSYCH_UP", + "BATTLE_ANIM_FUNC_ANCIENT_POWER", + "BATTLE_ANIM_FUNC_ROCK_SMASH", + "BATTLE_ANIM_FUNC_COTTON" + ], + "battleAnimGfxOrder": [ + "BATTLE_ANIM_GFX_NONE", + "BATTLE_ANIM_GFX_HIT", + "BATTLE_ANIM_GFX_CUT", + "BATTLE_ANIM_GFX_FIRE", + "BATTLE_ANIM_GFX_WATER", + "BATTLE_ANIM_GFX_LIGHTNING", + "BATTLE_ANIM_GFX_PLANT", + "BATTLE_ANIM_GFX_SMOKE", + "BATTLE_ANIM_GFX_EXPLOSION", + "BATTLE_ANIM_GFX_ROCKS", + "BATTLE_ANIM_GFX_ICE", + "BATTLE_ANIM_GFX_POKE_BALL", + "BATTLE_ANIM_GFX_POISON", + "BATTLE_ANIM_GFX_BUBBLE", + "BATTLE_ANIM_GFX_NOISE", + "BATTLE_ANIM_GFX_POWDER", + "BATTLE_ANIM_GFX_BEAM", + "BATTLE_ANIM_GFX_SPEED", + "BATTLE_ANIM_GFX_CHARGE", + "BATTLE_ANIM_GFX_WIND", + "BATTLE_ANIM_GFX_WHIP", + "BATTLE_ANIM_GFX_EGG", + "BATTLE_ANIM_GFX_ROPE", + "BATTLE_ANIM_GFX_PSYCHIC", + "BATTLE_ANIM_GFX_REFLECT", + "BATTLE_ANIM_GFX_STATUS", + "BATTLE_ANIM_GFX_SAND", + "BATTLE_ANIM_GFX_WEB", + "BATTLE_ANIM_GFX_HAZE", + "BATTLE_ANIM_GFX_HORN", + "BATTLE_ANIM_GFX_FLOWER", + "BATTLE_ANIM_GFX_MISC", + "BATTLE_ANIM_GFX_SKY_ATTACK", + "BATTLE_ANIM_GFX_GLOBE", + "BATTLE_ANIM_GFX_SHAPES", + "BATTLE_ANIM_GFX_OBJECTS", + "BATTLE_ANIM_GFX_SHINE", + "BATTLE_ANIM_GFX_ANGELS", + "BATTLE_ANIM_GFX_WAVE", + "BATTLE_ANIM_GFX_AEROBLAST", + "BATTLE_ANIM_GFX_PLAYERHEAD", + "BATTLE_ANIM_GFX_ENEMYFEET" + ], + "battleAnimOamsetOrder": [ + "BATTLE_ANIM_OAMSET_00", + "BATTLE_ANIM_OAMSET_01", + "BATTLE_ANIM_OAMSET_02", + "BATTLE_ANIM_OAMSET_03", + "BATTLE_ANIM_OAMSET_04", + "BATTLE_ANIM_OAMSET_05", + "BATTLE_ANIM_OAMSET_06", + "BATTLE_ANIM_OAMSET_07", + "BATTLE_ANIM_OAMSET_08", + "BATTLE_ANIM_OAMSET_09", + "BATTLE_ANIM_OAMSET_0A", + "BATTLE_ANIM_OAMSET_0B", + "BATTLE_ANIM_OAMSET_0C", + "BATTLE_ANIM_OAMSET_0D", + "BATTLE_ANIM_OAMSET_0E", + "BATTLE_ANIM_OAMSET_0F", + "BATTLE_ANIM_OAMSET_10", + "BATTLE_ANIM_OAMSET_11", + "BATTLE_ANIM_OAMSET_12", + "BATTLE_ANIM_OAMSET_13", + "BATTLE_ANIM_OAMSET_14", + "BATTLE_ANIM_OAMSET_15", + "BATTLE_ANIM_OAMSET_16", + "BATTLE_ANIM_OAMSET_17", + "BATTLE_ANIM_OAMSET_18", + "BATTLE_ANIM_OAMSET_19", + "BATTLE_ANIM_OAMSET_1A", + "BATTLE_ANIM_OAMSET_1B", + "BATTLE_ANIM_OAMSET_1C", + "BATTLE_ANIM_OAMSET_1D", + "BATTLE_ANIM_OAMSET_1E", + "BATTLE_ANIM_OAMSET_1F", + "BATTLE_ANIM_OAMSET_20", + "BATTLE_ANIM_OAMSET_21", + "BATTLE_ANIM_OAMSET_22", + "BATTLE_ANIM_OAMSET_23", + "BATTLE_ANIM_OAMSET_24", + "BATTLE_ANIM_OAMSET_25", + "BATTLE_ANIM_OAMSET_26", + "BATTLE_ANIM_OAMSET_27", + "BATTLE_ANIM_OAMSET_28", + "BATTLE_ANIM_OAMSET_29", + "BATTLE_ANIM_OAMSET_2A", + "BATTLE_ANIM_OAMSET_2B", + "BATTLE_ANIM_OAMSET_2C", + "BATTLE_ANIM_OAMSET_2D", + "BATTLE_ANIM_OAMSET_2E", + "BATTLE_ANIM_OAMSET_2F", + "BATTLE_ANIM_OAMSET_30", + "BATTLE_ANIM_OAMSET_31", + "BATTLE_ANIM_OAMSET_32", + "BATTLE_ANIM_OAMSET_33", + "BATTLE_ANIM_OAMSET_34", + "BATTLE_ANIM_OAMSET_35", + "BATTLE_ANIM_OAMSET_36", + "BATTLE_ANIM_OAMSET_37", + "BATTLE_ANIM_OAMSET_38", + "BATTLE_ANIM_OAMSET_39", + "BATTLE_ANIM_OAMSET_3A", + "BATTLE_ANIM_OAMSET_3B", + "BATTLE_ANIM_OAMSET_3C", + "BATTLE_ANIM_OAMSET_3D", + "BATTLE_ANIM_OAMSET_3E", + "BATTLE_ANIM_OAMSET_3F", + "BATTLE_ANIM_OAMSET_40", + "BATTLE_ANIM_OAMSET_41", + "BATTLE_ANIM_OAMSET_42", + "BATTLE_ANIM_OAMSET_43", + "BATTLE_ANIM_OAMSET_44", + "BATTLE_ANIM_OAMSET_45", + "BATTLE_ANIM_OAMSET_46", + "BATTLE_ANIM_OAMSET_47", + "BATTLE_ANIM_OAMSET_48", + "BATTLE_ANIM_OAMSET_49", + "BATTLE_ANIM_OAMSET_4A", + "BATTLE_ANIM_OAMSET_4B", + "BATTLE_ANIM_OAMSET_4C", + "BATTLE_ANIM_OAMSET_4D", + "BATTLE_ANIM_OAMSET_4E", + "BATTLE_ANIM_OAMSET_4F", + "BATTLE_ANIM_OAMSET_50", + "BATTLE_ANIM_OAMSET_51", + "BATTLE_ANIM_OAMSET_52", + "BATTLE_ANIM_OAMSET_53", + "BATTLE_ANIM_OAMSET_54", + "BATTLE_ANIM_OAMSET_55", + "BATTLE_ANIM_OAMSET_56", + "BATTLE_ANIM_OAMSET_57", + "BATTLE_ANIM_OAMSET_58", + "BATTLE_ANIM_OAMSET_59", + "BATTLE_ANIM_OAMSET_5A", + "BATTLE_ANIM_OAMSET_5B", + "BATTLE_ANIM_OAMSET_5C", + "BATTLE_ANIM_OAMSET_5D", + "BATTLE_ANIM_OAMSET_5E", + "BATTLE_ANIM_OAMSET_5F", + "BATTLE_ANIM_OAMSET_60", + "BATTLE_ANIM_OAMSET_61", + "BATTLE_ANIM_OAMSET_62", + "BATTLE_ANIM_OAMSET_63", + "BATTLE_ANIM_OAMSET_64", + "BATTLE_ANIM_OAMSET_65", + "BATTLE_ANIM_OAMSET_66", + "BATTLE_ANIM_OAMSET_67", + "BATTLE_ANIM_OAMSET_68", + "BATTLE_ANIM_OAMSET_69", + "BATTLE_ANIM_OAMSET_6A", + "BATTLE_ANIM_OAMSET_6B", + "BATTLE_ANIM_OAMSET_6C", + "BATTLE_ANIM_OAMSET_6D", + "BATTLE_ANIM_OAMSET_6E", + "BATTLE_ANIM_OAMSET_6F", + "BATTLE_ANIM_OAMSET_70", + "BATTLE_ANIM_OAMSET_71", + "BATTLE_ANIM_OAMSET_72", + "BATTLE_ANIM_OAMSET_73", + "BATTLE_ANIM_OAMSET_74", + "BATTLE_ANIM_OAMSET_75", + "BATTLE_ANIM_OAMSET_76", + "BATTLE_ANIM_OAMSET_77", + "BATTLE_ANIM_OAMSET_78", + "BATTLE_ANIM_OAMSET_79", + "BATTLE_ANIM_OAMSET_7A", + "BATTLE_ANIM_OAMSET_7B", + "BATTLE_ANIM_OAMSET_7C", + "BATTLE_ANIM_OAMSET_7D", + "BATTLE_ANIM_OAMSET_7E", + "BATTLE_ANIM_OAMSET_7F", + "BATTLE_ANIM_OAMSET_80", + "BATTLE_ANIM_OAMSET_81", + "BATTLE_ANIM_OAMSET_82", + "BATTLE_ANIM_OAMSET_83", + "BATTLE_ANIM_OAMSET_84", + "BATTLE_ANIM_OAMSET_85", + "BATTLE_ANIM_OAMSET_86", + "BATTLE_ANIM_OAMSET_87", + "BATTLE_ANIM_OAMSET_88", + "BATTLE_ANIM_OAMSET_89", + "BATTLE_ANIM_OAMSET_8A", + "BATTLE_ANIM_OAMSET_8B", + "BATTLE_ANIM_OAMSET_8C", + "BATTLE_ANIM_OAMSET_8D", + "BATTLE_ANIM_OAMSET_8E", + "BATTLE_ANIM_OAMSET_8F", + "BATTLE_ANIM_OAMSET_90", + "BATTLE_ANIM_OAMSET_91", + "BATTLE_ANIM_OAMSET_92", + "BATTLE_ANIM_OAMSET_93", + "BATTLE_ANIM_OAMSET_94", + "BATTLE_ANIM_OAMSET_95", + "BATTLE_ANIM_OAMSET_96", + "BATTLE_ANIM_OAMSET_97", + "BATTLE_ANIM_OAMSET_98", + "BATTLE_ANIM_OAMSET_99", + "BATTLE_ANIM_OAMSET_9A", + "BATTLE_ANIM_OAMSET_9B", + "BATTLE_ANIM_OAMSET_9C", + "BATTLE_ANIM_OAMSET_9D", + "BATTLE_ANIM_OAMSET_9E", + "BATTLE_ANIM_OAMSET_9F", + "BATTLE_ANIM_OAMSET_A0", + "BATTLE_ANIM_OAMSET_A1", + "BATTLE_ANIM_OAMSET_A2", + "BATTLE_ANIM_OAMSET_A3", + "BATTLE_ANIM_OAMSET_A4", + "BATTLE_ANIM_OAMSET_A5", + "BATTLE_ANIM_OAMSET_A6", + "BATTLE_ANIM_OAMSET_A7", + "BATTLE_ANIM_OAMSET_A8", + "BATTLE_ANIM_OAMSET_A9", + "BATTLE_ANIM_OAMSET_AA", + "BATTLE_ANIM_OAMSET_AB", + "BATTLE_ANIM_OAMSET_AC", + "BATTLE_ANIM_OAMSET_AD", + "BATTLE_ANIM_OAMSET_AE", + "BATTLE_ANIM_OAMSET_AF", + "BATTLE_ANIM_OAMSET_B0", + "BATTLE_ANIM_OAMSET_B1", + "BATTLE_ANIM_OAMSET_B2", + "BATTLE_ANIM_OAMSET_B3", + "BATTLE_ANIM_OAMSET_B4", + "BATTLE_ANIM_OAMSET_B5", + "BATTLE_ANIM_OAMSET_B6", + "BATTLE_ANIM_OAMSET_B7", + "BATTLE_ANIM_OAMSET_B8", + "BATTLE_ANIM_OAMSET_B9", + "BATTLE_ANIM_OAMSET_BA", + "BATTLE_ANIM_OAMSET_BB", + "BATTLE_ANIM_OAMSET_BC", + "BATTLE_ANIM_OAMSET_BD", + "BATTLE_ANIM_OAMSET_BE", + "BATTLE_ANIM_OAMSET_BF", + "BATTLE_ANIM_OAMSET_C0", + "BATTLE_ANIM_OAMSET_C1", + "BATTLE_ANIM_OAMSET_C2", + "BATTLE_ANIM_OAMSET_C3", + "BATTLE_ANIM_OAMSET_C4", + "BATTLE_ANIM_OAMSET_C5", + "BATTLE_ANIM_OAMSET_C6", + "BATTLE_ANIM_OAMSET_C7", + "BATTLE_ANIM_OAMSET_C8", + "BATTLE_ANIM_OAMSET_C9", + "BATTLE_ANIM_OAMSET_CA", + "BATTLE_ANIM_OAMSET_CB", + "BATTLE_ANIM_OAMSET_CC", + "BATTLE_ANIM_OAMSET_CD", + "BATTLE_ANIM_OAMSET_CE", + "BATTLE_ANIM_OAMSET_CF", + "BATTLE_ANIM_OAMSET_D0", + "BATTLE_ANIM_OAMSET_D1", + "BATTLE_ANIM_OAMSET_D2", + "BATTLE_ANIM_OAMSET_D3", + "BATTLE_ANIM_OAMSET_D4", + "BATTLE_ANIM_OAMSET_D5", + "BATTLE_ANIM_OAMSET_D6", + "BATTLE_ANIM_OAMSET_D7" + ], + "battleAnimObPaletteOrder": [ + "PAL_BATTLE_OB_ENEMY", + "PAL_BATTLE_OB_PLAYER", + "PAL_BATTLE_OB_GRAY", + "PAL_BATTLE_OB_YELLOW", + "PAL_BATTLE_OB_RED", + "PAL_BATTLE_OB_GREEN", + "PAL_BATTLE_OB_BLUE", + "PAL_BATTLE_OB_BROWN" + ], + "battleAnimObjectOrder": [ + "BATTLE_ANIM_OBJ_HIT_BIG_YFIX", + "BATTLE_ANIM_OBJ_HIT_YFIX", + "BATTLE_ANIM_OBJ_HIT_SMALL_YFIX", + "BATTLE_ANIM_OBJ_HIT_BIG", + "BATTLE_ANIM_OBJ_HIT", + "BATTLE_ANIM_OBJ_HIT_SMALL", + "BATTLE_ANIM_OBJ_PUNCH", + "BATTLE_ANIM_OBJ_KICK", + "BATTLE_ANIM_OBJ_PALM", + "BATTLE_ANIM_OBJ_FANG", + "BATTLE_ANIM_OBJ_PUNCH_SHAKE", + "BATTLE_ANIM_OBJ_EMBER", + "BATTLE_ANIM_OBJ_DRAGON_RAGE", + "BATTLE_ANIM_OBJ_FLAMETHROWER", + "BATTLE_ANIM_OBJ_FIRE_SPIN", + "BATTLE_ANIM_OBJ_FIRE_BLAST", + "BATTLE_ANIM_OBJ_BURNED", + "BATTLE_ANIM_OBJ_BLIZZARD", + "BATTLE_ANIM_OBJ_ICE", + "BATTLE_ANIM_OBJ_ICE_BEAM", + "BATTLE_ANIM_OBJ_RAZOR_LEAF", + "BATTLE_ANIM_OBJ_POKE_BALL", + "BATTLE_ANIM_OBJ_POKE_BALL_BLOCKED", + "BATTLE_ANIM_OBJ_EXPLOSION1", + "BATTLE_ANIM_OBJ_EXPLOSION2", + "BATTLE_ANIM_OBJ_ACID", + "BATTLE_ANIM_OBJ_SLUDGE", + "BATTLE_ANIM_OBJ_BETA_BALL_POOF", + "BATTLE_ANIM_OBJ_BALL_POOF", + "BATTLE_ANIM_OBJ_BIG_ROCK", + "BATTLE_ANIM_OBJ_SMALL_ROCK", + "BATTLE_ANIM_OBJ_STRENGTH", + "BATTLE_ANIM_OBJ_SEISMIC_TOSS", + "BATTLE_ANIM_OBJ_BUBBLE", + "BATTLE_ANIM_OBJ_SURF", + "BATTLE_ANIM_OBJ_SING", + "BATTLE_ANIM_OBJ_WATER_GUN", + "BATTLE_ANIM_OBJ_HYDRO_PUMP", + "BATTLE_ANIM_OBJ_POWDER", + "BATTLE_ANIM_OBJ_BEAM", + "BATTLE_ANIM_OBJ_BEAM_TIP", + "BATTLE_ANIM_OBJ_ICE_BUILDUP", + "BATTLE_ANIM_OBJ_FROZEN", + "BATTLE_ANIM_OBJ_MASTER_BALL_SPARKLE", + "BATTLE_ANIM_OBJ_RECOVER", + "BATTLE_ANIM_OBJ_THUNDER_CENTER", + "BATTLE_ANIM_OBJ_THUNDER_LEFT", + "BATTLE_ANIM_OBJ_THUNDER_RIGHT", + "BATTLE_ANIM_OBJ_THUNDER_WAVE", + "BATTLE_ANIM_OBJ_SPARKS_CIRCLE_BIG", + "BATTLE_ANIM_OBJ_THUNDERBOLT_BALL", + "BATTLE_ANIM_OBJ_SPARKS_CIRCLE", + "BATTLE_ANIM_OBJ_THUNDERSHOCK_BALL", + "BATTLE_ANIM_OBJ_CLAMP", + "BATTLE_ANIM_OBJ_BITE", + "BATTLE_ANIM_OBJ_CUT_DOWN_LEFT", + "BATTLE_ANIM_OBJ_CUT_DOWN_RIGHT", + "BATTLE_ANIM_OBJ_CUT_UP_RIGHT", + "BATTLE_ANIM_OBJ_CUT_LONG_DOWN_LEFT", + "BATTLE_ANIM_OBJ_CUT_LONG_DOWN_RIGHT", + "BATTLE_ANIM_OBJ_SOLAR_BEAM_CHARGE", + "BATTLE_ANIM_OBJ_ABSORB_CENTER", + "BATTLE_ANIM_OBJ_GUST", + "BATTLE_ANIM_OBJ_VINE_WHIP1", + "BATTLE_ANIM_OBJ_VINE_WHIP2", + "BATTLE_ANIM_OBJ_RAZOR_WIND1", + "BATTLE_ANIM_OBJ_RAZOR_WIND2", + "BATTLE_ANIM_OBJ_SONICBOOM_JP", + "BATTLE_ANIM_OBJ_WARP", + "BATTLE_ANIM_OBJ_ABSORB", + "BATTLE_ANIM_OBJ_EGG", + "BATTLE_ANIM_OBJ_FOCUS", + "BATTLE_ANIM_OBJ_BIND1", + "BATTLE_ANIM_OBJ_BIND2", + "BATTLE_ANIM_OBJ_LEECH_SEED", + "BATTLE_ANIM_OBJ_SOUND", + "BATTLE_ANIM_OBJ_WAVE", + "BATTLE_ANIM_OBJ_CONFUSE_RAY", + "BATTLE_ANIM_OBJ_LEER", + "BATTLE_ANIM_OBJ_LEER_TIP", + "BATTLE_ANIM_OBJ_SCREEN", + "BATTLE_ANIM_OBJ_HARDEN", + "BATTLE_ANIM_OBJ_CHICK", + "BATTLE_ANIM_OBJ_AMNESIA", + "BATTLE_ANIM_OBJ_ASLEEP", + "BATTLE_ANIM_OBJ_SKULL", + "BATTLE_ANIM_OBJ_DIG_SAND", + "BATTLE_ANIM_OBJ_DIG_PILE", + "BATTLE_ANIM_OBJ_SAND", + "BATTLE_ANIM_OBJ_PARALYZED", + "BATTLE_ANIM_OBJ_STRING_SHOT", + "BATTLE_ANIM_OBJ_HAZE", + "BATTLE_ANIM_OBJ_MIST", + "BATTLE_ANIM_OBJ_SMOG", + "BATTLE_ANIM_OBJ_POISON_GAS", + "BATTLE_ANIM_OBJ_HORN", + "BATTLE_ANIM_OBJ_NEEDLE", + "BATTLE_ANIM_OBJ_PETAL_DANCE", + "BATTLE_ANIM_OBJ_SLUDGE_BOMB", + "BATTLE_ANIM_OBJ_PAY_DAY", + "BATTLE_ANIM_OBJ_SONICBOOM_JP_UNUSED", + "BATTLE_ANIM_OBJ_MIMIC", + "BATTLE_ANIM_OBJ_ATTRACT", + "BATTLE_ANIM_OBJ_BONEMERANG", + "BATTLE_ANIM_OBJ_BONE_CLUB", + "BATTLE_ANIM_OBJ_BONE_RUSH", + "BATTLE_ANIM_OBJ_SWIFT", + "BATTLE_ANIM_OBJ_KINESIS", + "BATTLE_ANIM_OBJ_FLASH", + "BATTLE_ANIM_OBJ_SHINY", + "BATTLE_ANIM_OBJ_SKY_ATTACK", + "BATTLE_ANIM_OBJ_LICK", + "BATTLE_ANIM_OBJ_WITHDRAW", + "BATTLE_ANIM_OBJ_DRAIN", + "BATTLE_ANIM_OBJ_GROWTH", + "BATTLE_ANIM_OBJ_CONVERSION2", + "BATTLE_ANIM_OBJ_SMOKE", + "BATTLE_ANIM_OBJ_SMOKESCREEN", + "BATTLE_ANIM_OBJ_SWORDS_DANCE", + "BATTLE_ANIM_OBJ_SPEED_LINE", + "BATTLE_ANIM_OBJ_SHARPEN", + "BATTLE_ANIM_OBJ_DEFENSE_CURL", + "BATTLE_ANIM_OBJ_METRONOME_HAND", + "BATTLE_ANIM_OBJ_METRONOME_SPARKLE", + "BATTLE_ANIM_OBJ_DISABLE", + "BATTLE_ANIM_OBJ_AGILITY", + "BATTLE_ANIM_OBJ_HEART", + "BATTLE_ANIM_OBJ_FLAME_WHEEL", + "BATTLE_ANIM_OBJ_SACRED_FIRE", + "BATTLE_ANIM_OBJ_COTTON_SPORE", + "BATTLE_ANIM_OBJ_MILK_DRINK", + "BATTLE_ANIM_OBJ_ANGER", + "BATTLE_ANIM_OBJ_HEAL_BELL", + "BATTLE_ANIM_OBJ_HEAL_BELL_NOTE", + "BATTLE_ANIM_OBJ_BATON_PASS", + "BATTLE_ANIM_OBJ_LOCK_ON", + "BATTLE_ANIM_OBJ_MIND_READER", + "BATTLE_ANIM_OBJ_SAFEGUARD", + "BATTLE_ANIM_OBJ_PROTECT", + "BATTLE_ANIM_OBJ_THIEF", + "BATTLE_ANIM_OBJ_OCTAZOOKA", + "BATTLE_ANIM_OBJ_PRESENT", + "BATTLE_ANIM_OBJ_SPIKES", + "BATTLE_ANIM_OBJ_POWDER_SNOW", + "BATTLE_ANIM_OBJ_DRAGONBREATH", + "BATTLE_ANIM_OBJ_CONVERSION", + "BATTLE_ANIM_OBJ_SPIDER_WEB", + "BATTLE_ANIM_OBJ_CAKE_UNUSED", + "BATTLE_ANIM_OBJ_NIGHTMARE", + "BATTLE_ANIM_OBJ_IN_NIGHTMARE", + "BATTLE_ANIM_OBJ_LOVELY_KISS", + "BATTLE_ANIM_OBJ_SWEET_KISS", + "BATTLE_ANIM_OBJ_SKETCH", + "BATTLE_ANIM_OBJ_ENCORE_HAND", + "BATTLE_ANIM_OBJ_ENCORE_STAR", + "BATTLE_ANIM_OBJ_DESTINY_BOND", + "BATTLE_ANIM_OBJ_MORNING_SUN", + "BATTLE_ANIM_OBJ_GLIMMER", + "BATTLE_ANIM_OBJ_MOONLIGHT", + "BATTLE_ANIM_OBJ_HIDDEN_POWER", + "BATTLE_ANIM_OBJ_CROSS_CHOP1", + "BATTLE_ANIM_OBJ_CROSS_CHOP2", + "BATTLE_ANIM_OBJ_SANDSTORM", + "BATTLE_ANIM_OBJ_ZAP_CANNON", + "BATTLE_ANIM_OBJ_SPITE", + "BATTLE_ANIM_OBJ_CURSE", + "BATTLE_ANIM_OBJ_PERISH_SONG", + "BATTLE_ANIM_OBJ_FORESIGHT", + "BATTLE_ANIM_OBJ_RAPID_SPIN", + "BATTLE_ANIM_OBJ_SWAGGER", + "BATTLE_ANIM_OBJ_BELLY_DRUM_HAND", + "BATTLE_ANIM_OBJ_BELLY_DRUM_NOTE", + "BATTLE_ANIM_OBJ_MEAN_LOOK", + "BATTLE_ANIM_OBJ_BETA_PURSUIT", + "BATTLE_ANIM_OBJ_SHOOTING_SPARKLE", + "BATTLE_ANIM_OBJ_RAIN", + "BATTLE_ANIM_OBJ_B0", + "BATTLE_ANIM_OBJ_PSYCH_UP", + "BATTLE_ANIM_OBJ_ANCIENTPOWER", + "BATTLE_ANIM_OBJ_AEROBLAST", + "BATTLE_ANIM_OBJ_SHADOW_BALL", + "BATTLE_ANIM_OBJ_ROCK_SMASH", + "BATTLE_ANIM_OBJ_FLOWER", + "BATTLE_ANIM_OBJ_COTTON", + "BATTLE_ANIM_OBJ_ENEMYFEET_1ROW", + "BATTLE_ANIM_OBJ_PLAYERHEAD_1ROW", + "BATTLE_ANIM_OBJ_ENEMYFEET_2ROW", + "BATTLE_ANIM_OBJ_PLAYERHEAD_2ROW" + ], + "battleBgEffectOrder": [ + "BATTLE_BG_EFFECT_END", + "BATTLE_BG_EFFECT_FLASH_INVERTED", + "BATTLE_BG_EFFECT_FLASH_WHITE", + "BATTLE_BG_EFFECT_WHITE_HUES", + "BATTLE_BG_EFFECT_BLACK_HUES", + "BATTLE_BG_EFFECT_ALTERNATE_HUES", + "BATTLE_BG_EFFECT_CYCLE_OBPALS_GRAY_AND_YELLOW", + "BATTLE_BG_EFFECT_CYCLE_MID_OBPALS_GRAY_AND_YELLOW", + "BATTLE_BG_EFFECT_CYCLE_BGPALS_INVERTED", + "BATTLE_BG_EFFECT_HIDE_MON", + "BATTLE_BG_EFFECT_SHOW_MON", + "BATTLE_BG_EFFECT_ENTER_MON", + "BATTLE_BG_EFFECT_RETURN_MON", + "BATTLE_BG_EFFECT_SURF", + "BATTLE_BG_EFFECT_WHIRLPOOL", + "BATTLE_BG_EFFECT_TELEPORT", + "BATTLE_BG_EFFECT_NIGHT_SHADE", + "BATTLE_BG_EFFECT_BATTLEROBJ_1ROW", + "BATTLE_BG_EFFECT_BATTLEROBJ_2ROW", + "BATTLE_BG_EFFECT_DOUBLE_TEAM", + "BATTLE_BG_EFFECT_ACID_ARMOR", + "BATTLE_BG_EFFECT_RAPID_FLASH", + "BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT", + "BATTLE_BG_EFFECT_FADE_MON_TO_BLACK", + "BATTLE_BG_EFFECT_FADE_MON_TO_LIGHT_REPEATING", + "BATTLE_BG_EFFECT_FADE_MON_TO_BLACK_REPEATING", + "BATTLE_BG_EFFECT_CYCLE_MON_LIGHT_DARK_REPEATING", + "BATTLE_BG_EFFECT_FLASH_MON_REPEATING", + "BATTLE_BG_EFFECT_FADE_MONS_TO_BLACK_REPEATING", + "BATTLE_BG_EFFECT_FADE_MON_TO_WHITE_WAIT_FADE_BACK", + "BATTLE_BG_EFFECT_FADE_MON_FROM_WHITE", + "BATTLE_BG_EFFECT_SHAKE_SCREEN_X", + "BATTLE_BG_EFFECT_SHAKE_SCREEN_Y", + "BATTLE_BG_EFFECT_WITHDRAW", + "BATTLE_BG_EFFECT_BOUNCE_DOWN", + "BATTLE_BG_EFFECT_DIG", + "BATTLE_BG_EFFECT_TACKLE", + "BATTLE_BG_EFFECT_WOBBLE_MON", + "BATTLE_BG_EFFECT_REMOVE_MON", + "BATTLE_BG_EFFECT_WAVE_DEFORM_MON", + "BATTLE_BG_EFFECT_PSYCHIC", + "BATTLE_BG_EFFECT_BETA_SEND_OUT_MON1", + "BATTLE_BG_EFFECT_BETA_SEND_OUT_MON2", + "BATTLE_BG_EFFECT_FLAIL", + "BATTLE_BG_EFFECT_BETA_PURSUIT", + "BATTLE_BG_EFFECT_ROLLOUT", + "BATTLE_BG_EFFECT_VITAL_THROW", + "BATTLE_BG_EFFECT_START_WATER", + "BATTLE_BG_EFFECT_WATER", + "BATTLE_BG_EFFECT_END_WATER", + "BATTLE_BG_EFFECT_VIBRATE_MON", + "BATTLE_BG_EFFECT_WOBBLE_PLAYER", + "BATTLE_BG_EFFECT_WOBBLE_SCREEN" + ], + "cmdQueueOrder": [ + "CMDQUEUE_NULL", + "CMDQUEUE_TYPE1", + "CMDQUEUE_STONETABLE", + "CMDQUEUE_TYPE3", + "CMDQUEUE_TYPE4" + ], + "decoDescOrder": [ + "DECODESC_POSTER", + "DECODESC_LEFT_DOLL", + "DECODESC_RIGHT_DOLL", + "DECODESC_BIG_DOLL", + "DECODESC_CONSOLE" + ], + "eggGroupOrder": [ + "EGG_MONSTER", + "EGG_WATER_1", + "EGG_BUG", + "EGG_FLYING", + "EGG_GROUND", + "EGG_FAIRY", + "EGG_PLANT", + "EGG_HUMANSHAPE", + "EGG_WATER_3", + "EGG_MINERAL", + "EGG_INDETERMINATE", + "EGG_WATER_2", + "EGG_DITTO", + "EGG_DRAGON", + "EGG_NONE" + ], + "environmentOrder": [ + "TOWN", + "ROUTE", + "INDOOR", + "CAVE", + "ENVIRONMENT_5", + "GATE", + "DUNGEON" + ], + "evolveMethodOrder": [ + "EVOLVE_LEVEL", + "EVOLVE_ITEM", + "EVOLVE_TRADE", + "EVOLVE_HAPPINESS", + "EVOLVE_STAT" + ], + "fishGroupOrder": [ + "FISHGROUP_NONE", + "FISHGROUP_SHORE", + "FISHGROUP_OCEAN", + "FISHGROUP_LAKE", + "FISHGROUP_POND", + "FISHGROUP_DRATINI", + "FISHGROUP_QWILFISH_SWARM", + "FISHGROUP_REMORAID_SWARM", + "FISHGROUP_GYARADOS", + "FISHGROUP_DRATINI_2", + "FISHGROUP_WHIRL_ISLANDS", + "FISHGROUP_QWILFISH", + "FISHGROUP_REMORAID", + "FISHGROUP_QWILFISH_NO_SWARM" + ], + "floorOrder": [ + "FLOOR_B4F", + "FLOOR_B3F", + "FLOOR_B2F", + "FLOOR_B1F", + "FLOOR_1F", + "FLOOR_2F", + "FLOOR_3F", + "FLOOR_4F", + "FLOOR_5F", + "FLOOR_6F", + "FLOOR_7F", + "FLOOR_8F", + "FLOOR_9F", + "FLOOR_10F", + "FLOOR_11F", + "FLOOR_ROOF" + ], + "growthRateOrder": [ + "GROWTH_MEDIUM_FAST", + "GROWTH_SLIGHTLY_FAST", + "GROWTH_SLIGHTLY_SLOW", + "GROWTH_MEDIUM_SLOW", + "GROWTH_FAST", + "GROWTH_SLOW" + ], + "heldEffectOrder": [ + "HELD_NONE", + "HELD_BERRY", + "HELD_2", + "HELD_LEFTOVERS", + "HELD_UNUSED_4", + "HELD_5", + "HELD_RESTORE_PP", + "HELD_UNUSED_7", + "HELD_CLEANSE_TAG", + "HELD_UNUSED_9", + "HELD_HEAL_POISON", + "HELD_HEAL_FREEZE", + "HELD_HEAL_BURN", + "HELD_HEAL_SLEEP", + "HELD_HEAL_PARALYZE", + "HELD_HEAL_STATUS", + "HELD_HEAL_CONFUSION", + "HELD_UNUSED_17", + "HELD_UNUSED_18", + "HELD_UNUSED_19", + "HELD_PREVENT_POISON", + "HELD_PREVENT_BURN", + "HELD_PREVENT_FREEZE", + "HELD_PREVENT_SLEEP", + "HELD_PREVENT_PARALYZE", + "HELD_PREVENT_CONFUSE", + "HELD_UNUSED_26", + "HELD_UNUSED_27", + "HELD_UNUSED_28", + "HELD_UNUSED_29", + "HELD_30", + "HELD_ATTACK_UP", + "HELD_DEFENSE_UP", + "HELD_SPEED_UP", + "HELD_SP_ATTACK_UP", + "HELD_SP_DEFENSE_UP", + "HELD_ACCURACY_UP", + "HELD_EVASION_UP", + "HELD_38", + "HELD_UNUSED_39", + "HELD_UNUSED_40", + "HELD_UNUSED_41", + "HELD_METAL_POWDER", + "HELD_UNUSED_43", + "HELD_UNUSED_44", + "HELD_UNUSED_45", + "HELD_UNUSED_46", + "HELD_UNUSED_47", + "HELD_UNUSED_48", + "HELD_UNUSED_49", + "HELD_NORMAL_BOOST", + "HELD_FIGHTING_BOOST", + "HELD_FLYING_BOOST", + "HELD_POISON_BOOST", + "HELD_GROUND_BOOST", + "HELD_ROCK_BOOST", + "HELD_BUG_BOOST", + "HELD_GHOST_BOOST", + "HELD_FIRE_BOOST", + "HELD_WATER_BOOST", + "HELD_GRASS_BOOST", + "HELD_ELECTRIC_BOOST", + "HELD_PSYCHIC_BOOST", + "HELD_ICE_BOOST", + "HELD_DRAGON_BOOST", + "HELD_DARK_BOOST", + "HELD_STEEL_BOOST", + "HELD_UNUSED_67", + "HELD_UNUSED_68", + "HELD_UNUSED_69", + "HELD_CATCH_CHANCE", + "HELD_71", + "HELD_ESCAPE", + "HELD_CRITICAL_UP", + "HELD_QUICK_CLAW", + "HELD_FLINCH", + "HELD_AMULET_COIN", + "HELD_BRIGHTPOWDER", + "HELD_UNUSED_78", + "HELD_FOCUS_BAND" + ], + "iconOrder": [ + "ICON_NULL", + "ICON_POLIWAG", + "ICON_JIGGLYPUFF", + "ICON_DIGLETT", + "ICON_PIKACHU", + "ICON_STARYU", + "ICON_FISH", + "ICON_BIRD", + "ICON_MONSTER", + "ICON_CLEFAIRY", + "ICON_ODDISH", + "ICON_BUG", + "ICON_GHOST", + "ICON_LAPRAS", + "ICON_HUMANSHAPE", + "ICON_FOX", + "ICON_EQUINE", + "ICON_SHELL", + "ICON_BLOB", + "ICON_SERPENT", + "ICON_VOLTORB", + "ICON_SQUIRTLE", + "ICON_BULBASAUR", + "ICON_CHARMANDER", + "ICON_CATERPILLAR", + "ICON_UNOWN", + "ICON_GEODUDE", + "ICON_FIGHTER", + "ICON_EGG", + "ICON_JELLYFISH", + "ICON_MOTH", + "ICON_BAT", + "ICON_SNORLAX", + "ICON_HO_OH", + "ICON_LUGIA", + "ICON_GYARADOS", + "ICON_SLOWPOKE", + "ICON_SUDOWOODO", + "ICON_BIGMON" + ], + "itemMenuOrder": [ + "ITEMMENU_NOUSE", + "ITEMMENU_CURRENT", + "ITEMMENU_PARTY", + "ITEMMENU_CLOSE" + ], + "itemNameCount": 190, + "itemOrder": [ + "MASTER_BALL", + "ULTRA_BALL", + "BRIGHTPOWDER", + "GREAT_BALL", + "POKE_BALL", + "TOWN_MAP", + "BICYCLE", + "MOON_STONE", + "ANTIDOTE", + "BURN_HEAL", + "ICE_HEAL", + "AWAKENING", + "PARLYZ_HEAL", + "FULL_RESTORE", + "MAX_POTION", + "HYPER_POTION", + "SUPER_POTION", + "POTION", + "ESCAPE_ROPE", + "REPEL", + "MAX_ELIXER", + "FIRE_STONE", + "THUNDERSTONE", + "WATER_STONE", + "ITEM_19", + "HP_UP", + "PROTEIN", + "IRON", + "CARBOS", + "LUCKY_PUNCH", + "CALCIUM", + "RARE_CANDY", + "X_ACCURACY", + "LEAF_STONE", + "METAL_POWDER", + "NUGGET", + "POKE_DOLL", + "FULL_HEAL", + "REVIVE", + "MAX_REVIVE", + "GUARD_SPEC", + "SUPER_REPEL", + "MAX_REPEL", + "DIRE_HIT", + "ITEM_2D", + "FRESH_WATER", + "SODA_POP", + "LEMONADE", + "X_ATTACK", + "ITEM_32", + "X_DEFEND", + "X_SPEED", + "X_SPECIAL", + "COIN_CASE", + "ITEMFINDER", + "POKE_FLUTE", + "EXP_SHARE", + "OLD_ROD", + "GOOD_ROD", + "SILVER_LEAF", + "SUPER_ROD", + "PP_UP", + "ETHER", + "MAX_ETHER", + "ELIXER", + "RED_SCALE", + "SECRETPOTION", + "S_S_TICKET", + "MYSTERY_EGG", + "ITEM_46", + "SILVER_WING", + "MOOMOO_MILK", + "QUICK_CLAW", + "PSNCUREBERRY", + "GOLD_LEAF", + "SOFT_SAND", + "SHARP_BEAK", + "PRZCUREBERRY", + "BURNT_BERRY", + "ICE_BERRY", + "POISON_BARB", + "KINGS_ROCK", + "BITTER_BERRY", + "MINT_BERRY", + "RED_APRICORN", + "TINYMUSHROOM", + "BIG_MUSHROOM", + "SILVERPOWDER", + "BLU_APRICORN", + "ITEM_5A", + "AMULET_COIN", + "YLW_APRICORN", + "GRN_APRICORN", + "CLEANSE_TAG", + "MYSTIC_WATER", + "TWISTEDSPOON", + "WHT_APRICORN", + "BLACKBELT_I", + "BLK_APRICORN", + "ITEM_64", + "PNK_APRICORN", + "BLACKGLASSES", + "SLOWPOKETAIL", + "PINK_BOW", + "STICK", + "SMOKE_BALL", + "NEVERMELTICE", + "MAGNET", + "MIRACLEBERRY", + "PEARL", + "BIG_PEARL", + "EVERSTONE", + "SPELL_TAG", + "RAGECANDYBAR", + "ITEM_73", + "ITEM_74", + "MIRACLE_SEED", + "THICK_CLUB", + "FOCUS_BAND", + "ITEM_78", + "ENERGYPOWDER", + "ENERGY_ROOT", + "HEAL_POWDER", + "REVIVAL_HERB", + "HARD_STONE", + "LUCKY_EGG", + "CARD_KEY", + "MACHINE_PART", + "ITEM_81", + "LOST_ITEM", + "STARDUST", + "STAR_PIECE", + "BASEMENT_KEY", + "PASS", + "ITEM_87", + "ITEM_88", + "ITEM_89", + "CHARCOAL", + "BERRY_JUICE", + "SCOPE_LENS", + "ITEM_8D", + "ITEM_8E", + "METAL_COAT", + "DRAGON_FANG", + "ITEM_91", + "LEFTOVERS", + "ITEM_93", + "ITEM_94", + "ITEM_95", + "MYSTERYBERRY", + "DRAGON_SCALE", + "BERSERK_GENE", + "ITEM_99", + "ITEM_9A", + "ITEM_9B", + "SACRED_ASH", + "HEAVY_BALL", + "FLOWER_MAIL", + "LEVEL_BALL", + "LURE_BALL", + "FAST_BALL", + "ITEM_A2", + "LIGHT_BALL", + "FRIEND_BALL", + "MOON_BALL", + "LOVE_BALL", + "NORMAL_BOX", + "GORGEOUS_BOX", + "SUN_STONE", + "POLKADOT_BOW", + "ITEM_AB", + "UP_GRADE", + "BERRY", + "GOLD_BERRY", + "SQUIRTBOTTLE", + "ITEM_B0", + "PARK_BALL", + "RAINBOW_WING", + "ITEM_B3", + "BRICK_PIECE", + "SURF_MAIL", + "LITEBLUEMAIL", + "PORTRAITMAIL", + "LOVELY_MAIL", + "EON_MAIL", + "MORPH_MAIL", + "BLUESKY_MAIL", + "MUSIC_MAIL", + "MIRAGE_MAIL", + "ITEM_BE", + "TM_DYNAMICPUNCH", + "TM_HEADBUTT", + "TM_CURSE", + "TM_ROLLOUT", + "ITEM_C3", + "TM_ROAR", + "TM_TOXIC", + "TM_ZAP_CANNON", + "TM_ROCK_SMASH", + "TM_PSYCH_UP", + "TM_HIDDEN_POWER", + "TM_SUNNY_DAY", + "TM_SWEET_SCENT", + "TM_SNORE", + "TM_BLIZZARD", + "TM_HYPER_BEAM", + "TM_ICY_WIND", + "TM_PROTECT", + "TM_RAIN_DANCE", + "TM_GIGA_DRAIN", + "TM_ENDURE", + "TM_FRUSTRATION", + "TM_SOLARBEAM", + "TM_IRON_TAIL", + "TM_DRAGONBREATH", + "TM_THUNDER", + "TM_EARTHQUAKE", + "TM_RETURN", + "TM_DIG", + "ITEM_DC", + "TM_PSYCHIC_M", + "TM_SHADOW_BALL", + "TM_MUD_SLAP", + "TM_DOUBLE_TEAM", + "TM_ICE_PUNCH", + "TM_SWAGGER", + "TM_SLEEP_TALK", + "TM_SLUDGE_BOMB", + "TM_SANDSTORM", + "TM_FIRE_BLAST", + "TM_SWIFT", + "TM_DEFENSE_CURL", + "TM_THUNDERPUNCH", + "TM_DREAM_EATER", + "TM_DETECT", + "TM_REST", + "TM_ATTRACT", + "TM_THIEF", + "TM_STEEL_WING", + "TM_FIRE_PUNCH", + "TM_FURY_CUTTER", + "TM_NIGHTMARE", + "HM_CUT", + "HM_FLY", + "HM_SURF", + "HM_STRENGTH", + "HM_FLASH", + "HM_WHIRLPOOL", + "HM_WATERFALL", + "ITEM_FA" + ], + "landmarkOrder": [ + "LANDMARK_SPECIAL", + "LANDMARK_NEW_BARK_TOWN", + "LANDMARK_ROUTE_29", + "LANDMARK_CHERRYGROVE_CITY", + "LANDMARK_ROUTE_30", + "LANDMARK_ROUTE_31", + "LANDMARK_VIOLET_CITY", + "LANDMARK_SPROUT_TOWER", + "LANDMARK_ROUTE_32", + "LANDMARK_RUINS_OF_ALPH", + "LANDMARK_UNION_CAVE", + "LANDMARK_ROUTE_33", + "LANDMARK_AZALEA_TOWN", + "LANDMARK_SLOWPOKE_WELL", + "LANDMARK_ILEX_FOREST", + "LANDMARK_ROUTE_34", + "LANDMARK_GOLDENROD_CITY", + "LANDMARK_RADIO_TOWER", + "LANDMARK_ROUTE_35", + "LANDMARK_NATIONAL_PARK", + "LANDMARK_ROUTE_36", + "LANDMARK_ROUTE_37", + "LANDMARK_ECRUTEAK_CITY", + "LANDMARK_TIN_TOWER", + "LANDMARK_BURNED_TOWER", + "LANDMARK_ROUTE_38", + "LANDMARK_ROUTE_39", + "LANDMARK_OLIVINE_CITY", + "LANDMARK_LIGHTHOUSE", + "LANDMARK_ROUTE_40", + "LANDMARK_WHIRL_ISLANDS", + "LANDMARK_ROUTE_41", + "LANDMARK_CIANWOOD_CITY", + "LANDMARK_ROUTE_42", + "LANDMARK_MT_MORTAR", + "LANDMARK_MAHOGANY_TOWN", + "LANDMARK_ROUTE_43", + "LANDMARK_LAKE_OF_RAGE", + "LANDMARK_ROUTE_44", + "LANDMARK_ICE_PATH", + "LANDMARK_BLACKTHORN_CITY", + "LANDMARK_DRAGONS_DEN", + "LANDMARK_ROUTE_45", + "LANDMARK_DARK_CAVE", + "LANDMARK_ROUTE_46", + "LANDMARK_SILVER_CAVE", + "LANDMARK_PALLET_TOWN", + "LANDMARK_ROUTE_1", + "LANDMARK_VIRIDIAN_CITY", + "LANDMARK_ROUTE_2", + "LANDMARK_PEWTER_CITY", + "LANDMARK_ROUTE_3", + "LANDMARK_MT_MOON", + "LANDMARK_ROUTE_4", + "LANDMARK_CERULEAN_CITY", + "LANDMARK_ROUTE_24", + "LANDMARK_ROUTE_25", + "LANDMARK_ROUTE_5", + "LANDMARK_UNDERGROUND_PATH", + "LANDMARK_ROUTE_6", + "LANDMARK_VERMILION_CITY", + "LANDMARK_DIGLETTS_CAVE", + "LANDMARK_ROUTE_7", + "LANDMARK_ROUTE_8", + "LANDMARK_ROUTE_9", + "LANDMARK_ROCK_TUNNEL", + "LANDMARK_ROUTE_10", + "LANDMARK_POWER_PLANT", + "LANDMARK_LAVENDER_TOWN", + "LANDMARK_LAV_RADIO_TOWER", + "LANDMARK_CELADON_CITY", + "LANDMARK_SAFFRON_CITY", + "LANDMARK_ROUTE_11", + "LANDMARK_ROUTE_12", + "LANDMARK_ROUTE_13", + "LANDMARK_ROUTE_14", + "LANDMARK_ROUTE_15", + "LANDMARK_ROUTE_16", + "LANDMARK_ROUTE_17", + "LANDMARK_ROUTE_18", + "LANDMARK_FUCHSIA_CITY", + "LANDMARK_ROUTE_19", + "LANDMARK_ROUTE_20", + "LANDMARK_SEAFOAM_ISLANDS", + "LANDMARK_CINNABAR_ISLAND", + "LANDMARK_ROUTE_21", + "LANDMARK_ROUTE_22", + "LANDMARK_VICTORY_ROAD", + "LANDMARK_ROUTE_23", + "LANDMARK_INDIGO_PLATEAU", + "LANDMARK_ROUTE_26", + "LANDMARK_ROUTE_27", + "LANDMARK_TOHJO_FALLS", + "LANDMARK_ROUTE_28", + "LANDMARK_FAST_SHIP" + ], + "mapCallbackOrder": [ + "MAPCALLBACK_NONE", + "MAPCALLBACK_TILES", + "MAPCALLBACK_OBJECTS", + "MAPCALLBACK_CMDQUEUE", + "MAPCALLBACK_SPRITES", + "MAPCALLBACK_NEWMAP" + ], + "mapGroups": [ + { + "group": 1, + "height": 4, + "map": 1, + "name": "OLIVINE_POKECENTER_1F", + "width": 5 + }, + { + "group": 1, + "height": 8, + "map": 2, + "name": "OLIVINE_GYM", + "width": 5 + }, + { + "group": 1, + "height": 4, + "map": 3, + "name": "OLIVINE_TIMS_HOUSE", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 4, + "name": "OLIVINE_HOUSE_BETA", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 5, + "name": "OLIVINE_PUNISHMENT_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 6, + "name": "OLIVINE_GOOD_ROD_HOUSE", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 7, + "name": "OLIVINE_CAFE", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 8, + "name": "OLIVINE_MART", + "width": 6 + }, + { + "group": 1, + "height": 4, + "map": 9, + "name": "ROUTE_38_ECRUTEAK_GATE", + "width": 5 + }, + { + "group": 1, + "height": 4, + "map": 10, + "name": "ROUTE_39_BARN", + "width": 4 + }, + { + "group": 1, + "height": 4, + "map": 11, + "name": "ROUTE_39_FARMHOUSE", + "width": 4 + }, + { + "group": 1, + "height": 9, + "map": 12, + "name": "ROUTE_38", + "width": 20 + }, + { + "group": 1, + "height": 18, + "map": 13, + "name": "ROUTE_39", + "width": 10 + }, + { + "group": 1, + "height": 18, + "map": 14, + "name": "OLIVINE_CITY", + "width": 20 + }, + { + "group": 2, + "height": 4, + "map": 1, + "name": "MAHOGANY_RED_GYARADOS_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 2, + "height": 9, + "map": 2, + "name": "MAHOGANY_GYM", + "width": 5 + }, + { + "group": 2, + "height": 4, + "map": 3, + "name": "MAHOGANY_POKECENTER_1F", + "width": 5 + }, + { + "group": 2, + "height": 4, + "map": 4, + "name": "ROUTE_42_ECRUTEAK_GATE", + "width": 5 + }, + { + "group": 2, + "height": 9, + "map": 5, + "name": "ROUTE_42", + "width": 30 + }, + { + "group": 2, + "height": 9, + "map": 6, + "name": "ROUTE_44", + "width": 30 + }, + { + "group": 2, + "height": 9, + "map": 7, + "name": "MAHOGANY_TOWN", + "width": 10 + }, + { + "group": 3, + "height": 8, + "map": 1, + "name": "SPROUT_TOWER_1F", + "width": 10 + }, + { + "group": 3, + "height": 8, + "map": 2, + "name": "SPROUT_TOWER_2F", + "width": 10 + }, + { + "group": 3, + "height": 8, + "map": 3, + "name": "SPROUT_TOWER_3F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 4, + "name": "TIN_TOWER_1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 5, + "name": "TIN_TOWER_2F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 6, + "name": "TIN_TOWER_3F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 7, + "name": "TIN_TOWER_4F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 8, + "name": "TIN_TOWER_5F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 9, + "name": "TIN_TOWER_6F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 10, + "name": "TIN_TOWER_7F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 11, + "name": "TIN_TOWER_8F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 12, + "name": "TIN_TOWER_9F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 13, + "name": "BURNED_TOWER_1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 14, + "name": "BURNED_TOWER_B1F", + "width": 10 + }, + { + "group": 3, + "height": 27, + "map": 15, + "name": "NATIONAL_PARK", + "width": 20 + }, + { + "group": 3, + "height": 27, + "map": 16, + "name": "NATIONAL_PARK_BUG_CONTEST", + "width": 20 + }, + { + "group": 3, + "height": 4, + "map": 17, + "name": "RADIO_TOWER_1F", + "width": 9 + }, + { + "group": 3, + "height": 4, + "map": 18, + "name": "RADIO_TOWER_2F", + "width": 9 + }, + { + "group": 3, + "height": 4, + "map": 19, + "name": "RADIO_TOWER_3F", + "width": 9 + }, + { + "group": 3, + "height": 4, + "map": 20, + "name": "RADIO_TOWER_4F", + "width": 9 + }, + { + "group": 3, + "height": 4, + "map": 21, + "name": "RADIO_TOWER_5F", + "width": 9 + }, + { + "group": 3, + "height": 18, + "map": 22, + "name": "RUINS_OF_ALPH_OUTSIDE", + "width": 10 + }, + { + "group": 3, + "height": 5, + "map": 23, + "name": "RUINS_OF_ALPH_HO_OH_CHAMBER", + "width": 4 + }, + { + "group": 3, + "height": 5, + "map": 24, + "name": "RUINS_OF_ALPH_KABUTO_CHAMBER", + "width": 4 + }, + { + "group": 3, + "height": 5, + "map": 25, + "name": "RUINS_OF_ALPH_OMANYTE_CHAMBER", + "width": 4 + }, + { + "group": 3, + "height": 5, + "map": 26, + "name": "RUINS_OF_ALPH_AERODACTYL_CHAMBER", + "width": 4 + }, + { + "group": 3, + "height": 14, + "map": 27, + "name": "RUINS_OF_ALPH_INNER_CHAMBER", + "width": 10 + }, + { + "group": 3, + "height": 4, + "map": 28, + "name": "RUINS_OF_ALPH_RESEARCH_CENTER", + "width": 4 + }, + { + "group": 3, + "height": 18, + "map": 29, + "name": "UNION_CAVE_1F", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 30, + "name": "UNION_CAVE_B1F", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 31, + "name": "UNION_CAVE_B2F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 32, + "name": "SLOWPOKE_WELL_B1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 33, + "name": "SLOWPOKE_WELL_B2F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 34, + "name": "OLIVINE_LIGHTHOUSE_1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 35, + "name": "OLIVINE_LIGHTHOUSE_2F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 36, + "name": "OLIVINE_LIGHTHOUSE_3F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 37, + "name": "OLIVINE_LIGHTHOUSE_4F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 38, + "name": "OLIVINE_LIGHTHOUSE_5F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 39, + "name": "OLIVINE_LIGHTHOUSE_6F", + "width": 10 + }, + { + "group": 3, + "height": 4, + "map": 40, + "name": "MAHOGANY_MART_1F", + "width": 4 + }, + { + "group": 3, + "height": 9, + "map": 41, + "name": "TEAM_ROCKET_BASE_B1F", + "width": 15 + }, + { + "group": 3, + "height": 9, + "map": 42, + "name": "TEAM_ROCKET_BASE_B2F", + "width": 15 + }, + { + "group": 3, + "height": 9, + "map": 43, + "name": "TEAM_ROCKET_BASE_B3F", + "width": 15 + }, + { + "group": 3, + "height": 27, + "map": 44, + "name": "ILEX_FOREST", + "width": 15 + }, + { + "group": 3, + "height": 18, + "map": 45, + "name": "GOLDENROD_UNDERGROUND", + "width": 15 + }, + { + "group": 3, + "height": 18, + "map": 46, + "name": "GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES", + "width": 15 + }, + { + "group": 3, + "height": 9, + "map": 47, + "name": "GOLDENROD_DEPT_STORE_B1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 48, + "name": "GOLDENROD_UNDERGROUND_WAREHOUSE", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 49, + "name": "MOUNT_MORTAR_1F_OUTSIDE", + "width": 20 + }, + { + "group": 3, + "height": 27, + "map": 50, + "name": "MOUNT_MORTAR_1F_INSIDE", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 51, + "name": "MOUNT_MORTAR_2F_INSIDE", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 52, + "name": "MOUNT_MORTAR_B1F", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 53, + "name": "ICE_PATH_1F", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 54, + "name": "ICE_PATH_B1F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 55, + "name": "ICE_PATH_B2F_MAHOGANY_SIDE", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 56, + "name": "ICE_PATH_B2F_BLACKTHORN_SIDE", + "width": 5 + }, + { + "group": 3, + "height": 9, + "map": 57, + "name": "ICE_PATH_B3F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 58, + "name": "WHIRL_ISLAND_NW", + "width": 5 + }, + { + "group": 3, + "height": 9, + "map": 59, + "name": "WHIRL_ISLAND_NE", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 60, + "name": "WHIRL_ISLAND_SW", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 61, + "name": "WHIRL_ISLAND_CAVE", + "width": 5 + }, + { + "group": 3, + "height": 9, + "map": 62, + "name": "WHIRL_ISLAND_SE", + "width": 5 + }, + { + "group": 3, + "height": 18, + "map": 63, + "name": "WHIRL_ISLAND_B1F", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 64, + "name": "WHIRL_ISLAND_B2F", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 65, + "name": "WHIRL_ISLAND_LUGIA_CHAMBER", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 66, + "name": "SILVER_CAVE_ROOM_1", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 67, + "name": "SILVER_CAVE_ROOM_2", + "width": 15 + }, + { + "group": 3, + "height": 18, + "map": 68, + "name": "SILVER_CAVE_ROOM_3", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 69, + "name": "SILVER_CAVE_ITEM_ROOMS", + "width": 10 + }, + { + "group": 3, + "height": 18, + "map": 70, + "name": "DARK_CAVE_VIOLET_ENTRANCE", + "width": 20 + }, + { + "group": 3, + "height": 18, + "map": 71, + "name": "DARK_CAVE_BLACKTHORN_ENTRANCE", + "width": 15 + }, + { + "group": 3, + "height": 9, + "map": 72, + "name": "DRAGONS_DEN_1F", + "width": 5 + }, + { + "group": 3, + "height": 18, + "map": 73, + "name": "DRAGONS_DEN_B1F", + "width": 20 + }, + { + "group": 3, + "height": 9, + "map": 74, + "name": "TOHJO_FALLS", + "width": 15 + }, + { + "group": 3, + "height": 18, + "map": 75, + "name": "DIGLETTS_CAVE", + "width": 10 + }, + { + "group": 3, + "height": 9, + "map": 76, + "name": "MOUNT_MOON", + "width": 15 + }, + { + "group": 3, + "height": 14, + "map": 77, + "name": "UNDERGROUND_PATH", + "width": 3 + }, + { + "group": 3, + "height": 18, + "map": 78, + "name": "ROCK_TUNNEL_1F", + "width": 15 + }, + { + "group": 3, + "height": 18, + "map": 79, + "name": "ROCK_TUNNEL_B1F", + "width": 15 + }, + { + "group": 3, + "height": 4, + "map": 80, + "name": "SAFARI_ZONE_FUCHSIA_GATE_BETA", + "width": 5 + }, + { + "group": 3, + "height": 18, + "map": 81, + "name": "SAFARI_ZONE_BETA", + "width": 10 + }, + { + "group": 3, + "height": 36, + "map": 82, + "name": "VICTORY_ROAD", + "width": 10 + }, + { + "group": 4, + "height": 9, + "map": 1, + "name": "ECRUTEAK_TIN_TOWER_ENTRANCE", + "width": 10 + }, + { + "group": 4, + "height": 4, + "map": 2, + "name": "ECRUTEAK_TIN_TOWER_BACK_ENTRANCE", + "width": 4 + }, + { + "group": 4, + "height": 4, + "map": 3, + "name": "ECRUTEAK_POKECENTER_1F", + "width": 5 + }, + { + "group": 4, + "height": 4, + "map": 4, + "name": "ECRUTEAK_LUGIA_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 4, + "height": 7, + "map": 5, + "name": "DANCE_THEATER", + "width": 6 + }, + { + "group": 4, + "height": 4, + "map": 6, + "name": "ECRUTEAK_MART", + "width": 6 + }, + { + "group": 4, + "height": 9, + "map": 7, + "name": "ECRUTEAK_GYM", + "width": 5 + }, + { + "group": 4, + "height": 4, + "map": 8, + "name": "ECRUTEAK_ITEMFINDER_HOUSE", + "width": 4 + }, + { + "group": 4, + "height": 18, + "map": 9, + "name": "ECRUTEAK_CITY", + "width": 20 + }, + { + "group": 5, + "height": 9, + "map": 1, + "name": "BLACKTHORN_GYM_1F", + "width": 5 + }, + { + "group": 5, + "height": 9, + "map": 2, + "name": "BLACKTHORN_GYM_2F", + "width": 5 + }, + { + "group": 5, + "height": 4, + "map": 3, + "name": "BLACKTHORN_DRAGON_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 5, + "height": 4, + "map": 4, + "name": "BLACKTHORN_EMYS_HOUSE", + "width": 4 + }, + { + "group": 5, + "height": 4, + "map": 5, + "name": "BLACKTHORN_MART", + "width": 6 + }, + { + "group": 5, + "height": 4, + "map": 6, + "name": "BLACKTHORN_POKECENTER_1F", + "width": 5 + }, + { + "group": 5, + "height": 4, + "map": 7, + "name": "MOVE_DELETERS_HOUSE", + "width": 4 + }, + { + "group": 5, + "height": 45, + "map": 8, + "name": "ROUTE_45", + "width": 10 + }, + { + "group": 5, + "height": 18, + "map": 9, + "name": "ROUTE_46", + "width": 10 + }, + { + "group": 5, + "height": 18, + "map": 10, + "name": "BLACKTHORN_CITY", + "width": 20 + }, + { + "group": 6, + "height": 4, + "map": 1, + "name": "CINNABAR_POKECENTER_1F", + "width": 5 + }, + { + "group": 6, + "height": 4, + "map": 2, + "name": "CINNABAR_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 6, + "height": 4, + "map": 3, + "name": "ROUTE_19_FUCHSIA_GATE", + "width": 5 + }, + { + "group": 6, + "height": 4, + "map": 4, + "name": "SEAFOAM_GYM", + "width": 5 + }, + { + "group": 6, + "height": 18, + "map": 5, + "name": "ROUTE_19", + "width": 10 + }, + { + "group": 6, + "height": 9, + "map": 6, + "name": "ROUTE_20", + "width": 30 + }, + { + "group": 6, + "height": 18, + "map": 7, + "name": "ROUTE_21", + "width": 10 + }, + { + "group": 6, + "height": 9, + "map": 8, + "name": "CINNABAR_ISLAND", + "width": 10 + }, + { + "group": 7, + "height": 4, + "map": 1, + "name": "CERULEAN_GYM_BADGE_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 7, + "height": 4, + "map": 2, + "name": "CERULEAN_POLICE_STATION", + "width": 4 + }, + { + "group": 7, + "height": 4, + "map": 3, + "name": "CERULEAN_TRADE_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 7, + "height": 4, + "map": 4, + "name": "CERULEAN_POKECENTER_1F", + "width": 5 + }, + { + "group": 7, + "height": 4, + "map": 5, + "name": "CERULEAN_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 7, + "height": 8, + "map": 6, + "name": "CERULEAN_GYM", + "width": 5 + }, + { + "group": 7, + "height": 4, + "map": 7, + "name": "CERULEAN_MART", + "width": 6 + }, + { + "group": 7, + "height": 4, + "map": 8, + "name": "ROUTE_10_POKECENTER_1F", + "width": 5 + }, + { + "group": 7, + "height": 4, + "map": 9, + "name": "ROUTE_10_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 7, + "height": 9, + "map": 10, + "name": "POWER_PLANT", + "width": 10 + }, + { + "group": 7, + "height": 4, + "map": 11, + "name": "BILLS_HOUSE", + "width": 4 + }, + { + "group": 7, + "height": 9, + "map": 12, + "name": "ROUTE_4", + "width": 20 + }, + { + "group": 7, + "height": 9, + "map": 13, + "name": "ROUTE_9", + "width": 30 + }, + { + "group": 7, + "height": 9, + "map": 14, + "name": "ROUTE_10_NORTH", + "width": 10 + }, + { + "group": 7, + "height": 9, + "map": 15, + "name": "ROUTE_24", + "width": 10 + }, + { + "group": 7, + "height": 9, + "map": 16, + "name": "ROUTE_25", + "width": 30 + }, + { + "group": 7, + "height": 18, + "map": 17, + "name": "CERULEAN_CITY", + "width": 20 + }, + { + "group": 8, + "height": 4, + "map": 1, + "name": "AZALEA_POKECENTER_1F", + "width": 5 + }, + { + "group": 8, + "height": 4, + "map": 2, + "name": "CHARCOAL_KILN", + "width": 4 + }, + { + "group": 8, + "height": 4, + "map": 3, + "name": "AZALEA_MART", + "width": 6 + }, + { + "group": 8, + "height": 4, + "map": 4, + "name": "KURTS_HOUSE", + "width": 8 + }, + { + "group": 8, + "height": 8, + "map": 5, + "name": "AZALEA_GYM", + "width": 5 + }, + { + "group": 8, + "height": 9, + "map": 6, + "name": "ROUTE_33", + "width": 10 + }, + { + "group": 8, + "height": 9, + "map": 7, + "name": "AZALEA_TOWN", + "width": 20 + }, + { + "group": 9, + "height": 4, + "map": 1, + "name": "LAKE_OF_RAGE_HIDDEN_POWER_HOUSE", + "width": 4 + }, + { + "group": 9, + "height": 4, + "map": 2, + "name": "LAKE_OF_RAGE_MAGIKARP_HOUSE", + "width": 4 + }, + { + "group": 9, + "height": 4, + "map": 3, + "name": "ROUTE_43_MAHOGANY_GATE", + "width": 5 + }, + { + "group": 9, + "height": 4, + "map": 4, + "name": "ROUTE_43_GATE", + "width": 5 + }, + { + "group": 9, + "height": 27, + "map": 5, + "name": "ROUTE_43", + "width": 10 + }, + { + "group": 9, + "height": 18, + "map": 6, + "name": "LAKE_OF_RAGE", + "width": 20 + }, + { + "group": 10, + "height": 45, + "map": 1, + "name": "ROUTE_32", + "width": 10 + }, + { + "group": 10, + "height": 18, + "map": 2, + "name": "ROUTE_35", + "width": 10 + }, + { + "group": 10, + "height": 9, + "map": 3, + "name": "ROUTE_36", + "width": 30 + }, + { + "group": 10, + "height": 9, + "map": 4, + "name": "ROUTE_37", + "width": 10 + }, + { + "group": 10, + "height": 18, + "map": 5, + "name": "VIOLET_CITY", + "width": 20 + }, + { + "group": 10, + "height": 4, + "map": 6, + "name": "VIOLET_MART", + "width": 6 + }, + { + "group": 10, + "height": 8, + "map": 7, + "name": "VIOLET_GYM", + "width": 5 + }, + { + "group": 10, + "height": 8, + "map": 8, + "name": "EARLS_POKEMON_ACADEMY", + "width": 4 + }, + { + "group": 10, + "height": 4, + "map": 9, + "name": "VIOLET_NICKNAME_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 10, + "height": 4, + "map": 10, + "name": "VIOLET_POKECENTER_1F", + "width": 5 + }, + { + "group": 10, + "height": 4, + "map": 11, + "name": "VIOLET_KYLES_HOUSE", + "width": 4 + }, + { + "group": 10, + "height": 4, + "map": 12, + "name": "ROUTE_32_RUINS_OF_ALPH_GATE", + "width": 5 + }, + { + "group": 10, + "height": 4, + "map": 13, + "name": "ROUTE_32_POKECENTER_1F", + "width": 5 + }, + { + "group": 10, + "height": 4, + "map": 14, + "name": "ROUTE_35_GOLDENROD_GATE", + "width": 5 + }, + { + "group": 10, + "height": 4, + "map": 15, + "name": "ROUTE_35_NATIONAL_PARK_GATE", + "width": 4 + }, + { + "group": 10, + "height": 4, + "map": 16, + "name": "ROUTE_36_RUINS_OF_ALPH_GATE", + "width": 5 + }, + { + "group": 10, + "height": 4, + "map": 17, + "name": "ROUTE_36_NATIONAL_PARK_GATE", + "width": 5 + }, + { + "group": 11, + "height": 27, + "map": 1, + "name": "ROUTE_34", + "width": 10 + }, + { + "group": 11, + "height": 18, + "map": 2, + "name": "GOLDENROD_CITY", + "width": 20 + }, + { + "group": 11, + "height": 9, + "map": 3, + "name": "GOLDENROD_GYM", + "width": 10 + }, + { + "group": 11, + "height": 4, + "map": 4, + "name": "GOLDENROD_BIKE_SHOP", + "width": 4 + }, + { + "group": 11, + "height": 4, + "map": 5, + "name": "GOLDENROD_HAPPINESS_RATER", + "width": 4 + }, + { + "group": 11, + "height": 4, + "map": 6, + "name": "BILLS_FAMILYS_HOUSE", + "width": 4 + }, + { + "group": 11, + "height": 9, + "map": 7, + "name": "GOLDENROD_MAGNET_TRAIN_STATION", + "width": 10 + }, + { + "group": 11, + "height": 4, + "map": 8, + "name": "GOLDENROD_FLOWER_SHOP", + "width": 4 + }, + { + "group": 11, + "height": 4, + "map": 9, + "name": "GOLDENROD_POKECENTER_1F", + "width": 5 + }, + { + "group": 11, + "height": 4, + "map": 10, + "name": "GOLDENROD_PP_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 11, + "height": 4, + "map": 11, + "name": "GOLDENROD_NAME_RATER", + "width": 4 + }, + { + "group": 11, + "height": 4, + "map": 12, + "name": "GOLDENROD_DEPT_STORE_1F", + "width": 8 + }, + { + "group": 11, + "height": 4, + "map": 13, + "name": "GOLDENROD_DEPT_STORE_2F", + "width": 8 + }, + { + "group": 11, + "height": 4, + "map": 14, + "name": "GOLDENROD_DEPT_STORE_3F", + "width": 8 + }, + { + "group": 11, + "height": 4, + "map": 15, + "name": "GOLDENROD_DEPT_STORE_4F", + "width": 8 + }, + { + "group": 11, + "height": 4, + "map": 16, + "name": "GOLDENROD_DEPT_STORE_5F", + "width": 8 + }, + { + "group": 11, + "height": 4, + "map": 17, + "name": "GOLDENROD_DEPT_STORE_6F", + "width": 8 + }, + { + "group": 11, + "height": 2, + "map": 18, + "name": "GOLDENROD_DEPT_STORE_ELEVATOR", + "width": 2 + }, + { + "group": 11, + "height": 7, + "map": 19, + "name": "GOLDENROD_GAME_CORNER", + "width": 10 + }, + { + "group": 11, + "height": 4, + "map": 20, + "name": "ILEX_FOREST_AZALEA_GATE", + "width": 5 + }, + { + "group": 11, + "height": 4, + "map": 21, + "name": "ROUTE_34_ILEX_FOREST_GATE", + "width": 5 + }, + { + "group": 11, + "height": 4, + "map": 22, + "name": "DAY_CARE", + "width": 5 + }, + { + "group": 12, + "height": 9, + "map": 1, + "name": "ROUTE_6", + "width": 10 + }, + { + "group": 12, + "height": 9, + "map": 2, + "name": "ROUTE_11", + "width": 20 + }, + { + "group": 12, + "height": 18, + "map": 3, + "name": "VERMILION_CITY", + "width": 20 + }, + { + "group": 12, + "height": 4, + "map": 4, + "name": "VERMILION_FISHING_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 12, + "height": 4, + "map": 5, + "name": "VERMILION_POKECENTER_1F", + "width": 5 + }, + { + "group": 12, + "height": 4, + "map": 6, + "name": "VERMILION_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 12, + "height": 4, + "map": 7, + "name": "POKEMON_FAN_CLUB", + "width": 5 + }, + { + "group": 12, + "height": 4, + "map": 8, + "name": "VERMILION_MAGNET_TRAIN_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 12, + "height": 4, + "map": 9, + "name": "VERMILION_MART", + "width": 6 + }, + { + "group": 12, + "height": 4, + "map": 10, + "name": "VERMILION_DIGLETTS_CAVE_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 12, + "height": 9, + "map": 11, + "name": "VERMILION_GYM", + "width": 5 + }, + { + "group": 12, + "height": 4, + "map": 12, + "name": "ROUTE_6_SAFFRON_GATE", + "width": 5 + }, + { + "group": 12, + "height": 4, + "map": 13, + "name": "ROUTE_6_UNDERGROUND_PATH_ENTRANCE", + "width": 4 + }, + { + "group": 13, + "height": 18, + "map": 1, + "name": "ROUTE_1", + "width": 10 + }, + { + "group": 13, + "height": 9, + "map": 2, + "name": "PALLET_TOWN", + "width": 10 + }, + { + "group": 13, + "height": 4, + "map": 3, + "name": "REDS_HOUSE_1F", + "width": 4 + }, + { + "group": 13, + "height": 4, + "map": 4, + "name": "REDS_HOUSE_2F", + "width": 4 + }, + { + "group": 13, + "height": 4, + "map": 5, + "name": "BLUES_HOUSE", + "width": 4 + }, + { + "group": 13, + "height": 6, + "map": 6, + "name": "OAKS_LAB", + "width": 5 + }, + { + "group": 14, + "height": 9, + "map": 1, + "name": "ROUTE_3", + "width": 30 + }, + { + "group": 14, + "height": 18, + "map": 2, + "name": "PEWTER_CITY", + "width": 20 + }, + { + "group": 14, + "height": 4, + "map": 3, + "name": "PEWTER_NIDORAN_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 14, + "height": 7, + "map": 4, + "name": "PEWTER_GYM", + "width": 5 + }, + { + "group": 14, + "height": 4, + "map": 5, + "name": "PEWTER_MART", + "width": 6 + }, + { + "group": 14, + "height": 4, + "map": 6, + "name": "PEWTER_POKECENTER_1F", + "width": 5 + }, + { + "group": 14, + "height": 4, + "map": 7, + "name": "PEWTER_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 14, + "height": 4, + "map": 8, + "name": "PEWTER_SNOOZE_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 15, + "height": 18, + "map": 1, + "name": "OLIVINE_PORT", + "width": 10 + }, + { + "group": 15, + "height": 18, + "map": 2, + "name": "VERMILION_PORT", + "width": 10 + }, + { + "group": 15, + "height": 9, + "map": 3, + "name": "FAST_SHIP_1F", + "width": 16 + }, + { + "group": 15, + "height": 16, + "map": 4, + "name": "FAST_SHIP_CABINS_NNW_NNE_NE", + "width": 4 + }, + { + "group": 15, + "height": 16, + "map": 5, + "name": "FAST_SHIP_CABINS_SW_SSW_NW", + "width": 4 + }, + { + "group": 15, + "height": 17, + "map": 6, + "name": "FAST_SHIP_CABINS_SE_SSE_CAPTAINS_CABIN", + "width": 5 + }, + { + "group": 15, + "height": 8, + "map": 7, + "name": "FAST_SHIP_B1F", + "width": 16 + }, + { + "group": 15, + "height": 9, + "map": 8, + "name": "OLIVINE_PORT_PASSAGE", + "width": 10 + }, + { + "group": 15, + "height": 9, + "map": 9, + "name": "VERMILION_PORT_PASSAGE", + "width": 10 + }, + { + "group": 15, + "height": 9, + "map": 10, + "name": "MOUNT_MOON_SQUARE", + "width": 15 + }, + { + "group": 15, + "height": 4, + "map": 11, + "name": "MOUNT_MOON_GIFT_SHOP", + "width": 4 + }, + { + "group": 15, + "height": 9, + "map": 12, + "name": "TIN_TOWER_ROOF", + "width": 10 + }, + { + "group": 16, + "height": 9, + "map": 1, + "name": "ROUTE_23", + "width": 10 + }, + { + "group": 16, + "height": 7, + "map": 2, + "name": "INDIGO_PLATEAU_POKECENTER_1F", + "width": 9 + }, + { + "group": 16, + "height": 9, + "map": 3, + "name": "WILLS_ROOM", + "width": 5 + }, + { + "group": 16, + "height": 9, + "map": 4, + "name": "KOGAS_ROOM", + "width": 5 + }, + { + "group": 16, + "height": 9, + "map": 5, + "name": "BRUNOS_ROOM", + "width": 5 + }, + { + "group": 16, + "height": 9, + "map": 6, + "name": "KARENS_ROOM", + "width": 5 + }, + { + "group": 16, + "height": 12, + "map": 7, + "name": "LANCES_ROOM", + "width": 5 + }, + { + "group": 16, + "height": 7, + "map": 8, + "name": "HALL_OF_FAME", + "width": 5 + }, + { + "group": 17, + "height": 9, + "map": 1, + "name": "ROUTE_13", + "width": 30 + }, + { + "group": 17, + "height": 18, + "map": 2, + "name": "ROUTE_14", + "width": 10 + }, + { + "group": 17, + "height": 9, + "map": 3, + "name": "ROUTE_15", + "width": 20 + }, + { + "group": 17, + "height": 9, + "map": 4, + "name": "ROUTE_18", + "width": 10 + }, + { + "group": 17, + "height": 18, + "map": 5, + "name": "FUCHSIA_CITY", + "width": 20 + }, + { + "group": 17, + "height": 4, + "map": 6, + "name": "FUCHSIA_MART", + "width": 6 + }, + { + "group": 17, + "height": 4, + "map": 7, + "name": "SAFARI_ZONE_MAIN_OFFICE", + "width": 4 + }, + { + "group": 17, + "height": 9, + "map": 8, + "name": "FUCHSIA_GYM", + "width": 5 + }, + { + "group": 17, + "height": 4, + "map": 9, + "name": "BILLS_OLDER_SISTERS_HOUSE", + "width": 4 + }, + { + "group": 17, + "height": 4, + "map": 10, + "name": "FUCHSIA_POKECENTER_1F", + "width": 5 + }, + { + "group": 17, + "height": 4, + "map": 11, + "name": "FUCHSIA_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 17, + "height": 4, + "map": 12, + "name": "SAFARI_ZONE_WARDENS_HOME", + "width": 5 + }, + { + "group": 17, + "height": 4, + "map": 13, + "name": "ROUTE_15_FUCHSIA_GATE", + "width": 5 + }, + { + "group": 18, + "height": 9, + "map": 1, + "name": "ROUTE_8", + "width": 20 + }, + { + "group": 18, + "height": 27, + "map": 2, + "name": "ROUTE_12", + "width": 10 + }, + { + "group": 18, + "height": 9, + "map": 3, + "name": "ROUTE_10_SOUTH", + "width": 10 + }, + { + "group": 18, + "height": 9, + "map": 4, + "name": "LAVENDER_TOWN", + "width": 10 + }, + { + "group": 18, + "height": 4, + "map": 5, + "name": "LAVENDER_POKECENTER_1F", + "width": 5 + }, + { + "group": 18, + "height": 4, + "map": 6, + "name": "LAVENDER_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 18, + "height": 4, + "map": 7, + "name": "MR_FUJIS_HOUSE", + "width": 5 + }, + { + "group": 18, + "height": 4, + "map": 8, + "name": "LAVENDER_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 18, + "height": 4, + "map": 9, + "name": "LAVENDER_NAME_RATER", + "width": 4 + }, + { + "group": 18, + "height": 4, + "map": 10, + "name": "LAVENDER_MART", + "width": 6 + }, + { + "group": 18, + "height": 4, + "map": 11, + "name": "SOUL_HOUSE", + "width": 5 + }, + { + "group": 18, + "height": 4, + "map": 12, + "name": "LAV_RADIO_TOWER_1F", + "width": 10 + }, + { + "group": 18, + "height": 4, + "map": 13, + "name": "ROUTE_8_SAFFRON_GATE", + "width": 5 + }, + { + "group": 18, + "height": 4, + "map": 14, + "name": "ROUTE_12_SUPER_ROD_HOUSE", + "width": 4 + }, + { + "group": 19, + "height": 9, + "map": 1, + "name": "ROUTE_28", + "width": 20 + }, + { + "group": 19, + "height": 18, + "map": 2, + "name": "SILVER_CAVE_OUTSIDE", + "width": 20 + }, + { + "group": 19, + "height": 4, + "map": 3, + "name": "SILVER_CAVE_POKECENTER_1F", + "width": 5 + }, + { + "group": 19, + "height": 4, + "map": 4, + "name": "ROUTE_28_STEEL_WING_HOUSE", + "width": 4 + }, + { + "group": 20, + "height": 4, + "map": 1, + "name": "POKECENTER_2F", + "width": 8 + }, + { + "group": 20, + "height": 4, + "map": 2, + "name": "TRADE_CENTER", + "width": 5 + }, + { + "group": 20, + "height": 4, + "map": 3, + "name": "COLOSSEUM", + "width": 5 + }, + { + "group": 20, + "height": 4, + "map": 4, + "name": "TIME_CAPSULE", + "width": 5 + }, + { + "group": 21, + "height": 9, + "map": 1, + "name": "ROUTE_7", + "width": 10 + }, + { + "group": 21, + "height": 9, + "map": 2, + "name": "ROUTE_16", + "width": 10 + }, + { + "group": 21, + "height": 45, + "map": 3, + "name": "ROUTE_17", + "width": 10 + }, + { + "group": 21, + "height": 18, + "map": 4, + "name": "CELADON_CITY", + "width": 20 + }, + { + "group": 21, + "height": 4, + "map": 5, + "name": "CELADON_DEPT_STORE_1F", + "width": 8 + }, + { + "group": 21, + "height": 4, + "map": 6, + "name": "CELADON_DEPT_STORE_2F", + "width": 8 + }, + { + "group": 21, + "height": 4, + "map": 7, + "name": "CELADON_DEPT_STORE_3F", + "width": 8 + }, + { + "group": 21, + "height": 4, + "map": 8, + "name": "CELADON_DEPT_STORE_4F", + "width": 8 + }, + { + "group": 21, + "height": 4, + "map": 9, + "name": "CELADON_DEPT_STORE_5F", + "width": 8 + }, + { + "group": 21, + "height": 4, + "map": 10, + "name": "CELADON_DEPT_STORE_6F", + "width": 8 + }, + { + "group": 21, + "height": 2, + "map": 11, + "name": "CELADON_DEPT_STORE_ELEVATOR", + "width": 2 + }, + { + "group": 21, + "height": 5, + "map": 12, + "name": "CELADON_MANSION_1F", + "width": 4 + }, + { + "group": 21, + "height": 5, + "map": 13, + "name": "CELADON_MANSION_2F", + "width": 4 + }, + { + "group": 21, + "height": 5, + "map": 14, + "name": "CELADON_MANSION_3F", + "width": 4 + }, + { + "group": 21, + "height": 5, + "map": 15, + "name": "CELADON_MANSION_ROOF", + "width": 4 + }, + { + "group": 21, + "height": 4, + "map": 16, + "name": "CELADON_MANSION_ROOF_HOUSE", + "width": 4 + }, + { + "group": 21, + "height": 4, + "map": 17, + "name": "CELADON_POKECENTER_1F", + "width": 5 + }, + { + "group": 21, + "height": 4, + "map": 18, + "name": "CELADON_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 21, + "height": 7, + "map": 19, + "name": "CELADON_GAME_CORNER", + "width": 10 + }, + { + "group": 21, + "height": 3, + "map": 20, + "name": "CELADON_GAME_CORNER_PRIZE_ROOM", + "width": 3 + }, + { + "group": 21, + "height": 9, + "map": 21, + "name": "CELADON_GYM", + "width": 5 + }, + { + "group": 21, + "height": 4, + "map": 22, + "name": "CELADON_CAFE", + "width": 6 + }, + { + "group": 21, + "height": 4, + "map": 23, + "name": "ROUTE_16_FUCHSIA_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 21, + "height": 4, + "map": 24, + "name": "ROUTE_16_GATE", + "width": 5 + }, + { + "group": 21, + "height": 4, + "map": 25, + "name": "ROUTE_7_SAFFRON_GATE", + "width": 5 + }, + { + "group": 21, + "height": 4, + "map": 26, + "name": "ROUTE_17_ROUTE_18_GATE", + "width": 5 + }, + { + "group": 22, + "height": 18, + "map": 1, + "name": "ROUTE_40", + "width": 10 + }, + { + "group": 22, + "height": 27, + "map": 2, + "name": "ROUTE_41", + "width": 25 + }, + { + "group": 22, + "height": 27, + "map": 3, + "name": "CIANWOOD_CITY", + "width": 15 + }, + { + "group": 22, + "height": 4, + "map": 4, + "name": "MANIAS_HOUSE", + "width": 4 + }, + { + "group": 22, + "height": 9, + "map": 5, + "name": "CIANWOOD_GYM", + "width": 5 + }, + { + "group": 22, + "height": 4, + "map": 6, + "name": "CIANWOOD_POKECENTER_1F", + "width": 5 + }, + { + "group": 22, + "height": 4, + "map": 7, + "name": "CIANWOOD_PHARMACY", + "width": 4 + }, + { + "group": 22, + "height": 4, + "map": 8, + "name": "CIANWOOD_PHOTO_STUDIO", + "width": 4 + }, + { + "group": 22, + "height": 4, + "map": 9, + "name": "CIANWOOD_LUGIA_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 23, + "height": 27, + "map": 1, + "name": "ROUTE_2", + "width": 10 + }, + { + "group": 23, + "height": 9, + "map": 2, + "name": "ROUTE_22", + "width": 20 + }, + { + "group": 23, + "height": 18, + "map": 3, + "name": "VIRIDIAN_CITY", + "width": 20 + }, + { + "group": 23, + "height": 9, + "map": 4, + "name": "VIRIDIAN_GYM", + "width": 5 + }, + { + "group": 23, + "height": 4, + "map": 5, + "name": "VIRIDIAN_NICKNAME_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 23, + "height": 7, + "map": 6, + "name": "TRAINER_HOUSE_1F", + "width": 5 + }, + { + "group": 23, + "height": 8, + "map": 7, + "name": "TRAINER_HOUSE_B1F", + "width": 5 + }, + { + "group": 23, + "height": 4, + "map": 8, + "name": "VIRIDIAN_MART", + "width": 6 + }, + { + "group": 23, + "height": 4, + "map": 9, + "name": "VIRIDIAN_POKECENTER_1F", + "width": 5 + }, + { + "group": 23, + "height": 4, + "map": 10, + "name": "VIRIDIAN_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 23, + "height": 4, + "map": 11, + "name": "ROUTE_2_NUGGET_HOUSE", + "width": 4 + }, + { + "group": 23, + "height": 4, + "map": 12, + "name": "ROUTE_2_GATE", + "width": 5 + }, + { + "group": 23, + "height": 9, + "map": 13, + "name": "VICTORY_ROAD_GATE", + "width": 10 + }, + { + "group": 24, + "height": 54, + "map": 1, + "name": "ROUTE_26", + "width": 10 + }, + { + "group": 24, + "height": 9, + "map": 2, + "name": "ROUTE_27", + "width": 40 + }, + { + "group": 24, + "height": 9, + "map": 3, + "name": "ROUTE_29", + "width": 30 + }, + { + "group": 24, + "height": 9, + "map": 4, + "name": "NEW_BARK_TOWN", + "width": 10 + }, + { + "group": 24, + "height": 6, + "map": 5, + "name": "ELMS_LAB", + "width": 5 + }, + { + "group": 24, + "height": 4, + "map": 6, + "name": "PLAYERS_HOUSE_1F", + "width": 5 + }, + { + "group": 24, + "height": 3, + "map": 7, + "name": "PLAYERS_HOUSE_2F", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 8, + "name": "PLAYERS_NEIGHBORS_HOUSE", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 9, + "name": "ELMS_HOUSE", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 10, + "name": "ROUTE_26_HEAL_HOUSE", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 11, + "name": "DAY_OF_WEEK_SIBLINGS_HOUSE", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 12, + "name": "ROUTE_27_SANDSTORM_HOUSE", + "width": 4 + }, + { + "group": 24, + "height": 4, + "map": 13, + "name": "ROUTE_29_ROUTE_46_GATE", + "width": 5 + }, + { + "group": 25, + "height": 9, + "map": 1, + "name": "ROUTE_5", + "width": 10 + }, + { + "group": 25, + "height": 18, + "map": 2, + "name": "SAFFRON_CITY", + "width": 20 + }, + { + "group": 25, + "height": 6, + "map": 3, + "name": "FIGHTING_DOJO", + "width": 5 + }, + { + "group": 25, + "height": 9, + "map": 4, + "name": "SAFFRON_GYM", + "width": 10 + }, + { + "group": 25, + "height": 4, + "map": 5, + "name": "SAFFRON_MART", + "width": 6 + }, + { + "group": 25, + "height": 4, + "map": 6, + "name": "SAFFRON_POKECENTER_1F", + "width": 5 + }, + { + "group": 25, + "height": 4, + "map": 7, + "name": "SAFFRON_POKECENTER_2F_BETA", + "width": 8 + }, + { + "group": 25, + "height": 4, + "map": 8, + "name": "MR_PSYCHICS_HOUSE", + "width": 4 + }, + { + "group": 25, + "height": 9, + "map": 9, + "name": "SAFFRON_MAGNET_TRAIN_STATION", + "width": 10 + }, + { + "group": 25, + "height": 4, + "map": 10, + "name": "SILPH_CO_1F", + "width": 8 + }, + { + "group": 25, + "height": 4, + "map": 11, + "name": "COPYCATS_HOUSE_1F", + "width": 4 + }, + { + "group": 25, + "height": 3, + "map": 12, + "name": "COPYCATS_HOUSE_2F", + "width": 5 + }, + { + "group": 25, + "height": 4, + "map": 13, + "name": "ROUTE_5_UNDERGROUND_PATH_ENTRANCE", + "width": 4 + }, + { + "group": 25, + "height": 4, + "map": 14, + "name": "ROUTE_5_SAFFRON_GATE", + "width": 5 + }, + { + "group": 25, + "height": 4, + "map": 15, + "name": "ROUTE_5_CLEANSE_TAG_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 27, + "map": 1, + "name": "ROUTE_30", + "width": 10 + }, + { + "group": 26, + "height": 9, + "map": 2, + "name": "ROUTE_31", + "width": 20 + }, + { + "group": 26, + "height": 9, + "map": 3, + "name": "CHERRYGROVE_CITY", + "width": 20 + }, + { + "group": 26, + "height": 4, + "map": 4, + "name": "CHERRYGROVE_MART", + "width": 6 + }, + { + "group": 26, + "height": 4, + "map": 5, + "name": "CHERRYGROVE_POKECENTER_1F", + "width": 5 + }, + { + "group": 26, + "height": 4, + "map": 6, + "name": "CHERRYGROVE_GYM_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 4, + "map": 7, + "name": "GUIDE_GENTS_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 4, + "map": 8, + "name": "CHERRYGROVE_EVOLUTION_SPEECH_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 4, + "map": 9, + "name": "ROUTE_30_BERRY_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 4, + "map": 10, + "name": "MR_POKEMONS_HOUSE", + "width": 4 + }, + { + "group": 26, + "height": 4, + "map": 11, + "name": "ROUTE_31_VIOLET_GATE", + "width": 5 + } + ], + "mapOrder": [ + "OLIVINE_POKECENTER_1F", + "OLIVINE_GYM", + "OLIVINE_TIMS_HOUSE", + "OLIVINE_HOUSE_BETA", + "OLIVINE_PUNISHMENT_SPEECH_HOUSE", + "OLIVINE_GOOD_ROD_HOUSE", + "OLIVINE_CAFE", + "OLIVINE_MART", + "ROUTE_38_ECRUTEAK_GATE", + "ROUTE_39_BARN", + "ROUTE_39_FARMHOUSE", + "ROUTE_38", + "ROUTE_39", + "OLIVINE_CITY", + "MAHOGANY_RED_GYARADOS_SPEECH_HOUSE", + "MAHOGANY_GYM", + "MAHOGANY_POKECENTER_1F", + "ROUTE_42_ECRUTEAK_GATE", + "ROUTE_42", + "ROUTE_44", + "MAHOGANY_TOWN", + "SPROUT_TOWER_1F", + "SPROUT_TOWER_2F", + "SPROUT_TOWER_3F", + "TIN_TOWER_1F", + "TIN_TOWER_2F", + "TIN_TOWER_3F", + "TIN_TOWER_4F", + "TIN_TOWER_5F", + "TIN_TOWER_6F", + "TIN_TOWER_7F", + "TIN_TOWER_8F", + "TIN_TOWER_9F", + "BURNED_TOWER_1F", + "BURNED_TOWER_B1F", + "NATIONAL_PARK", + "NATIONAL_PARK_BUG_CONTEST", + "RADIO_TOWER_1F", + "RADIO_TOWER_2F", + "RADIO_TOWER_3F", + "RADIO_TOWER_4F", + "RADIO_TOWER_5F", + "RUINS_OF_ALPH_OUTSIDE", + "RUINS_OF_ALPH_HO_OH_CHAMBER", + "RUINS_OF_ALPH_KABUTO_CHAMBER", + "RUINS_OF_ALPH_OMANYTE_CHAMBER", + "RUINS_OF_ALPH_AERODACTYL_CHAMBER", + "RUINS_OF_ALPH_INNER_CHAMBER", + "RUINS_OF_ALPH_RESEARCH_CENTER", + "UNION_CAVE_1F", + "UNION_CAVE_B1F", + "UNION_CAVE_B2F", + "SLOWPOKE_WELL_B1F", + "SLOWPOKE_WELL_B2F", + "OLIVINE_LIGHTHOUSE_1F", + "OLIVINE_LIGHTHOUSE_2F", + "OLIVINE_LIGHTHOUSE_3F", + "OLIVINE_LIGHTHOUSE_4F", + "OLIVINE_LIGHTHOUSE_5F", + "OLIVINE_LIGHTHOUSE_6F", + "MAHOGANY_MART_1F", + "TEAM_ROCKET_BASE_B1F", + "TEAM_ROCKET_BASE_B2F", + "TEAM_ROCKET_BASE_B3F", + "ILEX_FOREST", + "GOLDENROD_UNDERGROUND", + "GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES", + "GOLDENROD_DEPT_STORE_B1F", + "GOLDENROD_UNDERGROUND_WAREHOUSE", + "MOUNT_MORTAR_1F_OUTSIDE", + "MOUNT_MORTAR_1F_INSIDE", + "MOUNT_MORTAR_2F_INSIDE", + "MOUNT_MORTAR_B1F", + "ICE_PATH_1F", + "ICE_PATH_B1F", + "ICE_PATH_B2F_MAHOGANY_SIDE", + "ICE_PATH_B2F_BLACKTHORN_SIDE", + "ICE_PATH_B3F", + "WHIRL_ISLAND_NW", + "WHIRL_ISLAND_NE", + "WHIRL_ISLAND_SW", + "WHIRL_ISLAND_CAVE", + "WHIRL_ISLAND_SE", + "WHIRL_ISLAND_B1F", + "WHIRL_ISLAND_B2F", + "WHIRL_ISLAND_LUGIA_CHAMBER", + "SILVER_CAVE_ROOM_1", + "SILVER_CAVE_ROOM_2", + "SILVER_CAVE_ROOM_3", + "SILVER_CAVE_ITEM_ROOMS", + "DARK_CAVE_VIOLET_ENTRANCE", + "DARK_CAVE_BLACKTHORN_ENTRANCE", + "DRAGONS_DEN_1F", + "DRAGONS_DEN_B1F", + "TOHJO_FALLS", + "DIGLETTS_CAVE", + "MOUNT_MOON", + "UNDERGROUND_PATH", + "ROCK_TUNNEL_1F", + "ROCK_TUNNEL_B1F", + "SAFARI_ZONE_FUCHSIA_GATE_BETA", + "SAFARI_ZONE_BETA", + "VICTORY_ROAD", + "ECRUTEAK_TIN_TOWER_ENTRANCE", + "ECRUTEAK_TIN_TOWER_BACK_ENTRANCE", + "ECRUTEAK_POKECENTER_1F", + "ECRUTEAK_LUGIA_SPEECH_HOUSE", + "DANCE_THEATER", + "ECRUTEAK_MART", + "ECRUTEAK_GYM", + "ECRUTEAK_ITEMFINDER_HOUSE", + "ECRUTEAK_CITY", + "BLACKTHORN_GYM_1F", + "BLACKTHORN_GYM_2F", + "BLACKTHORN_DRAGON_SPEECH_HOUSE", + "BLACKTHORN_EMYS_HOUSE", + "BLACKTHORN_MART", + "BLACKTHORN_POKECENTER_1F", + "MOVE_DELETERS_HOUSE", + "ROUTE_45", + "ROUTE_46", + "BLACKTHORN_CITY", + "CINNABAR_POKECENTER_1F", + "CINNABAR_POKECENTER_2F_BETA", + "ROUTE_19_FUCHSIA_GATE", + "SEAFOAM_GYM", + "ROUTE_19", + "ROUTE_20", + "ROUTE_21", + "CINNABAR_ISLAND", + "CERULEAN_GYM_BADGE_SPEECH_HOUSE", + "CERULEAN_POLICE_STATION", + "CERULEAN_TRADE_SPEECH_HOUSE", + "CERULEAN_POKECENTER_1F", + "CERULEAN_POKECENTER_2F_BETA", + "CERULEAN_GYM", + "CERULEAN_MART", + "ROUTE_10_POKECENTER_1F", + "ROUTE_10_POKECENTER_2F_BETA", + "POWER_PLANT", + "BILLS_HOUSE", + "ROUTE_4", + "ROUTE_9", + "ROUTE_10_NORTH", + "ROUTE_24", + "ROUTE_25", + "CERULEAN_CITY", + "AZALEA_POKECENTER_1F", + "CHARCOAL_KILN", + "AZALEA_MART", + "KURTS_HOUSE", + "AZALEA_GYM", + "ROUTE_33", + "AZALEA_TOWN", + "LAKE_OF_RAGE_HIDDEN_POWER_HOUSE", + "LAKE_OF_RAGE_MAGIKARP_HOUSE", + "ROUTE_43_MAHOGANY_GATE", + "ROUTE_43_GATE", + "ROUTE_43", + "LAKE_OF_RAGE", + "ROUTE_32", + "ROUTE_35", + "ROUTE_36", + "ROUTE_37", + "VIOLET_CITY", + "VIOLET_MART", + "VIOLET_GYM", + "EARLS_POKEMON_ACADEMY", + "VIOLET_NICKNAME_SPEECH_HOUSE", + "VIOLET_POKECENTER_1F", + "VIOLET_KYLES_HOUSE", + "ROUTE_32_RUINS_OF_ALPH_GATE", + "ROUTE_32_POKECENTER_1F", + "ROUTE_35_GOLDENROD_GATE", + "ROUTE_35_NATIONAL_PARK_GATE", + "ROUTE_36_RUINS_OF_ALPH_GATE", + "ROUTE_36_NATIONAL_PARK_GATE", + "ROUTE_34", + "GOLDENROD_CITY", + "GOLDENROD_GYM", + "GOLDENROD_BIKE_SHOP", + "GOLDENROD_HAPPINESS_RATER", + "BILLS_FAMILYS_HOUSE", + "GOLDENROD_MAGNET_TRAIN_STATION", + "GOLDENROD_FLOWER_SHOP", + "GOLDENROD_POKECENTER_1F", + "GOLDENROD_PP_SPEECH_HOUSE", + "GOLDENROD_NAME_RATER", + "GOLDENROD_DEPT_STORE_1F", + "GOLDENROD_DEPT_STORE_2F", + "GOLDENROD_DEPT_STORE_3F", + "GOLDENROD_DEPT_STORE_4F", + "GOLDENROD_DEPT_STORE_5F", + "GOLDENROD_DEPT_STORE_6F", + "GOLDENROD_DEPT_STORE_ELEVATOR", + "GOLDENROD_GAME_CORNER", + "ILEX_FOREST_AZALEA_GATE", + "ROUTE_34_ILEX_FOREST_GATE", + "DAY_CARE", + "ROUTE_6", + "ROUTE_11", + "VERMILION_CITY", + "VERMILION_FISHING_SPEECH_HOUSE", + "VERMILION_POKECENTER_1F", + "VERMILION_POKECENTER_2F_BETA", + "POKEMON_FAN_CLUB", + "VERMILION_MAGNET_TRAIN_SPEECH_HOUSE", + "VERMILION_MART", + "VERMILION_DIGLETTS_CAVE_SPEECH_HOUSE", + "VERMILION_GYM", + "ROUTE_6_SAFFRON_GATE", + "ROUTE_6_UNDERGROUND_PATH_ENTRANCE", + "ROUTE_1", + "PALLET_TOWN", + "REDS_HOUSE_1F", + "REDS_HOUSE_2F", + "BLUES_HOUSE", + "OAKS_LAB", + "ROUTE_3", + "PEWTER_CITY", + "PEWTER_NIDORAN_SPEECH_HOUSE", + "PEWTER_GYM", + "PEWTER_MART", + "PEWTER_POKECENTER_1F", + "PEWTER_POKECENTER_2F_BETA", + "PEWTER_SNOOZE_SPEECH_HOUSE", + "OLIVINE_PORT", + "VERMILION_PORT", + "FAST_SHIP_1F", + "FAST_SHIP_CABINS_NNW_NNE_NE", + "FAST_SHIP_CABINS_SW_SSW_NW", + "FAST_SHIP_CABINS_SE_SSE_CAPTAINS_CABIN", + "FAST_SHIP_B1F", + "OLIVINE_PORT_PASSAGE", + "VERMILION_PORT_PASSAGE", + "MOUNT_MOON_SQUARE", + "MOUNT_MOON_GIFT_SHOP", + "TIN_TOWER_ROOF", + "ROUTE_23", + "INDIGO_PLATEAU_POKECENTER_1F", + "WILLS_ROOM", + "KOGAS_ROOM", + "BRUNOS_ROOM", + "KARENS_ROOM", + "LANCES_ROOM", + "HALL_OF_FAME", + "ROUTE_13", + "ROUTE_14", + "ROUTE_15", + "ROUTE_18", + "FUCHSIA_CITY", + "FUCHSIA_MART", + "SAFARI_ZONE_MAIN_OFFICE", + "FUCHSIA_GYM", + "BILLS_OLDER_SISTERS_HOUSE", + "FUCHSIA_POKECENTER_1F", + "FUCHSIA_POKECENTER_2F_BETA", + "SAFARI_ZONE_WARDENS_HOME", + "ROUTE_15_FUCHSIA_GATE", + "ROUTE_8", + "ROUTE_12", + "ROUTE_10_SOUTH", + "LAVENDER_TOWN", + "LAVENDER_POKECENTER_1F", + "LAVENDER_POKECENTER_2F_BETA", + "MR_FUJIS_HOUSE", + "LAVENDER_SPEECH_HOUSE", + "LAVENDER_NAME_RATER", + "LAVENDER_MART", + "SOUL_HOUSE", + "LAV_RADIO_TOWER_1F", + "ROUTE_8_SAFFRON_GATE", + "ROUTE_12_SUPER_ROD_HOUSE", + "ROUTE_28", + "SILVER_CAVE_OUTSIDE", + "SILVER_CAVE_POKECENTER_1F", + "ROUTE_28_STEEL_WING_HOUSE", + "POKECENTER_2F", + "TRADE_CENTER", + "COLOSSEUM", + "TIME_CAPSULE", + "ROUTE_7", + "ROUTE_16", + "ROUTE_17", + "CELADON_CITY", + "CELADON_DEPT_STORE_1F", + "CELADON_DEPT_STORE_2F", + "CELADON_DEPT_STORE_3F", + "CELADON_DEPT_STORE_4F", + "CELADON_DEPT_STORE_5F", + "CELADON_DEPT_STORE_6F", + "CELADON_DEPT_STORE_ELEVATOR", + "CELADON_MANSION_1F", + "CELADON_MANSION_2F", + "CELADON_MANSION_3F", + "CELADON_MANSION_ROOF", + "CELADON_MANSION_ROOF_HOUSE", + "CELADON_POKECENTER_1F", + "CELADON_POKECENTER_2F_BETA", + "CELADON_GAME_CORNER", + "CELADON_GAME_CORNER_PRIZE_ROOM", + "CELADON_GYM", + "CELADON_CAFE", + "ROUTE_16_FUCHSIA_SPEECH_HOUSE", + "ROUTE_16_GATE", + "ROUTE_7_SAFFRON_GATE", + "ROUTE_17_ROUTE_18_GATE", + "ROUTE_40", + "ROUTE_41", + "CIANWOOD_CITY", + "MANIAS_HOUSE", + "CIANWOOD_GYM", + "CIANWOOD_POKECENTER_1F", + "CIANWOOD_PHARMACY", + "CIANWOOD_PHOTO_STUDIO", + "CIANWOOD_LUGIA_SPEECH_HOUSE", + "ROUTE_2", + "ROUTE_22", + "VIRIDIAN_CITY", + "VIRIDIAN_GYM", + "VIRIDIAN_NICKNAME_SPEECH_HOUSE", + "TRAINER_HOUSE_1F", + "TRAINER_HOUSE_B1F", + "VIRIDIAN_MART", + "VIRIDIAN_POKECENTER_1F", + "VIRIDIAN_POKECENTER_2F_BETA", + "ROUTE_2_NUGGET_HOUSE", + "ROUTE_2_GATE", + "VICTORY_ROAD_GATE", + "ROUTE_26", + "ROUTE_27", + "ROUTE_29", + "NEW_BARK_TOWN", + "ELMS_LAB", + "PLAYERS_HOUSE_1F", + "PLAYERS_HOUSE_2F", + "PLAYERS_NEIGHBORS_HOUSE", + "ELMS_HOUSE", + "ROUTE_26_HEAL_HOUSE", + "DAY_OF_WEEK_SIBLINGS_HOUSE", + "ROUTE_27_SANDSTORM_HOUSE", + "ROUTE_29_ROUTE_46_GATE", + "ROUTE_5", + "SAFFRON_CITY", + "FIGHTING_DOJO", + "SAFFRON_GYM", + "SAFFRON_MART", + "SAFFRON_POKECENTER_1F", + "SAFFRON_POKECENTER_2F_BETA", + "MR_PSYCHICS_HOUSE", + "SAFFRON_MAGNET_TRAIN_STATION", + "SILPH_CO_1F", + "COPYCATS_HOUSE_1F", + "COPYCATS_HOUSE_2F", + "ROUTE_5_UNDERGROUND_PATH_ENTRANCE", + "ROUTE_5_SAFFRON_GATE", + "ROUTE_5_CLEANSE_TAG_HOUSE", + "ROUTE_30", + "ROUTE_31", + "CHERRYGROVE_CITY", + "CHERRYGROVE_MART", + "CHERRYGROVE_POKECENTER_1F", + "CHERRYGROVE_GYM_SPEECH_HOUSE", + "GUIDE_GENTS_HOUSE", + "CHERRYGROVE_EVOLUTION_SPEECH_HOUSE", + "ROUTE_30_BERRY_HOUSE", + "MR_POKEMONS_HOUSE", + "ROUTE_31_VIOLET_GATE" + ], + "moveEffectOrder": [ + "EFFECT_NORMAL_HIT", + "EFFECT_SLEEP", + "EFFECT_POISON_HIT", + "EFFECT_LEECH_HIT", + "EFFECT_BURN_HIT", + "EFFECT_FREEZE_HIT", + "EFFECT_PARALYZE_HIT", + "EFFECT_SELFDESTRUCT", + "EFFECT_DREAM_EATER", + "EFFECT_MIRROR_MOVE", + "EFFECT_ATTACK_UP", + "EFFECT_DEFENSE_UP", + "EFFECT_SPEED_UP", + "EFFECT_SP_ATK_UP", + "EFFECT_SP_DEF_UP", + "EFFECT_ACCURACY_UP", + "EFFECT_EVASION_UP", + "EFFECT_ALWAYS_HIT", + "EFFECT_ATTACK_DOWN", + "EFFECT_DEFENSE_DOWN", + "EFFECT_SPEED_DOWN", + "EFFECT_SP_ATK_DOWN", + "EFFECT_SP_DEF_DOWN", + "EFFECT_ACCURACY_DOWN", + "EFFECT_EVASION_DOWN", + "EFFECT_RESET_STATS", + "EFFECT_BIDE", + "EFFECT_RAMPAGE", + "EFFECT_FORCE_SWITCH", + "EFFECT_MULTI_HIT", + "EFFECT_CONVERSION", + "EFFECT_FLINCH_HIT", + "EFFECT_HEAL", + "EFFECT_TOXIC", + "EFFECT_PAY_DAY", + "EFFECT_LIGHT_SCREEN", + "EFFECT_TRI_ATTACK", + "EFFECT_UNUSED_25", + "EFFECT_OHKO", + "EFFECT_RAZOR_WIND", + "EFFECT_SUPER_FANG", + "EFFECT_STATIC_DAMAGE", + "EFFECT_TRAP_TARGET", + "EFFECT_UNUSED_2B", + "EFFECT_DOUBLE_HIT", + "EFFECT_JUMP_KICK", + "EFFECT_MIST", + "EFFECT_FOCUS_ENERGY", + "EFFECT_RECOIL_HIT", + "EFFECT_CONFUSE", + "EFFECT_ATTACK_UP_2", + "EFFECT_DEFENSE_UP_2", + "EFFECT_SPEED_UP_2", + "EFFECT_SP_ATK_UP_2", + "EFFECT_SP_DEF_UP_2", + "EFFECT_ACCURACY_UP_2", + "EFFECT_EVASION_UP_2", + "EFFECT_TRANSFORM", + "EFFECT_ATTACK_DOWN_2", + "EFFECT_DEFENSE_DOWN_2", + "EFFECT_SPEED_DOWN_2", + "EFFECT_SP_ATK_DOWN_2", + "EFFECT_SP_DEF_DOWN_2", + "EFFECT_ACCURACY_DOWN_2", + "EFFECT_EVASION_DOWN_2", + "EFFECT_REFLECT", + "EFFECT_POISON", + "EFFECT_PARALYZE", + "EFFECT_ATTACK_DOWN_HIT", + "EFFECT_DEFENSE_DOWN_HIT", + "EFFECT_SPEED_DOWN_HIT", + "EFFECT_SP_ATK_DOWN_HIT", + "EFFECT_SP_DEF_DOWN_HIT", + "EFFECT_ACCURACY_DOWN_HIT", + "EFFECT_EVASION_DOWN_HIT", + "EFFECT_SKY_ATTACK", + "EFFECT_CONFUSE_HIT", + "EFFECT_POISON_MULTI_HIT", + "EFFECT_UNUSED_4E", + "EFFECT_SUBSTITUTE", + "EFFECT_HYPER_BEAM", + "EFFECT_RAGE", + "EFFECT_MIMIC", + "EFFECT_METRONOME", + "EFFECT_LEECH_SEED", + "EFFECT_SPLASH", + "EFFECT_DISABLE", + "EFFECT_LEVEL_DAMAGE", + "EFFECT_PSYWAVE", + "EFFECT_COUNTER", + "EFFECT_ENCORE", + "EFFECT_PAIN_SPLIT", + "EFFECT_SNORE", + "EFFECT_CONVERSION2", + "EFFECT_LOCK_ON", + "EFFECT_SKETCH", + "EFFECT_DEFROST_OPPONENT", + "EFFECT_SLEEP_TALK", + "EFFECT_DESTINY_BOND", + "EFFECT_REVERSAL", + "EFFECT_SPITE", + "EFFECT_FALSE_SWIPE", + "EFFECT_HEAL_BELL", + "EFFECT_PRIORITY_HIT", + "EFFECT_TRIPLE_KICK", + "EFFECT_THIEF", + "EFFECT_MEAN_LOOK", + "EFFECT_NIGHTMARE", + "EFFECT_FLAME_WHEEL", + "EFFECT_CURSE", + "EFFECT_UNUSED_6E", + "EFFECT_PROTECT", + "EFFECT_SPIKES", + "EFFECT_FORESIGHT", + "EFFECT_PERISH_SONG", + "EFFECT_SANDSTORM", + "EFFECT_ENDURE", + "EFFECT_ROLLOUT", + "EFFECT_SWAGGER", + "EFFECT_FURY_CUTTER", + "EFFECT_ATTRACT", + "EFFECT_RETURN", + "EFFECT_PRESENT", + "EFFECT_FRUSTRATION", + "EFFECT_SAFEGUARD", + "EFFECT_SACRED_FIRE", + "EFFECT_MAGNITUDE", + "EFFECT_BATON_PASS", + "EFFECT_PURSUIT", + "EFFECT_RAPID_SPIN", + "EFFECT_UNUSED_82", + "EFFECT_UNUSED_83", + "EFFECT_MORNING_SUN", + "EFFECT_SYNTHESIS", + "EFFECT_MOONLIGHT", + "EFFECT_HIDDEN_POWER", + "EFFECT_RAIN_DANCE", + "EFFECT_SUNNY_DAY", + "EFFECT_DEFENSE_UP_HIT", + "EFFECT_ATTACK_UP_HIT", + "EFFECT_ALL_UP_HIT", + "EFFECT_FAKE_OUT", + "EFFECT_BELLY_DRUM", + "EFFECT_PSYCH_UP", + "EFFECT_MIRROR_COAT", + "EFFECT_SKULL_BASH", + "EFFECT_TWISTER", + "EFFECT_EARTHQUAKE", + "EFFECT_FUTURE_SIGHT", + "EFFECT_GUST", + "EFFECT_STOMP", + "EFFECT_SOLARBEAM", + "EFFECT_THUNDER", + "EFFECT_TELEPORT", + "EFFECT_BEAT_UP", + "EFFECT_FLY", + "EFFECT_DEFENSE_CURL" + ], + "moveOrder": [ + "POUND", + "KARATE_CHOP", + "DOUBLESLAP", + "COMET_PUNCH", + "MEGA_PUNCH", + "PAY_DAY", + "FIRE_PUNCH", + "ICE_PUNCH", + "THUNDERPUNCH", + "SCRATCH", + "VICEGRIP", + "GUILLOTINE", + "RAZOR_WIND", + "SWORDS_DANCE", + "CUT", + "GUST", + "WING_ATTACK", + "WHIRLWIND", + "FLY", + "BIND", + "SLAM", + "VINE_WHIP", + "STOMP", + "DOUBLE_KICK", + "MEGA_KICK", + "JUMP_KICK", + "ROLLING_KICK", + "SAND_ATTACK", + "HEADBUTT", + "HORN_ATTACK", + "FURY_ATTACK", + "HORN_DRILL", + "TACKLE", + "BODY_SLAM", + "WRAP", + "TAKE_DOWN", + "THRASH", + "DOUBLE_EDGE", + "TAIL_WHIP", + "POISON_STING", + "TWINEEDLE", + "PIN_MISSILE", + "LEER", + "BITE", + "GROWL", + "ROAR", + "SING", + "SUPERSONIC", + "SONICBOOM", + "DISABLE", + "ACID", + "EMBER", + "FLAMETHROWER", + "MIST", + "WATER_GUN", + "HYDRO_PUMP", + "SURF", + "ICE_BEAM", + "BLIZZARD", + "PSYBEAM", + "BUBBLEBEAM", + "AURORA_BEAM", + "HYPER_BEAM", + "PECK", + "DRILL_PECK", + "SUBMISSION", + "LOW_KICK", + "COUNTER", + "SEISMIC_TOSS", + "STRENGTH", + "ABSORB", + "MEGA_DRAIN", + "LEECH_SEED", + "GROWTH", + "RAZOR_LEAF", + "SOLARBEAM", + "POISONPOWDER", + "STUN_SPORE", + "SLEEP_POWDER", + "PETAL_DANCE", + "STRING_SHOT", + "DRAGON_RAGE", + "FIRE_SPIN", + "THUNDERSHOCK", + "THUNDERBOLT", + "THUNDER_WAVE", + "THUNDER", + "ROCK_THROW", + "EARTHQUAKE", + "FISSURE", + "DIG", + "TOXIC", + "CONFUSION", + "PSYCHIC_M", + "HYPNOSIS", + "MEDITATE", + "AGILITY", + "QUICK_ATTACK", + "RAGE", + "TELEPORT", + "NIGHT_SHADE", + "MIMIC", + "SCREECH", + "DOUBLE_TEAM", + "RECOVER", + "HARDEN", + "MINIMIZE", + "SMOKESCREEN", + "CONFUSE_RAY", + "WITHDRAW", + "DEFENSE_CURL", + "BARRIER", + "LIGHT_SCREEN", + "HAZE", + "REFLECT", + "FOCUS_ENERGY", + "BIDE", + "METRONOME", + "MIRROR_MOVE", + "SELFDESTRUCT", + "EGG_BOMB", + "LICK", + "SMOG", + "SLUDGE", + "BONE_CLUB", + "FIRE_BLAST", + "WATERFALL", + "CLAMP", + "SWIFT", + "SKULL_BASH", + "SPIKE_CANNON", + "CONSTRICT", + "AMNESIA", + "KINESIS", + "SOFTBOILED", + "HI_JUMP_KICK", + "GLARE", + "DREAM_EATER", + "POISON_GAS", + "BARRAGE", + "LEECH_LIFE", + "LOVELY_KISS", + "SKY_ATTACK", + "TRANSFORM", + "BUBBLE", + "DIZZY_PUNCH", + "SPORE", + "FLASH", + "PSYWAVE", + "SPLASH", + "ACID_ARMOR", + "CRABHAMMER", + "EXPLOSION", + "FURY_SWIPES", + "BONEMERANG", + "REST", + "ROCK_SLIDE", + "HYPER_FANG", + "SHARPEN", + "CONVERSION", + "TRI_ATTACK", + "SUPER_FANG", + "SLASH", + "SUBSTITUTE", + "STRUGGLE", + "SKETCH", + "TRIPLE_KICK", + "THIEF", + "SPIDER_WEB", + "MIND_READER", + "NIGHTMARE", + "FLAME_WHEEL", + "SNORE", + "CURSE", + "FLAIL", + "CONVERSION2", + "AEROBLAST", + "COTTON_SPORE", + "REVERSAL", + "SPITE", + "POWDER_SNOW", + "PROTECT", + "MACH_PUNCH", + "SCARY_FACE", + "FAINT_ATTACK", + "SWEET_KISS", + "BELLY_DRUM", + "SLUDGE_BOMB", + "MUD_SLAP", + "OCTAZOOKA", + "SPIKES", + "ZAP_CANNON", + "FORESIGHT", + "DESTINY_BOND", + "PERISH_SONG", + "ICY_WIND", + "DETECT", + "BONE_RUSH", + "LOCK_ON", + "OUTRAGE", + "SANDSTORM", + "GIGA_DRAIN", + "ENDURE", + "CHARM", + "ROLLOUT", + "FALSE_SWIPE", + "SWAGGER", + "MILK_DRINK", + "SPARK", + "FURY_CUTTER", + "STEEL_WING", + "MEAN_LOOK", + "ATTRACT", + "SLEEP_TALK", + "HEAL_BELL", + "RETURN", + "PRESENT", + "FRUSTRATION", + "SAFEGUARD", + "PAIN_SPLIT", + "SACRED_FIRE", + "MAGNITUDE", + "DYNAMICPUNCH", + "MEGAHORN", + "DRAGONBREATH", + "BATON_PASS", + "ENCORE", + "PURSUIT", + "RAPID_SPIN", + "SWEET_SCENT", + "IRON_TAIL", + "METAL_CLAW", + "VITAL_THROW", + "MORNING_SUN", + "SYNTHESIS", + "MOONLIGHT", + "HIDDEN_POWER", + "CROSS_CHOP", + "TWISTER", + "RAIN_DANCE", + "SUNNY_DAY", + "CRUNCH", + "MIRROR_COAT", + "PSYCH_UP", + "EXTREMESPEED", + "ANCIENTPOWER", + "SHADOW_BALL", + "FUTURE_SIGHT", + "ROCK_SMASH", + "WHIRLPOOL", + "BEAT_UP" + ], + "musicOrder": [ + "Music_Nothing", + "Music_TitleScreen", + "Music_Route1", + "Music_Route3", + "Music_Route12", + "Music_MagnetTrain", + "Music_KantoGymBattle", + "Music_KantoTrainerBattle", + "Music_KantoWildBattle", + "Music_PokemonCenter", + "Music_LookHiker", + "Music_LookLass", + "Music_LookOfficer", + "Music_HealPokemon", + "Music_LavenderTown", + "Music_Route2", + "Music_MtMoon", + "Music_ShowMeAround", + "Music_GameCorner", + "Music_Bicycle", + "Music_HallOfFame", + "Music_ViridianCity", + "Music_CeladonCity", + "Music_TrainerVictory", + "Music_WildPokemonVictory", + "Music_GymLeaderVictory", + "Music_MtMoonSquare", + "Music_Gym", + "Music_PalletTown", + "Music_ProfOaksPokemonTalk", + "Music_ProfOak", + "Music_LookRival", + "Music_AfterTheRivalFight", + "Music_Surf", + "Music_Evolution", + "Music_NationalPark", + "Music_Credits", + "Music_AzaleaTown", + "Music_CherrygroveCity", + "Music_LookKimonoGirl", + "Music_UnionCave", + "Music_JohtoWildBattle", + "Music_JohtoTrainerBattle", + "Music_Route30", + "Music_EcruteakCity", + "Music_VioletCity", + "Music_JohtoGymBattle", + "Music_ChampionBattle", + "Music_RivalBattle", + "Music_RocketBattle", + "Music_ElmsLab", + "Music_DarkCave", + "Music_Route29", + "Music_Route36", + "Music_SSAqua", + "Music_LookYoungster", + "Music_LookBeauty", + "Music_LookRocket", + "Music_LookPokemaniac", + "Music_LookSage", + "Music_NewBarkTown", + "Music_GoldenrodCity", + "Music_VermilionCity", + "Music_PokemonChannel", + "Music_PokeFluteChannel", + "Music_TinTower", + "Music_SproutTower", + "Music_BurnedTower", + "Music_Lighthouse", + "Music_LakeOfRage", + "Music_IndigoPlateau", + "Music_Route37", + "Music_RocketHideout", + "Music_DragonsDen", + "Music_JohtoWildBattleNight", + "Music_RuinsOfAlphRadio", + "Music_SuccessfulCapture", + "Music_Route26", + "Music_Mom", + "Music_VictoryRoad", + "Music_PokemonLullaby", + "Music_PokemonMarch", + "Music_GoldSilverOpening", + "Music_GoldSilverOpening2", + "Music_MainMenu", + "Music_RuinsOfAlphInterior", + "Music_RocketTheme", + "Music_DancingHall", + "Music_ContestResults", + "Music_BugCatchingContest", + "Music_LakeOfRageRocketRadio", + "Music_Printer", + "Music_PostCredits" + ], + "numOverworldSprites": 95, + "paletteOrder": [ + "PALETTE_AUTO", + "PALETTE_DAY", + "PALETTE_NITE", + "PALETTE_MORN", + "PALETTE_DARK" + ], + "phoneContactOrder": [ + "PHONE_00", + "PHONE_MOM", + "PHONE_OAK", + "PHONE_BILL", + "PHONE_ELM", + "PHONE_SCHOOLBOY_JACK", + "PHONE_POKEFAN_BEVERLY", + "PHONE_SAILOR_HUEY", + "PHONE_UNUSED", + "PHONE_UNUSED", + "PHONE_UNUSED", + "PHONE_COOLTRAINERM_GAVEN", + "PHONE_COOLTRAINERF_BETH", + "PHONE_BIRDKEEPER_JOSE", + "PHONE_COOLTRAINERF_REENA", + "PHONE_YOUNGSTER_JOEY", + "PHONE_BUG_CATCHER_WADE", + "PHONE_FISHER_RALPH", + "PHONE_PICNICKER_LIZ", + "PHONE_HIKER_ANTHONY", + "PHONE_CAMPER_TODD", + "PHONE_PICNICKER_GINA", + "PHONE_JUGGLER_IRWIN", + "PHONE_BUG_CATCHER_ARNIE", + "PHONE_SCHOOLBOY_ALAN", + "PHONE_UNUSED", + "PHONE_LASS_DANA", + "PHONE_SCHOOLBOY_CHAD", + "PHONE_POKEFANM_DEREK", + "PHONE_FISHER_CHRIS", + "PHONE_POKEMANIAC_BRENT", + "PHONE_PICNICKER_TIFFANY", + "PHONE_BIRDKEEPER_VANCE", + "PHONE_FISHER_WILTON", + "PHONE_BLACKBELT_KENJI", + "PHONE_HIKER_PARRY", + "PHONE_PICNICKER_ERIN" + ], + "pocketOrder": [ + "ITEM", + "KEY_ITEM", + "BALL", + "TM_HM" + ], + "sfxOrder": [ + "Sfx_DexFanfare5079", + "Sfx_Item", + "Sfx_CaughtMon", + "Sfx_PokeballsPlacedOnTable", + "Sfx_Potion", + "Sfx_FullHeal", + "Sfx_Menu", + "Sfx_ReadText", + "Sfx_ReadText2", + "Sfx_DexFanfare2049", + "Sfx_DexFanfare80109", + "Sfx_Poison", + "Sfx_GotSafariBalls", + "Sfx_BootPc", + "Sfx_ShutDownPc", + "Sfx_ChoosePcOption", + "Sfx_EscapeRope", + "Sfx_PushButton", + "Sfx_SecondPartOfItemfinder", + "Sfx_WarpTo", + "Sfx_WarpFrom", + "Sfx_ChangeDexMode", + "Sfx_JumpOverLedge", + "Sfx_GrassRustle", + "Sfx_Fly", + "Sfx_Wrong", + "Sfx_Squeak", + "Sfx_Strength", + "Sfx_Boat", + "Sfx_WallOpen", + "Sfx_PlacePuzzlePieceDown", + "Sfx_EnterDoor", + "Sfx_SwitchPokemon", + "Sfx_Tally", + "Sfx_Transaction", + "Sfx_ExitBuilding", + "Sfx_Bump", + "Sfx_Save", + "Sfx_Pokeflute", + "Sfx_ElevatorEnd", + "Sfx_ThrowBall", + "Sfx_BallPoof", + "Sfx_Faint", + "Sfx_Run", + "Sfx_SlotMachineStart", + "Sfx_Fanfare", + "Sfx_Peck", + "Sfx_Kinesis", + "Sfx_Lick", + "Sfx_Pound", + "Sfx_MovePuzzlePiece", + "Sfx_CometPunch", + "Sfx_MegaPunch", + "Sfx_Scratch", + "Sfx_Vicegrip", + "Sfx_RazorWind", + "Sfx_Cut", + "Sfx_WingAttack", + "Sfx_Whirlwind", + "Sfx_Bind", + "Sfx_VineWhip", + "Sfx_DoubleKick", + "Sfx_MegaKick", + "Sfx_Headbutt", + "Sfx_HornAttack", + "Sfx_Tackle", + "Sfx_PoisonSting", + "Sfx_Powder", + "Sfx_Doubleslap", + "Sfx_Bite", + "Sfx_JumpKick", + "Sfx_Stomp", + "Sfx_TailWhip", + "Sfx_KarateChop", + "Sfx_Submission", + "Sfx_WaterGun", + "Sfx_SwordsDance", + "Sfx_Thunder", + "Sfx_Supersonic", + "Sfx_Leer", + "Sfx_Ember", + "Sfx_Bubblebeam", + "Sfx_HydroPump", + "Sfx_Surf", + "Sfx_Psybeam", + "Sfx_Charge", + "Sfx_Thundershock", + "Sfx_Psychic", + "Sfx_Screech", + "Sfx_BoneClub", + "Sfx_Sharpen", + "Sfx_EggBomb", + "Sfx_Sing", + "Sfx_HyperBeam", + "Sfx_Shine", + "Sfx_Unknown5F", + "Sfx_Unknown60", + "Sfx_Unknown61", + "Sfx_SwitchPockets", + "Sfx_Unknown63", + "Sfx_Burn", + "Sfx_TitleScreenEntrance", + "Sfx_Unknown66", + "Sfx_GetCoinFromSlots", + "Sfx_PayDay", + "Sfx_Metronome", + "Sfx_Call", + "Sfx_HangUp", + "Sfx_NoSignal", + "Sfx_Sandstorm", + "Sfx_Elevator", + "Sfx_Protect", + "Sfx_Sketch", + "Sfx_RainDance", + "Sfx_Aeroblast", + "Sfx_Spark", + "Sfx_Curse", + "Sfx_Rage", + "Sfx_Thief", + "Sfx_Thief2", + "Sfx_SpiderWeb", + "Sfx_MindReader", + "Sfx_Nightmare", + "Sfx_Snore", + "Sfx_SweetKiss", + "Sfx_SweetKiss2", + "Sfx_BellyDrum", + "Sfx_Toxic", + "Sfx_SludgeBomb", + "Sfx_Foresight", + "Sfx_Spite", + "Sfx_Outrage", + "Sfx_PerishSong", + "Sfx_GigaDrain", + "Sfx_Attract", + "Sfx_Kinesis2", + "Sfx_ZapCannon", + "Sfx_MeanLook", + "Sfx_HealBell", + "Sfx_Return", + "Sfx_ExpBar", + "Sfx_MilkDrink", + "Sfx_Present", + "Sfx_MorningSun", + "Sfx_LevelUp", + "Sfx_KeyItem", + "Sfx_Fanfare2", + "Sfx_RegisterPhoneNumber", + "Sfx_3rdPlace", + "Sfx_GetEgg", + "Sfx_GetEgg", + "Sfx_MoveDeleted", + "Sfx_2ndPlace", + "Sfx_1stPlace", + "Sfx_ChooseACard", + "Sfx_GetTm", + "Sfx_GetBadge", + "Sfx_QuitSlots", + "Sfx_EggCrack", + "Sfx_DexFanfareLessThan20", + "Sfx_DexFanfare140169", + "Sfx_DexFanfare170199", + "Sfx_DexFanfare200229", + "Sfx_DexFanfare230Plus", + "Sfx_Evolved", + "Sfx_MasterBall", + "Sfx_EggHatch", + "Sfx_GsIntroCharizardFireball", + "Sfx_GsIntroPokemonAppears", + "Sfx_Flash", + "Sfx_GameFreakLogoGs", + "Sfx_NotVeryEffective", + "Sfx_Damage", + "Sfx_SuperEffective", + "Sfx_BallBounce", + "Sfx_Moonlight", + "Sfx_Encore", + "Sfx_BeatUp", + "Sfx_BatonPass", + "Sfx_BallWobble", + "Sfx_SweetScent", + "Sfx_SweetScent2", + "Sfx_HitEndOfExpBar", + "Sfx_GiveTrademon", + "Sfx_GetTrademon", + "Sfx_TrainArrived", + "Sfx_StopSlot", + "Sfx_2Boops" + ], + "source": "pret/pokegold constants/*.asm", + "spawnOrder": [ + "SPAWN_HOME", + "SPAWN_DEBUG", + "SPAWN_PALLET", + "SPAWN_VIRIDIAN", + "SPAWN_PEWTER", + "SPAWN_CERULEAN", + "SPAWN_ROCK_TUNNEL", + "SPAWN_VERMILION", + "SPAWN_LAVENDER", + "SPAWN_SAFFRON", + "SPAWN_CELADON", + "SPAWN_FUCHSIA", + "SPAWN_CINNABAR", + "SPAWN_INDIGO", + "SPAWN_NEW_BARK", + "SPAWN_CHERRYGROVE", + "SPAWN_VIOLET", + "SPAWN_UNION_CAVE", + "SPAWN_AZALEA", + "SPAWN_CIANWOOD", + "SPAWN_GOLDENROD", + "SPAWN_OLIVINE", + "SPAWN_ECRUTEAK", + "SPAWN_MAHOGANY", + "SPAWN_LAKE_OF_RAGE", + "SPAWN_BLACKTHORN", + "SPAWN_MT_SILVER", + "SPAWN_FAST_SHIP" + ], + "specialCallOrder": [ + "SPECIALCALL_NONE", + "SPECIALCALL_POKERUS", + "SPECIALCALL_ROBBED", + "SPECIALCALL_ASSISTANT", + "SPECIALCALL_WEIRDBROADCAST", + "SPECIALCALL_SSTICKET", + "SPECIALCALL_BIKESHOP", + "SPECIALCALL_WORRIED", + "SPECIALCALL_MASTERBALL" + ], + "specialOrder": [ + "WarpToSpawnPoint", + "SetBitsForLinkTradeRequest", + "WaitForLinkedFriend", + "CheckLinkTimeout_Receptionist", + "TryQuickSave", + "CheckBothSelectedSameRoom", + "FailedLinkToPast", + "CloseLink", + "WaitForOtherPlayerToExit", + "SetBitsForBattleRequest", + "SetBitsForTimeCapsuleRequest", + "CheckTimeCapsuleCompatibility", + "EnterTimeCapsule", + "TradeCenter", + "Colosseum", + "TimeCapsule", + "CableClubCheckWhichChris", + "CheckMysteryGift", + "GetMysteryGiftItem", + "UnlockMysteryGift", + "BugContestJudging", + "CheckPartyFullAfterContest", + "ContestDropOffMons", + "ContestReturnMons", + "GiveParkBalls", + "CheckMagikarpLength", + "MagikarpHouseSign", + "HealParty", + "PokemonCenterPC", + "PlayersHousePC", + "DayCareMan", + "DayCareLady", + "DayCareManOutside", + "MoveDeletion", + "BankOfMom", + "MagnetTrain", + "NameRival", + "SetDayOfWeek", + "OverworldTownMap", + "UnownPrinter", + "MapRadio", + "UnownPuzzle", + "SlotMachine", + "CardFlip", + "UnusedMemoryGame", + "ClearBGPalettesBufferScreen", + "FadeOutToWhite", + "FadeOutToBlack", + "FadeInFromWhite", + "FadeInFromBlack", + "ReloadSpritesNoPalettes", + "ClearBGPalettes", + "UpdateTimePals", + "ClearTilemap", + "UpdateSprites", + "UpdatePlayerSprite", + "GameCornerPrizeMonCheckDex", + "UnusedSetSeenMon", + "WaitSFX", + "PlayMapMusic", + "RestartMapMusic", + "HealMachineAnim", + "SurfStartStep", + "FindPartyMonAboveLevel", + "FindPartyMonAtLeastThatHappy", + "FindPartyMonThatSpecies", + "FindPartyMonThatSpeciesYourTrainerID", + "UnusedCheckUnusedTwoDayTimer", + "DayCareMon1", + "DayCareMon2", + "SelectRandomBugContestContestants", + "ActivateFishingSwarm", + "ToggleMaptileDecorations", + "ToggleDecorationsVisibility", + "GiveShuckle", + "ReturnShuckie", + "BillsGrandfather", + "CheckPokerus", + "DisplayCoinCaseBalance", + "DisplayMoneyAndCoinBalance", + "PlaceMoneyTopRight", + "CheckForLuckyNumberWinners", + "CheckLuckyNumberShowFlag", + "ResetLuckyNumberShowFlag", + "PrintTodaysLuckyNumber", + "SelectApricornForKurt", + "NameRater", + "DisplayLinkRecord", + "GetFirstPokemonHappiness", + "CheckFirstMonIsEgg", + "RandomUnseenWildMon", + "RandomPhoneWildMon", + "RandomPhoneMon", + "LoadUsedSpritesGFX", + "PlaySlowCry", + "SnorlaxAwake", + "OlderHaircutBrother", + "YoungerHaircutBrother", + "DaisysGrooming", + "PlayCurMonCry", + "ProfOaksPCBoot", + "GameboyCheck", + "TrainerHouse", + "PhotoStudio", + "InitRoamMons", + "FadeOutMusic", + "Diploma", + "PrintDiploma", + "InitialSetDSTFlag", + "InitialClearDSTFlag", + "MrChrono", + "UnusedDummySpecial" + ], + "speciesOrder": [ + "BULBASAUR", + "IVYSAUR", + "VENUSAUR", + "CHARMANDER", + "CHARMELEON", + "CHARIZARD", + "SQUIRTLE", + "WARTORTLE", + "BLASTOISE", + "CATERPIE", + "METAPOD", + "BUTTERFREE", + "WEEDLE", + "KAKUNA", + "BEEDRILL", + "PIDGEY", + "PIDGEOTTO", + "PIDGEOT", + "RATTATA", + "RATICATE", + "SPEAROW", + "FEAROW", + "EKANS", + "ARBOK", + "PIKACHU", + "RAICHU", + "SANDSHREW", + "SANDSLASH", + "NIDORAN_F", + "NIDORINA", + "NIDOQUEEN", + "NIDORAN_M", + "NIDORINO", + "NIDOKING", + "CLEFAIRY", + "CLEFABLE", + "VULPIX", + "NINETALES", + "JIGGLYPUFF", + "WIGGLYTUFF", + "ZUBAT", + "GOLBAT", + "ODDISH", + "GLOOM", + "VILEPLUME", + "PARAS", + "PARASECT", + "VENONAT", + "VENOMOTH", + "DIGLETT", + "DUGTRIO", + "MEOWTH", + "PERSIAN", + "PSYDUCK", + "GOLDUCK", + "MANKEY", + "PRIMEAPE", + "GROWLITHE", + "ARCANINE", + "POLIWAG", + "POLIWHIRL", + "POLIWRATH", + "ABRA", + "KADABRA", + "ALAKAZAM", + "MACHOP", + "MACHOKE", + "MACHAMP", + "BELLSPROUT", + "WEEPINBELL", + "VICTREEBEL", + "TENTACOOL", + "TENTACRUEL", + "GEODUDE", + "GRAVELER", + "GOLEM", + "PONYTA", + "RAPIDASH", + "SLOWPOKE", + "SLOWBRO", + "MAGNEMITE", + "MAGNETON", + "FARFETCH_D", + "DODUO", + "DODRIO", + "SEEL", + "DEWGONG", + "GRIMER", + "MUK", + "SHELLDER", + "CLOYSTER", + "GASTLY", + "HAUNTER", + "GENGAR", + "ONIX", + "DROWZEE", + "HYPNO", + "KRABBY", + "KINGLER", + "VOLTORB", + "ELECTRODE", + "EXEGGCUTE", + "EXEGGUTOR", + "CUBONE", + "MAROWAK", + "HITMONLEE", + "HITMONCHAN", + "LICKITUNG", + "KOFFING", + "WEEZING", + "RHYHORN", + "RHYDON", + "CHANSEY", + "TANGELA", + "KANGASKHAN", + "HORSEA", + "SEADRA", + "GOLDEEN", + "SEAKING", + "STARYU", + "STARMIE", + "MR__MIME", + "SCYTHER", + "JYNX", + "ELECTABUZZ", + "MAGMAR", + "PINSIR", + "TAUROS", + "MAGIKARP", + "GYARADOS", + "LAPRAS", + "DITTO", + "EEVEE", + "VAPOREON", + "JOLTEON", + "FLAREON", + "PORYGON", + "OMANYTE", + "OMASTAR", + "KABUTO", + "KABUTOPS", + "AERODACTYL", + "SNORLAX", + "ARTICUNO", + "ZAPDOS", + "MOLTRES", + "DRATINI", + "DRAGONAIR", + "DRAGONITE", + "MEWTWO", + "MEW", + "CHIKORITA", + "BAYLEEF", + "MEGANIUM", + "CYNDAQUIL", + "QUILAVA", + "TYPHLOSION", + "TOTODILE", + "CROCONAW", + "FERALIGATR", + "SENTRET", + "FURRET", + "HOOTHOOT", + "NOCTOWL", + "LEDYBA", + "LEDIAN", + "SPINARAK", + "ARIADOS", + "CROBAT", + "CHINCHOU", + "LANTURN", + "PICHU", + "CLEFFA", + "IGGLYBUFF", + "TOGEPI", + "TOGETIC", + "NATU", + "XATU", + "MAREEP", + "FLAAFFY", + "AMPHAROS", + "BELLOSSOM", + "MARILL", + "AZUMARILL", + "SUDOWOODO", + "POLITOED", + "HOPPIP", + "SKIPLOOM", + "JUMPLUFF", + "AIPOM", + "SUNKERN", + "SUNFLORA", + "YANMA", + "WOOPER", + "QUAGSIRE", + "ESPEON", + "UMBREON", + "MURKROW", + "SLOWKING", + "MISDREAVUS", + "UNOWN", + "WOBBUFFET", + "GIRAFARIG", + "PINECO", + "FORRETRESS", + "DUNSPARCE", + "GLIGAR", + "STEELIX", + "SNUBBULL", + "GRANBULL", + "QWILFISH", + "SCIZOR", + "SHUCKLE", + "HERACROSS", + "SNEASEL", + "TEDDIURSA", + "URSARING", + "SLUGMA", + "MAGCARGO", + "SWINUB", + "PILOSWINE", + "CORSOLA", + "REMORAID", + "OCTILLERY", + "DELIBIRD", + "MANTINE", + "SKARMORY", + "HOUNDOUR", + "HOUNDOOM", + "KINGDRA", + "PHANPY", + "DONPHAN", + "PORYGON2", + "STANTLER", + "SMEARGLE", + "TYROGUE", + "HITMONTOP", + "SMOOCHUM", + "ELEKID", + "MAGBY", + "MILTANK", + "BLISSEY", + "RAIKOU", + "ENTEI", + "SUICUNE", + "LARVITAR", + "PUPITAR", + "TYRANITAR", + "LUGIA", + "HO_OH", + "CELEBI" + ], + "spriteOrder": [ + "SPRITE_CHRIS", + "SPRITE_CHRIS_BIKE", + "SPRITE_GAMEBOY_KID", + "SPRITE_RIVAL", + "SPRITE_OAK", + "SPRITE_RED", + "SPRITE_BLUE", + "SPRITE_BILL", + "SPRITE_ELDER", + "SPRITE_JANINE", + "SPRITE_KURT", + "SPRITE_MOM", + "SPRITE_BLAINE", + "SPRITE_REDS_MOM", + "SPRITE_DAISY", + "SPRITE_ELM", + "SPRITE_WILL", + "SPRITE_FALKNER", + "SPRITE_WHITNEY", + "SPRITE_BUGSY", + "SPRITE_MORTY", + "SPRITE_CHUCK", + "SPRITE_JASMINE", + "SPRITE_PRYCE", + "SPRITE_CLAIR", + "SPRITE_BROCK", + "SPRITE_KAREN", + "SPRITE_BRUNO", + "SPRITE_MISTY", + "SPRITE_LANCE", + "SPRITE_SURGE", + "SPRITE_ERIKA", + "SPRITE_KOGA", + "SPRITE_SABRINA", + "SPRITE_COOLTRAINER_M", + "SPRITE_COOLTRAINER_F", + "SPRITE_BUG_CATCHER", + "SPRITE_TWIN", + "SPRITE_YOUNGSTER", + "SPRITE_LASS", + "SPRITE_TEACHER", + "SPRITE_BEAUTY", + "SPRITE_SUPER_NERD", + "SPRITE_ROCKER", + "SPRITE_POKEFAN_M", + "SPRITE_POKEFAN_F", + "SPRITE_GRAMPS", + "SPRITE_GRANNY", + "SPRITE_SWIMMER_GUY", + "SPRITE_SWIMMER_GIRL", + "SPRITE_BIG_SNORLAX", + "SPRITE_SURFING_PIKACHU", + "SPRITE_ROCKET", + "SPRITE_ROCKET_GIRL", + "SPRITE_NURSE", + "SPRITE_LINK_RECEPTIONIST", + "SPRITE_CLERK", + "SPRITE_FISHER", + "SPRITE_FISHING_GURU", + "SPRITE_SCIENTIST", + "SPRITE_KIMONO_GIRL", + "SPRITE_SAGE", + "SPRITE_UNUSED_GUY", + "SPRITE_GENTLEMAN", + "SPRITE_BLACK_BELT", + "SPRITE_RECEPTIONIST", + "SPRITE_OFFICER", + "SPRITE_CAL", + "SPRITE_SLOWPOKE", + "SPRITE_CAPTAIN", + "SPRITE_BIG_LAPRAS", + "SPRITE_GYM_GUIDE", + "SPRITE_SAILOR", + "SPRITE_BIKER", + "SPRITE_PHARMACIST", + "SPRITE_MONSTER", + "SPRITE_FAIRY", + "SPRITE_BIRD", + "SPRITE_DRAGON", + "SPRITE_BIG_ONIX", + "SPRITE_N64", + "SPRITE_SUDOWOODO", + "SPRITE_SURF", + "SPRITE_POKE_BALL", + "SPRITE_POKEDEX", + "SPRITE_PAPER", + "SPRITE_VIRTUAL_BOY", + "SPRITE_OLD_LINK_RECEPTIONIST", + "SPRITE_ROCK", + "SPRITE_BOULDER", + "SPRITE_SNES", + "SPRITE_FAMICOM", + "SPRITE_FRUIT_TREE", + "SPRITE_GOLD_TROPHY", + "SPRITE_SILVER_TROPHY", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "UNUSED", + "SPRITE_UNOWN", + "SPRITE_GEODUDE", + "SPRITE_GROWLITHE", + "SPRITE_WEEDLE", + "SPRITE_SHELLDER", + "SPRITE_ODDISH", + "SPRITE_GENGAR", + "SPRITE_ZUBAT", + "SPRITE_MAGIKARP", + "SPRITE_SQUIRTLE", + "SPRITE_TOGEPI", + "SPRITE_BUTTERFREE", + "SPRITE_DIGLETT", + "SPRITE_POLIWAG", + "SPRITE_PIKACHU", + "SPRITE_CLEFAIRY", + "SPRITE_CHARMANDER", + "SPRITE_JYNX", + "SPRITE_STARMIE", + "SPRITE_BULBASAUR", + "SPRITE_JIGGLYPUFF", + "SPRITE_GRIMER", + "SPRITE_EKANS", + "SPRITE_PARAS", + "SPRITE_TENTACOOL", + "SPRITE_TAUROS", + "SPRITE_MACHOP", + "SPRITE_VOLTORB", + "SPRITE_LAPRAS", + "SPRITE_RHYDON", + "SPRITE_MOLTRES", + "SPRITE_SNORLAX", + "SPRITE_GYARADOS", + "SPRITE_LUGIA", + "SPRITE_HO_OH" + ], + "spritePokemon": 128, + "stdScriptOrder": [ + "PokecenterNurseScript", + "DifficultBookshelfScript", + "PictureBookshelfScript", + "MagazineBookshelfScript", + "TeamRocketOathScript", + "IncenseBurnerScript", + "MerchandiseShelfScript", + "TownMapScript", + "WindowScript", + "TVScript", + "HomepageScript", + "Radio1Script", + "Radio2Script", + "TrashCanScript", + "StrengthBoulderScript", + "SmashRockScript", + "PokecenterSignScript", + "MartSignScript", + "GoldenrodRocketsScript", + "RadioTowerRocketsScript", + "ElevatorButtonScript", + "DayToTextScript", + "BugContestResultsWarpScript", + "BugContestResultsScript", + "InitializeEventsScript", + "AskNumber1MScript", + "AskNumber2MScript", + "RegisteredNumberMScript", + "NumberAcceptedMScript", + "NumberDeclinedMScript", + "PhoneFullMScript", + "RematchMScript", + "AskNumber1FScript", + "AskNumber2FScript", + "RegisteredNumberFScript", + "NumberAcceptedFScript", + "NumberDeclinedFScript", + "PhoneFullFScript", + "RematchFScript", + "GymStatue1Script", + "GymStatue2Script", + "ReceiveItemScript", + "ReceiveTogepiEggScript", + "PCScript", + "GameCornerCoinVendorScript", + "HappinessCheckScript" + ], + "tilesetOrder": [ + "TILESET_JOHTO", + "TILESET_JOHTO_MODERN", + "TILESET_KANTO", + "TILESET_HOUSE", + "TILESET_PLAYERS_HOUSE", + "TILESET_POKECENTER", + "TILESET_GATE", + "TILESET_PORT", + "TILESET_LAB", + "TILESET_FACILITY", + "TILESET_MART", + "TILESET_MANSION", + "TILESET_GAME_CORNER", + "TILESET_ELITE_FOUR_ROOM", + "TILESET_TRADITIONAL_HOUSE", + "TILESET_TRAIN_STATION", + "TILESET_CHAMPIONS_ROOM", + "TILESET_LIGHTHOUSE", + "TILESET_PLAYERS_ROOM", + "TILESET_TOWER", + "TILESET_CAVE", + "TILESET_PARK", + "TILESET_RUINS_OF_ALPH", + "TILESET_RADIO_TOWER", + "TILESET_UNDERGROUND", + "TILESET_ICE_PATH", + "TILESET_DARK_CAVE", + "TILESET_FOREST" + ], + "tradeDialogOrder": [ + "TRADE_DIALOGSET_COLLECTOR", + "TRADE_DIALOGSET_HAPPY", + "TRADE_DIALOGSET_NEWBIE" + ], + "tradeGenderOrder": [ + "TRADE_GENDER_EITHER", + "TRADE_GENDER_MALE", + "TRADE_GENDER_FEMALE" + ], + "trainerClassMembers": { + "BEAUTY": [ + "VICTORIA", + "SAMANTHA", + "JULIE", + "JACLYN", + "BRENDA", + "CASSIE", + "CAROLINE", + "CARLENE", + "JESSICA", + "RACHAEL", + "ANGELICA", + "KENDRA", + "VERONICA", + "JULIA", + "THERESA", + "VALERIE" + ], + "BIKER": [ + "KAZU1", + "KAZU2", + "DWAYNE", + "HARRIS", + "ZEKE", + "CHARLES", + "RILEY", + "JOEL", + "GLENN" + ], + "BIRD_KEEPER": [ + "ROD", + "ABE", + "BRYAN", + "THEO", + "TOBY", + "DENIS", + "VANCE1", + "HANK", + "ROY", + "BORIS", + "BOB", + "JOSE1", + "PETER", + "JOSE2", + "PERRY", + "BRET", + "JOSE3", + "VANCE2", + "VANCE3" + ], + "BLACKBELT_T": [ + "KENJI1", + "YOSHI", + "KENJI2", + "LAO", + "NOB", + "KIYO", + "LUNG", + "KENJI3", + "WAI" + ], + "BLAINE": [ + "BLAINE1" + ], + "BLUE": [ + "BLUE1" + ], + "BOARDER": [ + "RONALD", + "BRAD", + "DOUGLAS" + ], + "BROCK": [ + "BROCK1" + ], + "BRUNO": [ + "BRUNO1" + ], + "BUGSY": [ + "BUGSY1" + ], + "BUG_CATCHER": [ + "DON", + "ROB", + "ED", + "WADE1", + "BENNY", + "AL", + "JOSH", + "ARNIE1", + "KEN", + "WADE2", + "WADE3", + "DOUG", + "ARNIE2", + "ARNIE3" + ], + "BURGLAR": [ + "DUNCAN", + "EDDIE", + "COREY" + ], + "CAL": [ + "CAL1", + "CAL2", + "CAL3" + ], + "CAMPER": [ + "ROLAND", + "TODD1", + "IVAN", + "ELLIOT", + "BARRY", + "LLOYD", + "DEAN", + "SID", + "HARVEY", + "DALE", + "TED", + "TODD2", + "TODD3", + "THOMAS", + "LEROY", + "DAVID", + "JOHN", + "JERRY", + "SPENCER" + ], + "CHAMPION": [ + "LANCE" + ], + "CHUCK": [ + "CHUCK1" + ], + "CLAIR": [ + "CLAIR1" + ], + "COOLTRAINERF": [ + "GWEN", + "LOIS", + "FRAN", + "LOLA", + "KATE", + "IRENE", + "KELLY", + "JOYCE", + "BETH1", + "REENA1", + "MEGAN", + "BETH2", + "CAROL", + "QUINN", + "EMMA", + "CYBIL", + "JENN", + "BETH3", + "REENA2", + "REENA3" + ], + "COOLTRAINERM": [ + "NICK", + "AARON", + "PAUL", + "CODY", + "MIKE", + "GAVEN1", + "GAVEN2", + "RYAN", + "JAKE", + "GAVEN3", + "BLAKE", + "BRIAN", + "ERICK", + "ANDY", + "TYLER", + "SEAN", + "KEVIN", + "STEVE", + "ALLEN" + ], + "ERIKA": [ + "ERIKA1" + ], + "EXECUTIVEF": [ + "EXECUTIVEF_1", + "EXECUTIVEF_2" + ], + "EXECUTIVEM": [ + "EXECUTIVEM_1", + "EXECUTIVEM_2", + "EXECUTIVEM_3", + "EXECUTIVEM_4" + ], + "FALKNER": [ + "FALKNER1" + ], + "FIREBREATHER": [ + "OTIS", + "DICK", + "NED", + "BURT", + "BILL", + "WALT", + "RAY", + "LYLE" + ], + "FISHER": [ + "JUSTIN", + "RALPH1", + "ARNOLD", + "KYLE", + "HENRY", + "MARVIN", + "CHRIS1", + "ANDRE", + "RAYMOND", + "WILTON1", + "EDGAR", + "JONAH", + "MARTIN", + "STEPHEN", + "BARNEY", + "RALPH2", + "RALPH3", + "CHRIS2", + "CHRIS3", + "WILTON2", + "SCOTT", + "WILTON3" + ], + "GENTLEMAN": [ + "PRESTON", + "EDWARD", + "GREGORY", + "VIRGIL", + "ALFRED" + ], + "GRUNTF": [ + "GRUNTF_1", + "GRUNTF_2", + "GRUNTF_3", + "GRUNTF_4", + "GRUNTF_5" + ], + "GRUNTM": [ + "GRUNTM_1", + "GRUNTM_2", + "GRUNTM_3", + "GRUNTM_4", + "GRUNTM_5", + "GRUNTM_6", + "GRUNTM_7", + "GRUNTM_8", + "GRUNTM_9", + "GRUNTM_10", + "GRUNTM_11", + "GRUNTM_12", + "GRUNTM_13", + "GRUNTM_14", + "GRUNTM_15", + "GRUNTM_16", + "GRUNTM_17", + "GRUNTM_18", + "GRUNTM_19", + "GRUNTM_20", + "GRUNTM_21", + "GRUNTM_22", + "GRUNTM_23", + "GRUNTM_24", + "GRUNTM_25", + "GRUNTM_26", + "GRUNTM_27", + "GRUNTM_28", + "GRUNTM_29", + "GRUNTM_30", + "GRUNTM_31" + ], + "GUITARIST": [ + "CLYDE", + "VINCENT" + ], + "HIKER": [ + "ANTHONY1", + "RUSSELL", + "PHILLIP", + "LEONARD", + "ANTHONY2", + "BENJAMIN", + "ERIK", + "MICHAEL", + "PARRY1", + "TIMOTHY", + "BAILEY", + "ANTHONY3", + "TIM", + "NOLAND", + "SIDNEY", + "KENNY", + "JIM", + "DANIEL", + "PARRY2", + "PARRY3" + ], + "JANINE": [ + "JANINE1" + ], + "JASMINE": [ + "JASMINE1" + ], + "JUGGLER": [ + "IRWIN1", + "FRITZ", + "HORTON", + "IRWIN2", + "IRWIN3" + ], + "KAREN": [ + "KAREN1" + ], + "KIMONO_GIRL": [ + "KYOKO", + "NAOKO", + "SAYO", + "ZUKI", + "KUNI", + "MIKI" + ], + "KOGA": [ + "KOGA1" + ], + "LASS": [ + "CARRIE", + "BRIDGET", + "ALICE", + "KRISE", + "CONNIE1", + "LINDA", + "LAURA", + "SHANNON", + "MICHELLE", + "DANA1", + "ELLEN", + "CONNIE2", + "CONNIE3", + "DANA2", + "DANA3" + ], + "LT_SURGE": [ + "LT_SURGE1" + ], + "MEDIUM": [ + "MARTHA", + "GRACE", + "BETHANY", + "MARGRET", + "ETHEL", + "REBECCA", + "DORIS" + ], + "MISTY": [ + "MISTY1" + ], + "MORTY": [ + "MORTY1" + ], + "OFFICER": [ + "KEITH", + "DIRK" + ], + "PICNICKER": [ + "LIZ1", + "GINA1", + "BROOKE", + "KIM", + "CINDY", + "HOPE", + "SHARON", + "DEBRA", + "GINA2", + "ERIN1", + "LIZ2", + "LIZ3", + "HEIDI", + "EDNA", + "GINA3", + "TIFFANY1", + "TIFFANY2", + "ERIN2", + "TANYA", + "TIFFANY3", + "ERIN3" + ], + "POKEFANF": [ + "BEVERLY1", + "RUTH", + "BEVERLY2", + "BEVERLY3", + "GEORGIA" + ], + "POKEFANM": [ + "WILLIAM", + "DEREK1", + "ROBERT", + "JOSHUA", + "CARTER", + "TREVOR", + "BRANDON", + "JEREMY", + "COLIN", + "DEREK2", + "DEREK3", + "ALEX" + ], + "POKEMANIAC": [ + "LARRY", + "ANDREW", + "CALVIN", + "SHANE", + "BEN", + "BRENT1", + "RON", + "ETHAN", + "BRENT2", + "BRENT3", + "ISSAC", + "DONALD", + "ZACH" + ], + "POKEMON_PROF": [], + "PRYCE": [ + "PRYCE1" + ], + "PSYCHIC_T": [ + "NATHAN", + "FRANKLIN", + "HERMAN", + "FIDEL", + "GREG", + "NORMAN", + "MARK", + "PHIL", + "RICHARD", + "GILBERT", + "JARED", + "RODNEY" + ], + "RED": [ + "RED1" + ], + "RIVAL1": [ + "RIVAL1_1_CHIKORITA", + "RIVAL1_1_CYNDAQUIL", + "RIVAL1_1_TOTODILE", + "RIVAL1_2_CHIKORITA", + "RIVAL1_2_CYNDAQUIL", + "RIVAL1_2_TOTODILE", + "RIVAL1_3_CHIKORITA", + "RIVAL1_3_CYNDAQUIL", + "RIVAL1_3_TOTODILE", + "RIVAL1_4_CHIKORITA", + "RIVAL1_4_CYNDAQUIL", + "RIVAL1_4_TOTODILE", + "RIVAL1_5_CHIKORITA", + "RIVAL1_5_CYNDAQUIL", + "RIVAL1_5_TOTODILE" + ], + "RIVAL2": [ + "RIVAL2_1_CHIKORITA", + "RIVAL2_1_CYNDAQUIL", + "RIVAL2_1_TOTODILE", + "RIVAL2_2_CHIKORITA", + "RIVAL2_2_CYNDAQUIL", + "RIVAL2_2_TOTODILE" + ], + "SABRINA": [ + "SABRINA1" + ], + "SAGE": [ + "CHOW", + "NICO", + "JIN", + "TROY", + "JEFFREY", + "PING", + "EDMOND", + "NEAL", + "LI" + ], + "SAILOR": [ + "EUGENE", + "HUEY1", + "TERRELL", + "KENT", + "ERNEST", + "JEFF", + "GARRETT", + "KENNETH", + "STANLY", + "HARRY", + "HUEY2", + "HUEY3" + ], + "SCHOOLBOY": [ + "JACK1", + "KIPP", + "ALAN1", + "JOHNNY", + "DANNY", + "TOMMY", + "DUDLEY", + "JOE", + "BILLY", + "CHAD1", + "NATE", + "RICKY", + "JACK2", + "JACK3", + "ALAN2", + "ALAN3", + "CHAD2", + "CHAD3" + ], + "SCIENTIST": [ + "ROSS", + "MITCH", + "JED", + "MARC", + "RICH" + ], + "SKIER": [ + "ROXANNE", + "CLARISSA" + ], + "SUPER_NERD": [ + "ERIC_UNUSED", + "ERIC", + "GREGG", + "JAY", + "DAVE", + "SAM", + "TOM", + "PAT", + "SHAWN", + "TERU", + "RUSS", + "NORTON" + ], + "SWIMMERF": [ + "ELAINE", + "PAULA", + "KAYLEE", + "SUSIE", + "DENISE", + "KARA", + "WENDY", + "LISA", + "JILL", + "MARY", + "KATIE", + "DAWN", + "TARA", + "NICOLE", + "LORI", + "JODY", + "NIKKI", + "DIANA", + "BRIANA" + ], + "SWIMMERM": [ + "HAROLD", + "SIMON", + "RANDALL", + "CHARLIE", + "GEORGE", + "BERKE", + "KIRK", + "MATHEW", + "HAL", + "PATON", + "DARYL", + "WALTER", + "TONY", + "JEROME", + "TUCKER", + "RICK", + "CAMERON", + "SETH", + "JAMES", + "LEWIS", + "PARKER" + ], + "TEACHER": [ + "COLETTE", + "HILLARY", + "SHIRLEY" + ], + "TRAINER_NONE": [], + "TWINS": [ + "AMYANDMAY1", + "ANNANDANNE1", + "ANNANDANNE2", + "AMYANDMAY2", + "JOANDZOE1", + "JOANDZOE2", + "MEGANDPEG1", + "MEGANDPEG2" + ], + "WHITNEY": [ + "WHITNEY1" + ], + "WILL": [ + "WILL1" + ], + "YOUNGSTER": [ + "JOEY1", + "MIKEY", + "ALBERT", + "GORDON", + "SAMUEL", + "IAN", + "JOEY2", + "JOEY3", + "WARREN", + "JIMMY", + "OWEN", + "JASON" + ] + }, + "trainerClassOrder": [ + "TRAINER_NONE", + "FALKNER", + "WHITNEY", + "BUGSY", + "MORTY", + "PRYCE", + "JASMINE", + "CHUCK", + "CLAIR", + "RIVAL1", + "POKEMON_PROF", + "WILL", + "CAL", + "BRUNO", + "KAREN", + "KOGA", + "CHAMPION", + "BROCK", + "MISTY", + "LT_SURGE", + "SCIENTIST", + "ERIKA", + "YOUNGSTER", + "SCHOOLBOY", + "BIRD_KEEPER", + "LASS", + "JANINE", + "COOLTRAINERM", + "COOLTRAINERF", + "BEAUTY", + "POKEMANIAC", + "GRUNTM", + "GENTLEMAN", + "SKIER", + "TEACHER", + "SABRINA", + "BUG_CATCHER", + "FISHER", + "SWIMMERM", + "SWIMMERF", + "SAILOR", + "SUPER_NERD", + "RIVAL2", + "GUITARIST", + "HIKER", + "BIKER", + "BLAINE", + "BURGLAR", + "FIREBREATHER", + "JUGGLER", + "BLACKBELT_T", + "EXECUTIVEM", + "PSYCHIC_T", + "PICNICKER", + "CAMPER", + "EXECUTIVEF", + "SAGE", + "MEDIUM", + "BOARDER", + "POKEFANM", + "KIMONO_GIRL", + "TWINS", + "POKEFANF", + "RED", + "BLUE", + "OFFICER", + "GRUNTF" + ], + "trainerTypeOrder": [ + "TRAINERTYPE_NORMAL", + "TRAINERTYPE_MOVES", + "TRAINERTYPE_ITEM", + "TRAINERTYPE_ITEM_MOVES" + ], + "treeMonSetOrder": [ + "TREEMON_SET_NONE", + "TREEMON_SET_FOREST", + "TREEMON_SET_CANYON", + "TREEMON_SET_ROCK", + "TREEMON_SET_UNUSED", + "TREEMON_SET_CITY" + ], + "types": { + "BIRD": 6, + "BUG": 7, + "CURSE_TYPE": 19, + "DARK": 27, + "DRAGON": 26, + "ELECTRIC": 23, + "FIGHTING": 1, + "FIRE": 20, + "FLYING": 2, + "GHOST": 8, + "GRASS": 22, + "GROUND": 4, + "ICE": 25, + "NORMAL": 0, + "POISON": 3, + "PSYCHIC_TYPE": 24, + "ROCK": 5, + "STEEL": 9, + "WATER": 21 + } + }, + "fontCharmap": [ + { + "code": 96, + "seq": "" + }, + { + "code": 97, + "seq": "" + }, + { + "code": 98, + "seq": "" + }, + { + "code": 99, + "seq": "" + }, + { + "code": 100, + "seq": "" + }, + { + "code": 101, + "seq": "" + }, + { + "code": 102, + "seq": "" + }, + { + "code": 103, + "seq": "" + }, + { + "code": 104, + "seq": "" + }, + { + "code": 107, + "seq": "" + }, + { + "code": 108, + "seq": "" + }, + { + "code": 106, + "seq": "" + }, + { + "code": 105, + "seq": "" + }, + { + "code": 109, + "seq": "" + }, + { + "code": 242, + "seq": "" + }, + { + "code": 112, + "seq": "" + }, + { + "code": 115, + "seq": "" + }, + { + "code": 113, + "seq": "" + }, + { + "code": 110, + "seq": "" + }, + { + "code": 226, + "seq": "" + }, + { + "code": 225, + "seq": "" + }, + { + "code": 112, + "seq": "" + }, + { + "code": 208, + "seq": "'d" + }, + { + "code": 209, + "seq": "'l" + }, + { + "code": 210, + "seq": "'m" + }, + { + "code": 211, + "seq": "'r" + }, + { + "code": 212, + "seq": "'s" + }, + { + "code": 213, + "seq": "'t" + }, + { + "code": 214, + "seq": "'v" + }, + { + "code": 127, + "seq": " " + }, + { + "code": 231, + "seq": "!" + }, + { + "code": 115, + "seq": "\"" + }, + { + "code": 233, + "seq": "&" + }, + { + "code": 224, + "seq": "'" + }, + { + "code": 154, + "seq": "(" + }, + { + "code": 155, + "seq": ")" + }, + { + "code": 244, + "seq": "," + }, + { + "code": 227, + "seq": "-" + }, + { + "code": 232, + "seq": "." + }, + { + "code": 243, + "seq": "/" + }, + { + "code": 246, + "seq": "0" + }, + { + "code": 247, + "seq": "1" + }, + { + "code": 248, + "seq": "2" + }, + { + "code": 249, + "seq": "3" + }, + { + "code": 250, + "seq": "4" + }, + { + "code": 251, + "seq": "5" + }, + { + "code": 252, + "seq": "6" + }, + { + "code": 253, + "seq": "7" + }, + { + "code": 254, + "seq": "8" + }, + { + "code": 255, + "seq": "9" + }, + { + "code": 156, + "seq": ":" + }, + { + "code": 157, + "seq": ";" + }, + { + "code": 230, + "seq": "?" + }, + { + "code": 128, + "seq": "A" + }, + { + "code": 129, + "seq": "B" + }, + { + "code": 130, + "seq": "C" + }, + { + "code": 131, + "seq": "D" + }, + { + "code": 132, + "seq": "E" + }, + { + "code": 133, + "seq": "F" + }, + { + "code": 134, + "seq": "G" + }, + { + "code": 135, + "seq": "H" + }, + { + "code": 136, + "seq": "I" + }, + { + "code": 137, + "seq": "J" + }, + { + "code": 138, + "seq": "K" + }, + { + "code": 139, + "seq": "L" + }, + { + "code": 140, + "seq": "M" + }, + { + "code": 141, + "seq": "N" + }, + { + "code": 142, + "seq": "O" + }, + { + "code": 143, + "seq": "P" + }, + { + "code": 144, + "seq": "Q" + }, + { + "code": 145, + "seq": "R" + }, + { + "code": 146, + "seq": "S" + }, + { + "code": 147, + "seq": "T" + }, + { + "code": 148, + "seq": "U" + }, + { + "code": 149, + "seq": "V" + }, + { + "code": 150, + "seq": "W" + }, + { + "code": 151, + "seq": "X" + }, + { + "code": 152, + "seq": "Y" + }, + { + "code": 153, + "seq": "Z" + }, + { + "code": 158, + "seq": "[" + }, + { + "code": 159, + "seq": "]" + }, + { + "code": 160, + "seq": "a" + }, + { + "code": 161, + "seq": "b" + }, + { + "code": 162, + "seq": "c" + }, + { + "code": 163, + "seq": "d" + }, + { + "code": 164, + "seq": "e" + }, + { + "code": 165, + "seq": "f" + }, + { + "code": 166, + "seq": "g" + }, + { + "code": 167, + "seq": "h" + }, + { + "code": 168, + "seq": "i" + }, + { + "code": 169, + "seq": "j" + }, + { + "code": 170, + "seq": "k" + }, + { + "code": 171, + "seq": "l" + }, + { + "code": 172, + "seq": "m" + }, + { + "code": 173, + "seq": "n" + }, + { + "code": 174, + "seq": "o" + }, + { + "code": 175, + "seq": "p" + }, + { + "code": 176, + "seq": "q" + }, + { + "code": 177, + "seq": "r" + }, + { + "code": 178, + "seq": "s" + }, + { + "code": 179, + "seq": "t" + }, + { + "code": 180, + "seq": "u" + }, + { + "code": 181, + "seq": "v" + }, + { + "code": 182, + "seq": "w" + }, + { + "code": 183, + "seq": "x" + }, + { + "code": 184, + "seq": "y" + }, + { + "code": 185, + "seq": "z" + }, + { + "code": 240, + "seq": "¥" + }, + { + "code": 116, + "seq": "·" + }, + { + "code": 192, + "seq": "Ä" + }, + { + "code": 193, + "seq": "Ö" + }, + { + "code": 241, + "seq": "×" + }, + { + "code": 194, + "seq": "Ü" + }, + { + "code": 195, + "seq": "ä" + }, + { + "code": 234, + "seq": "é" + }, + { + "code": 196, + "seq": "ö" + }, + { + "code": 197, + "seq": "ü" + }, + { + "code": 114, + "seq": "“" + }, + { + "code": 115, + "seq": "”" + }, + { + "code": 117, + "seq": "…" + }, + { + "code": 110, + "seq": "′" + }, + { + "code": 111, + "seq": "″" + }, + { + "code": 116, + "seq": "№" + }, + { + "code": 223, + "seq": "←" + }, + { + "code": 235, + "seq": "→" + }, + { + "code": 117, + "seq": "⋯" + }, + { + "code": 122, + "seq": "─" + }, + { + "code": 124, + "seq": "│" + }, + { + "code": 121, + "seq": "┌" + }, + { + "code": 123, + "seq": "┐" + }, + { + "code": 125, + "seq": "└" + }, + { + "code": 126, + "seq": "┘" + }, + { + "code": 96, + "seq": "■" + }, + { + "code": 97, + "seq": "▲" + }, + { + "code": 237, + "seq": "▶" + }, + { + "code": 236, + "seq": "▷" + }, + { + "code": 238, + "seq": "▼" + }, + { + "code": 113, + "seq": "◀" + }, + { + "code": 98, + "seq": "☎" + }, + { + "code": 245, + "seq": "♀" + }, + { + "code": 239, + "seq": "♂" + }, + { + "code": 127, + "seq": " " + }, + { + "code": 232, + "seq": "。" + }, + { + "code": 112, + "seq": "「" + }, + { + "code": 113, + "seq": "」" + }, + { + "code": 114, + "seq": "『" + }, + { + "code": 115, + "seq": "』" + }, + { + "code": 118, + "seq": "ぁ" + }, + { + "code": 177, + "seq": "あ" + }, + { + "code": 110, + "seq": "ぃ" + }, + { + "code": 178, + "seq": "い" + }, + { + "code": 111, + "seq": "ぅ" + }, + { + "code": 179, + "seq": "う" + }, + { + "code": 119, + "seq": "ぇ" + }, + { + "code": 180, + "seq": "え" + }, + { + "code": 120, + "seq": "ぉ" + }, + { + "code": 181, + "seq": "お" + }, + { + "code": 182, + "seq": "か" + }, + { + "code": 183, + "seq": "き" + }, + { + "code": 184, + "seq": "く" + }, + { + "code": 185, + "seq": "け" + }, + { + "code": 186, + "seq": "こ" + }, + { + "code": 187, + "seq": "さ" + }, + { + "code": 188, + "seq": "し" + }, + { + "code": 189, + "seq": "す" + }, + { + "code": 190, + "seq": "せ" + }, + { + "code": 191, + "seq": "そ" + }, + { + "code": 192, + "seq": "た" + }, + { + "code": 193, + "seq": "ち" + }, + { + "code": 223, + "seq": "っ" + }, + { + "code": 194, + "seq": "つ" + }, + { + "code": 195, + "seq": "て" + }, + { + "code": 196, + "seq": "と" + }, + { + "code": 197, + "seq": "な" + }, + { + "code": 198, + "seq": "に" + }, + { + "code": 199, + "seq": "ぬ" + }, + { + "code": 200, + "seq": "ね" + }, + { + "code": 201, + "seq": "の" + }, + { + "code": 202, + "seq": "は" + }, + { + "code": 203, + "seq": "ひ" + }, + { + "code": 204, + "seq": "ふ" + }, + { + "code": 205, + "seq": "へ" + }, + { + "code": 206, + "seq": "ほ" + }, + { + "code": 207, + "seq": "ま" + }, + { + "code": 208, + "seq": "み" + }, + { + "code": 209, + "seq": "む" + }, + { + "code": 210, + "seq": "め" + }, + { + "code": 211, + "seq": "も" + }, + { + "code": 224, + "seq": "ゃ" + }, + { + "code": 212, + "seq": "や" + }, + { + "code": 225, + "seq": "ゅ" + }, + { + "code": 213, + "seq": "ゆ" + }, + { + "code": 226, + "seq": "ょ" + }, + { + "code": 214, + "seq": "よ" + }, + { + "code": 215, + "seq": "ら" + }, + { + "code": 216, + "seq": "り" + }, + { + "code": 217, + "seq": "る" + }, + { + "code": 218, + "seq": "れ" + }, + { + "code": 219, + "seq": "ろ" + }, + { + "code": 220, + "seq": "わ" + }, + { + "code": 221, + "seq": "を" + }, + { + "code": 222, + "seq": "ん" + }, + { + "code": 233, + "seq": "ァ" + }, + { + "code": 128, + "seq": "ア" + }, + { + "code": 176, + "seq": "ィ" + }, + { + "code": 129, + "seq": "イ" + }, + { + "code": 234, + "seq": "ゥ" + }, + { + "code": 130, + "seq": "ウ" + }, + { + "code": 235, + "seq": "ェ" + }, + { + "code": 131, + "seq": "エ" + }, + { + "code": 244, + "seq": "ォ" + }, + { + "code": 132, + "seq": "オ" + }, + { + "code": 133, + "seq": "カ" + }, + { + "code": 134, + "seq": "キ" + }, + { + "code": 135, + "seq": "ク" + }, + { + "code": 136, + "seq": "ケ" + }, + { + "code": 137, + "seq": "コ" + }, + { + "code": 138, + "seq": "サ" + }, + { + "code": 139, + "seq": "シ" + }, + { + "code": 140, + "seq": "ス" + }, + { + "code": 141, + "seq": "セ" + }, + { + "code": 142, + "seq": "ソ" + }, + { + "code": 143, + "seq": "タ" + }, + { + "code": 144, + "seq": "チ" + }, + { + "code": 172, + "seq": "ッ" + }, + { + "code": 145, + "seq": "ツ" + }, + { + "code": 146, + "seq": "テ" + }, + { + "code": 147, + "seq": "ト" + }, + { + "code": 148, + "seq": "ナ" + }, + { + "code": 149, + "seq": "ニ" + }, + { + "code": 150, + "seq": "ヌ" + }, + { + "code": 151, + "seq": "ネ" + }, + { + "code": 152, + "seq": "ノ" + }, + { + "code": 153, + "seq": "ハ" + }, + { + "code": 154, + "seq": "ヒ" + }, + { + "code": 155, + "seq": "フ" + }, + { + "code": 156, + "seq": "ホ" + }, + { + "code": 157, + "seq": "マ" + }, + { + "code": 158, + "seq": "ミ" + }, + { + "code": 159, + "seq": "ム" + }, + { + "code": 160, + "seq": "メ" + }, + { + "code": 161, + "seq": "モ" + }, + { + "code": 173, + "seq": "ャ" + }, + { + "code": 162, + "seq": "ヤ" + }, + { + "code": 174, + "seq": "ュ" + }, + { + "code": 163, + "seq": "ユ" + }, + { + "code": 175, + "seq": "ョ" + }, + { + "code": 164, + "seq": "ヨ" + }, + { + "code": 165, + "seq": "ラ" + }, + { + "code": 166, + "seq": "ル" + }, + { + "code": 167, + "seq": "レ" + }, + { + "code": 168, + "seq": "ロ" + }, + { + "code": 169, + "seq": "ワ" + }, + { + "code": 170, + "seq": "ヲ" + }, + { + "code": 171, + "seq": "ン" + }, + { + "code": 116, + "seq": "・" + }, + { + "code": 227, + "seq": "ー" + }, + { + "code": 240, + "seq": "円" + }, + { + "code": 231, + "seq": "!" + }, + { + "code": 242, + "seq": "." + }, + { + "code": 243, + "seq": "/" + }, + { + "code": 246, + "seq": "0" + }, + { + "code": 247, + "seq": "1" + }, + { + "code": 248, + "seq": "2" + }, + { + "code": 249, + "seq": "3" + }, + { + "code": 250, + "seq": "4" + }, + { + "code": 251, + "seq": "5" + }, + { + "code": 252, + "seq": "6" + }, + { + "code": 253, + "seq": "7" + }, + { + "code": 254, + "seq": "8" + }, + { + "code": 255, + "seq": "9" + }, + { + "code": 230, + "seq": "?" + }, + { + "code": 229, + "seq": "゙" + }, + { + "code": 228, + "seq": "゚" + } + ], + "format": 3, + "generation": 2, + "maps": { + "AZALEA_GYM": { + "group": 8, + "height": 8, + "map": 5, + "name": "AZALEA_GYM", + "width": 5 + }, + "AZALEA_MART": { + "group": 8, + "height": 4, + "map": 3, + "name": "AZALEA_MART", + "width": 6 + }, + "AZALEA_POKECENTER_1F": { + "group": 8, + "height": 4, + "map": 1, + "name": "AZALEA_POKECENTER_1F", + "width": 5 + }, + "AZALEA_TOWN": { + "group": 8, + "height": 9, + "map": 7, + "name": "AZALEA_TOWN", + "width": 20 + }, + "BILLS_FAMILYS_HOUSE": { + "group": 11, + "height": 4, + "map": 6, + "name": "BILLS_FAMILYS_HOUSE", + "width": 4 + }, + "BILLS_HOUSE": { + "group": 7, + "height": 4, + "map": 11, + "name": "BILLS_HOUSE", + "width": 4 + }, + "BILLS_OLDER_SISTERS_HOUSE": { + "group": 17, + "height": 4, + "map": 9, + "name": "BILLS_OLDER_SISTERS_HOUSE", + "width": 4 + }, + "BLACKTHORN_CITY": { + "group": 5, + "height": 18, + "map": 10, + "name": "BLACKTHORN_CITY", + "width": 20 + }, + "BLACKTHORN_DRAGON_SPEECH_HOUSE": { + "group": 5, + "height": 4, + "map": 3, + "name": "BLACKTHORN_DRAGON_SPEECH_HOUSE", + "width": 4 + }, + "BLACKTHORN_EMYS_HOUSE": { + "group": 5, + "height": 4, + "map": 4, + "name": "BLACKTHORN_EMYS_HOUSE", + "width": 4 + }, + "BLACKTHORN_GYM_1F": { + "group": 5, + "height": 9, + "map": 1, + "name": "BLACKTHORN_GYM_1F", + "width": 5 + }, + "BLACKTHORN_GYM_2F": { + "group": 5, + "height": 9, + "map": 2, + "name": "BLACKTHORN_GYM_2F", + "width": 5 + }, + "BLACKTHORN_MART": { + "group": 5, + "height": 4, + "map": 5, + "name": "BLACKTHORN_MART", + "width": 6 + }, + "BLACKTHORN_POKECENTER_1F": { + "group": 5, + "height": 4, + "map": 6, + "name": "BLACKTHORN_POKECENTER_1F", + "width": 5 + }, + "BLUES_HOUSE": { + "group": 13, + "height": 4, + "map": 5, + "name": "BLUES_HOUSE", + "width": 4 + }, + "BRUNOS_ROOM": { + "group": 16, + "height": 9, + "map": 5, + "name": "BRUNOS_ROOM", + "width": 5 + }, + "BURNED_TOWER_1F": { + "group": 3, + "height": 9, + "map": 13, + "name": "BURNED_TOWER_1F", + "width": 10 + }, + "BURNED_TOWER_B1F": { + "group": 3, + "height": 9, + "map": 14, + "name": "BURNED_TOWER_B1F", + "width": 10 + }, + "CELADON_CAFE": { + "group": 21, + "height": 4, + "map": 22, + "name": "CELADON_CAFE", + "width": 6 + }, + "CELADON_CITY": { + "group": 21, + "height": 18, + "map": 4, + "name": "CELADON_CITY", + "width": 20 + }, + "CELADON_DEPT_STORE_1F": { + "group": 21, + "height": 4, + "map": 5, + "name": "CELADON_DEPT_STORE_1F", + "width": 8 + }, + "CELADON_DEPT_STORE_2F": { + "group": 21, + "height": 4, + "map": 6, + "name": "CELADON_DEPT_STORE_2F", + "width": 8 + }, + "CELADON_DEPT_STORE_3F": { + "group": 21, + "height": 4, + "map": 7, + "name": "CELADON_DEPT_STORE_3F", + "width": 8 + }, + "CELADON_DEPT_STORE_4F": { + "group": 21, + "height": 4, + "map": 8, + "name": "CELADON_DEPT_STORE_4F", + "width": 8 + }, + "CELADON_DEPT_STORE_5F": { + "group": 21, + "height": 4, + "map": 9, + "name": "CELADON_DEPT_STORE_5F", + "width": 8 + }, + "CELADON_DEPT_STORE_6F": { + "group": 21, + "height": 4, + "map": 10, + "name": "CELADON_DEPT_STORE_6F", + "width": 8 + }, + "CELADON_DEPT_STORE_ELEVATOR": { + "group": 21, + "height": 2, + "map": 11, + "name": "CELADON_DEPT_STORE_ELEVATOR", + "width": 2 + }, + "CELADON_GAME_CORNER": { + "group": 21, + "height": 7, + "map": 19, + "name": "CELADON_GAME_CORNER", + "width": 10 + }, + "CELADON_GAME_CORNER_PRIZE_ROOM": { + "group": 21, + "height": 3, + "map": 20, + "name": "CELADON_GAME_CORNER_PRIZE_ROOM", + "width": 3 + }, + "CELADON_GYM": { + "group": 21, + "height": 9, + "map": 21, + "name": "CELADON_GYM", + "width": 5 + }, + "CELADON_MANSION_1F": { + "group": 21, + "height": 5, + "map": 12, + "name": "CELADON_MANSION_1F", + "width": 4 + }, + "CELADON_MANSION_2F": { + "group": 21, + "height": 5, + "map": 13, + "name": "CELADON_MANSION_2F", + "width": 4 + }, + "CELADON_MANSION_3F": { + "group": 21, + "height": 5, + "map": 14, + "name": "CELADON_MANSION_3F", + "width": 4 + }, + "CELADON_MANSION_ROOF": { + "group": 21, + "height": 5, + "map": 15, + "name": "CELADON_MANSION_ROOF", + "width": 4 + }, + "CELADON_MANSION_ROOF_HOUSE": { + "group": 21, + "height": 4, + "map": 16, + "name": "CELADON_MANSION_ROOF_HOUSE", + "width": 4 + }, + "CELADON_POKECENTER_1F": { + "group": 21, + "height": 4, + "map": 17, + "name": "CELADON_POKECENTER_1F", + "width": 5 + }, + "CELADON_POKECENTER_2F_BETA": { + "group": 21, + "height": 4, + "map": 18, + "name": "CELADON_POKECENTER_2F_BETA", + "width": 8 + }, + "CERULEAN_CITY": { + "group": 7, + "height": 18, + "map": 17, + "name": "CERULEAN_CITY", + "width": 20 + }, + "CERULEAN_GYM": { + "group": 7, + "height": 8, + "map": 6, + "name": "CERULEAN_GYM", + "width": 5 + }, + "CERULEAN_GYM_BADGE_SPEECH_HOUSE": { + "group": 7, + "height": 4, + "map": 1, + "name": "CERULEAN_GYM_BADGE_SPEECH_HOUSE", + "width": 4 + }, + "CERULEAN_MART": { + "group": 7, + "height": 4, + "map": 7, + "name": "CERULEAN_MART", + "width": 6 + }, + "CERULEAN_POKECENTER_1F": { + "group": 7, + "height": 4, + "map": 4, + "name": "CERULEAN_POKECENTER_1F", + "width": 5 + }, + "CERULEAN_POKECENTER_2F_BETA": { + "group": 7, + "height": 4, + "map": 5, + "name": "CERULEAN_POKECENTER_2F_BETA", + "width": 8 + }, + "CERULEAN_POLICE_STATION": { + "group": 7, + "height": 4, + "map": 2, + "name": "CERULEAN_POLICE_STATION", + "width": 4 + }, + "CERULEAN_TRADE_SPEECH_HOUSE": { + "group": 7, + "height": 4, + "map": 3, + "name": "CERULEAN_TRADE_SPEECH_HOUSE", + "width": 4 + }, + "CHARCOAL_KILN": { + "group": 8, + "height": 4, + "map": 2, + "name": "CHARCOAL_KILN", + "width": 4 + }, + "CHERRYGROVE_CITY": { + "group": 26, + "height": 9, + "map": 3, + "name": "CHERRYGROVE_CITY", + "width": 20 + }, + "CHERRYGROVE_EVOLUTION_SPEECH_HOUSE": { + "group": 26, + "height": 4, + "map": 8, + "name": "CHERRYGROVE_EVOLUTION_SPEECH_HOUSE", + "width": 4 + }, + "CHERRYGROVE_GYM_SPEECH_HOUSE": { + "group": 26, + "height": 4, + "map": 6, + "name": "CHERRYGROVE_GYM_SPEECH_HOUSE", + "width": 4 + }, + "CHERRYGROVE_MART": { + "group": 26, + "height": 4, + "map": 4, + "name": "CHERRYGROVE_MART", + "width": 6 + }, + "CHERRYGROVE_POKECENTER_1F": { + "group": 26, + "height": 4, + "map": 5, + "name": "CHERRYGROVE_POKECENTER_1F", + "width": 5 + }, + "CIANWOOD_CITY": { + "group": 22, + "height": 27, + "map": 3, + "name": "CIANWOOD_CITY", + "width": 15 + }, + "CIANWOOD_GYM": { + "group": 22, + "height": 9, + "map": 5, + "name": "CIANWOOD_GYM", + "width": 5 + }, + "CIANWOOD_LUGIA_SPEECH_HOUSE": { + "group": 22, + "height": 4, + "map": 9, + "name": "CIANWOOD_LUGIA_SPEECH_HOUSE", + "width": 4 + }, + "CIANWOOD_PHARMACY": { + "group": 22, + "height": 4, + "map": 7, + "name": "CIANWOOD_PHARMACY", + "width": 4 + }, + "CIANWOOD_PHOTO_STUDIO": { + "group": 22, + "height": 4, + "map": 8, + "name": "CIANWOOD_PHOTO_STUDIO", + "width": 4 + }, + "CIANWOOD_POKECENTER_1F": { + "group": 22, + "height": 4, + "map": 6, + "name": "CIANWOOD_POKECENTER_1F", + "width": 5 + }, + "CINNABAR_ISLAND": { + "group": 6, + "height": 9, + "map": 8, + "name": "CINNABAR_ISLAND", + "width": 10 + }, + "CINNABAR_POKECENTER_1F": { + "group": 6, + "height": 4, + "map": 1, + "name": "CINNABAR_POKECENTER_1F", + "width": 5 + }, + "CINNABAR_POKECENTER_2F_BETA": { + "group": 6, + "height": 4, + "map": 2, + "name": "CINNABAR_POKECENTER_2F_BETA", + "width": 8 + }, + "COLOSSEUM": { + "group": 20, + "height": 4, + "map": 3, + "name": "COLOSSEUM", + "width": 5 + }, + "COPYCATS_HOUSE_1F": { + "group": 25, + "height": 4, + "map": 11, + "name": "COPYCATS_HOUSE_1F", + "width": 4 + }, + "COPYCATS_HOUSE_2F": { + "group": 25, + "height": 3, + "map": 12, + "name": "COPYCATS_HOUSE_2F", + "width": 5 + }, + "DANCE_THEATER": { + "group": 4, + "height": 7, + "map": 5, + "name": "DANCE_THEATER", + "width": 6 + }, + "DARK_CAVE_BLACKTHORN_ENTRANCE": { + "group": 3, + "height": 18, + "map": 71, + "name": "DARK_CAVE_BLACKTHORN_ENTRANCE", + "width": 15 + }, + "DARK_CAVE_VIOLET_ENTRANCE": { + "group": 3, + "height": 18, + "map": 70, + "name": "DARK_CAVE_VIOLET_ENTRANCE", + "width": 20 + }, + "DAY_CARE": { + "group": 11, + "height": 4, + "map": 22, + "name": "DAY_CARE", + "width": 5 + }, + "DAY_OF_WEEK_SIBLINGS_HOUSE": { + "group": 24, + "height": 4, + "map": 11, + "name": "DAY_OF_WEEK_SIBLINGS_HOUSE", + "width": 4 + }, + "DIGLETTS_CAVE": { + "group": 3, + "height": 18, + "map": 75, + "name": "DIGLETTS_CAVE", + "width": 10 + }, + "DRAGONS_DEN_1F": { + "group": 3, + "height": 9, + "map": 72, + "name": "DRAGONS_DEN_1F", + "width": 5 + }, + "DRAGONS_DEN_B1F": { + "group": 3, + "height": 18, + "map": 73, + "name": "DRAGONS_DEN_B1F", + "width": 20 + }, + "EARLS_POKEMON_ACADEMY": { + "group": 10, + "height": 8, + "map": 8, + "name": "EARLS_POKEMON_ACADEMY", + "width": 4 + }, + "ECRUTEAK_CITY": { + "group": 4, + "height": 18, + "map": 9, + "name": "ECRUTEAK_CITY", + "width": 20 + }, + "ECRUTEAK_GYM": { + "group": 4, + "height": 9, + "map": 7, + "name": "ECRUTEAK_GYM", + "width": 5 + }, + "ECRUTEAK_ITEMFINDER_HOUSE": { + "group": 4, + "height": 4, + "map": 8, + "name": "ECRUTEAK_ITEMFINDER_HOUSE", + "width": 4 + }, + "ECRUTEAK_LUGIA_SPEECH_HOUSE": { + "group": 4, + "height": 4, + "map": 4, + "name": "ECRUTEAK_LUGIA_SPEECH_HOUSE", + "width": 4 + }, + "ECRUTEAK_MART": { + "group": 4, + "height": 4, + "map": 6, + "name": "ECRUTEAK_MART", + "width": 6 + }, + "ECRUTEAK_POKECENTER_1F": { + "group": 4, + "height": 4, + "map": 3, + "name": "ECRUTEAK_POKECENTER_1F", + "width": 5 + }, + "ECRUTEAK_TIN_TOWER_BACK_ENTRANCE": { + "group": 4, + "height": 4, + "map": 2, + "name": "ECRUTEAK_TIN_TOWER_BACK_ENTRANCE", + "width": 4 + }, + "ECRUTEAK_TIN_TOWER_ENTRANCE": { + "group": 4, + "height": 9, + "map": 1, + "name": "ECRUTEAK_TIN_TOWER_ENTRANCE", + "width": 10 + }, + "ELMS_HOUSE": { + "group": 24, + "height": 4, + "map": 9, + "name": "ELMS_HOUSE", + "width": 4 + }, + "ELMS_LAB": { + "group": 24, + "height": 6, + "map": 5, + "name": "ELMS_LAB", + "width": 5 + }, + "FAST_SHIP_1F": { + "group": 15, + "height": 9, + "map": 3, + "name": "FAST_SHIP_1F", + "width": 16 + }, + "FAST_SHIP_B1F": { + "group": 15, + "height": 8, + "map": 7, + "name": "FAST_SHIP_B1F", + "width": 16 + }, + "FAST_SHIP_CABINS_NNW_NNE_NE": { + "group": 15, + "height": 16, + "map": 4, + "name": "FAST_SHIP_CABINS_NNW_NNE_NE", + "width": 4 + }, + "FAST_SHIP_CABINS_SE_SSE_CAPTAINS_CABIN": { + "group": 15, + "height": 17, + "map": 6, + "name": "FAST_SHIP_CABINS_SE_SSE_CAPTAINS_CABIN", + "width": 5 + }, + "FAST_SHIP_CABINS_SW_SSW_NW": { + "group": 15, + "height": 16, + "map": 5, + "name": "FAST_SHIP_CABINS_SW_SSW_NW", + "width": 4 + }, + "FIGHTING_DOJO": { + "group": 25, + "height": 6, + "map": 3, + "name": "FIGHTING_DOJO", + "width": 5 + }, + "FUCHSIA_CITY": { + "group": 17, + "height": 18, + "map": 5, + "name": "FUCHSIA_CITY", + "width": 20 + }, + "FUCHSIA_GYM": { + "group": 17, + "height": 9, + "map": 8, + "name": "FUCHSIA_GYM", + "width": 5 + }, + "FUCHSIA_MART": { + "group": 17, + "height": 4, + "map": 6, + "name": "FUCHSIA_MART", + "width": 6 + }, + "FUCHSIA_POKECENTER_1F": { + "group": 17, + "height": 4, + "map": 10, + "name": "FUCHSIA_POKECENTER_1F", + "width": 5 + }, + "FUCHSIA_POKECENTER_2F_BETA": { + "group": 17, + "height": 4, + "map": 11, + "name": "FUCHSIA_POKECENTER_2F_BETA", + "width": 8 + }, + "GOLDENROD_BIKE_SHOP": { + "group": 11, + "height": 4, + "map": 4, + "name": "GOLDENROD_BIKE_SHOP", + "width": 4 + }, + "GOLDENROD_CITY": { + "group": 11, + "height": 18, + "map": 2, + "name": "GOLDENROD_CITY", + "width": 20 + }, + "GOLDENROD_DEPT_STORE_1F": { + "group": 11, + "height": 4, + "map": 12, + "name": "GOLDENROD_DEPT_STORE_1F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_2F": { + "group": 11, + "height": 4, + "map": 13, + "name": "GOLDENROD_DEPT_STORE_2F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_3F": { + "group": 11, + "height": 4, + "map": 14, + "name": "GOLDENROD_DEPT_STORE_3F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_4F": { + "group": 11, + "height": 4, + "map": 15, + "name": "GOLDENROD_DEPT_STORE_4F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_5F": { + "group": 11, + "height": 4, + "map": 16, + "name": "GOLDENROD_DEPT_STORE_5F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_6F": { + "group": 11, + "height": 4, + "map": 17, + "name": "GOLDENROD_DEPT_STORE_6F", + "width": 8 + }, + "GOLDENROD_DEPT_STORE_B1F": { + "group": 3, + "height": 9, + "map": 47, + "name": "GOLDENROD_DEPT_STORE_B1F", + "width": 10 + }, + "GOLDENROD_DEPT_STORE_ELEVATOR": { + "group": 11, + "height": 2, + "map": 18, + "name": "GOLDENROD_DEPT_STORE_ELEVATOR", + "width": 2 + }, + "GOLDENROD_FLOWER_SHOP": { + "group": 11, + "height": 4, + "map": 8, + "name": "GOLDENROD_FLOWER_SHOP", + "width": 4 + }, + "GOLDENROD_GAME_CORNER": { + "group": 11, + "height": 7, + "map": 19, + "name": "GOLDENROD_GAME_CORNER", + "width": 10 + }, + "GOLDENROD_GYM": { + "group": 11, + "height": 9, + "map": 3, + "name": "GOLDENROD_GYM", + "width": 10 + }, + "GOLDENROD_HAPPINESS_RATER": { + "group": 11, + "height": 4, + "map": 5, + "name": "GOLDENROD_HAPPINESS_RATER", + "width": 4 + }, + "GOLDENROD_MAGNET_TRAIN_STATION": { + "group": 11, + "height": 9, + "map": 7, + "name": "GOLDENROD_MAGNET_TRAIN_STATION", + "width": 10 + }, + "GOLDENROD_NAME_RATER": { + "group": 11, + "height": 4, + "map": 11, + "name": "GOLDENROD_NAME_RATER", + "width": 4 + }, + "GOLDENROD_POKECENTER_1F": { + "group": 11, + "height": 4, + "map": 9, + "name": "GOLDENROD_POKECENTER_1F", + "width": 5 + }, + "GOLDENROD_PP_SPEECH_HOUSE": { + "group": 11, + "height": 4, + "map": 10, + "name": "GOLDENROD_PP_SPEECH_HOUSE", + "width": 4 + }, + "GOLDENROD_UNDERGROUND": { + "group": 3, + "height": 18, + "map": 45, + "name": "GOLDENROD_UNDERGROUND", + "width": 15 + }, + "GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES": { + "group": 3, + "height": 18, + "map": 46, + "name": "GOLDENROD_UNDERGROUND_SWITCH_ROOM_ENTRANCES", + "width": 15 + }, + "GOLDENROD_UNDERGROUND_WAREHOUSE": { + "group": 3, + "height": 9, + "map": 48, + "name": "GOLDENROD_UNDERGROUND_WAREHOUSE", + "width": 10 + }, + "GUIDE_GENTS_HOUSE": { + "group": 26, + "height": 4, + "map": 7, + "name": "GUIDE_GENTS_HOUSE", + "width": 4 + }, + "HALL_OF_FAME": { + "group": 16, + "height": 7, + "map": 8, + "name": "HALL_OF_FAME", + "width": 5 + }, + "ICE_PATH_1F": { + "group": 3, + "height": 18, + "map": 53, + "name": "ICE_PATH_1F", + "width": 20 + }, + "ICE_PATH_B1F": { + "group": 3, + "height": 18, + "map": 54, + "name": "ICE_PATH_B1F", + "width": 10 + }, + "ICE_PATH_B2F_BLACKTHORN_SIDE": { + "group": 3, + "height": 9, + "map": 56, + "name": "ICE_PATH_B2F_BLACKTHORN_SIDE", + "width": 5 + }, + "ICE_PATH_B2F_MAHOGANY_SIDE": { + "group": 3, + "height": 9, + "map": 55, + "name": "ICE_PATH_B2F_MAHOGANY_SIDE", + "width": 10 + }, + "ICE_PATH_B3F": { + "group": 3, + "height": 9, + "map": 57, + "name": "ICE_PATH_B3F", + "width": 10 + }, + "ILEX_FOREST": { + "group": 3, + "height": 27, + "map": 44, + "name": "ILEX_FOREST", + "width": 15 + }, + "ILEX_FOREST_AZALEA_GATE": { + "group": 11, + "height": 4, + "map": 20, + "name": "ILEX_FOREST_AZALEA_GATE", + "width": 5 + }, + "INDIGO_PLATEAU_POKECENTER_1F": { + "group": 16, + "height": 7, + "map": 2, + "name": "INDIGO_PLATEAU_POKECENTER_1F", + "width": 9 + }, + "KARENS_ROOM": { + "group": 16, + "height": 9, + "map": 6, + "name": "KARENS_ROOM", + "width": 5 + }, + "KOGAS_ROOM": { + "group": 16, + "height": 9, + "map": 4, + "name": "KOGAS_ROOM", + "width": 5 + }, + "KURTS_HOUSE": { + "group": 8, + "height": 4, + "map": 4, + "name": "KURTS_HOUSE", + "width": 8 + }, + "LAKE_OF_RAGE": { + "group": 9, + "height": 18, + "map": 6, + "name": "LAKE_OF_RAGE", + "width": 20 + }, + "LAKE_OF_RAGE_HIDDEN_POWER_HOUSE": { + "group": 9, + "height": 4, + "map": 1, + "name": "LAKE_OF_RAGE_HIDDEN_POWER_HOUSE", + "width": 4 + }, + "LAKE_OF_RAGE_MAGIKARP_HOUSE": { + "group": 9, + "height": 4, + "map": 2, + "name": "LAKE_OF_RAGE_MAGIKARP_HOUSE", + "width": 4 + }, + "LANCES_ROOM": { + "group": 16, + "height": 12, + "map": 7, + "name": "LANCES_ROOM", + "width": 5 + }, + "LAVENDER_MART": { + "group": 18, + "height": 4, + "map": 10, + "name": "LAVENDER_MART", + "width": 6 + }, + "LAVENDER_NAME_RATER": { + "group": 18, + "height": 4, + "map": 9, + "name": "LAVENDER_NAME_RATER", + "width": 4 + }, + "LAVENDER_POKECENTER_1F": { + "group": 18, + "height": 4, + "map": 5, + "name": "LAVENDER_POKECENTER_1F", + "width": 5 + }, + "LAVENDER_POKECENTER_2F_BETA": { + "group": 18, + "height": 4, + "map": 6, + "name": "LAVENDER_POKECENTER_2F_BETA", + "width": 8 + }, + "LAVENDER_SPEECH_HOUSE": { + "group": 18, + "height": 4, + "map": 8, + "name": "LAVENDER_SPEECH_HOUSE", + "width": 4 + }, + "LAVENDER_TOWN": { + "group": 18, + "height": 9, + "map": 4, + "name": "LAVENDER_TOWN", + "width": 10 + }, + "LAV_RADIO_TOWER_1F": { + "group": 18, + "height": 4, + "map": 12, + "name": "LAV_RADIO_TOWER_1F", + "width": 10 + }, + "MAHOGANY_GYM": { + "group": 2, + "height": 9, + "map": 2, + "name": "MAHOGANY_GYM", + "width": 5 + }, + "MAHOGANY_MART_1F": { + "group": 3, + "height": 4, + "map": 40, + "name": "MAHOGANY_MART_1F", + "width": 4 + }, + "MAHOGANY_POKECENTER_1F": { + "group": 2, + "height": 4, + "map": 3, + "name": "MAHOGANY_POKECENTER_1F", + "width": 5 + }, + "MAHOGANY_RED_GYARADOS_SPEECH_HOUSE": { + "group": 2, + "height": 4, + "map": 1, + "name": "MAHOGANY_RED_GYARADOS_SPEECH_HOUSE", + "width": 4 + }, + "MAHOGANY_TOWN": { + "group": 2, + "height": 9, + "map": 7, + "name": "MAHOGANY_TOWN", + "width": 10 + }, + "MANIAS_HOUSE": { + "group": 22, + "height": 4, + "map": 4, + "name": "MANIAS_HOUSE", + "width": 4 + }, + "MOUNT_MOON": { + "group": 3, + "height": 9, + "map": 76, + "name": "MOUNT_MOON", + "width": 15 + }, + "MOUNT_MOON_GIFT_SHOP": { + "group": 15, + "height": 4, + "map": 11, + "name": "MOUNT_MOON_GIFT_SHOP", + "width": 4 + }, + "MOUNT_MOON_SQUARE": { + "group": 15, + "height": 9, + "map": 10, + "name": "MOUNT_MOON_SQUARE", + "width": 15 + }, + "MOUNT_MORTAR_1F_INSIDE": { + "group": 3, + "height": 27, + "map": 50, + "name": "MOUNT_MORTAR_1F_INSIDE", + "width": 20 + }, + "MOUNT_MORTAR_1F_OUTSIDE": { + "group": 3, + "height": 18, + "map": 49, + "name": "MOUNT_MORTAR_1F_OUTSIDE", + "width": 20 + }, + "MOUNT_MORTAR_2F_INSIDE": { + "group": 3, + "height": 18, + "map": 51, + "name": "MOUNT_MORTAR_2F_INSIDE", + "width": 20 + }, + "MOUNT_MORTAR_B1F": { + "group": 3, + "height": 18, + "map": 52, + "name": "MOUNT_MORTAR_B1F", + "width": 20 + }, + "MOVE_DELETERS_HOUSE": { + "group": 5, + "height": 4, + "map": 7, + "name": "MOVE_DELETERS_HOUSE", + "width": 4 + }, + "MR_FUJIS_HOUSE": { + "group": 18, + "height": 4, + "map": 7, + "name": "MR_FUJIS_HOUSE", + "width": 5 + }, + "MR_POKEMONS_HOUSE": { + "group": 26, + "height": 4, + "map": 10, + "name": "MR_POKEMONS_HOUSE", + "width": 4 + }, + "MR_PSYCHICS_HOUSE": { + "group": 25, + "height": 4, + "map": 8, + "name": "MR_PSYCHICS_HOUSE", + "width": 4 + }, + "NATIONAL_PARK": { + "group": 3, + "height": 27, + "map": 15, + "name": "NATIONAL_PARK", + "width": 20 + }, + "NATIONAL_PARK_BUG_CONTEST": { + "group": 3, + "height": 27, + "map": 16, + "name": "NATIONAL_PARK_BUG_CONTEST", + "width": 20 + }, + "NEW_BARK_TOWN": { + "group": 24, + "height": 9, + "map": 4, + "name": "NEW_BARK_TOWN", + "width": 10 + }, + "OAKS_LAB": { + "group": 13, + "height": 6, + "map": 6, + "name": "OAKS_LAB", + "width": 5 + }, + "OLIVINE_CAFE": { + "group": 1, + "height": 4, + "map": 7, + "name": "OLIVINE_CAFE", + "width": 4 + }, + "OLIVINE_CITY": { + "group": 1, + "height": 18, + "map": 14, + "name": "OLIVINE_CITY", + "width": 20 + }, + "OLIVINE_GOOD_ROD_HOUSE": { + "group": 1, + "height": 4, + "map": 6, + "name": "OLIVINE_GOOD_ROD_HOUSE", + "width": 4 + }, + "OLIVINE_GYM": { + "group": 1, + "height": 8, + "map": 2, + "name": "OLIVINE_GYM", + "width": 5 + }, + "OLIVINE_HOUSE_BETA": { + "group": 1, + "height": 4, + "map": 4, + "name": "OLIVINE_HOUSE_BETA", + "width": 4 + }, + "OLIVINE_LIGHTHOUSE_1F": { + "group": 3, + "height": 9, + "map": 34, + "name": "OLIVINE_LIGHTHOUSE_1F", + "width": 10 + }, + "OLIVINE_LIGHTHOUSE_2F": { + "group": 3, + "height": 9, + "map": 35, + "name": "OLIVINE_LIGHTHOUSE_2F", + "width": 10 + }, + "OLIVINE_LIGHTHOUSE_3F": { + "group": 3, + "height": 9, + "map": 36, + "name": "OLIVINE_LIGHTHOUSE_3F", + "width": 10 + }, + "OLIVINE_LIGHTHOUSE_4F": { + "group": 3, + "height": 9, + "map": 37, + "name": "OLIVINE_LIGHTHOUSE_4F", + "width": 10 + }, + "OLIVINE_LIGHTHOUSE_5F": { + "group": 3, + "height": 9, + "map": 38, + "name": "OLIVINE_LIGHTHOUSE_5F", + "width": 10 + }, + "OLIVINE_LIGHTHOUSE_6F": { + "group": 3, + "height": 9, + "map": 39, + "name": "OLIVINE_LIGHTHOUSE_6F", + "width": 10 + }, + "OLIVINE_MART": { + "group": 1, + "height": 4, + "map": 8, + "name": "OLIVINE_MART", + "width": 6 + }, + "OLIVINE_POKECENTER_1F": { + "group": 1, + "height": 4, + "map": 1, + "name": "OLIVINE_POKECENTER_1F", + "width": 5 + }, + "OLIVINE_PORT": { + "group": 15, + "height": 18, + "map": 1, + "name": "OLIVINE_PORT", + "width": 10 + }, + "OLIVINE_PORT_PASSAGE": { + "group": 15, + "height": 9, + "map": 8, + "name": "OLIVINE_PORT_PASSAGE", + "width": 10 + }, + "OLIVINE_PUNISHMENT_SPEECH_HOUSE": { + "group": 1, + "height": 4, + "map": 5, + "name": "OLIVINE_PUNISHMENT_SPEECH_HOUSE", + "width": 4 + }, + "OLIVINE_TIMS_HOUSE": { + "group": 1, + "height": 4, + "map": 3, + "name": "OLIVINE_TIMS_HOUSE", + "width": 4 + }, + "PALLET_TOWN": { + "group": 13, + "height": 9, + "map": 2, + "name": "PALLET_TOWN", + "width": 10 + }, + "PEWTER_CITY": { + "group": 14, + "height": 18, + "map": 2, + "name": "PEWTER_CITY", + "width": 20 + }, + "PEWTER_GYM": { + "group": 14, + "height": 7, + "map": 4, + "name": "PEWTER_GYM", + "width": 5 + }, + "PEWTER_MART": { + "group": 14, + "height": 4, + "map": 5, + "name": "PEWTER_MART", + "width": 6 + }, + "PEWTER_NIDORAN_SPEECH_HOUSE": { + "group": 14, + "height": 4, + "map": 3, + "name": "PEWTER_NIDORAN_SPEECH_HOUSE", + "width": 4 + }, + "PEWTER_POKECENTER_1F": { + "group": 14, + "height": 4, + "map": 6, + "name": "PEWTER_POKECENTER_1F", + "width": 5 + }, + "PEWTER_POKECENTER_2F_BETA": { + "group": 14, + "height": 4, + "map": 7, + "name": "PEWTER_POKECENTER_2F_BETA", + "width": 8 + }, + "PEWTER_SNOOZE_SPEECH_HOUSE": { + "group": 14, + "height": 4, + "map": 8, + "name": "PEWTER_SNOOZE_SPEECH_HOUSE", + "width": 4 + }, + "PLAYERS_HOUSE_1F": { + "group": 24, + "height": 4, + "map": 6, + "name": "PLAYERS_HOUSE_1F", + "width": 5 + }, + "PLAYERS_HOUSE_2F": { + "group": 24, + "height": 3, + "map": 7, + "name": "PLAYERS_HOUSE_2F", + "width": 4 + }, + "PLAYERS_NEIGHBORS_HOUSE": { + "group": 24, + "height": 4, + "map": 8, + "name": "PLAYERS_NEIGHBORS_HOUSE", + "width": 4 + }, + "POKECENTER_2F": { + "group": 20, + "height": 4, + "map": 1, + "name": "POKECENTER_2F", + "width": 8 + }, + "POKEMON_FAN_CLUB": { + "group": 12, + "height": 4, + "map": 7, + "name": "POKEMON_FAN_CLUB", + "width": 5 + }, + "POWER_PLANT": { + "group": 7, + "height": 9, + "map": 10, + "name": "POWER_PLANT", + "width": 10 + }, + "RADIO_TOWER_1F": { + "group": 3, + "height": 4, + "map": 17, + "name": "RADIO_TOWER_1F", + "width": 9 + }, + "RADIO_TOWER_2F": { + "group": 3, + "height": 4, + "map": 18, + "name": "RADIO_TOWER_2F", + "width": 9 + }, + "RADIO_TOWER_3F": { + "group": 3, + "height": 4, + "map": 19, + "name": "RADIO_TOWER_3F", + "width": 9 + }, + "RADIO_TOWER_4F": { + "group": 3, + "height": 4, + "map": 20, + "name": "RADIO_TOWER_4F", + "width": 9 + }, + "RADIO_TOWER_5F": { + "group": 3, + "height": 4, + "map": 21, + "name": "RADIO_TOWER_5F", + "width": 9 + }, + "REDS_HOUSE_1F": { + "group": 13, + "height": 4, + "map": 3, + "name": "REDS_HOUSE_1F", + "width": 4 + }, + "REDS_HOUSE_2F": { + "group": 13, + "height": 4, + "map": 4, + "name": "REDS_HOUSE_2F", + "width": 4 + }, + "ROCK_TUNNEL_1F": { + "group": 3, + "height": 18, + "map": 78, + "name": "ROCK_TUNNEL_1F", + "width": 15 + }, + "ROCK_TUNNEL_B1F": { + "group": 3, + "height": 18, + "map": 79, + "name": "ROCK_TUNNEL_B1F", + "width": 15 + }, + "ROUTE_1": { + "group": 13, + "height": 18, + "map": 1, + "name": "ROUTE_1", + "width": 10 + }, + "ROUTE_10_NORTH": { + "group": 7, + "height": 9, + "map": 14, + "name": "ROUTE_10_NORTH", + "width": 10 + }, + "ROUTE_10_POKECENTER_1F": { + "group": 7, + "height": 4, + "map": 8, + "name": "ROUTE_10_POKECENTER_1F", + "width": 5 + }, + "ROUTE_10_POKECENTER_2F_BETA": { + "group": 7, + "height": 4, + "map": 9, + "name": "ROUTE_10_POKECENTER_2F_BETA", + "width": 8 + }, + "ROUTE_10_SOUTH": { + "group": 18, + "height": 9, + "map": 3, + "name": "ROUTE_10_SOUTH", + "width": 10 + }, + "ROUTE_11": { + "group": 12, + "height": 9, + "map": 2, + "name": "ROUTE_11", + "width": 20 + }, + "ROUTE_12": { + "group": 18, + "height": 27, + "map": 2, + "name": "ROUTE_12", + "width": 10 + }, + "ROUTE_12_SUPER_ROD_HOUSE": { + "group": 18, + "height": 4, + "map": 14, + "name": "ROUTE_12_SUPER_ROD_HOUSE", + "width": 4 + }, + "ROUTE_13": { + "group": 17, + "height": 9, + "map": 1, + "name": "ROUTE_13", + "width": 30 + }, + "ROUTE_14": { + "group": 17, + "height": 18, + "map": 2, + "name": "ROUTE_14", + "width": 10 + }, + "ROUTE_15": { + "group": 17, + "height": 9, + "map": 3, + "name": "ROUTE_15", + "width": 20 + }, + "ROUTE_15_FUCHSIA_GATE": { + "group": 17, + "height": 4, + "map": 13, + "name": "ROUTE_15_FUCHSIA_GATE", + "width": 5 + }, + "ROUTE_16": { + "group": 21, + "height": 9, + "map": 2, + "name": "ROUTE_16", + "width": 10 + }, + "ROUTE_16_FUCHSIA_SPEECH_HOUSE": { + "group": 21, + "height": 4, + "map": 23, + "name": "ROUTE_16_FUCHSIA_SPEECH_HOUSE", + "width": 4 + }, + "ROUTE_16_GATE": { + "group": 21, + "height": 4, + "map": 24, + "name": "ROUTE_16_GATE", + "width": 5 + }, + "ROUTE_17": { + "group": 21, + "height": 45, + "map": 3, + "name": "ROUTE_17", + "width": 10 + }, + "ROUTE_17_ROUTE_18_GATE": { + "group": 21, + "height": 4, + "map": 26, + "name": "ROUTE_17_ROUTE_18_GATE", + "width": 5 + }, + "ROUTE_18": { + "group": 17, + "height": 9, + "map": 4, + "name": "ROUTE_18", + "width": 10 + }, + "ROUTE_19": { + "group": 6, + "height": 18, + "map": 5, + "name": "ROUTE_19", + "width": 10 + }, + "ROUTE_19_FUCHSIA_GATE": { + "group": 6, + "height": 4, + "map": 3, + "name": "ROUTE_19_FUCHSIA_GATE", + "width": 5 + }, + "ROUTE_2": { + "group": 23, + "height": 27, + "map": 1, + "name": "ROUTE_2", + "width": 10 + }, + "ROUTE_20": { + "group": 6, + "height": 9, + "map": 6, + "name": "ROUTE_20", + "width": 30 + }, + "ROUTE_21": { + "group": 6, + "height": 18, + "map": 7, + "name": "ROUTE_21", + "width": 10 + }, + "ROUTE_22": { + "group": 23, + "height": 9, + "map": 2, + "name": "ROUTE_22", + "width": 20 + }, + "ROUTE_23": { + "group": 16, + "height": 9, + "map": 1, + "name": "ROUTE_23", + "width": 10 + }, + "ROUTE_24": { + "group": 7, + "height": 9, + "map": 15, + "name": "ROUTE_24", + "width": 10 + }, + "ROUTE_25": { + "group": 7, + "height": 9, + "map": 16, + "name": "ROUTE_25", + "width": 30 + }, + "ROUTE_26": { + "group": 24, + "height": 54, + "map": 1, + "name": "ROUTE_26", + "width": 10 + }, + "ROUTE_26_HEAL_HOUSE": { + "group": 24, + "height": 4, + "map": 10, + "name": "ROUTE_26_HEAL_HOUSE", + "width": 4 + }, + "ROUTE_27": { + "group": 24, + "height": 9, + "map": 2, + "name": "ROUTE_27", + "width": 40 + }, + "ROUTE_27_SANDSTORM_HOUSE": { + "group": 24, + "height": 4, + "map": 12, + "name": "ROUTE_27_SANDSTORM_HOUSE", + "width": 4 + }, + "ROUTE_28": { + "group": 19, + "height": 9, + "map": 1, + "name": "ROUTE_28", + "width": 20 + }, + "ROUTE_28_STEEL_WING_HOUSE": { + "group": 19, + "height": 4, + "map": 4, + "name": "ROUTE_28_STEEL_WING_HOUSE", + "width": 4 + }, + "ROUTE_29": { + "group": 24, + "height": 9, + "map": 3, + "name": "ROUTE_29", + "width": 30 + }, + "ROUTE_29_ROUTE_46_GATE": { + "group": 24, + "height": 4, + "map": 13, + "name": "ROUTE_29_ROUTE_46_GATE", + "width": 5 + }, + "ROUTE_2_GATE": { + "group": 23, + "height": 4, + "map": 12, + "name": "ROUTE_2_GATE", + "width": 5 + }, + "ROUTE_2_NUGGET_HOUSE": { + "group": 23, + "height": 4, + "map": 11, + "name": "ROUTE_2_NUGGET_HOUSE", + "width": 4 + }, + "ROUTE_3": { + "group": 14, + "height": 9, + "map": 1, + "name": "ROUTE_3", + "width": 30 + }, + "ROUTE_30": { + "group": 26, + "height": 27, + "map": 1, + "name": "ROUTE_30", + "width": 10 + }, + "ROUTE_30_BERRY_HOUSE": { + "group": 26, + "height": 4, + "map": 9, + "name": "ROUTE_30_BERRY_HOUSE", + "width": 4 + }, + "ROUTE_31": { + "group": 26, + "height": 9, + "map": 2, + "name": "ROUTE_31", + "width": 20 + }, + "ROUTE_31_VIOLET_GATE": { + "group": 26, + "height": 4, + "map": 11, + "name": "ROUTE_31_VIOLET_GATE", + "width": 5 + }, + "ROUTE_32": { + "group": 10, + "height": 45, + "map": 1, + "name": "ROUTE_32", + "width": 10 + }, + "ROUTE_32_POKECENTER_1F": { + "group": 10, + "height": 4, + "map": 13, + "name": "ROUTE_32_POKECENTER_1F", + "width": 5 + }, + "ROUTE_32_RUINS_OF_ALPH_GATE": { + "group": 10, + "height": 4, + "map": 12, + "name": "ROUTE_32_RUINS_OF_ALPH_GATE", + "width": 5 + }, + "ROUTE_33": { + "group": 8, + "height": 9, + "map": 6, + "name": "ROUTE_33", + "width": 10 + }, + "ROUTE_34": { + "group": 11, + "height": 27, + "map": 1, + "name": "ROUTE_34", + "width": 10 + }, + "ROUTE_34_ILEX_FOREST_GATE": { + "group": 11, + "height": 4, + "map": 21, + "name": "ROUTE_34_ILEX_FOREST_GATE", + "width": 5 + }, + "ROUTE_35": { + "group": 10, + "height": 18, + "map": 2, + "name": "ROUTE_35", + "width": 10 + }, + "ROUTE_35_GOLDENROD_GATE": { + "group": 10, + "height": 4, + "map": 14, + "name": "ROUTE_35_GOLDENROD_GATE", + "width": 5 + }, + "ROUTE_35_NATIONAL_PARK_GATE": { + "group": 10, + "height": 4, + "map": 15, + "name": "ROUTE_35_NATIONAL_PARK_GATE", + "width": 4 + }, + "ROUTE_36": { + "group": 10, + "height": 9, + "map": 3, + "name": "ROUTE_36", + "width": 30 + }, + "ROUTE_36_NATIONAL_PARK_GATE": { + "group": 10, + "height": 4, + "map": 17, + "name": "ROUTE_36_NATIONAL_PARK_GATE", + "width": 5 + }, + "ROUTE_36_RUINS_OF_ALPH_GATE": { + "group": 10, + "height": 4, + "map": 16, + "name": "ROUTE_36_RUINS_OF_ALPH_GATE", + "width": 5 + }, + "ROUTE_37": { + "group": 10, + "height": 9, + "map": 4, + "name": "ROUTE_37", + "width": 10 + }, + "ROUTE_38": { + "group": 1, + "height": 9, + "map": 12, + "name": "ROUTE_38", + "width": 20 + }, + "ROUTE_38_ECRUTEAK_GATE": { + "group": 1, + "height": 4, + "map": 9, + "name": "ROUTE_38_ECRUTEAK_GATE", + "width": 5 + }, + "ROUTE_39": { + "group": 1, + "height": 18, + "map": 13, + "name": "ROUTE_39", + "width": 10 + }, + "ROUTE_39_BARN": { + "group": 1, + "height": 4, + "map": 10, + "name": "ROUTE_39_BARN", + "width": 4 + }, + "ROUTE_39_FARMHOUSE": { + "group": 1, + "height": 4, + "map": 11, + "name": "ROUTE_39_FARMHOUSE", + "width": 4 + }, + "ROUTE_4": { + "group": 7, + "height": 9, + "map": 12, + "name": "ROUTE_4", + "width": 20 + }, + "ROUTE_40": { + "group": 22, + "height": 18, + "map": 1, + "name": "ROUTE_40", + "width": 10 + }, + "ROUTE_41": { + "group": 22, + "height": 27, + "map": 2, + "name": "ROUTE_41", + "width": 25 + }, + "ROUTE_42": { + "group": 2, + "height": 9, + "map": 5, + "name": "ROUTE_42", + "width": 30 + }, + "ROUTE_42_ECRUTEAK_GATE": { + "group": 2, + "height": 4, + "map": 4, + "name": "ROUTE_42_ECRUTEAK_GATE", + "width": 5 + }, + "ROUTE_43": { + "group": 9, + "height": 27, + "map": 5, + "name": "ROUTE_43", + "width": 10 + }, + "ROUTE_43_GATE": { + "group": 9, + "height": 4, + "map": 4, + "name": "ROUTE_43_GATE", + "width": 5 + }, + "ROUTE_43_MAHOGANY_GATE": { + "group": 9, + "height": 4, + "map": 3, + "name": "ROUTE_43_MAHOGANY_GATE", + "width": 5 + }, + "ROUTE_44": { + "group": 2, + "height": 9, + "map": 6, + "name": "ROUTE_44", + "width": 30 + }, + "ROUTE_45": { + "group": 5, + "height": 45, + "map": 8, + "name": "ROUTE_45", + "width": 10 + }, + "ROUTE_46": { + "group": 5, + "height": 18, + "map": 9, + "name": "ROUTE_46", + "width": 10 + }, + "ROUTE_5": { + "group": 25, + "height": 9, + "map": 1, + "name": "ROUTE_5", + "width": 10 + }, + "ROUTE_5_CLEANSE_TAG_HOUSE": { + "group": 25, + "height": 4, + "map": 15, + "name": "ROUTE_5_CLEANSE_TAG_HOUSE", + "width": 4 + }, + "ROUTE_5_SAFFRON_GATE": { + "group": 25, + "height": 4, + "map": 14, + "name": "ROUTE_5_SAFFRON_GATE", + "width": 5 + }, + "ROUTE_5_UNDERGROUND_PATH_ENTRANCE": { + "group": 25, + "height": 4, + "map": 13, + "name": "ROUTE_5_UNDERGROUND_PATH_ENTRANCE", + "width": 4 + }, + "ROUTE_6": { + "group": 12, + "height": 9, + "map": 1, + "name": "ROUTE_6", + "width": 10 + }, + "ROUTE_6_SAFFRON_GATE": { + "group": 12, + "height": 4, + "map": 12, + "name": "ROUTE_6_SAFFRON_GATE", + "width": 5 + }, + "ROUTE_6_UNDERGROUND_PATH_ENTRANCE": { + "group": 12, + "height": 4, + "map": 13, + "name": "ROUTE_6_UNDERGROUND_PATH_ENTRANCE", + "width": 4 + }, + "ROUTE_7": { + "group": 21, + "height": 9, + "map": 1, + "name": "ROUTE_7", + "width": 10 + }, + "ROUTE_7_SAFFRON_GATE": { + "group": 21, + "height": 4, + "map": 25, + "name": "ROUTE_7_SAFFRON_GATE", + "width": 5 + }, + "ROUTE_8": { + "group": 18, + "height": 9, + "map": 1, + "name": "ROUTE_8", + "width": 20 + }, + "ROUTE_8_SAFFRON_GATE": { + "group": 18, + "height": 4, + "map": 13, + "name": "ROUTE_8_SAFFRON_GATE", + "width": 5 + }, + "ROUTE_9": { + "group": 7, + "height": 9, + "map": 13, + "name": "ROUTE_9", + "width": 30 + }, + "RUINS_OF_ALPH_AERODACTYL_CHAMBER": { + "group": 3, + "height": 5, + "map": 26, + "name": "RUINS_OF_ALPH_AERODACTYL_CHAMBER", + "width": 4 + }, + "RUINS_OF_ALPH_HO_OH_CHAMBER": { + "group": 3, + "height": 5, + "map": 23, + "name": "RUINS_OF_ALPH_HO_OH_CHAMBER", + "width": 4 + }, + "RUINS_OF_ALPH_INNER_CHAMBER": { + "group": 3, + "height": 14, + "map": 27, + "name": "RUINS_OF_ALPH_INNER_CHAMBER", + "width": 10 + }, + "RUINS_OF_ALPH_KABUTO_CHAMBER": { + "group": 3, + "height": 5, + "map": 24, + "name": "RUINS_OF_ALPH_KABUTO_CHAMBER", + "width": 4 + }, + "RUINS_OF_ALPH_OMANYTE_CHAMBER": { + "group": 3, + "height": 5, + "map": 25, + "name": "RUINS_OF_ALPH_OMANYTE_CHAMBER", + "width": 4 + }, + "RUINS_OF_ALPH_OUTSIDE": { + "group": 3, + "height": 18, + "map": 22, + "name": "RUINS_OF_ALPH_OUTSIDE", + "width": 10 + }, + "RUINS_OF_ALPH_RESEARCH_CENTER": { + "group": 3, + "height": 4, + "map": 28, + "name": "RUINS_OF_ALPH_RESEARCH_CENTER", + "width": 4 + }, + "SAFARI_ZONE_BETA": { + "group": 3, + "height": 18, + "map": 81, + "name": "SAFARI_ZONE_BETA", + "width": 10 + }, + "SAFARI_ZONE_FUCHSIA_GATE_BETA": { + "group": 3, + "height": 4, + "map": 80, + "name": "SAFARI_ZONE_FUCHSIA_GATE_BETA", + "width": 5 + }, + "SAFARI_ZONE_MAIN_OFFICE": { + "group": 17, + "height": 4, + "map": 7, + "name": "SAFARI_ZONE_MAIN_OFFICE", + "width": 4 + }, + "SAFARI_ZONE_WARDENS_HOME": { + "group": 17, + "height": 4, + "map": 12, + "name": "SAFARI_ZONE_WARDENS_HOME", + "width": 5 + }, + "SAFFRON_CITY": { + "group": 25, + "height": 18, + "map": 2, + "name": "SAFFRON_CITY", + "width": 20 + }, + "SAFFRON_GYM": { + "group": 25, + "height": 9, + "map": 4, + "name": "SAFFRON_GYM", + "width": 10 + }, + "SAFFRON_MAGNET_TRAIN_STATION": { + "group": 25, + "height": 9, + "map": 9, + "name": "SAFFRON_MAGNET_TRAIN_STATION", + "width": 10 + }, + "SAFFRON_MART": { + "group": 25, + "height": 4, + "map": 5, + "name": "SAFFRON_MART", + "width": 6 + }, + "SAFFRON_POKECENTER_1F": { + "group": 25, + "height": 4, + "map": 6, + "name": "SAFFRON_POKECENTER_1F", + "width": 5 + }, + "SAFFRON_POKECENTER_2F_BETA": { + "group": 25, + "height": 4, + "map": 7, + "name": "SAFFRON_POKECENTER_2F_BETA", + "width": 8 + }, + "SEAFOAM_GYM": { + "group": 6, + "height": 4, + "map": 4, + "name": "SEAFOAM_GYM", + "width": 5 + }, + "SILPH_CO_1F": { + "group": 25, + "height": 4, + "map": 10, + "name": "SILPH_CO_1F", + "width": 8 + }, + "SILVER_CAVE_ITEM_ROOMS": { + "group": 3, + "height": 9, + "map": 69, + "name": "SILVER_CAVE_ITEM_ROOMS", + "width": 10 + }, + "SILVER_CAVE_OUTSIDE": { + "group": 19, + "height": 18, + "map": 2, + "name": "SILVER_CAVE_OUTSIDE", + "width": 20 + }, + "SILVER_CAVE_POKECENTER_1F": { + "group": 19, + "height": 4, + "map": 3, + "name": "SILVER_CAVE_POKECENTER_1F", + "width": 5 + }, + "SILVER_CAVE_ROOM_1": { + "group": 3, + "height": 18, + "map": 66, + "name": "SILVER_CAVE_ROOM_1", + "width": 10 + }, + "SILVER_CAVE_ROOM_2": { + "group": 3, + "height": 18, + "map": 67, + "name": "SILVER_CAVE_ROOM_2", + "width": 15 + }, + "SILVER_CAVE_ROOM_3": { + "group": 3, + "height": 18, + "map": 68, + "name": "SILVER_CAVE_ROOM_3", + "width": 10 + }, + "SLOWPOKE_WELL_B1F": { + "group": 3, + "height": 9, + "map": 32, + "name": "SLOWPOKE_WELL_B1F", + "width": 10 + }, + "SLOWPOKE_WELL_B2F": { + "group": 3, + "height": 9, + "map": 33, + "name": "SLOWPOKE_WELL_B2F", + "width": 10 + }, + "SOUL_HOUSE": { + "group": 18, + "height": 4, + "map": 11, + "name": "SOUL_HOUSE", + "width": 5 + }, + "SPROUT_TOWER_1F": { + "group": 3, + "height": 8, + "map": 1, + "name": "SPROUT_TOWER_1F", + "width": 10 + }, + "SPROUT_TOWER_2F": { + "group": 3, + "height": 8, + "map": 2, + "name": "SPROUT_TOWER_2F", + "width": 10 + }, + "SPROUT_TOWER_3F": { + "group": 3, + "height": 8, + "map": 3, + "name": "SPROUT_TOWER_3F", + "width": 10 + }, + "TEAM_ROCKET_BASE_B1F": { + "group": 3, + "height": 9, + "map": 41, + "name": "TEAM_ROCKET_BASE_B1F", + "width": 15 + }, + "TEAM_ROCKET_BASE_B2F": { + "group": 3, + "height": 9, + "map": 42, + "name": "TEAM_ROCKET_BASE_B2F", + "width": 15 + }, + "TEAM_ROCKET_BASE_B3F": { + "group": 3, + "height": 9, + "map": 43, + "name": "TEAM_ROCKET_BASE_B3F", + "width": 15 + }, + "TIME_CAPSULE": { + "group": 20, + "height": 4, + "map": 4, + "name": "TIME_CAPSULE", + "width": 5 + }, + "TIN_TOWER_1F": { + "group": 3, + "height": 9, + "map": 4, + "name": "TIN_TOWER_1F", + "width": 10 + }, + "TIN_TOWER_2F": { + "group": 3, + "height": 9, + "map": 5, + "name": "TIN_TOWER_2F", + "width": 10 + }, + "TIN_TOWER_3F": { + "group": 3, + "height": 9, + "map": 6, + "name": "TIN_TOWER_3F", + "width": 10 + }, + "TIN_TOWER_4F": { + "group": 3, + "height": 9, + "map": 7, + "name": "TIN_TOWER_4F", + "width": 10 + }, + "TIN_TOWER_5F": { + "group": 3, + "height": 9, + "map": 8, + "name": "TIN_TOWER_5F", + "width": 10 + }, + "TIN_TOWER_6F": { + "group": 3, + "height": 9, + "map": 9, + "name": "TIN_TOWER_6F", + "width": 10 + }, + "TIN_TOWER_7F": { + "group": 3, + "height": 9, + "map": 10, + "name": "TIN_TOWER_7F", + "width": 10 + }, + "TIN_TOWER_8F": { + "group": 3, + "height": 9, + "map": 11, + "name": "TIN_TOWER_8F", + "width": 10 + }, + "TIN_TOWER_9F": { + "group": 3, + "height": 9, + "map": 12, + "name": "TIN_TOWER_9F", + "width": 10 + }, + "TIN_TOWER_ROOF": { + "group": 15, + "height": 9, + "map": 12, + "name": "TIN_TOWER_ROOF", + "width": 10 + }, + "TOHJO_FALLS": { + "group": 3, + "height": 9, + "map": 74, + "name": "TOHJO_FALLS", + "width": 15 + }, + "TRADE_CENTER": { + "group": 20, + "height": 4, + "map": 2, + "name": "TRADE_CENTER", + "width": 5 + }, + "TRAINER_HOUSE_1F": { + "group": 23, + "height": 7, + "map": 6, + "name": "TRAINER_HOUSE_1F", + "width": 5 + }, + "TRAINER_HOUSE_B1F": { + "group": 23, + "height": 8, + "map": 7, + "name": "TRAINER_HOUSE_B1F", + "width": 5 + }, + "UNDERGROUND_PATH": { + "group": 3, + "height": 14, + "map": 77, + "name": "UNDERGROUND_PATH", + "width": 3 + }, + "UNION_CAVE_1F": { + "group": 3, + "height": 18, + "map": 29, + "name": "UNION_CAVE_1F", + "width": 10 + }, + "UNION_CAVE_B1F": { + "group": 3, + "height": 18, + "map": 30, + "name": "UNION_CAVE_B1F", + "width": 10 + }, + "UNION_CAVE_B2F": { + "group": 3, + "height": 18, + "map": 31, + "name": "UNION_CAVE_B2F", + "width": 10 + }, + "VERMILION_CITY": { + "group": 12, + "height": 18, + "map": 3, + "name": "VERMILION_CITY", + "width": 20 + }, + "VERMILION_DIGLETTS_CAVE_SPEECH_HOUSE": { + "group": 12, + "height": 4, + "map": 10, + "name": "VERMILION_DIGLETTS_CAVE_SPEECH_HOUSE", + "width": 4 + }, + "VERMILION_FISHING_SPEECH_HOUSE": { + "group": 12, + "height": 4, + "map": 4, + "name": "VERMILION_FISHING_SPEECH_HOUSE", + "width": 4 + }, + "VERMILION_GYM": { + "group": 12, + "height": 9, + "map": 11, + "name": "VERMILION_GYM", + "width": 5 + }, + "VERMILION_MAGNET_TRAIN_SPEECH_HOUSE": { + "group": 12, + "height": 4, + "map": 8, + "name": "VERMILION_MAGNET_TRAIN_SPEECH_HOUSE", + "width": 4 + }, + "VERMILION_MART": { + "group": 12, + "height": 4, + "map": 9, + "name": "VERMILION_MART", + "width": 6 + }, + "VERMILION_POKECENTER_1F": { + "group": 12, + "height": 4, + "map": 5, + "name": "VERMILION_POKECENTER_1F", + "width": 5 + }, + "VERMILION_POKECENTER_2F_BETA": { + "group": 12, + "height": 4, + "map": 6, + "name": "VERMILION_POKECENTER_2F_BETA", + "width": 8 + }, + "VERMILION_PORT": { + "group": 15, + "height": 18, + "map": 2, + "name": "VERMILION_PORT", + "width": 10 + }, + "VERMILION_PORT_PASSAGE": { + "group": 15, + "height": 9, + "map": 9, + "name": "VERMILION_PORT_PASSAGE", + "width": 10 + }, + "VICTORY_ROAD": { + "group": 3, + "height": 36, + "map": 82, + "name": "VICTORY_ROAD", + "width": 10 + }, + "VICTORY_ROAD_GATE": { + "group": 23, + "height": 9, + "map": 13, + "name": "VICTORY_ROAD_GATE", + "width": 10 + }, + "VIOLET_CITY": { + "group": 10, + "height": 18, + "map": 5, + "name": "VIOLET_CITY", + "width": 20 + }, + "VIOLET_GYM": { + "group": 10, + "height": 8, + "map": 7, + "name": "VIOLET_GYM", + "width": 5 + }, + "VIOLET_KYLES_HOUSE": { + "group": 10, + "height": 4, + "map": 11, + "name": "VIOLET_KYLES_HOUSE", + "width": 4 + }, + "VIOLET_MART": { + "group": 10, + "height": 4, + "map": 6, + "name": "VIOLET_MART", + "width": 6 + }, + "VIOLET_NICKNAME_SPEECH_HOUSE": { + "group": 10, + "height": 4, + "map": 9, + "name": "VIOLET_NICKNAME_SPEECH_HOUSE", + "width": 4 + }, + "VIOLET_POKECENTER_1F": { + "group": 10, + "height": 4, + "map": 10, + "name": "VIOLET_POKECENTER_1F", + "width": 5 + }, + "VIRIDIAN_CITY": { + "group": 23, + "height": 18, + "map": 3, + "name": "VIRIDIAN_CITY", + "width": 20 + }, + "VIRIDIAN_GYM": { + "group": 23, + "height": 9, + "map": 4, + "name": "VIRIDIAN_GYM", + "width": 5 + }, + "VIRIDIAN_MART": { + "group": 23, + "height": 4, + "map": 8, + "name": "VIRIDIAN_MART", + "width": 6 + }, + "VIRIDIAN_NICKNAME_SPEECH_HOUSE": { + "group": 23, + "height": 4, + "map": 5, + "name": "VIRIDIAN_NICKNAME_SPEECH_HOUSE", + "width": 4 + }, + "VIRIDIAN_POKECENTER_1F": { + "group": 23, + "height": 4, + "map": 9, + "name": "VIRIDIAN_POKECENTER_1F", + "width": 5 + }, + "VIRIDIAN_POKECENTER_2F_BETA": { + "group": 23, + "height": 4, + "map": 10, + "name": "VIRIDIAN_POKECENTER_2F_BETA", + "width": 8 + }, + "WHIRL_ISLAND_B1F": { + "group": 3, + "height": 18, + "map": 63, + "name": "WHIRL_ISLAND_B1F", + "width": 20 + }, + "WHIRL_ISLAND_B2F": { + "group": 3, + "height": 18, + "map": 64, + "name": "WHIRL_ISLAND_B2F", + "width": 10 + }, + "WHIRL_ISLAND_CAVE": { + "group": 3, + "height": 9, + "map": 61, + "name": "WHIRL_ISLAND_CAVE", + "width": 5 + }, + "WHIRL_ISLAND_LUGIA_CHAMBER": { + "group": 3, + "height": 9, + "map": 65, + "name": "WHIRL_ISLAND_LUGIA_CHAMBER", + "width": 10 + }, + "WHIRL_ISLAND_NE": { + "group": 3, + "height": 9, + "map": 59, + "name": "WHIRL_ISLAND_NE", + "width": 10 + }, + "WHIRL_ISLAND_NW": { + "group": 3, + "height": 9, + "map": 58, + "name": "WHIRL_ISLAND_NW", + "width": 5 + }, + "WHIRL_ISLAND_SE": { + "group": 3, + "height": 9, + "map": 62, + "name": "WHIRL_ISLAND_SE", + "width": 5 + }, + "WHIRL_ISLAND_SW": { + "group": 3, + "height": 9, + "map": 60, + "name": "WHIRL_ISLAND_SW", + "width": 10 + }, + "WILLS_ROOM": { + "group": 16, + "height": 9, + "map": 3, + "name": "WILLS_ROOM", + "width": 5 + } + }, + "pokemonAssets": { + "ABRA": { + "back": "abra_back", + "backLabel": "AbraBackpic", + "dexLabel": "AbraPokedexEntry", + "front": "abra", + "frontLabel": "AbraFrontpic", + "id": "ABRA", + "name": "ABRA" + }, + "AERODACTYL": { + "back": "aerodactyl_back", + "backLabel": "AerodactylBackpic", + "dexLabel": "AerodactylPokedexEntry", + "front": "aerodactyl", + "frontLabel": "AerodactylFrontpic", + "id": "AERODACTYL", + "name": "AERODACTYL" + }, + "AIPOM": { + "back": "aipom_back", + "backLabel": "AipomBackpic", + "dexLabel": "AipomPokedexEntry", + "front": "aipom", + "frontLabel": "AipomFrontpic", + "id": "AIPOM", + "name": "AIPOM" + }, + "ALAKAZAM": { + "back": "alakazam_back", + "backLabel": "AlakazamBackpic", + "dexLabel": "AlakazamPokedexEntry", + "front": "alakazam", + "frontLabel": "AlakazamFrontpic", + "id": "ALAKAZAM", + "name": "ALAKAZAM" + }, + "AMPHAROS": { + "back": "ampharos_back", + "backLabel": "AmpharosBackpic", + "dexLabel": "AmpharosPokedexEntry", + "front": "ampharos", + "frontLabel": "AmpharosFrontpic", + "id": "AMPHAROS", + "name": "AMPHAROS" + }, + "ARBOK": { + "back": "arbok_back", + "backLabel": "ArbokBackpic", + "dexLabel": "ArbokPokedexEntry", + "front": "arbok", + "frontLabel": "ArbokFrontpic", + "id": "ARBOK", + "name": "ARBOK" + }, + "ARCANINE": { + "back": "arcanine_back", + "backLabel": "ArcanineBackpic", + "dexLabel": "ArcaninePokedexEntry", + "front": "arcanine", + "frontLabel": "ArcanineFrontpic", + "id": "ARCANINE", + "name": "ARCANINE" + }, + "ARIADOS": { + "back": "ariados_back", + "backLabel": "AriadosBackpic", + "dexLabel": "AriadosPokedexEntry", + "front": "ariados", + "frontLabel": "AriadosFrontpic", + "id": "ARIADOS", + "name": "ARIADOS" + }, + "ARTICUNO": { + "back": "articuno_back", + "backLabel": "ArticunoBackpic", + "dexLabel": "ArticunoPokedexEntry", + "front": "articuno", + "frontLabel": "ArticunoFrontpic", + "id": "ARTICUNO", + "name": "ARTICUNO" + }, + "AZUMARILL": { + "back": "azumarill_back", + "backLabel": "AzumarillBackpic", + "dexLabel": "AzumarillPokedexEntry", + "front": "azumarill", + "frontLabel": "AzumarillFrontpic", + "id": "AZUMARILL", + "name": "AZUMARILL" + }, + "BAYLEEF": { + "back": "bayleef_back", + "backLabel": "BayleefBackpic", + "dexLabel": "BayleefPokedexEntry", + "front": "bayleef", + "frontLabel": "BayleefFrontpic", + "id": "BAYLEEF", + "name": "BAYLEEF" + }, + "BEEDRILL": { + "back": "beedrill_back", + "backLabel": "BeedrillBackpic", + "dexLabel": "BeedrillPokedexEntry", + "front": "beedrill", + "frontLabel": "BeedrillFrontpic", + "id": "BEEDRILL", + "name": "BEEDRILL" + }, + "BELLOSSOM": { + "back": "bellossom_back", + "backLabel": "BellossomBackpic", + "dexLabel": "BellossomPokedexEntry", + "front": "bellossom", + "frontLabel": "BellossomFrontpic", + "id": "BELLOSSOM", + "name": "BELLOSSOM" + }, + "BELLSPROUT": { + "back": "bellsprout_back", + "backLabel": "BellsproutBackpic", + "dexLabel": "BellsproutPokedexEntry", + "front": "bellsprout", + "frontLabel": "BellsproutFrontpic", + "id": "BELLSPROUT", + "name": "BELLSPROUT" + }, + "BLASTOISE": { + "back": "blastoise_back", + "backLabel": "BlastoiseBackpic", + "dexLabel": "BlastoisePokedexEntry", + "front": "blastoise", + "frontLabel": "BlastoiseFrontpic", + "id": "BLASTOISE", + "name": "BLASTOISE" + }, + "BLISSEY": { + "back": "blissey_back", + "backLabel": "BlisseyBackpic", + "dexLabel": "BlisseyPokedexEntry", + "front": "blissey", + "frontLabel": "BlisseyFrontpic", + "id": "BLISSEY", + "name": "BLISSEY" + }, + "BULBASAUR": { + "back": "bulbasaur_back", + "backLabel": "BulbasaurBackpic", + "dexLabel": "BulbasaurPokedexEntry", + "front": "bulbasaur", + "frontLabel": "BulbasaurFrontpic", + "id": "BULBASAUR", + "name": "BULBASAUR" + }, + "BUTTERFREE": { + "back": "butterfree_back", + "backLabel": "ButterfreeBackpic", + "dexLabel": "ButterfreePokedexEntry", + "front": "butterfree", + "frontLabel": "ButterfreeFrontpic", + "id": "BUTTERFREE", + "name": "BUTTERFREE" + }, + "CATERPIE": { + "back": "caterpie_back", + "backLabel": "CaterpieBackpic", + "dexLabel": "CaterpiePokedexEntry", + "front": "caterpie", + "frontLabel": "CaterpieFrontpic", + "id": "CATERPIE", + "name": "CATERPIE" + }, + "CELEBI": { + "back": "celebi_back", + "backLabel": "CelebiBackpic", + "dexLabel": "CelebiPokedexEntry", + "front": "celebi", + "frontLabel": "CelebiFrontpic", + "id": "CELEBI", + "name": "CELEBI" + }, + "CHANSEY": { + "back": "chansey_back", + "backLabel": "ChanseyBackpic", + "dexLabel": "ChanseyPokedexEntry", + "front": "chansey", + "frontLabel": "ChanseyFrontpic", + "id": "CHANSEY", + "name": "CHANSEY" + }, + "CHARIZARD": { + "back": "charizard_back", + "backLabel": "CharizardBackpic", + "dexLabel": "CharizardPokedexEntry", + "front": "charizard", + "frontLabel": "CharizardFrontpic", + "id": "CHARIZARD", + "name": "CHARIZARD" + }, + "CHARMANDER": { + "back": "charmander_back", + "backLabel": "CharmanderBackpic", + "dexLabel": "CharmanderPokedexEntry", + "front": "charmander", + "frontLabel": "CharmanderFrontpic", + "id": "CHARMANDER", + "name": "CHARMANDER" + }, + "CHARMELEON": { + "back": "charmeleon_back", + "backLabel": "CharmeleonBackpic", + "dexLabel": "CharmeleonPokedexEntry", + "front": "charmeleon", + "frontLabel": "CharmeleonFrontpic", + "id": "CHARMELEON", + "name": "CHARMELEON" + }, + "CHIKORITA": { + "back": "chikorita_back", + "backLabel": "ChikoritaBackpic", + "dexLabel": "ChikoritaPokedexEntry", + "front": "chikorita", + "frontLabel": "ChikoritaFrontpic", + "id": "CHIKORITA", + "name": "CHIKORITA" + }, + "CHINCHOU": { + "back": "chinchou_back", + "backLabel": "ChinchouBackpic", + "dexLabel": "ChinchouPokedexEntry", + "front": "chinchou", + "frontLabel": "ChinchouFrontpic", + "id": "CHINCHOU", + "name": "CHINCHOU" + }, + "CLEFABLE": { + "back": "clefable_back", + "backLabel": "ClefableBackpic", + "dexLabel": "ClefablePokedexEntry", + "front": "clefable", + "frontLabel": "ClefableFrontpic", + "id": "CLEFABLE", + "name": "CLEFABLE" + }, + "CLEFAIRY": { + "back": "clefairy_back", + "backLabel": "ClefairyBackpic", + "dexLabel": "ClefairyPokedexEntry", + "front": "clefairy", + "frontLabel": "ClefairyFrontpic", + "id": "CLEFAIRY", + "name": "CLEFAIRY" + }, + "CLEFFA": { + "back": "cleffa_back", + "backLabel": "CleffaBackpic", + "dexLabel": "CleffaPokedexEntry", + "front": "cleffa", + "frontLabel": "CleffaFrontpic", + "id": "CLEFFA", + "name": "CLEFFA" + }, + "CLOYSTER": { + "back": "cloyster_back", + "backLabel": "CloysterBackpic", + "dexLabel": "CloysterPokedexEntry", + "front": "cloyster", + "frontLabel": "CloysterFrontpic", + "id": "CLOYSTER", + "name": "CLOYSTER" + }, + "CORSOLA": { + "back": "corsola_back", + "backLabel": "CorsolaBackpic", + "dexLabel": "CorsolaPokedexEntry", + "front": "corsola", + "frontLabel": "CorsolaFrontpic", + "id": "CORSOLA", + "name": "CORSOLA" + }, + "CROBAT": { + "back": "crobat_back", + "backLabel": "CrobatBackpic", + "dexLabel": "CrobatPokedexEntry", + "front": "crobat", + "frontLabel": "CrobatFrontpic", + "id": "CROBAT", + "name": "CROBAT" + }, + "CROCONAW": { + "back": "croconaw_back", + "backLabel": "CroconawBackpic", + "dexLabel": "CroconawPokedexEntry", + "front": "croconaw", + "frontLabel": "CroconawFrontpic", + "id": "CROCONAW", + "name": "CROCONAW" + }, + "CUBONE": { + "back": "cubone_back", + "backLabel": "CuboneBackpic", + "dexLabel": "CubonePokedexEntry", + "front": "cubone", + "frontLabel": "CuboneFrontpic", + "id": "CUBONE", + "name": "CUBONE" + }, + "CYNDAQUIL": { + "back": "cyndaquil_back", + "backLabel": "CyndaquilBackpic", + "dexLabel": "CyndaquilPokedexEntry", + "front": "cyndaquil", + "frontLabel": "CyndaquilFrontpic", + "id": "CYNDAQUIL", + "name": "CYNDAQUIL" + }, + "DELIBIRD": { + "back": "delibird_back", + "backLabel": "DelibirdBackpic", + "dexLabel": "DelibirdPokedexEntry", + "front": "delibird", + "frontLabel": "DelibirdFrontpic", + "id": "DELIBIRD", + "name": "DELIBIRD" + }, + "DEWGONG": { + "back": "dewgong_back", + "backLabel": "DewgongBackpic", + "dexLabel": "DewgongPokedexEntry", + "front": "dewgong", + "frontLabel": "DewgongFrontpic", + "id": "DEWGONG", + "name": "DEWGONG" + }, + "DIGLETT": { + "back": "diglett_back", + "backLabel": "DiglettBackpic", + "dexLabel": "DiglettPokedexEntry", + "front": "diglett", + "frontLabel": "DiglettFrontpic", + "id": "DIGLETT", + "name": "DIGLETT" + }, + "DITTO": { + "back": "ditto_back", + "backLabel": "DittoBackpic", + "dexLabel": "DittoPokedexEntry", + "front": "ditto", + "frontLabel": "DittoFrontpic", + "id": "DITTO", + "name": "DITTO" + }, + "DODRIO": { + "back": "dodrio_back", + "backLabel": "DodrioBackpic", + "dexLabel": "DodrioPokedexEntry", + "front": "dodrio", + "frontLabel": "DodrioFrontpic", + "id": "DODRIO", + "name": "DODRIO" + }, + "DODUO": { + "back": "doduo_back", + "backLabel": "DoduoBackpic", + "dexLabel": "DoduoPokedexEntry", + "front": "doduo", + "frontLabel": "DoduoFrontpic", + "id": "DODUO", + "name": "DODUO" + }, + "DONPHAN": { + "back": "donphan_back", + "backLabel": "DonphanBackpic", + "dexLabel": "DonphanPokedexEntry", + "front": "donphan", + "frontLabel": "DonphanFrontpic", + "id": "DONPHAN", + "name": "DONPHAN" + }, + "DRAGONAIR": { + "back": "dragonair_back", + "backLabel": "DragonairBackpic", + "dexLabel": "DragonairPokedexEntry", + "front": "dragonair", + "frontLabel": "DragonairFrontpic", + "id": "DRAGONAIR", + "name": "DRAGONAIR" + }, + "DRAGONITE": { + "back": "dragonite_back", + "backLabel": "DragoniteBackpic", + "dexLabel": "DragonitePokedexEntry", + "front": "dragonite", + "frontLabel": "DragoniteFrontpic", + "id": "DRAGONITE", + "name": "DRAGONITE" + }, + "DRATINI": { + "back": "dratini_back", + "backLabel": "DratiniBackpic", + "dexLabel": "DratiniPokedexEntry", + "front": "dratini", + "frontLabel": "DratiniFrontpic", + "id": "DRATINI", + "name": "DRATINI" + }, + "DROWZEE": { + "back": "drowzee_back", + "backLabel": "DrowzeeBackpic", + "dexLabel": "DrowzeePokedexEntry", + "front": "drowzee", + "frontLabel": "DrowzeeFrontpic", + "id": "DROWZEE", + "name": "DROWZEE" + }, + "DUGTRIO": { + "back": "dugtrio_back", + "backLabel": "DugtrioBackpic", + "dexLabel": "DugtrioPokedexEntry", + "front": "dugtrio", + "frontLabel": "DugtrioFrontpic", + "id": "DUGTRIO", + "name": "DUGTRIO" + }, + "DUNSPARCE": { + "back": "dunsparce_back", + "backLabel": "DunsparceBackpic", + "dexLabel": "DunsparcePokedexEntry", + "front": "dunsparce", + "frontLabel": "DunsparceFrontpic", + "id": "DUNSPARCE", + "name": "DUNSPARCE" + }, + "EEVEE": { + "back": "eevee_back", + "backLabel": "EeveeBackpic", + "dexLabel": "EeveePokedexEntry", + "front": "eevee", + "frontLabel": "EeveeFrontpic", + "id": "EEVEE", + "name": "EEVEE" + }, + "EKANS": { + "back": "ekans_back", + "backLabel": "EkansBackpic", + "dexLabel": "EkansPokedexEntry", + "front": "ekans", + "frontLabel": "EkansFrontpic", + "id": "EKANS", + "name": "EKANS" + }, + "ELECTABUZZ": { + "back": "electabuzz_back", + "backLabel": "ElectabuzzBackpic", + "dexLabel": "ElectabuzzPokedexEntry", + "front": "electabuzz", + "frontLabel": "ElectabuzzFrontpic", + "id": "ELECTABUZZ", + "name": "ELECTABUZZ" + }, + "ELECTRODE": { + "back": "electrode_back", + "backLabel": "ElectrodeBackpic", + "dexLabel": "ElectrodePokedexEntry", + "front": "electrode", + "frontLabel": "ElectrodeFrontpic", + "id": "ELECTRODE", + "name": "ELECTRODE" + }, + "ELEKID": { + "back": "elekid_back", + "backLabel": "ElekidBackpic", + "dexLabel": "ElekidPokedexEntry", + "front": "elekid", + "frontLabel": "ElekidFrontpic", + "id": "ELEKID", + "name": "ELEKID" + }, + "ENTEI": { + "back": "entei_back", + "backLabel": "EnteiBackpic", + "dexLabel": "EnteiPokedexEntry", + "front": "entei", + "frontLabel": "EnteiFrontpic", + "id": "ENTEI", + "name": "ENTEI" + }, + "ESPEON": { + "back": "espeon_back", + "backLabel": "EspeonBackpic", + "dexLabel": "EspeonPokedexEntry", + "front": "espeon", + "frontLabel": "EspeonFrontpic", + "id": "ESPEON", + "name": "ESPEON" + }, + "EXEGGCUTE": { + "back": "exeggcute_back", + "backLabel": "ExeggcuteBackpic", + "dexLabel": "ExeggcutePokedexEntry", + "front": "exeggcute", + "frontLabel": "ExeggcuteFrontpic", + "id": "EXEGGCUTE", + "name": "EXEGGCUTE" + }, + "EXEGGUTOR": { + "back": "exeggutor_back", + "backLabel": "ExeggutorBackpic", + "dexLabel": "ExeggutorPokedexEntry", + "front": "exeggutor", + "frontLabel": "ExeggutorFrontpic", + "id": "EXEGGUTOR", + "name": "EXEGGUTOR" + }, + "FARFETCH_D": { + "back": "farfetchd_back", + "backLabel": "FarfetchDBackpic", + "dexLabel": "FarfetchDPokedexEntry", + "front": "farfetchd", + "frontLabel": "FarfetchDFrontpic", + "id": "FARFETCH_D", + "name": "FARFETCH'D" + }, + "FEAROW": { + "back": "fearow_back", + "backLabel": "FearowBackpic", + "dexLabel": "FearowPokedexEntry", + "front": "fearow", + "frontLabel": "FearowFrontpic", + "id": "FEAROW", + "name": "FEAROW" + }, + "FERALIGATR": { + "back": "feraligatr_back", + "backLabel": "FeraligatrBackpic", + "dexLabel": "FeraligatrPokedexEntry", + "front": "feraligatr", + "frontLabel": "FeraligatrFrontpic", + "id": "FERALIGATR", + "name": "FERALIGATR" + }, + "FLAAFFY": { + "back": "flaaffy_back", + "backLabel": "FlaaffyBackpic", + "dexLabel": "FlaaffyPokedexEntry", + "front": "flaaffy", + "frontLabel": "FlaaffyFrontpic", + "id": "FLAAFFY", + "name": "FLAAFFY" + }, + "FLAREON": { + "back": "flareon_back", + "backLabel": "FlareonBackpic", + "dexLabel": "FlareonPokedexEntry", + "front": "flareon", + "frontLabel": "FlareonFrontpic", + "id": "FLAREON", + "name": "FLAREON" + }, + "FORRETRESS": { + "back": "forretress_back", + "backLabel": "ForretressBackpic", + "dexLabel": "ForretressPokedexEntry", + "front": "forretress", + "frontLabel": "ForretressFrontpic", + "id": "FORRETRESS", + "name": "FORRETRESS" + }, + "FURRET": { + "back": "furret_back", + "backLabel": "FurretBackpic", + "dexLabel": "FurretPokedexEntry", + "front": "furret", + "frontLabel": "FurretFrontpic", + "id": "FURRET", + "name": "FURRET" + }, + "GASTLY": { + "back": "gastly_back", + "backLabel": "GastlyBackpic", + "dexLabel": "GastlyPokedexEntry", + "front": "gastly", + "frontLabel": "GastlyFrontpic", + "id": "GASTLY", + "name": "GASTLY" + }, + "GENGAR": { + "back": "gengar_back", + "backLabel": "GengarBackpic", + "dexLabel": "GengarPokedexEntry", + "front": "gengar", + "frontLabel": "GengarFrontpic", + "id": "GENGAR", + "name": "GENGAR" + }, + "GEODUDE": { + "back": "geodude_back", + "backLabel": "GeodudeBackpic", + "dexLabel": "GeodudePokedexEntry", + "front": "geodude", + "frontLabel": "GeodudeFrontpic", + "id": "GEODUDE", + "name": "GEODUDE" + }, + "GIRAFARIG": { + "back": "girafarig_back", + "backLabel": "GirafarigBackpic", + "dexLabel": "GirafarigPokedexEntry", + "front": "girafarig", + "frontLabel": "GirafarigFrontpic", + "id": "GIRAFARIG", + "name": "GIRAFARIG" + }, + "GLIGAR": { + "back": "gligar_back", + "backLabel": "GligarBackpic", + "dexLabel": "GligarPokedexEntry", + "front": "gligar", + "frontLabel": "GligarFrontpic", + "id": "GLIGAR", + "name": "GLIGAR" + }, + "GLOOM": { + "back": "gloom_back", + "backLabel": "GloomBackpic", + "dexLabel": "GloomPokedexEntry", + "front": "gloom", + "frontLabel": "GloomFrontpic", + "id": "GLOOM", + "name": "GLOOM" + }, + "GOLBAT": { + "back": "golbat_back", + "backLabel": "GolbatBackpic", + "dexLabel": "GolbatPokedexEntry", + "front": "golbat", + "frontLabel": "GolbatFrontpic", + "id": "GOLBAT", + "name": "GOLBAT" + }, + "GOLDEEN": { + "back": "goldeen_back", + "backLabel": "GoldeenBackpic", + "dexLabel": "GoldeenPokedexEntry", + "front": "goldeen", + "frontLabel": "GoldeenFrontpic", + "id": "GOLDEEN", + "name": "GOLDEEN" + }, + "GOLDUCK": { + "back": "golduck_back", + "backLabel": "GolduckBackpic", + "dexLabel": "GolduckPokedexEntry", + "front": "golduck", + "frontLabel": "GolduckFrontpic", + "id": "GOLDUCK", + "name": "GOLDUCK" + }, + "GOLEM": { + "back": "golem_back", + "backLabel": "GolemBackpic", + "dexLabel": "GolemPokedexEntry", + "front": "golem", + "frontLabel": "GolemFrontpic", + "id": "GOLEM", + "name": "GOLEM" + }, + "GRANBULL": { + "back": "granbull_back", + "backLabel": "GranbullBackpic", + "dexLabel": "GranbullPokedexEntry", + "front": "granbull", + "frontLabel": "GranbullFrontpic", + "id": "GRANBULL", + "name": "GRANBULL" + }, + "GRAVELER": { + "back": "graveler_back", + "backLabel": "GravelerBackpic", + "dexLabel": "GravelerPokedexEntry", + "front": "graveler", + "frontLabel": "GravelerFrontpic", + "id": "GRAVELER", + "name": "GRAVELER" + }, + "GRIMER": { + "back": "grimer_back", + "backLabel": "GrimerBackpic", + "dexLabel": "GrimerPokedexEntry", + "front": "grimer", + "frontLabel": "GrimerFrontpic", + "id": "GRIMER", + "name": "GRIMER" + }, + "GROWLITHE": { + "back": "growlithe_back", + "backLabel": "GrowlitheBackpic", + "dexLabel": "GrowlithePokedexEntry", + "front": "growlithe", + "frontLabel": "GrowlitheFrontpic", + "id": "GROWLITHE", + "name": "GROWLITHE" + }, + "GYARADOS": { + "back": "gyarados_back", + "backLabel": "GyaradosBackpic", + "dexLabel": "GyaradosPokedexEntry", + "front": "gyarados", + "frontLabel": "GyaradosFrontpic", + "id": "GYARADOS", + "name": "GYARADOS" + }, + "HAUNTER": { + "back": "haunter_back", + "backLabel": "HaunterBackpic", + "dexLabel": "HaunterPokedexEntry", + "front": "haunter", + "frontLabel": "HaunterFrontpic", + "id": "HAUNTER", + "name": "HAUNTER" + }, + "HERACROSS": { + "back": "heracross_back", + "backLabel": "HeracrossBackpic", + "dexLabel": "HeracrossPokedexEntry", + "front": "heracross", + "frontLabel": "HeracrossFrontpic", + "id": "HERACROSS", + "name": "HERACROSS" + }, + "HITMONCHAN": { + "back": "hitmonchan_back", + "backLabel": "HitmonchanBackpic", + "dexLabel": "HitmonchanPokedexEntry", + "front": "hitmonchan", + "frontLabel": "HitmonchanFrontpic", + "id": "HITMONCHAN", + "name": "HITMONCHAN" + }, + "HITMONLEE": { + "back": "hitmonlee_back", + "backLabel": "HitmonleeBackpic", + "dexLabel": "HitmonleePokedexEntry", + "front": "hitmonlee", + "frontLabel": "HitmonleeFrontpic", + "id": "HITMONLEE", + "name": "HITMONLEE" + }, + "HITMONTOP": { + "back": "hitmontop_back", + "backLabel": "HitmontopBackpic", + "dexLabel": "HitmontopPokedexEntry", + "front": "hitmontop", + "frontLabel": "HitmontopFrontpic", + "id": "HITMONTOP", + "name": "HITMONTOP" + }, + "HOOTHOOT": { + "back": "hoothoot_back", + "backLabel": "HoothootBackpic", + "dexLabel": "HoothootPokedexEntry", + "front": "hoothoot", + "frontLabel": "HoothootFrontpic", + "id": "HOOTHOOT", + "name": "HOOTHOOT" + }, + "HOPPIP": { + "back": "hoppip_back", + "backLabel": "HoppipBackpic", + "dexLabel": "HoppipPokedexEntry", + "front": "hoppip", + "frontLabel": "HoppipFrontpic", + "id": "HOPPIP", + "name": "HOPPIP" + }, + "HORSEA": { + "back": "horsea_back", + "backLabel": "HorseaBackpic", + "dexLabel": "HorseaPokedexEntry", + "front": "horsea", + "frontLabel": "HorseaFrontpic", + "id": "HORSEA", + "name": "HORSEA" + }, + "HOUNDOOM": { + "back": "houndoom_back", + "backLabel": "HoundoomBackpic", + "dexLabel": "HoundoomPokedexEntry", + "front": "houndoom", + "frontLabel": "HoundoomFrontpic", + "id": "HOUNDOOM", + "name": "HOUNDOOM" + }, + "HOUNDOUR": { + "back": "houndour_back", + "backLabel": "HoundourBackpic", + "dexLabel": "HoundourPokedexEntry", + "front": "houndour", + "frontLabel": "HoundourFrontpic", + "id": "HOUNDOUR", + "name": "HOUNDOUR" + }, + "HO_OH": { + "back": "hooh_back", + "backLabel": "HoOhBackpic", + "dexLabel": "HoOhPokedexEntry", + "front": "hooh", + "frontLabel": "HoOhFrontpic", + "id": "HO_OH", + "name": "HO-OH" + }, + "HYPNO": { + "back": "hypno_back", + "backLabel": "HypnoBackpic", + "dexLabel": "HypnoPokedexEntry", + "front": "hypno", + "frontLabel": "HypnoFrontpic", + "id": "HYPNO", + "name": "HYPNO" + }, + "IGGLYBUFF": { + "back": "igglybuff_back", + "backLabel": "IgglybuffBackpic", + "dexLabel": "IgglybuffPokedexEntry", + "front": "igglybuff", + "frontLabel": "IgglybuffFrontpic", + "id": "IGGLYBUFF", + "name": "IGGLYBUFF" + }, + "IVYSAUR": { + "back": "ivysaur_back", + "backLabel": "IvysaurBackpic", + "dexLabel": "IvysaurPokedexEntry", + "front": "ivysaur", + "frontLabel": "IvysaurFrontpic", + "id": "IVYSAUR", + "name": "IVYSAUR" + }, + "JIGGLYPUFF": { + "back": "jigglypuff_back", + "backLabel": "JigglypuffBackpic", + "dexLabel": "JigglypuffPokedexEntry", + "front": "jigglypuff", + "frontLabel": "JigglypuffFrontpic", + "id": "JIGGLYPUFF", + "name": "JIGGLYPUFF" + }, + "JOLTEON": { + "back": "jolteon_back", + "backLabel": "JolteonBackpic", + "dexLabel": "JolteonPokedexEntry", + "front": "jolteon", + "frontLabel": "JolteonFrontpic", + "id": "JOLTEON", + "name": "JOLTEON" + }, + "JUMPLUFF": { + "back": "jumpluff_back", + "backLabel": "JumpluffBackpic", + "dexLabel": "JumpluffPokedexEntry", + "front": "jumpluff", + "frontLabel": "JumpluffFrontpic", + "id": "JUMPLUFF", + "name": "JUMPLUFF" + }, + "JYNX": { + "back": "jynx_back", + "backLabel": "JynxBackpic", + "dexLabel": "JynxPokedexEntry", + "front": "jynx", + "frontLabel": "JynxFrontpic", + "id": "JYNX", + "name": "JYNX" + }, + "KABUTO": { + "back": "kabuto_back", + "backLabel": "KabutoBackpic", + "dexLabel": "KabutoPokedexEntry", + "front": "kabuto", + "frontLabel": "KabutoFrontpic", + "id": "KABUTO", + "name": "KABUTO" + }, + "KABUTOPS": { + "back": "kabutops_back", + "backLabel": "KabutopsBackpic", + "dexLabel": "KabutopsPokedexEntry", + "front": "kabutops", + "frontLabel": "KabutopsFrontpic", + "id": "KABUTOPS", + "name": "KABUTOPS" + }, + "KADABRA": { + "back": "kadabra_back", + "backLabel": "KadabraBackpic", + "dexLabel": "KadabraPokedexEntry", + "front": "kadabra", + "frontLabel": "KadabraFrontpic", + "id": "KADABRA", + "name": "KADABRA" + }, + "KAKUNA": { + "back": "kakuna_back", + "backLabel": "KakunaBackpic", + "dexLabel": "KakunaPokedexEntry", + "front": "kakuna", + "frontLabel": "KakunaFrontpic", + "id": "KAKUNA", + "name": "KAKUNA" + }, + "KANGASKHAN": { + "back": "kangaskhan_back", + "backLabel": "KangaskhanBackpic", + "dexLabel": "KangaskhanPokedexEntry", + "front": "kangaskhan", + "frontLabel": "KangaskhanFrontpic", + "id": "KANGASKHAN", + "name": "KANGASKHAN" + }, + "KINGDRA": { + "back": "kingdra_back", + "backLabel": "KingdraBackpic", + "dexLabel": "KingdraPokedexEntry", + "front": "kingdra", + "frontLabel": "KingdraFrontpic", + "id": "KINGDRA", + "name": "KINGDRA" + }, + "KINGLER": { + "back": "kingler_back", + "backLabel": "KinglerBackpic", + "dexLabel": "KinglerPokedexEntry", + "front": "kingler", + "frontLabel": "KinglerFrontpic", + "id": "KINGLER", + "name": "KINGLER" + }, + "KOFFING": { + "back": "koffing_back", + "backLabel": "KoffingBackpic", + "dexLabel": "KoffingPokedexEntry", + "front": "koffing", + "frontLabel": "KoffingFrontpic", + "id": "KOFFING", + "name": "KOFFING" + }, + "KRABBY": { + "back": "krabby_back", + "backLabel": "KrabbyBackpic", + "dexLabel": "KrabbyPokedexEntry", + "front": "krabby", + "frontLabel": "KrabbyFrontpic", + "id": "KRABBY", + "name": "KRABBY" + }, + "LANTURN": { + "back": "lanturn_back", + "backLabel": "LanturnBackpic", + "dexLabel": "LanturnPokedexEntry", + "front": "lanturn", + "frontLabel": "LanturnFrontpic", + "id": "LANTURN", + "name": "LANTURN" + }, + "LAPRAS": { + "back": "lapras_back", + "backLabel": "LaprasBackpic", + "dexLabel": "LaprasPokedexEntry", + "front": "lapras", + "frontLabel": "LaprasFrontpic", + "id": "LAPRAS", + "name": "LAPRAS" + }, + "LARVITAR": { + "back": "larvitar_back", + "backLabel": "LarvitarBackpic", + "dexLabel": "LarvitarPokedexEntry", + "front": "larvitar", + "frontLabel": "LarvitarFrontpic", + "id": "LARVITAR", + "name": "LARVITAR" + }, + "LEDIAN": { + "back": "ledian_back", + "backLabel": "LedianBackpic", + "dexLabel": "LedianPokedexEntry", + "front": "ledian", + "frontLabel": "LedianFrontpic", + "id": "LEDIAN", + "name": "LEDIAN" + }, + "LEDYBA": { + "back": "ledyba_back", + "backLabel": "LedybaBackpic", + "dexLabel": "LedybaPokedexEntry", + "front": "ledyba", + "frontLabel": "LedybaFrontpic", + "id": "LEDYBA", + "name": "LEDYBA" + }, + "LICKITUNG": { + "back": "lickitung_back", + "backLabel": "LickitungBackpic", + "dexLabel": "LickitungPokedexEntry", + "front": "lickitung", + "frontLabel": "LickitungFrontpic", + "id": "LICKITUNG", + "name": "LICKITUNG" + }, + "LUGIA": { + "back": "lugia_back", + "backLabel": "LugiaBackpic", + "dexLabel": "LugiaPokedexEntry", + "front": "lugia", + "frontLabel": "LugiaFrontpic", + "id": "LUGIA", + "name": "LUGIA" + }, + "MACHAMP": { + "back": "machamp_back", + "backLabel": "MachampBackpic", + "dexLabel": "MachampPokedexEntry", + "front": "machamp", + "frontLabel": "MachampFrontpic", + "id": "MACHAMP", + "name": "MACHAMP" + }, + "MACHOKE": { + "back": "machoke_back", + "backLabel": "MachokeBackpic", + "dexLabel": "MachokePokedexEntry", + "front": "machoke", + "frontLabel": "MachokeFrontpic", + "id": "MACHOKE", + "name": "MACHOKE" + }, + "MACHOP": { + "back": "machop_back", + "backLabel": "MachopBackpic", + "dexLabel": "MachopPokedexEntry", + "front": "machop", + "frontLabel": "MachopFrontpic", + "id": "MACHOP", + "name": "MACHOP" + }, + "MAGBY": { + "back": "magby_back", + "backLabel": "MagbyBackpic", + "dexLabel": "MagbyPokedexEntry", + "front": "magby", + "frontLabel": "MagbyFrontpic", + "id": "MAGBY", + "name": "MAGBY" + }, + "MAGCARGO": { + "back": "magcargo_back", + "backLabel": "MagcargoBackpic", + "dexLabel": "MagcargoPokedexEntry", + "front": "magcargo", + "frontLabel": "MagcargoFrontpic", + "id": "MAGCARGO", + "name": "MAGCARGO" + }, + "MAGIKARP": { + "back": "magikarp_back", + "backLabel": "MagikarpBackpic", + "dexLabel": "MagikarpPokedexEntry", + "front": "magikarp", + "frontLabel": "MagikarpFrontpic", + "id": "MAGIKARP", + "name": "MAGIKARP" + }, + "MAGMAR": { + "back": "magmar_back", + "backLabel": "MagmarBackpic", + "dexLabel": "MagmarPokedexEntry", + "front": "magmar", + "frontLabel": "MagmarFrontpic", + "id": "MAGMAR", + "name": "MAGMAR" + }, + "MAGNEMITE": { + "back": "magnemite_back", + "backLabel": "MagnemiteBackpic", + "dexLabel": "MagnemitePokedexEntry", + "front": "magnemite", + "frontLabel": "MagnemiteFrontpic", + "id": "MAGNEMITE", + "name": "MAGNEMITE" + }, + "MAGNETON": { + "back": "magneton_back", + "backLabel": "MagnetonBackpic", + "dexLabel": "MagnetonPokedexEntry", + "front": "magneton", + "frontLabel": "MagnetonFrontpic", + "id": "MAGNETON", + "name": "MAGNETON" + }, + "MANKEY": { + "back": "mankey_back", + "backLabel": "MankeyBackpic", + "dexLabel": "MankeyPokedexEntry", + "front": "mankey", + "frontLabel": "MankeyFrontpic", + "id": "MANKEY", + "name": "MANKEY" + }, + "MANTINE": { + "back": "mantine_back", + "backLabel": "MantineBackpic", + "dexLabel": "MantinePokedexEntry", + "front": "mantine", + "frontLabel": "MantineFrontpic", + "id": "MANTINE", + "name": "MANTINE" + }, + "MAREEP": { + "back": "mareep_back", + "backLabel": "MareepBackpic", + "dexLabel": "MareepPokedexEntry", + "front": "mareep", + "frontLabel": "MareepFrontpic", + "id": "MAREEP", + "name": "MAREEP" + }, + "MARILL": { + "back": "marill_back", + "backLabel": "MarillBackpic", + "dexLabel": "MarillPokedexEntry", + "front": "marill", + "frontLabel": "MarillFrontpic", + "id": "MARILL", + "name": "MARILL" + }, + "MAROWAK": { + "back": "marowak_back", + "backLabel": "MarowakBackpic", + "dexLabel": "MarowakPokedexEntry", + "front": "marowak", + "frontLabel": "MarowakFrontpic", + "id": "MAROWAK", + "name": "MAROWAK" + }, + "MEGANIUM": { + "back": "meganium_back", + "backLabel": "MeganiumBackpic", + "dexLabel": "MeganiumPokedexEntry", + "front": "meganium", + "frontLabel": "MeganiumFrontpic", + "id": "MEGANIUM", + "name": "MEGANIUM" + }, + "MEOWTH": { + "back": "meowth_back", + "backLabel": "MeowthBackpic", + "dexLabel": "MeowthPokedexEntry", + "front": "meowth", + "frontLabel": "MeowthFrontpic", + "id": "MEOWTH", + "name": "MEOWTH" + }, + "METAPOD": { + "back": "metapod_back", + "backLabel": "MetapodBackpic", + "dexLabel": "MetapodPokedexEntry", + "front": "metapod", + "frontLabel": "MetapodFrontpic", + "id": "METAPOD", + "name": "METAPOD" + }, + "MEW": { + "back": "mew_back", + "backLabel": "MewBackpic", + "dexLabel": "MewPokedexEntry", + "front": "mew", + "frontLabel": "MewFrontpic", + "id": "MEW", + "name": "MEW" + }, + "MEWTWO": { + "back": "mewtwo_back", + "backLabel": "MewtwoBackpic", + "dexLabel": "MewtwoPokedexEntry", + "front": "mewtwo", + "frontLabel": "MewtwoFrontpic", + "id": "MEWTWO", + "name": "MEWTWO" + }, + "MILTANK": { + "back": "miltank_back", + "backLabel": "MiltankBackpic", + "dexLabel": "MiltankPokedexEntry", + "front": "miltank", + "frontLabel": "MiltankFrontpic", + "id": "MILTANK", + "name": "MILTANK" + }, + "MISDREAVUS": { + "back": "misdreavus_back", + "backLabel": "MisdreavusBackpic", + "dexLabel": "MisdreavusPokedexEntry", + "front": "misdreavus", + "frontLabel": "MisdreavusFrontpic", + "id": "MISDREAVUS", + "name": "MISDREAVUS" + }, + "MOLTRES": { + "back": "moltres_back", + "backLabel": "MoltresBackpic", + "dexLabel": "MoltresPokedexEntry", + "front": "moltres", + "frontLabel": "MoltresFrontpic", + "id": "MOLTRES", + "name": "MOLTRES" + }, + "MR__MIME": { + "back": "mrmime_back", + "backLabel": "MrMimeBackpic", + "dexLabel": "MrMimePokedexEntry", + "front": "mrmime", + "frontLabel": "MrMimeFrontpic", + "id": "MR__MIME", + "name": "MR.MIME" + }, + "MUK": { + "back": "muk_back", + "backLabel": "MukBackpic", + "dexLabel": "MukPokedexEntry", + "front": "muk", + "frontLabel": "MukFrontpic", + "id": "MUK", + "name": "MUK" + }, + "MURKROW": { + "back": "murkrow_back", + "backLabel": "MurkrowBackpic", + "dexLabel": "MurkrowPokedexEntry", + "front": "murkrow", + "frontLabel": "MurkrowFrontpic", + "id": "MURKROW", + "name": "MURKROW" + }, + "NATU": { + "back": "natu_back", + "backLabel": "NatuBackpic", + "dexLabel": "NatuPokedexEntry", + "front": "natu", + "frontLabel": "NatuFrontpic", + "id": "NATU", + "name": "NATU" + }, + "NIDOKING": { + "back": "nidoking_back", + "backLabel": "NidokingBackpic", + "dexLabel": "NidokingPokedexEntry", + "front": "nidoking", + "frontLabel": "NidokingFrontpic", + "id": "NIDOKING", + "name": "NIDOKING" + }, + "NIDOQUEEN": { + "back": "nidoqueen_back", + "backLabel": "NidoqueenBackpic", + "dexLabel": "NidoqueenPokedexEntry", + "front": "nidoqueen", + "frontLabel": "NidoqueenFrontpic", + "id": "NIDOQUEEN", + "name": "NIDOQUEEN" + }, + "NIDORAN_F": { + "back": "nidoranf_back", + "backLabel": "NidoranFBackpic", + "dexLabel": "NidoranFPokedexEntry", + "front": "nidoranf", + "frontLabel": "NidoranFFrontpic", + "id": "NIDORAN_F", + "name": "NIDORAN♀" + }, + "NIDORAN_M": { + "back": "nidoranm_back", + "backLabel": "NidoranMBackpic", + "dexLabel": "NidoranMPokedexEntry", + "front": "nidoranm", + "frontLabel": "NidoranMFrontpic", + "id": "NIDORAN_M", + "name": "NIDORAN♂" + }, + "NIDORINA": { + "back": "nidorina_back", + "backLabel": "NidorinaBackpic", + "dexLabel": "NidorinaPokedexEntry", + "front": "nidorina", + "frontLabel": "NidorinaFrontpic", + "id": "NIDORINA", + "name": "NIDORINA" + }, + "NIDORINO": { + "back": "nidorino_back", + "backLabel": "NidorinoBackpic", + "dexLabel": "NidorinoPokedexEntry", + "front": "nidorino", + "frontLabel": "NidorinoFrontpic", + "id": "NIDORINO", + "name": "NIDORINO" + }, + "NINETALES": { + "back": "ninetales_back", + "backLabel": "NinetalesBackpic", + "dexLabel": "NinetalesPokedexEntry", + "front": "ninetales", + "frontLabel": "NinetalesFrontpic", + "id": "NINETALES", + "name": "NINETALES" + }, + "NOCTOWL": { + "back": "noctowl_back", + "backLabel": "NoctowlBackpic", + "dexLabel": "NoctowlPokedexEntry", + "front": "noctowl", + "frontLabel": "NoctowlFrontpic", + "id": "NOCTOWL", + "name": "NOCTOWL" + }, + "OCTILLERY": { + "back": "octillery_back", + "backLabel": "OctilleryBackpic", + "dexLabel": "OctilleryPokedexEntry", + "front": "octillery", + "frontLabel": "OctilleryFrontpic", + "id": "OCTILLERY", + "name": "OCTILLERY" + }, + "ODDISH": { + "back": "oddish_back", + "backLabel": "OddishBackpic", + "dexLabel": "OddishPokedexEntry", + "front": "oddish", + "frontLabel": "OddishFrontpic", + "id": "ODDISH", + "name": "ODDISH" + }, + "OMANYTE": { + "back": "omanyte_back", + "backLabel": "OmanyteBackpic", + "dexLabel": "OmanytePokedexEntry", + "front": "omanyte", + "frontLabel": "OmanyteFrontpic", + "id": "OMANYTE", + "name": "OMANYTE" + }, + "OMASTAR": { + "back": "omastar_back", + "backLabel": "OmastarBackpic", + "dexLabel": "OmastarPokedexEntry", + "front": "omastar", + "frontLabel": "OmastarFrontpic", + "id": "OMASTAR", + "name": "OMASTAR" + }, + "ONIX": { + "back": "onix_back", + "backLabel": "OnixBackpic", + "dexLabel": "OnixPokedexEntry", + "front": "onix", + "frontLabel": "OnixFrontpic", + "id": "ONIX", + "name": "ONIX" + }, + "PARAS": { + "back": "paras_back", + "backLabel": "ParasBackpic", + "dexLabel": "ParasPokedexEntry", + "front": "paras", + "frontLabel": "ParasFrontpic", + "id": "PARAS", + "name": "PARAS" + }, + "PARASECT": { + "back": "parasect_back", + "backLabel": "ParasectBackpic", + "dexLabel": "ParasectPokedexEntry", + "front": "parasect", + "frontLabel": "ParasectFrontpic", + "id": "PARASECT", + "name": "PARASECT" + }, + "PERSIAN": { + "back": "persian_back", + "backLabel": "PersianBackpic", + "dexLabel": "PersianPokedexEntry", + "front": "persian", + "frontLabel": "PersianFrontpic", + "id": "PERSIAN", + "name": "PERSIAN" + }, + "PHANPY": { + "back": "phanpy_back", + "backLabel": "PhanpyBackpic", + "dexLabel": "PhanpyPokedexEntry", + "front": "phanpy", + "frontLabel": "PhanpyFrontpic", + "id": "PHANPY", + "name": "PHANPY" + }, + "PICHU": { + "back": "pichu_back", + "backLabel": "PichuBackpic", + "dexLabel": "PichuPokedexEntry", + "front": "pichu", + "frontLabel": "PichuFrontpic", + "id": "PICHU", + "name": "PICHU" + }, + "PIDGEOT": { + "back": "pidgeot_back", + "backLabel": "PidgeotBackpic", + "dexLabel": "PidgeotPokedexEntry", + "front": "pidgeot", + "frontLabel": "PidgeotFrontpic", + "id": "PIDGEOT", + "name": "PIDGEOT" + }, + "PIDGEOTTO": { + "back": "pidgeotto_back", + "backLabel": "PidgeottoBackpic", + "dexLabel": "PidgeottoPokedexEntry", + "front": "pidgeotto", + "frontLabel": "PidgeottoFrontpic", + "id": "PIDGEOTTO", + "name": "PIDGEOTTO" + }, + "PIDGEY": { + "back": "pidgey_back", + "backLabel": "PidgeyBackpic", + "dexLabel": "PidgeyPokedexEntry", + "front": "pidgey", + "frontLabel": "PidgeyFrontpic", + "id": "PIDGEY", + "name": "PIDGEY" + }, + "PIKACHU": { + "back": "pikachu_back", + "backLabel": "PikachuBackpic", + "dexLabel": "PikachuPokedexEntry", + "front": "pikachu", + "frontLabel": "PikachuFrontpic", + "id": "PIKACHU", + "name": "PIKACHU" + }, + "PILOSWINE": { + "back": "piloswine_back", + "backLabel": "PiloswineBackpic", + "dexLabel": "PiloswinePokedexEntry", + "front": "piloswine", + "frontLabel": "PiloswineFrontpic", + "id": "PILOSWINE", + "name": "PILOSWINE" + }, + "PINECO": { + "back": "pineco_back", + "backLabel": "PinecoBackpic", + "dexLabel": "PinecoPokedexEntry", + "front": "pineco", + "frontLabel": "PinecoFrontpic", + "id": "PINECO", + "name": "PINECO" + }, + "PINSIR": { + "back": "pinsir_back", + "backLabel": "PinsirBackpic", + "dexLabel": "PinsirPokedexEntry", + "front": "pinsir", + "frontLabel": "PinsirFrontpic", + "id": "PINSIR", + "name": "PINSIR" + }, + "POLITOED": { + "back": "politoed_back", + "backLabel": "PolitoedBackpic", + "dexLabel": "PolitoedPokedexEntry", + "front": "politoed", + "frontLabel": "PolitoedFrontpic", + "id": "POLITOED", + "name": "POLITOED" + }, + "POLIWAG": { + "back": "poliwag_back", + "backLabel": "PoliwagBackpic", + "dexLabel": "PoliwagPokedexEntry", + "front": "poliwag", + "frontLabel": "PoliwagFrontpic", + "id": "POLIWAG", + "name": "POLIWAG" + }, + "POLIWHIRL": { + "back": "poliwhirl_back", + "backLabel": "PoliwhirlBackpic", + "dexLabel": "PoliwhirlPokedexEntry", + "front": "poliwhirl", + "frontLabel": "PoliwhirlFrontpic", + "id": "POLIWHIRL", + "name": "POLIWHIRL" + }, + "POLIWRATH": { + "back": "poliwrath_back", + "backLabel": "PoliwrathBackpic", + "dexLabel": "PoliwrathPokedexEntry", + "front": "poliwrath", + "frontLabel": "PoliwrathFrontpic", + "id": "POLIWRATH", + "name": "POLIWRATH" + }, + "PONYTA": { + "back": "ponyta_back", + "backLabel": "PonytaBackpic", + "dexLabel": "PonytaPokedexEntry", + "front": "ponyta", + "frontLabel": "PonytaFrontpic", + "id": "PONYTA", + "name": "PONYTA" + }, + "PORYGON": { + "back": "porygon_back", + "backLabel": "PorygonBackpic", + "dexLabel": "PorygonPokedexEntry", + "front": "porygon", + "frontLabel": "PorygonFrontpic", + "id": "PORYGON", + "name": "PORYGON" + }, + "PORYGON2": { + "back": "porygon2_back", + "backLabel": "Porygon2Backpic", + "dexLabel": "Porygon2PokedexEntry", + "front": "porygon2", + "frontLabel": "Porygon2Frontpic", + "id": "PORYGON2", + "name": "PORYGON2" + }, + "PRIMEAPE": { + "back": "primeape_back", + "backLabel": "PrimeapeBackpic", + "dexLabel": "PrimeapePokedexEntry", + "front": "primeape", + "frontLabel": "PrimeapeFrontpic", + "id": "PRIMEAPE", + "name": "PRIMEAPE" + }, + "PSYDUCK": { + "back": "psyduck_back", + "backLabel": "PsyduckBackpic", + "dexLabel": "PsyduckPokedexEntry", + "front": "psyduck", + "frontLabel": "PsyduckFrontpic", + "id": "PSYDUCK", + "name": "PSYDUCK" + }, + "PUPITAR": { + "back": "pupitar_back", + "backLabel": "PupitarBackpic", + "dexLabel": "PupitarPokedexEntry", + "front": "pupitar", + "frontLabel": "PupitarFrontpic", + "id": "PUPITAR", + "name": "PUPITAR" + }, + "QUAGSIRE": { + "back": "quagsire_back", + "backLabel": "QuagsireBackpic", + "dexLabel": "QuagsirePokedexEntry", + "front": "quagsire", + "frontLabel": "QuagsireFrontpic", + "id": "QUAGSIRE", + "name": "QUAGSIRE" + }, + "QUILAVA": { + "back": "quilava_back", + "backLabel": "QuilavaBackpic", + "dexLabel": "QuilavaPokedexEntry", + "front": "quilava", + "frontLabel": "QuilavaFrontpic", + "id": "QUILAVA", + "name": "QUILAVA" + }, + "QWILFISH": { + "back": "qwilfish_back", + "backLabel": "QwilfishBackpic", + "dexLabel": "QwilfishPokedexEntry", + "front": "qwilfish", + "frontLabel": "QwilfishFrontpic", + "id": "QWILFISH", + "name": "QWILFISH" + }, + "RAICHU": { + "back": "raichu_back", + "backLabel": "RaichuBackpic", + "dexLabel": "RaichuPokedexEntry", + "front": "raichu", + "frontLabel": "RaichuFrontpic", + "id": "RAICHU", + "name": "RAICHU" + }, + "RAIKOU": { + "back": "raikou_back", + "backLabel": "RaikouBackpic", + "dexLabel": "RaikouPokedexEntry", + "front": "raikou", + "frontLabel": "RaikouFrontpic", + "id": "RAIKOU", + "name": "RAIKOU" + }, + "RAPIDASH": { + "back": "rapidash_back", + "backLabel": "RapidashBackpic", + "dexLabel": "RapidashPokedexEntry", + "front": "rapidash", + "frontLabel": "RapidashFrontpic", + "id": "RAPIDASH", + "name": "RAPIDASH" + }, + "RATICATE": { + "back": "raticate_back", + "backLabel": "RaticateBackpic", + "dexLabel": "RaticatePokedexEntry", + "front": "raticate", + "frontLabel": "RaticateFrontpic", + "id": "RATICATE", + "name": "RATICATE" + }, + "RATTATA": { + "back": "rattata_back", + "backLabel": "RattataBackpic", + "dexLabel": "RattataPokedexEntry", + "front": "rattata", + "frontLabel": "RattataFrontpic", + "id": "RATTATA", + "name": "RATTATA" + }, + "REMORAID": { + "back": "remoraid_back", + "backLabel": "RemoraidBackpic", + "dexLabel": "RemoraidPokedexEntry", + "front": "remoraid", + "frontLabel": "RemoraidFrontpic", + "id": "REMORAID", + "name": "REMORAID" + }, + "RHYDON": { + "back": "rhydon_back", + "backLabel": "RhydonBackpic", + "dexLabel": "RhydonPokedexEntry", + "front": "rhydon", + "frontLabel": "RhydonFrontpic", + "id": "RHYDON", + "name": "RHYDON" + }, + "RHYHORN": { + "back": "rhyhorn_back", + "backLabel": "RhyhornBackpic", + "dexLabel": "RhyhornPokedexEntry", + "front": "rhyhorn", + "frontLabel": "RhyhornFrontpic", + "id": "RHYHORN", + "name": "RHYHORN" + }, + "SANDSHREW": { + "back": "sandshrew_back", + "backLabel": "SandshrewBackpic", + "dexLabel": "SandshrewPokedexEntry", + "front": "sandshrew", + "frontLabel": "SandshrewFrontpic", + "id": "SANDSHREW", + "name": "SANDSHREW" + }, + "SANDSLASH": { + "back": "sandslash_back", + "backLabel": "SandslashBackpic", + "dexLabel": "SandslashPokedexEntry", + "front": "sandslash", + "frontLabel": "SandslashFrontpic", + "id": "SANDSLASH", + "name": "SANDSLASH" + }, + "SCIZOR": { + "back": "scizor_back", + "backLabel": "ScizorBackpic", + "dexLabel": "ScizorPokedexEntry", + "front": "scizor", + "frontLabel": "ScizorFrontpic", + "id": "SCIZOR", + "name": "SCIZOR" + }, + "SCYTHER": { + "back": "scyther_back", + "backLabel": "ScytherBackpic", + "dexLabel": "ScytherPokedexEntry", + "front": "scyther", + "frontLabel": "ScytherFrontpic", + "id": "SCYTHER", + "name": "SCYTHER" + }, + "SEADRA": { + "back": "seadra_back", + "backLabel": "SeadraBackpic", + "dexLabel": "SeadraPokedexEntry", + "front": "seadra", + "frontLabel": "SeadraFrontpic", + "id": "SEADRA", + "name": "SEADRA" + }, + "SEAKING": { + "back": "seaking_back", + "backLabel": "SeakingBackpic", + "dexLabel": "SeakingPokedexEntry", + "front": "seaking", + "frontLabel": "SeakingFrontpic", + "id": "SEAKING", + "name": "SEAKING" + }, + "SEEL": { + "back": "seel_back", + "backLabel": "SeelBackpic", + "dexLabel": "SeelPokedexEntry", + "front": "seel", + "frontLabel": "SeelFrontpic", + "id": "SEEL", + "name": "SEEL" + }, + "SENTRET": { + "back": "sentret_back", + "backLabel": "SentretBackpic", + "dexLabel": "SentretPokedexEntry", + "front": "sentret", + "frontLabel": "SentretFrontpic", + "id": "SENTRET", + "name": "SENTRET" + }, + "SHELLDER": { + "back": "shellder_back", + "backLabel": "ShellderBackpic", + "dexLabel": "ShellderPokedexEntry", + "front": "shellder", + "frontLabel": "ShellderFrontpic", + "id": "SHELLDER", + "name": "SHELLDER" + }, + "SHUCKLE": { + "back": "shuckle_back", + "backLabel": "ShuckleBackpic", + "dexLabel": "ShucklePokedexEntry", + "front": "shuckle", + "frontLabel": "ShuckleFrontpic", + "id": "SHUCKLE", + "name": "SHUCKLE" + }, + "SKARMORY": { + "back": "skarmory_back", + "backLabel": "SkarmoryBackpic", + "dexLabel": "SkarmoryPokedexEntry", + "front": "skarmory", + "frontLabel": "SkarmoryFrontpic", + "id": "SKARMORY", + "name": "SKARMORY" + }, + "SKIPLOOM": { + "back": "skiploom_back", + "backLabel": "SkiploomBackpic", + "dexLabel": "SkiploomPokedexEntry", + "front": "skiploom", + "frontLabel": "SkiploomFrontpic", + "id": "SKIPLOOM", + "name": "SKIPLOOM" + }, + "SLOWBRO": { + "back": "slowbro_back", + "backLabel": "SlowbroBackpic", + "dexLabel": "SlowbroPokedexEntry", + "front": "slowbro", + "frontLabel": "SlowbroFrontpic", + "id": "SLOWBRO", + "name": "SLOWBRO" + }, + "SLOWKING": { + "back": "slowking_back", + "backLabel": "SlowkingBackpic", + "dexLabel": "SlowkingPokedexEntry", + "front": "slowking", + "frontLabel": "SlowkingFrontpic", + "id": "SLOWKING", + "name": "SLOWKING" + }, + "SLOWPOKE": { + "back": "slowpoke_back", + "backLabel": "SlowpokeBackpic", + "dexLabel": "SlowpokePokedexEntry", + "front": "slowpoke", + "frontLabel": "SlowpokeFrontpic", + "id": "SLOWPOKE", + "name": "SLOWPOKE" + }, + "SLUGMA": { + "back": "slugma_back", + "backLabel": "SlugmaBackpic", + "dexLabel": "SlugmaPokedexEntry", + "front": "slugma", + "frontLabel": "SlugmaFrontpic", + "id": "SLUGMA", + "name": "SLUGMA" + }, + "SMEARGLE": { + "back": "smeargle_back", + "backLabel": "SmeargleBackpic", + "dexLabel": "SmearglePokedexEntry", + "front": "smeargle", + "frontLabel": "SmeargleFrontpic", + "id": "SMEARGLE", + "name": "SMEARGLE" + }, + "SMOOCHUM": { + "back": "smoochum_back", + "backLabel": "SmoochumBackpic", + "dexLabel": "SmoochumPokedexEntry", + "front": "smoochum", + "frontLabel": "SmoochumFrontpic", + "id": "SMOOCHUM", + "name": "SMOOCHUM" + }, + "SNEASEL": { + "back": "sneasel_back", + "backLabel": "SneaselBackpic", + "dexLabel": "SneaselPokedexEntry", + "front": "sneasel", + "frontLabel": "SneaselFrontpic", + "id": "SNEASEL", + "name": "SNEASEL" + }, + "SNORLAX": { + "back": "snorlax_back", + "backLabel": "SnorlaxBackpic", + "dexLabel": "SnorlaxPokedexEntry", + "front": "snorlax", + "frontLabel": "SnorlaxFrontpic", + "id": "SNORLAX", + "name": "SNORLAX" + }, + "SNUBBULL": { + "back": "snubbull_back", + "backLabel": "SnubbullBackpic", + "dexLabel": "SnubbullPokedexEntry", + "front": "snubbull", + "frontLabel": "SnubbullFrontpic", + "id": "SNUBBULL", + "name": "SNUBBULL" + }, + "SPEAROW": { + "back": "spearow_back", + "backLabel": "SpearowBackpic", + "dexLabel": "SpearowPokedexEntry", + "front": "spearow", + "frontLabel": "SpearowFrontpic", + "id": "SPEAROW", + "name": "SPEAROW" + }, + "SPINARAK": { + "back": "spinarak_back", + "backLabel": "SpinarakBackpic", + "dexLabel": "SpinarakPokedexEntry", + "front": "spinarak", + "frontLabel": "SpinarakFrontpic", + "id": "SPINARAK", + "name": "SPINARAK" + }, + "SQUIRTLE": { + "back": "squirtle_back", + "backLabel": "SquirtleBackpic", + "dexLabel": "SquirtlePokedexEntry", + "front": "squirtle", + "frontLabel": "SquirtleFrontpic", + "id": "SQUIRTLE", + "name": "SQUIRTLE" + }, + "STANTLER": { + "back": "stantler_back", + "backLabel": "StantlerBackpic", + "dexLabel": "StantlerPokedexEntry", + "front": "stantler", + "frontLabel": "StantlerFrontpic", + "id": "STANTLER", + "name": "STANTLER" + }, + "STARMIE": { + "back": "starmie_back", + "backLabel": "StarmieBackpic", + "dexLabel": "StarmiePokedexEntry", + "front": "starmie", + "frontLabel": "StarmieFrontpic", + "id": "STARMIE", + "name": "STARMIE" + }, + "STARYU": { + "back": "staryu_back", + "backLabel": "StaryuBackpic", + "dexLabel": "StaryuPokedexEntry", + "front": "staryu", + "frontLabel": "StaryuFrontpic", + "id": "STARYU", + "name": "STARYU" + }, + "STEELIX": { + "back": "steelix_back", + "backLabel": "SteelixBackpic", + "dexLabel": "SteelixPokedexEntry", + "front": "steelix", + "frontLabel": "SteelixFrontpic", + "id": "STEELIX", + "name": "STEELIX" + }, + "SUDOWOODO": { + "back": "sudowoodo_back", + "backLabel": "SudowoodoBackpic", + "dexLabel": "SudowoodoPokedexEntry", + "front": "sudowoodo", + "frontLabel": "SudowoodoFrontpic", + "id": "SUDOWOODO", + "name": "SUDOWOODO" + }, + "SUICUNE": { + "back": "suicune_back", + "backLabel": "SuicuneBackpic", + "dexLabel": "SuicunePokedexEntry", + "front": "suicune", + "frontLabel": "SuicuneFrontpic", + "id": "SUICUNE", + "name": "SUICUNE" + }, + "SUNFLORA": { + "back": "sunflora_back", + "backLabel": "SunfloraBackpic", + "dexLabel": "SunfloraPokedexEntry", + "front": "sunflora", + "frontLabel": "SunfloraFrontpic", + "id": "SUNFLORA", + "name": "SUNFLORA" + }, + "SUNKERN": { + "back": "sunkern_back", + "backLabel": "SunkernBackpic", + "dexLabel": "SunkernPokedexEntry", + "front": "sunkern", + "frontLabel": "SunkernFrontpic", + "id": "SUNKERN", + "name": "SUNKERN" + }, + "SWINUB": { + "back": "swinub_back", + "backLabel": "SwinubBackpic", + "dexLabel": "SwinubPokedexEntry", + "front": "swinub", + "frontLabel": "SwinubFrontpic", + "id": "SWINUB", + "name": "SWINUB" + }, + "TANGELA": { + "back": "tangela_back", + "backLabel": "TangelaBackpic", + "dexLabel": "TangelaPokedexEntry", + "front": "tangela", + "frontLabel": "TangelaFrontpic", + "id": "TANGELA", + "name": "TANGELA" + }, + "TAUROS": { + "back": "tauros_back", + "backLabel": "TaurosBackpic", + "dexLabel": "TaurosPokedexEntry", + "front": "tauros", + "frontLabel": "TaurosFrontpic", + "id": "TAUROS", + "name": "TAUROS" + }, + "TEDDIURSA": { + "back": "teddiursa_back", + "backLabel": "TeddiursaBackpic", + "dexLabel": "TeddiursaPokedexEntry", + "front": "teddiursa", + "frontLabel": "TeddiursaFrontpic", + "id": "TEDDIURSA", + "name": "TEDDIURSA" + }, + "TENTACOOL": { + "back": "tentacool_back", + "backLabel": "TentacoolBackpic", + "dexLabel": "TentacoolPokedexEntry", + "front": "tentacool", + "frontLabel": "TentacoolFrontpic", + "id": "TENTACOOL", + "name": "TENTACOOL" + }, + "TENTACRUEL": { + "back": "tentacruel_back", + "backLabel": "TentacruelBackpic", + "dexLabel": "TentacruelPokedexEntry", + "front": "tentacruel", + "frontLabel": "TentacruelFrontpic", + "id": "TENTACRUEL", + "name": "TENTACRUEL" + }, + "TOGEPI": { + "back": "togepi_back", + "backLabel": "TogepiBackpic", + "dexLabel": "TogepiPokedexEntry", + "front": "togepi", + "frontLabel": "TogepiFrontpic", + "id": "TOGEPI", + "name": "TOGEPI" + }, + "TOGETIC": { + "back": "togetic_back", + "backLabel": "TogeticBackpic", + "dexLabel": "TogeticPokedexEntry", + "front": "togetic", + "frontLabel": "TogeticFrontpic", + "id": "TOGETIC", + "name": "TOGETIC" + }, + "TOTODILE": { + "back": "totodile_back", + "backLabel": "TotodileBackpic", + "dexLabel": "TotodilePokedexEntry", + "front": "totodile", + "frontLabel": "TotodileFrontpic", + "id": "TOTODILE", + "name": "TOTODILE" + }, + "TYPHLOSION": { + "back": "typhlosion_back", + "backLabel": "TyphlosionBackpic", + "dexLabel": "TyphlosionPokedexEntry", + "front": "typhlosion", + "frontLabel": "TyphlosionFrontpic", + "id": "TYPHLOSION", + "name": "TYPHLOSION" + }, + "TYRANITAR": { + "back": "tyranitar_back", + "backLabel": "TyranitarBackpic", + "dexLabel": "TyranitarPokedexEntry", + "front": "tyranitar", + "frontLabel": "TyranitarFrontpic", + "id": "TYRANITAR", + "name": "TYRANITAR" + }, + "TYROGUE": { + "back": "tyrogue_back", + "backLabel": "TyrogueBackpic", + "dexLabel": "TyroguePokedexEntry", + "front": "tyrogue", + "frontLabel": "TyrogueFrontpic", + "id": "TYROGUE", + "name": "TYROGUE" + }, + "UMBREON": { + "back": "umbreon_back", + "backLabel": "UmbreonBackpic", + "dexLabel": "UmbreonPokedexEntry", + "front": "umbreon", + "frontLabel": "UmbreonFrontpic", + "id": "UMBREON", + "name": "UMBREON" + }, + "UNOWN": { + "back": null, + "backLabel": null, + "dexLabel": "UnownPokedexEntry", + "front": null, + "frontLabel": null, + "id": "UNOWN", + "name": "UNOWN" + }, + "URSARING": { + "back": "ursaring_back", + "backLabel": "UrsaringBackpic", + "dexLabel": "UrsaringPokedexEntry", + "front": "ursaring", + "frontLabel": "UrsaringFrontpic", + "id": "URSARING", + "name": "URSARING" + }, + "VAPOREON": { + "back": "vaporeon_back", + "backLabel": "VaporeonBackpic", + "dexLabel": "VaporeonPokedexEntry", + "front": "vaporeon", + "frontLabel": "VaporeonFrontpic", + "id": "VAPOREON", + "name": "VAPOREON" + }, + "VENOMOTH": { + "back": "venomoth_back", + "backLabel": "VenomothBackpic", + "dexLabel": "VenomothPokedexEntry", + "front": "venomoth", + "frontLabel": "VenomothFrontpic", + "id": "VENOMOTH", + "name": "VENOMOTH" + }, + "VENONAT": { + "back": "venonat_back", + "backLabel": "VenonatBackpic", + "dexLabel": "VenonatPokedexEntry", + "front": "venonat", + "frontLabel": "VenonatFrontpic", + "id": "VENONAT", + "name": "VENONAT" + }, + "VENUSAUR": { + "back": "venusaur_back", + "backLabel": "VenusaurBackpic", + "dexLabel": "VenusaurPokedexEntry", + "front": "venusaur", + "frontLabel": "VenusaurFrontpic", + "id": "VENUSAUR", + "name": "VENUSAUR" + }, + "VICTREEBEL": { + "back": "victreebel_back", + "backLabel": "VictreebelBackpic", + "dexLabel": "VictreebelPokedexEntry", + "front": "victreebel", + "frontLabel": "VictreebelFrontpic", + "id": "VICTREEBEL", + "name": "VICTREEBEL" + }, + "VILEPLUME": { + "back": "vileplume_back", + "backLabel": "VileplumeBackpic", + "dexLabel": "VileplumePokedexEntry", + "front": "vileplume", + "frontLabel": "VileplumeFrontpic", + "id": "VILEPLUME", + "name": "VILEPLUME" + }, + "VOLTORB": { + "back": "voltorb_back", + "backLabel": "VoltorbBackpic", + "dexLabel": "VoltorbPokedexEntry", + "front": "voltorb", + "frontLabel": "VoltorbFrontpic", + "id": "VOLTORB", + "name": "VOLTORB" + }, + "VULPIX": { + "back": "vulpix_back", + "backLabel": "VulpixBackpic", + "dexLabel": "VulpixPokedexEntry", + "front": "vulpix", + "frontLabel": "VulpixFrontpic", + "id": "VULPIX", + "name": "VULPIX" + }, + "WARTORTLE": { + "back": "wartortle_back", + "backLabel": "WartortleBackpic", + "dexLabel": "WartortlePokedexEntry", + "front": "wartortle", + "frontLabel": "WartortleFrontpic", + "id": "WARTORTLE", + "name": "WARTORTLE" + }, + "WEEDLE": { + "back": "weedle_back", + "backLabel": "WeedleBackpic", + "dexLabel": "WeedlePokedexEntry", + "front": "weedle", + "frontLabel": "WeedleFrontpic", + "id": "WEEDLE", + "name": "WEEDLE" + }, + "WEEPINBELL": { + "back": "weepinbell_back", + "backLabel": "WeepinbellBackpic", + "dexLabel": "WeepinbellPokedexEntry", + "front": "weepinbell", + "frontLabel": "WeepinbellFrontpic", + "id": "WEEPINBELL", + "name": "WEEPINBELL" + }, + "WEEZING": { + "back": "weezing_back", + "backLabel": "WeezingBackpic", + "dexLabel": "WeezingPokedexEntry", + "front": "weezing", + "frontLabel": "WeezingFrontpic", + "id": "WEEZING", + "name": "WEEZING" + }, + "WIGGLYTUFF": { + "back": "wigglytuff_back", + "backLabel": "WigglytuffBackpic", + "dexLabel": "WigglytuffPokedexEntry", + "front": "wigglytuff", + "frontLabel": "WigglytuffFrontpic", + "id": "WIGGLYTUFF", + "name": "WIGGLYTUFF" + }, + "WOBBUFFET": { + "back": "wobbuffet_back", + "backLabel": "WobbuffetBackpic", + "dexLabel": "WobbuffetPokedexEntry", + "front": "wobbuffet", + "frontLabel": "WobbuffetFrontpic", + "id": "WOBBUFFET", + "name": "WOBBUFFET" + }, + "WOOPER": { + "back": "wooper_back", + "backLabel": "WooperBackpic", + "dexLabel": "WooperPokedexEntry", + "front": "wooper", + "frontLabel": "WooperFrontpic", + "id": "WOOPER", + "name": "WOOPER" + }, + "XATU": { + "back": "xatu_back", + "backLabel": "XatuBackpic", + "dexLabel": "XatuPokedexEntry", + "front": "xatu", + "frontLabel": "XatuFrontpic", + "id": "XATU", + "name": "XATU" + }, + "YANMA": { + "back": "yanma_back", + "backLabel": "YanmaBackpic", + "dexLabel": "YanmaPokedexEntry", + "front": "yanma", + "frontLabel": "YanmaFrontpic", + "id": "YANMA", + "name": "YANMA" + }, + "ZAPDOS": { + "back": "zapdos_back", + "backLabel": "ZapdosBackpic", + "dexLabel": "ZapdosPokedexEntry", + "front": "zapdos", + "frontLabel": "ZapdosFrontpic", + "id": "ZAPDOS", + "name": "ZAPDOS" + }, + "ZUBAT": { + "back": "zubat_back", + "backLabel": "ZubatBackpic", + "dexLabel": "ZubatPokedexEntry", + "front": "zubat", + "frontLabel": "ZubatFrontpic", + "id": "ZUBAT", + "name": "ZUBAT" + } + }, + "romSha1": "49b163f7e57702bc939d642a18f591de55d92dae", + "symbols": { + "AbraBackpic": [ + 27, + 20442 + ], + "AbraFrontpic": [ + 27, + 29677 + ], + "AbraPokedexEntry": [ + 104, + 23224 + ], + "AerodactylBackpic": [ + 27, + 21780 + ], + "AerodactylFrontpic": [ + 31, + 24999 + ], + "AerodactylPokedexEntry": [ + 106, + 17845 + ], + "AerodactylPuzzleLZ": [ + 56, + 25096 + ], + "AipomBackpic": [ + 27, + 23447 + ], + "AipomFrontpic": [ + 28, + 22415 + ], + "AipomPokedexEntry": [ + 106, + 23157 + ], + "AlakazamBackpic": [ + 21, + 25753 + ], + "AlakazamFrontpic": [ + 18, + 24458 + ], + "AlakazamPokedexEntry": [ + 105, + 16384 + ], + "AlphabeticalPokedexOrder": [ + 16, + 19557 + ], + "AmpharosBackpic": [ + 29, + 27083 + ], + "AmpharosFrontpic": [ + 32, + 31107 + ], + "AmpharosPokedexEntry": [ + 106, + 22136 + ], + "AnimObjGFX": [ + 51, + 31803 + ], + "AnimateFlowerTile": [ + 63, + 17288 + ], + "AnimateFlowerTile.FlowerTileFrames": [ + 63, + 17319 + ], + "AnimateHallOfFame.String_NewHallOfFamer": [ + 33, + 25876 + ], + "AnimateLavaBubbleTile1": [ + 63, + 17383 + ], + "AnimateLavaBubbleTile2": [ + 63, + 17414 + ], + "AnimateTowerPillarTile": [ + 63, + 17504 + ], + "AnimateWaterPalette": [ + 63, + 17650 + ], + "AnimateWaterTile": [ + 63, + 17198 + ], + "AnimateWaterTile.WaterTileFrames": [ + 63, + 17224 + ], + "AnimateWhirlpoolTile": [ + 63, + 17555 + ], + "ArbokBackpic": [ + 29, + 27921 + ], + "ArbokFrontpic": [ + 18, + 30587 + ], + "ArbokPokedexEntry": [ + 104, + 18908 + ], + "ArcanineBackpic": [ + 24, + 21507 + ], + "ArcanineFrontpic": [ + 18, + 23185 + ], + "ArcaninePokedexEntry": [ + 104, + 22788 + ], + "AriadosBackpic": [ + 26, + 30528 + ], + "AriadosFrontpic": [ + 22, + 32003 + ], + "AriadosPokedexEntry": [ + 106, + 20690 + ], + "ArticunoBackpic": [ + 30, + 17968 + ], + "ArticunoFrontpic": [ + 18, + 21900 + ], + "ArticunoPokedexEntry": [ + 106, + 18071 + ], + "AzumarillBackpic": [ + 30, + 17179 + ], + "AzumarillFrontpic": [ + 21, + 16861 + ], + "AzumarillPokedexEntry": [ + 106, + 22471 + ], + "BadgeGFX": [ + 9, + 25135 + ], + "BargainShopData": [ + 5, + 24282 + ], + "BaseData": [ + 20, + 23307 + ], + "BattleAnimFrameData": [ + 51, + 26531 + ], + "BattleAnimOAMData": [ + 51, + 28147 + ], + "BattleAnimObjects": [ + 51, + 19109 + ], + "BattleAnimations": [ + 50, + 20490 + ], + "BattleObjectPals": [ + 2, + 23561 + ], + "BattleWinSlideInEnemyTrainerFrontpic": [ + 15, + 27158 + ], + "BayleefBackpic": [ + 23, + 26734 + ], + "BayleefFrontpic": [ + 21, + 29863 + ], + "BayleefPokedexEntry": [ + 106, + 19029 + ], + "BeedrillBackpic": [ + 24, + 19540 + ], + "BeedrillFrontpic": [ + 18, + 27573 + ], + "BeedrillPokedexEntry": [ + 104, + 17937 + ], + "BellossomBackpic": [ + 26, + 27056 + ], + "BellossomFrontpic": [ + 25, + 19031 + ], + "BellossomPokedexEntry": [ + 106, + 22252 + ], + "BellsproutBackpic": [ + 29, + 22535 + ], + "BellsproutFrontpic": [ + 28, + 27661 + ], + "BellsproutPokedexEntry": [ + 105, + 16840 + ], + "BlastoiseBackpic": [ + 25, + 31647 + ], + "BlastoiseFrontpic": [ + 31, + 17124 + ], + "BlastoisePokedexEntry": [ + 104, + 17262 + ], + "BlisseyBackpic": [ + 29, + 31762 + ], + "BlisseyFrontpic": [ + 32, + 27218 + ], + "BlisseyPokedexEntry": [ + 107, + 21782 + ], + "BoltEmote": [ + 5, + 17737 + ], + "BugCatchingContestantEventFlagTable": [ + 4, + 32186 + ], + "BulbasaurBackpic": [ + 29, + 21089 + ], + "BulbasaurFrontpic": [ + 30, + 18230 + ], + "BulbasaurPokedexEntry": [ + 104, + 16384 + ], + "ButterfreeBackpic": [ + 21, + 23446 + ], + "ButterfreeFrontpic": [ + 21, + 17338 + ], + "ButterfreePokedexEntry": [ + 104, + 17595 + ], + "CalPic": [ + 26, + 27406 + ], + "CardStatusGFX": [ + 9, + 22287 + ], + "CaterpieBackpic": [ + 29, + 24822 + ], + "CaterpieFrontpic": [ + 30, + 32071 + ], + "CaterpiePokedexEntry": [ + 104, + 17376 + ], + "CelebiBackpic": [ + 23, + 16804 + ], + "CelebiFrontpic": [ + 30, + 25230 + ], + "CelebiPokedexEntry": [ + 107, + 22796 + ], + "ChanseyBackpic": [ + 28, + 28271 + ], + "ChanseyFrontpic": [ + 24, + 16384 + ], + "ChanseyPokedexEntry": [ + 105, + 21731 + ], + "CharizardBackpic": [ + 26, + 17106 + ], + "CharizardFrontpic": [ + 31, + 20578 + ], + "CharizardPokedexEntry": [ + 104, + 16928 + ], + "CharmanderBackpic": [ + 28, + 30389 + ], + "CharmanderFrontpic": [ + 28, + 27966 + ], + "CharmanderPokedexEntry": [ + 104, + 16704 + ], + "CharmeleonBackpic": [ + 24, + 25026 + ], + "CharmeleonFrontpic": [ + 23, + 29167 + ], + "CharmeleonPokedexEntry": [ + 104, + 16815 + ], + "ChikoritaBackpic": [ + 28, + 26130 + ], + "ChikoritaFrontpic": [ + 29, + 27363 + ], + "ChikoritaPokedexEntry": [ + 106, + 18929 + ], + "ChinchouBackpic": [ + 28, + 26744 + ], + "ChinchouFrontpic": [ + 26, + 18186 + ], + "ChinchouPokedexEntry": [ + 106, + 20919 + ], + "ChrisBackpic": [ + 15, + 31179 + ], + "ChrisPicAndTrainerCardGFX": [ + 9, + 21631 + ], + "ChrisSpriteGFX": [ + 48, + 16384 + ], + "ClefableBackpic": [ + 22, + 26062 + ], + "ClefableFrontpic": [ + 24, + 23857 + ], + "ClefablePokedexEntry": [ + 104, + 20237 + ], + "ClefairyBackpic": [ + 26, + 25655 + ], + "ClefairyFrontpic": [ + 29, + 25390 + ], + "ClefairyPokedexEntry": [ + 104, + 20130 + ], + "CleffaBackpic": [ + 30, + 20306 + ], + "CleffaFrontpic": [ + 30, + 28496 + ], + "CleffaPokedexEntry": [ + 106, + 21255 + ], + "ClockTilemapRLE": [ + 36, + 21914 + ], + "CloysterBackpic": [ + 21, + 26671 + ], + "CloysterFrontpic": [ + 31, + 17706 + ], + "CloysterPokedexEntry": [ + 105, + 19288 + ], + "ContestMons": [ + 37, + 31672 + ], + "CopyBackpic": [ + 15, + 31090 + ], + "CopyrightGFX": [ + 57, + 16384 + ], + "CorsolaBackpic": [ + 29, + 21668 + ], + "CorsolaFrontpic": [ + 25, + 28355 + ], + "CorsolaPokedexEntry": [ + 107, + 19610 + ], + "CreditsBellossomGFX": [ + 33, + 27958 + ], + "CreditsBorderGFX": [ + 33, + 27814 + ], + "CreditsElekidGFX": [ + 33, + 29494 + ], + "CreditsPalettes": [ + 33, + 27676 + ], + "CreditsSentretGFX": [ + 33, + 30262 + ], + "CreditsTogepiGFX": [ + 33, + 28726 + ], + "Cries": [ + 58, + 20882 + ], + "CrobatBackpic": [ + 29, + 31225 + ], + "CrobatFrontpic": [ + 23, + 24276 + ], + "CrobatPokedexEntry": [ + 106, + 20809 + ], + "CroconawBackpic": [ + 23, + 27547 + ], + "CroconawFrontpic": [ + 21, + 29409 + ], + "CroconawPokedexEntry": [ + 106, + 19666 + ], + "CuboneBackpic": [ + 24, + 19146 + ], + "CuboneFrontpic": [ + 28, + 19577 + ], + "CubonePokedexEntry": [ + 105, + 20725 + ], + "CyndaquilBackpic": [ + 23, + 25508 + ], + "CyndaquilFrontpic": [ + 27, + 29354 + ], + "CyndaquilPokedexEntry": [ + 106, + 19241 + ], + "DecorationDesc_GiantOrnament.BigDollScript": [ + 9, + 29110 + ], + "DecorationDesc_NullPoster": [ + 9, + 29067 + ], + "DecorationDesc_OrnamentOrConsole.OrnamentConsoleScript": [ + 9, + 29096 + ], + "DecorationDesc_PosterPointers": [ + 9, + 29015 + ], + "DelibirdBackpic": [ + 26, + 28452 + ], + "DelibirdFrontpic": [ + 24, + 27351 + ], + "DelibirdPokedexEntry": [ + 107, + 19939 + ], + "DewgongBackpic": [ + 30, + 25706 + ], + "DewgongFrontpic": [ + 32, + 17100 + ], + "DewgongPokedexEntry": [ + 105, + 18852 + ], + "DiglettBackpic": [ + 21, + 32573 + ], + "DiglettFrontpic": [ + 30, + 31289 + ], + "DiglettPokedexEntry": [ + 104, + 21789 + ], + "DiplomaGFX": [ + 56, + 16645 + ], + "DiplomaPage1Tilemap": [ + 56, + 17739 + ], + "DiplomaPalettes": [ + 2, + 31366 + ], + "DittoBackpic": [ + 30, + 20050 + ], + "DittoFrontpic": [ + 30, + 30037 + ], + "DittoPokedexEntry": [ + 106, + 16736 + ], + "DodrioBackpic": [ + 21, + 28499 + ], + "DodrioFrontpic": [ + 31, + 22818 + ], + "DodrioPokedexEntry": [ + 105, + 18620 + ], + "DoduoBackpic": [ + 23, + 28359 + ], + "DoduoFrontpic": [ + 29, + 26802 + ], + "DoduoPokedexEntry": [ + 105, + 18509 + ], + "DoneTileAnimation": [ + 63, + 17058 + ], + "DonphanBackpic": [ + 30, + 26647 + ], + "DonphanFrontpic": [ + 31, + 30287 + ], + "DonphanPokedexEntry": [ + 107, + 20701 + ], + "DragonairBackpic": [ + 28, + 25209 + ], + "DragonairFrontpic": [ + 31, + 32369 + ], + "DragonairPokedexEntry": [ + 106, + 18488 + ], + "DragoniteBackpic": [ + 29, + 27642 + ], + "DragoniteFrontpic": [ + 18, + 29387 + ], + "DragonitePokedexEntry": [ + 106, + 18586 + ], + "DratiniBackpic": [ + 30, + 21558 + ], + "DratiniFrontpic": [ + 29, + 30410 + ], + "DratiniPokedexEntry": [ + 106, + 18384 + ], + "DrawPocketName.tilemap": [ + 4, + 19964 + ], + "DrowzeeBackpic": [ + 30, + 20558 + ], + "DrowzeeFrontpic": [ + 23, + 16384 + ], + "DrowzeePokedexEntry": [ + 105, + 19839 + ], + "Drumkits": [ + 58, + 20050 + ], + "DudeBackpic": [ + 15, + 31579 + ], + "DugtrioBackpic": [ + 27, + 21446 + ], + "DugtrioFrontpic": [ + 23, + 27953 + ], + "DugtrioPokedexEntry": [ + 104, + 21899 + ], + "DunsparceBackpic": [ + 29, + 22823 + ], + "DunsparceFrontpic": [ + 27, + 23114 + ], + "DunsparcePokedexEntry": [ + 107, + 17828 + ], + "EeveeBackpic": [ + 24, + 31957 + ], + "EeveeFrontpic": [ + 28, + 19894 + ], + "EeveePokedexEntry": [ + 106, + 16849 + ], + "EggHatchGFX": [ + 5, + 30487 + ], + "EggMovePointers": [ + 8, + 31230 + ], + "EggPic": [ + 20, + 31363 + ], + "EkansBackpic": [ + 26, + 21764 + ], + "EkansFrontpic": [ + 29, + 20218 + ], + "EkansPokedexEntry": [ + 104, + 18799 + ], + "ElectabuzzBackpic": [ + 24, + 27738 + ], + "ElectabuzzFrontpic": [ + 32, + 26729 + ], + "ElectabuzzPokedexEntry": [ + 105, + 23053 + ], + "ElectrodeBackpic": [ + 30, + 22800 + ], + "ElectrodeFrontpic": [ + 30, + 25468 + ], + "ElectrodePokedexEntry": [ + 105, + 20407 + ], + "ElekidBackpic": [ + 22, + 31161 + ], + "ElekidFrontpic": [ + 23, + 30375 + ], + "ElekidPokedexEntry": [ + 107, + 21466 + ], + "ElevatorFloorNames": [ + 4, + 31045 + ], + "EnemyHPBarBorderGFX": [ + 62, + 19378 + ], + "EnteiBackpic": [ + 29, + 28478 + ], + "EnteiFrontpic": [ + 18, + 28786 + ], + "EnteiPokedexEntry": [ + 107, + 22002 + ], + "EnvironmentColorsPointers": [ + 2, + 30414 + ], + "EspeonBackpic": [ + 27, + 22448 + ], + "EspeonFrontpic": [ + 23, + 18899 + ], + "EspeonPokedexEntry": [ + 107, + 16720 + ], + "EvosAttacksPointers": [ + 16, + 26557 + ], + "ExeggcuteBackpic": [ + 26, + 19264 + ], + "ExeggcuteFrontpic": [ + 32, + 24250 + ], + "ExeggcutePokedexEntry": [ + 105, + 20523 + ], + "ExeggutorBackpic": [ + 21, + 19243 + ], + "ExeggutorFrontpic": [ + 32, + 19163 + ], + "ExeggutorPokedexEntry": [ + 105, + 20615 + ], + "ExpBarGFX": [ + 62, + 19458 + ], + "ExpBarPalette": [ + 2, + 27961 + ], + "FarfetchDBackpic": [ + 23, + 24687 + ], + "FarfetchDFrontpic": [ + 22, + 31582 + ], + "FarfetchDPokedexEntry": [ + 105, + 18395 + ], + "FearowBackpic": [ + 30, + 21309 + ], + "FearowFrontpic": [ + 31, + 27132 + ], + "FearowPokedexEntry": [ + 104, + 18694 + ], + "FeraligatrBackpic": [ + 22, + 26490 + ], + "FeraligatrFrontpic": [ + 18, + 23824 + ], + "FeraligatrPokedexEntry": [ + 106, + 19777 + ], + "FishEmote": [ + 5, + 17865 + ], + "FishGroups": [ + 36, + 27127 + ], + "FlaaffyBackpic": [ + 25, + 24656 + ], + "FlaaffyFrontpic": [ + 24, + 20721 + ], + "FlaaffyPokedexEntry": [ + 106, + 22031 + ], + "FlareonBackpic": [ + 24, + 20328 + ], + "FlareonFrontpic": [ + 32, + 32072 + ], + "FlareonPokedexEntry": [ + 106, + 17185 + ], + "FlickeringCaveEntrancePalette": [ + 63, + 17709 + ], + "Font": [ + 62, + 17138 + ], + "FontBattleExtra": [ + 62, + 18162 + ], + "FontExtra": [ + 62, + 16626 + ], + "FontsExtra_SolidBlackAndUpArrowGFX": [ + 62, + 21246 + ], + "Footprints": [ + 62, + 21262 + ], + "ForretressBackpic": [ + 46, + 17057 + ], + "ForretressFrontpic": [ + 21, + 22520 + ], + "ForretressPokedexEntry": [ + 107, + 17709 + ], + "Frames": [ + 62, + 18674 + ], + "FurretBackpic": [ + 26, + 19622 + ], + "FurretFrontpic": [ + 26, + 22476 + ], + "FurretPokedexEntry": [ + 106, + 20010 + ], + "GameFreakLogoGFX": [ + 57, + 18889 + ], + "GameFreakLogoStarsGFX": [ + 57, + 19113 + ], + "GastlyBackpic": [ + 30, + 21059 + ], + "GastlyFrontpic": [ + 22, + 23036 + ], + "GastlyPokedexEntry": [ + 105, + 19395 + ], + "GengarBackpic": [ + 27, + 25104 + ], + "GengarFrontpic": [ + 25, + 29457 + ], + "GengarPokedexEntry": [ + 105, + 19610 + ], + "GeodudeBackpic": [ + 25, + 29090 + ], + "GeodudeFrontpic": [ + 30, + 28944 + ], + "GeodudePokedexEntry": [ + 105, + 17409 + ], + "GetBattleMonBackpic": [ + 15, + 29251 + ], + "GetEggFrontpic": [ + 5, + 30156 + ], + "GetEnemyMonFrontpic": [ + 15, + 29314 + ], + "GetFrontpic": [ + 20, + 22420 + ], + "GetMonBackpic": [ + 20, + 22531 + ], + "GetMonFrontpic": [ + 20, + 22400 + ], + "GetTrainerBackpic": [ + 15, + 31064 + ], + "GirafarigBackpic": [ + 25, + 18275 + ], + "GirafarigFrontpic": [ + 21, + 16384 + ], + "GirafarigPokedexEntry": [ + 107, + 17489 + ], + "GligarBackpic": [ + 24, + 24637 + ], + "GligarFrontpic": [ + 22, + 21722 + ], + "GligarPokedexEntry": [ + 107, + 17940 + ], + "GloomBackpic": [ + 24, + 19934 + ], + "GloomFrontpic": [ + 26, + 23541 + ], + "GloomPokedexEntry": [ + 104, + 21131 + ], + "GolbatBackpic": [ + 30, + 32248 + ], + "GolbatFrontpic": [ + 21, + 27129 + ], + "GolbatPokedexEntry": [ + 104, + 20912 + ], + "GoldeenBackpic": [ + 24, + 21114 + ], + "GoldeenFrontpic": [ + 23, + 20149 + ], + "GoldeenPokedexEntry": [ + 105, + 22269 + ], + "GolduckBackpic": [ + 26, + 32242 + ], + "GolduckFrontpic": [ + 31, + 28713 + ], + "GolduckPokedexEntry": [ + 104, + 22327 + ], + "GolemBackpic": [ + 30, + 29604 + ], + "GolemFrontpic": [ + 21, + 18292 + ], + "GolemPokedexEntry": [ + 105, + 17623 + ], + "GranbullBackpic": [ + 28, + 23351 + ], + "GranbullFrontpic": [ + 22, + 26917 + ], + "GranbullPokedexEntry": [ + 107, + 18286 + ], + "GrassRustleGFX": [ + 5, + 18009 + ], + "GravelerBackpic": [ + 27, + 22781 + ], + "GravelerFrontpic": [ + 21, + 27586 + ], + "GravelerPokedexEntry": [ + 105, + 17514 + ], + "GrimerBackpic": [ + 24, + 26964 + ], + "GrimerFrontpic": [ + 27, + 17064 + ], + "GrimerPokedexEntry": [ + 105, + 18962 + ], + "GrowlitheBackpic": [ + 25, + 21661 + ], + "GrowlitheFrontpic": [ + 28, + 20211 + ], + "GrowlithePokedexEntry": [ + 104, + 22681 + ], + "GrowthRates": [ + 20, + 22019 + ], + "GyaradosBackpic": [ + 22, + 23472 + ], + "GyaradosFrontpic": [ + 18, + 25713 + ], + "GyaradosPokedexEntry": [ + 106, + 16503 + ], + "HOF_SlideBackpic": [ + 33, + 26135 + ], + "HOF_SlideFrontpic": [ + 33, + 26149 + ], + "HPBarPals": [ + 2, + 27949 + ], + "HPExpBarBorderGFX": [ + 62, + 19410 + ], + "HappyEmote": [ + 5, + 17545 + ], + "HaunterBackpic": [ + 28, + 17025 + ], + "HaunterFrontpic": [ + 24, + 25414 + ], + "HaunterPokedexEntry": [ + 105, + 19495 + ], + "HealMachineAnim.HealMachineGFX": [ + 4, + 26581 + ], + "HealMachineAnim.palettes": [ + 4, + 26664 + ], + "HeartEmote": [ + 5, + 17673 + ], + "HeldItemIcons": [ + 35, + 26817 + ], + "HeracrossBackpic": [ + 24, + 28509 + ], + "HeracrossFrontpic": [ + 24, + 21900 + ], + "HeracrossPokedexEntry": [ + 107, + 18739 + ], + "HitmonchanBackpic": [ + 25, + 30555 + ], + "HitmonchanFrontpic": [ + 28, + 31290 + ], + "HitmonchanPokedexEntry": [ + 105, + 21066 + ], + "HitmonleeBackpic": [ + 29, + 28200 + ], + "HitmonleeFrontpic": [ + 32, + 28196 + ], + "HitmonleePokedexEntry": [ + 105, + 20957 + ], + "HitmontopBackpic": [ + 21, + 26213 + ], + "HitmontopFrontpic": [ + 32, + 26240 + ], + "HitmontopPokedexEntry": [ + 107, + 21252 + ], + "HoOhBackpic": [ + 27, + 19098 + ], + "HoOhFrontpic": [ + 18, + 18592 + ], + "HoOhPokedexEntry": [ + 107, + 22682 + ], + "HoOhPuzzleLZ": [ + 56, + 24760 + ], + "HoothootBackpic": [ + 27, + 28706 + ], + "HoothootFrontpic": [ + 28, + 25823 + ], + "HoothootPokedexEntry": [ + 106, + 20127 + ], + "HoppipBackpic": [ + 28, + 22727 + ], + "HoppipFrontpic": [ + 29, + 29860 + ], + "HoppipPokedexEntry": [ + 106, + 22817 + ], + "HorseaBackpic": [ + 30, + 18753 + ], + "HorseaFrontpic": [ + 30, + 30670 + ], + "HorseaPokedexEntry": [ + 105, + 22054 + ], + "HoundoomBackpic": [ + 25, + 28723 + ], + "HoundoomFrontpic": [ + 32, + 16582 + ], + "HoundoomPokedexEntry": [ + 107, + 20372 + ], + "HoundourBackpic": [ + 30, + 22553 + ], + "HoundourFrontpic": [ + 27, + 24774 + ], + "HoundourPokedexEntry": [ + 107, + 20272 + ], + "HypnoBackpic": [ + 23, + 30776 + ], + "HypnoFrontpic": [ + 32, + 21212 + ], + "HypnoPokedexEntry": [ + 105, + 19958 + ], + "IconPointers": [ + 35, + 27222 + ], + "Icons": [ + 35, + 27300 + ], + "IgglybuffBackpic": [ + 30, + 16914 + ], + "IgglybuffFrontpic": [ + 30, + 16384 + ], + "IgglybuffPokedexEntry": [ + 106, + 21359 + ], + "InitializeEventsScript": [ + 64, + 17256 + ], + "Intro_FireGFX1": [ + 57, + 26448 + ], + "Intro_FireGFX2": [ + 57, + 27792 + ], + "Intro_FireGFX3": [ + 57, + 28688 + ], + "Intro_GetMonFrontpic": [ + 20, + 22655 + ], + "Intro_GrassGFX1": [ + 57, + 24224 + ], + "Intro_GrassGFX2": [ + 57, + 25072 + ], + "Intro_GrassMeta": [ + 57, + 24960 + ], + "Intro_GrassTilemap": [ + 57, + 24704 + ], + "Intro_LoadMagikarpPalettes.MagikarpBGPal": [ + 2, + 20774 + ], + "Intro_LoadMagikarpPalettes.MagikarpOBPal": [ + 2, + 20782 + ], + "Intro_RotatePalettesLeftFrontpic": [ + 1, + 25006 + ], + "Intro_WaterGFX1": [ + 57, + 21296 + ], + "Intro_WaterGFX2": [ + 57, + 23328 + ], + "Intro_WaterMeta": [ + 57, + 23056 + ], + "Intro_WaterTilemap": [ + 57, + 22544 + ], + "Intro_WipeInFrontpic": [ + 1, + 25030 + ], + "ItemAttributes": [ + 1, + 26726 + ], + "ItemDescriptions": [ + 110, + 16384 + ], + "ItemNames": [ + 108, + 16384 + ], + "IvysaurBackpic": [ + 26, + 30873 + ], + "IvysaurFrontpic": [ + 27, + 17743 + ], + "IvysaurPokedexEntry": [ + 104, + 16488 + ], + "JigglypuffBackpic": [ + 30, + 23046 + ], + "JigglypuffFrontpic": [ + 30, + 21807 + ], + "JigglypuffPokedexEntry": [ + 104, + 20574 + ], + "JohtoGrassWildMons": [ + 10, + 27445 + ], + "JohtoMap": [ + 36, + 24402 + ], + "JohtoWaterWildMons": [ + 10, + 30313 + ], + "JolteonBackpic": [ + 28, + 21159 + ], + "JolteonFrontpic": [ + 22, + 27344 + ], + "JolteonPokedexEntry": [ + 106, + 17077 + ], + "JumpluffBackpic": [ + 25, + 23910 + ], + "JumpluffFrontpic": [ + 21, + 22056 + ], + "JumpluffPokedexEntry": [ + 106, + 23039 + ], + "JynxBackpic": [ + 26, + 32583 + ], + "JynxFrontpic": [ + 22, + 18178 + ], + "JynxPokedexEntry": [ + 105, + 22939 + ], + "KabutoBackpic": [ + 27, + 30323 + ], + "KabutoFrontpic": [ + 30, + 26413 + ], + "KabutoPokedexEntry": [ + 106, + 17629 + ], + "KabutoPuzzleLZ": [ + 56, + 25528 + ], + "KabutopsBackpic": [ + 24, + 18752 + ], + "KabutopsFrontpic": [ + 21, + 21123 + ], + "KabutopsPokedexEntry": [ + 106, + 17739 + ], + "KadabraBackpic": [ + 26, + 18905 + ], + "KadabraFrontpic": [ + 21, + 25293 + ], + "KadabraPokedexEntry": [ + 104, + 23330 + ], + "KakunaBackpic": [ + 29, + 30135 + ], + "KakunaFrontpic": [ + 30, + 29386 + ], + "KakunaPokedexEntry": [ + 104, + 17824 + ], + "KangaskhanBackpic": [ + 22, + 19518 + ], + "KangaskhanFrontpic": [ + 18, + 29988 + ], + "KangaskhanPokedexEntry": [ + 105, + 21949 + ], + "KantoGrassWildMons": [ + 10, + 30656 + ], + "KantoMap": [ + 36, + 24763 + ], + "KantoWaterWildMons": [ + 10, + 32067 + ], + "KingdraBackpic": [ + 26, + 24600 + ], + "KingdraFrontpic": [ + 21, + 28954 + ], + "KingdraPokedexEntry": [ + 107, + 20477 + ], + "KinglerBackpic": [ + 27, + 24112 + ], + "KinglerFrontpic": [ + 32, + 24752 + ], + "KinglerPokedexEntry": [ + 105, + 20191 + ], + "KoffingBackpic": [ + 25, + 17519 + ], + "KoffingFrontpic": [ + 21, + 18768 + ], + "KoffingPokedexEntry": [ + 105, + 21288 + ], + "KrabbyBackpic": [ + 23, + 18062 + ], + "KrabbyFrontpic": [ + 28, + 30087 + ], + "KrabbyPokedexEntry": [ + 105, + 20072 + ], + "Landmarks": [ + 36, + 25474 + ], + "LanturnBackpic": [ + 29, + 26240 + ], + "LanturnFrontpic": [ + 24, + 25802 + ], + "LanturnPokedexEntry": [ + 106, + 21026 + ], + "LaprasBackpic": [ + 28, + 24593 + ], + "LaprasFrontpic": [ + 21, + 23909 + ], + "LaprasPokedexEntry": [ + 106, + 16621 + ], + "LarvitarBackpic": [ + 29, + 16384 + ], + "LarvitarFrontpic": [ + 29, + 20799 + ], + "LarvitarPokedexEntry": [ + 107, + 22224 + ], + "LavaBubbleTileFrames": [ + 63, + 17440 + ], + "LeaderGFX": [ + 9, + 22383 + ], + "LedianBackpic": [ + 24, + 28894 + ], + "LedianFrontpic": [ + 24, + 28124 + ], + "LedianPokedexEntry": [ + 106, + 20459 + ], + "LedybaBackpic": [ + 23, + 23454 + ], + "LedybaFrontpic": [ + 27, + 27730 + ], + "LedybaPokedexEntry": [ + 106, + 20341 + ], + "LickitungBackpic": [ + 27, + 32257 + ], + "LickitungFrontpic": [ + 32, + 28683 + ], + "LickitungPokedexEntry": [ + 105, + 21184 + ], + "LoadOrientedFrontpic": [ + 20, + 22948 + ], + "LoadQuestionMarkPic.QuestionMarkLZ": [ + 112, + 19520 + ], + "LugiaBackpic": [ + 28, + 29483 + ], + "LugiaFrontpic": [ + 31, + 24462 + ], + "LugiaPokedexEntry": [ + 107, + 22571 + ], + "MachampBackpic": [ + 32, + 31590 + ], + "MachampFrontpic": [ + 18, + 17890 + ], + "MachampPokedexEntry": [ + 105, + 16724 + ], + "MachokeBackpic": [ + 25, + 22786 + ], + "MachokeFrontpic": [ + 31, + 18288 + ], + "MachokePokedexEntry": [ + 105, + 16603 + ], + "MachopBackpic": [ + 27, + 20777 + ], + "MachopFrontpic": [ + 28, + 21788 + ], + "MachopPokedexEntry": [ + 105, + 16484 + ], + "MagbyBackpic": [ + 28, + 24901 + ], + "MagbyFrontpic": [ + 27, + 18760 + ], + "MagbyPokedexEntry": [ + 107, + 21566 + ], + "MagcargoBackpic": [ + 24, + 26190 + ], + "MagcargoFrontpic": [ + 21, + 20185 + ], + "MagcargoPokedexEntry": [ + 107, + 19300 + ], + "MagikarpBackpic": [ + 26, + 30183 + ], + "MagikarpFrontpic": [ + 22, + 28196 + ], + "MagikarpPokedexEntry": [ + 106, + 16384 + ], + "MagmarBackpic": [ + 23, + 25098 + ], + "MagmarFrontpic": [ + 32, + 25747 + ], + "MagmarPokedexEntry": [ + 105, + 23168 + ], + "MagnemiteBackpic": [ + 46, + 16727 + ], + "MagnemiteFrontpic": [ + 46, + 18434 + ], + "MagnemitePokedexEntry": [ + 105, + 18181 + ], + "MagnetTrainBGTiles": [ + 35, + 20492 + ], + "MagnetTrainTilemap": [ + 35, + 20772 + ], + "MagnetonBackpic": [ + 22, + 29046 + ], + "MagnetonFrontpic": [ + 21, + 24833 + ], + "MagnetonPokedexEntry": [ + 105, + 18286 + ], + "MankeyBackpic": [ + 23, + 29571 + ], + "MankeyFrontpic": [ + 27, + 27403 + ], + "MankeyPokedexEntry": [ + 104, + 22437 + ], + "MantineBackpic": [ + 30, + 29821 + ], + "MantineFrontpic": [ + 32, + 23241 + ], + "MantinePokedexEntry": [ + 107, + 20048 + ], + "MapGroupPointers": [ + 37, + 16621 + ], + "MapGroupRoofs": [ + 7, + 16417 + ], + "MapObjectPals": [ + 2, + 30894 + ], + "MareepBackpic": [ + 26, + 23894 + ], + "MareepFrontpic": [ + 28, + 28878 + ], + "MareepPokedexEntry": [ + 106, + 21922 + ], + "MarillBackpic": [ + 30, + 22056 + ], + "MarillFrontpic": [ + 29, + 23111 + ], + "MarillPokedexEntry": [ + 106, + 22364 + ], + "MarowakBackpic": [ + 25, + 27619 + ], + "MarowakFrontpic": [ + 25, + 16384 + ], + "MarowakPokedexEntry": [ + 105, + 20838 + ], + "Marts": [ + 5, + 25342 + ], + "MeganiumBackpic": [ + 27, + 31291 + ], + "MeganiumFrontpic": [ + 18, + 31756 + ], + "MeganiumPokedexEntry": [ + 106, + 19136 + ], + "MeowthBackpic": [ + 27, + 31935 + ], + "MeowthFrontpic": [ + 27, + 26748 + ], + "MeowthPokedexEntry": [ + 104, + 22004 + ], + "MetapodBackpic": [ + 30, + 23291 + ], + "MetapodFrontpic": [ + 30, + 31692 + ], + "MetapodPokedexEntry": [ + 104, + 17485 + ], + "MewBackpic": [ + 27, + 20107 + ], + "MewFrontpic": [ + 28, + 27050 + ], + "MewPokedexEntry": [ + 106, + 18815 + ], + "MewtwoBackpic": [ + 26, + 26356 + ], + "MewtwoFrontpic": [ + 31, + 23917 + ], + "MewtwoPokedexEntry": [ + 106, + 18700 + ], + "MiltankBackpic": [ + 25, + 21286 + ], + "MiltankFrontpic": [ + 23, + 19316 + ], + "MiltankPokedexEntry": [ + 107, + 21678 + ], + "MisdreavusBackpic": [ + 25, + 32010 + ], + "MisdreavusFrontpic": [ + 25, + 30920 + ], + "MisdreavusPokedexEntry": [ + 107, + 17160 + ], + "MoltresBackpic": [ + 23, + 19733 + ], + "MoltresFrontpic": [ + 18, + 21253 + ], + "MoltresPokedexEntry": [ + 106, + 18288 + ], + "MonMenuIcons": [ + 35, + 26971 + ], + "MoveDescriptions": [ + 109, + 16384 + ], + "MoveNames": [ + 108, + 21876 + ], + "Moves": [ + 16, + 23294 + ], + "MrMimeBackpic": [ + 29, + 23683 + ], + "MrMimeFrontpic": [ + 24, + 18358 + ], + "MrMimePokedexEntry": [ + 105, + 22727 + ], + "MukBackpic": [ + 26, + 28799 + ], + "MukFrontpic": [ + 31, + 25535 + ], + "MukPokedexEntry": [ + 105, + 19068 + ], + "MurkrowBackpic": [ + 22, + 32424 + ], + "MurkrowFrontpic": [ + 22, + 17731 + ], + "MurkrowPokedexEntry": [ + 107, + 16938 + ], + "Music": [ + 58, + 20590 + ], + "Music_AfterTheRivalFight": [ + 61, + 20775 + ], + "Music_AzaleaTown": [ + 61, + 22504 + ], + "Music_Bicycle": [ + 59, + 24857 + ], + "Music_BugCatchingContest": [ + 61, + 31766 + ], + "Music_BurnedTower": [ + 61, + 27289 + ], + "Music_CeladonCity": [ + 61, + 17243 + ], + "Music_ChampionBattle": [ + 58, + 26986 + ], + "Music_CherrygroveCity": [ + 61, + 23299 + ], + "Music_ContestResults": [ + 59, + 31550 + ], + "Music_Credits": [ + 7, + 30796 + ], + "Music_DancingHall": [ + 59, + 31164 + ], + "Music_DarkCave": [ + 58, + 25191 + ], + "Music_DragonsDen": [ + 59, + 27880 + ], + "Music_EcruteakCity": [ + 59, + 29392 + ], + "Music_ElmsLab": [ + 58, + 24553 + ], + "Music_Evolution": [ + 60, + 18145 + ], + "Music_GameCorner": [ + 59, + 23917 + ], + "Music_GoldSilverOpening": [ + 61, + 28757 + ], + "Music_GoldSilverOpening2": [ + 61, + 29448 + ], + "Music_GoldenrodCity": [ + 58, + 29692 + ], + "Music_Gym": [ + 61, + 18606 + ], + "Music_GymLeaderVictory": [ + 61, + 17964 + ], + "Music_HallOfFame": [ + 60, + 17855 + ], + "Music_HealPokemon": [ + 60, + 18071 + ], + "Music_IndigoPlateau": [ + 59, + 26706 + ], + "Music_JohtoGymBattle": [ + 58, + 25782 + ], + "Music_JohtoTrainerBattle": [ + 61, + 24726 + ], + "Music_JohtoWildBattle": [ + 61, + 24005 + ], + "Music_JohtoWildBattleNight": [ + 61, + 24668 + ], + "Music_KantoGymBattle": [ + 59, + 18208 + ], + "Music_KantoTrainerBattle": [ + 59, + 18938 + ], + "Music_KantoWildBattle": [ + 59, + 20589 + ], + "Music_LakeOfRage": [ + 59, + 26309 + ], + "Music_LakeOfRageRocketRadio": [ + 59, + 30129 + ], + "Music_LavenderTown": [ + 59, + 30511 + ], + "Music_Lighthouse": [ + 59, + 25961 + ], + "Music_LookBeauty": [ + 59, + 28222 + ], + "Music_LookHiker": [ + 61, + 29713 + ], + "Music_LookKimonoGirl": [ + 61, + 31160 + ], + "Music_LookLass": [ + 59, + 22427 + ], + "Music_LookOfficer": [ + 59, + 22573 + ], + "Music_LookPokemaniac": [ + 58, + 32213 + ], + "Music_LookRival": [ + 61, + 20345 + ], + "Music_LookRocket": [ + 61, + 29858 + ], + "Music_LookSage": [ + 59, + 25438 + ], + "Music_LookYoungster": [ + 61, + 26307 + ], + "Music_MagnetTrain": [ + 59, + 30192 + ], + "Music_MainMenu": [ + 61, + 30973 + ], + "Music_Mom": [ + 61, + 27634 + ], + "Music_MtMoon": [ + 59, + 23337 + ], + "Music_MtMoonSquare": [ + 61, + 18453 + ], + "Music_NationalPark": [ + 61, + 21736 + ], + "Music_NewBarkTown": [ + 58, + 29308 + ], + "Music_Nothing": [ + 58, + 20869 + ], + "Music_PalletTown": [ + 61, + 19212 + ], + "Music_PokeFluteChannel": [ + 61, + 31507 + ], + "Music_PokemonCenter": [ + 59, + 21958 + ], + "Music_PokemonChannel": [ + 59, + 25695 + ], + "Music_PokemonLullaby": [ + 61, + 28025 + ], + "Music_PokemonMarch": [ + 61, + 28195 + ], + "Music_PostCredits": [ + 51, + 31971 + ], + "Music_Printer": [ + 60, + 18429 + ], + "Music_ProfOak": [ + 61, + 19946 + ], + "Music_ProfOaksPokemonTalk": [ + 61, + 19615 + ], + "Music_RivalBattle": [ + 58, + 22264 + ], + "Music_RocketBattle": [ + 58, + 23320 + ], + "Music_RocketHideout": [ + 59, + 27509 + ], + "Music_RocketTheme": [ + 61, + 30317 + ], + "Music_Route1": [ + 59, + 16384 + ], + "Music_Route12": [ + 59, + 17670 + ], + "Music_Route2": [ + 59, + 22749 + ], + "Music_Route26": [ + 59, + 28594 + ], + "Music_Route29": [ + 60, + 17286 + ], + "Music_Route3": [ + 59, + 17098 + ], + "Music_Route30": [ + 59, + 31745 + ], + "Music_Route36": [ + 58, + 21650 + ], + "Music_Route37": [ + 59, + 26955 + ], + "Music_RuinsOfAlphInterior": [ + 58, + 32146 + ], + "Music_RuinsOfAlphRadio": [ + 59, + 28107 + ], + "Music_SSAqua": [ + 58, + 27970 + ], + "Music_ShowMeAround": [ + 59, + 23512 + ], + "Music_SproutTower": [ + 61, + 26996 + ], + "Music_SuccessfulCapture": [ + 61, + 17922 + ], + "Music_Surf": [ + 61, + 20874 + ], + "Music_TinTower": [ + 61, + 26641 + ], + "Music_TitleScreen": [ + 58, + 30641 + ], + "Music_TrainerVictory": [ + 58, + 32415 + ], + "Music_UnionCave": [ + 61, + 23648 + ], + "Music_VermilionCity": [ + 58, + 30239 + ], + "Music_VictoryRoad": [ + 61, + 27762 + ], + "Music_VioletCity": [ + 60, + 16384 + ], + "Music_ViridianCity": [ + 61, + 16384 + ], + "Music_WildPokemonVictory": [ + 61, + 17688 + ], + "NPCTradeCableText": [ + 63, + 19744 + ], + "NPCTrades": [ + 63, + 19492 + ], + "NamingScreenGFX_Border": [ + 4, + 24708 + ], + "NamingScreenGFX_Cursor": [ + 4, + 24724 + ], + "NamingScreenGFX_MiddleLine": [ + 4, + 25138 + ], + "NamingScreenGFX_UnderLine": [ + 4, + 25146 + ], + "NatuBackpic": [ + 30, + 31491 + ], + "NatuFrontpic": [ + 30, + 31086 + ], + "NatuPokedexEntry": [ + 106, + 21692 + ], + "NewPokedexEntry": [ + 62, + 31105 + ], + "NewPokedexOrder": [ + 16, + 19808 + ], + "NidokingBackpic": [ + 32, + 29169 + ], + "NidokingFrontpic": [ + 18, + 19949 + ], + "NidokingPokedexEntry": [ + 104, + 20022 + ], + "NidoqueenBackpic": [ + 24, + 26577 + ], + "NidoqueenFrontpic": [ + 31, + 18862 + ], + "NidoqueenPokedexEntry": [ + 104, + 19683 + ], + "NidoranFBackpic": [ + 27, + 22114 + ], + "NidoranFFrontpic": [ + 29, + 25674 + ], + "NidoranFPokedexEntry": [ + 104, + 19457 + ], + "NidoranMBackpic": [ + 23, + 23865 + ], + "NidoranMFrontpic": [ + 28, + 28575 + ], + "NidoranMPokedexEntry": [ + 104, + 19795 + ], + "NidorinaBackpic": [ + 25, + 23161 + ], + "NidorinaFrontpic": [ + 22, + 20843 + ], + "NidorinaPokedexEntry": [ + 104, + 19579 + ], + "NidorinoBackpic": [ + 25, + 25400 + ], + "NidorinoFrontpic": [ + 23, + 27141 + ], + "NidorinoPokedexEntry": [ + 104, + 19906 + ], + "NinetalesBackpic": [ + 23, + 26327 + ], + "NinetalesFrontpic": [ + 18, + 19289 + ], + "NinetalesPokedexEntry": [ + 104, + 20465 + ], + "NoctowlBackpic": [ + 27, + 30646 + ], + "NoctowlFrontpic": [ + 21, + 28043 + ], + "NoctowlPokedexEntry": [ + 106, + 20240 + ], + "OctilleryBackpic": [ + 30, + 17443 + ], + "OctilleryFrontpic": [ + 24, + 30812 + ], + "OctilleryPokedexEntry": [ + 107, + 19826 + ], + "OddishBackpic": [ + 30, + 23780 + ], + "OddishFrontpic": [ + 29, + 32564 + ], + "OddishPokedexEntry": [ + 104, + 21025 + ], + "OmanyteBackpic": [ + 24, + 22293 + ], + "OmanyteFrontpic": [ + 29, + 19633 + ], + "OmanytePokedexEntry": [ + 106, + 17404 + ], + "OmanytePuzzleLZ": [ + 56, + 25768 + ], + "OmastarBackpic": [ + 22, + 25633 + ], + "OmastarFrontpic": [ + 22, + 18625 + ], + "OmastarPokedexEntry": [ + 106, + 17518 + ], + "OnixBackpic": [ + 25, + 16763 + ], + "OnixFrontpic": [ + 32, + 19676 + ], + "OnixPokedexEntry": [ + 105, + 19724 + ], + "OverworldSprites": [ + 5, + 18398 + ], + "PackGFX": [ + 4, + 21553 + ], + "PackMenuGFX": [ + 4, + 20273 + ], + "PadFrontpic": [ + 20, + 22854 + ], + "PalPacket_Pack": [ + 2, + 24741 + ], + "ParasBackpic": [ + 29, + 17277 + ], + "ParasFrontpic": [ + 28, + 32485 + ], + "ParasPokedexEntry": [ + 104, + 21347 + ], + "ParasectBackpic": [ + 28, + 21474 + ], + "ParasectFrontpic": [ + 21, + 17815 + ], + "ParasectPokedexEntry": [ + 104, + 21453 + ], + "PartyMenuOBPals": [ + 2, + 31430 + ], + "PersianBackpic": [ + 24, + 30047 + ], + "PersianFrontpic": [ + 31, + 29764 + ], + "PersianPokedexEntry": [ + 104, + 22117 + ], + "PhanpyBackpic": [ + 29, + 29585 + ], + "PhanpyFrontpic": [ + 30, + 23536 + ], + "PhanpyPokedexEntry": [ + 107, + 20586 + ], + "PhoneContacts": [ + 36, + 17466 + ], + "PhoneOutOfAreaScript": [ + 36, + 17958 + ], + "PhoneScript_JustTalkToThem": [ + 36, + 17967 + ], + "PhoneTilemapRLE": [ + 36, + 21833 + ], + "PichuBackpic": [ + 29, + 22246 + ], + "PichuFrontpic": [ + 30, + 22305 + ], + "PichuPokedexEntry": [ + 106, + 21136 + ], + "PidgeotBackpic": [ + 27, + 18421 + ], + "PidgeotFrontpic": [ + 32, + 30139 + ], + "PidgeotPokedexEntry": [ + 104, + 18269 + ], + "PidgeottoBackpic": [ + 29, + 23968 + ], + "PidgeottoFrontpic": [ + 22, + 27770 + ], + "PidgeottoPokedexEntry": [ + 104, + 18153 + ], + "PidgeyBackpic": [ + 24, + 23076 + ], + "PidgeyFrontpic": [ + 30, + 27807 + ], + "PidgeyPokedexEntry": [ + 104, + 18035 + ], + "PikachuBackpic": [ + 26, + 23187 + ], + "PikachuFrontpic": [ + 29, + 25106 + ], + "PikachuPokedexEntry": [ + 104, + 19021 + ], + "PiloswineBackpic": [ + 30, + 30460 + ], + "PiloswineFrontpic": [ + 24, + 29279 + ], + "PiloswinePokedexEntry": [ + 107, + 19499 + ], + "PinecoBackpic": [ + 28, + 18304 + ], + "PinecoFrontpic": [ + 28, + 30690 + ], + "PinecoPokedexEntry": [ + 107, + 17601 + ], + "PinsirBackpic": [ + 25, + 25771 + ], + "PinsirFrontpic": [ + 32, + 20700 + ], + "PinsirPokedexEntry": [ + 105, + 23276 + ], + "PlaceUnownPrinterFrontpic": [ + 5, + 28636 + ], + "PokedexCursorPalette": [ + 2, + 21841 + ], + "PokedexDataPointerTable": [ + 17, + 17248 + ], + "PokedexLZ": [ + 16, + 21777 + ], + "PokedexQuestionMarkPalette": [ + 2, + 21849 + ], + "PokedexSlowpokeLZ": [ + 16, + 22195 + ], + "PokegearGFX": [ + 112, + 20035 + ], + "PokegearPals": [ + 2, + 31598 + ], + "PokegearPhoneIconGFX": [ + 62, + 20502 + ], + "PokegearSpritesGFX": [ + 36, + 21660 + ], + "PokemonCries": [ + 60, + 26439 + ], + "PokemonNames": [ + 108, + 19316 + ], + "PokemonPalettes": [ + 2, + 27965 + ], + "PokemonPicPointers": [ + 18, + 16384 + ], + "PokemonProfPic": [ + 26, + 26006 + ], + "PolitoedBackpic": [ + 29, + 17573 + ], + "PolitoedFrontpic": [ + 21, + 19715 + ], + "PolitoedPokedexEntry": [ + 106, + 22708 + ], + "PoliwagBackpic": [ + 30, + 24751 + ], + "PoliwagFrontpic": [ + 30, + 20809 + ], + "PoliwagPokedexEntry": [ + 104, + 22901 + ], + "PoliwhirlBackpic": [ + 27, + 19771 + ], + "PoliwhirlFrontpic": [ + 25, + 20911 + ], + "PoliwhirlPokedexEntry": [ + 104, + 23014 + ], + "PoliwrathBackpic": [ + 25, + 23536 + ], + "PoliwrathFrontpic": [ + 21, + 22983 + ], + "PoliwrathPokedexEntry": [ + 104, + 23117 + ], + "PonytaBackpic": [ + 24, + 32337 + ], + "PonytaFrontpic": [ + 22, + 20403 + ], + "PonytaPokedexEntry": [ + 105, + 17735 + ], + "Porygon2Backpic": [ + 28, + 16705 + ], + "Porygon2Frontpic": [ + 28, + 22102 + ], + "Porygon2PokedexEntry": [ + 107, + 20806 + ], + "PorygonBackpic": [ + 29, + 16980 + ], + "PorygonFrontpic": [ + 26, + 29146 + ], + "PorygonPokedexEntry": [ + 106, + 17290 + ], + "PredefPals": [ + 2, + 25189 + ], + "PrepMonFrontpic": [ + 0, + 14778 + ], + "PrimeapeBackpic": [ + 26, + 18546 + ], + "PrimeapeFrontpic": [ + 31, + 31330 + ], + "PrimeapePokedexEntry": [ + 104, + 22560 + ], + "PsyduckBackpic": [ + 26, + 22120 + ], + "PsyduckFrontpic": [ + 27, + 25434 + ], + "PsyduckPokedexEntry": [ + 104, + 22217 + ], + "PupitarBackpic": [ + 25, + 17141 + ], + "PupitarFrontpic": [ + 26, + 16745 + ], + "PupitarPokedexEntry": [ + 107, + 22333 + ], + "PuzzlePieceBorderData.TileBordersGFX": [ + 56, + 24368 + ], + "QuagsireBackpic": [ + 28, + 20843 + ], + "QuagsireFrontpic": [ + 27, + 28056 + ], + "QuagsirePokedexEntry": [ + 107, + 16597 + ], + "QuestionEmote": [ + 5, + 17481 + ], + "QuilavaBackpic": [ + 23, + 31177 + ], + "QuilavaFrontpic": [ + 22, + 25203 + ], + "QuilavaPokedexEntry": [ + 106, + 19350 + ], + "QwilfishBackpic": [ + 24, + 23467 + ], + "QwilfishFrontpic": [ + 29, + 31494 + ], + "QwilfishPokedexEntry": [ + 107, + 18398 + ], + "RadioTilemapRLE": [ + 36, + 21708 + ], + "RaichuBackpic": [ + 25, + 22411 + ], + "RaichuFrontpic": [ + 32, + 17617 + ], + "RaichuPokedexEntry": [ + 104, + 19137 + ], + "RaikouBackpic": [ + 30, + 17706 + ], + "RaikouFrontpic": [ + 18, + 26955 + ], + "RaikouPokedexEntry": [ + 107, + 21901 + ], + "RapidashBackpic": [ + 23, + 28763 + ], + "RapidashFrontpic": [ + 31, + 21710 + ], + "RapidashPokedexEntry": [ + 105, + 17853 + ], + "RaticateBackpic": [ + 26, + 20695 + ], + "RaticateFrontpic": [ + 22, + 28621 + ], + "RaticatePokedexEntry": [ + 104, + 18471 + ], + "RattataBackpic": [ + 27, + 25763 + ], + "RattataFrontpic": [ + 28, + 32187 + ], + "RattataPokedexEntry": [ + 104, + 18367 + ], + "ReadTileToAnimBuffer": [ + 63, + 17597 + ], + "RemoraidBackpic": [ + 26, + 24247 + ], + "RemoraidFrontpic": [ + 29, + 19340 + ], + "RemoraidPokedexEntry": [ + 107, + 19716 + ], + "RhydonBackpic": [ + 23, + 20980 + ], + "RhydonFrontpic": [ + 18, + 20606 + ], + "RhydonPokedexEntry": [ + 105, + 21621 + ], + "RhyhornBackpic": [ + 27, + 19435 + ], + "RhyhornFrontpic": [ + 31, + 27661 + ], + "RhyhornPokedexEntry": [ + 105, + 21516 + ], + "RoamMaps": [ + 10, + 26971 + ], + "RockMonMaps": [ + 46, + 25677 + ], + "RoofPals": [ + 2, + 31150 + ], + "Roofs": [ + 7, + 16444 + ], + "RotateUnownFrontpic": [ + 56, + 18459 + ], + "SFX": [ + 58, + 21086 + ], + "SadEmote": [ + 5, + 17609 + ], + "SandshrewBackpic": [ + 23, + 31577 + ], + "SandshrewFrontpic": [ + 29, + 23397 + ], + "SandshrewPokedexEntry": [ + 104, + 19241 + ], + "SandslashBackpic": [ + 23, + 22218 + ], + "SandslashFrontpic": [ + 22, + 22161 + ], + "SandslashPokedexEntry": [ + 104, + 19350 + ], + "ScizorBackpic": [ + 26, + 16384 + ], + "ScizorFrontpic": [ + 31, + 20007 + ], + "ScizorPokedexEntry": [ + 107, + 18512 + ], + "ScrollTileDown": [ + 63, + 17169 + ], + "ScrollTileLeft": [ + 63, + 17102 + ], + "ScrollTileRight": [ + 63, + 17122 + ], + "ScrollTileRightLeft": [ + 63, + 17072 + ], + "ScrollTileUp": [ + 63, + 17142 + ], + "ScytherBackpic": [ + 25, + 29823 + ], + "ScytherFrontpic": [ + 31, + 31850 + ], + "ScytherPokedexEntry": [ + 105, + 22825 + ], + "SeadraBackpic": [ + 23, + 23042 + ], + "SeadraFrontpic": [ + 24, + 17174 + ], + "SeadraPokedexEntry": [ + 105, + 22160 + ], + "SeakingBackpic": [ + 26, + 21052 + ], + "SeakingFrontpic": [ + 18, + 31172 + ], + "SeakingPokedexEntry": [ + 105, + 22383 + ], + "SeelBackpic": [ + 28, + 19260 + ], + "SeelFrontpic": [ + 22, + 21283 + ], + "SeelPokedexEntry": [ + 105, + 18734 + ], + "SentretBackpic": [ + 30, + 18492 + ], + "SentretFrontpic": [ + 29, + 20509 + ], + "SentretPokedexEntry": [ + 106, + 19896 + ], + "ShellderBackpic": [ + 24, + 16779 + ], + "ShellderFrontpic": [ + 27, + 17404 + ], + "ShellderPokedexEntry": [ + 105, + 19188 + ], + "ShockEmote": [ + 5, + 17417 + ], + "Shrink1Pic": [ + 62, + 30142 + ], + "Shrink2Pic": [ + 62, + 30286 + ], + "ShuckleBackpic": [ + 30, + 25942 + ], + "ShuckleFrontpic": [ + 30, + 19275 + ], + "ShucklePokedexEntry": [ + 107, + 18623 + ], + "SkarmoryBackpic": [ + 30, + 24509 + ], + "SkarmoryFrontpic": [ + 31, + 21147 + ], + "SkarmoryPokedexEntry": [ + 107, + 20164 + ], + "SkiploomBackpic": [ + 28, + 29181 + ], + "SkiploomFrontpic": [ + 29, + 18459 + ], + "SkiploomPokedexEntry": [ + 106, + 22930 + ], + "SleepEmote": [ + 5, + 17801 + ], + "SlowbroBackpic": [ + 26, + 31900 + ], + "SlowbroFrontpic": [ + 31, + 23368 + ], + "SlowbroPokedexEntry": [ + 105, + 18070 + ], + "SlowkingBackpic": [ + 22, + 30739 + ], + "SlowkingFrontpic": [ + 31, + 26600 + ], + "SlowkingPokedexEntry": [ + 107, + 17057 + ], + "SlowpokeBackpic": [ + 30, + 26178 + ], + "SlowpokeFrontpic": [ + 29, + 18164 + ], + "SlowpokePokedexEntry": [ + 105, + 17964 + ], + "SlugmaBackpic": [ + 28, + 18942 + ], + "SlugmaFrontpic": [ + 29, + 30683 + ], + "SlugmaPokedexEntry": [ + 107, + 19191 + ], + "SmeargleBackpic": [ + 26, + 17826 + ], + "SmeargleFrontpic": [ + 22, + 19961 + ], + "SmearglePokedexEntry": [ + 107, + 21033 + ], + "SmoochumBackpic": [ + 29, + 21379 + ], + "SmoochumFrontpic": [ + 29, + 18753 + ], + "SmoochumPokedexEntry": [ + 107, + 21364 + ], + "SneaselBackpic": [ + 27, + 16724 + ], + "SneaselFrontpic": [ + 22, + 24772 + ], + "SneaselPokedexEntry": [ + 107, + 18850 + ], + "SnorlaxBackpic": [ + 30, + 32600 + ], + "SnorlaxFrontpic": [ + 22, + 22599 + ], + "SnorlaxPokedexEntry": [ + 106, + 17954 + ], + "SnubbullBackpic": [ + 27, + 24443 + ], + "SnubbullFrontpic": [ + 25, + 32372 + ], + "SnubbullPokedexEntry": [ + 107, + 18172 + ], + "SpawnPoints": [ + 5, + 21273 + ], + "SpearowBackpic": [ + 28, + 27356 + ], + "SpearowFrontpic": [ + 30, + 16649 + ], + "SpearowPokedexEntry": [ + 104, + 18584 + ], + "SpecialPhoneCallList": [ + 36, + 17910 + ], + "SpinarakBackpic": [ + 30, + 24024 + ], + "SpinarakFrontpic": [ + 32, + 32551 + ], + "SpinarakPokedexEntry": [ + 106, + 20577 + ], + "SpriteMons": [ + 5, + 18025 + ], + "SquirtleBackpic": [ + 30, + 24991 + ], + "SquirtleFrontpic": [ + 30, + 26880 + ], + "SquirtlePokedexEntry": [ + 104, + 17046 + ], + "StandingTileFrame": [ + 63, + 17550 + ], + "StandingTileFrame8": [ + 63, + 17062 + ], + "StantlerBackpic": [ + 26, + 17466 + ], + "StantlerFrontpic": [ + 21, + 20654 + ], + "StantlerPokedexEntry": [ + 107, + 20921 + ], + "StarmieBackpic": [ + 29, + 32297 + ], + "StarmieFrontpic": [ + 26, + 31216 + ], + "StarmiePokedexEntry": [ + 105, + 22613 + ], + "StaryuBackpic": [ + 29, + 24253 + ], + "StaryuFrontpic": [ + 28, + 25516 + ], + "StaryuPokedexEntry": [ + 105, + 22501 + ], + "StatsScreen_PlaceFrontpic": [ + 20, + 20675 + ], + "StdScripts": [ + 64, + 16384 + ], + "SteelixBackpic": [ + 24, + 29663 + ], + "SteelixFrontpic": [ + 18, + 22545 + ], + "SteelixPokedexEntry": [ + 107, + 18056 + ], + "StubbedGetFrontpic": [ + 112, + 19066 + ], + "SudowoodoBackpic": [ + 25, + 27987 + ], + "SudowoodoFrontpic": [ + 24, + 24247 + ], + "SudowoodoPokedexEntry": [ + 106, + 22586 + ], + "SuicuneBackpic": [ + 22, + 29894 + ], + "SuicuneFrontpic": [ + 31, + 16540 + ], + "SuicunePokedexEntry": [ + 107, + 22111 + ], + "SunfloraBackpic": [ + 23, + 20565 + ], + "SunfloraFrontpic": [ + 21, + 31221 + ], + "SunfloraPokedexEntry": [ + 106, + 23389 + ], + "SunkernBackpic": [ + 29, + 16682 + ], + "SunkernFrontpic": [ + 30, + 24267 + ], + "SunkernPokedexEntry": [ + 106, + 23272 + ], + "SwarmGrassWildMons": [ + 10, + 32284 + ], + "SwarmWaterWildMons": [ + 10, + 32473 + ], + "SwinubBackpic": [ + 30, + 28722 + ], + "SwinubFrontpic": [ + 30, + 30878 + ], + "SwinubPokedexEntry": [ + 107, + 19400 + ], + "TMHMMoves": [ + 4, + 23142 + ], + "TangelaBackpic": [ + 30, + 29165 + ], + "TangelaFrontpic": [ + 22, + 30317 + ], + "TangelaPokedexEntry": [ + 105, + 21842 + ], + "TaurosBackpic": [ + 30, + 27576 + ], + "TaurosFrontpic": [ + 32, + 18650 + ], + "TaurosPokedexEntry": [ + 105, + 23380 + ], + "TeddiursaBackpic": [ + 29, + 29309 + ], + "TeddiursaFrontpic": [ + 30, + 19014 + ], + "TeddiursaPokedexEntry": [ + 107, + 18963 + ], + "TentacoolBackpic": [ + 29, + 17869 + ], + "TentacoolFrontpic": [ + 29, + 24538 + ], + "TentacoolPokedexEntry": [ + 105, + 17183 + ], + "TentacruelBackpic": [ + 25, + 22036 + ], + "TentacruelFrontpic": [ + 32, + 22229 + ], + "TentacruelPokedexEntry": [ + 105, + 17300 + ], + "Text_BreedHuh": [ + 101, + 18257 + ], + "TheEndGFX": [ + 50, + 31933 + ], + "TilesetBGPalette": [ + 2, + 30558 + ], + "Tilesets": [ + 5, + 22206 + ], + "TimeFishGroups": [ + 36, + 27614 + ], + "TitleScreenGFX1": [ + 38, + 16384 + ], + "TitleScreenGFX2": [ + 38, + 17560 + ], + "TitleScreenGFX3": [ + 57, + 16864 + ], + "TitleScreenGFX4": [ + 57, + 16928 + ], + "TitleScreenTilemap": [ + 38, + 17962 + ], + "TogepiBackpic": [ + 29, + 21957 + ], + "TogepiFrontpic": [ + 30, + 30249 + ], + "TogepiPokedexEntry": [ + 106, + 21466 + ], + "TogeticBackpic": [ + 25, + 20160 + ], + "TogeticFrontpic": [ + 23, + 21806 + ], + "TogeticPokedexEntry": [ + 106, + 21576 + ], + "TotodileBackpic": [ + 27, + 23780 + ], + "TotodileFrontpic": [ + 28, + 23973 + ], + "TotodilePokedexEntry": [ + 106, + 19561 + ], + "TownMapGFX": [ + 62, + 19602 + ], + "TownMapPals.PalMap": [ + 36, + 24236 + ], + "TradeAnim_GetFrontpic": [ + 10, + 21301 + ], + "TradeAnim_ShowFrontpic": [ + 10, + 21351 + ], + "TradeAnim_ShowGetmonFrontpic": [ + 10, + 21348 + ], + "TradeAnim_ShowGivemonFrontpic": [ + 10, + 21343 + ], + "TradeArrowLeftGFX": [ + 10, + 22391 + ], + "TradeArrowRightGFX": [ + 10, + 22375 + ], + "TradeBallGFX": [ + 10, + 22823 + ], + "TradeBubbleGFX": [ + 10, + 22439 + ], + "TradeCableGFX": [ + 10, + 22407 + ], + "TradeGameBoyLZ": [ + 10, + 22503 + ], + "TradeGameBoyTilemap": [ + 10, + 22291 + ], + "TradeLinkTubeTilemap": [ + 10, + 22339 + ], + "TradePoofGFX": [ + 10, + 22919 + ], + "TradeTexts": [ + 63, + 19714 + ], + "TradedForText": [ + 63, + 19749 + ], + "TrainerCard_JohtoBadgesOAM": [ + 9, + 21541 + ], + "TrainerClassAttributes": [ + 14, + 21858 + ], + "TrainerClassNames": [ + 108, + 18773 + ], + "TrainerEncounterMusic": [ + 58, + 20519 + ], + "TrainerGroups": [ + 14, + 22846 + ], + "TrainerPalettes": [ + 2, + 30013 + ], + "TrainerPicPointers": [ + 32, + 16384 + ], + "Trainers": [ + 14, + 22978 + ], + "TreeMonMaps": [ + 46, + 25574 + ], + "TreeMons": [ + 46, + 25712 + ], + "TypeMatchups": [ + 13, + 19713 + ], + "TypeNames": [ + 20, + 18862 + ], + "TyphlosionBackpic": [ + 23, + 29974 + ], + "TyphlosionFrontpic": [ + 32, + 22735 + ], + "TyphlosionPokedexEntry": [ + 106, + 19452 + ], + "TyranitarBackpic": [ + 23, + 21393 + ], + "TyranitarFrontpic": [ + 31, + 19435 + ], + "TyranitarPokedexEntry": [ + 107, + 22451 + ], + "TyrogueBackpic": [ + 26, + 29838 + ], + "TyrogueFrontpic": [ + 28, + 31889 + ], + "TyroguePokedexEntry": [ + 107, + 21139 + ], + "UmbreonBackpic": [ + 25, + 26882 + ], + "UmbreonFrontpic": [ + 25, + 18653 + ], + "UmbreonPokedexEntry": [ + 107, + 16820 + ], + "UnownABackpic": [ + 46, + 20410 + ], + "UnownAFrontpic": [ + 46, + 20656 + ], + "UnownBBackpic": [ + 46, + 19259 + ], + "UnownBFrontpic": [ + 46, + 18857 + ], + "UnownCBackpic": [ + 30, + 31891 + ], + "UnownCFrontpic": [ + 27, + 32578 + ], + "UnownDBackpic": [ + 46, + 17990 + ], + "UnownDFrontpic": [ + 46, + 18140 + ], + "UnownEBackpic": [ + 46, + 18717 + ], + "UnownEFrontpic": [ + 46, + 18576 + ], + "UnownFBackpic": [ + 46, + 17687 + ], + "UnownFFrontpic": [ + 46, + 19127 + ], + "UnownFont": [ + 62, + 29454 + ], + "UnownGBackpic": [ + 46, + 16893 + ], + "UnownGFrontpic": [ + 46, + 16384 + ], + "UnownHBackpic": [ + 30, + 32424 + ], + "UnownHFrontpic": [ + 46, + 16556 + ], + "UnownIBackpic": [ + 46, + 22743 + ], + "UnownIFrontpic": [ + 46, + 22837 + ], + "UnownJBackpic": [ + 46, + 19390 + ], + "UnownJFrontpic": [ + 46, + 19908 + ], + "UnownKBackpic": [ + 46, + 21140 + ], + "UnownKFrontpic": [ + 46, + 20160 + ], + "UnownLBackpic": [ + 46, + 21597 + ], + "UnownLFrontpic": [ + 46, + 21705 + ], + "UnownMBackpic": [ + 46, + 20778 + ], + "UnownMFrontpic": [ + 46, + 21486 + ], + "UnownNBackpic": [ + 46, + 20533 + ], + "UnownNFrontpic": [ + 46, + 20285 + ], + "UnownOBackpic": [ + 46, + 19651 + ], + "UnownOFrontpic": [ + 46, + 21020 + ], + "UnownPBackpic": [ + 46, + 22649 + ], + "UnownPFrontpic": [ + 46, + 22444 + ], + "UnownPicPointers": [ + 31, + 16384 + ], + "UnownPokedexEntry": [ + 107, + 17277 + ], + "UnownPuzzleCursorGFX": [ + 56, + 24530 + ], + "UnownPuzzleStartCancelLZ": [ + 56, + 24594 + ], + "UnownQBackpic": [ + 46, + 22132 + ], + "UnownQFrontpic": [ + 46, + 22341 + ], + "UnownRBackpic": [ + 46, + 22928 + ], + "UnownRFrontpic": [ + 46, + 23018 + ], + "UnownSBackpic": [ + 46, + 18288 + ], + "UnownSFrontpic": [ + 46, + 17217 + ], + "UnownTBackpic": [ + 46, + 21257 + ], + "UnownTFrontpic": [ + 46, + 20899 + ], + "UnownUBackpic": [ + 46, + 21919 + ], + "UnownUFrontpic": [ + 46, + 22237 + ], + "UnownVBackpic": [ + 46, + 17531 + ], + "UnownVFrontpic": [ + 46, + 17375 + ], + "UnownWBackpic": [ + 46, + 20034 + ], + "UnownWFrontpic": [ + 46, + 19521 + ], + "UnownXBackpic": [ + 46, + 21373 + ], + "UnownXFrontpic": [ + 46, + 22026 + ], + "UnownYBackpic": [ + 46, + 22547 + ], + "UnownYFrontpic": [ + 46, + 21812 + ], + "UnownZBackpic": [ + 46, + 19781 + ], + "UnownZFrontpic": [ + 46, + 18992 + ], + "UrsaringBackpic": [ + 29, + 28756 + ], + "UrsaringFrontpic": [ + 32, + 23746 + ], + "UrsaringPokedexEntry": [ + 107, + 19077 + ], + "VaporeonBackpic": [ + 29, + 19047 + ], + "VaporeonFrontpic": [ + 21, + 30316 + ], + "VaporeonPokedexEntry": [ + 106, + 16968 + ], + "VenomothBackpic": [ + 21, + 32123 + ], + "VenomothFrontpic": [ + 32, + 20188 + ], + "VenomothPokedexEntry": [ + 104, + 21676 + ], + "VenonatBackpic": [ + 26, + 25304 + ], + "VenonatFrontpic": [ + 28, + 17985 + ], + "VenonatPokedexEntry": [ + 104, + 21557 + ], + "VenusaurBackpic": [ + 23, + 18481 + ], + "VenusaurFrontpic": [ + 18, + 26336 + ], + "VenusaurPokedexEntry": [ + 104, + 16597 + ], + "VictreebelBackpic": [ + 27, + 30969 + ], + "VictreebelFrontpic": [ + 32, + 21722 + ], + "VictreebelPokedexEntry": [ + 105, + 17074 + ], + "VileplumeBackpic": [ + 25, + 30189 + ], + "VileplumeFrontpic": [ + 23, + 25918 + ], + "VileplumePokedexEntry": [ + 104, + 21239 + ], + "VoltorbBackpic": [ + 30, + 28267 + ], + "VoltorbFrontpic": [ + 46, + 17840 + ], + "VoltorbPokedexEntry": [ + 105, + 20308 + ], + "VulpixBackpic": [ + 26, + 20338 + ], + "VulpixFrontpic": [ + 23, + 17224 + ], + "VulpixPokedexEntry": [ + 104, + 20349 + ], + "WaitTileAnimation": [ + 63, + 17061 + ], + "WartortleBackpic": [ + 26, + 19980 + ], + "WartortleFrontpic": [ + 22, + 29471 + ], + "WartortlePokedexEntry": [ + 104, + 17164 + ], + "WaveSamples": [ + 58, + 19890 + ], + "WeedleBackpic": [ + 30, + 19794 + ], + "WeedleFrontpic": [ + 30, + 27345 + ], + "WeedlePokedexEntry": [ + 104, + 17707 + ], + "WeepinbellBackpic": [ + 27, + 21112 + ], + "WeepinbellFrontpic": [ + 26, + 22832 + ], + "WeepinbellPokedexEntry": [ + 105, + 16954 + ], + "WeezingBackpic": [ + 27, + 16384 + ], + "WeezingFrontpic": [ + 18, + 25088 + ], + "WeezingPokedexEntry": [ + 105, + 21402 + ], + "WigglytuffBackpic": [ + 30, + 19536 + ], + "WigglytuffFrontpic": [ + 24, + 31576 + ], + "WigglytuffPokedexEntry": [ + 104, + 20688 + ], + "WobbuffetBackpic": [ + 29, + 30955 + ], + "WobbuffetFrontpic": [ + 25, + 25028 + ], + "WobbuffetPokedexEntry": [ + 107, + 17376 + ], + "WooperBackpic": [ + 30, + 27113 + ], + "WooperFrontpic": [ + 30, + 28037 + ], + "WooperPokedexEntry": [ + 107, + 16496 + ], + "WriteTileFromAnimBuffer": [ + 63, + 17585 + ], + "WrongNumber.script": [ + 36, + 16960 + ], + "XatuBackpic": [ + 28, + 17345 + ], + "XatuFrontpic": [ + 22, + 24340 + ], + "XatuPokedexEntry": [ + 106, + 21814 + ], + "YanmaBackpic": [ + 22, + 23907 + ], + "YanmaFrontpic": [ + 25, + 26142 + ], + "YanmaPokedexEntry": [ + 107, + 16384 + ], + "ZapdosBackpic": [ + 28, + 26437 + ], + "ZapdosFrontpic": [ + 18, + 28185 + ], + "ZapdosPokedexEntry": [ + 106, + 18182 + ], + "ZubatBackpic": [ + 24, + 17569 + ], + "ZubatFrontpic": [ + 29, + 32030 + ], + "ZubatPokedexEntry": [ + 104, + 20809 + ], + "_AreWeGeniusesText": [ + 100, + 22601 + ], + "_BackAlreadyText": [ + 100, + 22807 + ], + "_BargainShopComeAgainText": [ + 101, + 24234 + ], + "_BargainShopFinalPriceText": [ + 101, + 24084 + ], + "_BargainShopIntroText": [ + 101, + 23979 + ], + "_BargainShopNoFundsText": [ + 101, + 24204 + ], + "_BargainShopPackFullText": [ + 101, + 24122 + ], + "_BargainShopSoldOutText": [ + 101, + 24155 + ], + "_BargainShopThanksText": [ + 101, + 24113 + ], + "_BidsFarewellToMonText": [ + 100, + 18201 + ], + "_BreedAppearsToCareForText": [ + 101, + 18477 + ], + "_BreedAskNicknameText": [ + 101, + 18296 + ], + "_BreedBrimmingWithEnergyText": [ + 101, + 18420 + ], + "_BreedClearboxText": [ + 101, + 18265 + ], + "_BreedEggHatchText": [ + 101, + 18267 + ], + "_BreedFriendlyText": [ + 101, + 18508 + ], + "_BreedNoInterestText": [ + 101, + 18447 + ], + "_BreedShowsInterestText": [ + 101, + 18534 + ], + "_CGB_GSIntro.ShellderLaprasBGPalette": [ + 2, + 22241 + ], + "_CGB_GSIntro.ShellderLaprasOBPals": [ + 2, + 22249 + ], + "_CGB_PackPals.PackPals": [ + 2, + 22895 + ], + "_CantAcceptEggText": [ + 100, + 22429 + ], + "_ComeAgainText": [ + 100, + 22990 + ], + "_ComeBackLaterText": [ + 100, + 22576 + ], + "_DayCareLadyIntroEggText": [ + 100, + 22176 + ], + "_DayCareLadyIntroText": [ + 100, + 22122 + ], + "_DayCareManIntroEggText": [ + 100, + 21949 + ], + "_DayCareManIntroText": [ + 100, + 21902 + ], + "_DaycareDummyText": [ + 100, + 21900 + ], + "_EmptyMailboxText": [ + 101, + 18563 + ], + "_ForYourMonSendsText": [ + 100, + 18255 + ], + "_FoundAnEggText": [ + 100, + 23013 + ], + "_GotBackMonText": [ + 100, + 22788 + ], + "_HallOfFamePC.HOFMaster": [ + 33, + 26331 + ], + "_HallOfFamePC.TimeFamer": [ + 33, + 26347 + ], + "_HaveNoRoomText": [ + 100, + 22919 + ], + "_HerbShopLadyIntroText": [ + 101, + 23692 + ], + "_HerbalLadyComeAgainText": [ + 101, + 23950 + ], + "_HerbalLadyFinalPriceText": [ + 101, + 23826 + ], + "_HerbalLadyHowManyText": [ + 101, + 23815 + ], + "_HerbalLadyNoMoneyText": [ + 101, + 23916 + ], + "_HerbalLadyPackFullText": [ + 101, + 23886 + ], + "_HerbalLadyThanksText": [ + 101, + 23858 + ], + "_IllKeepItThanksText": [ + 100, + 23222 + ], + "_IllRaiseYourMonText": [ + 100, + 22549 + ], + "_LastHealthyMonText": [ + 100, + 22500 + ], + "_LeftWithDayCareLadyText": [ + 101, + 18323 + ], + "_LeftWithDayCareManText": [ + 101, + 18372 + ], + "_MailAlreadyHoldingItemText": [ + 101, + 18673 + ], + "_MailAskSendToPCText": [ + 101, + 21857 + ], + "_MailClearedPutAwayText": [ + 101, + 18585 + ], + "_MailDetachedText": [ + 101, + 21794 + ], + "_MailEggText": [ + 101, + 18705 + ], + "_MailLoseMessageText": [ + 101, + 21757 + ], + "_MailMessageLostText": [ + 101, + 18636 + ], + "_MailMovedFromBoxText": [ + 101, + 18733 + ], + "_MailNoSpaceText": [ + 101, + 21821 + ], + "_MailPackFullText": [ + 101, + 18617 + ], + "_MailSentToPCText": [ + 101, + 21919 + ], + "_MailboxFullText": [ + 101, + 21892 + ], + "_MartAskMoreText": [ + 101, + 24689 + ], + "_MartBoughtText": [ + 101, + 24722 + ], + "_MartCantBuyText": [ + 101, + 24635 + ], + "_MartComeAgainText": [ + 101, + 24669 + ], + "_MartFinalPriceText": [ + 101, + 23660 + ], + "_MartHowManyText": [ + 101, + 23649 + ], + "_MartNoMoneyText": [ + 101, + 24574 + ], + "_MartPackFullText": [ + 101, + 24603 + ], + "_MartSellHowManyText": [ + 101, + 24471 + ], + "_MartSellPriceText": [ + 101, + 24482 + ], + "_MartThanksText": [ + 101, + 24548 + ], + "_MartWelcomeText": [ + 101, + 24518 + ], + "_MonNameBidsFarewellText": [ + 100, + 18223 + ], + "_MonWasSentToText": [ + 100, + 18175 + ], + "_NewPokedexEntry": [ + 16, + 23170 + ], + "_NoRoomForEggText": [ + 100, + 23255 + ], + "_NotEnoughMoneyText": [ + 100, + 22945 + ], + "_NotYetText": [ + 100, + 23003 + ], + "_NothingToSellText": [ + 101, + 24438 + ], + "_OTSendsText": [ + 100, + 18274 + ], + "_OakText1": [ + 101, + 22052 + ], + "_OakText2": [ + 101, + 22163 + ], + "_OakText3": [ + 101, + 22225 + ], + "_OakText4": [ + 101, + 22227 + ], + "_OakText5": [ + 101, + 22335 + ], + "_OakText6": [ + 101, + 22455 + ], + "_OakText7": [ + 101, + 22493 + ], + "_OhFineThenText": [ + 100, + 22974 + ], + "_OnlyOneMonText": [ + 100, + 22396 + ], + "_PCMonHoldingMailText": [ + 101, + 18835 + ], + "_PerfectHeresYourMonText": [ + 100, + 22761 + ], + "_PharmacyComeAgainText": [ + 101, + 24410 + ], + "_PharmacyFinalPriceText": [ + 101, + 24301 + ], + "_PharmacyHowManyText": [ + 101, + 24290 + ], + "_PharmacyIntroText": [ + 101, + 24259 + ], + "_PharmacyNoMoneyText": [ + 101, + 24380 + ], + "_PharmacyPackFullText": [ + 101, + 24349 + ], + "_PharmacyThanksText": [ + 101, + 24335 + ], + "_PokemonRemoveMailText": [ + 101, + 21578 + ], + "_PrepMonFrontpic": [ + 0, + 14783 + ], + "_ReceivedEggText": [ + 100, + 23178 + ], + "_RemoveMailText": [ + 100, + 22463 + ], + "_TakeGoodCareOfEggText": [ + 100, + 23199 + ], + "_TakeGoodCareOfMonText": [ + 100, + 18229 + ], + "_WhatShouldIRaiseText": [ + 100, + 22366 + ], + "_YourMonHasGrownText": [ + 100, + 22651 + ], + "wBaseUnusedBackpic": [ + 1, + 53556 + ], + "wBaseUnusedFrontpic": [ + 1, + 53554 + ] + }, + "tilesets": { + "TILESET_CAVE": {}, + "TILESET_CHAMPIONS_ROOM": {}, + "TILESET_DARK_CAVE": {}, + "TILESET_ELITE_FOUR_ROOM": {}, + "TILESET_FACILITY": {}, + "TILESET_FOREST": {}, + "TILESET_GAME_CORNER": {}, + "TILESET_GATE": {}, + "TILESET_HOUSE": {}, + "TILESET_ICE_PATH": {}, + "TILESET_JOHTO": {}, + "TILESET_JOHTO_MODERN": {}, + "TILESET_KANTO": {}, + "TILESET_LAB": {}, + "TILESET_LIGHTHOUSE": {}, + "TILESET_MANSION": {}, + "TILESET_MART": {}, + "TILESET_PARK": {}, + "TILESET_PLAYERS_HOUSE": {}, + "TILESET_PLAYERS_ROOM": {}, + "TILESET_POKECENTER": {}, + "TILESET_PORT": {}, + "TILESET_RADIO_TOWER": {}, + "TILESET_RUINS_OF_ALPH": {}, + "TILESET_TOWER": {}, + "TILESET_TRADITIONAL_HOUSE": {}, + "TILESET_TRAIN_STATION": {}, + "TILESET_UNDERGROUND": {} + } +}