diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 9d3d69e9..1cd88a09 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -18,6 +18,19 @@ body:
validations:
required: true
+ - type: dropdown
+ id: game
+ attributes:
+ label: Which game were you playing
+ description: Pick every version you saw the bug in.
+ multiple: true
+ options:
+ - Red
+ - Blue
+ - Yellow
+ validations:
+ required: true
+
- type: dropdown
id: os
attributes:
@@ -31,6 +44,26 @@ body:
validations:
required: true
+ - type: dropdown
+ id: mods_enabled
+ attributes:
+ label: Were any mods on
+ description: Check the MODS tab in the launcher if you're not sure.
+ options:
+ - "No"
+ - "Yes"
+ validations:
+ required: true
+
+ - type: input
+ id: mods_which
+ attributes:
+ label: Which mods (if any were on)
+ description: List the enabled mods. Leave blank if none were on.
+ placeholder: nuzlocke 1.0.0, running-shoes 0.3
+ validations:
+ required: false
+
- type: input
id: version
attributes:
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index dd25ba84..16cb533d 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -26,6 +26,20 @@ body:
validations:
required: true
+ - type: dropdown
+ id: game
+ attributes:
+ label: Which game is this about
+ description: Pick every version it applies to.
+ multiple: true
+ options:
+ - Red
+ - Blue
+ - Yellow
+ - Not version-specific
+ validations:
+ required: true
+
- type: input
id: discord
attributes:
diff --git a/.github/ISSUE_TEMPLATE/mod_request.yml b/.github/ISSUE_TEMPLATE/mod_request.yml
index 89ffcfef..ed812e01 100644
--- a/.github/ISSUE_TEMPLATE/mod_request.yml
+++ b/.github/ISSUE_TEMPLATE/mod_request.yml
@@ -23,6 +23,20 @@ body:
validations:
required: true
+ - type: dropdown
+ id: game
+ attributes:
+ label: Which game is this for
+ description: Pick every version the mod should cover.
+ multiple: true
+ options:
+ - Red
+ - Blue
+ - Yellow
+ - Not version-specific
+ validations:
+ required: true
+
- type: input
id: discord
attributes:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 8602d822..2c986425 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -254,19 +254,37 @@ jobs:
v="${{ steps.ver.outputs.version }}"
tag="${{ steps.ver.outputs.tag }}"
- # Issues this release closes, per GitHub's own "closing issues" links
- # (works for squash, rebase, and merge commits alike). Scans every
- # commit since the previous tag so a skipped release run doesn't drop
- # issues on the floor.
+ # Issues this release closes. Three sources, deduped by number:
+ # 1. GitHub's own "closing issues" links on every PR whose
+ # commits are in the range (works for squash, rebase, and
+ # merge commits alike) -- including PRs that were merged
+ # into a branch this release PR is itself merging in.
+ # 2. CLOSES/fixes/resolves text in those PRs' titles + bodies
+ # that GitHub didn't turn into a closing link (a PR into a
+ # non-default branch never gets one).
+ # 3. The same text in raw commit messages, so a direct push
+ # with "CLOSES #N #M" still lands in the notes.
+ # Scans every commit since the previous tag so a skipped release
+ # run doesn't drop issues on the floor.
prev_tag="$(git tag -l 'v*' --sort=-v:refname | grep -v "^${tag}$" | head -1 || true)"
range="${prev_tag:+${prev_tag}..}$GITHUB_SHA"
- closed=""
- for pr in $(git log --pretty=%H "$range" \
- | xargs -I{} gh api "repos/$GITHUB_REPOSITORY/commits/{}/pulls" \
- --jq '.[].number' 2>/dev/null \
- | sort -un || true); do
- closed+="$(gh api graphql \
+ # every #N on a line that carries a closing keyword (handles the
+ # multi-issue "CLOSES #1 #2 #3" form the tracker uses)
+ scan_closes() {
+ grep -iE '\b(close[sd]?|fix(es|ed)?|resolve[sd]?)\b' \
+ | grep -oE '#[0-9]+' | tr -d '#' || true
+ }
+
+ nums=""
+ nums+=" $(git log --pretty=%B "$range" | scan_closes | tr '\n' ' ')"
+
+ prs="$(git log --pretty=%H "$range" \
+ | xargs -I{} gh api "repos/$GITHUB_REPOSITORY/commits/{}/pulls" \
+ --jq '.[].number' 2>/dev/null \
+ | sort -un || true)"
+ for pr in $prs; do
+ nums+=" $(gh api graphql \
-f owner="${GITHUB_REPOSITORY%/*}" \
-f name="${GITHUB_REPOSITORY#*/}" \
-F pr="$pr" \
@@ -274,19 +292,48 @@ jobs:
query($owner:String!, $name:String!, $pr:Int!) {
repository(owner:$owner, name:$name) {
pullRequest(number:$pr) {
- closingIssuesReferences(first:50) { nodes { number title } }
+ closingIssuesReferences(first:50) { nodes { number } }
}
}
}' \
- --jq '.data.repository.pullRequest.closingIssuesReferences.nodes[]
- | "- #\(.number) \(.title)"' 2>/dev/null || true)"$'\n'
+ --jq '.data.repository.pullRequest.closingIssuesReferences.nodes[].number' \
+ 2>/dev/null | grep -E '^[0-9]+$' | tr '\n' ' ' || true)"
+ nums+=" $(gh api "repos/$GITHUB_REPOSITORY/pulls/$pr" \
+ --jq '.title + " " + (.body // "")' 2>/dev/null \
+ | scan_closes | tr '\n' ' ' || true)"
+ done
+
+ # dedupe, drop anything that is a PR or does not exist, keep
+ # titles (gh api prints the response body to stdout on an HTTP
+ # error, so only a zero exit counts)
+ closed=""
+ for n in $(printf '%s' "$nums" | tr ' ' '\n' | grep -E '^[0-9]+$' | sort -un); do
+ if title="$(gh api "repos/$GITHUB_REPOSITORY/issues/$n" \
+ --jq 'if .pull_request then empty else .title end' \
+ 2>/dev/null)"; then
+ [ -n "$title" ] && closed+="- #$n $title"$'\n'
+ fi
done
closed="$(printf '%s' "$closed" | grep . | sort -t'#' -k2 -n || true)"
+ # Everyone whose commits are in the range: GitHub login when the
+ # commit is linked to an account, the raw git author name when not;
+ # CI bots filtered out.
+ base="${prev_tag:-$(git rev-list --max-parents=0 "$GITHUB_SHA" | tail -1)}"
+ contributors="$(gh api --paginate \
+ "repos/$GITHUB_REPOSITORY/compare/${base}...${GITHUB_SHA}" \
+ --jq '.commits[] | if .author and .author.login
+ then "@" + .author.login
+ else .commit.author.name end' 2>/dev/null \
+ | grep -viE '\[bot\]$' | sort -uf | sed 's/^/- /' || true)"
+
notes="Download the correct version for your computer below."
if [ -n "$closed" ]; then
notes+=$'\n\n## Issues closed\n\n'"$closed"
fi
+ if [ -n "$contributors" ]; then
+ notes+=$'\n\n## Contributors\n\n'"$contributors"
+ fi
printf 'Release notes:\n%s\n' "$notes"
gh release create "$tag" \
diff --git a/.gitignore b/.gitignore
index 9fa05d7b..c5d32cf7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,3 +35,7 @@ mobile/ios/build/
# Legacy manual convenience-copy location (superseded by /dist/android/)
mobile/dist/
+
+# Tiled map-editing workspace (tools/tiled_export.py). Derived from the imported
+# ROM cache exactly like data/generated/, so it is never committable.
+/build/tiled/
diff --git a/LICENSE.MD b/LICENSE.MD
new file mode 100644
index 00000000..7c093b57
--- /dev/null
+++ b/LICENSE.MD
@@ -0,0 +1,7 @@
+Copyright 2026 BOIS CLUB GAMES, LLC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
index f7d101c5..be2243ae 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,22 @@
# Gen1Recomp
-A native LÖVE2D recreation of Poke Red and Blue. The engine and map
+A native LÖVE2D recreation of Poke Red, Blue and Yellow. The engine and map
behavior are hand-written Lua; game data and graphics are decoded from a ROM
supplied by the player.
-SUPPORT AND ANNOUNCEMENTS: [Discord](https://bois.icu)
+

+
+**SUPPORT / ANNOUNCEMENTS / MODS:** [Discord](https://bois.icu)
+
+
+
+
+
+
+### Watch the latest update video
+
+[](https://www.youtube.com/watch?v=TbHdJIrKJJU)
+
This project does not include a ROM, emulate the Game Boy, transpile assembly,
or download a disassembly. A canonical US Poke Red or Blue ROM is the only
@@ -150,6 +162,11 @@ reference — lives on the
Shipped example mods, one per kind of author, live in `[mods/](mods/)`.
+Maps can be edited in our own build of [Tiled](https://www.mapeditor.org),
+[bryanthaboi/tiled_gen1recomp](https://github.com/bryanthaboi/tiled_gen1recomp/releases),
+and exported back out as a mod; see
+[docs/tiled-map-editing.md](docs/tiled-map-editing.md).
+
## Bugs and Ideas
Found a bug? A warp dropping you somewhere it shouldn't, a battle doing math
@@ -180,4 +197,6 @@ request with real detail is one that can actually get built.
This project would not be possible without [pret](https://github.com/pret) >
the pret band of decompiling maniacs > and their
-[pokered](https://github.com/pret/pokered) disassembly.
\ No newline at end of file
+[pokered](https://github.com/pret/pokered) disassembly.
+
+
diff --git a/conf.lua b/conf.lua
index 04dd2997..cfb02767 100644
--- a/conf.lua
+++ b/conf.lua
@@ -35,6 +35,14 @@ function love.conf(t)
-- starting size, not the game's resolution.
t.window.width = 1024
t.window.height = 768
+ -- Floor for the resizable desktop window. The launcher's single-column
+ -- layout is laid out against ~420 logical px of content, and the game
+ -- canvas letterboxes fine below that, so this only stops a drag that would
+ -- squeeze the cards past the point where their buttons still read. Kept
+ -- well under the smallest supported desktop display; mobile ignores it
+ -- (fullscreen), so the handheld ports are unaffected.
+ t.window.minwidth = 480
+ t.window.minheight = 360
end
t.version = "11.5"
t.window.vsync = 1
diff --git a/data/scripts/flavor/celadon_mansion_3f.lua b/data/scripts/flavor/celadon_mansion_3f.lua
index e13d5a3e..a7aca328 100644
--- a/data/scripts/flavor/celadon_mansion_3f.lua
+++ b/data/scripts/flavor/celadon_mansion_3f.lua
@@ -1,33 +1,88 @@
--- Celadon Mansion 3F Game Designer (pokered/scripts/CeladonMansion3F.asm
--- CeladonMansion3FGameDesignerText): text_asm counts set bits in
--- wPokedexOwned and compares against NUM_POKEMON - 1 (discounts Mew).
--- If the player owns >= 150 species, shows the "completed" text
--- (originally followed by DisplayDiploma, which has no equivalent UI
--- in this port, so we just show the congratulatory text); otherwise
--- shows the normal encouragement text.
+-- Celadon Mansion 3F, the GAME FREAK dev floor
+-- (pokered+pokeyellow/scripts/CeladonMansion3F.asm). Every dev's
+-- text_asm counts set bits in wPokedexOwned against NUM_POKEMON - 1
+-- (150, discounting Mew). The game designer shows the diploma
+-- (DisplayDiploma -> src/ui/Diploma.lua) on a completed dex; Yellow's
+-- graphic artist then offers the printed copy (PrintDiploma, stood in
+-- by src/core/Printer.lua's PNG export like the Pokédex PRNT item).
+
+local function ownedCount(game)
+ local dex = game.save.pokedex
+ local owned = 0
+ if dex and dex.owned then
+ for _ in pairs(dex.owned) do owned = owned + 1 end
+ end
+ return owned
+end
+
return {
CELADON_MANSION_3F = {
talk = {
TEXT_CELADONMANSION3F_GAME_DESIGNER = function(game, ow, npc, done)
local t = game.data.text
- local dex = game.save.pokedex
- local owned = 0
- if dex and dex.owned then
- for _ in pairs(dex.owned) do
- owned = owned + 1
- end
- end
- -- NUM_POKEMON - 1 = 150 (discounts Mew, per pokered)
- local label, fallback
- if owned >= 150 then
- label, fallback = "_CeladonMansion3FGameDesignerCompletedDexText",
- "Wow! Excellent!\nYou completed\nyour POKeDEX!\nCongratulations!"
- else
- label, fallback = "_CeladonMansion3FGameDesignerText",
- "Is that right?\nI'm the game\ndesigner!\nFilling up your\nPOKeDEX is tough,\nbut don't quit!\nWhen you finish,\ncome tell me!"
- end
local TextBox = require("src.render.TextBox")
- game.stack:push(TextBox.new(game, t[label] or fallback, done))
+ if ownedCount(game) < 150 then
+ game.stack:push(TextBox.new(game,
+ t._CeladonMansion3FGameDesignerText
+ or "Is that right?\nI'm the game\ndesigner!\fFilling up your\nPOKéDEX is tough,\nbut don't quit!",
+ done))
+ return
+ end
+ game.stack:push(TextBox.new(game,
+ t._CeladonMansion3FGameDesignerCompletedDexText
+ or "Wow! Excellent!\nYou completed\nyour POKéDEX!\nCongratulations!",
+ function()
+ local Diploma = require("src.ui.Diploma")
+ game.stack:push(Diploma.new(game, function()
+ -- Yellow tags on the unlocked-printing line (CompletedDexText2)
+ local after = require("src.core.GameVersion").isYellow()
+ and (t._CeladonMansion3FGameDesignerCompletedDexText2
+ or "You can print out\nyour diploma with\nthe GAME BOY\nPrinter!")
+ or nil
+ if after then
+ game.stack:push(TextBox.new(game, after, done))
+ else
+ done()
+ end
+ end))
+ end))
+ end,
+
+ TEXT_CELADONMANSION3F_GRAPHIC_ARTIST = function(game, ow, npc, done)
+ local t = game.data.text
+ local TextBox = require("src.render.TextBox")
+ local yellow = require("src.core.GameVersion").isYellow()
+ if not (yellow and ownedCount(game) >= 150) then
+ game.stack:push(TextBox.new(game,
+ t._CeladonMansion3FGraphicArtistText
+ or "I'm the graphic\nartist!\nI drew you!", done))
+ return
+ end
+ -- _CeladonMansion3FGraphicArtistText2: offer to print the diploma
+ game.stack:push(TextBox.new(game,
+ t._CeladonMansion3FGraphicArtistText2
+ or "I'm the graphic\nartist!\fShould I print\nyour diploma?",
+ function()
+ local ChoiceBox = require("src.ui.ChoiceBox")
+ game.stack:push(ChoiceBox.new(game, function(yes)
+ if not yes then
+ game.stack:push(TextBox.new(game,
+ t._CeladonMansion3FGraphicArtistText3
+ or "Oh. But it's a\nspecial diploma!", done))
+ return
+ end
+ local Printer = require("src.core.Printer")
+ local Diploma = require("src.ui.Diploma")
+ local Strings = require("src.core.Strings")
+ local saved, err = Printer.save("diploma", 160, 144, function()
+ Diploma.render(game)
+ end)
+ -- the PRNT stand-in always reports where the PNG landed
+ game.stack:push(TextBox.new(game, saved
+ and Strings("There you go!\fSaved as\n%s\vin the save\nfolder.", saved)
+ or Strings("Printer error!\n%s", tostring(err)), done))
+ end))
+ end))
end,
},
},
diff --git a/data/scripts/flavor/ss_anne_2f_rooms.lua b/data/scripts/flavor/ss_anne_2f_rooms.lua
index 8f7f4fda..bd0a44ce 100644
--- a/data/scripts/flavor/ss_anne_2f_rooms.lua
+++ b/data/scripts/flavor/ss_anne_2f_rooms.lua
@@ -7,19 +7,19 @@
-- CheckFightingMapTrainers/TalkToTrainer via the existing trainer
-- system, and the item pickups carry no talk text of their own here.
--
--- TEXT_SSANNE2FROOMS_GENTLEMAN3 also opens the POKéDEX entry for
--- SNORLAX after the text box (DisplayPokedex in the original), which
--- has no equivalent talk-script hook in this port (DexEntryMenu has
--- no done-callback the way other pushed UI states do) -- only the
--- flavor line is ported here.
+-- TEXT_SSANNE2FROOMS_GENTLEMAN3 opens SNORLAX's POKéDEX entry after its
+-- text box, like DisplayPokedex in the original. The preview marks it seen
+-- but does not mark it owned.
return {
SS_ANNE_2F_ROOMS = {
talk = {
- -- SSAnne2FRoomsGentleman3Text: PrintText(_SSAnne2FRoomsGentleman3Text)
- -- (then DisplayPokedex SNORLAX -- not ported, see note above)
+ -- SSAnne2FRoomsGentleman3Text: PrintText(_SSAnne2FRoomsGentleman3Text),
+ -- then DisplayPokedex SNORLAX.
TEXT_SSANNE2FROOMS_GENTLEMAN3 = {
{ "face_player" },
{ "show_text", "_SSAnne2FRoomsGentleman3Text" },
+ { "mark_seen", "SNORLAX" },
+ { "push_screen", "DexEntryMenu", "SNORLAX" },
},
-- SSAnne2FRoomsGentleman4Text: PrintText(_SSAnne2FRoomsGentleman4Text)
diff --git a/data/scripts/init.lua b/data/scripts/init.lua
index 76eb8cd5..b6a214c3 100644
--- a/data/scripts/init.lua
+++ b/data/scripts/init.lua
@@ -12,11 +12,18 @@
-- different files can each add NPCs to the same map), and mod
-- contributions from the map_scripts registry compose on top of it.
+local GameVersion = require("src.core.GameVersion")
local MapScripts = require("src.script.MapScripts")
+-- OaksLab is a full Yellow rewrite (one Eevee ball + forced Pikachu);
+-- Red/Blue keep the three-starter choose flow.
+local oaksLab = GameVersion.isYellow()
+ and "data.scripts.oaks_lab_yellow"
+ or "data.scripts.oaks_lab"
+
for _, mapEntry in ipairs({
{ "PALLET_TOWN", "data.scripts.pallet_town" },
- { "OAKS_LAB", "data.scripts.oaks_lab" },
+ { "OAKS_LAB", oaksLab },
{ "REDS_HOUSE_1F", "data.scripts.reds_house" },
{ "CELADON_MANSION_ROOF_HOUSE", "data.scripts.celadon_eevee" },
}) do
@@ -36,6 +43,18 @@ for _, file in ipairs({ "data.scripts.story", "data.scripts.story2",
end
end
+-- Yellow-only content on top of the shared tables (talk keys merge per
+-- TEXT constant): the Kanto-starter gift quests and Jessie & James.
+if GameVersion.isYellow() then
+ for _, file in ipairs({ "data.scripts.yellow_gifts",
+ "data.scripts.yellow_jessie_james",
+ "data.scripts.yellow_beach_house" }) do
+ for mapId, mod in pairs(require(file)) do
+ MapScripts.attachBase(mapId, mod)
+ end
+ end
+end
+
local M = {}
function M.get(mapId)
diff --git a/data/scripts/oaks_lab_yellow.lua b/data/scripts/oaks_lab_yellow.lua
new file mode 100644
index 00000000..7d21fb99
--- /dev/null
+++ b/data/scripts/oaks_lab_yellow.lua
@@ -0,0 +1,296 @@
+-- Hand-ported from pret/pokeyellow scripts/OaksLab.asm.
+-- Yellow: one Eevee ball on the table. Rival snatches it; Oak then
+-- gives the player the wild Pikachu he caught earlier (STARTER_PIKACHU).
+-- Object indices differ from Red (no Charmander/Squirtle/Bulbasaur balls):
+-- 1 RIVAL (4,3), 2 EEVEE_POKE_BALL (7,3), 3 OAK1 (5,2),
+-- 4-5 POKEDEX (2,1)/(3,1), 6 OAK2 (door), 7 GIRL, 8-9 SCIENTIST.
+--
+-- wRivalStarter rides in save.rivalStarter (RIVAL_STARTER_* 1 JOLTEON /
+-- 2 FLAREON / 3 VAPOREON): JOLTEON baseline at the snatch
+-- (OaksLabRivalTakesPokeballScript), FLAREON on a lab win / VAPOREON on
+-- a lab loss (OaksLabRivalEndBattleScript), and Route 22's first battle
+-- upgrades FLAREON back to JOLTEON (Route22Rival1AfterBattleScript).
+
+local OAK1 = 3
+local RIVAL = 1
+
+return {
+ talk = {
+ TEXT_OAKSLAB_OAK1 = {
+ { "face_player" },
+ -- Yellow's OaksLabOak1Text leads with the dex-rating branch: once
+ -- EVENT_PALLET_AFTER_GETTING_POKEBALLS is set (converted saves) or
+ -- 2+ species are owned, Oak asks how the Pokédex is coming and
+ -- rates it (predef DisplayDexRating)
+ { "check_flag", "EVENT_PALLET_AFTER_GETTING_POKEBALLS" },
+ { "jump_if_true", "dex_rating" },
+ { "check_dex_owned", 2 },
+ { "jump_if_true", "dex_rating" },
+ { "check_item", "POKE_BALL" },
+ { "jump_if_true", "come_see" },
+ { "check_flag", "EVENT_BEAT_ROUTE22_RIVAL_1ST_BATTLE" },
+ { "jump_if_true", "give_balls" },
+ { "check_flag", "EVENT_GOT_POKEDEX" },
+ { "jump_if_true", "around_world" },
+ { "check_flag", "EVENT_BATTLED_RIVAL_IN_OAKS_LAB" },
+ { "jump_if_false", "pre_lab_battle" },
+ { "check_item", "OAKS_PARCEL" },
+ { "jump_if_false", "raise_young" },
+ -- .DeliverParcelText: parcel handover, then the Pokédex scene
+ -- (OaksLabRivalArrivesAtOaksRequestScript -> OakGivesPokedexScript)
+ { "show_text", "_OaksLabOak1DeliverParcelText" },
+ { "play_sound", "Get_Key_Item" },
+ { "show_text", "_OaksLabOak1ParcelThanksText" },
+ { "take_item", "OAKS_PARCEL", 1 },
+ { "stop_music" },
+ { "play_music", "Music_MeetRival" },
+ { "show_text", "_OaksLabRivalGrampsText" },
+ { "show_object", "OAKS_LAB", "OAKSLAB_RIVAL" },
+ { "place_npc", RIVAL, 4, 7, "up" },
+ { "move_npc_to", RIVAL, 4, 3 },
+ { "play_music", "Music_OaksLab" },
+ { "face_object", RIVAL, "up" },
+ { "face_object", OAK1, "down" },
+ -- Yellow opens with the rival bragging, not Red's "what did you
+ -- call me for" (OaksLabOakGivesPokedexScript text order)
+ { "show_text", "_OaksLabRivalMyPokemonHasGrownStrongerText" },
+ { "face_object", RIVAL, "up" },
+ { "face_object", OAK1, "down" },
+ { "show_text", "_OaksLabOakIHaveARequestText" },
+ { "face_object", RIVAL, "up" },
+ { "face_object", OAK1, "down" },
+ { "show_text", "_OaksLabOakMyInventionPokedexText" },
+ { "show_text", "_OaksLabOakGotPokedexText" },
+ { "play_sound", "Get_Key_Item" },
+ { "hide_object", "OAKS_LAB", "OAKSLAB_POKEDEX1" },
+ { "hide_object", "OAKS_LAB", "OAKSLAB_POKEDEX2" },
+ { "face_object", RIVAL, "up" },
+ { "face_object", OAK1, "down" },
+ { "show_text", "_OaksLabOakThatWasMyDreamText" },
+ { "face_object", RIVAL, "right" },
+ { "show_text", "_OaksLabRivalLeaveItAllToMeText" },
+ { "set_flag", "EVENT_GOT_POKEDEX" },
+ { "set_flag", "EVENT_OAK_GOT_PARCEL" },
+ { "hide_object", "VIRIDIAN_CITY", "VIRIDIANCITY_OLD_MAN_SLEEPY" },
+ { "show_object", "VIRIDIAN_CITY", "VIRIDIANCITY_OLD_MAN" },
+ { "stop_music" },
+ { "play_music", "Music_MeetRival" },
+ { "move_npc_to", RIVAL, 4, 7 },
+ { "hide_object", "OAKS_LAB", "OAKSLAB_RIVAL" },
+ { "play_music", "Music_OaksLab" },
+ { "set_flag", "EVENT_1ST_ROUTE22_RIVAL_BATTLE" },
+ { "clear_flag", "EVENT_2ND_ROUTE22_RIVAL_BATTLE" },
+ { "set_flag", "EVENT_ROUTE22_RIVAL_WANTS_BATTLE" },
+ { "show_object", "ROUTE_22", "ROUTE22_RIVAL1" },
+ { "jump", "end" },
+
+ { "label", "raise_young" },
+ -- Yellow: talk-to-it (starter Pikachu) instead of Red raise-young line.
+ { "show_text", "_OaksLabOak1YouShouldTalkToIt" },
+ { "jump", "end" },
+
+ { "label", "pre_lab_battle" },
+ { "check_flag", "EVENT_GOT_STARTER" },
+ { "jump_if_true", "can_fight" },
+ { "show_text", "_OaksLabOak1GoAheadItsYours" },
+ { "jump", "end" },
+ { "label", "can_fight" },
+ { "show_text", "_OaksLabOak1YourPokemonCanFightText" },
+ { "jump", "end" },
+
+ { "label", "around_world" },
+ { "show_text", "_OaksLabOak1PokemonAroundTheWorldText" },
+ { "jump", "end" },
+
+ { "label", "give_balls" },
+ { "check_flag", "EVENT_GOT_POKEBALLS_FROM_OAK" },
+ { "jump_if_true", "come_see" },
+ { "set_flag", "EVENT_GOT_POKEBALLS_FROM_OAK" },
+ { "give_item", "POKE_BALL", 5, false },
+ { "show_text", "_OaksLabOak1ReceivedPokeballsText" },
+ { "play_sound", "Get_Key_Item" },
+ { "show_text", "_OaksLabGivePokeballsExplanationText" },
+ { "jump", "end" },
+
+ { "label", "come_see" },
+ { "show_text", "_OaksLabOak1ComeSeeMeSometimesText" },
+ { "jump", "end" },
+
+ { "label", "dex_rating" },
+ { "show_text", "_OaksLabOak1HowIsYourPokedexComingText" },
+ { "dex_rating" },
+ },
+
+ -- OaksLabEeveePokeBallText / OaksLabRivalExclamationScript ->
+ -- OaksLabChoseStarterScript..OaksLabPlayerReceivesPikachuScript:
+ -- before Oak's choose speech the ball is just flavor; after it, the
+ -- rival "!"s, shoves the player off the table, snatches the ball,
+ -- then the player is walked over to Oak and handed Pikachu.
+ TEXT_OAKSLAB_EEVEE_POKE_BALL = function(game, ow, npc, done)
+ local flags = game.save.flags
+ if flags.EVENT_GOT_STARTER then
+ done()
+ return
+ end
+ if not flags.EVENT_OAK_ASKED_TO_CHOOSE_MON then
+ ow.runner:run({
+ { "show_text", "_OaksLabThatsAPokeball" },
+ }, { onDone = done })
+ return
+ end
+ local px, py = ow.player.cellX, ow.player.cellY
+ local rows = {
+ -- OaksLabRivalExclamationScript: "!" over the rival
+ { "emote", RIVAL, "shock" },
+ }
+ -- .RivalPushesPlayerAwayFromEeveeBall + the PAD_RIGHT x2 shove:
+ -- the rival cuts across to the ball WHILE the player standing
+ -- below it is bumped two tiles right (both movements run in the
+ -- same beat, so the walk overlaps the shove like the original)
+ if py == 4 then
+ rows[#rows + 1] = { "walk_npc", RIVAL,
+ { "down", "right", "right", "right" }, { wait = false } }
+ rows[#rows + 1] = { "face_player_dir", "left" }
+ rows[#rows + 1] = { "move_player", "right", 2 }
+ -- let the rival finish the last stretch to (7,4)
+ rows[#rows + 1] = { "wait", 40 }
+ else
+ rows[#rows + 1] = { "move_npc_to", RIVAL, 7, 4 }
+ end
+ rows[#rows + 1] = { "face_object", RIVAL, "up" }
+ rows[#rows + 1] = { "hide_object", "OAKS_LAB", "OAKSLAB_EEVEE_POKE_BALL" }
+ -- rival starter baseline (RIVAL_STARTER_JOLTEON) at snatch time
+ rows[#rows + 1] = { "set_field", "rivalStarter", 1 }
+ rows[#rows + 1] = { "show_text", "_OaksLabRivalTakesText1" }
+ rows[#rows + 1] = { "play_sound", "Get_Key_Item" }
+ rows[#rows + 1] = { "show_text", "_OaksLabRivalTakesText2" }
+ rows[#rows + 1] = { "show_text", "_OaksLabRivalTakesText3" }
+ rows[#rows + 1] = { "show_text", "_OaksLabRivalTakesText4" }
+ rows[#rows + 1] = { "show_text", "_OaksLabRivalTakesText5" }
+ -- OaksLabRLE_PlayerWalksToOak: the simulated-joypad buffer plays
+ -- its RLE list BACKWARDS (StartSimulatingJoypadStates consumes
+ -- from wSimulatedJoypadStatesEnd), so the real order is LEFT 1,
+ -- DOWN 1, LEFT 3, UP 2 -- from the shove spot (9,4) the player
+ -- rounds the BOTTOM of the table to (5,3), directly below Oak
+ if py == 4 then
+ rows[#rows + 1] = { "walk_npc", "player",
+ { "left", "down", "left", "left", "left", "up", "up" } }
+ else
+ rows[#rows + 1] = { "walk_npc", "player", { "left" } }
+ end
+ rows[#rows + 1] = { "face_player_dir", "up" }
+ rows[#rows + 1] = { "face_object", OAK1, "down" }
+ -- OaksLabPlayerReceivedMonText: no nickname prompt -- the starter
+ -- Pikachu keeps its species name
+ rows[#rows + 1] = { "show_text", "_OaksLabOakGivesText" }
+ rows[#rows + 1] = { "play_sound", "Get_Key_Item" }
+ rows[#rows + 1] = { "show_text", "_OaksLabReceivedText", { RAM = "PIKACHU" } }
+ rows[#rows + 1] = { "give_pokemon", "PIKACHU", 5, true }
+ rows[#rows + 1] = { "set_flag", "EVENT_GOT_STARTER" }
+ rows[#rows + 1] = { "set_flag", "EVENT_CHOSE_PIKACHU" }
+ ow.runner:run(rows, { npc = npc, onDone = done })
+ end,
+
+ TEXT_OAKSLAB_RIVAL = {
+ { "face_player" },
+ { "check_flag", "EVENT_GOT_STARTER" },
+ { "jump_if_false", "pre_starter" },
+ { "show_text", "_OaksLabRivalMyPokemonLooksStrongerText" },
+ { "jump", "end" },
+
+ { "label", "pre_starter" },
+ { "check_flag", "EVENT_FOLLOWED_OAK_INTO_LAB_2" },
+ { "jump_if_false", "gramps_gone" },
+ { "show_text", "_OaksLabRivalIllGetABetterPokemonThanYou" },
+ { "jump", "end" },
+
+ { "label", "gramps_gone" },
+ { "show_text", "_OaksLabRivalGrampsIsntAroundText" },
+ },
+ },
+
+ onEnter = function(game, ow)
+ if not (game.save.flags and game.save.flags.EVENT_GOT_POKEDEX) then
+ return
+ end
+ local Commands = require("src.script.Commands")
+ local ctx = { save = game.save, game = game, overworld = ow }
+ Commands.hide_object(ctx, "OAKS_LAB", "OAKSLAB_POKEDEX1")
+ Commands.hide_object(ctx, "OAKS_LAB", "OAKSLAB_POKEDEX2")
+ end,
+
+ onStep = function(game, ow, x, y)
+ local flags = game.save.flags
+ -- OaksLabPlayerDontGoAwayScript: y==6 without the starter walks the
+ -- player back up a tile
+ if flags.EVENT_FOLLOWED_OAK_INTO_LAB and not flags.EVENT_GOT_STARTER
+ and y >= 6 then
+ ow.runner:run({
+ { "face_object", OAK1, "down" },
+ { "face_object", RIVAL, "down" },
+ { "show_text", "_OaksLabOakDontGoAwayYetText" },
+ { "move_player", "up", 1 },
+ }, {})
+ return true
+ end
+ -- OaksLabRivalChallengesPlayerScript..OaksLabPikachuDislikesPokeballsScript:
+ -- heading for the door with Pikachu starts the rival battle, his
+ -- exit walk, then Pikachu pops out of its ball.
+ if flags.EVENT_GOT_STARTER and not flags.EVENT_BATTLED_RIVAL_IN_OAKS_LAB
+ and y >= 6 then
+ local rival = ow:npcByIndex(RIVAL)
+ if not rival then return false end
+ local rows = {
+ { "face_player_dir", "up" },
+ { "stop_music" },
+ { "play_music", "Music_MeetRival" },
+ { "show_text", "_OaksLabRivalIllTakeYouOnText" },
+ }
+ -- FindPathToPlayer with the Y distance decremented: the rival
+ -- stops one tile above the player
+ local target
+ for _, c in ipairs({ { x, y - 1 }, { x - 1, y }, { x + 1, y },
+ { x, y + 1 } }) do
+ if ow.map:inBounds(c[1], c[2]) and ow.map:isWalkableCell(c[1], c[2]) then
+ target = c
+ break
+ end
+ end
+ if target then
+ table.insert(rows, { "move_npc_to", RIVAL, target[1], target[2] })
+ end
+ table.insert(rows, { "face_object", RIVAL,
+ target and target[2] < y and "down"
+ or target and target[2] > y and "up"
+ or target and target[1] < x and "right" or "left" })
+ table.insert(rows, { "start_battle", "trainer", "OPP_RIVAL1", 1 })
+ table.insert(rows, { "heal_party" })
+ table.insert(rows, { "set_flag", "EVENT_BATTLED_RIVAL_IN_OAKS_LAB" })
+ -- OaksLabRivalEndBattleScript: his Eevee's future evolution is
+ -- decided here -- FLAREON if the player won, VAPOREON otherwise
+ table.insert(rows, { "check_battle_result", "win" })
+ table.insert(rows, { "jump_if_false", "lost_lab" })
+ table.insert(rows, { "set_field", "rivalStarter", 2 })
+ table.insert(rows, { "jump", "exit" })
+ table.insert(rows, { "label", "lost_lab" })
+ table.insert(rows, { "set_field", "rivalStarter", 3 })
+ table.insert(rows, { "label", "exit" })
+ -- OaksLabRivalStartsExitScript: parting shot, walk out past the
+ -- player, restore the lab theme
+ table.insert(rows, { "wait", 20 })
+ table.insert(rows, { "show_text", "_OaksLabRivalSmellYouLaterText" })
+ table.insert(rows, { "move_npc_to", RIVAL, 4, 11 })
+ table.insert(rows, { "hide_object", "OAKS_LAB", "OAKSLAB_RIVAL" })
+ table.insert(rows, { "play_music", "Music_OaksLab" })
+ -- OaksLabPikachuEscapesPokeballScript: Pikachu hates its ball.
+ -- The overworld follower itself is still an open port
+ -- (docs/yellow-version.md runtime backlog); the story beat plays.
+ table.insert(rows, { "play_cry", "PIKACHU" })
+ table.insert(rows, { "show_text", "_OaksLabPikachuDislikesPokeballsText1" })
+ table.insert(rows, { "show_text", "_OaksLabPikachuDislikesPokeballsText2" })
+ ow.runner:run(rows, { npc = rival })
+ return true
+ end
+ return false
+ end,
+}
diff --git a/data/scripts/safari.lua b/data/scripts/safari.lua
index c25cfdc8..3cc2ce3a 100644
--- a/data/scripts/safari.lua
+++ b/data/scripts/safari.lua
@@ -19,19 +19,60 @@ local FEE = 500
local BALLS = 30
local STEPS = 502
-local function startGame(game, t, done)
- game.save.money = game.save.money - FEE
- game.save.safari = { balls = BALLS, steps = STEPS }
+local function startGame(game, t, done, balls, introText)
+ game.save.safari = { balls = balls or BALLS, steps = STEPS }
+ game.save.safariNags = nil
local TextBox = require("src.render.TextBox")
- local paid = (t._SafariZoneGateSafariZoneWorker1ThatllBe500PleaseText
- or "That'll be ¥500\nplease!\f{PLAYER} received\n30 SAFARI BALLs!")
- :gsub("{PLAYER}", game.save.player.name)
+ local paid = introText
+ or (t._SafariZoneGateSafariZoneWorker1ThatllBe500PleaseText
+ or "That'll be ¥500\nplease!\f{PLAYER} received\n30 SAFARI BALLs!")
+ :gsub("{NUM:[^}]*}", "500")
+ paid = paid:gsub("{PLAYER}", game.save.player.name)
local pa = t._SafariZoneGateSafariZoneWorker1CallYouOnThePAText
or "\fWe'll call you on\nthe PA when you\nrun out of time\nor SAFARI BALLs!"
local luck = t._SafariZoneGateSafariZoneWorker1GoodLuckText or "Good Luck!"
game.stack:push(TextBox.new(game, paid .. pa .. "\f" .. luck, done))
end
+-- Yellow's soft-lock fix (scripts/SafariZoneGate_2.asm): a player short of
+-- the full fee still gets in.
+-- 0 < money < 500: SafariZoneEntranceCalculateLowCostAdmission takes
+-- everything and hands over min(money/23 + 1, 29) balls.
+-- money == 0: SafariZoneEntranceGetLowCostAdmissionText nags four times
+-- (LowCostText5/6/7/8), then relents -- free entry, one ball.
+local function yellowLowCost(game, ow, t, done, back)
+ local TextBox = require("src.render.TextBox")
+ if game.save.money > 0 then
+ local balls = math.min(math.floor(game.save.money / 23) + 1, 29)
+ game.save.money = 0
+ local intro =
+ (t._SafariZoneGateSafariZoneWorker1NotEnoughMoneyText
+ or "Oops! Not enough\nmoney!")
+ .. (t._SafariZoneLowCostText1
+ or "\fOh, all right, pay\nme what you have.")
+ .. "\f" .. (t._SafariZoneLowCostText2
+ or "But, I can't give\nyou all 30 BALLs.")
+ startGame(game, t, done, balls, intro)
+ return
+ end
+ local nag = game.save.safariNags or 0
+ game.save.safariNags = nag + 1
+ if nag >= 3 then
+ local intro =
+ (t._SafariZoneLowCostText8 or "Read my lips, NO!\nGet it?")
+ .. (t._SafariZoneLowCostText3
+ or "\fYou're persistent,\naren't you?\fOK, you can go in\nfor free, but\njust this once!")
+ startGame(game, t, done, 1, intro)
+ return
+ end
+ local nags = {
+ t._SafariZoneLowCostText5 or "I'm sorry, but you\nhave to pay to\nenter.",
+ t._SafariZoneLowCostText6 or "You can't enter\nwithout paying!",
+ t._SafariZoneLowCostText7 or "I said, no money,\nno entry!",
+ }
+ back(nags[nag + 1])
+end
+
local function joinPrompt(game, ow, done)
done = done or function() end
local TextBox = require("src.render.TextBox")
@@ -51,9 +92,14 @@ local function joinPrompt(game, ow, done)
back(t._SafariZoneGateSafariZoneWorker1PleaseComeAgainText
or "OK! Please come\nagain!")
elseif game.save.money < FEE then
- back(t._SafariZoneGateSafariZoneWorker1NotEnoughMoneyText
- or "Oops! Not enough\nmoney!")
+ if require("src.core.GameVersion").isYellow() then
+ yellowLowCost(game, ow, t, done, back)
+ else
+ back(t._SafariZoneGateSafariZoneWorker1NotEnoughMoneyText
+ or "Oops! Not enough\nmoney!")
+ end
else
+ game.save.money = game.save.money - FEE
startGame(game, t, done)
end
end))
diff --git a/data/scripts/story2.lua b/data/scripts/story2.lua
index 43d5ea27..26208190 100644
--- a/data/scripts/story2.lua
+++ b/data/scripts/story2.lua
@@ -1,6 +1,10 @@
-- More hand-ported events: the Pallet Town intro, the thirsty Saffron
-- gate guards, the Bike Voucher chain, fossils and the day-care.
--- Registered via data/scripts/init.lua; each cites its pokered source.
+-- Registered via data/scripts/init.lua; Red/Blue cite pokered, Yellow
+-- cites pokeyellow (Pallet stop row, Oak spawn, walk RLE, and the
+-- wild-Pikachu beat before the lab escort).
+
+local GameVersion = require("src.core.GameVersion")
local M = {}
@@ -35,72 +39,79 @@ function escort.findPath(fromX, fromY, toX, toY)
return path
end
--- PalletTownOakWalksToPlayerScript: Oak appears at his object spot
--- (8,5) and zigzags to one tile below the player (hNPCPlayerYDistance
--- is pre-decremented before predef FindPathToPlayer).
+-- Red: Oak object (8,5) -> one tile below the player at y=1.
+-- Yellow: Oak object (10,4); stop fires at y=0 (pokeyellow PalletTown).
function escort.oakApproach(playerX)
+ if GameVersion.isYellow() then
+ return escort.findPath(10, 4, playerX, 1)
+ end
return escort.findPath(8, 5, playerX, 2)
end
--- RLEList_ProfOakWalkToLab (engine/overworld/auto_movement.asm):
--- DOWN x5, LEFT, DOWN x5, RIGHT x3, UP -- Oak's last step lands on the
--- lab door (12,11). (The trailing NPC_CHANGE_FACING is a march-in-
--- place beat on the mat; here Oak just stands his final beat.)
-escort.oakSteps = {
- "down", "down", "down", "down", "down",
- "left",
- "down", "down", "down", "down", "down",
- "right", "right", "right",
- "up",
-}
+-- RLEList_ProfOakWalkToLab (engine/overworld/auto_movement.asm).
+-- Yellow differs: first DOWN is x6 (Oak starts one tile farther north).
+local function buildOakSteps()
+ if GameVersion.isYellow() then
+ return {
+ "down", "down", "down", "down", "down", "down",
+ "left",
+ "down", "down", "down", "down", "down",
+ "right", "right", "right",
+ "up",
+ }
+ end
+ return {
+ "down", "down", "down", "down", "down",
+ "left",
+ "down", "down", "down", "down", "down",
+ "right", "right", "right",
+ "up",
+ }
+end
--- RLEList_PlayerWalkToLab decodes to UP x2, RIGHT x3, DOWN x5, LEFT,
--- DOWN x6 and plays in REVERSE buffer order (wSimulatedJoypadStatesEnd
--- grows downward): DOWN x6, LEFT, DOWN x5, RIGHT x3, UP x2 -- Oak's
--- exact path one step behind. The 17th press (the second UP) is eaten
--- by the door-warp frame (WarpFound clears hJoyHeld via EnterMap), so
--- only 16 real steps happen; the walk ends on the door at (12,11).
+escort.oakSteps = buildOakSteps()
+
+-- Player stays one step behind Oak (simplified reverse-RLE port).
escort.playerSteps = { "down" }
for _, d in ipairs(escort.oakSteps) do
escort.playerSteps[#escort.playerSteps + 1] = d
end
+local function npcNamed(ow, name)
+ for _, n in ipairs(ow.npcs or {}) do
+ if n.def and n.def.name == name then return n end
+ end
+ return nil
+end
+
M.PALLET_TOWN = {
talk = require("data.scripts.pallet_town").talk,
escort = escort,
- -- Oak stops you at the north row (PalletTownDefaultScript's
- -- `wYCoord == 1` check), walks up from (8,5), and leads you to his
- -- lab with the player one step behind (scripts/PalletTown.asm +
- -- PalletMovementScriptPointerTable in
- -- engine/overworld/auto_movement.asm), then the lab walk-in and the
- -- choose-mon exchange (scripts/OaksLab.asm OaksLabDefaultScript ..
- -- OaksLabOakChooseMonSpeechScript).
+ -- Red: stop at y==1 from (8,5). Yellow: stop at y==0 from (10,4),
+ -- then a wild Pikachu battle before the lab escort (pokeyellow
+ -- PalletTownPikachuBattleScript).
onStep = function(game, ow, x, y)
- if y ~= 1 or game.save.flags.EVENT_FOLLOWED_OAK_INTO_LAB
+ local yellow = GameVersion.isYellow()
+ local stopY = yellow and 0 or 1
+ if y ~= stopY or game.save.flags.EVENT_FOLLOWED_OAK_INTO_LAB
or game.save.flags.EVENT_GOT_STARTER then
return false
end
local TextBox = require("src.render.TextBox")
local Commands = require("src.script.Commands")
local Music = require("src.core.Music")
+ local BattleState = require("src.battle.BattleState")
local t = game.data.text
local ctx = { save = game.save, game = game, overworld = ow }
- -- PalletTownDefaultScript: stop the player, turn them around
- -- (wPlayerMovingDirection = PLAYER_DIR_DOWN applies on the very
- -- next frame, before the text box opens) and strike up the "oak
- -- appears" theme (MUSIC_MEET_PROF_OAK)
- ow.player.facing = "down"
+ -- Red turns the player down; Yellow faces up at the north exit.
+ ow.player.facing = yellow and "up" or "down"
Music.play(game.data, "Music_MeetProfOak")
- -- DelayFrames-style hold: the world pauses (input stays locked)
- -- for `frames` frames, then cb runs. Reuses the emote pause slot;
- -- with an `npc` the "!" bubble draws above it (EmotionBubble).
local function hold(frames, npc, cb)
ow.emote = { frames = frames, npc = npc, onDone = cb }
end
- -- chain single-tile scriptMoves through a direction list
local function walkList(entity, steps, done)
local i = 0
local function nextStep()
@@ -114,10 +125,8 @@ M.PALLET_TOWN = {
nextStep()
end
- -- ---- Oak's Lab side (scripts/OaksLab.asm) ----------------------
-
- -- OaksLabOakChooseMonSpeechScript: the fed-up / choose-mon /
- -- what-about-me / be-patient exchange, Delay3 between boxes
+ -- OaksLabOakChooseMonSpeechScript. Yellow's OakChooseMon text is
+ -- the single-ball speech, not Red's "there are 3 POKéMON".
local function chooseMonSpeech()
local function say(key, fb, next)
game.stack:push(TextBox.new(game, t[key] or fb, next))
@@ -126,7 +135,9 @@ M.PALLET_TOWN = {
"{RIVAL}: Gramps!\nI'm fed up with\nwaiting!", function()
hold(3, nil, function()
say("_OaksLabOakChooseMonText",
- "OAK: Here, {PLAYER}!\fThere are 3\nPOKéMON here!\fYou can have one!\nChoose!", function()
+ yellow
+ and "OAK: Look, {PLAYER}! Do\nyou see that ball\non the table?"
+ or "OAK: Here, {PLAYER}!\fThere are 3\nPOKéMON here!\fYou can have one!\nChoose!", function()
hold(3, nil, function()
say("_OaksLabRivalWhatAboutMeText",
"{RIVAL}: Hey!\nGramps! What\nabout me?", function()
@@ -143,30 +154,18 @@ M.PALLET_TOWN = {
end)
end
- -- entering the lab: the door Oak (OAKSLAB_OAK2, (5,10)) walks up 3
- -- ahead of the player (OaksLabOakEntersLabScript OakEntryMovement),
- -- swaps for the desk Oak (OAKSLAB_OAK1, (5,2)), then the player
- -- walks up 8 from the mat (PlayerEntryMovementRLE) while the rival
- -- and Oak turn with them (OaksLabPlayerEntersLabScript /
- -- OaksLabFollowedOakScript)
+ -- Door Oak is OAKSLAB_OAK2: Red index 8, Yellow index 6 (one ball).
local function labWalkIn()
- local oak2 = ow:npcByIndex(8)
+ local oak2 = npcNamed(ow, "OAKSLAB_OAK2") or ow:npcByIndex(yellow and 6 or 8)
local function swapOaks()
Commands.hide_object(ctx, "OAKS_LAB", "OAKSLAB_OAK2")
Commands.show_object(ctx, "OAKS_LAB", "OAKSLAB_OAK1")
- hold(3, nil, function() -- Delay3
- Commands.face_object(ctx, 1, "down") -- rival watches you pass
+ hold(3, nil, function()
+ Commands.face_object(ctx, 1, "down")
ow:scriptMove(ow.player, "up", 8, function()
- -- OaksLabFollowedOakScript: flags only after the walk-in, so a
- -- stray step on the door mat can't fire the "don't go away"
- -- push-up (oaks_lab.lua onStep) mid-cutscene. Outdoor escort
- -- still re-arms on F1 mid-escort -- these flags stay clear
- -- until the lab walk finishes.
game.save.flags.EVENT_FOLLOWED_OAK_INTO_LAB = true
game.save.flags.EVENT_FOLLOWED_OAK_INTO_LAB_2 = true
Commands.face_object(ctx, 1, "up")
- -- res BIT_NO_MAP_MUSIC + PlayDefaultMusic: the lab theme
- -- only starts once the walk-in is done
Music.playMap(game.data, "OAKS_LAB")
chooseMonSpeech()
end)
@@ -179,9 +178,6 @@ M.PALLET_TOWN = {
end
end
- -- PalletMovementScript_Done + the door warp: Oak is hidden as the
- -- player steps into the doorway; PALLET_TOWN warp 3 -> OAKS_LAB
- -- warp 2 = (5,11), with the door SFX (WarpFound -> SFX_GO_INSIDE)
local function enterLab()
Commands.hide_object(ctx, "PALLET_TOWN", "PALLETTOWN_OAK")
Commands.show_object(ctx, "OAKS_LAB", "OAKSLAB_OAK2")
@@ -190,10 +186,6 @@ M.PALLET_TOWN = {
{ keepMusic = true })
end
- -- PalletMovementScript_WalkToLab: Oak's NPC movement and the
- -- player's simulated joypad run simultaneously, in lockstep; the
- -- player retraces Oak's path one step behind and follows him into
- -- the doorway on the final beat
local function walkToLab(oak)
local i = 0
local function tick()
@@ -206,9 +198,6 @@ M.PALLET_TOWN = {
if oak and escort.oakSteps[i] then
ow:scriptMove(oak, escort.oakSteps[i], 1)
elseif oak then
- -- RLEList_ProfOakWalkToLab's trailing NPC_CHANGE_FACING beat:
- -- Oak marches in place on the door mat while the player takes
- -- the final step up behind him (movement.asm ChangeFacingDirection)
ow:marchInPlace(oak)
end
ow:scriptMove(ow.player, playerStep, 1, tick)
@@ -216,9 +205,6 @@ M.PALLET_TOWN = {
tick()
end
- -- PalletMovementScript_OakMoveLeft/_PlayerMoveLeft: from the right
- -- tile (x == 11) Oak sidesteps left first, then the player follows
- -- left (wNumStepsToTake = wXCoord - 10), and only then both walk
local function escortToLab(oak)
local numSteps = x - 10
if oak and numSteps > 0 then
@@ -232,37 +218,65 @@ M.PALLET_TOWN = {
end
end
- -- ---- Pallet Town side (scripts/PalletTown.asm) -----------------
+ -- After Oak reaches the player: Red goes straight to "It's unsafe!".
+ -- Yellow (PalletTownOakGreetsPlayerScript..AfterPikachuBattleScript):
+ -- ThatWasClose -> Oak faces the grass patch -> BATTLE_TYPE_PIKACHU
+ -- (the old-man-style simulated battle where PROF.OAK throws the ball
+ -- and always catches the lv5 Pikachu) -> Whew -> ComeWithMe.
+ local function afterOakArrives(oak)
+ if not yellow then
+ game.stack:push(TextBox.new(game,
+ t._PalletTownOakItsUnsafeText
+ or "OAK: It's unsafe!\nWild POKéMON\nlive in tall grass!",
+ function() escortToLab(oak) end))
+ return
+ end
+ local function comeWithMe()
+ game.stack:push(TextBox.new(game,
+ t._PalletTownOakComeWithMe
+ or "OAK: Here, come with\nme!",
+ function() escortToLab(oak) end))
+ end
+ local function afterPikaBattle()
+ if oak then oak.facing = "up" end
+ game.stack:push(TextBox.new(game,
+ t._PalletTownOakWhewText or "OAK: Whew...",
+ comeWithMe))
+ end
+ game.stack:push(TextBox.new(game,
+ t._PalletTownOakThatWasCloseText
+ or "OAK: That was\nclose!\fWild POKéMON live\nin tall grass!",
+ function()
+ -- Oak turns toward the horizontally adjacent grass (left exit
+ -- looks right, right exit looks left -- the
+ -- EVENT_PLAYER_AT_RIGHT_EXIT_TO_PALLET_TOWN branch)
+ if oak then oak.facing = x == 10 and "right" or "left" end
+ local battle = BattleState.newWild(game, "PIKACHU", 5)
+ battle:makeOldManDemo("PROF.OAK")
+ battle.onFinish = function()
+ afterPikaBattle()
+ end
+ game.stack:push(battle)
+ end))
+ end
- -- PalletTownOakWalksToPlayerScript: Oak appears at (8,5), faces up
- -- (SetSpriteFacingDirectionAndDelay + Delay3), then zigzags to the
- -- player; the "It's unsafe!" text follows and the escort begins
local function oakAppearsAndWalks()
Commands.show_object(ctx, "PALLET_TOWN", "PALLETTOWN_OAK")
- local oak = ow:npcByIndex(1)
+ local oak = npcNamed(ow, "PALLETTOWN_OAK") or ow:npcByIndex(1)
if oak then oak.facing = "up" end
hold(6, nil, function()
walkList(oak, escort.oakApproach(x), function()
- -- PalletTownOakNotSafeComeWithMeScript: the second text waits
- -- for a button, then the escort starts
- game.stack:push(TextBox.new(game,
- t._PalletTownOakItsUnsafeText
- or "OAK: It's unsafe!\nWild POKéMON\nlive in tall grass!",
- function() escortToLab(oak) end))
+ afterOakArrives(oak)
end)
end)
end
- -- The "Hey! Wait!" box ends without a button wait (auto), then the
- -- "!" bubble shows over the player WHILE the box is still on screen
- -- (PalletTownOakText: DelayFrames 10 then EmotionBubble, box not yet
- -- cleared). onOverlap sets the bubble during the box's last frames;
- -- the box pops after `overlap`, and the bubble's 60-frame hold then
- -- runs to Oak's appearance (the bubble is static while the box is up,
- -- since the overworld pauses under it, so 10 overlap + 50 = 60).
game.stack:push(TextBox.new(game,
t._PalletTownOakHeyWaitDontGoOutText or "OAK: Hey! Wait!\nDon't go out!",
nil, { auto = { delay = 10, overlap = 10, onOverlap = function()
+ -- .HeyWaitDontGoOutText turns the player to face down (toward
+ -- the approaching Oak) before the exclamation bubble
+ ow.player.facing = "down"
ow.emote = { npc = ow.player, frames = 50, onDone = oakAppearsAndWalks }
end } }))
return true
diff --git a/data/scripts/story4.lua b/data/scripts/story4.lua
index dec82576..598831ff 100644
--- a/data/scripts/story4.lua
+++ b/data/scripts/story4.lua
@@ -37,16 +37,15 @@ local function countOwned(save)
return n
end
-local function oaksAide(threshold, itemId)
+local function oaksAide(threshold, itemId, repeatText)
return function(game, ow, npc, done)
local t = text(game)
local flags = game.save.flags
local itemName = game.data.items[itemId].name
local flag = "EVENT_GOT_" .. itemId
if flags[flag] then
- push(game, fill(t._OaksAideComeBackText or
- "I already gave\nyou the {RAM:}!",
- { num = threshold, ram = itemName }), done)
+ push(game, t[repeatText] or
+ fill("I already gave\nyou the {RAM:}!", { ram = itemName }), done)
return
end
ask(game, fill(t._OaksAideHiText or
@@ -83,13 +82,16 @@ local function oaksAide(threshold, itemId)
end
M.ROUTE_2_GATE = {
- talk = { TEXT_ROUTE2GATE_OAKS_AIDE = oaksAide(10, "HM_FLASH") },
+ talk = { TEXT_ROUTE2GATE_OAKS_AIDE = oaksAide(10, "HM_FLASH",
+ "_Route2GateOaksAideFlashExplanationText") },
}
M.ROUTE_11_GATE_2F = {
- talk = { TEXT_ROUTE11GATE2F_OAKS_AIDE = oaksAide(30, "ITEMFINDER") },
+ talk = { TEXT_ROUTE11GATE2F_OAKS_AIDE = oaksAide(30, "ITEMFINDER",
+ "_Route11Gate2FOaksAideItemfinderDescriptionText") },
}
M.ROUTE_15_GATE_2F = {
- talk = { TEXT_ROUTE15GATE2F_OAKS_AIDE = oaksAide(50, "EXP_ALL") },
+ talk = { TEXT_ROUTE15GATE2F_OAKS_AIDE = oaksAide(50, "EXP_ALL",
+ "_Route15Gate2FOaksAideExpAllText") },
}
-- -------------------------------------------------------------------
diff --git a/data/scripts/story6.lua b/data/scripts/story6.lua
index 297a711e..d847c09b 100644
--- a/data/scripts/story6.lua
+++ b/data/scripts/story6.lua
@@ -173,7 +173,46 @@ local function syncGymGatesAfterBattle(game, ow)
applyGymGates(game, ow)
end
+-- Yellow's quiz-first rule (scripts/CinnabarGym.asm SuperNerd2..7): a
+-- gate guardian refuses to battle until his quiz was attempted -- a
+-- wrong answer sics him on you (the onInteract path below), a right one
+-- opens his gate; walking up and talking first just gets the room's
+-- CinnabarGymText_N lecture (Func_f2150's pointer table).
+local function yellowQuizTalk(machineIndex)
+ return function(game, ow, npc, done)
+ local yellow = require("src.core.GameVersion").isYellow()
+ local defeated = ow:trainerDefeated(npc)
+ local gateOpen = game.save.flags[gymGateFlag(machineIndex)]
+ if yellow and not defeated and not gateOpen then
+ local TextBox = require("src.render.TextBox")
+ local t = game.data.text
+ game.stack:push(TextBox.new(game,
+ t["_CinnabarGymText_" .. machineIndex]
+ or "You have to take\nthe quiz first!", done))
+ return
+ end
+ -- gate open (or Red/Blue): the ordinary trainer engagement /
+ -- after-battle line, mirroring talkTo's generic trainer branch
+ npc:facePlayer(ow.player)
+ if not defeated then
+ ow:engageTrainer(npc, done)
+ return
+ end
+ local header = game.data:trainerHeader(ow.map.def.label, npc.def.index)
+ local after = header and header.after and game.data.text[header.after]
+ local TextBox = require("src.render.TextBox")
+ game.stack:push(TextBox.new(game, after or "...", done))
+ end
+end
+
M.CINNABAR_GYM = {
+ talk = (function()
+ local talk = {}
+ for i = 1, 6 do
+ talk["TEXT_CINNABARGYM_SUPER_NERD" .. (i + 1)] = yellowQuizTalk(i)
+ end
+ return talk
+ end)(),
onEnter = applyGymGates,
onVictory = syncGymGatesAfterBattle,
onInteract = function(game, ow, fx, fy)
diff --git a/data/scripts/yellow_beach_house.lua b/data/scripts/yellow_beach_house.lua
new file mode 100644
index 00000000..3352bee1
--- /dev/null
+++ b/data/scripts/yellow_beach_house.lua
@@ -0,0 +1,131 @@
+-- Summer Beach House (scripts/SummerBeachHouse.asm), Yellow's Route 19
+-- surf shack. The Surfin' Dude only lets a party Pikachu that knows
+-- SURF ride (IsSurfingPikachuInParty, home/map_objects.asm); saying yes
+-- runs the Surfing Pikachu minigame (src/ui/SurfingMinigame.lua). The
+-- corner printer shows/prints the high score once you have surfed this
+-- visit (BIT_PIKACHU_MAP_SURF_SELECT is a per-map-load flag, so the
+-- session markers live on the overworld state, not the save).
+
+local function surfingPikachu(game)
+ for _, mon in ipairs(game.save.party or {}) do
+ if mon.species == "PIKACHU" then
+ for _, mv in ipairs(mon.moves or {}) do
+ if mv.id == "SURF" then return mon end
+ end
+ end
+ end
+ return nil
+end
+
+local function push(game, text, done)
+ local TextBox = require("src.render.TextBox")
+ game.stack:push(TextBox.new(game, text, done))
+end
+
+-- the two-variant posters: the surf-capable line once a surfing
+-- Pikachu is along, the plain one otherwise
+local function poster(n)
+ return function(game, ow, npc, done)
+ local t = game.data.text
+ local key = ("_SummerBeachHousePoster%dText%d"):format(
+ n, surfingPikachu(game) and 1 or 2)
+ push(game, t[key] or "A surfing poster.", done)
+ end
+end
+
+return {
+ SUMMER_BEACH_HOUSE = {
+ talk = {
+ TEXT_SUMMERBEACHHOUSE_SURFINDUDE = function(game, ow, npc, done)
+ local t = game.data.text
+ if not surfingPikachu(game) then
+ push(game, t._SummerBeachHouseSurfinDudeText4
+ or "Dogs and burgers\non special today!", done)
+ return
+ end
+ -- Text1 on the first ask each visit, the short Text3 after
+ local ask = ow.surfinDudeAsked
+ and (t._SummerBeachHouseSurfinDudeText3 or "Wanna go SURF?")
+ or (t._SummerBeachHouseSurfinDudeText1
+ or "Whoa!\nYour PIKACHU knows\nhow to SURF!\fGive it a go?")
+ ow.surfinDudeAsked = true
+ push(game, ask, function()
+ local ChoiceBox = require("src.ui.ChoiceBox")
+ game.stack:push(ChoiceBox.new(game, function(yes)
+ if not yes then
+ push(game, t._SummerBeachHouseSurfinDudeText2
+ or "Come SURF anytime,\nmy friend!", done)
+ return
+ end
+ local SurfingMinigame = require("src.ui.SurfingMinigame")
+ game.stack:push(SurfingMinigame.new(game, function()
+ ow.surfedThisVisit = true -- BIT_PIKACHU_MAP_SURF_SELECT
+ require("src.core.Music").playMap(game.data, ow.map.id)
+ done()
+ end))
+ end))
+ end)
+ end,
+
+ TEXT_SUMMERBEACHHOUSE_PIKACHU = function(game, ow, npc, done)
+ local t = game.data.text
+ push(game, t._SummerBeachHousePikachuText or "PIKACHU: Pikaa!",
+ function()
+ require("src.core.Sound").playCry(game.data, "PIKACHU")
+ done()
+ end)
+ end,
+
+ TEXT_SUMMERBEACHHOUSE_POSTER1 = poster(1),
+ TEXT_SUMMERBEACHHOUSE_POSTER2 = poster(2),
+ TEXT_SUMMERBEACHHOUSE_POSTER3 = poster(3),
+
+ TEXT_SUMMERBEACHHOUSE_PRINTER = function(game, ow, npc, done)
+ local t = game.data.text
+ if not surfingPikachu(game) then
+ push(game, t._SummerBeachHousePrinterText1
+ or "It's some sort of\na machine...", done)
+ return
+ end
+ push(game, t._SummerBeachHousePrinterText2
+ or "SUMMER BEACH HOUSE\nPRINTER, it says.", function()
+ if not ow.surfedThisVisit then
+ done()
+ return
+ end
+ push(game, t._SummerBeachHousePrinterText3
+ or "The Hi-Score is\nshown.\fPRINT it out?", function()
+ local ChoiceBox = require("src.ui.ChoiceBox")
+ game.stack:push(ChoiceBox.new(game, function(yes)
+ if not yes then
+ done()
+ return
+ end
+ -- PrintSurfingMinigameHighScore -> PNG stand-in
+ local Printer = require("src.core.Printer")
+ local Font = require("src.render.Font")
+ local Strings = require("src.core.Strings")
+ local hi = game.save.surfingHighScore or 0
+ local name = game.save.player.name or "RED"
+ local saved, err = Printer.save("surf_hiscore", 160, 64,
+ function()
+ love.graphics.setColor(1, 1, 1, 1)
+ love.graphics.rectangle("fill", 0, 0, 160, 64)
+ love.graphics.setColor(0, 0, 0, 1)
+ love.graphics.rectangle("line", 2.5, 2.5, 155, 59)
+ Font.draw(Strings("SUMMER BEACH HOUSE"), 8, 10)
+ Font.draw(Strings("SURFING Hi-Score"), 8, 24)
+ Font.draw(name, 8, 40)
+ Font.draw(Strings("%d pts", hi), 96, 40)
+ end)
+ push(game, saved
+ and Strings("Printed!\fSaved as\n%s\vin the save\nfolder.",
+ saved)
+ or Strings("Printer error!\n%s", tostring(err)), done)
+ end))
+ end)
+ end)
+ end,
+ },
+ },
+}
diff --git a/data/scripts/yellow_gifts.lua b/data/scripts/yellow_gifts.lua
new file mode 100644
index 00000000..17460594
--- /dev/null
+++ b/data/scripts/yellow_gifts.lua
@@ -0,0 +1,102 @@
+-- Yellow's three Kanto-starter side-quests, hand-ported from
+-- scripts/CeruleanMelaniesHouse.asm, scripts/Route24.asm
+-- (Route24CooltrainerM4Text) and scripts/VermilionCity_2.asm
+-- (VermilionCityPrintOfficerJennyText). Registered on top of the shared
+-- Red map scripts by data/scripts/init.lua on a Yellow boot only, so the
+-- table keys compose with story.lua / story4.lua's existing entries.
+
+local M = {}
+
+-- Melanie hands over her Bulbasaur once the starter Pikachu trusts you
+-- (wPikachuHappiness >= 147).
+M.CERULEAN_MELANIES_HOUSE = {
+ talk = {
+ TEXT_CERULEANMELANIESHOUSE_MELANIE = function(game, ow, npc, done)
+ local rows = { { "face_player" } }
+ if game.save.flags.EVENT_GOT_BULBASAUR_IN_CERULEAN then
+ rows[#rows + 1] = { "show_text", "MelanieText4" }
+ elseif (game.save.pikachuHappiness or 90) < 147 then
+ rows[#rows + 1] = { "show_text", "MelanieText1" }
+ else
+ rows[#rows + 1] = { "show_text", "MelanieText1" }
+ rows[#rows + 1] = { "ask", "MelanieText2" }
+ rows[#rows + 1] = { "jump_if_false", "declined" }
+ rows[#rows + 1] = { "give_pokemon", "BULBASAUR", 10 }
+ rows[#rows + 1] = { "jump_if_false", "end" } -- party + box full
+ rows[#rows + 1] = { "show_text", "MelanieText3" }
+ rows[#rows + 1] = { "hide_object", "CERULEAN_MELANIES_HOUSE",
+ "CERULEANMELANIESHOUSE_BULBASAUR" }
+ rows[#rows + 1] = { "set_flag", "EVENT_GOT_BULBASAUR_IN_CERULEAN" }
+ rows[#rows + 1] = { "jump", "end" }
+ rows[#rows + 1] = { "label", "declined" }
+ rows[#rows + 1] = { "show_text", "MelanieText5" }
+ end
+ ow.runner:run(rows, { npc = npc, onDone = done })
+ end,
+ -- pet flavor: the text with the species' cry over it
+ TEXT_CERULEANMELANIESHOUSE_BULBASAUR = {
+ { "play_cry", "BULBASAUR" },
+ { "show_text", "MelanieBulbasaurText" },
+ },
+ TEXT_CERULEANMELANIESHOUSE_ODDISH = {
+ { "play_cry", "ODDISH" },
+ { "show_text", "MelanieOddishText" },
+ },
+ TEXT_CERULEANMELANIESHOUSE_SANDSHREW = {
+ { "play_cry", "SANDSHREW" },
+ { "show_text", "MelanieSandshrewText" },
+ },
+ },
+}
+
+-- Damian gives away the Charmander he thinks is too weak (EVENT_54F).
+M.ROUTE_24 = {
+ talk = {
+ TEXT_ROUTE24_COOLTRAINER_M4 = {
+ { "face_player" },
+ { "check_flag", "EVENT_54F" },
+ { "jump_if_true", "after" },
+ { "ask", "_Route24DamianText1" },
+ { "jump_if_false", "declined" },
+ { "give_pokemon", "CHARMANDER", 10 },
+ { "jump_if_false", "end" },
+ { "show_text", "_Route24DamianText2" },
+ { "set_flag", "EVENT_54F" },
+ { "jump", "end" },
+ { "label", "declined" },
+ { "show_text", "_Route24DamianText3" },
+ { "jump", "end" },
+ { "label", "after" },
+ { "show_text", "_Route24DamianText4" },
+ },
+ },
+}
+
+-- Officer Jenny's Squirtle: kept until you carry the Thunder Badge.
+M.VERMILION_CITY = {
+ talk = {
+ TEXT_VERMILIONCITY_OFFICER_JENNY = function(game, ow, npc, done)
+ local rows = { { "face_player" } }
+ if game.save.flags.EVENT_GOT_SQUIRTLE_FROM_OFFICER_JENNY then
+ rows[#rows + 1] = { "show_text", "_OfficerJennyText5" }
+ elseif not (game.save.inventory
+ and game.save.inventory.THUNDERBADGE) then
+ rows[#rows + 1] = { "show_text", "_OfficerJennyText1" }
+ else
+ rows[#rows + 1] = { "ask", "_OfficerJennyText2" }
+ rows[#rows + 1] = { "jump_if_false", "declined" }
+ rows[#rows + 1] = { "give_pokemon", "SQUIRTLE", 10 }
+ rows[#rows + 1] = { "jump_if_false", "end" }
+ rows[#rows + 1] = { "show_text", "_OfficerJennyText3" }
+ rows[#rows + 1] = { "set_flag",
+ "EVENT_GOT_SQUIRTLE_FROM_OFFICER_JENNY" }
+ rows[#rows + 1] = { "jump", "end" }
+ rows[#rows + 1] = { "label", "declined" }
+ rows[#rows + 1] = { "show_text", "_OfficerJennyText4" }
+ end
+ ow.runner:run(rows, { npc = npc, onDone = done })
+ end,
+ },
+}
+
+return M
diff --git a/data/scripts/yellow_jessie_james.lua b/data/scripts/yellow_jessie_james.lua
new file mode 100644
index 00000000..3a16dc57
--- /dev/null
+++ b/data/scripts/yellow_jessie_james.lua
@@ -0,0 +1,261 @@
+-- Jessie & James, Yellow's Team Rocket duo, at all four ambush sites:
+-- Mt Moon B2F (scripts/MtMoonB2F.asm), Rocket Hideout B4F
+-- (scripts/RocketHideoutB4F.asm), Pokemon Tower 7F
+-- (scripts/PokemonTower7F.asm) and Silph Co 11F (scripts/SilphCo11F.asm).
+-- Every site shares one shape: a coordinate trigger swaps the map theme
+-- for Music_MeetJessieJames, the motto plays, the duo closes in, one
+-- battle against the shared OPP_ROCKET party fights them both, and after
+-- their parting lines they vanish together under a second sting of the
+-- theme before the map theme resumes (PlayDefaultMusic ->
+-- play_default_music).
+--
+-- Registered on top of the shared tables by data/scripts/init.lua on a
+-- Yellow boot; MT_MOON_B2F's onStep chains story2's Super Nerd / fossil
+-- trigger and SILPH_CO_11F's chains story's Giovanni trigger, since
+-- non-talk hooks replace rather than merge.
+
+local M = {}
+
+-- Capture the FUNCTION, not the table: attachBase stores the module
+-- table itself, so once this file's onStep is attached the table's slot
+-- points back here -- delegating through the table would self-recurse.
+local baseMtMoonStep = require("data.scripts.story2").MT_MOON_B2F.onStep
+local baseSilph11Step = require("data.scripts.story").SILPH_CO_11F.onStep
+
+M.MT_MOON_B2F = {
+ talk = {
+ TEXT_MTMOONB2F_JESSIE = {
+ { "face_player" }, { "show_text", "_MtMoonJessieJamesText1" },
+ },
+ TEXT_MTMOONB2F_JAMES = {
+ { "face_player" }, { "show_text", "_MtMoonJessieJamesText1" },
+ },
+ },
+
+ onStep = function(game, ow, x, y)
+ if baseMtMoonStep and baseMtMoonStep(game, ow, x, y) then
+ return true
+ end
+ local f = game.save.flags
+ if x ~= 3 or y ~= 5 then return false end
+ if f.EVENT_BEAT_MT_MOON_3_JESSIE_JAMES then return false end
+ if not (f.EVENT_GOT_DOME_FOSSIL or f.EVENT_GOT_HELIX_FOSSIL) then
+ return false
+ end
+ ow.runner:run({
+ { "stop_music" },
+ { "play_music", "Music_MeetJessieJames" },
+ { "show_object", "MT_MOON_B2F", "MTMOONB2F_JESSIE" },
+ { "show_object", "MT_MOON_B2F", "MTMOONB2F_JAMES" },
+ { "show_text", "_MtMoonJessieJamesText1" },
+ { "face_player_dir", "right" },
+ { "show_text", "_MtMoonJessieJamesText2" },
+ { "start_battle", "trainer", "OPP_ROCKET", 42 },
+ { "check_battle_result", "win" },
+ { "jump_if_false", "end" },
+ { "show_text", "_MtMoonJessieJamesText3" },
+ { "show_text", "_MtMoonJessieJamesText4" },
+ { "stop_music" },
+ { "play_music", "Music_MeetJessieJames" },
+ { "hide_object", "MT_MOON_B2F", "MTMOONB2F_JESSIE" },
+ { "hide_object", "MT_MOON_B2F", "MTMOONB2F_JAMES" },
+ { "play_default_music" },
+ { "set_flag", "EVENT_BEAT_MT_MOON_3_JESSIE_JAMES" },
+ }, {})
+ return true
+ end,
+}
+
+-- -------------------------------------------------------------------
+-- Rocket Hideout B4F (RocketHideoutB4FScript_455a5..Script13): the
+-- motto plays from off-screen FIRST, then the duo pops in at (25,10) /
+-- (24,10) and whichever of them shares the player's column ($18=24 or
+-- $19=25, EVENT_ROCKET_HIDEOUT_4_JESSIE_JAMES_ON_LEFT) walks the three
+-- tiles down to loom over the player while the other steps one. A loss
+-- re-hides them (RocketHideoutB4FResetScripts via EVENT_6A0), so the
+-- trigger re-arms clean.
+-- -------------------------------------------------------------------
+
+M.ROCKET_HIDEOUT_B4F = {
+ talk = {
+ TEXT_ROCKETHIDEOUTB4F_JESSIE = {
+ { "face_player" }, { "show_text", "_RocketHideoutJessieJamesText1" },
+ },
+ TEXT_ROCKETHIDEOUTB4F_JAMES = {
+ { "face_player" }, { "show_text", "_RocketHideoutJessieJamesText1" },
+ },
+ },
+
+ onStep = function(game, ow, x, y)
+ local f = game.save.flags
+ if y ~= 14 or (x ~= 24 and x ~= 25) then return false end
+ if f.EVENT_BEAT_ROCKET_HIDEOUT_4_JESSIE_JAMES then return false end
+ -- ON_LEFT: player under James's column (25); movement data pairs
+ -- RocketHideoutB4FJessieJamesMovementData_45605/45606 swap so the
+ -- column-mate walks 3, the other 1.
+ local onLeft = (x == 25)
+ ow.runner:run({
+ { "stop_music" },
+ { "play_music", "Music_MeetJessieJames" },
+ { "show_text", "_RocketHideoutJessieJamesText1" },
+ { "face_player_dir", "up" },
+ { "emote", "player", "shock", 30 },
+ { "show_object", "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_JAMES" },
+ { "show_object", "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_JESSIE" },
+ -- James (object 2) then Jessie (object 3), Script4..Script9 order
+ { "walk_npc", 2, onLeft and { "down", "down", "down" } or { "down" } },
+ { "face_object", 2, onLeft and "down" or "left" },
+ { "walk_npc", 3, onLeft and { "down" } or { "down", "down", "down" } },
+ { "face_object", 3, onLeft and "right" or "down" },
+ { "show_text", "_RocketHideoutJessieJamesText2" },
+ { "start_battle", "trainer", "OPP_ROCKET", 43 },
+ { "check_battle_result", "win" },
+ { "jump_if_false", "lost" },
+ { "show_text", "_RocketHideoutJessieJamesText3" },
+ { "show_text", "_RocketHideoutJessieJamesText4" },
+ { "stop_music" },
+ { "play_music", "Music_MeetJessieJames" },
+ { "fade", "out" },
+ { "hide_object", "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_JAMES" },
+ { "hide_object", "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_JESSIE" },
+ { "fade", "in" },
+ { "play_default_music" },
+ { "set_flag", "EVENT_BEAT_ROCKET_HIDEOUT_4_JESSIE_JAMES" },
+ { "jump", "end" },
+ { "label", "lost" },
+ { "hide_object", "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_JAMES" },
+ { "hide_object", "ROCKET_HIDEOUT_B4F", "ROCKETHIDEOUTB4F_JESSIE" },
+ }, {})
+ return true
+ end,
+}
+
+-- -------------------------------------------------------------------
+-- Pokemon Tower 7F (PokemonTower7FScript_60d2a..Script10): same beat
+-- one floor below Fuji, except the duo pops in BEFORE the motto and
+-- Jessie ($a=10 column) leads the walk-down; ON_LEFT ($b=11) hands the
+-- three-tile walk to James instead. On a loss vanilla only resets the
+-- script counter (the blackout warp reloads the map anyway).
+-- -------------------------------------------------------------------
+
+M.POKEMON_TOWER_7F = {
+ talk = {
+ TEXT_POKEMONTOWER7F_JESSIE = {
+ { "face_player" }, { "show_text", "_PokemonTowerJessieJamesText1" },
+ },
+ TEXT_POKEMONTOWER7F_JAMES = {
+ { "face_player" }, { "show_text", "_PokemonTowerJessieJamesText1" },
+ },
+ },
+
+ onStep = function(game, ow, x, y)
+ local f = game.save.flags
+ if y ~= 12 or (x ~= 10 and x ~= 11) then return false end
+ if f.EVENT_BEAT_POKEMONTOWER_7_JESSIE_JAMES then return false end
+ local onLeft = (x == 11) -- EVENT_POKEMONTOWER_7_JESSIE_JAMES_ON_LEFT
+ ow.runner:run({
+ { "stop_music" },
+ { "play_music", "Music_MeetJessieJames" },
+ { "show_object", "POKEMON_TOWER_7F", "POKEMONTOWER7F_JESSIE" },
+ { "show_object", "POKEMON_TOWER_7F", "POKEMONTOWER7F_JAMES" },
+ { "show_text", "_PokemonTowerJessieJamesText1" },
+ { "face_player_dir", "up" },
+ { "emote", "player", "shock", 30 },
+ -- Jessie (object 1) then James (object 2), Script1..Script6 order
+ { "walk_npc", 1, onLeft and { "down" } or { "down", "down", "down" } },
+ { "face_object", 1, onLeft and "right" or "down" },
+ { "walk_npc", 2, onLeft and { "down", "down", "down" } or { "down" } },
+ { "face_object", 2, onLeft and "down" or "left" },
+ { "show_text", "_PokemonTowerJessieJamesText2" },
+ { "start_battle", "trainer", "OPP_ROCKET", 44 },
+ { "check_battle_result", "win" },
+ { "jump_if_false", "end" },
+ { "show_text", "_PokemonTowerJessieJamesText3" },
+ { "show_text", "_PokemonTowerJessieJamesText4" },
+ { "stop_music" },
+ { "play_music", "Music_MeetJessieJames" },
+ { "fade", "out" },
+ { "hide_object", "POKEMON_TOWER_7F", "POKEMONTOWER7F_JESSIE" },
+ { "hide_object", "POKEMON_TOWER_7F", "POKEMONTOWER7F_JAMES" },
+ { "fade", "in" },
+ { "play_default_music" },
+ { "set_flag", "EVENT_BEAT_POKEMONTOWER_7_JESSIE_JAMES" },
+ }, {})
+ return true
+ end,
+}
+
+-- -------------------------------------------------------------------
+-- Silph Co 11F (SilphCo11FScript_6229c..Script14): the only site where
+-- the duo starts VISIBLE (toggleable_objects.asm keeps SILPHCO11F_JAMES
+-- / _JESSIE ON), flanking Giovanni at (2,8)/(3,8), so they are talkable
+-- before the ambush (SilphCo11FJessieJamesText = the full motto). The
+-- trigger is the top row (y=3, x<4); EVENT_780/EVENT_781 pick one of
+-- three approach paths (SilphCo11FMovementData_622f5..62311, $5=up
+-- $6=left) that route James then Jessie up to the player without ever
+-- crossing the player's tile. Their duo text lives in
+-- text/SilphCo10F.asm (_SilphCoJessieJamesText*).
+-- -------------------------------------------------------------------
+
+M.SILPH_CO_11F = {
+ talk = {
+ TEXT_SILPHCO11F_JESSIE = {
+ { "face_player" }, { "show_text", "_SilphCoJessieJamesText1" },
+ },
+ TEXT_SILPHCO11F_JAMES = {
+ { "face_player" }, { "show_text", "_SilphCoJessieJamesText1" },
+ },
+ },
+
+ onStep = function(game, ow, x, y)
+ if baseSilph11Step and baseSilph11Step(game, ow, x, y) then
+ return true
+ end
+ local f = game.save.flags
+ if y ~= 3 or x > 3 then return false end
+ if f.EVENT_BEAT_SILPH_CO_11F_JESSIE_JAMES then return false end
+ -- x==3 -> base path, x==2 -> EVENT_780 variant, x<=1 -> EVENT_781
+ local jamesDirs, jamesFace, jessieDirs, jessieFace
+ if x == 3 then
+ jamesDirs, jamesFace = { "up", "up", "up", "up", "up" }, "right"
+ jessieDirs, jessieFace = { "up", "up", "up", "up" }, "up"
+ elseif x == 2 then
+ jamesDirs, jamesFace = { "up", "up", "up", "up" }, "up"
+ jessieDirs, jessieFace = { "up", "up", "up", "up", "up" }, "left"
+ else
+ jamesDirs = { "up", "up", "left", "up", "up" }
+ jamesFace = "up"
+ jessieDirs = { "up", "up", "up", "left", "up", "up" }
+ jessieFace = "left"
+ end
+ ow.runner:run({
+ { "stop_music" },
+ { "play_music", "Music_MeetJessieJames" },
+ { "show_text", "_SilphCoJessieJamesText1" },
+ { "face_player_dir", "down" },
+ { "emote", "player", "shock", 30 },
+ -- James (object 4) then Jessie (object 6), Script5..Script10 order
+ { "walk_npc", 4, jamesDirs },
+ { "face_object", 4, jamesFace },
+ { "walk_npc", 6, jessieDirs },
+ { "face_object", 6, jessieFace },
+ { "show_text", "_SilphCoJessieJamesText2" },
+ { "start_battle", "trainer", "OPP_ROCKET", 45 },
+ { "check_battle_result", "win" },
+ { "jump_if_false", "end" },
+ { "show_text", "_SilphCoJessieJamesText3" },
+ { "show_text", "_SilphCoJessieJamesText4" },
+ { "stop_music" },
+ { "play_music", "Music_MeetJessieJames" },
+ { "fade", "out" },
+ { "hide_object", "SILPH_CO_11F", "SILPHCO11F_JAMES" },
+ { "hide_object", "SILPH_CO_11F", "SILPHCO11F_JESSIE" },
+ { "fade", "in" },
+ { "play_default_music" },
+ { "set_flag", "EVENT_BEAT_SILPH_CO_11F_JESSIE_JAMES" },
+ }, {})
+ return true
+ end,
+}
+
+return M
diff --git a/docs/blue-version.md b/docs/blue-version.md
deleted file mode 100644
index 313efb6a..00000000
--- a/docs/blue-version.md
+++ /dev/null
@@ -1,131 +0,0 @@
-# Building a Blue Version of the port
-
-pokered builds Red and Blue from one source tree: the Makefile
-assembles everything twice with `rgbasm -D _RED` or `-D _BLUE`, and
-every in-game difference sits in an `IF DEF(_RED)` / `IF DEF(_BLUE)`
-block. Our extraction pipeline resolves those conditionals the same
-way (`tools/extract/util.py` `ASM_DEFINES`), so most of a Blue build
-falls out of re-running the extractors. Only three things are
-hand-ported on the Lua side and need swapping by hand.
-
-## What differs between Red and Blue
-
-| Where (pokered) | What |
-| --- | --- |
-| `data/wild/maps/*.asm` (34 files) | Version-exclusive encounters (Red: Ekans, Oddish, Growlithe, Mankey, Scyther, Electabuzz, Blue: Sandshrew, Bellsprout, Vulpix, Meowth, Pinsir, Magmar) |
-| `data/pokemon/title_mons.asm` | The 16 title-screen Pokémon |
-| `engine/movie/title.asm` + `gfx/version.asm` | The "Red Version" / "Blue Version" ribbon |
-| `constants/player_constants.asm` | Preset names (Red: RED/ASH/JACK + BLUE/GARY/JOHN) |
-| `data/sgb/sgb_palettes.asm`, `sgb_border.asm` | Super Game Boy palettes and border |
-| `data/events/prizes.asm`, `prize_mon_levels.asm` | Game Corner prize mons, costs and levels |
-| `engine/movie/intro.asm`, `data/credits/credits_text.asm`, `engine/slots/slot_machine.asm`, `engine/battle/animations.asm`, `audio/sfx/save_3.asm` | Small gated tweaks (credits say "BLUE VERSION STAFF", etc.) |
-
-## Step 1, flip the extraction define
-
-`tools/extract/util.py`:
-
-```python
-ASM_DEFINES = {"_RED"} # -> {"_BLUE"}
-```
-
-Then regenerate everything (same as scripts/setup.sh does):
-
-```sh
-cd tools
-../.venv/bin/python3 build_data.py \
- --pokered /Users/bryanbassett/Documents/development/pokered \
- --out ../data/generated --assets ../assets/generated
-```
-
-This alone switches the wild encounters, preset names, SGB palettes
-and credits text. **Caveat:** `parse_preset_names` sanity-checks in
-`tools/extract/field.py:1193` expect "RED" in the player presets,
-relax that check for a Blue build (Blue's presets are BLUE/GARY/JOHN
-for the player and RED/ASH/JACK for the rival).
-
-`tools/extract/palettes.py` uses its own raw reader with hardcoded
-`IF DEF(_BLUE)` skipping (around line 44), invert that too, or port
-it to `read_asm` so `ASM_DEFINES` covers it.
-
-## Step 2, title screen (hand-ported)
-
-`src/ui/TitleState.lua`:
-
-1. **Ribbon art.** The extractor writes
- `assets/generated/title/red_version.png`; add `blue_version.png`
- to `gfx.extract_title` in `tools/extract/gfx.py` (source:
- `gfx/title/blue_version.png`, 64×8). In `TitleState:draw()`, the
- Red strip needs two quads (tiles 0–1 "Red", skip, tiles 5–9
- "Version", `title.asm` `VersionOnTitleScreenText`). Blue's strip
- prints its tiles contiguously (`db $61..$68`), so draw the whole
- 64×8 image at px (56, 64) and verify with the title driver
- screenshot.
-
-2. **Title mons.** Replace `CYCLE_SPECIES` with Blue's list from
- `data/pokemon/title_mons.asm`:
-
- ```lua
- local CYCLE_SPECIES = {
- "SQUIRTLE", "CHARMANDER", "BULBASAUR", "MANKEY", "HITMONLEE",
- "VULPIX", "CHANSEY", "AERODACTYL", "JOLTEON", "SNORLAX",
- "GLOOM", "POLIWAG", "DODUO", "PORYGON", "GENGAR", "RAICHU",
- }
- ```
-
-## Step 3, Game Corner prizes (hand-ported)
-
-`data/scripts/story3.lua` (~line 209) carries the Red prize tables.
-Blue's values (`prizes.asm` + `prize_mon_levels.asm`):
-
-| Prize | Cost | Level |
-| --- | --- | --- |
-| ABRA | 120 | 6 |
-| CLEFAIRY | 750 | 12 |
-| NIDORINO | 1200 | 17 |
-| PINSIR | 2500 | 20 |
-| DRATINI | 4600 | 24 |
-| PORYGON | 6500 | 18 |
-
-(TM prizes are identical in both versions.)
-
-## Step 4, verify
-
-```sh
-luajit tests/run_tests.lua
-```
-
-Plus two spot checks:
-
-```sh
-# every grass table must have exactly 10 slots (a conditional-parsing
-# regression shows up as 19–20 slots)
-luajit -e 'local e=dofile("data/generated/encounters.lua")
-for m,d in pairs(e) do if type(d)=="table" and d.grass and #d.grass.slots>0
- and #d.grass.slots~=10 then print("BAD",m,#d.grass.slots) end end'
-
-# a Blue exclusive should now appear (and Growlithe should not)
-grep -c VULPIX data/generated/encounters.lua
-grep -c GROWLITHE data/generated/encounters.lua
-```
-
-Title screenshot: run the driver in
-`tests/drivers/` style (`SHOT_DIR=... POKEPORT_DRIVER=... love .`) and
-eyeball the ribbon, title mon, and copyright row.
-
-## What you get for free / what to skip
-
-- Free after re-extraction: encounters (incl. Super Rod groups), SGB
- palettes, preset names, credits text, the gated sfx/animation
- tweaks.
-- Trades, gift Pokémon, story scripts, gym data: identical in Western
- Red/Blue, nothing to touch.
-- Save files: a Red save loads fine, but dex AREA nests and new
- encounters will be Blue's. Trainer parties are identical.
-
-## Making it a runtime toggle instead
-
-If you want one build with both versions, extraction would need to
-emit both branches keyed by version (e.g. `slots` / `slotsBlue`) and
-the three hand-ported spots would read a `save.version` or
-`conf.lua` flag. That is a bigger change than the rebuild above,
-the flip-and-regenerate route needs no engine changes at all.
diff --git a/docs/launcher.md b/docs/launcher.md
index f105a8d8..8bf8eb3f 100644
--- a/docs/launcher.md
+++ b/docs/launcher.md
@@ -202,3 +202,64 @@ column, slot card below Play, when the window is too narrow for both
(wheel, or drag on touch/desktop) clamped to their own content extent,
recomputed every draw. The tab bar labels only the active chip so it stays
narrow-safe, and content caps out at `~1440 * s` wide, centered.
+
+The desktop window has a floor of 480x360 (`conf.lua` `minwidth`/`minheight`),
+under which the cards stop being readable at all. Mobile ignores it: those
+windows are fullscreen.
+
+### Page scroll
+
+Two columns fit any window the launcher is likely to open in; one stacked
+column does not. On a phone-shaped window the ROM card, SAVE FILES, Play and
+SAVE SLOT together run past the bottom, and a footer pinned to the window
+bottom painted over them with the overflow unreachable.
+
+So the whole column under the tab bar -- panel, updater banner, footer --
+scrolls as one page whenever it is taller than the room below the tab bar:
+
+- The strip, logo and tab bar stay pinned, so navigation is always on screen.
+ Everything else draws at `contentTop - pageScroll` inside a scissor, and the
+ footer is laid out downward from `footerTop` right after the content instead
+ of upward from the window bottom.
+- `RomImporter.pageScrollFor(naturalH, viewportH, scroll)` is the whole
+ decision, pure and pinned by `tests/engine/launcher_page_scroll.lua`. A
+ window that grows back drags the offset down with it, so the page can never
+ stay parked past its own end.
+- The panels report their natural height as they draw (`_drawGamePanel` and
+ `_drawModsPanel` return it), so the decision reads the previous frame's
+ measurement -- the same one-frame settle the two lists already rely on.
+- **One scroll axis at a time.** While the page scrolls, the panels draw
+ `paged`: the slot and mod lists take their natural height, keep no inner
+ scroll region and report a max of 0, so the wheel, the right stick and a drag
+ all move the page and never fight a list for the same gesture. Two-column
+ layouts do not overflow, `paged` stays false, and every one of these behaves
+ exactly as it did before.
+- Hit testing follows the clip: `inside` (clicks) and `_ptIn` (hover) reject a
+ rect that scrolled out of the viewport, so a control that slid under the tab
+ bar cannot be clicked through it. Tab chips carry `pinned = true` and are
+ exempt. `pageScroll` resets on a tab change, each tab being a different
+ length.
+- A press on empty background pans the page, resolved in `_updateSlotDrag` like
+ every other drag here.
+
+### Dragging on Android
+
+The launcher is handed no move events on any platform: `main.lua` forwards
+neither `touchmoved` nor `mousemoved` while it is up, which is why every drag
+here is resolved by polling inside `draw` instead. Desktop polls the mouse;
+Android used to poll nothing at all ("no reliable pointer polling" meant its
+mouse emulation), so it had no scroll gesture whatsoever -- fine while every
+scroll region was an inner list with a wheel alternative, useless the moment
+the page itself became the thing that scrolls, since a phone is exactly where
+it overflows.
+
+`love.touch` is pollable, so `_pointerHold` reads the first active touch there
+and hands `_updateSlotDrag` the same (held, y) pair the mouse gives on desktop.
+Consequences:
+
+- Slot rows and mod toggles ARM on press and commit on release on Android too,
+ matching desktop, so a swipe that starts on a card scrolls instead of
+ selecting the row it started on.
+- `touchPollable` (set once in `new`) gates all of it. Where `love.touch` is
+ missing, every Android path is exactly what it was: act on press, never arm,
+ no drag.
diff --git a/docs/modding.md b/docs/modding.md
index 18955af2..dfe0a074 100644
--- a/docs/modding.md
+++ b/docs/modding.md
@@ -18,6 +18,23 @@ Regenerate the reference straight into a wiki checkout:
luajit tools/gen_registry_docs.lua ../gen1recomp.wiki
```
+## Editing maps in Tiled
+
+Maps are data, not assets, so they can be authored in a real map editor and
+exported as a mod. `tools/tiled_export.py` builds a
+[Tiled](https://www.mapeditor.org) workspace out of the imported ROM cache:
+
+```sh
+python3 tools/tiled_export.py # -> build/tiled/ (gitignored)
+```
+
+Open `build/tiled/gen1.tiled-project`, edit any of the 222 maps (or
+`kanto.world` for the stitched overworld), and export with the
+`gen1-mod-export` extension — one map file, or a whole loadable mod folder.
+An edited vanilla map becomes a `mod.content.maps:patch` carrying only the
+fields that moved; a new map becomes a `:register`. See
+`docs/new-features.md` and the extension's own README.
+
## Rendering pipelines
Most registries hand the engine *content*. `render_pipelines` hands it
diff --git a/docs/new-features.md b/docs/new-features.md
index abcd5da4..87d5c781 100644
--- a/docs/new-features.md
+++ b/docs/new-features.md
@@ -259,6 +259,7 @@ stick push hides it, the next screen touch brings it back, and unplugging
the last controller restores it immediately. Layout re-derives from the
window size on rotation. Desktop testing: `POKEPORT_TOUCH=1 love .` forces
the overlay on and lets the mouse act as a finger (`=0` forces it off).
+
## Translation support
Every string the player can read is now reachable from a mod, so a
@@ -338,3 +339,26 @@ second, relabelling itself to `Confirm?` in between.
A validation pill in the tab rail mirrors what the running game would
quarantine on load; clicking it jumps to the tab holding the first problem.
+
+## Tiled map editing (mod authoring)
+
+`tools/tiled_export.py` turns the imported ROM cache into a Tiled workspace,
+so maps can be edited in a real map editor and exported back out as a mod.
+It has its own document: docs/tiled-map-editing.md.
+
+## Pokédex diploma (both versions)
+
+The Celadon Mansion 3F game designer shows the dex-completion diploma
+once 150 species are owned. On Yellow, the graphic artist next to him
+then offers to print it, saving the certificate as a PNG under `prints/`
+in the save directory, and Bill's PC gains Yellow's PRINT BOX item which
+exports the current box list the same way.
+
+## Pokédex printing (Yellow)
+
+Yellow's Game Boy Printer PRNT option in the Pokédex side menu is stood in
+for by an image export: choosing PRNT renders the mon's entry page (sprite,
+kind, number, height/weight, dex text) to a PNG at 4x scale under
+`prints/` in the save directory, then reports the filename in a dialog.
+No printer hardware or link cable emulation involved; the file is the
+printout.
diff --git a/docs/tiled-map-editing.md b/docs/tiled-map-editing.md
new file mode 100644
index 00000000..6ec9f7dd
--- /dev/null
+++ b/docs/tiled-map-editing.md
@@ -0,0 +1,65 @@
+# Tiled map editing (mod authoring)
+
+`tools/tiled_export.py` turns the imported ROM cache into a
+[Tiled](https://www.mapeditor.org) workspace, so maps can be edited in a
+real map editor and exported back out as a mod. The original had no map
+editor at all; the port's own map data is plain Lua, which is what makes
+this a data path rather than an asset path.
+
+Editing is done in our own Tiled build,
+[bryanthaboi/tiled_gen1recomp](https://github.com/bryanthaboi/tiled_gen1recomp/releases),
+which ships the `gen1-mod-export` extension the workspace relies on. Grab it
+from that repo's releases; upstream Tiled opens the workspace but cannot
+export a mod out of it.
+
+```sh
+python3 tools/tiled_export.py # -> build/tiled/ (gitignored)
+```
+
+Then open `build/tiled/gen1.tiled-project` in that build of Tiled.
+
+- **The overworld is one surface.** All 222 maps become `maps/*.tmj`, and
+ `kanto.world` places the 36 connected overworld maps at their real
+ connection offsets. That world is pre-loaded (seeded into the workspace's
+ Tiled session), so opening any one overworld map draws its neighbors around
+ it and you scroll and edit straight across the seams. Everything else is a
+ double-click away in Tiled's project panel.
+- **Extending Kanto wires both ends.** A connection lives on both maps, so
+ hooking a new map onto a base map also emits the return connection as a
+ patch on that base map, keeping its other directions intact. The return
+ offset is derived, not guessed: all 78 vanilla reciprocal pairs satisfy
+ `back.offset == -offset`.
+- **A Tiled tile is a gen1 block.** Each of the 24 tilesets becomes a Tiled
+ tileset whose tiles are its 32x32 blocks, composited from the 8x8 sheet,
+ so a tile layer *is* the map's `blocks` array. Warps, signs and objects
+ sit on the 16px cell grid in object layers, which is the grid the engine
+ addresses them on.
+- **Collision is visible.** View > Show Tile Collision Shapes draws the real
+ walkability: a rectangle covers each cell whose feet tile is not in the
+ tileset's `walkable` list, which is the rule `src/world/Map.lua` applies.
+- **Maps are shown in their real colors.** Each map is atlased in the SGB
+ palette it renders with, so Cerulean is blue and Lavender is purple in the
+ editor exactly as in game. Vanilla resolves that through a cascade with
+ interiors inheriting the last outdoor map, so the workspace mirrors the
+ cascade and walks the warp graph to colour interiors. Changing a map's
+ `palette` exports `palette = "..."` on the record, which beats the cascade,
+ and the editor offers the real palette names as a dropdown.
+- **New blocks and new tilesets.** `blocksets/*.tmj` show a tileset's blocks
+ as raw 8x8 tiles, four by four, so new blocks can be composed there;
+ per-tile flags on `tilesets/tiles_*.tsj` become `walkable`, `waterTiles`,
+ `doorTiles` and the rest.
+- **Export is a diff, not a fork of the data.** The `gen1-mod-export`
+ extension (shipped in `tiled_gen1recomp`) writes either one map file or a whole
+ loadable mod folder. An edited vanilla map diffs against the imported data
+ and emits `mod.content.maps:patch` carrying *only* the fields that moved, so
+ a mod covers the parts it changes and leaves the rest to the base game; a
+ new map gets `:register` at an index of 1000 or above. An unchanged map
+ exports nothing at all. Exports pass `tools/modkit.py validate` and `lint`.
+- **Or the whole record, on request.** Ticking `exactExport` on a map switches
+ it to `mod.content.maps:override`, pinning the map to exactly what the
+ editor shows. It is off by default because an override wins outright over
+ any other mod patching that map, where a patch composes.
+
+No ROM-derived art travels into an exported mod: a tileset still drawing on
+the player's own imported sheet references that path rather than shipping the
+pixels, and only a sheet the author supplied is copied in.
diff --git a/main.lua b/main.lua
index fb846d15..f88a7381 100644
--- a/main.lua
+++ b/main.lua
@@ -135,10 +135,10 @@ function closeEditor()
end
local function bootGame(version)
- -- The launcher hands us the chosen game (Red / Blue); scripted and headless
- -- runs fall back to POKEPORT_VERSION, then Red. Set the active version and
- -- overlay its extracted cache BEFORE anything requires generated data, so
- -- data/generated + assets/generated resolve to that version's files.
+ -- The launcher hands us the chosen game (Red / Blue / Yellow); scripted and
+ -- headless runs fall back to POKEPORT_VERSION, then Red. Set the active
+ -- version and overlay its extracted cache BEFORE anything requires generated
+ -- data, so data/generated + assets/generated resolve to that version's files.
local GameVersion = require("src.core.GameVersion")
GameVersion.set(version or os.getenv("POKEPORT_VERSION") or "red")
require("src.import.CacheFs").mountVersion(GameVersion.get())
@@ -231,11 +231,11 @@ function love.load(args)
return
end
- -- Interactive: the launcher always runs. Red and Blue are each live: a
- -- column shows Play when that game's ROM is already imported, or Choose ROM
- -- / drag-drop when it is not (Yellow is still a placeholder). Any dropped
- -- .gb is routed to Red or Blue by its SHA-1; pressing Play boots that game.
- -- Edit on a save row opens the bundled editor on that slot (openEditor).
+ -- Interactive: the launcher always runs. Red, Blue, and Yellow are each
+ -- live: a column shows Play when that game's ROM is already imported, or
+ -- Choose ROM / drag-drop when it is not. Any dropped .gb is routed by its
+ -- SHA-1 (GameVersion.forSha1); pressing Play boots that game. Edit on a
+ -- save row opens the bundled editor on that slot (openEditor).
Importer = RomImporter.new(function(version)
Importer = nil
bootGame(version)
diff --git a/mobile/ANDROID.md b/mobile/ANDROID.md
index 1d4d6849..79153bb8 100644
--- a/mobile/ANDROID.md
+++ b/mobile/ANDROID.md
@@ -70,7 +70,10 @@ The APK lands under `app/build/outputs/apk/embedNoRecord/debug/`.
### Payload path
`app/src/embed/assets/game.love` - zip of `main.lua`, `conf.lua`, `src/`,
-`data/`, `assets/`, and `tools/rom_manifest.json`. Generated game data,
+`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,
scripts, tests, and mobile build sources are excluded.
## Branding (applied by the build script)
diff --git a/scripts/build.sh b/scripts/build.sh
index fd38c1dd..37b5d011 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -66,17 +66,23 @@ rm -f "$LOVE_FILE"
(cd "$ROOT" && zip -q -9 -r "$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 \
-x '*.DS_Store' 'data/generated/*' 'assets/generated/*')
if unzip -Z1 "$LOVE_FILE" \
| grep -Eq '^(data|assets)/generated/[^/]+|^(data|assets)/generated/.+/'; then
fail "game.love unexpectedly contains generated ROM data"
fi
# The editor is only reachable if its entry point and both module directories
-# made it in; a silent miss would ship a launcher whose Edit button crashes.
+# made it in, and every version's import manifest has to ship or that game's
+# ROM import fails in the built app (dev reads them off the source tree, so
+# the miss only ever shows up in a build -- the Yellow manifest shipped this
+# way once).
for required in tools/save-editor/App.lua tools/save-editor/Kit.lua \
- tools/save-editor/panels/Party.lua; do
+ tools/save-editor/panels/Party.lua \
+ tools/rom_manifest.json tools/rom_manifest_blue.json \
+ tools/rom_manifest_yellow.json; do
unzip -Z1 "$LOVE_FILE" | grep -qx "$required" \
- || fail "game.love is missing $required (save editor would not load)"
+ || fail "game.love is missing $required"
done
say "game.love: $(du -h "$LOVE_FILE" | cut -f1)"
diff --git a/scripts/build_android.sh b/scripts/build_android.sh
index 38a83863..cc4c8232 100755
--- a/scripts/build_android.sh
+++ b/scripts/build_android.sh
@@ -26,6 +26,11 @@ APP_NAME="gen1recomp"
APPLICATION_ID="com.theboisclub.pokemonred"
LOVE_ANDROID_VERSION="11.5a"
NDK_VERSION="25.2.9519653"
+YELLOW_MANIFEST_RELATIVE="tools/rom_manifest_yellow.json"
+# A fresh source checkout normally supplies this through Git. This URL is
+# deliberately only a last resort for incomplete source exports: the manifest
+# contains extraction metadata, never a ROM or extracted game data.
+YELLOW_MANIFEST_URL="${YELLOW_MANIFEST_URL:-https://raw.githubusercontent.com/bryanthaboi/gen1recomp/main/tools/rom_manifest_yellow.json}"
VERSION=""
PACKAGE_ONLY=false
@@ -72,6 +77,59 @@ if [ ! -d "$ANDROID_DIR/love/src/jni/love/src" ]; then
Re-clone or 'git checkout -- mobile/android'. See mobile/ANDROID.md."
fi
+# ------------------------------------------------------- Yellow import metadata
+# Android packages game.love itself rather than reusing scripts/build.sh's
+# archive. Keep a partial source export from silently shipping an APK that can
+# list Yellow but cannot import it. Prefer the exact manifest from this
+# checkout's Git object database; only then fall back to the public repository.
+yellow_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") ==
+ "cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1" else 1)
+PY
+}
+
+ensure_yellow_manifest() {
+ local manifest="$ROOT/$YELLOW_MANIFEST_RELATIVE"
+ local staged
+ staged="$(mktemp)"
+
+ if yellow_manifest_is_valid "$manifest"; then
+ rm -f "$staged"
+ return
+ fi
+
+ warn "Yellow import manifest is missing or invalid; recovering it before packaging"
+ if git -C "$ROOT" show "HEAD:$YELLOW_MANIFEST_RELATIVE" > "$staged" 2>/dev/null \
+ && yellow_manifest_is_valid "$staged"; then
+ mkdir -p "$(dirname "$manifest")"
+ mv "$staged" "$manifest"
+ say "restored Yellow 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" "$YELLOW_MANIFEST_URL" \
+ && yellow_manifest_is_valid "$staged"; then
+ mkdir -p "$(dirname "$manifest")"
+ mv "$staged" "$manifest"
+ say "downloaded Yellow import manifest from the project repository"
+ return
+ fi
+
+ rm -f "$staged"
+ fail "Yellow import manifest is unavailable. Git recovery failed and could not download $YELLOW_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
@@ -135,6 +193,7 @@ PY
# --------------------------------------------------------------- game.love
pack_game_love() {
say "packing game.love for love-android embed flavor"
+ ensure_yellow_manifest
mkdir -p "$EMBED_ASSETS"
rm -f "$LOVE_FILE"
# tools/save-editor ships with the app: the launcher's Edit button on a save
@@ -142,14 +201,21 @@ pack_game_love() {
(cd "$ROOT" && zip -q -9 -r "$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 \
-x '*.DS_Store' -x '*/.git/*' -x '*/.DS_Store' \
-x 'data/generated/*' -x 'assets/generated/*')
if unzip -Z1 "$LOVE_FILE" \
| grep -Eq '^(data|assets)/generated/[^/]+|^(data|assets)/generated/.+/'; then
fail "game.love unexpectedly contains generated ROM data"
fi
- unzip -Z1 "$LOVE_FILE" | grep -qx 'tools/save-editor/App.lua' \
+ # Do not pipe unzip straight into grep here: on a large archive grep can
+ # finish early and make unzip report SIGPIPE under `set -o pipefail`.
+ local archive_entries
+ archive_entries="$(unzip -Z1 "$LOVE_FILE")"
+ grep -qx 'tools/save-editor/App.lua' <<< "$archive_entries" \
|| fail "game.love is missing the save editor (Edit on a save row would crash)"
+ grep -qx "$YELLOW_MANIFEST_RELATIVE" <<< "$archive_entries" \
+ || fail "game.love is missing the Yellow ROM import manifest"
say "game.love: $(du -h "$LOVE_FILE" | cut -f1) -> $LOVE_FILE"
# This script packs its own game.love (it does not reuse build.sh's), so it
diff --git a/scripts/setup.sh b/scripts/setup.sh
index 5c1ae093..c1251b1d 100755
--- a/scripts/setup.sh
+++ b/scripts/setup.sh
@@ -1,11 +1,12 @@
#!/usr/bin/env bash
-# Build game data from a user-provided Pokemon Red ROM and install LÖVE.
+# Build game data from a user-provided Pokemon Red/Blue/Yellow ROM and install LÖVE.
#
# Usage:
# scripts/setup.sh --rom /path/to/pokemon-red.gb
+# scripts/setup.sh --rom /path/to/pokemon-yellow.gbc
# ROM_PATH=/path/to/pokemon-red.gb scripts/setup.sh
#
-# With no explicit path, the first *.gb file in the project root is used.
+# With no explicit path, the first *.gb / *.gbc file in the project root is used.
set -euo pipefail
@@ -34,15 +35,17 @@ command -v python3 >/dev/null 2>&1 \
|| fail "Python 3 is required to decode the ROM"
if [ -z "$ROM" ]; then
- for candidate in "$ROOT"/*.gb; do
+ shopt -s nullglob
+ for candidate in "$ROOT"/*.gb "$ROOT"/*.gbc; do
if [ -f "$candidate" ]; then
ROM="$candidate"
break
fi
done
+ shopt -u nullglob
fi
[ -n "$ROM" ] && [ -f "$ROM" ] \
- || fail "Pokemon Red ROM not found. Put your .gb file in $ROOT or pass --rom /path/to/file.gb"
+ || fail "Pokemon ROM not found. Put a .gb or .gbc in $ROOT or pass --rom /path/to/file"
if [ ! -x "$VENV/bin/python3" ]; then
say "creating Python environment"
diff --git a/src/audio/ChipAsm.lua b/src/audio/ChipAsm.lua
index 95e14ae5..17faf577 100644
--- a/src/audio/ChipAsm.lua
+++ b/src/audio/ChipAsm.lua
@@ -22,7 +22,7 @@ local NOTES = {
-- mirrors ChipAudio's snapTicks so authored drums land on the same sample
-- grid as the ROM's own drum tables
local function snapTicks(ticks)
- return math.floor((ticks * 735 + 256) / 512)
+ return math.floor((ticks * 1470 + 256) / 512)
end
-- ------- validation
diff --git a/src/battle/BattleState.lua b/src/battle/BattleState.lua
index b6eb4821..9f3e3c85 100644
--- a/src/battle/BattleState.lua
+++ b/src/battle/BattleState.lua
@@ -38,15 +38,16 @@ BattleState.letterboxWhite = true
-- BATTLE LAYOUT: the classic 160x144 arrangement, or the widescreen one on
-- a 304x144 surface (src/battle/WideBattle.lua). Only the composition
--- differs; every battler, queue and animation below is shared. The wide
--- layout is live only while this battle is the state being drawn on top --
--- a party menu or bag pushed over it is a 160x144 screen, so the surface
--- goes back with it and the battle underneath is not drawn at all.
-function BattleState:wideLayout()
+-- differs; every battler, queue and animation below is shared. Menus and
+-- prompts pushed during a wide battle keep its wide canvas, while drawing
+-- their classic 160px UI centred within it (Game:draw).
+function BattleState:isWideBattleLayout()
local options = self.game and self.game.save and self.game.save.options
- if not options or options.battleLayout ~= "wide" then return false end
- local stack = self.game.stack
- return (stack and stack.top and stack:top()) == self
+ return options and options.battleLayout == "wide" or false
+end
+
+function BattleState:wideLayout()
+ return self:isWideBattleLayout()
end
-- Renderer:setUISize asks the top state for its surface before anything draws
@@ -652,8 +653,22 @@ end
-- player mon; the battle menu appears under the OLD MAN's name and a
-- scripted cursor hovers FIGHT, hops to ITEM and forces the item menu
-- (one POKé BALL x50). The throw always catches; nothing is kept.
-function BattleState:makeOldManDemo()
+-- Yellow's Pallet intro (BATTLE_TYPE_PIKACHU) is the same simulated
+-- script under "PROF.OAK" (pokeyellow core.asm .profOakName), so the
+-- displayed thrower name is a parameter.
+function BattleState:makeOldManDemo(name)
self.demo = true
+ self.demoName = name or "OLD MAN"
+ -- Yellow's Pallet intro runs this before the player owns any mon
+ -- (BATTLE_TYPE_PIKACHU precedes the lab gift), so newWild flagged the
+ -- battle dead for lack of a party. The demo never sends out, draws, or
+ -- acts with the player side; a hidden placeholder battler keeps the
+ -- shared battle phases nil-safe.
+ if not self.player then
+ self.dead = false
+ self.player = makeBattler(self.game.data,
+ Pokemon.new(self.game.data, self.enemy.mon.species, 5), true)
+ end
end
-- Safari Zone battles (engine/battle/core.asm safari sections +
@@ -1068,6 +1083,10 @@ function BattleState:computeMusicKind()
end
end
end
+ -- init_battle.asm: challenging a gym leader (wGymLeaderNo, the badge
+ -- fights only -- not Lance or the Champion) bumps the companion's
+ -- happiness the moment the battle starts
+ self.isGymLeader = isBoss
if self.kind == "trainer" and self.trainer
and self.trainer.id == "OPP_RIVAL3" then
return "final"
@@ -1108,6 +1127,10 @@ function BattleState:enter()
end
local Music = require("src.core.Music")
self.musicKind = self:computeMusicKind()
+ if self.isGymLeader then
+ require("src.world.PikachuFollower")
+ .modifyHappiness(self.game.save, "GYMLEADER")
+ end
-- normally already playing: the transition wipe starts the theme
-- (audio/play_battle_music.asm runs before the transition, and
-- Music.play no-ops on the same song); this covers battles pushed
@@ -1733,7 +1756,7 @@ function BattleState:oldManThrow()
self.phase = "messages"
self.afterQueue = "finish"
self.result = "run" -- nothing is kept; wBattleResult only ends the demo
- self:say(Strings("OLD MAN used\nPOKé BALL!"))
+ self:say(Strings("%s used\nPOKé BALL!", self.demoName or "OLD MAN"))
self:act(function()
require("src.core.Sound").play(self.data, "Ball_Toss")
-- ItemUseBall's beat before the toss chain (like throwBall)
@@ -3008,6 +3031,17 @@ function BattleState:onFaint(battler)
self.participants[battler.mon] = nil
end
Runtime.emit("battle.fainted", { battle = self, battler = battler })
+ if battler.isPlayer then
+ -- HandlePlayerMonFainted (core.asm:1070-1085): the companion loses
+ -- happiness on its own faint; an enemy 30+ levels above it makes
+ -- that the CARELESSTRAINER hit instead
+ local enemyLevel = self.enemy and self.enemy.mon
+ and self.enemy.mon.level or 0
+ local reason = (enemyLevel - (battler.mon.level or 0)) >= 30
+ and "CARELESSTRAINER" or "FAINTED"
+ require("src.world.PikachuFollower")
+ .modifyHappiness(self.game.save, reason, battler.mon)
+ end
-- the faint slide + cry ride the queue (after the move animation and
-- the HP-bar drain, pokered's order); the slide finishes before the
-- faint text via a queued hold
@@ -3092,6 +3126,9 @@ function BattleState:enemyMonFainted()
-- the move-learn checks (experience.asm:245-256)
local game = self.game
for _, lv in ipairs(levels) do
+ -- experience.asm:248 fires per grew-level text
+ require("src.world.PikachuFollower")
+ .modifyHappiness(game.save, "LEVELUP", mon)
self:sayNext(Strings("%s grew\nto level %d!", name, lv))
self:uiNext(function()
require("src.core.Sound").play(game.data, "Level_Up")
@@ -3912,7 +3949,10 @@ function BattleState:finish()
-- way back -- an unrecoverable state, not merely a wrong one.
-- playerMonFainted is the path that should have caught this; if we land
-- here it did not, so say so rather than silently papering over it.
- if self.result ~= "lose" and not Party.firstHealthy(self.game.save.party) then
+ -- The old-man / PROF.OAK demo also skips it: the party never fought
+ -- (Yellow's Pallet intro runs before the player owns a mon at all).
+ if self.result ~= "lose" and not self.demo
+ and not Party.firstHealthy(self.game.save.party) then
Logger.warn("battle finished %s with no healthy party; forcing blackout",
tostring(self.result))
self.result = "lose"
@@ -4824,7 +4864,9 @@ function BattleState:drawTextArea()
Font.drawCode(Font.BORDER.br, 80, 96)
love.graphics.setColor(0, 0, 0, 1)
for i, mv in ipairs(self.player.curMoves) do
- Font.draw(self.data.moves[mv.id].name, 48, 96 + i * 8)
+ -- unknown ids (mod-injected moves) print raw instead of crashing
+ local def = self.data.moves[mv.id]
+ Font.draw(def and def.name or tostring(mv.id), 48, 96 + i * 8)
end
Font.drawCode((self.moveSwapIndex == self.moveIndex) and 0xEC or 0xED,
40, 96 + self.moveIndex * 8)
@@ -4833,10 +4875,10 @@ function BattleState:drawTextArea()
end
local sel = self.player.curMoves[self.moveIndex]
if sel then
+ local def = self.data.moves[sel.id]
if self.player.disabledSlot == self.moveIndex then
Font.draw(Strings("disabled!"), 8, 80)
- else
- local def = self.data.moves[sel.id]
+ elseif def then
Font.draw(Strings("TYPE/"), 8, 72)
-- the type record's display name (a mod type shows its name, and
-- PSYCHIC_TYPE prints PSYCHIC like the original)
diff --git a/src/core/ChipAudio.lua b/src/core/ChipAudio.lua
index 17f5f3e0..e2f7b2ab 100644
--- a/src/core/ChipAudio.lua
+++ b/src/core/ChipAudio.lua
@@ -25,6 +25,29 @@ local SAMPLE_RATE = ChipSynth.SAMPLE_RATE
local MUSIC_BUFFER_SAMPLES = ChipSynth.MUSIC_BUFFER_SAMPLES
local MUSIC_BUFFER_COUNT = ChipSynth.MUSIC_BUFFER_COUNT
+-- ---------------------------------------------------------------------------
+-- Per-channel mix (edit these)
+-- Applied on load and whenever this file hot-reloads.
+-- Runtime: ChipAudio.setChannelVolume / setChannelPitch.
+-- [1] pulse 1 [2] pulse 2 [3] wave [4] noise / drums
+-- Volume: 1 = authentic, 0 = mute, >1 boosts
+-- Pitch: 1 = authentic, 2 = +1 octave, 0.5 = -1 octave
+-- ---------------------------------------------------------------------------
+local CHANNEL_VOLUME = {
+ [1] = 1, -- pulse 1
+ [2] = 1, -- pulse 2
+ [3] = 0.25, -- wave
+ [4] = 1, -- noise / drums
+}
+local CHANNEL_PITCH = {
+ [1] = 1, -- pulse 1
+ [2] = 1, -- pulse 2
+ [3] = 0.5, -- wave
+ [4] = 1, -- noise / drums
+}
+ChipSynth.setChannelVolumes(CHANNEL_VOLUME)
+ChipSynth.setChannelPitches(CHANNEL_PITCH)
+
-- currentMusic: { source, gen, threaded, started, finished, engine }
-- threaded songs stream from the worker (engine is nil here);
-- the fallback path owns a local engine and fills the source itself.
@@ -152,13 +175,23 @@ function ChipAudio.playMusic(data, header, allowLoops)
musicGen = musicGen + 1
local gen = musicGen
cmdCh:push({ cmd = "play", gen = gen, header = header,
- allowLoops = allowLoops, audio = slimAudio(data) })
+ allowLoops = allowLoops, audio = slimAudio(data),
+ channelVolumes = ChipSynth.getChannelVolumes(),
+ channelPitches = ChipSynth.getChannelPitches() })
currentMusic = { source = source, gen = gen, threaded = true,
started = false, finished = false }
-- playback starts in update() once the first buffer arrives (~1 frame)
return source
end
+local function pushChannelMix()
+ if workerReady and cmdCh then
+ cmdCh:push({ cmd = "channelMix",
+ volumes = ChipSynth.getChannelVolumes(),
+ pitches = ChipSynth.getChannelPitches() })
+ end
+end
+
-- move finished buffers from the worker into the Source; start playback once
-- the first one lands
local function updateThreaded()
@@ -270,6 +303,53 @@ function ChipAudio.invalidate()
if workerReady and cmdCh then cmdCh:push({ cmd = "invalidate" }) end
end
+-- Runtime mix for one hardware channel (1..4). Takes effect on the next
+-- synthesized buffer (live music) and on any SFX/cry rendered after the call.
+function ChipAudio.setChannelVolume(hw, scale)
+ ChipSynth.setChannelVolume(hw, scale)
+ pushChannelMix()
+end
+
+function ChipAudio.getChannelVolume(hw)
+ return ChipSynth.getChannelVolume(hw)
+end
+
+function ChipAudio.setChannelVolumes(volumes)
+ ChipSynth.setChannelVolumes(volumes)
+ pushChannelMix()
+end
+
+function ChipAudio.getChannelVolumes()
+ return ChipSynth.getChannelVolumes()
+end
+
+function ChipAudio.setChannelPitch(hw, scale)
+ ChipSynth.setChannelPitch(hw, scale)
+ pushChannelMix()
+end
+
+function ChipAudio.getChannelPitch(hw)
+ return ChipSynth.getChannelPitch(hw)
+end
+
+function ChipAudio.setChannelPitches(pitches)
+ ChipSynth.setChannelPitches(pitches)
+ pushChannelMix()
+end
+
+function ChipAudio.getChannelPitches()
+ return ChipSynth.getChannelPitches()
+end
+
+-- aliases for channel 4 (noise / drums)
+function ChipAudio.setNoiseVolume(scale)
+ ChipAudio.setChannelVolume(4, scale)
+end
+
+function ChipAudio.getNoiseVolume()
+ return ChipAudio.getChannelVolume(4)
+end
+
-- a stale song must not keep sounding past the flush that replaced its
-- program (20 §2 cache contract, chip music row)
Assets.register(ChipAudio.invalidate)
diff --git a/src/core/ChipSynth.lua b/src/core/ChipSynth.lua
index 89f004dc..1c62a182 100644
--- a/src/core/ChipSynth.lua
+++ b/src/core/ChipSynth.lua
@@ -14,26 +14,97 @@ local bit = require("bit")
local ChipSynth = {}
-local SAMPLE_RATE = 22050
+local SAMPLE_RATE = 44100
local TICKS_PER_SECOND = 15360
local FRAME_TICKS = 256
local GB_CLOCK = 4194304
--- one 4096-sample stereo SoundData is the unit both the worker hands off and
+-- one 8192-sample stereo SoundData is the unit both the worker hands off and
-- the synchronous fallback queues; the source keeps MUSIC_BUFFER_COUNT of them
--- (~6s) for stall tolerance (window resize, a long GC pause)
-local MUSIC_BUFFER_SAMPLES = 4096
+-- (~6s at 44100) for stall tolerance (window resize, a long GC pause)
+local MUSIC_BUFFER_SAMPLES = 8192
local MUSIC_BUFFER_COUNT = 32
ChipSynth.SAMPLE_RATE = SAMPLE_RATE
ChipSynth.MUSIC_BUFFER_SAMPLES = MUSIC_BUFFER_SAMPLES
ChipSynth.MUSIC_BUFFER_COUNT = MUSIC_BUFFER_COUNT
+-- Runtime mix per hardware channel (1 pulse, 2 pulse, 3 wave, 4 noise).
+-- Volume: 1 = authentic GB, 0 = mute. Pitch: 1 = authentic, 2 = +1 octave,
+-- 0.5 = -1 octave. Applied at sample time so a live change reaches the next
+-- buffer on both the sync path and the worker (via ChipAudio).
+local channelVolume = { 1, 1, 1, 1 }
+local channelPitch = { 1, 1, 1, 1 }
+
+local function clampScale(scale)
+ return math.max(0, tonumber(scale) or 0)
+end
+
+local function setChannelTable(table, hw, scale)
+ hw = tonumber(hw)
+ if not hw or hw < 1 or hw > 4 then return end
+ table[hw] = clampScale(scale)
+end
+
+local function setChannelTables(table, values)
+ if type(values) ~= "table" then return end
+ for hw = 1, 4 do
+ if values[hw] ~= nil then table[hw] = clampScale(values[hw]) end
+ end
+end
+
+function ChipSynth.setChannelVolume(hw, scale)
+ setChannelTable(channelVolume, hw, scale)
+end
+
+function ChipSynth.getChannelVolume(hw)
+ return channelVolume[tonumber(hw) or 0] or 1
+end
+
+function ChipSynth.setChannelVolumes(volumes)
+ setChannelTables(channelVolume, volumes)
+end
+
+function ChipSynth.getChannelVolumes()
+ return { channelVolume[1], channelVolume[2], channelVolume[3], channelVolume[4] }
+end
+
+function ChipSynth.setChannelPitch(hw, scale)
+ setChannelTable(channelPitch, hw, scale)
+end
+
+function ChipSynth.getChannelPitch(hw)
+ return channelPitch[tonumber(hw) or 0] or 1
+end
+
+function ChipSynth.setChannelPitches(pitches)
+ setChannelTables(channelPitch, pitches)
+end
+
+function ChipSynth.getChannelPitches()
+ return { channelPitch[1], channelPitch[2], channelPitch[3], channelPitch[4] }
+end
+
+-- aliases for the noise/drum layer
+function ChipSynth.setNoiseVolume(scale)
+ ChipSynth.setChannelVolume(4, scale)
+end
+
+function ChipSynth.getNoiseVolume()
+ return ChipSynth.getChannelVolume(4)
+end
+
local PITCHES = {
0xF82C, 0xF89D, 0xF907, 0xF96B, 0xF9CA, 0xFA23,
0xFA77, 0xFAC7, 0xFB12, 0xFB58, 0xFB9B, 0xFBDA,
}
-local DUTY = { [0] = 0.125, [1] = 0.25, [2] = 0.5, [3] = 0.75 }
+-- LuaGB / DMG 8-step duty tables (index 0-3); stored on channels as that index
+local WAVE_PATTERN_TABLES = {
+ [0] = {0, 0, 0, 0, 0, 0, 0, 1},
+ [1] = {1, 0, 0, 0, 0, 0, 0, 1},
+ [2] = {1, 0, 0, 0, 0, 1, 1, 1},
+ [3] = {0, 1, 1, 1, 1, 1, 1, 0},
+}
local WAVE_LEVEL = { [0] = 0, [1] = 1, [2] = 0.5, [3] = 0.25 }
local NOISE_DIVISORS = {
[0] = 8, [1] = 16, [2] = 32, [3] = 48,
@@ -41,7 +112,7 @@ local NOISE_DIVISORS = {
}
local function snapTicks(ticks)
- return math.floor((ticks * 735 + 256) / 512)
+ return math.floor((ticks * 1470 + 256) / 512)
end
local cachedProgramFile
@@ -143,7 +214,7 @@ function Channel.new(engine, spec, options)
speed = 12,
volume = 12,
fade = 0,
- duty = 0.5,
+ duty = 2,
octave = 4,
waveInstrument = 0,
waveLevel = 1,
@@ -317,7 +388,7 @@ function Channel:nextEvent()
target = self:frequency(bit.band(packed, 0x0F), octave),
}
elseif command == 0xEC then
- self.duty = DUTY[bit.band(self:byte(), 3)] or 0.5
+ self.duty = bit.band(self:byte(), 3)
elseif command == 0xED then
self.engine.tempo = self:byte() * 0x100 + self:byte()
elseif command == 0xEE then
@@ -329,10 +400,10 @@ function Channel:nextEvent()
elseif command == 0xFC then
local packed = self:byte()
self.duty = {
- DUTY[bit.band(bit.rshift(packed, 6), 3)],
- DUTY[bit.band(bit.rshift(packed, 4), 3)],
- DUTY[bit.band(bit.rshift(packed, 2), 3)],
- DUTY[bit.band(packed, 3)],
+ bit.band(bit.rshift(packed, 6), 3),
+ bit.band(bit.rshift(packed, 4), 3),
+ bit.band(bit.rshift(packed, 2), 3),
+ bit.band(packed, 3),
}
elseif command == 0xFD then
self.callStack[#self.callStack + 1] = self.address + 2
@@ -423,27 +494,24 @@ function Channel:sampleNoise(parameter)
parameter = parameter or 0
local divisor = NOISE_DIVISORS[bit.band(parameter, 7)]
local shift = bit.rshift(parameter, 4)
- local output = bit.band(self.noiseLfsr, 1) == 0 and 1 or -1
- if shift >= 14 then return output end
- local cycles = GB_CLOCK / divisor / (2 ^ shift) / SAMPLE_RATE
- local width7 = bit.band(parameter, 8) ~= 0
- local remaining = cycles
- local area = 0
-
- while remaining > 0 do
- local untilClock = 1 - self.noiseClock
- local span = math.min(remaining, untilClock)
- output = bit.band(self.noiseLfsr, 1) == 0 and 1 or -1
- area = area + output * span
- self.noiseClock = self.noiseClock + span
- remaining = remaining - span
- if self.noiseClock >= 1 - 1e-12 then
- self.noiseClock = 0
- self:clockNoise(width7)
+ if shift < 14 then
+ local pitch = channelPitch[self.hardware] or 1
+ local cycles = GB_CLOCK / divisor / (2 ^ shift) / SAMPLE_RATE * pitch
+ local width7 = bit.band(parameter, 8) ~= 0
+ local remaining = cycles
+ while remaining > 0 do
+ local untilClock = 1 - self.noiseClock
+ local span = math.min(remaining, untilClock)
+ self.noiseClock = self.noiseClock + span
+ remaining = remaining - span
+ if self.noiseClock >= 1 - 1e-12 then
+ self.noiseClock = 0
+ self:clockNoise(width7)
+ end
end
end
-
- return area / cycles
+ -- LuaGB: instantaneous inverted LFSR LSB (high when bit0 == 0)
+ return bit.band(self.noiseLfsr, 1) == 0 and 1 or -1
end
local function sweepCalculation(register, sweep)
@@ -481,7 +549,7 @@ function Channel:sampleDrum(event, sampleIndex)
end
local elapsed = (sampleIndex - segment.startSample) / SAMPLE_RATE
local volume = envelopeVolume(segment.volume, segment.fade, elapsed)
- return self:sampleNoise(segment.parameter) * volume / 15 * 0.35
+ return self:sampleNoise(segment.parameter) * volume / 15
end
function Channel:sample()
@@ -498,11 +566,14 @@ function Channel:sample()
event.sample = sampleIndex + 1
if event.silence then return 0 end
- if event.drum then return self:sampleDrum(event, sampleIndex) end
+ local gain = channelVolume[self.hardware] or 1
+ if event.drum then
+ return self:sampleDrum(event, sampleIndex) * gain
+ end
local volume = envelopeVolume(
event.volume or 0, event.fade or 0, event.elapsed)
if event.noise then
- return self:sampleNoise(event.noiseParameter) * volume / 15 * 0.35
+ return self:sampleNoise(event.noiseParameter) * volume / 15 * gain
end
local register = event.register
@@ -527,7 +598,8 @@ function Channel:sample()
end
end
end
- local frequency = 131072 / (2048 - math.min(register, 2047))
+ local pitch = channelPitch[self.hardware] or 1
+ local frequency = 131072 / (2048 - math.min(register, 2047)) * pitch
if event.wave then frequency = frequency * 0.5 end
local phase = self.phase
self.phase = (phase + frequency / SAMPLE_RATE) % 1
@@ -537,13 +609,18 @@ function Channel:sample()
-- a def-local program may omit its wave table entirely
if not wave then return 0 end
local index = math.min(32, math.floor(phase * 32) + 1)
- return wave[index] * event.waveLevel * 0.55
+ return wave[index] * event.waveLevel * gain
end
local duty = event.duty
if type(duty) == "table" then
duty = duty[frame % 4 + 1]
end
- return (phase < duty and 1 or -1) * volume / 15 * 0.5
+ local pattern = WAVE_PATTERN_TABLES[duty or 2] or WAVE_PATTERN_TABLES[2]
+ local step = math.floor(phase * 8) % 8
+ if pattern[step + 1] == 0 then
+ return -volume / 15 * gain
+ end
+ return volume / 15 * gain
end
local Engine = {}
@@ -597,8 +674,8 @@ local function readWaves(banks, audio, engineNumber)
for byteIndex = 0, 15 do
local packed = romByte(
banks, spec.bank, spec.address + wave * 16 + byteIndex)
- values[#values + 1] = (bit.rshift(packed, 4) - 7.5) / 7.5
- values[#values + 1] = (bit.band(packed, 0x0F) - 7.5) / 7.5
+ values[#values + 1] = (bit.rshift(packed, 4) - 8) / 8
+ values[#values + 1] = (bit.band(packed, 0x0F) - 8) / 8
end
waves[#waves + 1] = values
end
@@ -606,8 +683,8 @@ local function readWaves(banks, audio, engineNumber)
for byteIndex = 0, 15 do
local packed = romByte(
banks, spec.bank, spec.address + 5 * 16 + byteIndex)
- values[#values + 1] = (bit.rshift(packed, 4) - 7.5) / 7.5
- values[#values + 1] = (bit.band(packed, 0x0F) - 7.5) / 7.5
+ values[#values + 1] = (bit.rshift(packed, 4) - 8) / 8
+ values[#values + 1] = (bit.band(packed, 0x0F) - 8) / 8
end
for _ = 1, 4 do waves[#waves + 1] = values end
return waves
@@ -615,7 +692,7 @@ end
-- def-local waves are authored either as raw 0-15 nibbles (the ROM's own
-- units) or as the -1..1 samples readWaves produces; the synth wants the
--- latter
+-- latter (LuaGB: (nibble - 8) / 8)
local function normalizeWaves(source)
local waves = {}
for index, values in ipairs(source) do
@@ -625,7 +702,7 @@ local function normalizeWaves(source)
end
local wave = {}
for position, value in ipairs(values) do
- wave[position] = nibbles and (value - 7.5) / 7.5 or value
+ wave[position] = nibbles and (value - 8) / 8 or value
end
waves[index] = wave
end
@@ -690,7 +767,7 @@ end
function Engine:sample()
local value = 0
for _, channel in ipairs(self.channels) do value = value + channel:sample() end
- return math.max(-1, math.min(1, value * 0.5))
+ return math.max(-1, math.min(1, value / 4))
end
function Engine:sampleStereo()
@@ -701,8 +778,8 @@ function Engine:sampleStereo()
if not event or event.panLeft ~= false then left = left + value end
if not event or event.panRight ~= false then right = right + value end
end
- return math.max(-1, math.min(1, left * 0.5)),
- math.max(-1, math.min(1, right * 0.5))
+ return math.max(-1, math.min(1, left / 4)),
+ math.max(-1, math.min(1, right / 4))
end
function Engine:sampleChannel(number)
@@ -711,7 +788,7 @@ function Engine:sampleChannel(number)
local value = channel:sample()
if channel.number == number then selected = value end
end
- return math.max(-1, math.min(1, selected * 0.5))
+ return math.max(-1, math.min(1, selected / 4))
end
-- render `samples` frames into a fresh SoundData (mono or stereo). love.sound
diff --git a/src/core/Data.lua b/src/core/Data.lua
index ed9e4db4..8ca5a734 100644
--- a/src/core/Data.lua
+++ b/src/core/Data.lua
@@ -85,6 +85,13 @@ function Data:seedDefaults()
for key, value in pairs(BOOT_DEFAULTS) do
if boot[key] == nil then boot[key] = copy(value) end
end
+ -- Yellow boots its own attract movie (engine/movie/intro_yellow.asm);
+ -- only the un-overridden default flips, so a total conversion that set
+ -- field.boot.screens.splash keeps its choice on any version.
+ if boot.screens.splash == BOOT_DEFAULTS.screens.splash
+ and require("src.core.GameVersion").isYellow() then
+ boot.screens.splash = "YellowIntro"
+ end
-- the naming screen presets the importer already extracts but nothing
-- ever read (field.presetNames)
if boot.namePresets == nil then
diff --git a/src/core/Game.lua b/src/core/Game.lua
index f0a243d9..05c2427e 100644
--- a/src/core/Game.lua
+++ b/src/core/Game.lua
@@ -90,10 +90,13 @@ function Game:load()
self.save.player.x, self.save.player.y, self.save.player.facing)
else
local titleState = self:makeTitleState()
- -- the copyright splash + Nidorino-vs-Gengar attract movie plays
- -- before the title (engine/movie/splash.asm + intro.asm); the ids come
- -- from field.boot.screens so a total conversion owns the whole boot
- Screens.push(self, bootScreens(self).splash or "IntroMovie", function()
+ -- the copyright splash + attract movie plays before the title
+ -- (engine/movie/splash.asm + intro.asm; Yellow swaps in its own
+ -- 18-scene movie, engine/movie/intro_yellow.asm); the ids come from
+ -- field.boot.screens so a total conversion owns the whole boot
+ local splash = require("src.core.GameVersion").isYellow()
+ and "YellowIntro" or "IntroMovie"
+ Screens.push(self, bootScreens(self).splash or splash, function()
StateStack:push(titleState)
end)
end
@@ -241,35 +244,93 @@ end
-- exactly as the owning state computed it
local function sameZones(_, zones) return zones end
+-- A wide battle owns the surface until it leaves the stack. The party,
+-- bag, choice and text states it opens still draw their original 160px UI,
+-- but the canvas must not snap to 160px between those states.
+function Game.wideBattleInStack(stack)
+ for i = #(stack and stack.states or {}), 1, -1 do
+ local state = stack.states[i]
+ if state and state.isWideBattleLayout and state:isWideBattleLayout() then
+ return state
+ end
+ end
+ return nil
+end
+
+-- Shift classic SGB zones to the centred UI. A full-width base zone extends
+-- into both margins, keeping the canvas' paper color continuous; narrower
+-- sprite and status zones move with the classic UI content.
+local function centerClassicZones(zones, offset)
+ if not zones or offset == 0 then return zones end
+ local shifted = {}
+ for i, zone in ipairs(zones) do
+ local copy = {}
+ for key, value in pairs(zone) do copy[key] = value end
+ if copy.x == 0 and copy.w == Renderer.WIDTH then
+ copy.w = copy.w + offset * 2
+ else
+ copy.x = (copy.x or 0) + offset
+ end
+ shifted[i] = copy
+ end
+ return shifted
+end
+
function Game:draw()
-- the UI canvas clears transparent when the overworld's world pass
-- shows through beneath it; opaque full-screen states get the classic
-- white clear
local base = self.stack:visibleBase()
local worldBelow = self.stack.states[base] == self.overworld
- -- The UI surface is resolved once, before any state draws: the top state
- -- may want more than the Game Boy's 160x144 (the widescreen battle layout
- -- asks for 304x144). Anything else keeps the classic surface, so a menu
- -- pushed over a wide battle brings the screen straight back to 160x144.
+ -- A wide battle holds its 304px surface through every menu or prompt it
+ -- opens. States that do not draw the wide battle composition are centred
+ -- in that surface below, so their classic coordinates and hit testing stay
+ -- unchanged. Outside a battle, including the title screen, the option is
+ -- intentionally inactive because it is a battle-layout setting.
local top = self.stack:top()
- if top and top.uiSize then
+ local wideBattle = Game.wideBattleInStack(self.stack)
+ local classicOffset = 0
+ if wideBattle and wideBattle.uiSize then
+ Renderer:setUISize(wideBattle:uiSize())
+ classicOffset = math.floor((select(1, Renderer:uiSize()) - Renderer.WIDTH) / 2)
+ elseif top and top.uiSize then
Renderer:setUISize(top:uiSize())
else
Renderer:setUISize(Renderer.WIDTH, Renderer.HEIGHT)
end
Renderer:beginFrame(worldBelow)
- self.stack:draw()
+ for i = self.stack:visibleBase(), #self.stack.states do
+ local state = self.stack.states[i]
+ local wideState = state and state.isWideBattleLayout
+ and state:isWideBattleLayout()
+ if state and state.draw then
+ if classicOffset ~= 0 and not wideState then
+ love.graphics.push()
+ love.graphics.translate(classicOffset, 0)
+ state:draw()
+ love.graphics.pop()
+ else
+ state:draw()
+ end
+ end
+ end
-- SGB colorization: the topmost state that knows its palette owns the
-- screen (overlays like text boxes inherit from what's beneath them);
-- the overworld's world pass colors each visible map area separately
- local zones, worldZones
+ local zones, worldZones, zoneOwner
for i = #self.stack.states, 1, -1 do
local s = self.stack.states[i]
if s.sgbPalettes then
zones = s:sgbPalettes(self)
+ zoneOwner = s
break
end
end
+ if classicOffset ~= 0 and zoneOwner
+ and not (zoneOwner.isWideBattleLayout
+ and zoneOwner:isWideBattleLayout()) then
+ zones = centerClassicZones(zones, classicOffset)
+ end
-- 14's render.zones: weather/lighting overlays and custom colorization
-- recolor or add zones before the blit
if ModRuntime.wantsHook("render.zones") then
diff --git a/src/core/GameVersion.lua b/src/core/GameVersion.lua
index cef349af..855b632f 100644
--- a/src/core/GameVersion.lua
+++ b/src/core/GameVersion.lua
@@ -1,12 +1,13 @@
--- Which Gen-1 game this process is running: Red (the historical default) or
--- Blue. 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.
+-- Which Gen-1 game this process is running: Red (the historical default),
+-- Blue, or Yellow. 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.
--
-- Red keeps every un-suffixed path it always used (save.lua, the root cache),
-- so existing installs are untouched; Blue is namespaced under blue/ and
--- _blue so both can be imported and played side by side.
+-- _blue, Yellow under yellow/ and _yellow, so all three can be imported and
+-- played side by side.
--
-- 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
@@ -19,6 +20,7 @@ GameVersion.VERSIONS = {
id = "red",
label = "Red",
displayName = "Pokemon Red",
+ launcherName = "Red", -- game-panel header in the launcher
sha1 = "ea9bcae617fdf159b045185467ae58b2e4a48b9a",
manifest = "tools/rom_manifest.json",
cachePrefix = "", -- Red owns the cache root (backwards compatible)
@@ -28,15 +30,26 @@ GameVersion.VERSIONS = {
id = "blue",
label = "Blue",
displayName = "Pokemon Blue",
+ launcherName = "Blue",
sha1 = "d7037c83e1ae5b39bde3c30787637ba1d4c48ce2",
manifest = "tools/rom_manifest_blue.json",
cachePrefix = "blue/", -- blue/data/generated, blue/assets/generated
saveSuffix = "_blue", -- save_blue.lua / .bak / .tmp
},
+ yellow = {
+ id = "yellow",
+ label = "Yellow",
+ displayName = "Pokemon Yellow",
+ launcherName = "Yellow (alpha)",
+ sha1 = "cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1",
+ manifest = "tools/rom_manifest_yellow.json",
+ cachePrefix = "yellow/", -- yellow/data/generated, yellow/assets/generated
+ saveSuffix = "_yellow", -- save_yellow.lua / .bak / .tmp
+ },
}
--- Launcher column order (Yellow is still a placeholder, handled by the UI).
-GameVersion.ORDER = { "red", "blue" }
+-- Launcher column order.
+GameVersion.ORDER = { "red", "blue", "yellow" }
GameVersion.current = "red"
@@ -53,6 +66,10 @@ function GameVersion.isBlue()
return GameVersion.current == "blue"
end
+function GameVersion.isYellow()
+ return GameVersion.current == "yellow"
+end
+
-- Metadata for a version id, defaulting to the active one.
function GameVersion.info(id)
return GameVersion.VERSIONS[id or GameVersion.current]
diff --git a/src/core/Printer.lua b/src/core/Printer.lua
new file mode 100644
index 00000000..7fae79a1
--- /dev/null
+++ b/src/core/Printer.lua
@@ -0,0 +1,44 @@
+-- Game Boy Printer stand-in. Yellow's printer jobs
+-- (engine/printer/printer.asm: PrintPokedexEntry and friends) drove a
+-- serial thermal printer; this port renders the same printout into a PNG
+-- under prints/ in the save directory instead, and the caller shows a
+-- dialog with where it landed. Scaled up 4x so the "print" is legible
+-- on a modern screen.
+
+local Logger = require("src.core.Logger")
+
+local Printer = {}
+
+local SCALE = 4
+
+-- Render drawFn (which draws a w x h GB-pixel image at 0,0) into
+-- prints/_.png. Returns the save-dir-relative path, or nil
+-- and an error string (headless / no canvas support degrades gracefully).
+function Printer.save(name, w, h, drawFn)
+ if not (love.graphics and love.graphics.newCanvas) then
+ return nil, "no graphics"
+ end
+ local ok, canvas = pcall(love.graphics.newCanvas, w * SCALE, h * SCALE)
+ if not ok then return nil, tostring(canvas) end
+ love.graphics.push("all")
+ love.graphics.setCanvas(canvas)
+ love.graphics.origin()
+ love.graphics.scale(SCALE, SCALE)
+ love.graphics.clear(1, 1, 1, 1)
+ love.graphics.setColor(1, 1, 1, 1)
+ local drawOk, drawErr = pcall(drawFn)
+ love.graphics.pop()
+ if not drawOk then return nil, tostring(drawErr) end
+ local data
+ ok, data = pcall(canvas.newImageData, canvas)
+ if not ok then return nil, tostring(data) end
+ love.filesystem.createDirectory("prints")
+ local path = ("prints/%s_%s.png"):format(name, os.date("%Y-%m-%d_%H%M%S"))
+ local encOk, err = pcall(data.encode, data, "png", path)
+ if not encOk then return nil, tostring(err) end
+ Logger.info("printed %s -> %s/%s",
+ name, love.filesystem.getSaveDirectory(), path)
+ return path
+end
+
+return Printer
diff --git a/src/core/SaveData.lua b/src/core/SaveData.lua
index d8277c9f..e6e0a5a3 100644
--- a/src/core/SaveData.lua
+++ b/src/core/SaveData.lua
@@ -24,10 +24,11 @@ local GameVersion = require("src.core.GameVersion")
local SaveData = {}
--- Progress files carry the game-version suffix so Red and Blue saves coexist:
--- Red keeps save.lua / .bak / .tmp exactly as before; Blue is save_blue.lua
--- (+ .bak/.tmp). options.lua is deliberately shared across versions (it holds
--- global preferences and the mod enable-state, not per-playthrough data).
+-- Progress files carry the game-version suffix so Red / Blue / Yellow saves
+-- coexist: Red keeps save.lua / .bak / .tmp exactly as before; Blue is
+-- save_blue.lua and Yellow is save_yellow.lua (+ .bak/.tmp). options.lua is
+-- deliberately shared across versions (it holds global preferences and the
+-- mod enable-state, not per-playthrough data).
local OPTIONS_FILENAME = "options.lua"
-- Main / backup / staged-witness names for a version (defaults to the active
@@ -109,11 +110,14 @@ local function makePortableFs(dir)
}
end
-local function detectPortable()
- if portableChecked then return portableBase end
- portableChecked = true
- portableBase = false
- if not (love and love.filesystem) then return false end
+-- Every folder a player might reasonably call "the game folder", best first:
+-- the packaged-app container, the folder holding the executable, then the
+-- source itself. Portable mode is the case where one of these holds the
+-- marker; the list itself is just locations, marker or not, which is also
+-- what the mods panel needs to notice a mod dropped beside the game by hand
+-- (LauncherMods.strays). Empty on Android/iOS and outside LOVE.
+function SaveData.gameFolders()
+ if not (love and love.filesystem) then return {} end
-- Desktop only: portable mode carries the save (and, since issue #74, the
-- ROM cache) in the game folder next to the executable/source. On
-- Android/iOS the source is a read-only package with no such folder, so
@@ -121,7 +125,7 @@ local function detectPortable()
if love.system and love.system.getOS then
local osName = love.system.getOS()
if osName ~= "Windows" and osName ~= "Linux" and osName ~= "OS X" then
- return false
+ return {}
end
end
local src = love.filesystem.getSource and love.filesystem.getSource()
@@ -149,15 +153,24 @@ local function detectPortable()
-- Order: the packaged-app containing folder (macOS .app / Linux AppImage),
-- then the source-base directory (next to a packaged .exe), then the source
-- itself (a `love ` run drops portable.txt in the game folder).
- -- First one holding the marker wins. Built by appending so a nil (e.g. no
- -- .app in the path) never truncates the ipairs scan.
+ -- Built by appending so a nil (e.g. no .app in the path) never truncates
+ -- the ipairs scan.
local candidates = {}
local appDir = appContainer(src) or appContainer(sbd) or appImageContainer()
if appDir then candidates[#candidates + 1] = appDir end
- if sbd then candidates[#candidates + 1] = sbd end
- if src then candidates[#candidates + 1] = src end
- for _, base in ipairs(candidates) do
- if base ~= "" and pathExists(base .. SEP .. PORTABLE_MARKER) then
+ if sbd and sbd ~= "" then candidates[#candidates + 1] = sbd end
+ if src and src ~= "" then candidates[#candidates + 1] = src end
+ return candidates
+end
+
+-- The game folder carrying portable.txt, or false. First candidate holding
+-- the marker wins.
+local function detectPortable()
+ if portableChecked then return portableBase end
+ portableChecked = true
+ portableBase = false
+ for _, base in ipairs(SaveData.gameFolders()) do
+ if pathExists(base .. SEP .. PORTABLE_MARKER) then
portableBase = base
break
end
@@ -323,8 +336,9 @@ end
-- under options.saveSlots[version]; the active slot is also cached
-- process-wide (like GameVersion.current) so the hot saveNames path does
-- not re-read options every call. A false cache entry means "no slot in
--- use" and the flat legacy path (save.lua / save_blue.lua) is used, which
--- keeps a brand-new install and every pre-slots caller working unchanged.
+-- use" and the flat legacy path (save.lua / save_blue.lua / save_yellow.lua)
+-- is used, which keeps a brand-new install and every pre-slots caller
+-- working unchanged.
local activeSlotCache = {} -- version -> slotId in use, or false when none
local slotsChecked = {} -- version -> true once resolved this process
@@ -336,17 +350,18 @@ local function slotNames(version, id)
end
-- the pre-slots flat names a version always used (save.lua for Red,
--- save_blue.lua for Blue); still the destination before any slot exists
+-- save_blue.lua / save_yellow.lua for the others); still the destination
+-- before any slot exists
local function legacyNames(version)
local main = "save" .. GameVersion.saveSuffix(version) .. ".lua"
return main, main .. ".bak", main .. ".tmp"
end
-- Slot resolution is only meaningful for versions GameVersion actually knows
--- (red/blue). The launcher also renders a locked placeholder tab ("yellow")
--- that has no info entry and therefore no saveSuffix; resolving its legacy
--- names would index a nil info table and crash. Treat any unknown version as
--- having no slots so the slot APIs degrade to empty/no-op instead.
+-- (red / blue / yellow). An unknown id has no info entry and therefore no
+-- saveSuffix; resolving its legacy names would index a nil info table and
+-- crash. Treat any unknown version as having no slots so the slot APIs
+-- degrade to empty/no-op instead.
local function knownVersion(version)
return GameVersion.info(version) ~= nil
end
@@ -892,7 +907,7 @@ end)
-- a .tmp witness before the swap, so a crash mid-write is recoverable.
function SaveData.save(data, mods)
-- write to the file matching this save's own version, not just the active
- -- one, so a Blue playthrough always lands in save_blue.lua
+ -- one, so Blue/Yellow playthroughs land in save_blue.lua / save_yellow.lua
local FILENAME, BACKUP_FILENAME, TMP_FILENAME = saveNames(data.version)
if data.options then
SaveData.saveOptions(data.options)
diff --git a/src/core/Sound.lua b/src/core/Sound.lua
index 328fa8a6..5ef8b754 100644
--- a/src/core/Sound.lua
+++ b/src/core/Sound.lua
@@ -192,10 +192,45 @@ local function newCrySource(data, species, def)
return newFileSource(resolved)
end
+-- Yellow's voiced Pikachu clips (audio/pikachu_pcm.asm
+-- PlayPikachuSoundClip): 1-bit PCM decoded to WAVs at import
+-- (data.audio.pikaCries = clip count). Returns the source, nil when the
+-- cache carries no clips (Red/Blue) or headless.
+function Sound.playPikaCry(data, n)
+ if not love.audio then return nil end
+ local count = data.audio and data.audio.pikaCries
+ if not count then return nil end
+ n = math.max(1, math.min(count, n or 1))
+ local key = "pikacry:" .. n
+ local src = cache[key]
+ if src == false then return nil end
+ if not src then
+ local ok, s = pcall(love.audio.newSource,
+ ("assets/generated/audio/pika_cries/cry_%02d.wav"):format(n), "static")
+ if not ok then
+ cache[key] = false
+ return nil
+ end
+ s:setVolume(BASE_VOLUME * volumeScale)
+ cache[key] = s
+ src = s
+ end
+ src:stop()
+ src:play()
+ played("cry", "PIKACHU_PCM_" .. n, "PIKACHU")
+ return src
+end
+
-- returns the source (nil headless) so callers that block on the cry
-- like the original's PlayCry -> WaitForSoundToFinish can poll it
function Sound.playCry(data, species)
if not love.audio then return nil end
+ -- Yellow voices every Pikachu cry with the PCM clips (the chip cry is
+ -- never used for the species there); clip 1 is the everyday "Pika!"
+ if species == "PIKACHU" then
+ local src = Sound.playPikaCry(data, 1)
+ if src then return src end
+ end
local cries = data.audio and data.audio.cries
local def = cries and cries[species]
if not def then return nil end
diff --git a/src/core/chip_worker.lua b/src/core/chip_worker.lua
index 705afbae..fccba224 100644
--- a/src/core/chip_worker.lua
+++ b/src/core/chip_worker.lua
@@ -5,8 +5,10 @@
--
-- Protocol -- main thread pushes command tables onto the "chipaudio_cmd"
-- channel and drains produced buffers off "chipaudio_out":
--- cmd = "play" { gen, header, allowLoops, audio } start a song
+-- cmd = "play" { gen, header, allowLoops, audio,
+-- channelVolumes?, channelPitches? }
-- cmd = "stop" halt production
+-- cmd = "channelMix" { volumes, pitches } per-hw volume/pitch
-- cmd = "invalidate" drop the bank cache
-- cmd = "quit" end the thread
-- out buffers are tagged with the play's `gen` so the main thread can
@@ -45,6 +47,12 @@ local function handle(cmd)
engine = nil
outCh:clear() -- drop any buffers left from the previous song
data = { audio = cmd.audio }
+ if cmd.channelVolumes ~= nil then
+ ChipSynth.setChannelVolumes(cmd.channelVolumes)
+ end
+ if cmd.channelPitches ~= nil then
+ ChipSynth.setChannelPitches(cmd.channelPitches)
+ end
local ok, eng = pcall(ChipSynth.newEngine, data, cmd.header,
{ allowLoops = cmd.allowLoops })
if ok then
@@ -58,6 +66,9 @@ local function handle(cmd)
engine = nil
finished = false
outCh:clear()
+ elseif cmd.cmd == "channelMix" then
+ if cmd.volumes ~= nil then ChipSynth.setChannelVolumes(cmd.volumes) end
+ if cmd.pitches ~= nil then ChipSynth.setChannelPitches(cmd.pitches) end
elseif cmd.cmd == "invalidate" then
ChipSynth.invalidateBanks()
elseif cmd.cmd == "quit" then
diff --git a/src/import/CacheFs.lua b/src/import/CacheFs.lua
index c85ed8d0..eb7fd646 100644
--- a/src/import/CacheFs.lua
+++ b/src/import/CacheFs.lua
@@ -32,11 +32,11 @@ local CacheFs = {}
local SEP = package.config:sub(1, 1)
-- Cache-relative paths are prefixed with this before every read/write, so a
--- Blue import lands in blue/ (see src.core.GameVersion) while a Red import
--- keeps the historical root. The launcher sets it per import / per readiness
--- check; it stays "" for Red. Runtime *reads* (require / newImage) do NOT go
--- through here -- CacheFs.mountVersion overlays the active version's subtree
--- onto the un-prefixed paths instead.
+-- Blue/Yellow import lands under its GameVersion.cachePrefix (blue/, yellow/)
+-- while a Red import keeps the historical root. The launcher sets it per
+-- import / per readiness check; it stays "" for Red. Runtime *reads*
+-- (require / newImage) do NOT go through here -- CacheFs.mountVersion overlays
+-- the active version's subtree onto the un-prefixed paths instead.
CacheFs.prefix = ""
local function withPrefix(rel)
@@ -126,9 +126,9 @@ local function resolveMount()
if okl and lib then
local oks, fn = pcall(function() return lib.PHYSFS_mount end)
if oks and fn then
- physfsMountFn = function(d, append)
+ physfsMountFn = function(d, mountPoint, append)
if append == nil then append = true end
- local okr, ret = pcall(fn, d, "", append and 1 or 0)
+ local okr, ret = pcall(fn, d, mountPoint or "", append and 1 or 0)
return okr and ret ~= 0
end
break
@@ -145,7 +145,7 @@ end
local function mountReadable(dir, append)
local fn = resolveMount()
if not fn then return false end
- return fn(dir, append)
+ return fn(dir, "", append)
end
-- PHYSFS_unmount, resolved the same way PHYSFS_mount is. Only
@@ -330,16 +330,16 @@ end
-- Overlay the active version's extracted cache onto the un-prefixed read
-- paths, so require("data.generated.*") and love.graphics.newImage(
-- "assets/generated/*") resolve to that version's files. Red lives at the
--- cache root and needs nothing; Blue lives under blue/ and is *prepended* so
--- it wins over any Red copy at the root and over the game source. Called
--- once at boot, before Game:load (main.lua). Returns true when nothing was
--- needed or the mount succeeded.
+-- cache root and needs nothing; non-Red versions (blue/, yellow/, …) are
+-- *prepended* so they win over any Red copy at the root and over the game
+-- source. Called once at boot, before Game:load (main.lua). Returns true
+-- when nothing was needed or the mount succeeded.
function CacheFs.mountVersion(version)
local prefix = require("src.core.GameVersion").cachePrefix(version)
if prefix == "" then return true end -- Red: already at the root
- local sub = prefix:gsub("/+$", "") -- "blue/" -> "blue"
+ local sub = prefix:gsub("/+$", "") -- "blue/" / "yellow/" -> bare dir
-- The cache root is the portable game folder when active, else LÖVE's OS
- -- save directory (where love.filesystem wrote blue/...).
+ -- save directory (where love.filesystem wrote blue/... or yellow/...).
local base = CacheFs.root()
if not base and love.filesystem.getSaveDirectory then
base = love.filesystem.getSaveDirectory()
@@ -355,12 +355,12 @@ function CacheFs.mountVersion(version)
end
-- Undo mountVersion. A process normally mounts exactly one version and then
--- boots it, but the launcher can open the save editor on a Blue save, close
--- it, and press Play on Red: with blue/ still prepended, Red's
--- require("data.generated.*") and its generated art would silently resolve to
--- Blue's files. Callers must also drop the generated modules from
--- package.loaded (src.core.Data:unloadGenerated) -- unmounting alone only
--- fixes the read path, not what require already cached.
+-- boots it, but the launcher can open the save editor on a Blue/Yellow save,
+-- close it, and press Play on Red: with that version's subtree still
+-- prepended, Red's require("data.generated.*") and its generated art would
+-- silently resolve to the other game's files. Callers must also drop the
+-- generated modules from package.loaded (src.core.Data:unloadGenerated) --
+-- unmounting alone only fixes the read path, not what require already cached.
--
-- Returns true when nothing was mounted or the unmount took. Red is a no-op
-- because its cache lives at the root and was never overlaid.
@@ -385,4 +385,31 @@ function CacheFs.unmountVersion(version)
return done
end
+-- Mount `dir` at `mountPoint` for the length of `fn()`, then take it back off
+-- the read path and hand back whatever fn returned.
+--
+-- Every other mount here is permanent and lands at the physfs root: this one
+-- exists to *look* at a folder the game has deliberately not mounted, which
+-- is a different job. The mods panel uses it to read a mods/ folder sitting
+-- beside the executable of a non-portable install (LauncherMods.strays).
+-- Because it unmounts again, and because a non-empty mountPoint keeps the
+-- tree in its own corner of the namespace while it is up, a folder inspected
+-- this way can never shadow a game file or change what the running game
+-- resolves -- which is what makes it safe to point at a folder whose contents
+-- nobody has validated.
+--
+-- Returns nil when the mount is unavailable (no ffi, no PHYSFS symbol, or the
+-- mount was refused), which callers must treat as "could not look", not as
+-- "nothing there". An error inside fn still unmounts before it propagates.
+function CacheFs.withMounted(dir, mountPoint, fn)
+ if not dir or dir == "" then return nil end
+ local mount, unmount = resolveMount(), resolveUnmount()
+ if not (mount and unmount) then return nil end
+ if not mount(dir, mountPoint, true) then return nil end
+ local ok, res = pcall(fn)
+ unmount(dir)
+ if not ok then error(res, 0) end
+ return res
+end
+
return CacheFs
diff --git a/src/import/RomExtractor.lua b/src/import/RomExtractor.lua
index 6b3c3a21..c28c0d69 100644
--- a/src/import/RomExtractor.lua
+++ b/src/import/RomExtractor.lua
@@ -163,8 +163,12 @@ function RomExtractor:extractTilesets()
for pos = offset, offset + 15 do block[#block + 1] = blocksRaw[pos] end
blocks[#blocks + 1] = block
end
+ -- Red/Blue keep collision lists in ROM0; Yellow moved them to bank 1
+ -- (pokeyellow Overworld_Coll at 01:4ac2). Pointers in $4000-$7FFF are
+ -- banked; treat ROM0-range pointers as bank 0.
+ local collBank = collisionPointer < 0x4000 and 0 or 1
local walkable = sorted(self:readTerminated(
- 0, collisionPointer, 0xFF))
+ collBank, collisionPointer, 0xFF))
local warpPointer = self.rom:word(
warpPointers.bank, warpPointers.address + (index - 1) * 2)
local warpTiles = unique(self:readTerminated(
@@ -447,14 +451,26 @@ function RomExtractor:extractSprites()
local pointer = self.rom:word(pointerTable.bank, address)
local firstHalf = self.rom:byte(pointerTable.bank, address + 2)
local bank = self.rom:byte(pointerTable.bank, address + 3)
- local byteLength = spec.imageWidth * spec.imageHeight / 4
- local frames = spec.imageHeight / 16
+ local width = spec.imageWidth
+ local height = spec.imageHeight
+ local byteLength = width * height / 4
+ local frames = height / 16
local expected = firstHalf * (frames >= 6 and 2 or 1)
- assert(byteLength == expected, constName .. ": sprite length mismatch")
+ if byteLength ~= expected then
+ -- Commercial ROM sheet length wins over pret PNG atlases (Yellow nurse
+ -- PNG is taller than the 12-tile SpriteSheetPointerTable entry).
+ byteLength = expected
+ assert(byteLength * 4 % width == 0,
+ constName .. ": ROM sprite length not tile-aligned")
+ height = byteLength * 4 / width
+ frames = height / 16
+ expected = firstHalf * (frames >= 6 and 2 or 1)
+ assert(byteLength == expected, constName .. ": sprite length mismatch")
+ end
local base = spec.imageBase
if not written[base] then
self:write2bpp(self.rom:bytes(bank, pointer, byteLength),
- spec.imageWidth, spec.imageHeight,
+ width, height,
"sprites/" .. base .. ".png", true)
written[base] = true
end
@@ -862,20 +878,24 @@ function RomExtractor:extractPalettes()
local order = self.manifest.paletteOrder
local paletteTable = self:symbol("SuperPalettes")
local function scale5(value) return round(value * 255 / 31) end
- local palettes = {}
- for index, name in ipairs(order) do
- local colors = {}
- for color = 0, 3 do
- local value = self.rom:word(paletteTable.bank,
- paletteTable.address + (index - 1) * 8 + color * 2)
- colors[#colors + 1] = {
- scale5(bit.band(value, 0x1F)),
- scale5(bit.band(bit.rshift(value, 5), 0x1F)),
- scale5(bit.band(bit.rshift(value, 10), 0x1F)),
- }
+ local function readTable(symbol, names)
+ local out = {}
+ for index, name in ipairs(names) do
+ local colors = {}
+ for color = 0, 3 do
+ local value = self.rom:word(symbol.bank,
+ symbol.address + (index - 1) * 8 + color * 2)
+ colors[#colors + 1] = {
+ scale5(bit.band(value, 0x1F)),
+ scale5(bit.band(bit.rshift(value, 5), 0x1F)),
+ scale5(bit.band(bit.rshift(value, 10), 0x1F)),
+ }
+ end
+ out[name] = colors
end
- palettes[name] = colors
+ return out
end
+ local palettes = readTable(paletteTable, order)
local monsterTable = self:symbol("MonsterPalettes")
local monsterPalettes = {}
for index, species in ipairs(self.manifest.dexOrder) do
@@ -887,6 +907,11 @@ function RomExtractor:extractPalettes()
source = "ROM:SuperPalettes + MonsterPalettes",
palettes = palettes, order = order, pokemon = monsterPalettes,
}
+ -- Yellow (and GBC carts) also carry CGBBasePalettes beside SuperPalettes.
+ if self.symbols["CGBBasePalettes"] then
+ data.cgbBase = readTable(self:symbol("CGBBasePalettes"), order)
+ data.source = data.source .. " + CGBBasePalettes"
+ end
self:write("palettes", data)
self:tick("Color palettes", 1, 1)
return data
@@ -915,6 +940,10 @@ function RomExtractor:extractIcons()
GRASS = "assets/generated/icons/plant.png",
SNAKE = "assets/generated/icons/snake.png",
QUADRUPED = "assets/generated/icons/quadruped.png",
+ -- Yellow's ICON_PIKACHU draws from the overworld PikachuSprite sheet
+ -- (data/icon_pointers.asm mon_icon_header PikachuSprite, 0/12);
+ -- only referenced when the manifest's iconOrder includes it
+ PIKACHU = "assets/generated/sprites/pikachu.png",
}
local frames = {
{ "bug", "BugIconFrame1", "BugIconFrame2" },
@@ -1048,7 +1077,9 @@ function RomExtractor:extractPokemon()
local typeById = self:typesById()
local names = self:symbol("MonsterNames")
local baseStats = self:symbol("BaseStats")
- local mewStats = self:symbol("MewBaseStats")
+ -- Red/Blue keep Mew outside BaseStats (pret pokered MewBaseStats).
+ -- Yellow stores Mew as dex 151 inside BaseStats (pret/pokeyellow).
+ local mewStats = self.symbols["MewBaseStats"] and self:symbol("MewBaseStats")
local decodedNames = {}
for index = 1, #speciesOrder do
decodedNames[index] = self.rom:decodeText(
@@ -1067,7 +1098,7 @@ function RomExtractor:extractPokemon()
local dex = assert(dexBySpecies[species],
"missing dex number for " .. species)
local row
- if species == "MEW" then
+ if species == "MEW" and mewStats then
row = self.rom:bytes(mewStats.bank, mewStats.address, 28)
else
row = self.rom:bytes(
@@ -1410,6 +1441,142 @@ function RomExtractor:extractText()
}
end
+function RomExtractor:extractYellowTitleArt()
+ -- pret/pokeyellow engine/movie/title_yellow.asm: the Yellow title is a
+ -- tilemap composition over BOTH tile banks. LoadYellowTitleScreenGFX
+ -- loads PokemonLogoGraphics into vChars2 (BG ids $00-$7F),
+ -- TitlePikachuBGGraphics into vChars1 (ids $80-$EF),
+ -- TitlePikachuOBGraphics at vChars1 tile $70 (ids $F0-$FC, also the eye
+ -- OAM tiles), and PokemonLogoCornerGraphics at vChars1 tile $7D (ids
+ -- $FD-$FF). Every tilemap mixes ids from several of those sheets, so a
+ -- single-sheet lookup shows checkerboard garbage where a foreign-bank id
+ -- lands (e.g. blank id $00 = logo tile 0, not Pikachu BG tile 0).
+ if not self.symbols["TitlePikachuBGGraphics"] then return end
+ -- raw sheets, kept for debugging / mod reference
+ self:raw2bpp("TitlePikachuBGGraphics", 128, 32,
+ "title/pikachu_bg.png", { transparent = true })
+ self:raw2bpp("TitlePikachuOBGraphics", 96, 8,
+ "title/pikachu_ob.png", { transparent = true })
+
+ -- Tile counts are the Graphics..GraphicsEnd symbol gaps in pokeyellow.sym.
+ local function sheetTiles(label, count, transparent)
+ local symbol = self:symbol(label)
+ local raw = self.rom:bytes(symbol.bank, symbol.address, count * 16)
+ local tiles = {}
+ for offset = 1, #raw, 16 do
+ local one = {}
+ for i = offset, offset + 15 do one[#one + 1] = raw[i] end
+ tiles[#tiles + 1] = ImageWriter.decode2bpp(one, 8, 8, transparent)
+ end
+ return tiles
+ end
+ local logo = sheetTiles("PokemonLogoGraphics", 115)
+ local corner = sheetTiles("PokemonLogoCornerGraphics", 3)
+ local bg = sheetTiles("TitlePikachuBGGraphics", 64)
+ local ob = sheetTiles("TitlePikachuOBGraphics", 12)
+ local obClear = sheetTiles("TitlePikachuOBGraphics", 12, true)
+ local function tileFor(id)
+ if id < 0x80 then return logo[id + 1] end
+ if id < 0xF0 then return bg[id - 0x80 + 1] end
+ if id < 0xFD then return ob[id - 0xF0 + 1] end
+ return corner[id - 0xFD + 1]
+ end
+ -- OAM-style blit: color-0 pixels stay whatever the target already holds
+ -- (ImageWriter.blit copies alpha-0 pixels wholesale, which would punch
+ -- holes into the face under the eye sprites).
+ local function blitSprite(target, tile, tx, ty, flipX)
+ for y = 0, 7 do
+ for x = 0, 7 do
+ local sx = flipX and 7 - x or x
+ local r, g, b, a = tile:getPixel(sx, y)
+ if a ~= 0 then target:setPixel(tx + x, ty + y, r, g, b, a) end
+ end
+ end
+ end
+ -- cells = { {id, col, row}, ... }; untouched cells stay transparent
+ local function compose(cols, rows, cells)
+ local pose = ImageWriter.blank(cols * 8, rows * 8, 1, 1, 1, 0)
+ for _, cell in ipairs(cells) do
+ local tile = tileFor(cell[1])
+ if tile then ImageWriter.blit(pose, tile, cell[2] * 8, cell[3] * 8) end
+ end
+ return pose
+ end
+ local function mapCells(map, cols, rows)
+ local ids = self.rom:bytes(map.bank, map.address, cols * rows)
+ local cells = {}
+ for index, id in ipairs(ids) do
+ cells[#cells + 1] =
+ { id, (index - 1) % cols, math.floor((index - 1) / cols) }
+ end
+ return cells
+ end
+
+ -- TitleScreen_PlacePokemonLogo: 16x7 box at (2,1). Yellow's logo sheet
+ -- is deduplicated (unlike Red's sequential rip), so the raw2bpp
+ -- pokemon_logo.png from extractField is scrambled; overwrite it with the
+ -- tilemap composition. Kept opaque: TitleState clears to white behind it.
+ self:save(compose(16, 7,
+ mapCells(self:symbol("TitleScreenPokemonLogoTilemap"), 16, 7)),
+ "title/pokemon_logo.png")
+
+ -- TitleScreen_PlacePikaSpeechBubble: 7x4 box at (6,4) plus the two tail
+ -- tiles $64/$65 the routine pokes at (9,8) -- one row below the box, over
+ -- blank cells of the Pikachu row. Composed 7x5 with the tail at (3,4);
+ -- matteColor0 clears the outside-the-balloon whites, the outline protects
+ -- the interior.
+ local bubbleCells = mapCells(
+ self:symbol("TitleScreenPikaBubbleTilemap"), 7, 4)
+ bubbleCells[#bubbleCells + 1] = { 0x64, 3, 4 }
+ bubbleCells[#bubbleCells + 1] = { 0x65, 4, 4 }
+ self:save(ImageWriter.matteColor0(compose(7, 5, bubbleCells)),
+ "title/pika_bubble.png")
+
+ -- TitleScreen_PlacePikachu: 12x9 box at (4,8) plus the right-ear edge
+ -- tiles it pokes down column 16 (rows 10-13) -- composed 13x9 with those
+ -- at relative column 12, rows 2-5. The open eyes are OAM
+ -- (TitleScreenPikachuEyesOAMData, copied at place time): OB tiles 0-3 at
+ -- screen (56,80)/(88,80) blocks, the left eye x-flipped (attr $22); baked
+ -- into the composition relative to the box origin px(32,64).
+ local pikaCells = mapCells(self:symbol("TitleScreenPikachuTilemap"), 12, 9)
+ pikaCells[#pikaCells + 1] = { 0x96, 12, 2 }
+ pikaCells[#pikaCells + 1] = { 0x9d, 12, 3 }
+ pikaCells[#pikaCells + 1] = { 0xa7, 12, 4 }
+ pikaCells[#pikaCells + 1] = { 0xb1, 12, 5 }
+ local pikachu = ImageWriter.matteColor0(compose(13, 9, pikaCells))
+ -- DoTitleScreenFunction's blink rewrites the eye OAM tile ids with
+ -- `and $f3 / or e` (e = 0 open / 4 half / 8 closed), so the OB sheet
+ -- holds three 4-tile eye sets. Bake the open set into pikachu.png and
+ -- save half/closed as standalone overlays for TitleState's blink.
+ local EYE_LAYOUT = {
+ { 2, 24, 16, true }, { 1, 32, 16, true },
+ { 4, 24, 24, true }, { 3, 32, 24, true },
+ { 1, 56, 16 }, { 2, 64, 16 },
+ { 3, 56, 24 }, { 4, 64, 24 },
+ }
+ -- Blink overlays for the (24,16)-(71,31) eye band: the BG face is
+ -- eyeless (the eyes are OAM), so each overlay = the blank-face crop
+ -- with the half (+4) / closed (+8) tile set composited color-0
+ -- transparent -- exactly what the hardware shows mid-blink.
+ local overlays = {}
+ for suffix, base in pairs({ eyes_half = 4, eyes_closed = 8 }) do
+ local overlay = ImageWriter.blank(48, 16, 1, 1, 1, 0)
+ ImageWriter.blit(overlay, pikachu, 0, 0, 24, 16, 48, 16)
+ for _, e in ipairs(EYE_LAYOUT) do
+ blitSprite(overlay, obClear[base + e[1]], e[2] - 24, e[3] - 16, e[4])
+ end
+ overlays[suffix] = overlay
+ end
+ -- open eyes bake into pikachu.png AFTER the blank-face crops
+ for _, e in ipairs(EYE_LAYOUT) do
+ blitSprite(pikachu, obClear[e[1]], e[2], e[3], e[4])
+ end
+ self:save(pikachu, "title/pikachu.png")
+ for suffix, overlay in pairs(overlays) do
+ self:save(overlay, "title/" .. suffix .. ".png")
+ end
+end
+
function RomExtractor:raw2bpp(label, width, height, relative, options)
options = options or {}
local expected = width * height / 4
@@ -1454,6 +1621,8 @@ function RomExtractor:extractField()
"title/copyright.png"); tick()
self:raw2bpp("GameFreakLogoGraphics", 72, 8,
"title/gamefreak_inc.png"); tick()
+ -- Yellow fixed Pikachu title art (no-op on Red/Blue manifests).
+ self:extractYellowTitleArt(); tick()
local fallingStar = self:raw2bpp(
"FallingStar", 8, 8, "intro/falling_star.png",
@@ -1502,35 +1671,71 @@ function RomExtractor:extractField()
end
self:save(star, "intro/big_star.png"); tick()
- local gengar = self:symbol("FightIntroBackMon")
- local gengarRaw = self.rom:bytes(
- gengar.bank, gengar.address, 96 * 16)
- local gengarTiles = {}
- for offset = 1, #gengarRaw, 16 do
- local raw = {}
- for index = offset, offset + 15 do raw[#raw + 1] = gengarRaw[index] end
- gengarTiles[#gengarTiles + 1] = ImageWriter.decode2bpp(raw, 8, 8)
- end
- for number = 1, 3 do
- local tilemap = self:symbol("GengarIntroTiles" .. number)
- local tileIds = self.rom:bytes(tilemap.bank, tilemap.address, 49)
- local pose = ImageWriter.blank(56, 56, 0, 0, 0, 0)
- for index, tileId in ipairs(tileIds) do
- ImageWriter.blit(pose, gengarTiles[tileId + 1],
- (index - 1) % 7 * 8, math.floor((index - 1) / 7) * 8)
+ -- Yellow has no FightIntro Gengar/Nidorino fight (pret/pokeyellow
+ -- engine/movie/intro_yellow.asm); write blank placeholders so Title/
+ -- Intro still find the expected paths. Red/Blue keep the tilemap rip.
+ if self.symbols["FightIntroBackMon"] then
+ local gengar = self:symbol("FightIntroBackMon")
+ local gengarRaw = self.rom:bytes(
+ gengar.bank, gengar.address, 96 * 16)
+ local gengarTiles = {}
+ for offset = 1, #gengarRaw, 16 do
+ local raw = {}
+ for index = offset, offset + 15 do raw[#raw + 1] = gengarRaw[index] end
+ gengarTiles[#gengarTiles + 1] = ImageWriter.decode2bpp(raw, 8, 8)
+ end
+ for number = 1, 3 do
+ local tilemap = self:symbol("GengarIntroTiles" .. number)
+ local tileIds = self.rom:bytes(tilemap.bank, tilemap.address, 49)
+ local pose = ImageWriter.blank(56, 56, 0, 0, 0, 0)
+ for index, tileId in ipairs(tileIds) do
+ ImageWriter.blit(pose, gengarTiles[tileId + 1],
+ (index - 1) % 7 * 8, math.floor((index - 1) / 7) * 8)
+ end
+ pose = ImageWriter.matteColor0(pose)
+ self:save(pose, "intro/gengar_" .. number .. ".png"); tick()
+ end
+ else
+ for number = 1, 3 do
+ self:save(ImageWriter.blank(56, 56, 0, 0, 0, 0),
+ "intro/gengar_" .. number .. ".png"); tick()
end
- pose = ImageWriter.matteColor0(pose)
- self:save(pose, "intro/gengar_" .. number .. ".png"); tick()
end
- for number, label in ipairs({
- "FightIntroFrontMon", "FightIntroFrontMon2", "FightIntroFrontMon3",
- }) do
- self:raw2bpp(label, 48, 48,
- "intro/red_nidorino_" .. number .. ".png",
- { transparent = true, columns = true })
- tick()
+ if self.symbols["FightIntroFrontMon"] then
+ for number, label in ipairs({
+ "FightIntroFrontMon", "FightIntroFrontMon2", "FightIntroFrontMon3",
+ }) do
+ self:raw2bpp(label, 48, 48,
+ "intro/red_nidorino_" .. number .. ".png",
+ { transparent = true, columns = true })
+ tick()
+ end
+ else
+ for number = 1, 3 do
+ self:save(ImageWriter.blank(48, 48, 1, 1, 1, 0),
+ "intro/red_nidorino_" .. number .. ".png"); tick()
+ end
end
+
+ -- Optional Yellow-only intro atlas (pret/pokeyellow gfx/yellow_intro.asm).
+ if self.symbols["YellowIntroGraphics1"] then
+ self:raw2bpp("YellowIntroGraphics1", 128, 64,
+ "intro/yellow_intro_1.png")
+ end
+ if self.symbols["YellowIntroGraphics2"] then
+ -- atlas2 doubles as the intro's OBJ tile bank (vChars0); OBJ color 0
+ -- is hardware-transparent, and the BG draws it over a white clear so
+ -- BG cells lose nothing
+ self:raw2bpp("YellowIntroGraphics2", 128, 128,
+ "intro/yellow_intro_2.png", { transparent = true })
+ end
+ -- Yellow intro clouds (intro_yellow.asm YellowIntroCloudGFX): 8 tiles,
+ -- two 4-tile animation frames -- saved 32x16, one frame per row.
+ if self.symbols["YellowIntroCloudGFX"] then
+ self:raw2bpp("YellowIntroCloudGFX", 32, 16, "intro/clouds.png")
+ end
+
for number = 1, 2 do
self:writeCompressedPic(
"ShrinkPic" .. number, "intro/shrink" .. number .. ".png")
@@ -1563,10 +1768,27 @@ function RomExtractor:extractField()
end
self:save(symbolSheet, "slots/symbols.png"); tick()
- local emotes = ImageWriter.blank(48, 16, 1, 1, 1, 0)
- for index, label in ipairs({
- "ShockEmote", "QuestionEmote", "HappyEmote",
- }) do
+ -- Emote sheet layout comes from manifest.field.emotionBubbles so the
+ -- versions can differ: Red ships the three shared bubbles, Yellow adds
+ -- the five Pikachu-only ones (emotion_bubbles.asm Skull/Heart/Bolt/
+ -- Zzz/FishEmote, used by the PikachuEmotionTable reactions).
+ local EMOTE_SYMBOLS = {
+ EXCLAMATION_BUBBLE = "ShockEmote", QUESTION_BUBBLE = "QuestionEmote",
+ SMILE_BUBBLE = "HappyEmote", SKULL_BUBBLE = "SkullEmote",
+ HEART_BUBBLE = "HeartEmote", BOLT_BUBBLE = "BoltEmote",
+ ZZZ_BUBBLE = "ZzzEmote", FISH_BUBBLE = "FishEmote",
+ }
+ local bubbleDefs = self.manifest.field.emotionBubbles
+ and self.manifest.field.emotionBubbles.bubbles
+ local emoteLabels = {}
+ for _, b in ipairs(bubbleDefs or {}) do
+ emoteLabels[#emoteLabels + 1] = EMOTE_SYMBOLS[b.name]
+ end
+ if #emoteLabels == 0 then
+ emoteLabels = { "ShockEmote", "QuestionEmote", "HappyEmote" }
+ end
+ local emotes = ImageWriter.blank(#emoteLabels * 16, 16, 1, 1, 1, 0)
+ for index, label in ipairs(emoteLabels) do
local symbol = self:symbol(label)
local image = ImageWriter.decode2bpp(
self.rom:bytes(symbol.bank, symbol.address, 64), 16, 16, true)
@@ -1574,6 +1796,26 @@ function RomExtractor:extractField()
end
self:save(emotes, "emotes.png"); tick()
+ -- Yellow-only: the Surfing Pikachu minigame sheets
+ -- (gfx/surfing_pikachu.asm) at pret's canvas widths, so
+ -- src/ui/SurfingMinigame.lua's quads can be read off the source pngs.
+ -- 1a is the BG set (water/beach/score tiles, opaque); 1b the OAM pose
+ -- sheet and 1c the intro set (both color-0 transparent).
+ for _, spec in ipairs({
+ { "SurfingPikachu1Graphics1", 65, 40, false, "minigame/surf_1a.png" },
+ { "SurfingPikachu1Graphics2", 256, 128, true, "minigame/surf_1b.png" },
+ { "SurfingPikachu1Graphics3", 144, 96, true, "minigame/surf_1c.png" },
+ }) do
+ if self.symbols[spec[1]] then
+ local symbol = self:symbol(spec[1])
+ local tilesPerRow = spec[3] / 8
+ local image = ImageWriter.decode2bpp(
+ self.rom:bytes(symbol.bank, symbol.address, spec[2] * 16),
+ spec[3], spec[2] / tilesPerRow * 8, spec[4])
+ self:save(image, spec[5])
+ end
+ end
+
self:raw1bpp("LedgeHoppingShadow", 8, 8,
"fx/shadow.png", true); tick()
for _, spec in ipairs({
@@ -1664,7 +1906,9 @@ end
function RomExtractor:extractAudio()
self:beginStage("Sound programs")
local metadata = copy(self.manifest.audio)
- local bankOrder = { 2, 8, 31 }
+ -- Yellow adds a fourth music bank ($20: Jessie & James, Surfing
+ -- Pikachu, GB Printer); the manifest names the pack when it needs it.
+ local bankOrder = metadata.programBanks or { 2, 8, 31 }
local chunks = {}
for index, bank in ipairs(bankOrder) do
local first = Rom.offset(bank, 0x4000) + 1
@@ -1683,6 +1927,7 @@ function RomExtractor:extractAudio()
for name, header in pairs(metadata.musicHeaders) do
songs[name] = header
end
+ metadata.pikaCries = self:extractPikachuCries()
local cries = {}
local cryData = metadata.cryData
for index, species in ipairs(self.manifest.constants.speciesOrder) do
@@ -1709,6 +1954,57 @@ function RomExtractor:extractAudio()
return metadata
end
+-- Yellow's voiced Pikachu clips (audio/pikachu_cries_pointers.asm
+-- PikachuCriesPointerTable, 42 `dba` rows; each clip is `dw length` then
+-- 1-bit PCM, MSB first -- home/pikachu_cries.asm PlayPikachuPCM toggles
+-- rAUD3LEVEL per bit at roughly 190 CPU cycles a sample). Decoded to
+-- plain 8-bit mono WAVs; returns the clip count for data.audio.pikaCries,
+-- or nil when the manifest has no pointer table (Red/Blue).
+function RomExtractor:extractPikachuCries()
+ if not self.symbols["PikachuCriesPointerTable"] then return nil end
+ local NUM = 42 -- NUM_PIKA_CRIES
+ local RATE = 22050 -- ~4.19 MHz / ~190 cycles per sample
+ -- byte -> 8 samples, MSB first (LoadNextSoundClipSample: `and $80`)
+ local lut = {}
+ for byte = 0, 255 do
+ local out = {}
+ for bit = 7, 0, -1 do
+ local on = math.floor(byte / 2 ^ bit) % 2 == 1
+ out[#out + 1] = string.char(on and 0xE0 or 0x20)
+ end
+ lut[byte] = table.concat(out)
+ end
+ local function u16(v)
+ return string.char(v % 256, math.floor(v / 256) % 256)
+ end
+ local function u32(v)
+ return string.char(v % 256, math.floor(v / 256) % 256,
+ math.floor(v / 65536) % 256, math.floor(v / 16777216) % 256)
+ end
+ local CacheFs = require("src.import.CacheFs")
+ local pointers = self:symbol("PikachuCriesPointerTable")
+ for index = 0, NUM - 1 do
+ local row = self.rom:bytes(pointers.bank, pointers.address + index * 3, 3)
+ local bank, address = row[1], row[2] + row[3] * 256
+ local header = self.rom:bytes(bank, address, 2)
+ local length = header[1] + header[2] * 256
+ local raw = self.rom:bytes(bank, address + 2, length)
+ local samples = {}
+ for i, byte in ipairs(raw) do samples[i] = lut[byte] end
+ local pcm = table.concat(samples)
+ local wav = "RIFF" .. u32(36 + #pcm) .. "WAVEfmt " .. u32(16)
+ .. u16(1) .. u16(1) .. u32(RATE) .. u32(RATE) .. u16(1) .. u16(8)
+ .. "data" .. u32(#pcm) .. pcm
+ local ok, err = CacheFs.write(
+ ("assets/generated/audio/pika_cries/cry_%02d.wav"):format(index + 1),
+ wav)
+ if not ok then
+ error("could not write pika cry " .. (index + 1) .. ": " .. tostring(err))
+ end
+ end
+ return NUM
+end
+
function RomExtractor:run()
local results = {}
results.constants = self:extractConstants()
diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua
index 99618938..82609f51 100644
--- a/src/import/RomImporter.lua
+++ b/src/import/RomImporter.lua
@@ -37,8 +37,8 @@ local REQUIRED_FILES = {
-- "Split-screen ROM selector" first-run palette (matches FirstRun.dc.html from
-- the Claude Design project): a dark neon arcade panel, one column per game.
--- Red is live; Blue and Yellow are lit placeholders until those games are
--- supported. Values are 0-255 RGB; alpha is applied per draw.
+-- Red, Blue, and Yellow share the same importer flow once listed in
+-- GameVersion.VERSIONS. Values are 0-255 RGB; alpha is applied per draw.
local PAL = {
-- radial background gradient (bright navy at top-centre -> near black)
bgTop = { 22, 34, 74 }, -- #16224a
@@ -302,13 +302,13 @@ end
-- it directly through love.filesystem -- already mounted at the physfs
-- root, so no io.* absolute-path handling is needed.
--
--- Only a .gb whose SHA maps to a version that is not yet ready counts as
+-- Only a .gb/.gbc whose SHA maps to a version that is not yet ready counts as
-- pending. GameActivity always writes the SAF pick to picked_rom.gb, so a
--- naive "first .gb wins" scan would re-import Red when the player tries to
--- add Blue (issue #167).
+-- naive "first ROM wins" scan would re-import Red when the player tries to
+-- add Blue (issue #167). Yellow carts are typically .gbc.
local function findPendingRom(ready)
for _, name in ipairs(love.filesystem.getDirectoryItems("")) do
- if name:lower():match("%.gb$") and love.filesystem.getInfo(name, "file") then
+ if name:lower():match("%.gbc?$") and love.filesystem.getInfo(name, "file") then
local data = love.filesystem.read(name)
if type(data) == "string" and #data == 1024 * 1024 then
local version = GameVersion.forSha1(sha1(data))
@@ -360,14 +360,14 @@ local function chooseRom(promptName)
local platform = love.system.getOS()
if platform == "OS X" then
return commandOutput(
- ([[osascript -e 'POSIX path of (choose file with prompt "%s" of type {"gb"})' 2>/dev/null]])
+ ([[osascript -e 'POSIX path of (choose file with prompt "%s" of type {"gb", "gbc"})' 2>/dev/null]])
:format(prompt))
elseif platform == "Windows" then
local script = table.concat({
"Add-Type -AssemblyName System.Windows.Forms;",
"$d=New-Object System.Windows.Forms.OpenFileDialog;",
"$d.Title='" .. prompt .. "';",
- "$d.Filter='Game Boy ROM (*.gb)|*.gb|All files (*.*)|*.*';",
+ "$d.Filter='Game Boy ROM (*.gb;*.gbc)|*.gb;*.gbc|All files (*.*)|*.*';",
-- write the pick as UTF-8: the console's OEM codepage would mangle
-- non-ASCII names (Pokémon -> Pok\x82mon) and crash any text draw
-- that shows them (#325)
@@ -377,11 +377,11 @@ local function chooseRom(promptName)
'powershell -NoProfile -STA -Command "' .. script .. '"')
elseif platform == "Linux" then
local path = commandOutput(
- ([[zenity --file-selection --title="%s" --file-filter="Game Boy ROM | *.gb" 2>/dev/null]])
+ ([[zenity --file-selection --title="%s" --file-filter="Game Boy ROM | *.gb *.gbc" 2>/dev/null]])
:format(prompt))
if path then return path end
return commandOutput(
- [[kdialog --getopenfilename "$HOME" "*.gb|Game Boy ROM" 2>/dev/null]])
+ [[kdialog --getopenfilename "$HOME" "*.gb *.gbc|Game Boy ROM" 2>/dev/null]])
end
return nil
end
@@ -470,10 +470,11 @@ local function updaterAllowed()
return true
end
--- The launcher runs Red and Blue as two independent columns. Each dropped or
+-- The launcher runs each GameVersion as an independent tab. Each dropped or
-- chosen ROM is routed to its version by SHA-1, extracted into that version's
--- own cache (Red at the root, Blue under blue/), so both can be imported and
--- played side by side. onComplete(version) hands the chosen game off to boot.
+-- own cache (Red at the root, Blue under blue/, Yellow under yellow/), so all
+-- can be imported and played side by side. onComplete(version) hands the
+-- chosen game off to boot.
-- opts: launcher (a fresh import stays on the launcher instead of auto-booting),
-- forceImport (treat every version as not-yet-imported, so re-import is forced),
-- onEditSave(version, slotId) (host handler for the Edit affordance on a save
@@ -489,6 +490,14 @@ function RomImporter.new(onComplete, opts)
forceImport = opts.forceImport or false,
onEditSave = opts.onEditSave,
android = android,
+ -- Android drag: the launcher is handed no move events at all (main.lua
+ -- forwards neither touchmoved nor mousemoved while it is up), and its mouse
+ -- emulation is what "no reliable pointer polling" below refers to.
+ -- love.touch IS pollable, so where it exists a touch drag can be resolved
+ -- inside draw the same way the desktop mouse is. Where it does not, every
+ -- Android path stays exactly as it was: act on press, never arm.
+ touchPollable = android and love.touch ~= nil
+ and love.touch.getTouches ~= nil and love.touch.getPosition ~= nil,
tab = "red", -- active launcher tab: "red"/"blue"/"yellow"/"mods"
logo = love.graphics.newImage("assets/logo/logo.png"),
bcg = love.graphics.newImage("assets/logo/bcg.png"),
@@ -514,6 +523,10 @@ function RomImporter.new(onComplete, opts)
-- modScroll is the list scroll offset (px, clamped in draw); modNotice is
-- the last install/delete result { ok, text } shown as a line above the list.
mods = nil, modScroll = 0, modNotice = nil,
+ -- Page scroll offset (px) for the column under the tab bar -- panel, updater
+ -- banner and footer -- used only while that column is taller than the window
+ -- (see draw()). Clamped against content in draw, reset on a tab change.
+ pageScroll = 0,
-- Android SAF: which game tab should receive the next picked_save.sav when
-- focus consumes it (set by chooseSaveImport before opening the picker).
androidPendingVersion = nil,
@@ -542,13 +555,18 @@ function RomImporter.new(onComplete, opts)
CacheFs.prefix = saved
self.returning[version] =
(not ready) and marker ~= nil and marker ~= markerFor(version)
- self.romName[version] = "pokemon_" .. info.id .. ".gb"
+ self.romName[version] = "pokemon_" .. info.id
+ .. (info.id == "yellow" and ".gbc" or ".gb")
end
- -- Android: import a save-dir .gb that is not yet ready (USB drop or a
+ -- Android: import a save-dir .gb/.gbc that is not yet ready (USB drop or a
-- leftover SAF pick), routed by SHA-1. Already-imported carts are skipped
- -- so a stale picked_rom.gb cannot block the opposite version.
- if android and not (self.ready.red and self.ready.blue) then
+ -- so a stale picked_rom.gb cannot block another version.
+ local needRom = false
+ for _, version in ipairs(GameVersion.ORDER) do
+ if not self.ready[version] then needRom = true; break end
+ end
+ if android and needRom then
local name, data = findPendingRom(self.ready)
if name then self:startData(data, name) end
end
@@ -608,7 +626,7 @@ function RomImporter:focus(f)
local version = self.androidPendingExportVersion or self:_savedropTarget()
self.androidPendingExportVersion = nil
self.saveNotice[version] = { ok = true, text = "Save exported." }
- if self.tab == "mods" or self.tab == "yellow" then self.tab = version end
+ if self.tab == "mods" then self.tab = version end
return
end
local modName = findPendingMod(false)
@@ -629,9 +647,13 @@ function RomImporter:focus(f)
end
return
end
- if self.ready.red and self.ready.blue then return end
- local name, data = findPendingRom(self.ready)
- if name then self:startData(data, name) end
+ for _, v in ipairs(GameVersion.ORDER) do
+ if not self.ready[v] then
+ local name, data = findPendingRom(self.ready)
+ if name then self:startData(data, name) end
+ return
+ end
+ end
end
function RomImporter:setError(message, version)
@@ -660,7 +682,8 @@ local function resetPointerCursor(self)
end
-- Verify + extract a ROM. The version is decided by the ROM's own SHA-1, so
--- dropping a Red or Blue cart into either column always lands in the right one.
+-- dropping a Red, Blue, or Yellow cart into any column always lands in the
+-- right one.
function RomImporter:startData(data, displayName)
if self.workState == "working" then return end
if type(data) ~= "string" then
@@ -676,14 +699,14 @@ function RomImporter:startData(data, displayName)
local version = GameVersion.forSha1(actualHash)
if not version then
self:setError(("Unsupported ROM (SHA-1 %s). Use an unmodified US Pokemon "
- .. "Red or Blue ROM."):format(actualHash))
+ .. "Red, Blue, or Yellow ROM."):format(actualHash))
return
end
local info = GameVersion.info(version)
-- Bring the launcher to this version's tab so its progress bar is on screen
-- (a dropped cart is routed by SHA-1 regardless of which tab was showing).
- if self.tab == "red" or self.tab == "blue" or self.tab == "yellow" then
+ if GameVersion.VERSIONS[self.tab] then
self.tab = version
end
self.importing = version
@@ -731,7 +754,7 @@ function RomImporter:startData(data, displayName)
self.returning[version] = false
self.romName[version] = (displayName
and (displayName:match("[^/\\]+$") or displayName)) or self.romName[version]
- -- Android: drop the consumed save-dir .gb (picked_rom.gb or a USB copy)
+ -- Android: drop the consumed save-dir .gb/.gbc (picked_rom.gb or a USB copy)
-- so the next Choose / focus cannot treat it as a fresh pending ROM.
if self.android and type(displayName) == "string"
and not displayName:find("[/\\]") then
@@ -845,12 +868,12 @@ function RomImporter:chooseMod()
end
-- Which game a dropped .sav imports into: a .sav has no version signature of
--- its own, so it lands on the active game tab. When a non-game tab (mods, or
--- the locked yellow placeholder) is showing, default to red -- the always-
--- present first game -- rather than guess.
+-- its own, so it lands on the active game tab. When a non-game tab (mods) is
+-- showing, default to red -- the always-present first game -- rather than
+-- guess.
function RomImporter:_savedropTarget()
local v = self.tab
- if v == "red" or v == "blue" then return v end
+ if GameVersion.VERSIONS[v] then return v end
return "red"
end
@@ -861,8 +884,7 @@ end
-- playable with its game's data present.
function RomImporter:_importSave(version, source)
if self.workState == "working" then return end
- if self.tab == "red" or self.tab == "blue" or self.tab == "mods"
- or self.tab == "yellow" then
+ if GameVersion.VERSIONS[self.tab] or self.tab == "mods" then
self.tab = version
end
if not self.ready[version] then
@@ -971,8 +993,8 @@ function RomImporter:choose(version)
if self.workState == "working" then return end
self.chooseVersion = version or "red"
if self.android then
- -- Prefer a not-yet-imported .gb already in the save dir (USB copy, or a
- -- fresh SAF pick). Never reuse an already-imported cart's file -- that
+ -- Prefer a not-yet-imported .gb/.gbc already in the save dir (USB copy, or
+ -- a fresh SAF pick). Never reuse an already-imported cart's file -- that
-- was the #167 failure mode (second Choose just re-extracted Red).
local name, data = findPendingRom(self.ready)
if name then
@@ -995,8 +1017,8 @@ function RomImporter:choose(version)
return
end
-- Handheld Linux (Anbernic stock OS / PortMaster) rarely has zenity or
- -- kdialog. Fall back to the same "drop a .gb next to the game" scan used
- -- on Android, which works when the game is launched as an unpacked
+ -- kdialog. Fall back to the same "drop a .gb/.gbc next to the game" scan
+ -- used on Android, which works when the game is launched as an unpacked
-- directory (see build-rg34xxsp.sh).
local name, data = findPendingRom(self.ready)
if name then
@@ -1010,13 +1032,13 @@ function RomImporter:choose(version)
or "the game folder"
self.notice = {
version = self.chooseVersion,
- status = "No file picker. Copy your .gb into:",
+ status = "No file picker. Copy your .gb/.gbc into:",
detail = where,
}
return
end
if love.system.getOS() ~= "OS X" and love.system.getOS() ~= "Windows" then
- self:setError("File selection is unavailable here. Drop the .gb file onto the window.")
+ self:setError("File selection is unavailable here. Drop the .gb/.gbc file onto the window.")
end
end
@@ -1101,18 +1123,22 @@ function RomImporter:_updatePadCursor(dt)
self._padCursor.y = math.max(0, math.min(h, ny))
end
- -- Right stick scrolls the active list (save slots or mods).
+ -- Right stick scrolls the active list (save slots or mods), or the whole page
+ -- when it is the thing that overflows.
local ry = self._padAxis.righty or 0
if math.abs(ry) > PAD_DEAD then
self:_activatePadCursor()
local step = -ry * 480 * dt
- if self.tab == "mods" then
+ local maxPage = self._pageMax or 0
+ if maxPage > 0 then
+ self.pageScroll = math.max(0, math.min(maxPage, (self.pageScroll or 0) + step))
+ elseif self.tab == "mods" then
local maxS = self._modMax or 0
if maxS > 0 then
local next = (self.modScroll or 0) + step
self.modScroll = math.max(0, math.min(maxS, next))
end
- elseif self.tab == "red" or self.tab == "blue" then
+ elseif GameVersion.VERSIONS[self.tab] then
local maxS = (self._slotMax and self._slotMax[self.tab]) or 0
if maxS > 0 then
local next = (self.slotScroll[self.tab] or 0) + step
@@ -1138,7 +1164,7 @@ function RomImporter:gamepadpressed(_, button)
-- Start / Select: Play if ready, else Choose ROM on the active game tab.
if self.workState == "working" then return end
local version = self.tab
- if version == "red" or version == "blue" then
+ if GameVersion.VERSIONS[version] then
if self.ready[version] then self:play(version) else self:choose(version) end
end
end
@@ -1371,6 +1397,24 @@ local function roundedCard(x, y, w, h, r)
love.graphics.rectangle("line", x, y, w, h, r, r)
end
+-- {top, bottom} of the scrolling page viewport, or nil while the page fits and
+-- nothing scrolls. Written once per frame by draw(); read by the two hit tests
+-- (`inside` for clicks, `_ptIn` for hover) so a control scrolled out from under
+-- the pinned header, or past the window bottom, stops responding at the moment
+-- it stops being visible. Rects that live in the pinned header carry
+-- `pinned = true` and are exempt.
+local pageBand = nil
+
+-- Page-scroll arithmetic, kept pure (no love, no self) so the engine tier can
+-- pin it: given how tall the column under the tab bar wants to be and how much
+-- room is left under it, say whether the page scrolls, where it sits, and how
+-- far it can go. A window that grew back pulls the offset down with it rather
+-- than leaving the page parked past its own end.
+function RomImporter.pageScrollFor(naturalH, viewportH, scroll)
+ local maxPage = math.max(0, (naturalH or 0) - math.max(0, viewportH or 0))
+ return maxPage > 0, clamp(scroll or 0, 0, maxPage), maxPage
+end
+
function RomImporter:draw()
local width, height = love.graphics.getDimensions()
local s = clamp(height / 768, 0.7, 1.6)
@@ -1528,17 +1572,16 @@ function RomImporter:draw()
end
-- Footer (Boi's Club Games logo + trust warning), measured first so the
- -- content region knows where it must stop. Drawn near the end.
+ -- content region knows where it must stop. Only its height is fixed here:
+ -- it is laid out from a top edge further down, which is the window bottom
+ -- while the page fits and the end of the scrolled content when it does not.
local warningWidth = math.min(appW - 32 * s, 640 * s)
local _, warningLines = self.warningFont:getWrap(TRUST_WARNING, warningWidth)
local warningH = #warningLines * self.warningFont:getHeight()
- local warningY = height - warningH - 12 * s
local bcgW, bcgH = self.bcg:getDimensions()
local bcgScale = math.min(math.min(appW - 48 * s, 190 * s) / bcgW, height * 0.06 / bcgH)
local bcgDW, bcgDH = bcgW * bcgScale, bcgH * bcgScale
- local bcgX, bcgY = appX + (appW - bcgDW) / 2, warningY - bcgDH - 6 * s
- self.bcgButton = { x = bcgX, y = bcgY, width = bcgDW, height = bcgDH }
- local footerTop = bcgY - 10 * s
+ local footerH = 10 * s + bcgDH + 6 * s + warningH + 12 * s
-- Logo: centred over the strip, width clamped, gentle bob + glow pulse. The
-- resting metrics fix the tab bar's top so the layout never shifts as it bobs.
@@ -1574,36 +1617,53 @@ function RomImporter:draw()
-- Content region: from below the tab bar down to the footer, minus the
-- updater band when one is showing.
local contentTop = tabBarY + tabBarH + 16 * s
- local contentBottom = footerTop - (bannerActive and (bannerH + 20 * s) or 6 * s)
+ local bannerBand = bannerActive and (bannerH + 20 * s) or 6 * s
local cX = appX + padH
local cW = appW - 2 * padH
+ local contentBottom = height - footerH - bannerBand
local cH = math.max(0, contentBottom - contentTop)
- -- tab bar (rebuilds self.tabRects)
+ -- Page scroll. Everything under the tab bar -- panel, updater banner and
+ -- footer -- is one column: too short a window scrolls it instead of letting
+ -- the panel run under a footer pinned to the window bottom (a stacked
+ -- single-column layout on a phone-shaped window overflows by a card or two).
+ -- The panels report their natural height as they draw, so the decision reads
+ -- the previous frame's measurement, the same one-frame settle the slot and
+ -- mod lists already rely on. While the page fits, `paged` is false and every
+ -- measurement below is what it always was.
+ local viewportH = math.max(0, height - contentTop)
+ self._panelNaturalH = self._panelNaturalH or {}
+ local naturalH = (self._panelNaturalH[self.tab] or 0) + bannerBand + footerH
+ local paged, pageScroll, maxPage =
+ RomImporter.pageScrollFor(naturalH, viewportH, self.pageScroll)
+ self.pageScroll, self._pageMax = pageScroll, maxPage
+ -- read by the hit tests; a scrolled control is live only inside the viewport
+ pageBand = paged and { contentTop, height } or nil
+
+ -- tab bar (rebuilds self.tabRects). Pinned: it is the launcher's navigation,
+ -- and it sits above the scrolling viewport.
self:_drawTabBar(cX, tabBarY, cW, tabBarH, chip)
- -- content: game panel for a version tab, mods panel for the mods tab
- if self.tab == "mods" then
- self:_drawModsPanel(cX, contentTop, cW, cH)
- else
- self:_drawGamePanel(self.tab, cX, contentTop, cW, cH)
+ local panelY = contentTop - (paged and self.pageScroll or 0)
+ if paged then
+ love.graphics.setScissor(math.floor(appX), math.floor(contentTop),
+ math.ceil(appW), math.ceil(viewportH))
end
- -- logo, over the split, with a gentle bob + gold glow + sweeping shine
- local bob = math.sin(pulse * (2 * math.pi / 4)) * 6 * s
- local lx, ly = (width - logoDW) / 2, logoY + bob
- love.graphics.setBlendMode("add")
- love.graphics.setColor(1, 0.85, 0.2, 0.16 + 0.12 * (0.5 + 0.5 * math.sin(pulse * 1.6)))
- love.graphics.draw(self.logo, (width - logoDW * 1.05) / 2, ly - logoDH * 0.025, 0,
- logoScale * 1.05, logoScale * 1.05)
- love.graphics.setBlendMode("alpha")
- local shineW = 0.16
- self.shineShader:send("shinePos", -shineW + ((pulse % 2.8) / 2.8) * (1 + 2 * shineW))
- self.shineShader:send("shineW", shineW)
- love.graphics.setShader(self.shineShader)
- love.graphics.setColor(1, 1, 1, 1)
- love.graphics.draw(self.logo, lx, ly, 0, logoScale, logoScale)
- love.graphics.setShader()
+ -- content: game panel for a version tab, mods panel for the mods tab
+ local panelH
+ if self.tab == "mods" then
+ panelH = self:_drawModsPanel(cX, panelY, cW, cH, paged)
+ else
+ panelH = self:_drawGamePanel(self.tab, cX, panelY, cW, cH, paged)
+ end
+ panelH = panelH or 0
+ self._panelNaturalH[self.tab] = panelH
+
+ -- The updater band and the footer follow the content: pinned to the window
+ -- bottom while the page fits, riding at the end of the scroll when it does not.
+ local bandTop = paged and (panelY + panelH) or contentBottom
+ local footerTop = bandTop + bannerBand
-- Self-updater banner: a compact pill centred in the reserved band just above
-- the footer, on every tab. Same green "Play" treatment on its CTA.
@@ -1611,7 +1671,7 @@ function RomImporter:draw()
if bannerActive then
local bannerW = math.min(appW - 32 * s, 560 * s)
local bx = appX + (appW - bannerW) / 2
- local by = contentBottom + math.max(0, (footerTop - contentBottom - bannerH) / 2)
+ local by = bandTop + math.max(0, (footerTop - bandTop - bannerH) / 2)
local r = 12 * s
local accent = PAL.gold
@@ -1692,11 +1752,17 @@ function RomImporter:draw()
end
-- footer: a hairline top border, the BCG mark (inverted to white, glowing
- -- brighter on hover) + the trust warning with its live bois.icu link.
+ -- brighter on hover) + the trust warning with its live bois.icu link. Laid
+ -- out downward from footerTop, so the same code serves the pinned and the
+ -- scrolled position.
love.graphics.setLineWidth(1)
col(PAL.cardBorder, 0.18)
love.graphics.line(appX + padH, footerTop, appX + appW - padH, footerTop)
+ local bcgX, bcgY = appX + (appW - bcgDW) / 2, footerTop + 10 * s
+ local warningY = bcgY + bcgDH + 6 * s
+ self.bcgButton = { x = bcgX, y = bcgY, width = bcgDW, height = bcgDH }
+
local bcgHot = self:_hover(self.bcgButton)
love.graphics.setShader(self.invertShader)
love.graphics.setBlendMode("add")
@@ -1735,6 +1801,35 @@ function RomImporter:draw()
end
end
+ -- End of the scrolling column; the logo and the page scrollbar are pinned and
+ -- draw outside it.
+ if paged then love.graphics.setScissor() end
+
+ -- logo, over the split, with a gentle bob + gold glow + sweeping shine
+ local bob = math.sin(pulse * (2 * math.pi / 4)) * 6 * s
+ local lx, ly = (width - logoDW) / 2, logoY + bob
+ love.graphics.setBlendMode("add")
+ love.graphics.setColor(1, 0.85, 0.2, 0.16 + 0.12 * (0.5 + 0.5 * math.sin(pulse * 1.6)))
+ love.graphics.draw(self.logo, (width - logoDW * 1.05) / 2, ly - logoDH * 0.025, 0,
+ logoScale * 1.05, logoScale * 1.05)
+ love.graphics.setBlendMode("alpha")
+ local shineW = 0.16
+ self.shineShader:send("shinePos", -shineW + ((pulse % 2.8) / 2.8) * (1 + 2 * shineW))
+ self.shineShader:send("shineW", shineW)
+ love.graphics.setShader(self.shineShader)
+ love.graphics.setColor(1, 1, 1, 1)
+ love.graphics.draw(self.logo, lx, ly, 0, logoScale, logoScale)
+ love.graphics.setShader()
+
+ -- page scrollbar: the same thin thumb the lists use, against the app edge
+ if paged then
+ local thumbH = math.max(24 * s, viewportH * (viewportH / naturalH))
+ local thumbY = contentTop + (viewportH - thumbH) * (self.pageScroll / maxPage)
+ col(PAL.cardBorder, 0.35)
+ love.graphics.rectangle("fill", appX + appW - padH * 0.5, thumbY, 3 * s, thumbH,
+ 1.5 * s, 1.5 * s)
+ end
+
-- CRT scanlines + vignette, over everything
love.graphics.setColor(1, 1, 1, 1)
love.graphics.draw(self.scanlineImage, self.scanlineQuad, 0, 0)
@@ -1830,11 +1925,22 @@ function RomImporter:draw()
end
local function inside(r, x, y)
- return r and x >= r.x and x <= r.x + r.width and y >= r.y and y <= r.y + r.height
+ if not (r and x >= r.x and x <= r.x + r.width and y >= r.y and y <= r.y + r.height) then
+ return false
+ end
+ -- Page-scroll mode: only the header is pinned, so any other rect is a
+ -- scrolled one and is live only where the viewport actually shows it.
+ if pageBand and not r.pinned and (y < pageBand[1] or y > pageBand[2]) then
+ return false
+ end
+ return true
end
function RomImporter:mousepressed(x, y, button)
if self._rename then return end -- the rename modal swallows all clicks
+ -- Whether a press can be ARMED and resolved on release, which needs a
+ -- pollable pointer: always on desktop, on Android only where love.touch is.
+ local armDrag = (not self.android) or self.touchPollable
-- right-click a save-slot row to rename it (#205); desktop only (touch
-- has no secondary button)
if button == 2 then
@@ -1873,6 +1979,10 @@ function RomImporter:mousepressed(x, y, button)
self.tab = t.id
self._slotPress = nil -- drop any half-started slot drag on tab change
self._modPress = nil -- and any half-started mod toggle press
+ self._pagePress = nil -- and any half-started page pan
+ -- Each tab is its own column of a different length; carrying one tab's
+ -- offset into another lands somewhere arbitrary.
+ self.pageScroll = 0
return
end
end
@@ -1901,11 +2011,12 @@ function RomImporter:mousepressed(x, y, button)
return
end
-- SAVE SLOT rows / Edit / Delete. The two labels are checked first so a tap
- -- on either never also selects the row. On desktop a press only ARMS a row
- -- click: _updateSlotDrag commits it on release when the pointer did not move
- -- (a moved pointer scrolls instead). Android has no reliable pointer
- -- polling, so it selects on press. Edit and Delete fire immediately (small
- -- fixed targets, no scroll conflict).
+ -- on either never also selects the row. A press only ARMS a row click:
+ -- _updateSlotDrag commits it on release when the pointer did not move (a
+ -- moved pointer scrolls instead). Android arms too wherever love.touch can
+ -- be polled; without that there is nothing to resolve a release with, so it
+ -- keeps selecting on press. Edit and Delete fire immediately (small fixed
+ -- targets, no scroll conflict).
for _, r in ipairs(self.slotDeleteRects or {}) do
if inside(r, x, y) then
self:_deleteSlot(self.panelVersion, r.id)
@@ -1920,11 +2031,12 @@ function RomImporter:mousepressed(x, y, button)
end
for _, r in ipairs(self.slotRects or {}) do
if inside(r, x, y) then
- if self.android then
+ if not armDrag then
self:_selectSlot(self.panelVersion, r.id)
else
self._slotPress = { version = self.panelVersion, id = r.id, y0 = y,
- scroll0 = self.slotScroll[self.panelVersion] or 0, moved = false }
+ scroll0 = self.slotScroll[self.panelVersion] or 0,
+ pageScroll0 = self.pageScroll or 0, moved = false }
end
return
end
@@ -1947,15 +2059,20 @@ function RomImporter:mousepressed(x, y, button)
end
for _, r in ipairs(self.modRects or {}) do
if inside(r, x, y) then
- if self.android then
+ if not armDrag then
self:_toggleMod(r.id)
else
- self._modPress = { id = r.id, y0 = y,
- scroll0 = self.modScroll or 0, moved = false }
+ self._modPress = { id = r.id, y0 = y, scroll0 = self.modScroll or 0,
+ pageScroll0 = self.pageScroll or 0, moved = false }
end
return
end
end
+ -- Nothing was hit. On a scrolling page that is a press on empty background,
+ -- which is the natural place to grab and pan from.
+ if armDrag and (self._pageMax or 0) > 0 then
+ self._pagePress = { y0 = y, scroll0 = self.pageScroll or 0 }
+ end
end
function RomImporter:keypressed(key)
@@ -1972,9 +2089,9 @@ function RomImporter:keypressed(key)
if self.workState == "working" then return end
if key == "return" or key == "space" or key == "kpenter" then
-- Enter acts on the visible game tab: Play if its ROM is ready, otherwise
- -- open its picker. The mods / placeholder tabs have no keyboard action.
+ -- open its picker. The mods tab has no keyboard action.
local version = self.tab
- if version == "red" or version == "blue" then
+ if GameVersion.VERSIONS[version] then
if self.ready[version] then self:play(version) else self:choose(version) end
end
end
@@ -1987,7 +2104,14 @@ end
function RomImporter:_ptIn(r)
local mx, my = self._mx, self._my
- return r and mx >= r.x and mx <= r.x + r.width and my >= r.y and my <= r.y + r.height
+ if not (r and mx >= r.x and mx <= r.x + r.width and my >= r.y and my <= r.y + r.height) then
+ return false
+ end
+ -- Same clip the click path applies, so nothing glows outside the viewport.
+ if pageBand and not r.pinned and (my < pageBand[1] or my > pageBand[2]) then
+ return false
+ end
+ return true
end
function RomImporter:_hover(r)
@@ -2116,8 +2240,9 @@ function RomImporter:_drawTabBar(x, y, w, h, chip)
col(PAL.bgBot, 0.62)
love.graphics.rectangle("fill", cursorX, chipY, chip, chip, r, r)
end
+ -- pinned: the tab bar never scrolls, so it stays live above the viewport
self.tabRects[#self.tabRects + 1] =
- { x = cursorX, y = chipY, width = chip, height = chip, id = t.id }
+ { x = cursorX, y = chipY, width = chip, height = chip, id = t.id, pinned = true }
local segEnd = cursorX + chip
if active then
love.graphics.setFont(self.tabLabelFont)
@@ -2132,7 +2257,7 @@ function RomImporter:_drawTabBar(x, y, w, h, chip)
end
cursorX = segEnd + gap
end
- -- "N of 3 ready" (Red + Blue count; Yellow never ready), hidden if no room
+ -- "N of 3 ready" (Red + Blue + Yellow once in GameVersion.ORDER)
local ready = 0
for _, v in ipairs(GameVersion.ORDER) do if self.ready[v] then ready = ready + 1 end end
love.graphics.setFont(self.readyFont)
@@ -2149,12 +2274,20 @@ end
-- One version's game panel: header (name + status pill), then a responsive
-- two-column grid (left: ROM + SAVE FILES cards + Play; right: SAVE SLOT).
-function RomImporter:_drawGamePanel(version, x, y, w, h)
+-- `paged`: the whole page is scrolling (see draw()), so nothing stretches to
+-- fill `h` -- Play sits right under the SAVE FILES card instead of being pinned
+-- to the column bottom, and the slot card takes its natural height. Returns
+-- the panel's natural height either way, which is what draw() measures the page
+-- against on the next frame.
+function RomImporter:_drawGamePanel(version, x, y, w, h, paged)
local s, pulse = self._s, self.pulse
self.panelVersion = version
- local locked = version == "yellow"
- local info = (not locked) and GameVersion.info(version) or nil
- local gameName = locked and "Pokemon Yellow" or info.displayName
+ -- Defensive: only lock when the version is absent from GameVersion (never
+ -- solely because id == "yellow").
+ local info = GameVersion.info(version)
+ local locked = info == nil
+ local gameName = info and (info.launcherName or info.displayName)
+ or tostring(version)
local ready = (not locked) and self.ready[version] or false
-- header: name + status pill
@@ -2191,12 +2324,13 @@ function RomImporter:_drawGamePanel(version, x, y, w, h)
local rightX = twoCol and (x + colW + colGap) or x
-- ROM card contents by state (rehomes the existing import flow)
- local dropHint = self.android and "Copy the .gb via USB."
- or Strings("Or drop the .gb file here.")
- local accent = locked and PAL.gold or (version == "red" and PAL.red or PAL.blue)
+ local dropHint = self.android and "Copy the .gb/.gbc via USB."
+ or Strings("Or drop the .gb/.gbc file here.")
+ local accent = version == "yellow" and PAL.gold
+ or (version == "red" and PAL.red or PAL.blue)
local romState, romDetail, romBtnLabel, romBtnEnabled, romProgress
if locked then
- romState, romDetail = "Not supported yet", "Yellow support is on the way."
+ romState, romDetail = "Not supported yet", "Support for this game is on the way."
romBtnLabel, romBtnEnabled = "Import unavailable", false
else
local importing = self.importing == version
@@ -2245,7 +2379,6 @@ function RomImporter:_drawGamePanel(version, x, y, w, h)
-- SAVE FILES card: Import save is live once the ROM is imported (playable);
-- Export save is live only when the active slot actually holds a save. The
- -- locked yellow placeholder has no save backend, so both stay disabled. The
-- hint line doubles as the last import/export outcome (green ok / red error).
local sfImportEnabled, sfExportEnabled = false, false
if not locked then
@@ -2281,8 +2414,9 @@ function RomImporter:_drawGamePanel(version, x, y, w, h)
-- vertical placement of the left column
local romY = bodyTop
local saveFilesY = romY + romCardH + 12 * s
+ local leftNaturalH = romCardH + 12 * s + saveFilesH + 12 * s + playH
local playY
- if twoCol then
+ if twoCol and not paged then
playY = bodyTop + bodyH - playH -- pinned to the column's bottom
else
playY = saveFilesY + saveFilesH + 12 * s
@@ -2358,18 +2492,30 @@ function RomImporter:_drawGamePanel(version, x, y, w, h)
self:_playButton(leftX, playY, colW, playH, gameName, ready, locked)
-- SAVE SLOT card (right column, or stacked below Play when single-column).
- -- The locked Yellow placeholder has no save backend (no GameVersion entry, so
- -- no slots can exist); skip the panel entirely rather than draw an empty,
- -- non-functional "+ New save slot" on a COMING SOON game.
+ -- Skip only when the version is absent from GameVersion (no save backend).
+ local slotNaturalH = 0
if not locked then
if twoCol then
- self:_drawSaveSlotPanel(version, rightX, bodyTop, colW, bodyH)
+ _, slotNaturalH = self:_drawSaveSlotPanel(version, rightX, bodyTop, colW, bodyH, paged)
else
local slotY = playY + playH + 12 * s
local slotH = math.max(160 * s, (bodyTop + bodyH) - slotY)
- self:_drawSaveSlotPanel(version, leftX, slotY, colW, slotH)
+ _, slotNaturalH = self:_drawSaveSlotPanel(version, leftX, slotY, colW, slotH, paged)
end
end
+
+ -- Natural height: side by side the two columns overlap, stacked they add up.
+ -- Measured from the panel's own top (y), so draw() can compare it against the
+ -- viewport without knowing anything about the cards inside.
+ local bodyNaturalH
+ if twoCol then
+ bodyNaturalH = math.max(leftNaturalH, slotNaturalH)
+ elseif locked then
+ bodyNaturalH = leftNaturalH
+ else
+ bodyNaturalH = leftNaturalH + 12 * s + slotNaturalH
+ end
+ return (bodyTop - y) + bodyNaturalH
end
-- Reload a version's slot list + active id from SaveData (the source of truth).
@@ -2446,17 +2592,53 @@ end
-- launcher, so a press only ARMS a click (see mousepressed) and this resolves
-- it: a pointer that moved past the threshold scrolls; one that did not, on
-- release, selects. Desktop only -- Android selects on press instead.
+-- Where the pointer is this frame and whether it is held, read by polling
+-- because no move event ever reaches the launcher: the mouse on desktop, the
+-- first active touch on Android. A nil y means "nothing to read" -- the
+-- release branches below do not need one.
+function RomImporter:_pointerHold()
+ if not self.android then return love.mouse.isDown(1), self._my end
+ if not self.touchPollable then return false, nil end
+ local ok, list = pcall(love.touch.getTouches)
+ if not ok or type(list) ~= "table" or list[1] == nil then return false, nil end
+ local ok2, _, ty = pcall(love.touch.getPosition, list[1])
+ if not ok2 or type(ty) ~= "number" then return false, nil end
+ return true, ty
+end
+
function RomImporter:_updateSlotDrag()
- if self.android then return end
- local down = love.mouse.isDown(1)
+ if self.android and not self.touchPollable then return end
+ local down, py = self:_pointerHold()
+ py = py or self._my
+ local maxPage = self._pageMax or 0
+
+ -- A press on empty background pans the page while it overflows. Nothing is
+ -- armed by it, so there is no release action to resolve.
+ local pp = self._pagePress
+ if pp then
+ if down then
+ if maxPage > 0 then
+ self.pageScroll = clamp(pp.scroll0 - (py - pp.y0), 0, maxPage)
+ end
+ else
+ self._pagePress = nil
+ end
+ end
+
local p = self._slotPress
if p then
if down then
- local d = self._my - p.y0
+ local d = py - p.y0
if math.abs(d) > 4 * (self._s or 1) then p.moved = true end
if p.moved then
- local maxS = (self._slotMax and self._slotMax[p.version]) or 0
- self.slotScroll[p.version] = clamp(p.scroll0 - d, 0, maxS)
+ -- Paged, the list has no scroll of its own: the drag pans the page, so
+ -- a swipe that starts on a slot row behaves like one starting beside it.
+ if maxPage > 0 then
+ self.pageScroll = clamp(p.pageScroll0 - d, 0, maxPage)
+ else
+ local maxS = (self._slotMax and self._slotMax[p.version]) or 0
+ self.slotScroll[p.version] = clamp(p.scroll0 - d, 0, maxS)
+ end
end
else
if not p.moved then self:_selectSlot(p.version, p.id) end
@@ -2468,10 +2650,14 @@ function RomImporter:_updateSlotDrag()
local mp = self._modPress
if mp then
if down then
- local d = self._my - mp.y0
+ local d = py - mp.y0
if math.abs(d) > 4 * (self._s or 1) then mp.moved = true end
if mp.moved then
- self.modScroll = clamp(mp.scroll0 - d, 0, self._modMax or 0)
+ if maxPage > 0 then
+ self.pageScroll = clamp(mp.pageScroll0 - d, 0, maxPage)
+ else
+ self.modScroll = clamp(mp.scroll0 - d, 0, self._modMax or 0)
+ end
end
else
if not mp.moved then self:_toggleMod(mp.id) end
@@ -2485,6 +2671,13 @@ end
-- content extent draw computed for that version.
function RomImporter:wheelmoved(_, dy)
local step = 48 * (self._s or 1)
+ -- An overflowing page scrolls as a whole; the panels' own lists are flattened
+ -- in that mode, so there is never a second scroll region competing for this.
+ local maxPage = self._pageMax or 0
+ if maxPage > 0 then
+ self.pageScroll = clamp((self.pageScroll or 0) - dy * step, 0, maxPage)
+ return
+ end
if self.tab == "mods" then
local maxS = self._modMax or 0
if maxS <= 0 then return end
@@ -2501,15 +2694,35 @@ end
-- SAVE SLOT card: header ("SAVE SLOT" + "N slots"), a scrollable list of slot
-- rows (name + meta, LOADED pill on the active one), and a dashed "+ New save
-- slot" button pinned to the bottom. Empty registries show a dashed hint box.
-function RomImporter:_drawSaveSlotPanel(version, x, y, w, h)
+-- `paged` (the whole launcher page is scrolling, see draw()) drops the inner
+-- scroll region: the card grows to its natural height, every row is drawn, and
+-- the page's own scrollbar is the only one on screen. Returns the height the
+-- card actually took, which is what the caller measures the page against.
+function RomImporter:_drawSaveSlotPanel(version, x, y, w, h, paged)
local s = self._s
local pad = 16 * s
- roundedCard(x, y, w, h, 16 * s)
self:_ensureSlots(version)
local slots = self.slots[version] or {}
local active = self.activeSlot[version]
local n = #slots
+ -- Row metrics up front: the natural height needs them, and the natural height
+ -- decides the card's height before anything is drawn.
+ local labelH = self.labelFont:getHeight()
+ local newBtnH = math.max(38 * s, self.saveBtnFont:getHeight() + 18 * s)
+ local nameH = self.slotNameFont:getHeight()
+ local metaH = self.labelFont:getHeight()
+ local rowPadV = 10 * s
+ local rowH = rowPadV * 2 + nameH + 4 * s + metaH
+ local rowGap = 8 * s
+ local rr = 12 * s
+ -- an empty registry shows a fixed-height dashed hint box instead of rows
+ local totalH = (n > 0) and (n * rowH + (n - 1) * rowGap) or (96 * s)
+ local naturalH = pad + labelH + 12 * s + totalH + 10 * s + newBtnH + pad
+ if paged then h = naturalH end
+
+ roundedCard(x, y, w, h, 16 * s)
+
-- header: "SAVE SLOT" (left) + "N slots" / "1 slot" (right)
love.graphics.setFont(self.labelFont)
col(PAL.labelGray)
@@ -2518,11 +2731,9 @@ function RomImporter:_drawSaveSlotPanel(version, x, y, w, h)
local cw = self.labelFont:getWidth(countTxt)
love.graphics.print(countTxt, x + w - pad - cw, y + pad)
- local labelH = self.labelFont:getHeight()
local listTop = y + pad + labelH + 12 * s
-- "+ New save slot" pinned to the card bottom; the list fills the gap above.
- local newBtnH = math.max(38 * s, self.saveBtnFont:getHeight() + 18 * s)
local newBtnY = y + h - pad - newBtnH
local listBottom = newBtnY - 10 * s
local listH = math.max(0, listBottom - listTop)
@@ -2542,16 +2753,10 @@ function RomImporter:_drawSaveSlotPanel(version, x, y, w, h)
self.slotDeleteRects = {}
self.slotEditRects = {}
elseif listH > 0 then
- local nameH = self.slotNameFont:getHeight()
- local metaH = self.labelFont:getHeight()
- local rowPadV = 10 * s
- local rowH = rowPadV * 2 + nameH + 4 * s + metaH
- local rowGap = 8 * s
- local rr = 12 * s
-
-- clamp scroll against the current content extent, and stash the max so the
- -- wheel handler (which has no geometry) can clamp against the same value
- local totalH = n * rowH + (n - 1) * rowGap
+ -- wheel handler (which has no geometry) can clamp against the same value.
+ -- Paged, listH already equals totalH, so this is 0 and the wheel falls
+ -- through to the page scroll.
local maxScroll = math.max(0, totalH - listH)
self._slotMax = self._slotMax or {}
self._slotMax[version] = maxScroll
@@ -2561,8 +2766,12 @@ function RomImporter:_drawSaveSlotPanel(version, x, y, w, h)
self.slotRects = {}
self.slotDeleteRects = {}
self.slotEditRects = {}
- love.graphics.setScissor(math.floor(rx), math.floor(listTop),
- math.ceil(rw), math.ceil(listH))
+ -- Paged, the page viewport's scissor is already set and nothing here
+ -- overflows the card, so leave it alone rather than replace and clear it.
+ if not paged then
+ love.graphics.setScissor(math.floor(rx), math.floor(listTop),
+ math.ceil(rw), math.ceil(listH))
+ end
for i, slot in ipairs(slots) do
local ry = listTop - scroll + (i - 1) * (rowH + rowGap)
if ry + rowH >= listTop and ry <= listBottom then
@@ -2665,7 +2874,7 @@ function RomImporter:_drawSaveSlotPanel(version, x, y, w, h)
end
end
end
- love.graphics.setScissor()
+ if not paged then love.graphics.setScissor() end
-- thin scrollbar thumb when the list overflows
if maxScroll > 0 then
@@ -2689,6 +2898,7 @@ function RomImporter:_drawSaveSlotPanel(version, x, y, w, h)
printfB("+ New save slot", nrect.x,
nrect.y + (newBtnH - self.saveBtnFont:getHeight()) / 2, nrect.width, "center")
self.newSlotRect = nrect
+ return h, naturalH
end
-- Reload the mods list from LauncherMods (the source of truth: it reads the
@@ -2697,6 +2907,30 @@ end
-- so a still list costs nothing after the first paint.
function RomImporter:_refreshMods()
local LauncherMods = require("src.mods.LauncherMods")
+ -- Once per session, ahead of the first listing: pull in any mod the player
+ -- unzipped beside the executable, which an ordinary (non-portable) install
+ -- has no way to read. It happens here rather than behind a button because
+ -- the failure being fixed is one where nothing on screen suggests there is
+ -- anything to press -- the panel just comes up empty. Guarded so a toggle
+ -- or a delete does not re-scan; adoptStrays is idempotent regardless.
+ if not self.modStraysChecked then
+ self.modStraysChecked = true
+ local imported, failed = {}, {}
+ for _, s in ipairs(LauncherMods.adoptStrays() or {}) do
+ table.insert(s.err and failed or imported, s.id)
+ end
+ -- the failure wins the notice: an import that worked speaks for itself in
+ -- the list right below it, one that did not is the only word they get
+ if #imported > 0 then
+ self.modNotice = { ok = true,
+ text = "Imported from the game folder: " .. table.concat(imported, ", ") }
+ end
+ if #failed > 0 then
+ self.modNotice = { ok = false,
+ text = "Found beside the game but could not import: "
+ .. table.concat(failed, ", ") }
+ end
+ end
self.mods = LauncherMods.list() or {}
end
@@ -2727,7 +2961,10 @@ end
-- install-result / drag-drop notice line, then a scrollable list of mod cards
-- (name + badge chip + description, a status chip, and a toggle switch). An
-- empty install shows a friendly dashed hint box.
-function RomImporter:_drawModsPanel(x, y, w, h)
+-- `paged` behaves as it does on the game panel: no inner scroll region, the
+-- card list is drawn whole, and the returned natural height is what draw()
+-- measures the page against.
+function RomImporter:_drawModsPanel(x, y, w, h, paged)
local s = self._s
self:_ensureMods()
local mods = self.mods or {}
@@ -2772,7 +3009,7 @@ function RomImporter:_drawModsPanel(x, y, w, h)
-- empty state: a dashed box with a centred hint
if #mods == 0 then
- local boxH = math.min(listH, 120 * s)
+ local boxH = paged and (120 * s) or math.min(listH, 120 * s)
love.graphics.setLineWidth(math.max(1, 1 * s))
col(PAL.cardBorder, 0.45)
dashedRoundRect(x, top, w, boxH, 14 * s, 7 * s, 5 * s)
@@ -2786,7 +3023,7 @@ function RomImporter:_drawModsPanel(x, y, w, h)
self.modRects = {}
self.modDeleteRects = {}
self._modMax = 0
- return
+ return (top - y) + boxH
end
-- card metrics (design: rounded 14, padding 14x16; toggle 56x28; Delete under)
@@ -2823,6 +3060,9 @@ function RomImporter:_drawModsPanel(x, y, w, h)
end
total = total + (#mods - 1) * cardGap
+ -- Paged, the list band is the list itself: nothing to clip, nothing to scroll
+ -- here, and the page's scrollbar covers the overflow.
+ if paged then listH = total end
local maxScroll = math.max(0, total - listH)
self._modMax = maxScroll
local scroll = clamp(self.modScroll or 0, 0, maxScroll)
@@ -2830,8 +3070,10 @@ function RomImporter:_drawModsPanel(x, y, w, h)
self.modRects = {}
self.modDeleteRects = {}
- love.graphics.setScissor(math.floor(x), math.floor(top),
- math.ceil(w), math.ceil(listH))
+ if not paged then
+ love.graphics.setScissor(math.floor(x), math.floor(top),
+ math.ceil(w), math.ceil(listH))
+ end
local cy = top - scroll
for i, m in ipairs(mods) do
local L = layout[i]
@@ -2927,7 +3169,7 @@ function RomImporter:_drawModsPanel(x, y, w, h)
end
cy = cy + cardH + cardGap
end
- love.graphics.setScissor()
+ if not paged then love.graphics.setScissor() end
-- thin scrollbar thumb when the list overflows
if maxScroll > 0 then
@@ -2936,6 +3178,7 @@ function RomImporter:_drawModsPanel(x, y, w, h)
col(PAL.cardBorder, 0.35)
love.graphics.rectangle("fill", x + w - 3 * s, thumbY, 3 * s, thumbH, 1.5 * s, 1.5 * s)
end
+ return (top - y) + total
end
return RomImporter
diff --git a/src/inventory/ItemEffects.lua b/src/inventory/ItemEffects.lua
index 484bcc67..50d40b71 100644
--- a/src/inventory/ItemEffects.lua
+++ b/src/inventory/ItemEffects.lua
@@ -183,6 +183,12 @@ function ItemEffects.use(data, save, itemId, target, battle, moveIndex, ow)
return "failed", { Strings("OAK: %s!\nThis isn't the\ntime to use that!", save.player.name) }
end
local b = battle.player
+ -- PIKAHAPPY_USEDXITEM (item_effects.asm ItemUseXAccuracy /
+ -- GuardSpec / DireHit / XStat) on the active companion
+ if itemId ~= "POKE_DOLL" then
+ require("src.world.PikachuFollower")
+ .modifyHappiness(save, "USEDXITEM", b and b.mon)
+ end
if itemId == "X_ACCURACY" then
-- ItemUseXAccuracy sets USING_X_ACCURACY: moves never miss
-- (not an accuracy stage)
@@ -253,6 +259,18 @@ function ItemEffects.use(data, save, itemId, target, battle, moveIndex, ow)
return "consumed", { Strings("%s's PP\nwas restored!", monName(data, target)) }
end
+ -- PIKAHAPPY_USEDITEM (item_effects.asm ItemUseMedicine, item id up to
+ -- CALCIUM): fires once a medicine has a target, before the effect
+ -- resolves -- potions, status cures, revives and vitamins all count,
+ -- RARE_CANDY does not (its success is a LEVELUP bump instead)
+ if target and (HEAL_AMOUNT[itemId] or STATUS_HEAL[itemId]
+ or itemId == "MAX_POTION" or itemId == "FULL_RESTORE"
+ or itemId == "REVIVE" or itemId == "MAX_REVIVE"
+ or VITAMINS[itemId]) then
+ require("src.world.PikachuFollower")
+ .modifyHappiness(save, "USEDITEM", target)
+ end
+
local heal = HEAL_AMOUNT[itemId]
if heal or itemId == "MAX_POTION" or itemId == "FULL_RESTORE" then
-- a FULL RESTORE on a statused mon already at full HP acts as a
@@ -323,12 +341,29 @@ function ItemEffects.use(data, save, itemId, target, battle, moveIndex, ow)
local old = target.stats
target.stats = Stats.calc(speciesDef, target.level, target.dvs, target.statExp)
target.hp = math.min(target.stats.hp, target.hp + (target.stats.hp - old.hp))
+ -- PIKAHAPPY_LEVELUP on a candy level (item_effects.asm:1540)
+ require("src.world.PikachuFollower")
+ .modifyHappiness(save, "LEVELUP", target)
return "consumed", { Strings("%s grew\nto level %d!", monName(data, target), target.level) },
{ leveledTo = target.level }
end
if STONES[itemId] then
if not target then return "failed", { Strings("It won't have\nany effect.") } end
+ -- Yellow's starter Pikachu never evolves: ItemUseEvoStone runs
+ -- IsThisPartyMonStarterPikachu (OT identity match) before
+ -- TryEvolvingMon and bails with the voiced cry + RefusingText.
+ -- The stone is NOT consumed on the refuse path.
+ if target.species == "PIKACHU"
+ and require("src.core.GameVersion").isYellow()
+ and target.ot == save.player.name
+ and target.otId == save.player.id then
+ require("src.core.Sound").playCry(data, "PIKACHU")
+ local raw = data.text and data.text._RefusingText
+ local line = raw and raw:gsub("{RAM:[^}]*}", monName(data, target))
+ or Strings("%s\nis refusing!", monName(data, target))
+ return "failed", { line }
+ end
local speciesDef = data.pokemon[target.species]
for _, evo in ipairs(speciesDef.evolutions) do
if evo.method == "ITEM" and evo.item == itemId then
diff --git a/src/link/Protocol.lua b/src/link/Protocol.lua
index f26d2c75..6b147af8 100644
--- a/src/link/Protocol.lua
+++ b/src/link/Protocol.lua
@@ -382,6 +382,12 @@ function TradeSession:apply(game)
Runtime.emit("pokemon.received",
{ mon = received, from = "link", peerName = self.peerName })
self.party[self.myPick] = received
+ -- PIKAHAPPY_TRADE (engine/link/cable_club.asm:801): trading the
+ -- companion away is the biggest happiness hit and zeroes the mood
+ if game and sent then
+ require("src.world.PikachuFollower")
+ .modifyHappiness(game.save, "TRADE", sent)
+ end
if game and game.save.pokedex then
game.save.pokedex.seen[received.species] = true
game.save.pokedex.owned[received.species] = true
diff --git a/src/mods/LauncherMods.lua b/src/mods/LauncherMods.lua
index 2e81e0a2..84f35610 100644
--- a/src/mods/LauncherMods.lua
+++ b/src/mods/LauncherMods.lua
@@ -16,9 +16,19 @@
-- fused build), which is why those mods still loaded while landing in the
-- wrong place.
--
--- Split in two: the pure derivation (deriveList, locateRoot) has no love and
--- no filesystem, so the engine tier can table-drive it; the discovery,
--- install, and uninstall paths reach for love.filesystem and SaveData.
+-- The same split decides where a mod is FOUND, and that has a sharp edge: a
+-- non-portable install never reads the game folder at all, so a mod unzipped
+-- next to the executable -- where most games would want it -- is not wrong so
+-- much as invisible, with an empty panel and no error to explain it.
+-- adoptStrays looks in those folders anyway (a scoped mount that comes down
+-- again, CacheFs.withMounted) and copies what it finds into the tree the game
+-- really reads, so the mistake costs a line of notice rather than a support
+-- thread.
+--
+-- Split in two: the pure derivation (deriveList, locateRoot, pickStrays) has
+-- no love and no filesystem, so the engine tier can table-drive it; the
+-- discovery, install, uninstall, and stray-scan paths reach for
+-- love.filesystem and SaveData.
local Manifest = require("src.mods.Manifest")
local ManagerState = require("src.mods.ManagerState")
@@ -136,6 +146,28 @@ function LauncherMods.locateRoot(paths)
return nil, "no manifest.json found in the .zip"
end
+-- pickStrays(found, installed) -> the rows worth adopting, pure.
+-- found is an array of { id, name, folder, path } in scan order (game folder
+-- order, then directory order); installed is the id -> true set of what the
+-- game can already see. An installed id is dropped -- the player has a
+-- working copy and the loose folder is just where they first put it -- and a
+-- duplicate id across two game folders keeps the first, the same first-wins
+-- rule discover() uses. Sorted by id so the notice reads the same every time.
+function LauncherMods.pickStrays(found, installed)
+ installed = installed or {}
+ local out, seen = {}, {}
+ for _, row in ipairs(found or {}) do
+ local id = row.id
+ if id and not installed[id] and not seen[id] then
+ seen[id] = true
+ out[#out + 1] = { id = id, name = row.name or id,
+ folder = row.folder, path = row.path }
+ end
+ end
+ table.sort(out, function(a, b) return a.id < b.id end)
+ return out
+end
+
-- ------- discovery (love.filesystem)
local function decodeManifest(raw, path)
@@ -301,6 +333,109 @@ local function removeTree(path)
fs.remove(path)
end
+-- ------- strays: mods dropped beside the game that it cannot see
+
+-- love.filesystem looks in two places for "mods/": the save directory, and --
+-- portable installs only -- the game folder, which CacheFs mounts. A player
+-- who unzips a mod next to the executable of an ordinary install, which is
+-- where very nearly every other game would want it, gets no error and no mod.
+-- The MODS panel simply stays empty, and there is nothing on screen to
+-- suggest the files are twenty centimetres away in the wrong folder.
+--
+-- The scan mounts each game folder at a private mount point just long enough
+-- to list mods/ inside it and drops it again (CacheFs.withMounted), so the
+-- read path the game actually runs on is never touched and a stray can never
+-- shadow a real file.
+local STRAY_MOUNT = "stray_scan"
+
+-- Run fn(mountedModsRoot) for each game folder that has a readable mods/
+-- directory, one mount at a time. Folders that are already the physfs source
+-- are skipped: their mods/ is discoverable by definition, so anything there is
+-- installed already and not a stray (this is every `love ` dev run).
+local function eachStrayRoot(fn)
+ local SaveData_ = require("src.core.SaveData")
+ local fs = love and love.filesystem
+ if not fs then return end
+ local source = fs.getSource and fs.getSource()
+ local seen = {}
+ for _, folder in ipairs(SaveData_.gameFolders() or {}) do
+ if not seen[folder] and folder ~= source then
+ seen[folder] = true
+ CacheFs.withMounted(folder, STRAY_MOUNT, function()
+ local root = STRAY_MOUNT .. "/mods"
+ if fs.getInfo(root) then fn(root, folder) end
+ end)
+ end
+ end
+end
+
+-- Every valid mod folder sitting in a game folder's mods/, in scan order.
+-- Only reads. The rows carry the mounted path, which is live for the length
+-- of the mount and dead after it -- copying has to happen inside the same
+-- scan, which is why adoption is a flag here rather than a second pass.
+local function findStrays(fs, adopt, installed)
+ local found, adopted = {}, {}
+ eachStrayRoot(function(root, folder)
+ local batch = {}
+ for _, name in ipairs(fs.getDirectoryItems(root)) do
+ local path = root .. "/" .. name
+ local info = fs.getInfo(path)
+ if info and info.type == "directory" then
+ local raw = fs.read(path .. "/manifest.json")
+ local manifest = raw and decodeManifest(raw, path)
+ if manifest then
+ batch[#batch + 1] = { id = manifest.id,
+ name = manifest.name or manifest.id,
+ folder = folder, path = path }
+ end
+ end
+ end
+ -- filtered per mount, so a copy only ever runs for a row that survived
+ -- the pure rules -- and so the second game folder sees the first one's
+ -- ids as taken
+ for _, row in ipairs(LauncherMods.pickStrays(batch, installed)) do
+ if adopt then
+ -- same root pin installZip uses: the mods tree is shared by Red and
+ -- Blue, never version-prefixed (#330)
+ local savedPrefix = CacheFs.prefix
+ CacheFs.prefix = ""
+ local dest = "mods/" .. row.id
+ local copied, copyErr = copyTree(row.path, dest)
+ if not copied then removeTree(dest) end
+ CacheFs.prefix = savedPrefix
+ if not copied then row.err = copyErr or "could not copy the files" end
+ end
+ installed[row.id] = true
+ row.path = nil -- dead once this mount comes down
+ adopted[#adopted + 1] = row
+ found[#found + 1] = row
+ end
+ end)
+ return LauncherMods.pickStrays(found, {})
+end
+
+-- The strays, optionally adopted. A folder whose id the game can already see
+-- is left out: the player has a working copy, and the loose one is just where
+-- they first put it. Rows that failed to copy come back with .err set.
+local function scanStrays(adopt)
+ local fs = love and love.filesystem
+ if not fs then return {} end
+ local installed = {}
+ for _, m in ipairs(discover()) do installed[m.id] = true end
+ return findStrays(fs, adopt, installed)
+end
+
+-- strays() -> the rows, nothing copied.
+function LauncherMods.strays() return scanStrays(false) end
+
+-- adoptStrays() -> the rows, each one copied into the mods tree the game
+-- really reads (rows carrying .err failed). Idempotent: a second call finds
+-- the ids installed and returns nothing, so the panel can run this on every
+-- open without duplicating anything or nagging twice. The loose folder is
+-- deliberately left where it is -- deleting files outside the save directory
+-- on the player's behalf is not this function's call to make.
+function LauncherMods.adoptStrays() return scanStrays(true) end
+
-- installZip(source) -> true, id | nil, errString
-- source is an external path or a love DroppedFile. The archive is validated
-- BEFORE anything is copied; every path unmounts and clears the staged temp
diff --git a/src/mods/Schemas.lua b/src/mods/Schemas.lua
index 7e0f7490..391cacc4 100644
--- a/src/mods/Schemas.lua
+++ b/src/mods/Schemas.lua
@@ -493,6 +493,12 @@ R.maps = {
width = f.int(1), height = f.int(1),
blocks = f.list(f.int(0, 255)),
borderBlock = f.opt(f.int(0, 255)),
+ -- A named SGB palette, which wins over the field.palettes cascade
+ -- (OverworldController.lua:506 reads map.def.palette first). Deliberately
+ -- a plain string rather than f.id("palettes"): the ROM-free fixture base
+ -- carries no palettes at all, so an id reference would fail validation for
+ -- a perfectly good mod wherever there is no imported dataset.
+ palette = f.opt(f.str),
warps = f.opt(f.list(f.rec{ x = f.int(0), y = f.int(0),
destMap = f.str, destWarp = f.int(0) })),
objects = f.opt(f.list(f.any)),
diff --git a/src/pokemon/Sprites.lua b/src/pokemon/Sprites.lua
index ee844271..6c974cdd 100644
--- a/src/pokemon/Sprites.lua
+++ b/src/pokemon/Sprites.lua
@@ -18,7 +18,8 @@ local function samePath(path) return path end
-- side: "front" | "back"
-- opts.mon: the live mon when available (per-instance skins)
-- opts.kind: "battle" | "summary" | "dex" | "evolution" | "hof" | "trade"
--- | "title" | "oak" | "credits" (informational for wrappers)
+-- | "title" | "oak" | "credits" | "overworld" (informational
+-- for wrappers)
-- Returns path, trueColor.
function Sprites.path(data, species, side, opts)
opts = opts or {}
diff --git a/src/render/PaletteFX.lua b/src/render/PaletteFX.lua
index da89c91a..2dcc6251 100644
--- a/src/render/PaletteFX.lua
+++ b/src/render/PaletteFX.lua
@@ -78,8 +78,11 @@ PaletteFX.GBC_OBJ_BLUE = {
-- playthrough, red otherwise. White (index 1) and black (index 4) are
-- identical across versions, so callers that only touch the endpoints
-- (e.g. BattleState's zone white/black snap) need no version branch.
+-- Yellow is CGB-enhanced (pokeyellow CGBBasePalettes) and has no extracted
+-- boot-ROM auto-palette here; keep the Red ramp -- never Blue's GBC_BG_BLUE.
function PaletteFX.ogBg()
if GameVersion.isBlue() then return PaletteFX.GBC_BG_BLUE end
+ if GameVersion.isYellow() then return PaletteFX.GBC_BG end
return PaletteFX.GBC_BG
end
@@ -88,8 +91,10 @@ end
-- version-distinct cache-group string, because SpriteRenderer.getObpImage keys
-- its baked-image cache by (image path, group): a shared group would collide a
-- Red bake with a Blue one and one version would show the other's colors.
+-- Yellow: same Red OBJ green as above until Yellow-specific tables land.
function PaletteFX.ogObj()
if GameVersion.isBlue() then return PaletteFX.GBC_OBJ_BLUE, "gbcobj_blue" end
+ if GameVersion.isYellow() then return PaletteFX.GBC_OBJ, "gbcobj" end
return PaletteFX.GBC_OBJ, "gbcobj"
end
@@ -311,6 +316,9 @@ end
-- Red-derived pokered-gbc pack, so under RED++ a Blue playthrough must
-- read these from the ROM-imported table or the title ribbon stays red
-- and the Game Corner reels keep Red's pink (issue #128).
+-- Yellow is intentionally NOT in BLUE_VERSIONED: skip Blue LOGO1/SLOTS*
+-- recolors. When CGBBasePalettes were imported (palettes.cgbBase), Yellow
+-- prefers those over SGB SuperPalettes for named zones.
local BLUE_VERSIONED = {
LOGO1 = true, SLOTS2 = true, SLOTS3 = true, SLOTS4 = true,
}
@@ -320,6 +328,11 @@ local function romNamedPal(data, name)
return p and p.palettes and p.palettes[name]
end
+local function yellowCgbNamedPal(data, name)
+ local p = data and data.palettes
+ return p and p.cgbBase and p.cgbBase[name]
+end
+
-- named palette from the active pack (nil on stale builds / missing name).
-- RED++ falls back to the ROM pack for names the gbc table omits (rare).
-- OG RED short-circuits EVERY name to the one global GBC boot-ROM BG palette
@@ -329,10 +342,16 @@ end
-- GBC_OBJ green), so this stays a BG-only hook.
function PaletteFX.pal(data, name)
if PaletteFX.mode == "ogred" then return PaletteFX.ogBg() end
+ -- Blue-only ROM override for versioned SuperPals. Yellow (isYellow) and
+ -- Red keep the active pack / Red-like path -- do not apply Blue recolors.
if GameVersion.isBlue() and BLUE_VERSIONED[name] then
local fromRom = romNamedPal(data, name)
if fromRom then return fromRom end
end
+ if GameVersion.isYellow() then
+ local fromCgb = yellowCgbNamedPal(data, name)
+ if fromCgb then return fromCgb end
+ end
local p = PaletteFX.pack(data)
local c = p and p.palettes[name]
if c then return c end
@@ -644,7 +663,10 @@ function PaletteFX.modeLabel(mode)
mode = mode or PaletteFX.mode
-- The GBC boot-ROM mode wears the running game's name: it is red for Red and
-- blue for Blue (see ogBg), so a Blue playthrough shows "OG BLUE".
+ -- Yellow still uses the Red boot-ROM ramp (no Yellow table yet), so keep
+ -- the "OG RED" label rather than inventing an "OG YELLOW" without colors.
if mode == "ogred" and GameVersion.isBlue() then return "OG BLUE" end
+ if mode == "ogred" and GameVersion.isYellow() then return "OG RED" end
return PaletteFX.MODE_LABELS[mode] or "GBC"
end
diff --git a/src/save_convert/SaveConvert.lua b/src/save_convert/SaveConvert.lua
index e908abea..b9b050df 100644
--- a/src/save_convert/SaveConvert.lua
+++ b/src/save_convert/SaveConvert.lua
@@ -116,13 +116,12 @@ local function defaultsSave()
end
-- Merge a GenSave.decode() result over the new-game defaults, exactly the
--- way convert.lua did, then stamp the requested version. The 32768-byte
--- import template GenSave stashes as `rawImport` and the decode `warnings`
--- are dropped here: neither belongs in a serialized slot file (a fresh
--- export always starts zero-filled -- see GenSave.lua's header).
+-- way convert.lua did, then stamp the requested version. Keep the imported
+-- SRAM image with the slot: Pokémon Red restores its saved current-map cache
+-- before Continue, and an export needs that unmodeled data to remain bootable.
+-- Decode warnings are only import diagnostics and do not belong in the slot.
local function mergeDefaults(decoded, version)
decoded.warnings = nil
- decoded.rawImport = nil
local save = defaultsSave()
for k, v in pairs(decoded) do save[k] = v end
save.lastHeal = { map = save.player.map, x = save.player.x, y = save.player.y }
diff --git a/src/script/Commands.lua b/src/script/Commands.lua
index 25022d57..488c927b 100644
--- a/src/script/Commands.lua
+++ b/src/script/Commands.lua
@@ -173,6 +173,27 @@ function Commands.check_item(ctx, itemId)
ctx.lastCheck = (ctx.save.inventory[itemId] or 0) > 0
end
+-- check_dex_owned : lastCheck = the player owns at least n species
+-- (the CountSetBits-over-wPokedexOwned gate in Yellow's OaksLabOak1Text)
+function Commands.check_dex_owned(ctx, n)
+ local owned = 0
+ for _ in pairs(ctx.save.pokedex and ctx.save.pokedex.owned or {}) do
+ owned = owned + 1
+ end
+ ctx.lastCheck = owned >= (n or 1)
+end
+
+-- dex_rating: DisplayDexRating (engine/events/pokedex_rating.asm) --
+-- Oak's seen/owned tally plus the per-decade rating line; blocks until
+-- the box closes. Headless-safe no-op without an overworld.
+function Commands.dex_rating(ctx)
+ local ow = ctx.overworld
+ if not ow then return end
+ local runner = ctx.runner
+ ow:dexRating(function() runner:resume() end)
+ runner:yield()
+end
+
function Commands.jump_if_true(ctx, target)
if ctx.lastCheck then return target end
end
@@ -497,6 +518,17 @@ function Commands.play_cry(ctx, species, waitForButton)
ctx.pendingCryWait = waitForButton or nil
end
+-- mark_seen : DisplayPokedex (pokedex.asm) records the species as
+-- seen before opening its entry. Map scripts use this for NPC-driven
+-- Pokédex previews that do not begin a battle or give the player a Pokémon.
+function Commands.mark_seen(ctx, species)
+ local dex = ctx.save and ctx.save.pokedex
+ if dex then
+ dex.seen = dex.seen or {}
+ dex.seen[species] = true
+ end
+end
+
-- check_battle_result [r2 ...]: lastCheck = the last scripted
-- battle ended with any of the given results
-- ("win"|"lose"|"run"|"caught"), for branches like
@@ -561,7 +593,10 @@ end
-- AskName runs for party (AddPartyMon) and box (SendNewMonToBox) when a
-- script runner is present; mods that pre-set gift.nickname skip it.
-- Box deposits also print SentToBoxText (give_pokemon.asm:36-37).
-function Commands.give_pokemon(ctx, species, level)
+-- skipNickname suppresses the AskName prompt: Yellow's lab Pikachu is
+-- added straight through AddPartyMon (pokeyellow scripts/OaksLab.asm
+-- OaksLabPlayerReceivedMonText) -- the starter Pikachu keeps its name.
+function Commands.give_pokemon(ctx, species, level, skipNickname)
-- Native mods can transform a gift before the Pokémon object is created.
-- This is intentionally an event rather than a special-case starter hook:
-- mods can use the same seam for story gifts, fossils, or custom scripts.
@@ -597,7 +632,7 @@ function Commands.give_pokemon(ctx, species, level)
ctx.boxNum = boxNum
-- AskName: both AddPartyMon and SendNewMonToBox; skip mod-set nicks
-- and callback-style callers with no script runner to yield on.
- if not gift.nickname and ctx.runner then
+ if not gift.nickname and not skipNickname and ctx.runner then
askNickname(ctx, mon)
end
if boxNum then
@@ -748,7 +783,46 @@ end
-- player CHARMANDER -> base+0, SQUIRTLE -> base+1, BULBASAUR -> base+2.
-- offsets (flag -> party offset) lets a modded roster remap the pick;
-- field.starterCounterpicks is the data-side default when stamped.
+-- Yellow's rival parties key off wRivalStarter (save.rivalStarter,
+-- 1 JOLTEON / 2 FLAREON / 3 VAPOREON -- set in oaks_lab_yellow.lua), not
+-- the player's starter counterpick. Keyed by the Red call-site party so
+-- the shared story scripts need no version branches:
+-- Route 22 #1 RIVAL1 4 -> party 2 (fixed; Route22Script_50ed6), and
+-- a win upgrades FLAREON to JOLTEON (Route22Rival1AfterBattleScript)
+-- Cerulean RIVAL1 7 -> party 3 (fixed; CeruleanCity.asm:143)
+-- S.S. Anne RIVAL2 1 -> party 1 (fixed; SSAnne2F.asm:98)
+-- Tower 2F RIVAL2 4 -> 1 + starter (PokemonTower2F.asm:148)
+-- Silph 7F RIVAL2 7 -> 4 + starter (SilphCo7F.asm:185)
+-- Route 22 #2 RIVAL2 10 -> 7 + starter (Route22Script_50ee1)
+-- Champion RIVAL3 1 -> 0 + starter (ChampionsRoom.asm:69)
+local YELLOW_RIVAL_PARTIES = {
+ OPP_RIVAL1 = {
+ [4] = { party = 2, upgradeOnWin = { from = 2, to = 1 } },
+ [7] = { party = 3 },
+ },
+ OPP_RIVAL2 = {
+ [1] = { party = 1 }, [4] = { base = 1 },
+ [7] = { base = 4 }, [10] = { base = 7 },
+ },
+ OPP_RIVAL3 = { [1] = { base = 0 } },
+}
+
function Commands.rival_battle(ctx, oppClass, baseParty, offsets)
+ local GameVersion = require("src.core.GameVersion")
+ if GameVersion.isYellow() then
+ local spec = YELLOW_RIVAL_PARTIES[oppClass]
+ and YELLOW_RIVAL_PARTIES[oppClass][baseParty]
+ if spec then
+ local starter = ctx.save.rivalStarter or 1
+ local party = spec.party or (spec.base + starter)
+ Commands.start_battle(ctx, "trainer", oppClass, party)
+ if spec.upgradeOnWin and ctx.lastBattleResult == "win"
+ and ctx.save.rivalStarter == spec.upgradeOnWin.from then
+ ctx.save.rivalStarter = spec.upgradeOnWin.to
+ end
+ return
+ end
+ end
offsets = offsets
or (ctx.game.data.field and ctx.game.data.field.starterCounterpicks)
local offset = 0
@@ -951,6 +1025,17 @@ function Commands.stop_music(ctx)
require("src.core.Music").stop()
end
+-- play_default_music: PlayDefaultMusic -- resume the current map's own
+-- theme (data.audio.mapSongs) after a cutscene override, keeping the
+-- bike/surf substitution rules. Headless-safe no-op without an overworld.
+function Commands.play_default_music(ctx)
+ local ow = ctx.overworld
+ if not ow then return end
+ require("src.core.Music").playMap(ctx.game.data, ow.map.id,
+ ctx.save and ctx.save.onBike,
+ ow.player and ow.player.surfing)
+end
+
-- replace_block : the Cut-tree/card-key-door idiom,
-- on the current map
function Commands.replace_block(ctx, bx, by, blockId)
diff --git a/src/script/ScriptRunner.lua b/src/script/ScriptRunner.lua
index bac4c31d..94fd1ffa 100644
--- a/src/script/ScriptRunner.lua
+++ b/src/script/ScriptRunner.lua
@@ -191,8 +191,18 @@ function ScriptRunner:yield()
end
function ScriptRunner:resume(...)
- if not self.co then return end
- local ok, err = coroutine.resume(self.co, ...)
+ local co = self.co
+ if not co then return end
+ -- A completion callback can fire synchronously from inside the running
+ -- coroutine (e.g. a battle that finishes during its own stack push when
+ -- the party is already fainted). Resuming a running coroutine is an
+ -- error that would kill the whole script, so land the pending yield
+ -- first and continue on the next update tick instead.
+ if coroutine.status(co) == "running" then
+ self.waitingFrames = 1
+ return
+ end
+ local ok, err = coroutine.resume(co, ...)
if not ok then
local source = self.ctx and self.ctx.source
local where = source
@@ -209,8 +219,10 @@ function ScriptRunner:resume(...)
self.co = nil
self.waitingFrames = nil
self.waitingCheck = nil
- elseif coroutine.status(self.co) == "dead" then
- self.co = nil
+ -- status via the captured co: a nested resume during the call above may
+ -- already have torn self.co down, and status(nil) would throw
+ elseif coroutine.status(co) == "dead" then
+ if self.co == co then self.co = nil end
end
end
diff --git a/src/ui/BagMenu.lua b/src/ui/BagMenu.lua
index e28f5773..95cb7b38 100644
--- a/src/ui/BagMenu.lua
+++ b/src/ui/BagMenu.lua
@@ -158,15 +158,22 @@ local function useOn(game, battle, id, target, list, moveIndex, picker)
local moveId = payload
local mdef = game.data.moves[moveId]
local function teach()
+ -- PIKAHAPPY_USEDTMHM on a successful teach (item_effects.asm:2500)
+ local function taught()
+ require("src.world.PikachuFollower")
+ .modifyHappiness(game.save, "USEDTMHM", target)
+ end
if #target.moves < 4 then
table.insert(target.moves, { id = moveId, pp = mdef.pp })
showMessages(game, { Strings("%s learned\n%s!", target.nickname or
game.data.pokemon[target.species].name, mdef.name) })
if result == "learn" then consume(game, id) end
+ taught()
else
require("src.ui.Screens").push(game, "MoveLearnMenu", target, moveId,
function(learned)
if learned and result == "learn" then consume(game, id) end
+ if learned then taught() end
end)
end
end
diff --git a/src/ui/BoxMenu.lua b/src/ui/BoxMenu.lua
index 252969af..8ffea44d 100644
--- a/src/ui/BoxMenu.lua
+++ b/src/ui/BoxMenu.lua
@@ -127,6 +127,9 @@ local function deposit(game)
end
table.remove(game.save.party, item.value)
table.insert(active, mon)
+ -- PIKAHAPPY_DEPOSITED (engine/pokemon/bills_pc.asm:247)
+ require("src.world.PikachuFollower")
+ .modifyHappiness(game.save, "DEPOSITED", mon)
local name = monName(game, mon)
game.stringBuffer = name
game.boxNumString = tostring(game.save.currentBox)
@@ -220,13 +223,43 @@ local function drawChrome(game)
love.graphics.setColor(1, 1, 1, 1)
end
+-- PrintPCBox (engine/printer/printer.asm): Yellow's box-list print job,
+-- box number plus each stored mon's name, level and dex number; the PNG
+-- under prints/ stands in for the printer paper.
+local function printBox(game)
+ local box = Boxes.active(game.save)
+ local Printer = require("src.core.Printer")
+ local TextBox = require("src.render.TextBox")
+ local h = 32 + math.max(1, #box) * 10
+ local saved, err = Printer.save("box_" .. (game.save.currentBox or 1),
+ 160, h, function()
+ love.graphics.setColor(1, 1, 1, 1)
+ love.graphics.rectangle("fill", 0, 0, 160, h)
+ love.graphics.setColor(0, 0, 0, 1)
+ Font.draw(Strings("BOX No.%d", game.save.currentBox or 1), 8, 8)
+ if #box == 0 then Font.draw(Strings("Empty."), 8, 24) end
+ for i, mon in ipairs(box) do
+ local def = game.data.pokemon[mon.species]
+ Font.draw(mon.nickname or (def and def.name) or tostring(mon.species),
+ 8, 14 + i * 10)
+ Font.draw(Strings(":L%d No.%03d", mon.level or 0,
+ def and def.dex or 0), 88, 14 + i * 10)
+ end
+ love.graphics.setColor(1, 1, 1, 1)
+ end)
+ game.stack:push(TextBox.new(game, saved
+ and Strings("Printed BOX %d!\fSaved as\n%s\vin the save\nfolder.",
+ game.save.currentBox or 1, saved)
+ or Strings("Printer error!\n%s", tostring(err))))
+end
+
function BoxMenu.new(game)
Boxes.ensure(game.save)
-- bills_pc.asm BillsPCMenu: TextBoxBorder at (0,0) with interior
-- 12x10 → total 14x12. "CHANGE BOX" / "WITHDRAW " need the
-- full interior (cursor col + label). keepOpen so WITHDRAW/DEPOSIT/
-- RELEASE/CHANGE BOX leave this menu underneath (jp BillsPCMenu).
- local menu = Menu.new(game, {
+ local items = {
{ label = Strings("WITHDRAW "), keepOpen = true,
onSelect = function() withdraw(game) end },
{ label = Strings("DEPOSIT "), keepOpen = true,
@@ -235,10 +268,19 @@ function BoxMenu.new(game)
onSelect = function() release(game) end },
{ label = Strings("CHANGE BOX"), keepOpen = true,
onSelect = function() changeBox(game) end },
- { label = Strings("SEE YA!") },
+ }
+ -- Yellow's PRINT BOX item (bills_pc.asm _YELLOW -> PrintPCBox): the
+ -- Game Boy Printer box list becomes a PNG under prints/, like the
+ -- Pokédex PRNT stand-in
+ if require("src.core.GameVersion").isYellow() then
+ items[#items + 1] = { label = Strings("PRINT BOX"), keepOpen = true,
+ onSelect = function() printBox(game) end }
+ end
+ items[#items + 1] = { label = Strings("SEE YA!") }
+ local menu = Menu.new(game, items,
-- Bill's PC runs silent end to end (BIT_NO_MENU_BUTTON_SOUND,
-- engine/menus/pokemon_pc.asm)
- }, { tx = 0, ty = 0, tw = 14, th = 12, noSound = true })
+ { tx = 0, ty = 0, tw = 14, th = #items * 2 + 2, noSound = true })
local baseDraw = menu.draw
function menu:draw()
baseDraw(self)
diff --git a/src/ui/DexEntryMenu.lua b/src/ui/DexEntryMenu.lua
index 9db99195..17fa3899 100644
--- a/src/ui/DexEntryMenu.lua
+++ b/src/ui/DexEntryMenu.lua
@@ -35,14 +35,15 @@ function DexEntryMenu.new(game, speciesOrOpts)
local species, forceOwned = resolveArgs(speciesOrOpts)
local self = setmetatable({ game = game, forceOwned = forceOwned }, DexEntryMenu)
self.def = game.data.pokemon[species]
- local path = require("src.pokemon.Sprites").path(game.data, species, "front",
- { kind = "dex" })
+ local path, trueColor = require("src.pokemon.Sprites").path(
+ game.data, species, "front", { kind = "dex" })
-- `path and pcall(...)` truncates to one value, so img was always nil and
-- every dex page drew without its pic (#307); the guard has to be a
-- statement for pcall's second return to survive.
local ok, img = false, nil
if path then ok, img = pcall(love.graphics.newImage, path) end
self.sprite = ok and img or nil
+ self.spriteTrueColor = self.sprite and trueColor or false
require("src.core.Sound").playCry(game.data, species)
return self
end
@@ -55,11 +56,26 @@ function DexEntryMenu:update(dt)
end
function DexEntryMenu:draw()
+ DexEntryMenu.render(self.game, self.def, self.sprite, self.forceOwned,
+ self.spriteTrueColor)
+end
+
+-- Static entry-page renderer, shared with the printer stand-in
+-- (src/core/Printer.lua renders the same page into a PNG the way
+-- PrintPokedexEntry rendered it to the Game Boy Printer).
+function DexEntryMenu.render(game, def, sprite, forceOwned, trueColor)
love.graphics.setColor(1, 1, 1, 1)
love.graphics.rectangle("fill", 0, 0, 160, 144)
- local def = self.def
- if self.sprite then
- love.graphics.draw(self.sprite, 8, math.max(0, 60 - self.sprite:getHeight()))
+ if sprite then
+ local y = math.max(0, 60 - sprite:getHeight())
+ love.graphics.draw(sprite, 8, y)
+ -- a full-color pic has to sit out the SGB recolor, so mark its bounds
+ -- for the unshaded pass (#350). The printer path leaves trueColor nil:
+ -- it renders to its own PNG canvas, and a mark left behind there would
+ -- bleed into the next real frame.
+ if trueColor then
+ require("src.render.PaletteFX").markTrueColor(8, y, sprite:getDimensions())
+ end
end
love.graphics.setColor(0, 0, 0, 1)
Font.draw(def.name, 72, 8)
@@ -70,10 +86,10 @@ function DexEntryMenu:draw()
Font.draw(e.kind or "?", 72, 20)
-- same number width as the list (constants.dexDigits), so a dex past 999
-- prints the extra digit everywhere at once
- local digits = (self.game.data.constants or {}).dexDigits or 3
+ local digits = (game.data.constants or {}).dexDigits or 3
Font.draw(("No.%0" .. digits .. "d"):format(def.dex or 0), 72, 32)
- local owned = self.forceOwned
- or (self.game.save.pokedex and self.game.save.pokedex.owned[def.id])
+ local owned = forceOwned
+ or (game.save.pokedex and game.save.pokedex.owned[def.id])
-- height/weight print only once owned, like the description
-- (pokedex.asm: "if the pokemon has not been owned, don't print the
-- height, weight, or description")
@@ -84,7 +100,7 @@ function DexEntryMenu:draw()
Font.draw(Strings("HT %d′%02d″", e.heightFt, e.heightIn or 0), 72, 44)
Font.draw(Strings("WT %.1flb", (e.weight or 0) / 10), 72, 54)
end
- local text = owned and e.text and self.game.data.text[e.text] or nil
+ local text = owned and e.text and game.data.text[e.text] or nil
local y = 72
if text then
for line in (text:gsub("\v", "\n"):gsub("\f", "\n") .. "\n"):gmatch("(.-)\n") do
diff --git a/src/ui/Diploma.lua b/src/ui/Diploma.lua
new file mode 100644
index 00000000..7ed1a8c5
--- /dev/null
+++ b/src/ui/Diploma.lua
@@ -0,0 +1,50 @@
+-- The dex-completion diploma (engine/events/diploma.asm DisplayDiploma /
+-- diploma2.asm DisplayDiplomaTop): a bordered certificate page with the
+-- player's name, shown by the Celadon Mansion 3F game designer once 150
+-- species are owned. Diploma.render also backs the Yellow-only printed
+-- copy (engine/printer/printer.asm PrintDiploma -> src/core/Printer.lua).
+
+local Font = require("src.render.Font")
+local Strings = require("src.core.Strings")
+
+local Diploma = {}
+Diploma.__index = Diploma
+Diploma.isOpaque = true
+
+function Diploma.new(game, onDone)
+ return setmetatable({ game = game, onDone = onDone }, Diploma)
+end
+
+function Diploma:update()
+ local input = self.game.input
+ if input:wasPressed("a") or input:wasPressed("b") then
+ self.game.stack:pop()
+ if self.onDone then self.onDone() end
+ end
+end
+
+-- the DisplayDiplomaTop layout, hlcoord tiles kept as x*8 / y*8 pixels
+function Diploma.render(game)
+ love.graphics.setColor(1, 1, 1, 1)
+ love.graphics.rectangle("fill", 0, 0, 160, 144)
+ love.graphics.setColor(0, 0, 0, 1)
+ love.graphics.rectangle("line", 2.5, 2.5, 155, 139)
+ Font.draw(Strings(""), 40, 16) -- hlcoord 5,2
+ Font.draw(Strings("Player"), 24, 32) -- hlcoord 3,4
+ Font.draw(game.save.player.name or "RED", 80, 32) -- hlcoord 10,4
+ local congrats = { -- hlcoord 2,6
+ "Congrats! This", "diploma certifies", "that you have",
+ "completed your", "POKéDEX.",
+ }
+ for i, line in ipairs(congrats) do
+ Font.draw(Strings(line), 16, 48 + (i - 1) * 10)
+ end
+ Font.draw(Strings("GAME FREAK"), 72, 128) -- hlcoord 9,16
+ love.graphics.setColor(1, 1, 1, 1)
+end
+
+function Diploma:draw()
+ Diploma.render(self.game)
+end
+
+return Diploma
diff --git a/src/ui/OakSpeech.lua b/src/ui/OakSpeech.lua
index 0cca2dfd..0dc79c88 100644
--- a/src/ui/OakSpeech.lua
+++ b/src/ui/OakSpeech.lua
@@ -61,7 +61,7 @@ local function tryImage(path)
return ok and img or nil
end
--- Resolve a pic descriptor to (image, flip).
+-- Resolve a pic descriptor to (image, flip, trueColor).
-- Descriptors:
-- "oak" | "rival" | "player" shorthand
-- { type = "trainer", id = "OPP_PROF_OAK" }
@@ -70,7 +70,7 @@ end
-- { type = "image", path = "..." }
-- { type = "sprite", id = "SPRITE_RED" }
function OakSpeech.resolvePic(game, desc, speech)
- if desc == nil then return nil, false end
+ if desc == nil then return nil, false, false end
if type(desc) == "string" then
if desc == "oak" then
desc = { type = "trainer", id = "OPP_PROF_OAK" }
@@ -86,35 +86,37 @@ function OakSpeech.resolvePic(game, desc, speech)
local t = desc.type
if t == "trainer" then
if speech and desc.id == "OPP_PROF_OAK" and speech.oakPic then
- return speech.oakPic, false
+ return speech.oakPic, false, false
end
if speech and desc.id == "OPP_RIVAL1" and speech.rivalPic then
- return speech.rivalPic, false
+ return speech.rivalPic, false, false
end
local trainers = game.data.trainers or {}
local tr = trainers[desc.id]
- return tryImage(tr and tr.pic), false
+ return tryImage(tr and tr.pic), false, false
elseif t == "pokemon" then
if speech and desc.id == speech.demoSpecies and speech.demoPic then
- return speech.demoPic, desc.flip and true or false
+ return speech.demoPic, desc.flip and true or false, speech.demoTrueColor
end
- local path = require("src.pokemon.Sprites").path(
+ local path, trueColor = require("src.pokemon.Sprites").path(
game.data, desc.id, "front", { kind = "oak" })
- return tryImage(path), desc.flip and true or false
+ return tryImage(path), desc.flip and true or false, trueColor
elseif t == "player" then
if speech and speech.playerPic and not desc.path then
- return speech.playerPic, false
+ return speech.playerPic, false, speech.playerTrueColor
end
- if desc.path then return tryImage(desc.path), false end
- return tryImage(require("src.pokemon.Sprites").playerPath(
- game.data, "front", { kind = "intro" })), false
+ if desc.path then return tryImage(desc.path), false, false end
+ local path, trueColor = require("src.pokemon.Sprites").playerPath(
+ game.data, "front", { kind = "intro" })
+ return tryImage(path), false, trueColor
elseif t == "image" then
- return tryImage(desc.path), desc.flip and true or false
+ return tryImage(desc.path), desc.flip and true or false, false
elseif t == "sprite" then
local sp = game.data.sprites and game.data.sprites[desc.id]
- return tryImage(sp and sp.image), desc.flip and true or false
+ return tryImage(sp and sp.image), desc.flip and true or false,
+ sp and sp.trueColor or false
end
- return nil, false
+ return nil, false, false
end
-- Vanilla step list. Ids are the stable anchors mods insert around.
@@ -219,15 +221,18 @@ function OakSpeech.new(game, onDone)
-- the show-off mon and the name length cap come from data; the vanilla
-- literals stay as the fallbacks
self.demoSpecies = oakGfx.demoSpecies or "NIDORINO"
- local demoPath = require("src.pokemon.Sprites").path(
+ local demoPath, demoTrueColor = require("src.pokemon.Sprites").path(
game.data, self.demoSpecies, "front", { kind = "oak" })
self.demoPic = tryImage(demoPath)
+ self.demoTrueColor = self.demoPic and demoTrueColor or false
local constants = game.data.constants or {}
self.nameLen = constants.playerNameLength or 7
-- RedPicFront (gfx/player/red.png, shared with the trainer card) and
-- the ShrinkPic1/ShrinkPic2 frames (gfx/player/shrink{1,2}.png)
- self.playerPic = tryImage(require("src.pokemon.Sprites").playerPath(
- game.data, "front", { kind = "intro" }))
+ local playerPath, playerTrueColor = require("src.pokemon.Sprites").playerPath(
+ game.data, "front", { kind = "intro" })
+ self.playerPic = tryImage(playerPath)
+ self.playerTrueColor = self.playerPic and playerTrueColor or false
self.shrinkPic1 = tryImage(oakGfx.shrink1
or "assets/generated/intro/shrink1.png")
self.shrinkPic2 = tryImage(oakGfx.shrink2
@@ -278,14 +283,17 @@ end
function OakSpeech:applyPic(step)
if step.pic == nil then return end
- local img, flip = OakSpeech.resolvePic(self.game, step.pic, self)
+ local img, flip, trueColor = OakSpeech.resolvePic(self.game, step.pic, self)
if img then
self.pic = img
self.picFlip = flip or false
+ self.picTrueColor = trueColor or false
elseif step.pic == "player" or (type(step.pic) == "table" and step.pic.type == "player") then
-- mirror the old fallback: player pic missing → oak
self.pic = self.playerPic or self.oakPic
self.picFlip = false
+ self.picTrueColor = self.pic == self.playerPic and self.playerTrueColor
+ or false
end
end
@@ -342,6 +350,7 @@ function OakSpeech:runStep(step)
-- NIDORINO show-off: mirrored front sprite + wipe + cry + text 2A
self.pic = self.demoPic
self.picFlip = true
+ self.picTrueColor = self.demoTrueColor
self:revealPic("wipe", function()
Sound.playCry(self.game.data, self.demoSpecies)
self:say(Strings("_OakSpeechText2A"), function() self:advance() end)
@@ -536,8 +545,10 @@ function OakSpeech:update(dt)
s.frame = s.frame + 1
if s.frame == 5 then
self.pic = self.shrinkPic1 or self.pic
+ self.picTrueColor = false
elseif s.frame == 9 then
self.pic = self.shrinkPic2 or self.pic
+ self.picTrueColor = false
-- wAudioFadeOutControl = 10: the music ramps to silence over ~70
-- frames (7 levels x 10), reaching 0 just as the fade-to-white
-- begins at frame 79, instead of a hard cut (oak_speech.asm:145-149,
@@ -545,6 +556,7 @@ function OakSpeech:update(dt)
Music.fadeOut(10)
elseif s.frame == 29 then
self.pic = nil
+ self.picTrueColor = false
self.walkVisible = true
elseif s.frame >= 79 and s.frame <= 102 then
self.fadeLevel = math.floor((s.frame - 79) / 8) + 1
@@ -584,6 +596,9 @@ function OakSpeech:draw()
else
love.graphics.draw(self.pic, x + off, y)
end
+ if self.picTrueColor then
+ require("src.render.PaletteFX").markTrueColor(x + off, y, w, h)
+ end
love.graphics.setColor(1, 1, 1, 1)
end
if self.walkVisible and self.walkSheet then
diff --git a/src/ui/PartyMenu.lua b/src/ui/PartyMenu.lua
index e20470c0..422208b0 100644
--- a/src/ui/PartyMenu.lua
+++ b/src/ui/PartyMenu.lua
@@ -104,6 +104,7 @@ PartyMenu.iconFrames = {
FAIRY = { rest = 3, alt = 0 }, -- FairySprite tile 12 <-> tile 0
BIRD = { rest = 3, alt = 0 }, -- BirdSprite tile 12 <-> tile 0
WATER = { rest = 0, alt = 3 }, -- SeelSprite tile 0 <-> tile 12
+ PIKACHU = { rest = 0, alt = 3 }, -- Yellow: PikachuSprite tile 0 <-> 12
}
-- Which 16x16 frame of `name`'s sheet to draw; `ih` (sheet pixel
diff --git a/src/ui/PokedexMenu.lua b/src/ui/PokedexMenu.lua
index f1c07571..92c385f9 100644
--- a/src/ui/PokedexMenu.lua
+++ b/src/ui/PokedexMenu.lua
@@ -57,7 +57,7 @@ function PokedexMenu.new(game, opts)
-- original, QUIT returns to the list
local Menu = require("src.ui.Menu")
local Screens = require("src.ui.Screens")
- game.stack:push(Menu.new(game, {
+ local entries = {
{ label = Strings("DATA"), onSelect = function()
Screens.push(game, "DexEntryMenu", item.value)
end },
@@ -67,8 +67,34 @@ function PokedexMenu.new(game, opts)
{ label = Strings("AREA"), onSelect = function()
Screens.push(game, "TownMap", { nestSpecies = item.value })
end },
- { label = Strings("QUIT") },
- }, { tx = 12, ty = 8, tw = 8, th = 10 }))
+ }
+ -- Yellow's PRNT item (engine/menus/pokedex.asm PokedexMenuItemsText
+ -- _YELLOW branch -> PrintPokedexEntry): the Game Boy Printer job is
+ -- stood in for by a PNG of the entry page saved under prints/.
+ if require("src.core.GameVersion").isYellow() then
+ entries[#entries + 1] = { label = Strings("PRNT"), onSelect = function()
+ local DexEntryMenu = require("src.ui.DexEntryMenu")
+ local Printer = require("src.core.Printer")
+ local TextBox = require("src.render.TextBox")
+ local def = game.data.pokemon[item.value]
+ local path = require("src.pokemon.Sprites").path(
+ game.data, item.value, "front", { kind = "dex" })
+ local ok, sprite = false, nil
+ if path then ok, sprite = pcall(love.graphics.newImage, path) end
+ local saved, err = Printer.save("dex_" .. item.value, 160, 144,
+ function()
+ DexEntryMenu.render(game, def, ok and sprite or nil, false)
+ end)
+ game.stack:push(TextBox.new(game, saved
+ and Strings("Printed %s's\ndata!\fSaved as\n%s\vin the save\nfolder.",
+ def.name, saved)
+ or Strings("Printer error!\n%s", tostring(err))))
+ end }
+ end
+ entries[#entries + 1] = { label = Strings("QUIT") }
+ game.stack:push(Menu.new(game, entries,
+ { tx = 12, ty = 8, tw = 8,
+ th = #entries * 2 + 2 }))
end,
})
list.sgbPalettes = PokedexMenu.sgbPalettes
diff --git a/src/ui/SurfingMinigame.lua b/src/ui/SurfingMinigame.lua
new file mode 100644
index 00000000..96659568
--- /dev/null
+++ b/src/ui/SurfingMinigame.lua
@@ -0,0 +1,368 @@
+-- Surfing Pikachu minigame (engine/minigame/surfing_pikachu.asm): the
+-- Summer Beach House wave run. Paddle for speed, launch off the wave,
+-- spin in the air and land flat for points; a crooked landing wipes out
+-- and ends the run. The scene is built from the real ROM sheets
+-- (gfx/surfing_pikachu.asm, ripped at import to
+-- assets/generated/minigame/surf_1a/1b.png): the scalloped water tiles,
+-- the beach with the palm and the doll hut, the "HP:" score strip with
+-- the sheet digits, the cloud, and the OAM Pikachu poses -- the air
+-- tricks quantize to the sheet's rotation frames like the original's
+-- sprite anims, instead of free-rotating one pose. The original drew
+-- the big wave with per-scanline scroll tricks (wLYOverrides); here the
+-- crest profile is a curve filled with the sheet's foam/shade tiles.
+-- Score model keeps the original's shape (ride ticks + airtime + full
+-- rotations); high score persists in save.surfingHighScore for the
+-- beach-house printer.
+
+local Font = require("src.render.Font")
+local Strings = require("src.core.Strings")
+local Music = require("src.core.Music")
+local Sound = require("src.core.Sound")
+
+local SurfingMinigame = {}
+SurfingMinigame.__index = SurfingMinigame
+SurfingMinigame.isOpaque = true
+
+local PIKA_X = 44 -- fixed screen x while riding
+local RUN_DISTANCE = 3200 -- scroll px from paddle-out to the beach
+local GRAVITY = 0.14
+local HORIZON = 24 -- sea starts under the sky strip
+
+-- surf_1b quads: {x, y, w, h} in sheet pixels (pose pitch is 24x24)
+local B = {
+ digits = { x = 0, y = 104 }, -- "0123456789", 8x8 each
+ good = { 0, 72, 32, 8 },
+ yeah = { 32, 72, 32, 8 },
+ ohno = { 80, 96, 48, 24 },
+ splash = { 48, 80, 32, 24 },
+ cloud = { 96, 112, 32, 8 },
+ paddle = { { 0, 80, 24, 24 }, { 24, 80, 24, 24 } },
+}
+-- rotation frames, 45-degree buckets clockwise from upright
+local POSES = {
+ [0] = { 48, 0, 24, 24 }, -- upright ride
+ [45] = { 24, 0, 24, 24 }, -- nose down
+ [90] = { 0, 48, 24, 24 }, -- board vertical
+ [135] = { 48, 48, 24, 24 }, -- tumbling
+ [180] = { 72, 48, 24, 24 }, -- upside down
+ [225] = { 48, 48, 24, 24 },
+ [270] = { 0, 48, 24, 24 },
+ [315] = { 0, 0, 24, 24 }, -- tail down
+}
+
+-- surf_1a quads (BG tiles)
+local A = {
+ scallop = { 16, 0, 8, 8 }, -- open-water pattern, row A
+ scallop2 = { 16, 8, 8, 8 }, -- row B variant
+ shade = { 8, 16, 8, 8 }, -- gray dither, wave belly
+ lip = { 24, 0, 8, 8 }, -- foam curl for the crest edge
+ palm = { 8, 32, 8, 8 }, -- palm fronds
+ beach = { 24, 32, 16, 8 }, -- black shore silhouette
+ hut = { 8, 40, 16, 8 }, -- the Pikachu doll hut on the sand
+ hp = { 20, 40, 20, 8 }, -- "HP:" score label
+}
+
+-- SGB-style zones: one sea palette over the frame plus a yellow
+-- OBJ-flavored palette tracking Pikachu's tiles (rectangular attribute
+-- blocks are all the SGB could do, bleed and all)
+local SEA_PAL = { { 255, 255, 255 }, { 112, 184, 248 },
+ { 56, 120, 216 }, { 0, 0, 0 } }
+local PIKA_PAL = { { 255, 255, 255 }, { 248, 216, 64 },
+ { 224, 144, 32 }, { 0, 0, 0 } }
+
+local function newQuad(spec, img)
+ return love.graphics.newQuad(spec[1], spec[2], spec[3], spec[4],
+ img:getDimensions())
+end
+
+function SurfingMinigame.new(game, onDone)
+ local self = setmetatable({ game = game, onDone = onDone }, SurfingMinigame)
+ self.phase = "ride" -- ride | air | wipeout | results
+ self.t = 0
+ self.distance = 0
+ self.speed = 2
+ self.score = 0
+ self.rideTick = 0
+ self.y = 0 -- air offset above the wave (positive = up)
+ self.vy = 0
+ self.rot = 0 -- degrees, accumulates through the air
+ self.spins = 0
+ self.airFrames = 0
+ self.resultShown = 0
+ self.banner = nil -- {quad, frames}: GOOD!/YEAH-/Oh no..
+
+ local function sheet(path)
+ local ok, img = pcall(love.graphics.newImage, path)
+ return ok and img or nil
+ end
+ self.bg = sheet("assets/generated/minigame/surf_1a.png")
+ self.ob = sheet("assets/generated/minigame/surf_1b.png")
+ if self.bg then
+ self.aq = {}
+ for k, spec in pairs(A) do self.aq[k] = newQuad(spec, self.bg) end
+ end
+ if self.ob then
+ self.bq = {}
+ for k, spec in pairs(B) do
+ if spec[3] then self.bq[k] = newQuad(spec, self.ob) end
+ end
+ self.bq.paddle = { newQuad(B.paddle[1], self.ob),
+ newQuad(B.paddle[2], self.ob) }
+ self.bq.poses = {}
+ for deg, spec in pairs(POSES) do
+ self.bq.poses[deg] = newQuad(spec, self.ob)
+ end
+ self.bq.digit = {}
+ for d = 0, 9 do
+ self.bq.digit[d] = love.graphics.newQuad(B.digits.x + d * 8,
+ B.digits.y, 8, 8, self.ob:getDimensions())
+ end
+ end
+ Music.play(game.data, "Music_SurfingPikachu")
+ return self
+end
+
+-- crest height at screen x for the current scroll (two sines so the
+-- wave rolls instead of looping visibly)
+function SurfingMinigame:seaY(x)
+ local s = self.distance + x
+ return 92 - 14 * math.sin(s / 26) - 6 * math.sin(s / 9.5)
+end
+
+function SurfingMinigame:finishRun()
+ self.phase = "results"
+ local save = self.game.save
+ self.newRecord = self.score > (save.surfingHighScore or 0)
+ if self.newRecord then save.surfingHighScore = self.score end
+ Music.stop()
+ Sound.play(self.game.data, self.newRecord and "Get_Item1" or "Ball_Poof")
+end
+
+function SurfingMinigame:update()
+ local input = self.game.input
+ self.t = self.t + 1
+ if self.banner then
+ self.banner.frames = self.banner.frames - 1
+ if self.banner.frames <= 0 then self.banner = nil end
+ end
+ if self.phase == "results" then
+ self.resultShown = self.resultShown + 1
+ if self.resultShown > 30
+ and (input:wasPressed("a") or input:wasPressed("b")) then
+ self.game.stack:pop()
+ if self.onDone then self.onDone(self.score) end
+ end
+ return
+ end
+ if self.phase == "wipeout" then
+ self.splash = (self.splash or 0) + 1
+ if self.splash > 70 then self:finishRun() end
+ return
+ end
+
+ -- the wave scrolls by the current speed; the beach ends the run
+ self.distance = self.distance + 0.8 + self.speed * 0.35
+ if self.distance >= RUN_DISTANCE then
+ -- rode it all the way in: distance bonus like the original's goal
+ self.score = self.score + 500
+ self:finishRun()
+ return
+ end
+
+ if self.phase == "ride" then
+ -- paddling: mash A for speed, it bleeds off on its own
+ if input:wasPressed("a") and self.speed < 8 then
+ self.speed = self.speed + 1
+ end
+ if self.t % 45 == 0 and self.speed > 2 then
+ self.speed = self.speed - 1
+ end
+ self.rideTick = self.rideTick + 1
+ if self.rideTick % 12 == 0 then self.score = self.score + 1 end
+ -- launch off the lip
+ if input:wasPressed("up") then
+ self.phase = "air"
+ self.vy = 1.6 + self.speed * 0.45
+ self.rot, self.spins, self.airFrames = 0, 0, 0
+ Sound.play(self.game.data, "Ledge_Jump")
+ end
+ elseif self.phase == "air" then
+ self.airFrames = self.airFrames + 1
+ self.vy = self.vy - GRAVITY
+ self.y = self.y + self.vy
+ -- tricks: hold either direction to spin
+ local spin = (input:isDown("left") and -6 or 0)
+ + (input:isDown("right") and 6 or 0)
+ self.rot = self.rot + spin
+ if math.abs(self.rot) >= (self.spins + 1) * 360 then
+ self.spins = self.spins + 1
+ end
+ if self.y <= 0 and self.vy < 0 then
+ self.y = 0
+ local tilt = math.abs(self.rot) % 360
+ if tilt <= 60 or tilt >= 300 then
+ -- clean landing: airtime + full rotations pay out
+ self.score = self.score + self.spins * 100
+ + math.floor(self.airFrames / 4)
+ self.phase = "ride"
+ self.banner = { quad = self.spins > 0 and "yeah" or "good",
+ frames = 50 }
+ Sound.play(self.game.data, "Cut")
+ else
+ self.phase = "wipeout"
+ self.splash = 0
+ self.banner = { quad = "ohno", frames = 70 }
+ Sound.play(self.game.data, "Faint_Fall")
+ end
+ end
+ end
+end
+
+-- draw one 8x8 sheet tile quad at x, y
+function SurfingMinigame:tile(q, x, y)
+ love.graphics.draw(self.bg, self.aq[q], x, y)
+end
+
+function SurfingMinigame:sgbPalettes()
+ local P = require("src.render.PaletteFX")
+ local zones = { P.whole(SEA_PAL) }
+ if self.phase ~= "wipeout" and self.phase ~= "results" then
+ local tx = math.floor((PIKA_X - 12) / 8)
+ local ty = math.floor(math.max(0, self.pikaScreenY or 60) / 8)
+ zones[#zones + 1] = P.zone(PIKA_PAL, tx, ty, tx + 3, ty + 3)
+ end
+ return zones
+end
+
+function SurfingMinigame:drawScore(x, y, n)
+ local s = tostring(n)
+ for i = 1, #s do
+ love.graphics.draw(self.ob, self.bq.digit[tonumber(s:sub(i, i))],
+ x + (i - 1) * 8, y)
+ end
+end
+
+function SurfingMinigame:draw()
+ local haveSheets = self.bg and self.ob
+ -- sky
+ love.graphics.setColor(1, 1, 1, 1)
+ love.graphics.rectangle("fill", 0, 0, 160, 144)
+ if not haveSheets then
+ -- cache predates the surf sheets: plain shapes keep it playable
+ love.graphics.setColor(0, 0, 0, 1)
+ Font.draw(Strings("SCORE %d", self.score), 4, 4)
+ love.graphics.rectangle("fill", PIKA_X - 8,
+ self:seaY(PIKA_X) - 16 - self.y, 16, 16)
+ love.graphics.setColor(1, 1, 1, 1)
+ return
+ end
+
+ -- cloud in the sky strip
+ love.graphics.draw(self.ob, self.bq.cloud, 112, 8)
+
+ -- open water: the scalloped pattern tiles the whole sea, phase-locked
+ -- to the scroll so the surface slides
+ local shift = math.floor(self.distance) % 8
+ for ty = HORIZON, 136, 8 do
+ local alt = (ty / 8) % 2 == 0
+ for tx = -8, 160, 8 do
+ self:tile(alt and "scallop" or "scallop2", tx - shift, ty)
+ end
+ end
+
+ -- the wave face: a white patch hugging the ride line (the original
+ -- carved it with per-scanline scroll; the ellipse stands in), with a
+ -- few scallops floating inside and the foam lip along its upper edge
+ local faceY = self:seaY(56) + 10
+ love.graphics.setColor(1, 1, 1, 1)
+ love.graphics.ellipse("fill", 56, faceY, 46, 30)
+ love.graphics.ellipse("fill", 100, faceY + 16, 40, 22)
+ for _, spot in ipairs({ { 30, 8 }, { 70, 16 }, { 48, 22 } }) do
+ self:tile("scallop", 56 - 46 + spot[1] - shift, faceY - 24 + spot[2])
+ end
+ local pikaY = self:seaY(PIKA_X) - 20 - self.y
+ for a = 205, 335, 18 do
+ local r = math.rad(a)
+ local lx = 56 + math.cos(r) * 44 - 4
+ local ly = faceY + math.sin(r) * 28 - 4
+ -- foam that would land inside Pikachu's SGB zone comes out orange;
+ -- leave that patch to the spray ellipse instead
+ if math.abs(lx - PIKA_X) > 28 or math.abs(ly - (pikaY + 12)) > 26 then
+ self:tile("lip", lx, ly)
+ end
+ end
+ self:tile("shade", 92 - shift, faceY + 20)
+ self:tile("shade", 116 - shift, faceY + 24)
+
+ -- beach slides through at the start and again before the goal
+ local beachX
+ if self.distance < 160 then
+ beachX = -self.distance
+ elseif self.distance > RUN_DISTANCE - 200 then
+ beachX = 160 - (self.distance - (RUN_DISTANCE - 200))
+ end
+ if beachX then
+ for tx = 0, 32, 8 do
+ self:tile("beach", beachX + tx, 128)
+ self:tile("beach", beachX + tx, 136)
+ end
+ love.graphics.setColor(0, 0, 0, 1)
+ love.graphics.rectangle("fill", beachX + 9, 118, 2, 10)
+ love.graphics.setColor(1, 1, 1, 1)
+ self:tile("palm", beachX + 6, 112)
+ self:tile("hut", beachX + 20, 118)
+ end
+
+ -- Pikachu. The white spray patch under him doubles as the yellow SGB
+ -- zone's backdrop: shade 0 maps to white in both palettes, so the
+ -- attribute-block bleed never shows on the water pattern.
+ love.graphics.setColor(1, 1, 1, 1)
+ local py = self:seaY(PIKA_X) - 20 - self.y
+ self.pikaScreenY = py -- the yellow SGB zone tracks this
+ love.graphics.ellipse("fill", PIKA_X, py + 12, 25, 21)
+ if self.phase == "wipeout" then
+ love.graphics.draw(self.ob, self.bq.splash, PIKA_X - 16,
+ self:seaY(PIKA_X) - 16)
+ else
+ local quad
+ if self.phase == "ride" and self.speed <= 2
+ and self.distance < 120 then
+ quad = self.bq.paddle[math.floor(self.t / 8) % 2 + 1]
+ else
+ local bucket = math.floor(((self.rot % 360) + 22.5) / 45) % 8 * 45
+ quad = self.bq.poses[bucket] or self.bq.poses[0]
+ end
+ love.graphics.draw(self.ob, quad, PIKA_X - 12, py)
+ end
+
+ -- banner beats: GOOD! / YEAH- / Oh no..
+ if self.banner and self.bq[self.banner.quad] then
+ love.graphics.draw(self.ob, self.bq[self.banner.quad], 60, 40)
+ end
+
+ -- score strip, bottom right: HP: + sheet digits
+ love.graphics.setColor(1, 1, 1, 1)
+ love.graphics.rectangle("fill", 100, 134, 60, 10)
+ love.graphics.draw(self.bg, self.aq.hp, 102, 135)
+ self:drawScore(126, 135, self.score)
+
+ if self.phase == "results" then
+ love.graphics.setColor(1, 1, 1, 1)
+ love.graphics.rectangle("fill", 20, 48, 120, 48)
+ love.graphics.setColor(0, 0, 0, 1)
+ love.graphics.rectangle("line", 20.5, 48.5, 119, 47)
+ Font.draw(Strings("SCORE %d", self.score), 32, 56)
+ if self.newRecord then
+ Font.draw(Strings("New record!"), 32, 68)
+ else
+ Font.draw(Strings("HI %d", self.game.save.surfingHighScore or 0),
+ 32, 68)
+ end
+ if self.resultShown > 30 then
+ Font.draw(Strings("A: done"), 32, 82)
+ end
+ love.graphics.setColor(1, 1, 1, 1)
+ end
+end
+
+return SurfingMinigame
diff --git a/src/ui/TitleState.lua b/src/ui/TitleState.lua
index 979d24d7..3c393818 100644
--- a/src/ui/TitleState.lua
+++ b/src/ui/TitleState.lua
@@ -33,11 +33,25 @@ end
function TitleState:sgbPalettes(game)
local P = require("src.render.PaletteFX")
- local z = {
- P.zone(P.pal(game.data, "LOGO2"), 0, 0, 19, 7),
- P.zone(withPureWhite(P.pal(game.data, "LOGO1")), 0, 8, 19, 9),
- P.zone(P.pal(game.data, "MEWMON"), 0, 10, 19, 17),
- }
+ local z
+ if self.yellowLayout then
+ -- Yellow's BlkPacket_Titlescreen (pokeyellow data/sgb/sgb_packets.asm):
+ -- rows 0-7 logo band pal 0 (PAL_LOGO2), rows 8-17 Pikachu + copyright
+ -- pal 2 (PAL_MEWMON), then the two bubble-tail cells at (9,8)-(10,8)
+ -- back on pal 0. No Red/Blue LOGO1 ribbon band.
+ local logoPal = P.pal(game.data, "LOGO2")
+ z = {
+ P.zone(logoPal, 0, 0, 19, 7),
+ P.zone(P.pal(game.data, "MEWMON"), 0, 8, 19, 17),
+ P.zone(logoPal, 9, 8, 10, 8),
+ }
+ else
+ z = {
+ P.zone(P.pal(game.data, "LOGO2"), 0, 0, 19, 7),
+ P.zone(withPureWhite(P.pal(game.data, "LOGO1")), 0, 8, 19, 9),
+ P.zone(P.pal(game.data, "MEWMON"), 0, 10, 19, 17),
+ }
+ end
local top = game.stack and game.stack:top()
local box = top and top.titleUiBox
if box then
@@ -61,6 +75,14 @@ local BLUE_CYCLE_SPECIES = {
"VULPIX", "CHANSEY", "AERODACTYL", "JOLTEON", "SNORLAX",
"GLOOM", "POLIWAG", "DODUO", "PORYGON", "GENGAR", "RAICHU",
}
+-- Yellow has no TitleMons table (engine/movie/title_yellow.asm is a fixed
+-- Pikachu title). Until field.title.cycleSpecies is imported, keep a short
+-- Pikachu-centric list so the Red/Blue cycling UI still has something to show.
+local YELLOW_CYCLE_SPECIES = {
+ "PIKACHU", "EEVEE", "BULBASAUR", "CHARMANDER", "SQUIRTLE",
+ "JIGGLYPUFF", "MEOWTH", "PSYDUCK", "VULPIX", "ABRA",
+ "GROWLITHE", "CUBONE", "GASTLY", "HITMONLEE", "SNORLAX", "DRAGONITE",
+}
local CYCLE_FRAMES = 240 -- the original waits ~4s between picks
local function tryImage(path)
@@ -76,6 +98,30 @@ local function imagePath(entry)
return entry
end
+-- PaletteFX redraws a true-color rectangle after the palette pass. Red's
+-- title art is drawn on top of the title mon, so leave its bounds out of the
+-- rectangle rather than redrawing that art without its title palette.
+local function markVisibleTrueColor(x, y, w, h, cover)
+ local P = require("src.render.PaletteFX")
+ if not cover then
+ P.markTrueColor(x, y, w, h)
+ return
+ end
+ local cx, cy, cw, ch = cover[1], cover[2], cover[3], cover[4]
+ local right, bottom = x + w, y + h
+ local cright, cbottom = cx + cw, cy + ch
+ local ix1, iy1 = math.max(x, cx), math.max(y, cy)
+ local ix2, iy2 = math.min(right, cright), math.min(bottom, cbottom)
+ if ix1 >= ix2 or iy1 >= iy2 then
+ P.markTrueColor(x, y, w, h)
+ return
+ end
+ if y < iy1 then P.markTrueColor(x, y, w, iy1 - y) end
+ if iy2 < bottom then P.markTrueColor(x, iy2, w, bottom - iy2) end
+ if x < ix1 then P.markTrueColor(x, iy1, ix1 - x, iy2 - iy1) end
+ if ix2 < right then P.markTrueColor(ix2, iy1, right - ix2, iy2 - iy1) end
+end
+
function TitleState.new(game, opts)
opts = opts or {}
local self = setmetatable({}, TitleState)
@@ -93,13 +139,40 @@ function TitleState.new(game, opts)
or "assets/generated/title/red_version.png")
self.player = tryImage("assets/generated/title/player.png")
self.blue = GameVersion.isBlue()
- -- Blue cycles its own title mons and prints its ribbon contiguously; a
- -- field.title.cycleSpecies override (mods / total conversions) still wins.
- local defaultCycle = self.blue and BLUE_CYCLE_SPECIES or CYCLE_SPECIES
+ self.yellow = GameVersion.isYellow()
+ or title.layout == "yellow_pikachu"
+ -- Yellow title is a fixed Pikachu composition (title_yellow.asm), not
+ -- TitleMons cycling. Prefer composed pikachu.png from the Yellow import.
+ self.yellowPikachu = self.yellow and tryImage(imagePath(title.pikachu)
+ or "assets/generated/title/pikachu.png") or nil
+ self.yellowBubble = self.yellow and tryImage(imagePath(title.pikaBubble)
+ or "assets/generated/title/pika_bubble.png") or nil
+ self.yellowLayout = self.yellow and self.yellowPikachu ~= nil
+ if self.yellowLayout then
+ -- title.asm boot: hSCY starts at $40 with the logo parked above the
+ -- viewport; .bouncePokemonLogoLoop drops it in with an overshoot
+ -- bounce, then the whoosh, the speech bubble, and PikachuCry1 before
+ -- the title music starts. Blink overlays are the OB tile swaps of
+ -- DoTitleScreenFunction.
+ self.eyesHalf = tryImage("assets/generated/title/eyes_half.png")
+ self.eyesClosed = tryImage("assets/generated/title/eyes_closed.png")
+ self.scy = 0x40
+ self.phase = "drop"
+ self.dropStep, self.dropLeft = 1, nil
+ self.showBubble = false
+ self.blinkTimer = 0
+ self.blinkAt = nil
+ else
+ self.phase = "loop"
+ self.showBubble = true
+ end
+ local defaultCycle = self.yellowLayout and { "PIKACHU" }
+ or (self.yellow and YELLOW_CYCLE_SPECIES)
+ or (self.blue and BLUE_CYCLE_SPECIES or CYCLE_SPECIES)
self.cycleSpecies = (type(title.cycleSpecies) == "table"
and #title.cycleSpecies > 0)
and title.cycleSpecies or defaultCycle
- self.sprites = {} -- species -> image or false (load failed)
+ self.sprites = {} -- species -> { image, trueColor } or false (load failed)
self.cycleIndex = 1
self.timer = 0
self.blink = 0
@@ -107,6 +180,14 @@ function TitleState.new(game, opts)
end
function TitleState:enter()
+ -- Yellow defers the title theme until after the logo drop and
+ -- Pikachu's cry (title.asm plays MUSIC_TITLE_SCREEN only after
+ -- WaitForSoundToFinish on PikachuCry1)
+ if self.yellowLayout then return end
+ self:startMusic()
+end
+
+function TitleState:startMusic()
local data = self.game.data
local song = self.title.music or "Music_TitleScreen"
if data.audio and data.audio.songs and data.audio.songs[song] then
@@ -114,16 +195,94 @@ function TitleState:enter()
end
end
+-- .TitleScreenPokemonLogoYScrolls: { dy per frame, frames }; the -3
+-- rebound step lands with SFX_INTRO_CRASH
+local DROP_STEPS = {
+ { -4, 16 }, { 3, 4 }, { -3, 4 }, { 2, 2 }, { -2, 2 }, { 1, 2 }, { -1, 2 },
+}
+
+-- the boot cinematic up to the interactive loop; one call per frame
+function TitleState:updateSequence()
+ local Sound = require("src.core.Sound")
+ local data = self.game.data
+ if self.phase == "drop" then
+ local step = DROP_STEPS[self.dropStep]
+ if not step then
+ self.phase = "settle"
+ self.timer = 0
+ return
+ end
+ if self.dropLeft == nil then
+ self.dropLeft = step[2]
+ if step[1] == -3 then Sound.play(data, "Intro_Crash") end
+ end
+ self.scy = self.scy + step[1]
+ self.dropLeft = self.dropLeft - 1
+ if self.dropLeft <= 0 then
+ self.dropStep = self.dropStep + 1
+ self.dropLeft = nil
+ end
+ elseif self.phase == "settle" then
+ -- ld c, 36 / DelayFrames, then the whoosh and the bubble
+ self.timer = self.timer + 1
+ if self.timer >= 36 then
+ Sound.play(data, "Intro_Whoosh")
+ self.showBubble = true
+ self.phase = "bubble"
+ self.timer = 0
+ end
+ elseif self.phase == "bubble" then
+ self.timer = self.timer + 1
+ if self.timer >= 3 then
+ self.crySrc = Sound.playPikaCry(data, 1)
+ self.phase = "cry"
+ self.timer = 0
+ end
+ elseif self.phase == "cry" then
+ -- WaitForSoundToFinish before the music starts
+ self.timer = self.timer + 1
+ local playing = self.crySrc and self.crySrc.isPlaying
+ and self.crySrc:isPlaying()
+ if not playing or self.timer > 180 then
+ self.crySrc = nil
+ self:startMusic()
+ self.phase = "loop"
+ self.blinkTimer = 0
+ end
+ end
+end
+
+-- DoTitleScreenFunction.CheckTimer: an 8-bit frame counter blinks at 0,
+-- $80 and $90; the blink itself runs half/closed/half over 9 frames
+function TitleState:updateBlink()
+ local t = self.blinkTimer
+ self.blinkTimer = (t + 1) % 256
+ if t == 0 or t == 0x80 or t == 0x90 then self.blinkAt = 0 end
+ if self.blinkAt then
+ self.blinkAt = self.blinkAt + 1
+ if self.blinkAt > 9 then self.blinkAt = nil end
+ end
+end
+
+-- the blink overlay for this frame (nil = open eyes)
+function TitleState:blinkOverlay()
+ local at = self.blinkAt
+ if not at then return nil end
+ if at <= 3 or at > 6 then return self.eyesHalf end
+ return self.eyesClosed
+end
+
function TitleState:currentSprite()
local species = self.cycleSpecies[self.cycleIndex]
local cached = self.sprites[species]
if cached == nil then
- local path = require("src.pokemon.Sprites").path(
+ local path, trueColor = require("src.pokemon.Sprites").path(
self.game.data, species, "front", { kind = "title" })
- cached = tryImage(path) or false
+ local image = tryImage(path)
+ cached = image and { image = image, trueColor = trueColor } or false
self.sprites[species] = cached
end
- return cached or nil
+ return cached and cached.image or nil, cached and cached.trueColor or false
end
local function hasSave()
@@ -219,9 +378,26 @@ function TitleState:openMenu()
end
function TitleState:update(dt)
+ if self.yellowLayout then
+ if self.phase ~= "loop" then
+ self:updateSequence()
+ return -- input is ignored until the cinematic lands (title.asm)
+ end
+ self:updateBlink()
+ local input = self.game.input
+ if input:wasPressed("start") or input:wasPressed("a") then
+ -- .go_to_main_menu voices PikachuCry11 on the way out
+ local Sound = require("src.core.Sound")
+ if not Sound.playPikaCry(self.game.data, 11) then
+ Sound.playCry(self.game.data, "PIKACHU")
+ end
+ self:openMenu()
+ end
+ return
+ end
self.timer = self.timer + 1
self.blink = (self.blink + 1) % 60
- if self.timer >= CYCLE_FRAMES then
+ if not self.yellowLayout and self.timer >= CYCLE_FRAMES then
self.timer = 0
-- random pick that never repeats the current one
if #self.cycleSpecies > 1 then
@@ -238,9 +414,11 @@ function TitleState:update(dt)
end
local input = self.game.input
if input:wasPressed("start") or input:wasPressed("a") then
- -- the title mon cries when you leave the title (.finishedWaiting)
+ -- the title mon cries when you leave the title (.finishedWaiting);
+ -- Yellow's fixed Pikachu title always cries Pikachu.
require("src.core.Sound").playCry(self.game.data,
- self.cycleSpecies[self.cycleIndex])
+ self.yellowLayout and "PIKACHU"
+ or self.cycleSpecies[self.cycleIndex])
self:openMenu()
end
end
@@ -248,50 +426,79 @@ end
-- The original tilemap (engine/movie/title.asm): logo at tile (2,1),
-- the version ribbon at (7,8), Red's title art as OAM at px (82,80),
-- the title mon in the 7x7 box at tile (5,10), copyright on row 17.
+-- Yellow (title_yellow.asm): logo (2,1), speech bubble (6,4), Pikachu
+-- (4,8) 12x9 — no version ribbon, no cycling mon, no Red OAM.
function TitleState:draw()
love.graphics.setColor(1, 1, 1, 1)
love.graphics.rectangle("fill", 0, 0, 160, 144)
+ local scrollY = self.yellowLayout and -(self.scy or 0) or 0
if self.logo then
- love.graphics.draw(self.logo, 16, 8)
+ love.graphics.draw(self.logo, 16, 8 + scrollY)
else
love.graphics.setColor(0, 0, 0, 1)
- Font.draw(self.blue and "POKéMON BLUE" or Strings("POKéMON RED"),
- (160 - 12 * 8) / 2, 24)
+ local brand = self.yellow and "POKéMON YELLOW"
+ or (self.blue and "POKéMON BLUE" or Strings("POKéMON RED"))
+ Font.draw(brand, (160 - 12 * 8) / 2, 24 + scrollY)
love.graphics.setColor(1, 1, 1, 1)
end
- if self.version then
- local iw, ih = self.version:getDimensions()
- if self.blue then
- -- Blue prints its ribbon contiguously ("Blue Version", hlcoord 7,8).
- -- The extracted strip packs those eight glyph tiles into image tiles
- -- 0..7 (tiles 8..9 are blank), so draw that 64px run at px (56, 64).
- love.graphics.draw(self.version,
- love.graphics.newQuad(0, 0, 64, 8, iw, ih), 56, 64)
- else
- -- Red's strip holds Red+Green+Version glyphs; the tilemap prints
- -- tiles $60,$61 ("Red"), a space, then $65-$69 ("Version").
- love.graphics.draw(self.version,
- love.graphics.newQuad(0, 0, 16, 8, iw, ih), 56, 64)
- love.graphics.draw(self.version,
- love.graphics.newQuad(40, 0, 40, 8, iw, ih), 80, 64)
+ if self.yellowLayout then
+ -- everything scrolls together through the logo drop (rSCY): screen
+ -- y = BG y - SCY, so the composition rides at -scy until it lands
+ local dy = scrollY
+ if self.yellowBubble and self.showBubble then
+ love.graphics.draw(self.yellowBubble, 48, 32 + dy)
+ end
+ -- hlcoord 4,8 → px (32, 64); composed 13x9 tile sprite
+ love.graphics.draw(self.yellowPikachu, 32, 64 + dy)
+ local overlay = self:blinkOverlay()
+ if overlay then
+ -- the eye OAM band sits at (56,80) on the landed screen
+ love.graphics.draw(overlay, 32 + 24, 64 + 16 + dy)
+ end
+ else
+ -- Yellow's Version_GFX slot holds a leftover "Blue Version" ribbon
+ -- (pokeyellow gfx/title/blue_version.png, unreferenced by title code);
+ -- the Yellow fallback layout draws no ribbon at all.
+ if self.version and not self.yellow then
+ local iw, ih = self.version:getDimensions()
+ if self.blue then
+ love.graphics.draw(self.version,
+ love.graphics.newQuad(0, 0, 64, 8, iw, ih), 56, 64)
+ else
+ love.graphics.draw(self.version,
+ love.graphics.newQuad(0, 0, 16, 8, iw, ih), 56, 64)
+ love.graphics.draw(self.version,
+ love.graphics.newQuad(40, 0, 40, 8, iw, ih), 80, 64)
+ end
+ end
+ local sprite, spriteTrueColor = self:currentSprite()
+ if sprite then
+ local w, h = sprite:getDimensions()
+ local slide = (self.slideIn or 0) * 8 -- scroll in from the right
+ -- bottom-aligned and centered in the (5,10)-(11,16) tile box
+ local x = 40 + math.floor((56 - w) / 2) + slide
+ local y = 136 - h
+ love.graphics.draw(sprite, x, y)
+ -- a full-color mon keeps its own palette through the SGB pass, minus
+ -- the strip Red's OAM covers (#350). Yellow never reaches here: its
+ -- layout has no cycling mon and no Red art (title_yellow.asm).
+ if spriteTrueColor then
+ local cover
+ if self.player then
+ local pw, ph = self.player:getDimensions()
+ cover = { 82, 80, pw, ph }
+ end
+ markVisibleTrueColor(x, y, w, h, cover)
+ end
+ end
+ -- Red is OAM in the original: he draws over the mon's box edge
+ if self.player then
+ love.graphics.draw(self.player, 82, 80)
end
end
- local sprite = self:currentSprite()
- if sprite then
- local w, h = sprite:getDimensions()
- local slide = (self.slideIn or 0) * 8 -- scroll in from the right
- -- bottom-aligned and centered in the (5,10)-(11,16) tile box
- love.graphics.draw(sprite, 40 + math.floor((56 - w) / 2) + slide,
- 136 - h)
- end
- -- Red is OAM in the original: he draws over the mon's box edge
- if self.player then
- love.graphics.draw(self.player, 82, 80)
- end
love.graphics.setColor(0, 0, 0, 1)
- -- the copyright row (tile 2,17); copyrightText because field.title's
- -- copyright key already names the extracted image strip
- Font.draw(self.title.copyrightText or Strings("2026 bois club games"), 1, 136)
+ Font.draw(self.title.copyrightText or Strings("2026 bois club games"),
+ 1, 136 + scrollY)
love.graphics.setColor(1, 1, 1, 1)
end
diff --git a/src/ui/YellowIntro.lua b/src/ui/YellowIntro.lua
new file mode 100644
index 00000000..5a4e3c31
--- /dev/null
+++ b/src/ui/YellowIntro.lua
@@ -0,0 +1,740 @@
+-- Yellow's boot attract movie, a faithful port of PlayIntroScene
+-- (pokeyellow engine/movie/intro_yellow.asm) over the extracted atlases
+-- (gfx/intro/yellow_intro_1.2bpp -> intro/yellow_intro_1.png, atlas1,
+-- 16x8 tiles; yellow_intro_2.2bpp -> yellow_intro_2.png, atlas2, 16x16
+-- tiles; clouds.2bpp -> intro/clouds.png, two 4-tile frames).
+--
+-- Faithful pieces: the 18-scene jumptable with its 128/88-frame timers,
+-- the animated-object system (YellowIntro_AnimatedObjectSpawnStateData /
+-- Jumptable / FramesData / OAMData, data/sprite_anims/intro_frames.asm +
+-- intro_oam.asm), the scene-7 per-scanline SCY sine wave
+-- (YellowIntro_Copy8BitSineWave, +-4px period 32, rotated 1 line/frame),
+-- the scene-3 SCX ramp to $68, the scene-11 cloud tile flip every 8
+-- frames, and the scene-14/15/16 BGP strobe / fade sequences
+-- (YellowIntroPalSequence_f9dd6 / _f9e0a). BGP composes with the SGB
+-- colorization through sgbPalettes (PalPacket_Generic = MEWMON,
+-- PalPacket_PikachusBeach = PIKACHUS_BEACH), like the title screen.
+--
+-- Deliberately dropped: the CGB-only OBJ-palette pokes of scenes 7/11
+-- (Func_f98a2 / Func_f98cb recolor 5-6 tiles of the surf/fly sprite),
+-- OBP-vs-BGP divergence during the strobes (one whole-screen shade map
+-- stands in for both), and the never-spawned objects $0/$4 (dead code,
+-- intro_yellow.asm:173).
+--
+-- Any of A/B/START skips the whole movie (PlayIntroScene:16-19). Pops
+-- itself and calls onDone() when finished or skipped.
+
+local Music = require("src.core.Music")
+
+local YellowIntro = {}
+YellowIntro.__index = YellowIntro
+YellowIntro.isOpaque = true
+
+-- ------- data tables (data/sprite_anims/intro_oam.asm) ----------------
+
+-- OAM lists: rows of { dy, dx, tileDelta, flip }
+local function grid(rows, cols, dy0, dx0, tileForRC)
+ local list = {}
+ for r = 0, rows - 1 do
+ for c = 0, cols - 1 do
+ list[#list + 1] = { dy0 + r * 8, dx0 + c * 8, tileForRC(r, c), false }
+ end
+ end
+ return list
+end
+
+local OAM = {}
+
+-- Unkn_fa17e: 2x2, tiles +0/+1 over +$10/+$11
+OAM.fa17e = grid(2, 2, -8, -8, function(r, c) return r * 0x10 + c end)
+
+-- Unkn_fa18f: 16x32; bottom two rows mirror their left half
+OAM.fa18f = {
+ { -16, -8, 0x00 }, { -16, 0, 0x01 },
+ { -8, -8, 0x10 }, { -8, 0, 0x11 },
+ { 0, -8, 0x20 }, { 0, 0, 0x20, true },
+ { 8, -8, 0x21 }, { 8, 0, 0x21, true },
+}
+
+-- Unkn_fa1b0: 32x40 (16-wide head rows, 32-wide mirrored body rows)
+OAM.fa1b0 = {
+ { -24, -8, 0x00 }, { -24, 0, 0x01 },
+ { -16, -8, 0x02 }, { -16, 0, 0x03 },
+ { -8, -16, 0x04 }, { -8, -8, 0x05 }, { -8, 0, 0x06 }, { -8, 8, 0x04, true },
+ { 0, -16, 0x07 }, { 0, -8, 0x08 }, { 0, 0, 0x08, true }, { 0, 8, 0x07, true },
+ { 8, -16, 0x09 }, { 8, -8, 0x0a }, { 8, 0, 0x0a, true }, { 8, 8, 0x09, true },
+ { 16, -16, 0x0b }, { 16, -8, 0x0c }, { 16, 0, 0x0c, true }, { 16, 8, 0x0b, true },
+}
+
+-- Unkn_fa201: 6x6 = 48x48, row r uses tiles +$r0..+$r5
+OAM.fa201 = grid(6, 6, -24, -24, function(r, c) return r * 0x10 + c end)
+
+-- Unkn_fa292: 5x5 = 40x40, row bases $00,$05,$10,$15,$20
+local FA292_ROW = { 0x00, 0x05, 0x10, 0x15, 0x20 }
+OAM.fa292 = {}
+for r = 0, 4 do
+ for c = 0, 4 do
+ OAM.fa292[#OAM.fa292 + 1] =
+ { -20 + r * 8, -16 + c * 8, FA292_ROW[r + 1] + c, false }
+ end
+end
+
+-- Unkn_fa2f7: 32x8 mirrored streak
+OAM.fa2f7 = {
+ { -4, -16, 0x00 }, { -4, -8, 0x01 },
+ { -4, 0, 0x01, true }, { -4, 8, 0x00, true },
+}
+
+-- Unkn_fa308: two mirrored 16x16 clusters, 32px apart
+OAM.fa308 = {
+ { -8, -24, 0x00 }, { -8, -16, 0x01 },
+ { 0, -24, 0x02 }, { 0, -16, 0x03 },
+ { -8, 8, 0x01, true }, { -8, 16, 0x00, true },
+ { 0, 8, 0x03, true }, { 0, 16, 0x02, true },
+}
+
+-- Unkn_fa329: two mirrored 24x16 clusters
+OAM.fa329 = {
+ { -8, -40, 0x00 }, { -8, -32, 0x01 }, { -8, -24, 0x02 },
+ { 0, -40, 0x10 }, { 0, -32, 0x11 }, { 0, -24, 0x12 },
+ { -8, 16, 0x02, true }, { -8, 24, 0x01, true }, { -8, 32, 0x00, true },
+ { 0, 16, 0x12, true }, { 0, 24, 0x11, true }, { 0, 32, 0x10, true },
+}
+
+-- frameId -> { atlas2 tile offset, OAM list }
+local FRAMES = {
+ [0x01] = { 0x96, OAM.fa17e }, [0x02] = { 0x98, OAM.fa17e },
+ [0x03] = { 0x9a, OAM.fa17e },
+ [0x04] = { 0x0c, OAM.fa18f }, [0x05] = { 0x0e, OAM.fa18f },
+ [0x06] = { 0x3c, OAM.fa18f },
+ [0x07] = { 0x60, OAM.fa1b0 }, [0x08] = { 0x70, OAM.fa1b0 },
+ [0x09] = { 0x80, OAM.fa1b0 },
+ [0x0a] = { 0x90, OAM.fa201 }, [0x0b] = { 0x00, OAM.fa201 },
+ [0x0c] = { 0x06, OAM.fa201 },
+ [0x0d] = { 0xc6, OAM.fa292 },
+ [0x0e] = { 0x6d, OAM.fa2f7 },
+ [0x0f] = { 0xf0, OAM.fa308 }, [0x10] = { 0xf4, OAM.fa308 },
+ [0x11] = { 0xf8, OAM.fa308 },
+ [0x12] = { 0x9c, OAM.fa329 }, [0x13] = { 0xec, OAM.fa329 },
+}
+
+-- frame scripts (intro_frames.asm): { {frameId, duration}, ..., loop=bool }
+local FRAMESETS = {
+ [1] = { { 0x01, 4 }, { 0x02, 4 }, { 0x03, 4 }, loop = true },
+ [2] = { { 0x04, 4 }, { 0x05, 4 }, { 0x06, 4 }, loop = true },
+ [3] = { { 0x07, 4 }, { 0x08, 4 }, { 0x09, 4 }, loop = true },
+ [5] = { { 0x0b, 32 } },
+ [6] = { { 0x0c, 32 } },
+ [7] = { { 0x0d, 32 } },
+ [8] = { { 0x0e, 32 } },
+ [9] = { { 0x0f, 31 }, { 0x11, 2 }, { 0x0f, 2 }, { 0x11, 2 },
+ { 0x0f, 31 }, { 0x11, 2 }, { 0x0f, 23 }, { 0x10, 32 } },
+ [10] = { { 0x12, 4 }, { 0x13, 4 }, loop = true },
+}
+
+-- object id -> { frameset, seq } (YellowIntro_AnimatedObjectSpawnStateData;
+-- seq indexes the movement jumptable)
+local SPAWN = {
+ [1] = { 1, "static" }, [2] = { 2, "static" }, [3] = { 3, "static" },
+ [5] = { 5, "surf" }, [6] = { 6, "fly" }, [7] = { 7, "static" },
+ [8] = { 8, "bar" }, [9] = { 9, "static" }, [10] = { 10, "static" },
+}
+
+-- speed-bar spawn rows (YellowIntroFlyingSpeedBarData; first byte is X --
+-- the source's "; y, x, speed" comment is wrong)
+local SPEED_BARS = {
+ { 0xD0, 0x20, 2 }, { 0xF0, 0x30, 4 }, { 0xD0, 0x40, 6 },
+ { 0xC0, 0x50, 8 }, { 0xE0, 0x60, 8 }, { 0xC0, 0x70, 6 },
+ { 0xE0, 0x80, 4 }, { 0xF0, 0x90, 2 },
+}
+
+-- scene-6 sine (YellowIntro_Copy8BitSineWave.SineWave), signed SCY deltas
+local WAVE = { 0, 0, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 2, 2, 1, 0,
+ 0, 0, -1, -2, -2, -3, -3, -3, -4, -3, -3, -3, -2, -2, -1, 0 }
+
+-- scene-10 BG tilemaps (gfx/intro/unknown_f9b6e/f9be6/f9bf2.tilemap)
+local SKY_MAP = {
+ { 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x60,0x61,0x62 },
+ { 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x62,0x00,0x00,0x00 },
+ { 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x62,0x00,0x00,0x00,0x00 },
+ { 0x60,0x61,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x62,0x00,0x00,0x00,0x00,0x00 },
+ { 0x00,0x00,0x63,0x60,0x61,0x60,0x61,0x02,0x02,0x02,0x02,0x60,0x61,0x62,0x00,0x00,0x00,0x00,0x00,0x00 },
+ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x62,0x63,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
+}
+local BADGE_MAP = {
+ { 0x30, 0x31, 0x32, 0x33 }, { 0x40, 0x41, 0x42, 0x43 },
+ { 0x50, 0x51, 0x52, 0x53 },
+}
+local MARK_MAP = { { 0x12, 0x13 }, { 0x22, 0x23 } }
+
+-- scene-14 strobe (YellowIntroPalSequence_f9dd6): 13 groups of
+-- $e4,$c0,$c0,$e4 with the 52nd byte replaced by the terminator
+local STROBE_SEQ = {}
+for i = 1, 51 do
+ local m = (i - 1) % 4
+ STROBE_SEQ[i] = (m == 1 or m == 2) and 0xC0 or 0xE4
+end
+-- scene-16 fade to white (YellowIntroPalSequence_f9e0a)
+local FADE_SEQ = { 0xE4, 0x90, 0x90, 0x40, 0x40, 0x00, 0x00 }
+
+-- Func_fa079's sine bob (Unkn_fa0aa, sine_table 32). The ROM table's
+-- `dw sin(x)` truncates the 1.0 peak to $0000, which pops the sprite 8px
+-- for one frame at every crest (a=16 / a=48) on hardware; the true peak
+-- is restored here so the balloon glide loops smoothly.
+local function bobOffset(phase)
+ local a = phase % 64
+ local half = a % 32
+ local v = math.floor(8 * math.sin(math.pi * half / 32))
+ return a < 32 and v or -v
+end
+
+local function tryImage(path)
+ local ok, img = pcall(love.graphics.newImage, path)
+ return ok and img or nil
+end
+
+-- ------- state --------------------------------------------------------
+
+function YellowIntro.new(game, onDone)
+ local self = setmetatable({}, YellowIntro)
+ self.game = game
+ self.onDone = onDone
+ self.finished = false
+ self.scene = 0
+ self.timer = 0
+ self.seqIndex = 0
+ self.scx = 0
+ self.bgp = 0xE4
+ self.palName = "MEWMON" -- PalPacket_Generic
+ self.objects = {}
+ self.cloudFrame = 0
+
+ self.atlas1 = tryImage("assets/generated/intro/yellow_intro_1.png")
+ self.atlas2 = tryImage("assets/generated/intro/yellow_intro_2.png")
+ self.clouds = tryImage("assets/generated/intro/clouds.png")
+ self.quads = {}
+
+ -- 32x32 BG tile grid (vBGMap0); signed addressing: id < $80 -> atlas1,
+ -- id >= $80 -> atlas2 (LCDC $e3, bit4 = 0)
+ self.bg = {}
+ self:bgLetterbox()
+ self.bgDirty = true
+ self.wave = nil
+ local ok, canvas = pcall(love.graphics.newCanvas, 256, 256)
+ self.bgCanvas = ok and canvas or nil
+
+ -- Yellow boots exactly like Red up to the attract movie: the copyright
+ -- card and the GAME FREAK shooting-star splash play first. Reuse
+ -- IntroMovie's phases 1-2 and take over where its Gengar fight (phase
+ -- 3) would begin; a skip press during the pre-roll skips everything.
+ local IntroMovie = require("src.ui.IntroMovie")
+ local pre = IntroMovie.new(game, nil)
+ local baseStart = pre.startPhase
+ pre.finish = function(m)
+ if m.finished then return end
+ m.finished = true
+ self.pre = nil
+ self:finish()
+ end
+ pre.startPhase = function(m, phase)
+ if phase == 3 then
+ m.finished = true
+ self.pre = nil
+ self:beginScenes()
+ else
+ baseStart(m, phase)
+ end
+ end
+ self.pre = pre
+ return self
+end
+
+function YellowIntro:sgbPalettes(game)
+ if self.pre then return self.pre:sgbPalettes(game) end
+ local P = require("src.render.PaletteFX")
+ local pal = P.pal(game.data, self.palName)
+ if not pal then return nil end
+ -- rBGP composed with the SGB colors: shade i displays palette color
+ -- ((bgp >> 2i) & 3), whole screen (one map stands in for BGP and OBP)
+ local bgp = self.bgp
+ local map = {}
+ for i = 0, 3 do
+ map[i] = math.floor(bgp / 4 ^ i) % 4
+ end
+ return { P.whole(P.permute(pal, map)) }
+end
+
+-- ------- BG helpers ---------------------------------------------------
+
+function YellowIntro:bgFill(id)
+ for y = 0, 31 do
+ local row = self.bg[y] or {}
+ self.bg[y] = row
+ for x = 0, 31 do row[x] = id end
+ end
+ self.bgDirty = true
+end
+
+-- Func_f9e5f: rows 0-3 / 14-17 tile $01, rows 4-13 tile $00
+function YellowIntro:bgLetterbox()
+ self:bgFill(0x01)
+ for y = 4, 13 do
+ for x = 0, 31 do self.bg[y][x] = 0x00 end
+ end
+ for y = 18, 31 do
+ for x = 0, 31 do self.bg[y][x] = 0x00 end
+ end
+ self.bgDirty = true
+end
+
+function YellowIntro:bgBlit(col, row, map)
+ for r, line in ipairs(map) do
+ for c, id in ipairs(line) do
+ self.bg[(row + r - 1) % 32][(col + c - 1) % 32] = id
+ end
+ end
+ self.bgDirty = true
+end
+
+function YellowIntro:quadFor(image, tile)
+ local key = image
+ local cacheByImage = self.quads[key]
+ if not cacheByImage then
+ cacheByImage = {}
+ self.quads[key] = cacheByImage
+ end
+ local quad = cacheByImage[tile]
+ if not quad then
+ local iw, ih = image:getDimensions()
+ quad = love.graphics.newQuad(
+ (tile % 16) * 8, math.floor(tile / 16) * 8, 8, 8, iw, ih)
+ cacheByImage[tile] = quad
+ end
+ return quad
+end
+
+function YellowIntro:rebuildBgCanvas()
+ if not self.bgCanvas then return end
+ love.graphics.push("all")
+ love.graphics.setCanvas(self.bgCanvas)
+ love.graphics.clear(1, 1, 1, 1)
+ love.graphics.setColor(1, 1, 1, 1)
+ for y = 0, 31 do
+ for x = 0, 31 do
+ local id = self.bg[y][x]
+ local image, tile
+ if id < 0x80 then
+ image, tile = self.atlas1, id
+ else
+ image, tile = self.atlas2, id
+ end
+ if image then
+ -- scene-11 cloud animation retargets BG tiles $60-$63 at the
+ -- clouds sheet (VBlank copy to $9600); frame = clouds row 0/1
+ if self.clouds and id >= 0x60 and id <= 0x63 then
+ local cw, ch = self.clouds:getDimensions()
+ love.graphics.draw(self.clouds,
+ love.graphics.newQuad((id - 0x60) * 8, self.cloudFrame * 8,
+ 8, 8, cw, ch), x * 8, y * 8)
+ else
+ love.graphics.draw(image, self:quadFor(image, tile), x * 8, y * 8)
+ end
+ end
+ end
+ end
+ love.graphics.pop()
+ self.bgDirty = false
+end
+
+-- ------- objects ------------------------------------------------------
+
+function YellowIntro:spawn(id, x, y)
+ local spec = SPAWN[id]
+ local obj = {
+ id = id, frameset = spec[1], seq = spec[2],
+ x = x, y = y, xoff = 0, yoff = 0,
+ step = 1, wait = 0, held = false,
+ fieldB = 0, fieldC = 0,
+ }
+ local script = FRAMESETS[obj.frameset]
+ obj.wait = script[1][2]
+ self.objects[#self.objects + 1] = obj
+ return obj
+end
+
+function YellowIntro:clearObjects()
+ self.objects = {}
+end
+
+local function updateFrameScript(obj)
+ if obj.held then return end
+ obj.wait = obj.wait - 1
+ if obj.wait > 0 then return end
+ local script = FRAMESETS[obj.frameset]
+ if obj.step >= #script then
+ if script.loop then
+ obj.step = 1
+ obj.wait = script[1][2]
+ else
+ obj.held = true -- endanim: hold last frame forever
+ end
+ return
+ end
+ obj.step = obj.step + 1
+ obj.wait = script[obj.step][2]
+end
+
+function YellowIntro:updateObjects()
+ for _, obj in ipairs(self.objects) do
+ if obj.seq == "bar" then
+ -- Func_fa062: constant velocity, 8-bit wrap
+ obj.x = (obj.x + obj.fieldB) % 256
+ elseif obj.seq == "surf" then
+ -- Func_fa014, including the original's Y = X + 1 quirk: the
+ -- comparison register still holds X when Y is written, so the
+ -- sprite rides a 45-degree diagonal until X parks at $58
+ if obj.x ~= 0x58 then
+ obj.x = (obj.x + 4) % 256
+ obj.y = (obj.x + 1) % 256
+ end
+ elseif obj.seq == "fly" then
+ -- Func_fa02b: rise 2px/frame to Y=$58, then a +-8px sine bob
+ -- with a 64-frame period (and the truncated-peak notch)
+ if obj.fieldB == 0 then
+ if obj.y ~= 0x58 then
+ obj.y = (obj.y - 2) % 256
+ else
+ obj.fieldB = 1
+ end
+ end
+ if obj.fieldB == 1 then
+ obj.yoff = bobOffset(obj.fieldC)
+ obj.fieldC = obj.fieldC + 1
+ end
+ end
+ updateFrameScript(obj)
+ end
+end
+
+function YellowIntro:drawObjects()
+ if not self.atlas2 then return end
+ for _, obj in ipairs(self.objects) do
+ local frameId = FRAMESETS[obj.frameset][obj.step][1]
+ local frame = FRAMES[frameId]
+ if frame then
+ local base, list = frame[1], frame[2]
+ for _, entry in ipairs(list) do
+ local dy, dx, delta, flip = entry[1], entry[2], entry[3], entry[4]
+ -- OAM position: screen = (X + dx - 8, Y + dy - 16)
+ local px = (obj.x + obj.xoff + dx - 8) % 256
+ local py = (obj.y + obj.yoff + dy - 16) % 256
+ if px < 160 and py < 144 then
+ local quad = self:quadFor(self.atlas2, base + delta)
+ if flip then
+ love.graphics.draw(self.atlas2, quad, px + 8, py, 0, -1, 1)
+ else
+ love.graphics.draw(self.atlas2, quad, px, py)
+ end
+ end
+ end
+ end
+ end
+end
+
+-- ------- scenes -------------------------------------------------------
+
+-- setup scenes run once and advance immediately; wait scenes count their
+-- timer down (YellowIntro_CheckFrameTimerDecrement: N running frames,
+-- expiry actions on frame N+1)
+function YellowIntro:startScene(scene)
+ self.scene = scene
+ local t = self
+ if scene == 0 then
+ -- running pika 1 over the boot letterbox
+ t.palName = "MEWMON"
+ t.scx = 0
+ t:bgLetterbox()
+ t:spawn(1, 0x58, 0x58)
+ t.timer = 130
+ t.scene = 1
+ elseif scene == 2 then
+ -- pikachu kick: 6x6 atlas2 block parked at BG col 20 row 6 (scrolled
+ -- in by scene 3) + 8 speed bars
+ t:bgFill(0x00)
+ local block = {}
+ for r = 0, 5 do
+ local line = {}
+ for c = 0, 5 do line[c + 1] = 0x90 + r * 0x10 + c end
+ block[r + 1] = line
+ end
+ t:bgBlit(20, 6, block)
+ for _, bar in ipairs(SPEED_BARS) do
+ local obj = t:spawn(8, bar[1], bar[2])
+ obj.fieldB = bar[3]
+ end
+ t.palName = "PIKACHUS_BEACH"
+ t.timer = 128
+ t.scene = 3
+ elseif scene == 4 then
+ -- running pika 2
+ t:clearObjects()
+ t.scx = 0
+ t:bgLetterbox()
+ t:spawn(2, 0x58, 0x58)
+ t.palName = "MEWMON"
+ t.timer = 128
+ t.scene = 5
+ elseif scene == 6 then
+ -- surfing pika over the wavy sea (per-scanline SCY sine)
+ t.scx = 0
+ t.wave = {}
+ for i = 0, 255 do t.wave[i] = WAVE[i % 32 + 1] end
+ t:bgFill(0x10)
+ for y = 0, 2 do
+ for x = 0, 31 do t.bg[y][x] = 0x00 end
+ end
+ for x = 0, 31 do t.bg[3][x] = x % 2 == 0 and 0x20 or 0x21 end
+ t:spawn(5, 0xF8, 0x40)
+ t.palName = "PIKACHUS_BEACH"
+ t.bgDirty = true
+ t.timer = 88
+ t.scene = 7
+ elseif scene == 8 then
+ -- running pika 3
+ t:clearObjects()
+ t.wave = nil
+ t.scx = 0
+ t:bgLetterbox()
+ t:spawn(3, 0x58, 0x58)
+ t.palName = "MEWMON"
+ t.timer = 128
+ t.scene = 9
+ elseif scene == 10 then
+ -- flying pika over clouds + badge + mark
+ t:clearObjects()
+ t.scx = 0
+ t:bgFill(0x00)
+ for y = 0, 7 do
+ for x = 0, 31 do t.bg[y][x] = 0x02 end
+ end
+ t:bgBlit(0, 8, SKY_MAP)
+ t:bgBlit(12, 4, BADGE_MAP)
+ t:bgBlit(3, 7, MARK_MAP)
+ t:spawn(6, 0x58, 0x98)
+ t.palName = "PIKACHUS_BEACH"
+ t.timer = 128
+ t.scene = 11
+ elseif scene == 12 then
+ -- pika close-up: 12x8 atlas1 paste at BG (5,6) + fixups
+ t:clearObjects()
+ t.scx = 0
+ t:bgLetterbox()
+ local paste = {}
+ for r = 0, 7 do
+ local line = {}
+ for c = 0, 11 do line[c + 1] = 0x04 + r * 0x10 + c end
+ paste[r + 1] = line
+ end
+ t:bgBlit(5, 6, paste)
+ t.bg[6][4] = 0x03
+ t.bg[7][4] = 0x74
+ t.bg[13][5] = 0x00
+ t:spawn(9, 0x58, 0x60)
+ t.palName = "MEWMON"
+ t.timer = 128
+ t.scene = 13
+ elseif scene == 14 then
+ -- thunderbolt strobe; timer reused as the sequence index
+ t.seqIndex = 0
+ t.scene = 14
+ elseif scene == 15 then
+ t.timer = 40
+ t.scene = 15
+ elseif scene == 16 then
+ t.seqIndex = 0
+ t.scene = 16
+ elseif scene == 17 then
+ t.timer = 64
+ t.scene = 17
+ end
+end
+
+function YellowIntro:enter()
+ if self.pre then return end -- pre-roll first; beginScenes takes over
+ self:beginScenes()
+end
+
+-- InitYellowIntroGFXAndMusic: the movie's own music starts with scene 0
+function YellowIntro:beginScenes()
+ local data = self.game.data
+ local songs = data.audio and data.audio.songs
+ local song = songs and (songs.Music_YellowIntro and "Music_YellowIntro"
+ or songs.Music_IntroBattle and "Music_IntroBattle")
+ if song then pcall(Music.play, data, song, false) end
+ self:startScene(0)
+end
+
+function YellowIntro:finish()
+ if self.finished then return end
+ self.finished = true
+ pcall(Music.stop)
+ self.game.stack:pop()
+ if self.onDone then self.onDone() end
+end
+
+function YellowIntro:update(dt)
+ if self.finished then return end
+ if self.pre then
+ self.pre:update(dt)
+ return
+ end
+ local input = self.game.input
+ if input:wasPressed("a") or input:wasPressed("b")
+ or input:wasPressed("start") then
+ self:finish()
+ return
+ end
+
+ local scene = self.scene
+ if scene == 1 or scene == 5 or scene == 9 then
+ if self.timer > 0 then
+ self.timer = self.timer - 1
+ else
+ self:clearObjects()
+ self:startScene(scene + 1)
+ end
+ elseif scene == 3 then
+ if self.timer > 0 then
+ self.timer = self.timer - 1
+ if self.scx ~= 0x68 then self.scx = self.scx + 4 end
+ else
+ self:clearObjects()
+ self:startScene(4)
+ end
+ elseif scene == 7 then
+ if self.timer > 0 then
+ self.timer = self.timer - 1
+ self.scx = (self.scx + 2) % 256
+ -- rotate the sine phase 1 scanline per frame
+ local first = self.wave[0]
+ for i = 0, 254 do self.wave[i] = self.wave[i + 1] end
+ self.wave[255] = first
+ else
+ self:clearObjects()
+ self:startScene(8)
+ end
+ elseif scene == 11 then
+ if self.timer > 0 then
+ -- cloud tiles swap every 8 frames (YellowIntroScene11)
+ if self.timer % 8 == 0 then
+ local frame = math.floor(self.timer / 8) % 2
+ if frame ~= self.cloudFrame then
+ self.cloudFrame = frame
+ self.bgDirty = true
+ end
+ end
+ self.timer = self.timer - 1
+ else
+ self:clearObjects()
+ self:startScene(12)
+ end
+ elseif scene == 13 then
+ if self.timer > 0 then
+ self.timer = self.timer - 1
+ else
+ -- spawn the thunderbolt over the close-up (object $A stays with $9)
+ self:spawn(10, 0x58, 0x68)
+ self:startScene(14)
+ end
+ elseif scene == 14 then
+ self.seqIndex = self.seqIndex + 1
+ local v = STROBE_SEQ[self.seqIndex]
+ if v then
+ self.bgp = v
+ else
+ -- .expired: everything despawns, letterbox returns, logo/face
+ -- object $7 appears for the strobe scene
+ self:clearObjects()
+ self:bgLetterbox()
+ self.bgp = 0xE4
+ self:spawn(7, 0x58, 0x58)
+ self:startScene(15)
+ end
+ elseif scene == 15 then
+ if self.timer > 0 then
+ if self.timer % 4 == 0 then
+ -- rBGP ^= $03: flips how the two lightest shades display
+ self.bgp = self.bgp == 0xE4 and 0xE7 or 0xE4
+ end
+ self.timer = self.timer - 1
+ else
+ self.bgp = 0xE4
+ self:startScene(16)
+ end
+ elseif scene == 16 then
+ self.seqIndex = self.seqIndex + 1
+ local v = FADE_SEQ[self.seqIndex]
+ if v then
+ self.bgp = v
+ else
+ self:startScene(17)
+ end
+ elseif scene == 17 then
+ if self.timer > 0 then
+ self.timer = self.timer - 1
+ else
+ self:finish()
+ return
+ end
+ end
+
+ self:updateObjects()
+ if self.bgDirty then self:rebuildBgCanvas() end
+end
+
+function YellowIntro:draw()
+ if self.pre then
+ self.pre:draw()
+ return
+ end
+ love.graphics.setColor(1, 1, 1, 1)
+ love.graphics.rectangle("fill", 0, 0, 160, 144)
+ if self.bgCanvas then
+ if self.wave then
+ -- per-scanline SCY override, LY $10-$7F only (scene 7's VBlank
+ -- copy covers just that band; the rest render unshifted). Each
+ -- strip wraps horizontally like the BG map: SCX climbs past 96
+ -- during the scene and a single quad would clamp at the canvas
+ -- edge and smear the right of the screen.
+ local cw, ch = self.bgCanvas:getDimensions()
+ local sx = self.scx % 256
+ local w1 = math.min(160, 256 - sx)
+ for ly = 0, 143 do
+ local dy = (ly >= 16 and ly < 128) and self.wave[ly] or 0
+ local sy = (ly + dy) % 256
+ love.graphics.draw(self.bgCanvas,
+ love.graphics.newQuad(sx, sy, w1, 1, cw, ch), 0, ly)
+ if w1 < 160 then
+ love.graphics.draw(self.bgCanvas,
+ love.graphics.newQuad(0, sy, 160 - w1, 1, cw, ch), w1, ly)
+ end
+ end
+ else
+ local cw, ch = self.bgCanvas:getDimensions()
+ local sx = self.scx % 256
+ love.graphics.draw(self.bgCanvas,
+ love.graphics.newQuad(sx, 0, math.min(160, 256 - sx), 144, cw, ch),
+ 0, 0)
+ if sx > 96 then
+ -- horizontal wrap (scene 3 scrolls the kick block in from col 20)
+ love.graphics.draw(self.bgCanvas,
+ love.graphics.newQuad(0, 0, 160 - (256 - sx), 144, cw, ch),
+ 256 - sx, 0)
+ end
+ end
+ end
+ self:drawObjects()
+ love.graphics.setColor(1, 1, 1, 1)
+end
+
+return YellowIntro
diff --git a/src/world/Collision.lua b/src/world/Collision.lua
index a61458c2..69306c57 100644
--- a/src/world/Collision.lua
+++ b/src/world/Collision.lua
@@ -15,9 +15,11 @@ end
-- entities: array of anything with cellX/cellY (and optional targetX/targetY
-- while mid-step, so nobody walks into a cell being entered).
+-- e.passable entities never block (Yellow's companion Pikachu: the player
+-- walks straight through and it re-trails, pikachu_follow.asm).
function Collision.occupied(entities, cx, cy, ignore)
for _, e in ipairs(entities) do
- if e ~= ignore then
+ if e ~= ignore and not e.passable then
if (e.cellX == cx and e.cellY == cy) or
(e.targetX == cx and e.targetY == cy) then
return e
diff --git a/src/world/NPC.lua b/src/world/NPC.lua
index 98fd54a2..8adaf1f0 100644
--- a/src/world/NPC.lua
+++ b/src/world/NPC.lua
@@ -52,13 +52,24 @@ function NPC:facePlayer(player)
end
function NPC:update(map, entities)
+ -- self.stepFrames overrides the shared 16-frame walk for an object whose
+ -- step has to stay in phase with something else: Yellow's follower
+ -- Pikachu takes the player's own step length, halved while it is more
+ -- than a cell behind (FastPikachuFollow, engine/pikachu/
+ -- pikachu_follow.asm). self.hopStep is the same file's $5-$8 hop
+ -- command: two cells of travel inside one step's frames
+ -- (DoubleAddPikachuStepVectorToScreenPixelCoords), which is why the
+ -- pixel span doubles while the frame count does not. Nothing else sets
+ -- either field, so every other object keeps the constant (#410, #409).
+ local stepLen = self.stepFrames or STEP_FRAMES
+ local span = self.hopStep and 2 or 1
if self.moving then
self.progress = self.progress + 1
-- NPC_CHANGE_FACING: animate the walk cycle in place, no translation
-- (movement.asm ChangeFacingDirection zeroes the delta); px/py stay
-- pinned to the current cell while walkPhase() cycles.
if self.marching then
- if self.progress >= STEP_FRAMES then
+ if self.progress >= stepLen then
self.progress = 0
self.moving = false
self.marching = false
@@ -67,13 +78,18 @@ function NPC:update(map, entities)
return
end
local d = Collision.DELTA[self.facing]
- self.px = self.cellX * 16 + d[1] * self.progress
- self.py = self.cellY * 16 + d[2] * self.progress
- if self.progress >= STEP_FRAMES then
+ -- 1px per frame at the default length; a shortened step scales instead,
+ -- so the cell still lands on a 16px boundary (Player:update does the
+ -- same for the bicycle)
+ local moved = math.floor(self.progress * 16 * span / stepLen)
+ self.px = self.cellX * 16 + d[1] * moved
+ self.py = self.cellY * 16 + d[2] * moved
+ if self.progress >= stepLen then
self.cellX, self.cellY = self.targetX, self.targetY
self.targetX, self.targetY = nil, nil
self.px, self.py = self.cellX * 16, self.cellY * 16
self.moving = false
+ self.hopStep = nil
self.stepFlip = not self.stepFlip
end
return
diff --git a/src/world/OverworldController.lua b/src/world/OverworldController.lua
index 8d854abe..fcacea3b 100644
--- a/src/world/OverworldController.lua
+++ b/src/world/OverworldController.lua
@@ -343,6 +343,9 @@ function OverworldState:setMap(mapId, x, y, facing, opts)
self.pendingSeamMusic = nil
self.entities = { self.player }
for _, n in ipairs(self.npcs) do table.insert(self.entities, n) end
+ -- Yellow's companion Pikachu trails the player (never in
+ -- self.entities: it does not block movement, pikachu_follow.asm)
+ require("src.world.PikachuFollower").onMapEntered(Game, self)
-- opts.keepMusic: the Oak-escort warp keeps MUSIC_MEET_PROF_OAK
-- playing into the lab (BIT_NO_MAP_MUSIC in wStatusFlags7);
@@ -792,6 +795,12 @@ function OverworldState:update(dt)
if ca.onDone then ca.onDone() end
end
end
+ -- Yellow's companion hopping up onto the Poke Center counter owns the
+ -- world for its arc, the same way the heal machine below does (#417)
+ if self.pikaHop then
+ require("src.world.PikachuFollower").updateHop(self)
+ return
+ end
if self.healAnim then
local ha = self.healAnim
local ev = OverworldState.stepHealAnim(ha)
@@ -870,6 +879,7 @@ function OverworldState:update(dt)
for _, npc in ipairs(self.npcs) do
npc:update(self.map, self.entities)
end
+ require("src.world.PikachuFollower").update(Game, self)
for _, g in ipairs(self.ghosts) do
g.npc:update(g.map, g.peers)
@@ -1493,7 +1503,17 @@ function OverworldState:interact()
npc = self:npcAtCell(fx2, fy2)
end
if npc then
- if not npc.moving then
+ if npc.pikachuFollower then
+ -- the companion answers directly (TalkToPikachu), no map text id --
+ -- and it answers mid-step too. pikachu_follow.asm walks the follower
+ -- on the player's own step clock, so the original never has it
+ -- mid-tile while the player stands; this port's follow is a frame
+ -- late (the npc loop runs before Player:update lands the step), so
+ -- the not-moving gate used to eat the A press in the frames right
+ -- after landing -- exactly when you turn round to face it (#407).
+ -- talk() lands the follower on its cell first.
+ require("src.world.PikachuFollower").talk(Game, self, npc)
+ elseif not npc.moving then
self:talkTo(npc)
end
interacted(self, fx, fy, "npc", npc)
@@ -2431,7 +2451,7 @@ end
-- Prof. Oak's dex rating service (engine/events/pokedex_rating.asm):
-- the completion line with seen AND owned counts, then the per-decade
-- rating text.
-function OverworldState:dexRating()
+function OverworldState:dexRating(onDone)
require("src.core.Sound").play(Game.data, "Pokedex_Rating")
local seen, owned = 0, 0
for _ in pairs(Game.save.pokedex.seen or {}) do seen = seen + 1 end
@@ -2449,7 +2469,7 @@ function OverworldState:dexRating()
completion = completion
:gsub("{NUM:hDexRatingNumMonsSeen[^}]*}", tostring(seen))
:gsub("{NUM:hDexRatingNumMonsOwned[^}]*}", tostring(owned))
- Game.stack:push(TextBox.new(Game, completion .. "\f" .. rating))
+ Game.stack:push(TextBox.new(Game, completion .. "\f" .. rating, onDone))
end
-- AnimateHealingMachine (engine/overworld/healing_machine.asm): balls
@@ -2500,41 +2520,56 @@ function OverworldState:nurseHeal(onDone, npc)
hello = hello .. "\f"
.. (t._ShallWeHealYourPokemonText or Strings("Shall we heal your\nPOKéMON?"))
end
+ -- Yellow's companion has its own beat threaded through this sequence
+ local Follower = require("src.world.PikachuFollower")
Game.stack:push(TextBox.new(Game, hello, nil, { choice = function(yes)
if not yes then
Game.stack:push(TextBox.new(Game, bye, onDone))
return
end
local need = t._NeedYourPokemonText or Strings("OK. We'll need\nyour POKéMON.")
- Game.stack:push(TextBox.new(Game, need, function()
- -- the nurse turns to the machine, the map music stops, and the
- -- party heals before the machine runs (predef HealParty)
- if npc then npc.facing = "left" end
- require("src.core.Music").stop()
- local Pokemon = require("src.pokemon.Pokemon")
- for _, mon in ipairs(Game.save.party) do
- Pokemon.heal(mon)
- end
- Game.save.lastHeal = { -- SetLastBlackoutMap
- map = self.map.id, x = self.player.cellX, y = self.player.cellY,
- -- the town door of this interior, for LAST_MAP exits after a
- -- blackout/ESCAPE ROPE warp here
- outdoor = self.lastOutdoor
- and { id = self.lastOutdoor.id, x = self.lastOutdoor.x, y = self.lastOutdoor.y }
- or nil,
- }
- self.healAnim = { balls = #Game.save.party, lit = 0, timer = 0,
- visible = true,
- -- map anchor: the player's cell when healing
- -- began (the GB's fixed screen coords assume it
- -- BG-aligned at (64,64))
- px = self.player.cellX * 16,
- py = self.player.cellY * 16 }
- self.healAnim.onDone = function()
- if npc then npc:facePlayer(self.player) end
- self:finishNurseHeal(bye, onDone)
- end
- end))
+ -- accepting the heal sends the companion up onto the counter to Nurse
+ -- Joy first: pokecenter.asm runs `callfar PikachuWalksToNurseJoy`
+ -- between SetLastBlackoutMap and NeedYourPokemonText, and the hop has
+ -- to finish before the text box goes up because only the top state
+ -- updates. No follower (or not Yellow) calls straight through (#417).
+ Follower.hopToCounter(self, function()
+ Game.stack:push(TextBox.new(Game, need, function()
+ -- the nurse turns to the machine, the map music stops, and the
+ -- party heals before the machine runs (predef HealParty)
+ if npc then npc.facing = "left" end
+ -- DisablePikachuOverworldSpriteDrawing: Pikachu goes behind the
+ -- counter with the party for the machine animation
+ Follower.setVisible(self, false)
+ require("src.core.Music").stop()
+ local Pokemon = require("src.pokemon.Pokemon")
+ for _, mon in ipairs(Game.save.party) do
+ Pokemon.heal(mon)
+ end
+ Game.save.lastHeal = { -- SetLastBlackoutMap
+ map = self.map.id, x = self.player.cellX, y = self.player.cellY,
+ -- the town door of this interior, for LAST_MAP exits after a
+ -- blackout/ESCAPE ROPE warp here
+ outdoor = self.lastOutdoor
+ and { id = self.lastOutdoor.id, x = self.lastOutdoor.x, y = self.lastOutdoor.y }
+ or nil,
+ }
+ self.healAnim = { balls = #Game.save.party, lit = 0, timer = 0,
+ visible = true,
+ -- map anchor: the player's cell when healing
+ -- began (the GB's fixed screen coords assume it
+ -- BG-aligned at (64,64))
+ px = self.player.cellX * 16,
+ py = self.player.cellY * 16 }
+ self.healAnim.onDone = function()
+ -- EnablePikachuOverworldSpriteDrawing, before the fighting-fit
+ -- line: it comes back on the counter facing the player
+ Follower.setVisible(self, true)
+ if npc then npc:facePlayer(self.player) end
+ self:finishNurseHeal(bye, onDone)
+ end
+ end))
+ end)
end }))
end
@@ -2874,6 +2909,9 @@ function OverworldState:applyFieldPoison()
mon.hp = 0
mon.status = nil -- the original clears status on the faint
table.insert(fainted, mon)
+ -- callfar_ModifyPikachuHappiness PIKAHAPPY_PSNFNT (poison.asm)
+ require("src.world.PikachuFollower")
+ .modifyHappiness(save, "PSNFNT", mon)
end
end
end
@@ -2942,6 +2980,8 @@ end
function OverworldState:onStepComplete()
local p = self.player
self.todSteps = (self.todSteps or 0) + 1
+ -- UpdatePikachuHappinessAndMood rides the step counter (poison.asm)
+ require("src.world.PikachuFollower").onStep(Game.save)
-- re-evaluate day/night so a step-based clock can fire world.tod_changed;
-- paletteNameFor reads self.tod on the next paint
if Runtime.wantsHook("world.tod") then
@@ -4032,6 +4072,9 @@ function OverworldState:drawWorld()
-- the "!" bubble above a trainer who spotted the player
local function fxEmote()
if not (self.emote and self.emote.npc) then return end
+ -- bubble = false is a silent hold (a Pikachu emotion that plays a
+ -- cry with no bubble still pauses the world for its beat)
+ if self.emote.bubble == false then return end
local npc = self.emote.npc
local ex = npc.px - cam.x + 4
local ey = npc.py - cam.y - 14
@@ -4393,6 +4436,30 @@ end
-- screen-space overlays: drawn to the UI canvas at normal scale
function OverworldState:drawUI()
+ -- TalkToPikachu's picture box (engine/pikachu/pikachu_pic_animation.asm
+ -- PlacePikapicTextBoxBorder: TextBoxBorder at (6,5) with b,c = 5,5, so a
+ -- 7x7 box holding the 5x5 pic at (7,6) -- PikaAnimTilemap_1). The
+ -- per-emotion frame gfx (gfx/pikachu/unknown_*) are not extracted, so
+ -- the front pic holds for the whole beat while the cry and any emote
+ -- bubble play over the world below (#407).
+ if self.emote and self.emote.pikaPic then
+ require("src.render.Font").drawBox(6, 5, 7, 7)
+ -- one image per path, cached: this draws every frame of the hold, and
+ -- a mod skin can move the path between talks
+ if self.pikaPicPath ~= self.emote.pikaPic then
+ local ok, loaded = pcall(love.graphics.newImage, self.emote.pikaPic)
+ self.pikaPicImg = ok and loaded or nil
+ self.pikaPicPath = self.emote.pikaPic
+ end
+ local img = self.pikaPicImg
+ if img then
+ love.graphics.setColor(1, 1, 1, 1)
+ local w, h = img:getDimensions()
+ love.graphics.draw(img, math.floor(56 + (40 - w) / 2),
+ math.floor(48 + (40 - h) / 2))
+ end
+ end
+
-- poison step flicker (ChangeBGPalColor0_4Frames: dark for two
-- 4-frame pulses)
if self.poisonFlash and self.poisonFlash > 0 then
diff --git a/src/world/PikachuFollower.lua b/src/world/PikachuFollower.lua
new file mode 100644
index 00000000..79f7bf88
--- /dev/null
+++ b/src/world/PikachuFollower.lua
@@ -0,0 +1,678 @@
+-- Yellow's overworld companion Pikachu (pokeyellow engine/pikachu/
+-- pikachu_follow.asm ShouldPikachuSpawn / SpawnPikachu_, plus the
+-- talk-to-it mood beat of engine/pikachu/pikachu_emotions.asm
+-- TalkToPikachu). The follower is an NPC-shaped entity that lives in
+-- ow.npcs (so the standard update/draw walk cycle runs) but never in
+-- ow.entities -- like the original it does not block the player: walk
+-- onto its cell and it simply trails to the cell you vacated.
+--
+-- Happiness rides in save.pikachuHappiness (wPikachuHappiness, seeded 90
+-- by init_player_data.asm) and mood in save.pikachuMood (wPikachuMood,
+-- neutral 128). modifyHappiness below is the full ModifyPikachuHappiness
+-- port (engine/events/pikachu_happiness.asm): the HappinessChangeTable
+-- delta picked by the current happiness hundred-band, then the
+-- PikachuMoods byte nudging the mood; onStep is poison.asm's
+-- UpdatePikachuHappinessAndMood (256-step coin-flip WALKING bump, mood
+-- converging by 1 per step toward 128).
+
+local Collision = require("src.world.Collision")
+local GameVersion = require("src.core.GameVersion")
+
+local PikachuFollower = {}
+
+local INDEX = 99 -- synthetic object index, clear of any map's real objects
+
+local OPPOSITE = { up = "down", down = "up", left = "right", right = "left" }
+
+-- wPikachuHappiness boot value (engine/movie/oak_speech/
+-- init_player_data.asm: happiness = 90)
+local function happiness(save)
+ if save.pikachuHappiness == nil then save.pikachuHappiness = 90 end
+ return save.pikachuHappiness
+end
+
+function PikachuFollower.bumpHappiness(save, delta)
+ save.pikachuHappiness =
+ math.max(0, math.min(255, happiness(save) + delta))
+end
+
+-- HappinessChangeTable (engine/events/pikachu_happiness.asm): delta by
+-- happiness band (<100 / <200 / rest), plus the PikachuMoods target byte
+-- ($80 leaves the mood alone). Keys mirror the PIKAHAPPY_* constants.
+local HAPPINESS_CHANGES = {
+ LEVELUP = { 5, 3, 2, mood = 0x8a },
+ USEDITEM = { 5, 3, 2, mood = 0x83 },
+ USEDXITEM = { 1, 1, 0, mood = 0x80 },
+ GYMLEADER = { 3, 2, 1, mood = 0x80 },
+ USEDTMHM = { 1, 1, 0, mood = 0x94 },
+ WALKING = { 2, 1, 1, mood = 0x80 },
+ DEPOSITED = { -3, -3, -5, mood = 0x62 },
+ FAINTED = { -1, -1, -1, mood = 0x6c },
+ PSNFNT = { -5, -5, -10, mood = 0x62 },
+ CARELESSTRAINER = { -5, -5, -10, mood = 0x6c },
+ TRADE = { -10, -10, -20, mood = 0x00 },
+}
+
+-- the companion mon: a healthy (or any) party PIKACHU stands in for the
+-- original's OT-checked starter, same approximation as shouldSpawn
+function PikachuFollower.starterInParty(save, needHealthy)
+ for _, mon in ipairs(save.party or {}) do
+ if mon.species == "PIKACHU"
+ and (not needHealthy or (mon.hp or 0) > 0) then
+ return mon
+ end
+ end
+ return nil
+end
+
+-- ModifyPikachuHappiness. mon is the party mon the event applied to for
+-- the per-mon reasons (IsThisPartyMonStarterPikachu); GYMLEADER and
+-- WALKING instead require any healthy starter in the party
+-- (IsStarterPikachuAliveInOurParty).
+function PikachuFollower.modifyHappiness(save, reason, mon)
+ if not GameVersion.isYellow() then return end
+ local row = HAPPINESS_CHANGES[reason]
+ if not row then return end
+ if reason == "GYMLEADER" or reason == "WALKING" then
+ if not PikachuFollower.starterInParty(save, true) then return end
+ elseif not (mon and mon.species == "PIKACHU") then
+ return
+ end
+ local h = happiness(save)
+ local band = h < 100 and 1 or h < 200 and 2 or 3
+ save.pikachuHappiness = math.max(0, math.min(255, h + row[band]))
+ -- PikachuMoods: bytes above $80 only ever raise the mood (and defer to
+ -- a pending scripted emotion modifier), bytes below only lower it
+ local b = row.mood
+ if b ~= 0x80 then
+ local mood = save.pikachuMood or 128
+ if b > 0x80 then
+ if mood < b and not save.pikachuEmotionModifier then
+ save.pikachuMood = b
+ end
+ elseif mood > b then
+ save.pikachuMood = b
+ end
+ end
+end
+
+-- UpdatePikachuHappinessAndMood (engine/events/poison.asm): every 256th
+-- step a coin flip on the WALKING bump; every step the mood converges by
+-- 1 toward the neutral 128.
+function PikachuFollower.onStep(save)
+ if not GameVersion.isYellow() then return end
+ save.pikachuWalkSteps = ((save.pikachuWalkSteps or 0) + 1) % 256
+ local rand = love and love.math and love.math.random or math.random
+ if save.pikachuWalkSteps == 0 and rand(0, 1) == 1 then
+ PikachuFollower.modifyHappiness(save, "WALKING")
+ end
+ local mood = save.pikachuMood or 128
+ if mood < 128 then
+ save.pikachuMood = mood + 1
+ elseif mood > 128 then
+ save.pikachuMood = mood - 1
+ end
+end
+
+-- ShouldPikachuSpawn, approximated: Yellow, the lab gift happened, and a
+-- healthy Pikachu is in the party (the original checks the starter's OT
+-- identity; a traded second Pikachu standing in is accepted here).
+-- Surfing and biking hide the follower (BIT_PIKACHU_SPAWN flags).
+local function shouldSpawn(game, ow)
+ if not GameVersion.isYellow() then return false end
+ local save = game.save
+ if not (save.flags and save.flags.EVENT_GOT_STARTER) then return false end
+ if save.onBike or (ow.player and ow.player.surfing) then return false end
+ if not (game.data.sprites and game.data.sprites.SPRITE_PIKACHU) then
+ return false
+ end
+ for _, mon in ipairs(save.party or {}) do
+ if mon.species == "PIKACHU" and (mon.hp or 0) > 0 then return true end
+ end
+ return false
+end
+
+local function makeFollower(game, ow, x, y, facing)
+ local NPC = require("src.world.NPC")
+ local npc = NPC.new(game.data, ow.map.id, {
+ index = INDEX, name = "PIKACHU_FOLLOWER", sprite = "SPRITE_PIKACHU",
+ movement = "STAY", range = "NONE", x = x, y = y,
+ })
+ npc.pikachuFollower = true
+ npc.passable = true -- never blocks a step (Collision.occupied)
+ npc.facing = facing or "down"
+ -- the idle animations below pose the walk cycle with no step under it,
+ -- which NPC:walkPhase (moving-only) cannot express. An instance field
+ -- shadows the class method, so NPC:pose keeps working unchanged (#411).
+ npc.walkPhase = function(self)
+ local idle = self.idle
+ if idle and idle.phase then return idle.phase % 2 end
+ return NPC.walkPhase(self)
+ end
+ return npc
+end
+
+local function findFollower(ow)
+ for i, npc in ipairs(ow.npcs or {}) do
+ if npc.pikachuFollower then return npc, i end
+ end
+ return nil
+end
+
+local function remove(ow)
+ local npc, i = findFollower(ow)
+ if not npc then return end
+ table.remove(ow.npcs, i)
+ for j, e in ipairs(ow.entities or {}) do
+ if e == npc then table.remove(ow.entities, j) break end
+ end
+end
+
+-- spawn cell: directly behind the player's facing when that cell is
+-- walkable, else the player's own cell (it trails out on the next step)
+local function spawnCell(ow)
+ local p = ow.player
+ local dx = p.facing == "left" and 1 or p.facing == "right" and -1 or 0
+ local dy = p.facing == "up" and 1 or p.facing == "down" and -1 or 0
+ local bx, by = p.cellX + dx, p.cellY + dy
+ if ow.map:inBounds(bx, by) and ow.map:isWalkableCell(bx, by) then
+ return bx, by
+ end
+ return p.cellX, p.cellY
+end
+
+function PikachuFollower.onMapEntered(game, ow)
+ remove(ow)
+ if not shouldSpawn(game, ow) then return end
+ local x, y = spawnCell(ow)
+ local npc = makeFollower(game, ow, x, y, ow.player.facing)
+ table.insert(ow.npcs, npc)
+ -- entities is the draw list; passable keeps it out of collision
+ table.insert(ow.entities, npc)
+ ow.pikachuTrail = { x = ow.player.cellX, y = ow.player.cellY }
+end
+
+-- ---------------------------------------------------------------------
+-- Idle behavior (pikachu_follow.asm Func_fc803 and the Func_fc842 roll it
+-- hands off to). Standing still, the follower burns down a frame
+-- counter; at zero it either looks in a random direction (Random & $c,
+-- another $20 frames later) or, when the buffered follow command puts it
+-- two or more cells off the player (ComputePikachuFollowCommand's 5-8
+-- band), rolls one of four in-place animations: a bounce, the walk cycle
+-- on the spot, a two frame shuffle, or a clockwise spin. Func_fc82e
+-- drops whichever is running the moment the player takes a step. Nothing
+-- here plays a bubble or a cry -- those are TalkToPikachu's alone (#411).
+-- ---------------------------------------------------------------------
+
+local IDLE_LOOK = 0x20 -- Func_fc803's pause between random glances
+local IDLE_REST = 0x10 -- Func_fc835's pause after an animation ends
+local IDLE_FRAME = 8 -- frames per sprite frame in Func_fc8f8/92b/95d
+
+local FACINGS = { "down", "up", "left", "right" }
+-- Func_fc95d .Facings, the order the spin turns through
+local CLOCKWISE = { down = "left", left = "up", up = "right", right = "down" }
+
+-- Pointer_fc8d6, transposed to (dx, dy): the asm stores (y, x) and walks
+-- the table backwards as the $11 counter runs down, so entry N here is
+-- what counter N draws. A sway four pixels right then four left with the
+-- body bobbing up twice, netting zero displacement.
+local BOUNCE = {
+ { 0, 0 }, { -1, -2 }, { -2, -4 }, { -3, -2 }, { -4, 0 },
+ { -3, -2 }, { -2, -4 }, { -1, -2 }, { 0, 0 }, { 1, -2 },
+ { 2, -4 }, { 3, -2 }, { 4, 0 }, { 3, -2 }, { 2, -4 },
+ { 1, -2 }, { 0, 0 },
+}
+
+local function randomInt(a, b)
+ local rand = love and love.math and love.math.random or math.random
+ return rand(a, b)
+end
+
+-- back onto the cell's own pixels: while the follower stands, nothing else
+-- writes px/py, so the bounce offset has to be undone from here
+local function idleReset(npc)
+ npc.idle = nil
+ npc.px, npc.py = npc.cellX * 16, npc.cellY * 16
+end
+
+-- ComputePikachuFollowCommand: the command the idle state reads back is
+-- 1-4 while the follower sits within a cell of the player and 5-8 once it
+-- is two or more off, Y deciding whenever the rows differ. Returns the
+-- facing those 5-8 encode (Func_fc862 turns that way before it bounces),
+-- or nil for the near band, which only ever glances.
+local function strandedFacing(ow, npc)
+ local p = ow.player
+ local dy = p.cellY - npc.cellY
+ if dy ~= 0 then
+ if dy > -2 and dy < 2 then return nil end
+ return dy > 0 and "down" or "up"
+ end
+ local dx = p.cellX - npc.cellX
+ if dx > -2 and dx < 2 then return nil end
+ return dx > 0 and "right" or "left"
+end
+
+-- Func_fc842: an even roll over the four PointerTable_fc85a entries
+local function startIdleAnim(npc, facing)
+ local roll = randomInt(0, 3)
+ if roll == 0 then
+ -- Func_fc862 turns toward the player, then asm_fc87f bounces
+ npc.facing = facing or npc.facing
+ npc.idle = { kind = "bounce", frames = 0x11 }
+ elseif roll == 1 then
+ npc.idle = { kind = "walk", frames = 0x30, tick = 0, phase = 0 }
+ elseif roll == 2 then
+ npc.idle = { kind = "shuffle", frames = 0x20, tick = 0, phase = 0 }
+ else
+ npc.idle = { kind = "spin", frames = 0x20, tick = 0 }
+ end
+end
+
+local function idleTick(ow, npc)
+ -- Func_fc82e: a step in progress ends the idle state outright
+ if ow.player.moving then idleReset(npc) return end
+ local idle = npc.idle
+ if not idle then
+ idle = { kind = "wait", frames = IDLE_LOOK }
+ npc.idle = idle
+ end
+ if idle.kind == "wait" then
+ idle.frames = idle.frames - 1
+ if idle.frames > 0 then return end
+ local facing = strandedFacing(ow, npc)
+ if facing then
+ startIdleAnim(npc, facing)
+ else
+ npc.facing = FACINGS[randomInt(1, 4)]
+ idle.frames = IDLE_LOOK
+ end
+ return
+ end
+ if idle.kind == "bounce" then
+ local o = BOUNCE[idle.frames] or BOUNCE[1]
+ npc.px = npc.cellX * 16 + o[1]
+ npc.py = npc.cellY * 16 + o[2]
+ else
+ idle.tick = idle.tick + 1
+ if idle.tick >= IDLE_FRAME then
+ idle.tick = 0
+ if idle.kind == "walk" then
+ -- Func_fc8f8 runs the anim counter through all four frames; the
+ -- top bit is the mirrored foot, which is our stepFlip
+ idle.phase = (idle.phase + 1) % 4
+ npc.stepFlip = idle.phase >= 2
+ elseif idle.kind == "shuffle" then
+ idle.phase = idle.phase == 0 and 1 or 0 -- Func_fc92b's xor $1
+ else
+ npc.facing = CLOCKWISE[npc.facing] or "down"
+ end
+ end
+ end
+ idle.frames = idle.frames - 1
+ if idle.frames <= 0 then
+ -- Func_fc835: a $10 frame rest, then the idle counter again
+ idleReset(npc)
+ npc.idle = { kind = "wait", frames = IDLE_REST }
+ end
+end
+
+-- The cell ahead is a ledge the player just hopped (data/tilesets/
+-- ledge_tiles.asm, the same row match OverworldState:checkLedgeHop makes).
+-- The follower only ever retraces cells the player stood on, so a ledge
+-- tile in the trail means the player jumped it (#409).
+local function ledgeStep(game, ow, cx, cy, dir)
+ local map = ow.map
+ local d = Collision.DELTA[dir]
+ local fx, fy = cx + d[1], cy + d[2]
+ local lx, ly = cx + d[1] * 2, cy + d[2] * 2
+ if not (map:inBounds(fx, fy) and map:inBounds(lx, ly)) then return false end
+ local tileset = map.def.tileset
+ local standing = map:cellTile(cx, cy)
+ local front = map:cellTile(fx, fy)
+ for _, ledge in ipairs(game.data.field.ledges or {}) do
+ if (ledge.tileset or "OVERWORLD") == tileset
+ and ledge.facing == dir and ledge.input == dir
+ and ledge.standingTile == standing and ledge.ledgeTile == front then
+ return true
+ end
+ end
+ return false
+end
+
+-- one follow step per frame: chase the cell the player last vacated
+-- (pikachu_follow.asm keeps it one walk step behind)
+function PikachuFollower.update(game, ow)
+ if ow.pikaHop then return end -- the counter hop owns the follower (#417)
+ local npc = findFollower(ow)
+ if not npc then
+ if shouldSpawn(game, ow) then PikachuFollower.onMapEntered(game, ow) end
+ return
+ end
+ if not shouldSpawn(game, ow) then
+ remove(ow)
+ return
+ end
+ local p = ow.player
+ local trail = ow.pikachuTrail
+ if not trail then
+ trail = { x = p.cellX, y = p.cellY }
+ ow.pikachuTrail = trail
+ end
+ -- The follow command is queued the frame the player COMMITS a step, not
+ -- the frame it lands: home/overworld.asm .noCollision sets wWalkCounter
+ -- and calls Func_fcc08 (pikachu_follow.asm Func_fcc42 reads the direction
+ -- of the step just started) before AdvancePlayerSprite, so Pikachu walks
+ -- into the cell the player is vacating during that same step and rests
+ -- exactly one cell behind. Waiting for p.cellX to change put a whole
+ -- extra step between them -- the two-tile gap of issue #410. targetX/Y
+ -- is the committed destination while a step is in flight and nil when
+ -- standing, so a warp or teleport still registers here (and the far > 6
+ -- snap below still catches it).
+ local destX = p.targetX or p.cellX
+ local destY = p.targetY or p.cellY
+ if destX ~= trail.x or destY ~= trail.y then
+ npc.goalX, npc.goalY = trail.x, trail.y
+ trail.x, trail.y = destX, destY
+ end
+ -- standing still with nothing to chase is the idle state (Func_fc803);
+ -- once a step is under way NPC:update owns px/py, so only the idle
+ -- record is dropped here -- never the interpolated pixels
+ if npc.moving then npc.idle = nil return end
+ if not npc.goalX then idleTick(ow, npc) return end
+ local gx, gy = npc.goalX, npc.goalY
+ if npc.cellX == gx and npc.cellY == gy then
+ npc.goalX, npc.goalY = nil, nil
+ idleTick(ow, npc)
+ return
+ end
+ -- fell more than a screen behind (forced movement, warp math): snap
+ local far = math.abs(npc.cellX - gx) + math.abs(npc.cellY - gy)
+ if far > 6 then
+ npc.cellX, npc.cellY = gx, gy
+ npc.px, npc.py = gx * 16, gy * 16
+ npc.goalX, npc.goalY = nil, nil
+ npc.idle = nil -- the snap already rewrote px/py
+ return
+ end
+ idleReset(npc) -- a real step overrides whatever the idle pose was
+ local dir
+ if npc.cellX < gx then dir = "right"
+ elseif npc.cellX > gx then dir = "left"
+ elseif npc.cellY < gy then dir = "down"
+ else dir = "up" end
+ npc.facing = dir
+ npc.targetX = npc.cellX + (dir == "right" and 1 or dir == "left" and -1 or 0)
+ npc.targetY = npc.cellY + (dir == "down" and 1 or dir == "up" and -1 or 0)
+ -- the cell ahead is the ledge the player hopped: clear both cells in one
+ -- step instead of stopping on the ledge (#409). pikachu_follow.asm
+ -- Func_fcc08 appends the $5-$8 hop commands while BIT_LEDGE_OR_FISHING
+ -- is set, and Func_fca0a runs them as two AddPikachuStepVector cells over
+ -- one normal step's frames -- no arc and no shadow, the hop command only
+ -- doubles the step vector (NPC:update's hopStep span).
+ if ledgeStep(game, ow, npc.cellX, npc.cellY, dir) then
+ local d = Collision.DELTA[dir]
+ npc.targetX, npc.targetY = npc.cellX + d[1] * 2, npc.cellY + d[2] * 2
+ npc.goalX, npc.goalY = npc.targetX, npc.targetY
+ npc.hopStep = true
+ end
+ -- walk at the player's own step length (the bicycle is moot: shouldSpawn
+ -- hides the follower on a bike, ShouldPikachuSpawn's wWalkBikeSurfState
+ -- check), and halve it while more than one cell behind -- that is
+ -- FastPikachuFollow, which pikachu_follow.asm picks whenever two or more
+ -- steps are queued (AreThereAtLeastTwoStepsInPikachuFollowCommandBuffer:
+ -- walk counter $4 instead of NormalPikachuFollow's $8).
+ local stepLen = p.stepFramesCur or p.stepFrames or 16
+ if far > 1 then stepLen = math.max(1, math.floor(stepLen / 2)) end
+ npc.stepFrames = stepLen
+ npc.moving = true
+ npc.progress = 0
+ -- this frame's npc:update loop already ran (OverworldState:update walks
+ -- self.npcs, then calls here), so burn the step's first frame now.
+ -- Without it the step costs a frame more than the player's and Pikachu
+ -- trails a pixel further every tile.
+ npc:update(ow.map, ow.entities)
+end
+
+-- ---------------------------------------------------------------------
+-- TalkToPikachu (engine/pikachu/pikachu_emotions.asm + data/pikachu/
+-- pikachu_emotions.asm): pick a scripted emotion, then play its bubble
+-- and voiced PCM clip, and raise the framed Pikachu picture the original
+-- puts over the map (pikaemotion_pikapic -> pikachu_pic_animation.asm
+-- PlacePikapicTextBoxBorder), drawn by OverworldController:drawUI. The
+-- per-emotion animation frames (gfx/pikachu/unknown_*) are not extracted,
+-- so the front pic stands in for all twenty of them (#407).
+-- ---------------------------------------------------------------------
+
+-- PikachuEmotionTable, reduced to each entry's bubble + pikaemotion_pcm
+-- clip (bubble names are the *_BUBBLE constants; nil cry = silent).
+-- turnAway is pikaemotion_9 (face away from the player, emotion 30).
+local EMOTIONS = {
+ [1] = {},
+ [2] = { bubble = "SMILE_BUBBLE", cry = 35 },
+ [3] = { cry = 40 },
+ [4] = { cry = 29 },
+ [5] = { cry = 31 },
+ [6] = { bubble = "SKULL_BUBBLE" },
+ [7] = { cry = 1 },
+ [8] = { cry = 39 },
+ [9] = { bubble = "SKULL_BUBBLE", cry = 6 },
+ [10] = { bubble = "HEART_BUBBLE", cry = 5 },
+ [11] = { bubble = "ZZZ_BUBBLE", cry = 37 },
+ [12] = {},
+ [13] = {},
+ [14] = { bubble = "BOLT_BUBBLE", cry = 10 },
+ [15] = { cry = 34 },
+ [16] = { cry = 33 },
+ [17] = { cry = 13 },
+ [18] = {},
+ [19] = { bubble = "HEART_BUBBLE", cry = 33 },
+ [20] = { bubble = "HEART_BUBBLE", cry = 5 },
+ [21] = { bubble = "FISH_BUBBLE" },
+ [22] = { cry = 4 },
+ [23] = { cry = 19 },
+ [24] = { bubble = "EXCLAMATION_BUBBLE" },
+ [25] = { bubble = "BOLT_BUBBLE", cry = 35 },
+ [26] = { bubble = "ZZZ_BUBBLE", cry = 37 },
+ [27] = { cry = 9 },
+ [28] = { cry = 15 },
+ [29] = { cry = 5 },
+ [30] = { bubble = "HEART_BUBBLE", cry = 5, turnAway = true },
+ [31] = { cry = 19 },
+ [32] = { cry = 26 },
+}
+
+-- GetPikaPicAnimationScriptIndex (engine/pikachu/pikachu_pic_animation
+-- .asm): mood picks the column (PikachuMoodLookupTable), happiness the
+-- row (PikaPicAnimationScriptPointerLookupTable); the cell is the
+-- emotion index.
+local MOOD_THRESHOLDS = { 40, 127, 128, 210, 255 }
+local MOOD_MATRIX = {
+ { limit = 50, 14, 14, 6, 13, 13 },
+ { limit = 100, 9, 9, 5, 12, 12 },
+ { limit = 130, 3, 3, 1, 8, 8 },
+ { limit = 160, 3, 3, 4, 15, 15 },
+ { limit = 200, 17, 17, 7, 2, 2 },
+ { limit = 250, 17, 17, 16, 10, 10 },
+ { limit = 255, 17, 17, 19, 20, 20 },
+}
+
+-- wPikachuEmotionModifier values 1-5 (MapSpecificPikachuExpression
+-- .Emotions): scripted one-shots -- 21 is the fishing-rod reaction
+local MODIFIER_EMOTIONS = { 18, 21, 23, 24, 25 }
+
+local function moodEmotion(save)
+ local mood = save.pikachuMood or 128
+ local column = 5
+ for i, threshold in ipairs(MOOD_THRESHOLDS) do
+ if mood <= threshold then column = i break end
+ end
+ local h = happiness(save)
+ local row = MOOD_MATRIX[#MOOD_MATRIX]
+ for _, r in ipairs(MOOD_MATRIX) do
+ if h <= r.limit then row = r break end
+ end
+ return row[column]
+end
+
+-- MapSpecificPikachuExpression + TalkToPikachu's selection order
+local function selectEmotion(game, ow, save)
+ local mapId = ow.map.id
+ -- Fan Club / Pewter Center map beats (the Bill's-house event variant
+ -- is owned by that map's script)
+ if mapId == "POKEMON_FAN_CLUB" then return 30 end
+ if mapId == "PEWTER_POKECENTER" then return 26 end
+ local starter = PikachuFollower.starterInParty(save)
+ if starter then
+ if starter.status == "SLP" then return 11 end
+ if starter.status then return 28 end
+ end
+ if mapId:find("POKEMON_TOWER_", 1, true) == 1 then return 22 end
+ local modifier = save.pikachuEmotionModifier
+ if modifier and MODIFIER_EMOTIONS[modifier] then
+ save.pikachuEmotionModifier = nil
+ return MODIFIER_EMOTIONS[modifier]
+ end
+ return moodEmotion(save)
+end
+
+local function bubbleIndex(game, name)
+ local sheet = game.data.field and game.data.field.emotionBubbles
+ for i, b in ipairs(sheet and sheet.bubbles or {}) do
+ if b.name == name then return i end
+ end
+ return nil
+end
+
+function PikachuFollower.talk(game, ow, npc, done)
+ -- pikachu_follow.asm steps the follower on the player's own walk clock,
+ -- so it is never mid-tile while the player stands and can always be
+ -- addressed; this port's follow is a frame late, so land the step here
+ -- rather than answer from between two cells (#407). The emote hold
+ -- returns before the npc update loop, so a follower left mid-step would
+ -- freeze between cells for the whole beat.
+ if npc.moving then
+ npc.cellX, npc.cellY = npc.targetX or npc.cellX, npc.targetY or npc.cellY
+ npc.targetX, npc.targetY = nil, nil
+ npc.moving = false
+ npc.progress = 0
+ npc.hopStep = nil
+ end
+ idleReset(npc) -- the bubble anchor reads px/py, and the hold freezes it
+ npc:facePlayer(ow.player)
+ ow.player.facing = OPPOSITE[npc.facing] or ow.player.facing
+ local save = game.save
+ local emotion = selectEmotion(game, ow, save)
+ local e = EMOTIONS[emotion] or EMOTIONS[1]
+ if e.turnAway then
+ npc.facing = ow.player.facing -- pikaemotion_9: back to the player
+ end
+ local Sound = require("src.core.Sound")
+ if e.cry then
+ if not Sound.playPikaCry(game.data, e.cry) then
+ Sound.playCry(game.data, "PIKACHU")
+ end
+ end
+ -- caches built before the Yellow bubble sheet only carry the three
+ -- shared bubbles; a missing crop degrades to a silent hold
+ local bi = e.bubble and bubbleIndex(game, e.bubble)
+ -- pikaemotion_pikapic: every entry in data/pikachu/pikachu_emotions.asm
+ -- ends with one, and its box is the only thing most of them put on
+ -- screen (emotion 5, the fresh-save cell, has no bubble at all). The
+ -- 40x40 front pic is the size of PikaAnimTilemap_1's 5x5 base frame;
+ -- Sprites.path keeps a mod's replacement skin in play. The scripts'
+ -- 32-58 frame durations bracket the hold below, so it stays at 50.
+ local Sprites = require("src.pokemon.Sprites")
+ local pic = Sprites.path(game.data, "PIKACHU", "front",
+ { kind = "overworld" })
+ ow.emote = {
+ npc = npc, frames = 50, bubble = bi or false, pikaPic = pic,
+ onDone = done,
+ }
+end
+
+-- ---------------------------------------------------------------------
+-- PikachuWalksToNurseJoy (engine/pikachu/pikachu_emotions.asm, run by
+-- engine/events/pokecenter.asm once the heal is accepted): the companion
+-- looks up ($36) and hops onto the Poke Center counter. The original
+-- picks one of three movement scripts by where it stands -- below the
+-- player (.PikaMovementData1: walk up left, hop up right), left of it
+-- (.PikaMovementData2: hop up right) or right of it (.PikaMovementData3:
+-- hop up left) -- and all three land on the counter tile directly in
+-- front of the player, so the port animates that one hop. Pikachu
+-- already above the player yields zero movement bytes: no beat (#417).
+-- ---------------------------------------------------------------------
+
+local HOP_FRAMES = 32 -- the port's ledge-hop arc (Player:pose hopTotal)
+
+function PikachuFollower.hopToCounter(ow, done)
+ local npc = GameVersion.isYellow() and findFollower(ow) or nil
+ local p = ow.player
+ local cx, cy = p:facingCell()
+ -- the nurse is talked to across a counter tile (OverworldState:interact);
+ -- anything else is the .pikachu_above_player no-op path
+ if not npc or p.facing ~= "up" or not ow.map:isCounterCell(cx, cy) then
+ if done then done() end
+ return
+ end
+ npc.goalX, npc.goalY = nil, nil
+ npc.targetX, npc.targetY = nil, nil
+ npc.moving, npc.progress, npc.hopStep = false, 0, nil
+ npc.idle = nil
+ npc.facing = "up" -- $36, look up
+ ow.pikaHop = {
+ npc = npc, frames = 0, cellX = cx, cellY = cy, onDone = done,
+ fromX = npc.px, fromY = npc.py, toX = cx * 16, toY = cy * 16,
+ }
+end
+
+-- One frame of that hop. OverworldState:update holds the world for it the
+-- way it holds for the heal machine (only the top state updates, so this
+-- has to sit between the two text boxes); the arc matches Player:pose's
+-- ledge hop -- a 10px sine over 32 frames.
+function PikachuFollower.updateHop(ow)
+ local h = ow.pikaHop
+ if not h then return end
+ h.frames = h.frames + 1
+ local t = math.min(1, h.frames / HOP_FRAMES)
+ h.npc.px = h.fromX + (h.toX - h.fromX) * t
+ h.npc.py = h.fromY + (h.toY - h.fromY) * t
+ - math.floor(10 * math.sin(t * math.pi) + 0.5)
+ if h.frames < HOP_FRAMES then return end
+ h.npc.cellX, h.npc.cellY = h.cellX, h.cellY
+ h.npc.px, h.npc.py = h.toX, h.toY
+ ow.pikaHop = nil
+ -- the player has not moved, so the trail restarts under his feet and the
+ -- follower only steps back off the counter once he walks away
+ ow.pikachuTrail = { x = ow.player.cellX, y = ow.player.cellY }
+ if h.onDone then h.onDone() end
+end
+
+-- Disable/EnablePikachuOverworldSpriteDrawing around the healing machine
+-- (engine/events/pokecenter.asm): Pikachu goes behind the counter with the
+-- party and comes back standing on it, facing the player -- the respawn is
+-- wPikachuSpawnState = 5, which is .above_player in pikachu_follow.asm,
+-- followed by `lb bc, 15, 0` (sprite struct 15 is Pikachu, image index 0
+-- is facing down). ow.entities is the draw list and ow.npcs the update
+-- list, so dropping it from entities alone hides it in place (#417).
+function PikachuFollower.setVisible(ow, visible)
+ local npc = findFollower(ow)
+ if not npc then return end
+ for i, e in ipairs(ow.entities or {}) do
+ if e == npc then table.remove(ow.entities, i) break end
+ end
+ if visible then
+ npc.facing = "down"
+ table.insert(ow.entities, npc)
+ end
+end
+
+-- npc the player is facing, when it is the follower (interact hook)
+function PikachuFollower.at(ow, cx, cy)
+ local npc = findFollower(ow)
+ if npc and not npc.moving and npc.cellX == cx and npc.cellY == cy then
+ return npc
+ end
+ return nil
+end
+
+return PikachuFollower
diff --git a/src/world/Player.lua b/src/world/Player.lua
index c79c2e55..af6aeca8 100644
--- a/src/world/Player.lua
+++ b/src/world/Player.lua
@@ -4,6 +4,7 @@
local Collision = require("src.world.Collision")
local FieldDefaults = require("src.world.FieldDefaults")
+local GameVersion = require("src.core.GameVersion")
local Runtime = require("src.mods.Runtime")
local SpriteRenderer = require("src.render.SpriteRenderer")
@@ -237,17 +238,30 @@ end
function Player:draw(camX, camY)
local sprite, px, py, facing, phase, flip, hopping = self:pose()
- -- the shadow stays on the ground under the jumper: one 8x8 tile
- -- mirrored into a 2x2 block (normal/XFLIP/YFLIP/both) whose top-left
- -- is 8px below the sprite's standing top-left (LoadHoppingShadowOAM +
- -- LedgeHoppingShadowOAMBlock, engine/overworld/ledges.asm)
+ -- the shadow stays on the ground under the jumper, mirrored out of the
+ -- single 8x8 tile the ROM stores -- but the two engines lay it out
+ -- differently, and their shadow.png tiles differ to match.
+ -- RED/BLUE: a 2x2 block (normal/XFLIP/YFLIP/both) whose top-left sits
+ -- 8px below the sprite's standing top-left (LoadHoppingShadowOAM +
+ -- LedgeHoppingShadowOAMBlock at "lb bc, $54, $48",
+ -- engine/overworld/ledges.asm); its tile is blank above the bottom
+ -- four rows, so the four copies make one 16x16 ellipse.
+ -- YELLOW: a single 16x8 row 4px lower. Its LoadHoppingShadowOAM
+ -- copies only two entries (LedgeHoppingShadowOAM: dbsprite 9,11 and
+ -- dbsprite 10,11 OAM_XFLIP, raw OAM y=88 against RED's $54=84) and
+ -- parks sprites 38/39 offscreen at y=$a0, because its tile is a
+ -- full-height half-ellipse that already fills the row. Mirroring
+ -- that tile downward stacked a second blob under the first (#408).
if hopping and self.shadowImg then
+ local yellow = GameVersion.isYellow()
local sx = math.floor(self.px - camX)
- local sy = math.floor(self.py - camY) - 4 + 8
+ local sy = math.floor(self.py - camY) - 4 + 8 + (yellow and 4 or 0)
love.graphics.draw(self.shadowImg, sx, sy)
love.graphics.draw(self.shadowImg, sx + 16, sy, 0, -1, 1)
- love.graphics.draw(self.shadowImg, sx, sy + 16, 0, 1, -1)
- love.graphics.draw(self.shadowImg, sx + 16, sy + 16, 0, -1, -1)
+ if not yellow then
+ love.graphics.draw(self.shadowImg, sx, sy + 16, 0, 1, -1)
+ love.graphics.draw(self.shadowImg, sx + 16, sy + 16, 0, -1, -1)
+ end
end
sprite:draw(px, py, camX, camY, facing, phase, flip)
end
diff --git a/tests/drivers/jessie_james_sites_test.lua b/tests/drivers/jessie_james_sites_test.lua
new file mode 100644
index 00000000..1fe0cf0b
--- /dev/null
+++ b/tests/drivers/jessie_james_sites_test.lua
@@ -0,0 +1,83 @@
+-- Driver: the three post-Mt-Moon Jessie & James ambushes
+-- (data/scripts/yellow_jessie_james.lua). Yellow only:
+-- POKEPORT_VERSION=yellow POKEPORT_DRIVER=tests/drivers/jessie_james_sites_test.lua love .
+-- For each site: step onto the trigger tile, A-mash through motto /
+-- challenge / battle / parting lines, then confirm the beat flag is set
+-- and both duo objects are gone.
+return function(game)
+ local U = dofile("tests/drivers/util.lua")
+ local DIR = os.getenv("SHOT_DIR") or "/tmp/shots"
+ local Pokemon = require("src.pokemon.Pokemon")
+
+ -- A-mash needs a damaging first move (a stat move stalls the mash)
+ game.save.party = {}
+ local mon = Pokemon.new(game.data, "MEWTWO", 100)
+ mon.moves = { { id = "TACKLE", pp = 35 } }
+ table.insert(game.save.party, mon)
+
+ local sites = {
+ { tag = "hideout", map = "ROCKET_HIDEOUT_B4F", tx = 24, ty = 14,
+ beat = "EVENT_BEAT_ROCKET_HIDEOUT_4_JESSIE_JAMES",
+ james = "ROCKETHIDEOUTB4F_JAMES", jessie = "ROCKETHIDEOUTB4F_JESSIE" },
+ { tag = "tower", map = "POKEMON_TOWER_7F", tx = 10, ty = 12,
+ beat = "EVENT_BEAT_POKEMONTOWER_7_JESSIE_JAMES",
+ james = "POKEMONTOWER7F_JAMES", jessie = "POKEMONTOWER7F_JESSIE" },
+ { tag = "silph", map = "SILPH_CO_11F", tx = 3, ty = 3,
+ beat = "EVENT_BEAT_SILPH_CO_11F_JESSIE_JAMES",
+ james = "SILPHCO11F_JAMES", jessie = "SILPHCO11F_JESSIE" },
+ }
+
+ local function visible(ow, name)
+ for _, n in ipairs(ow.npcs) do
+ if n.def and n.def.name == name then return true end
+ end
+ return false
+ end
+
+ for _, s in ipairs(sites) do
+ -- heal between fights and re-arm the site
+ for _, m in ipairs(game.save.party) do
+ m.hp = m.stats.hp
+ m.moves[1].pp = 35
+ end
+ game.save.flags[s.beat] = nil
+
+ -- step onto the trigger from below; fall back to above if blocked
+ U.teleport(game, s.map, s.tx, s.ty + 1, "up")
+ local ow = game.overworld
+ U.hold(game, "up", 20)
+ U.wait(10)
+ if not ow.runner:isRunning()
+ and (ow.player.cellX ~= s.tx or ow.player.cellY ~= s.ty) then
+ U.teleport(game, s.map, s.tx, s.ty - 1, "down")
+ ow = game.overworld
+ U.hold(game, "down", 20)
+ U.wait(10)
+ end
+ U.log(s.tag, "player at", ow.player.cellX, ow.player.cellY,
+ "runner:", tostring(ow.runner:isRunning()))
+ U.shot(game, DIR .. ("/jj_%s_0_trigger.png"):format(s.tag))
+
+ local settled = false
+ for i = 1, 3000 do
+ if game.stack:top() == ow and not ow.runner:isRunning()
+ and #ow.scriptMoves == 0 and game.save.flags[s.beat] then
+ settled = true
+ break
+ end
+ if i == 120 then
+ U.shot(game, DIR .. ("/jj_%s_1_scene.png"):format(s.tag))
+ end
+ U.tap(game, "a")
+ U.wait(3)
+ end
+ U.shot(game, DIR .. ("/jj_%s_2_done.png"):format(s.tag))
+ U.log(s.tag, "settled:", tostring(settled),
+ "flag:", tostring(game.save.flags[s.beat]),
+ "james visible:", tostring(visible(ow, s.james)),
+ "jessie visible:", tostring(visible(ow, s.jessie)))
+ end
+
+ U.log("DONE")
+ love.event.quit()
+end
diff --git a/tests/drivers/pikachu_follow_distance_bug410_test.lua b/tests/drivers/pikachu_follow_distance_bug410_test.lua
new file mode 100644
index 00000000..8eb7315e
--- /dev/null
+++ b/tests/drivers/pikachu_follow_distance_bug410_test.lua
@@ -0,0 +1,197 @@
+-- Yellow's follower has to trail exactly one cell behind over a long walk
+-- (#410). ROUTE_1 column x=0 is 36 cells of plain path (tile $2c: no
+-- grass, no ledge row, no object on it, per the generated ROUTE_1 blocks
+-- and pokeyellow data/maps/objects/Route1.asm), so 32 steps north measure
+-- the gap with nothing else moving. Never add POKEPORT_SPEED here: it
+-- scales the logic clock only, and the gap is a timing measurement. No
+-- POKEPORT_IDENTITY either: the Yellow cache lives in the default save dir.
+-- POKEPORT_DRIVER=tests/drivers/pikachu_follow_distance_bug410_test.lua POKEPORT_TOUCH=0 POKEPORT_VERSION=yellow love .
+return function(game)
+ local U = dofile("tests/drivers/util.lua")
+ local Pokemon = require("src.pokemon.Pokemon")
+ local PikachuFollower = require("src.world.PikachuFollower")
+
+ local MAP = "ROUTE_1"
+ local START = { x = 0, y = 34 }
+ local STEPS = 32
+
+ local function check(label, ok)
+ U.log(ok and "PASS" or "FAIL", label)
+ return ok
+ end
+
+ -- ShouldPikachuSpawn wants the lab gift and a healthy party Pikachu; the
+ -- level 100 lead plus a long REPEL is belt and braces, since the column
+ -- below carries no grass tile and cannot roll an encounter anyway
+ game.save.party = { Pokemon.new(game.data, "PIKACHU", 100) }
+ game.save.flags = game.save.flags or {}
+ game.save.flags.EVENT_GOT_STARTER = true
+ game.save.onBike = false
+ game.save.repelSteps = 9999
+ game.save.player.name = "bryan"
+
+ U.teleport(game, MAP, START.x, START.y, "up")
+ U.wait(10)
+
+ local ow = game.overworld
+ local map = ow.map
+
+ -- the run has to be walkable, grass-free and warp-free the whole way; a
+ -- later map edit degrades to the longest column that still is, rather
+ -- than walking the player into a fence for 500 frames
+ local function runLength(cx, fromY)
+ local n = 0
+ local y = fromY
+ while y >= 0 and map:isWalkableCell(cx, y) and not map:isGrassCell(cx, y)
+ and not map:warpAtCell(cx, y) do
+ n = n + 1
+ y = y - 1
+ end
+ return n
+ end
+
+ if runLength(START.x, START.y) < STEPS + 1 then
+ local best, bestX, bestY = 0, START.x, START.y
+ for cx = 0, map.widthCells - 1 do
+ for cy = map.heightCells - 1, 0, -1 do
+ local n = runLength(cx, cy)
+ if n > best then best, bestX, bestY = n, cx, cy end
+ end
+ end
+ U.log(("column %d is short (%d cells); walking column %d from y=%d (%d cells)")
+ :format(START.x, runLength(START.x, START.y), bestX, bestY, best))
+ START.x, START.y = bestX, bestY
+ STEPS = math.min(STEPS, best - 1)
+ U.teleport(game, MAP, START.x, START.y, "up")
+ U.wait(10)
+ ow = game.overworld
+ map = ow.map
+ end
+ check(("a straight %d step run exists at column %d"):format(STEPS, START.x),
+ STEPS >= 30 and runLength(START.x, START.y) >= STEPS + 1)
+
+ local function follower()
+ for _, n in ipairs(ow.npcs or {}) do
+ if n.pikachuFollower then return n end
+ end
+ return nil
+ end
+
+ check("the follower spawned on " .. MAP, follower() ~= nil)
+
+ -- The far > 6 snap teleports the follower onto its goal and hides any
+ -- drift the walk built up, so a broken run would read as a clean one.
+ -- PikachuFollower.update is looked up on the module table at every call
+ -- site, so wrapping the field here counts snaps without touching the
+ -- engine: a cell that changes across the call while the follower is not
+ -- mid-step is the snap and nothing else (a normal step lands its cell
+ -- inside NPC:update, which OverworldState runs before this).
+ local snaps, fastCommits = 0, 0
+ local realUpdate = PikachuFollower.update
+ PikachuFollower.update = function(g, o)
+ local npc = follower()
+ local bx, by, bmoving
+ if npc then bx, by, bmoving = npc.cellX, npc.cellY, npc.moving end
+ realUpdate(g, o)
+ if npc and not bmoving and not npc.moving
+ and (npc.cellX ~= bx or npc.cellY ~= by) then
+ snaps = snaps + 1
+ end
+ if npc and not bmoving and npc.moving
+ and (npc.stepFrames or 16) < (o.player.stepFramesCur or 16) then
+ fastCommits = fastCommits + 1
+ end
+ end
+
+ -- The distance sampled is the settled one: while a step is in flight the
+ -- follower's committed cell is targetX/Y, which is where it will stand
+ -- when the player's own landing frame is over. Raw cell distance is
+ -- kept alongside it so a report of 1 cannot come from reading the wrong
+ -- field; it reads 2 all the way through a held walk, because both
+ -- sprites are then mid-step, and settles to 1 the moment input stops.
+ local function gap()
+ local p = ow.player
+ local npc = follower()
+ if not npc then return -1, -1 end
+ local pxc = p.targetX or p.cellX
+ local pyc = p.targetY or p.cellY
+ local nx = npc.targetX or npc.cellX
+ local ny = npc.targetY or npc.cellY
+ return math.abs(pxc - nx) + math.abs(pyc - ny),
+ math.abs(p.cellX - npc.cellX) + math.abs(p.cellY - npc.cellY)
+ end
+
+ local series, raws = {}, {}
+ local prevX, prevY = ow.player.cellX, ow.player.cellY
+ local frames = 0
+ while #series < STEPS and frames < STEPS * 40 do
+ table.insert(game.input.pressQueue, "up")
+ game.input.state.up = true
+ frames = frames + 1
+ coroutine.yield()
+ local p = ow.player
+ if p.cellX ~= prevX or p.cellY ~= prevY then
+ prevX, prevY = p.cellX, p.cellY
+ local g, r = gap()
+ series[#series + 1] = g
+ raws[#raws + 1] = r
+ end
+ end
+ game.input.state.up = false
+ U.wait(20) -- let the last follow step land before the final reading
+
+ check(("all %d steps completed (%d recorded)"):format(STEPS, #series),
+ #series == STEPS)
+
+ local maxGap, badSteps = 0, 0
+ for _, g in ipairs(series) do
+ if g > maxGap then maxGap = g end
+ if g ~= 1 then badSteps = badSteps + 1 end
+ end
+ local function avg(from, to)
+ local sum, n = 0, 0
+ for i = from, to do
+ if series[i] then sum = sum + series[i] n = n + 1 end
+ end
+ return n > 0 and sum / n or 0
+ end
+ local head, tail = avg(1, 8), avg(#series - 7, #series)
+ local finalGap, finalRaw = gap()
+
+ local function compact(list)
+ local out, row = {}, {}
+ for i, g in ipairs(list) do
+ row[#row + 1] = (g >= 0 and g < 10) and tostring(g) or ("[" .. g .. "]")
+ if i % 40 == 0 then out[#out + 1] = table.concat(row) row = {} end
+ end
+ if #row > 0 then out[#out + 1] = table.concat(row) end
+ return out
+ end
+ for _, row in ipairs(compact(series)) do U.log("gap per step:", row) end
+ for _, row in ipairs(compact(raws)) do U.log("raw cell gap: ", row) end
+
+ check("the gap is 1 on every step", badSteps == 0 and #series > 0)
+ check(("max gap is 1 (saw %d)"):format(maxGap), maxGap == 1)
+ check(("final gap is 1 (saw %d)"):format(finalGap), finalGap == 1)
+ check(("Pikachu came to rest one cell behind (saw %d)"):format(finalRaw),
+ finalRaw == 1)
+ check(("no upward trend (first 8 avg %.2f, last 8 avg %.2f)")
+ :format(head, tail), tail <= head)
+ check(("the far > 6 snap never fired (%d)"):format(snaps), snaps == 0)
+ U.log("fast (half length) follow steps committed:", fastCommits)
+
+ PikachuFollower.update = realUpdate
+
+ local SHOT_DIR = os.getenv("SHOT_DIR") or "/tmp/shots"
+ if U.shot(game, SHOT_DIR .. "/bug410_follow_distance.png") then
+ U.log("captured", SHOT_DIR .. "/bug410_follow_distance.png")
+ end
+
+ U.log("Pikachu has just walked 32 cells up ROUTE_1 and should be standing")
+ U.log("one cell below you, close enough to touch. Walk on and it stays")
+ U.log("there; the bug left a visible cell of daylight between you.")
+
+ while true do
+ coroutine.yield()
+ end
+end
diff --git a/tests/drivers/pikachu_idle_center_bug411_bug417_test.lua b/tests/drivers/pikachu_idle_center_bug411_bug417_test.lua
new file mode 100644
index 00000000..1fae9402
--- /dev/null
+++ b/tests/drivers/pikachu_idle_center_bug411_bug417_test.lua
@@ -0,0 +1,313 @@
+-- Two Yellow companion beats you have to watch rather than assert: the idle
+-- animations Pikachu plays while you stand still (#411, pokeyellow
+-- engine/pikachu/pikachu_follow.asm Func_fc803) and its hop onto the Poke
+-- Center counter when the heal is accepted (#417, engine/pikachu/
+-- pikachu_emotions.asm PikachuWalksToNurseJoy). Do not add POKEPORT_SPEED:
+-- it scales the logic clock only while audio keeps its own real-time
+-- accumulator, which desynchronizes exactly the timing being judged.
+-- POKEPORT_VERSION=yellow POKEPORT_TOUCH=0 \
+-- POKEPORT_DRIVER=tests/drivers/pikachu_idle_center_bug411_bug417_test.lua love .
+return function(game)
+ local U = dofile("tests/drivers/util.lua")
+ local Pokemon = require("src.pokemon.Pokemon")
+ local GameVersion = require("src.core.GameVersion")
+
+ local SHOT_DIR = os.getenv("SHOT_DIR") or "/tmp/shots"
+ local shots = {}
+ local ok = true
+
+ local function check(label, pass)
+ if not pass then ok = false end
+ U.log(pass and "PASS" or "FAIL", label)
+ return pass
+ end
+
+ local function shot(name)
+ local path = SHOT_DIR .. "/" .. name .. ".png"
+ if U.shot(game, path) then
+ shots[#shots + 1] = path .. " @f" .. U.frame()
+ return true
+ end
+ return false
+ end
+
+ -- Yellow only: the follower, the counter hop and the pikapic box are all
+ -- behind GameVersion.isYellow(), so a Red boot would silently show none of
+ -- this and every look-at-it line below would be a lie.
+ if not check("running the Yellow cache", GameVersion.isYellow()) then
+ U.log("re-run with POKEPORT_VERSION=yellow; nothing else here applies.")
+ while true do coroutine.yield() end
+ end
+ check("SPRITE_PIKACHU is in the extracted sprite set",
+ game.data.sprites and game.data.sprites.SPRITE_PIKACHU ~= nil)
+
+ -- ShouldPikachuSpawn wants the lab gift flag and a healthy party Pikachu;
+ -- the second mon is here so the heal has something to visibly restore.
+ game.save.player.name = "bryan"
+ game.save.flags = game.save.flags or {}
+ game.save.flags.EVENT_GOT_STARTER = true
+ game.save.usedPokecenter = false -- BIT_USED_POKECENTER: get the full prompt
+ game.save.party = {
+ Pokemon.new(game.data, "PIKACHU", 16),
+ Pokemon.new(game.data, "PIDGEY", 12),
+ }
+ -- hurt but not poisoned: a poisoned 1 HP Pikachu faints on the walk over
+ -- and ShouldPikachuSpawn would despawn the follower mid-driver
+ for _, mon in ipairs(game.save.party) do
+ mon.hp = math.max(1, math.floor(mon.stats.hp / 3))
+ end
+
+ local function follower()
+ local ow = game.overworld
+ for _, n in ipairs(ow and ow.npcs or {}) do
+ if n.pikachuFollower then return n end
+ end
+ return nil
+ end
+
+ -- one step in dir, reporting whether the player's cell actually changed;
+ -- lets the walks below route around a map edit instead of shoving at a wall
+ local function walk(dir)
+ local ow = game.overworld
+ local x, y = ow.player.cellX, ow.player.cellY
+ U.hold(game, dir, 20)
+ U.wait(6)
+ return ow.player.cellX ~= x or ow.player.cellY ~= y
+ end
+
+ -- ------------------------------------------------------------ #411 idle
+ U.teleport(game, "PALLET_TOWN", 10, 8, "down")
+ U.wait(20)
+ check("follower spawned on the map", follower() ~= nil)
+
+ -- a couple of steps first: the follower has to be trailing a cell behind
+ -- before standing still means anything
+ local walked = 0
+ for _, dir in ipairs({ "left", "left", "down", "right" }) do
+ if walk(dir) then walked = walked + 1 end
+ if walked >= 2 then break end
+ end
+ check("player took at least two steps before standing still", walked >= 2)
+ U.wait(30)
+
+ local npc = follower()
+ local IDLE_FRAMES = 540
+ local poses, order = {}, {}
+ local kinds, kindOrder = {}, {}
+ local facings, facingOrder = {}, {}
+ local moved, sawIdleRecord = false, false
+ local idleStart = U.frame()
+ local shotFrames = {}
+
+ if npc then
+ for i = 1, IDLE_FRAMES do
+ if npc.moving then moved = true end
+ local idle = npc.idle
+ local kind = idle and idle.kind or "none"
+ if idle then sawIdleRecord = true end
+ if not kinds[kind] then
+ kinds[kind] = 0
+ kindOrder[#kindOrder + 1] = kind
+ end
+ kinds[kind] = kinds[kind] + 1
+ if not facings[npc.facing] then
+ facings[npc.facing] = true
+ facingOrder[#facingOrder + 1] = npc.facing
+ end
+ -- the pose a human can see: the countdown inside idle is deliberately
+ -- left out, since a frozen follower would still tick it down and make
+ -- "something changed" true for free
+ local pose = string.format("%s|%s|%d,%d|%s", kind, tostring(npc.facing),
+ math.floor(npc.px - npc.cellX * 16),
+ math.floor(npc.py - npc.cellY * 16),
+ tostring(npc.stepFlip))
+ if not poses[pose] then
+ poses[pose] = true
+ order[#order + 1] = pose
+ end
+ -- five stills spread across the sample, far enough apart to catch a
+ -- glance or a bounce between them
+ if i % 108 == 0 then
+ shotFrames[#shotFrames + 1] = U.frame()
+ shot(string.format("bug411_idle_%d", i / 108))
+ else
+ U.wait(1)
+ end
+ end
+ end
+
+ check("follower stayed put for the whole idle sample", npc ~= nil and not moved)
+ check("the follower's idle state exists at all", sawIdleRecord)
+ check("its visible pose changed while standing still", #order > 1)
+ U.log(("idle sample: %d frames from f%d, %d distinct poses")
+ :format(IDLE_FRAMES, idleStart, #order))
+ local kindLine = {}
+ for _, k in ipairs(kindOrder) do
+ kindLine[#kindLine + 1] = k .. "x" .. kinds[k]
+ end
+ U.log("idle kinds seen:", table.concat(kindLine, " "))
+ U.log("facings seen:", table.concat(facingOrder, " "))
+ for i = 1, math.min(#order, 8) do U.log(" pose", order[i]) end
+ U.log("idle shots at frames:", table.concat(shotFrames, " "))
+
+ -- -------------------------------------------------- #417 Poke Center hop
+ -- pokeyellow data/maps/objects/ViridianPokecenter.asm: the nurse is
+ -- object 1 at (3, 1), the counter tile is (3, 2) and the player talks to
+ -- her from (3, 3) facing up. Positions below are derived from the loaded
+ -- object rather than typed in, so a re-extract or a mod that shifts her
+ -- still lands the player at the counter.
+ local MAP = "VIRIDIAN_POKECENTER"
+ U.teleport(game, MAP, 3, 6, "up")
+ U.wait(20)
+ local ow = game.overworld
+
+ local nurse
+ for _, n in ipairs(ow.npcs or {}) do
+ local d = n.def
+ if d and (d.sprite == "SPRITE_NURSE" or (d.name or ""):find("NURSE")) then
+ nurse = n
+ break
+ end
+ end
+ check("nurse object loaded on " .. MAP, nurse ~= nil)
+ if nurse then
+ local entry = game.data:textEntry(ow.map.def.label, nurse.def.text)
+ check("her text entry is the TX_SCRIPT nurse marker",
+ entry ~= nil and not not entry.nurse)
+ end
+
+ -- stand two cells off the nurse with a counter tile between us: that is
+ -- the geometry OverworldState:interact reaches across, and the same
+ -- p.facing == "up" + isCounterCell test PikachuFollower.hopToCounter makes
+ local stand
+ if nurse then
+ local sides = {
+ { 0, 1, "up" }, { 0, -1, "down" }, { 1, 0, "left" }, { -1, 0, "right" },
+ }
+ for _, s in ipairs(sides) do
+ local counterX, counterY = nurse.cellX + s[1], nurse.cellY + s[2]
+ local sx, sy = nurse.cellX + s[1] * 2, nurse.cellY + s[2] * 2
+ if ow.map:inBounds(sx, sy) and ow.map:isWalkableCell(sx, sy)
+ and ow.map:isCounterCell(counterX, counterY)
+ and not ow:npcAtCell(sx, sy) then
+ stand = { x = sx, y = sy, facing = s[3] }
+ break
+ end
+ end
+ end
+ check("found a counter cell to talk across", stand ~= nil)
+
+ if stand then
+ -- walk there rather than teleport, so the follower trails in behind and
+ -- is standing where the hop actually starts from
+ local guard = 0
+ while (ow.player.cellY > stand.y) and guard < 8 do
+ if not walk("up") then break end
+ guard = guard + 1
+ end
+ while (ow.player.cellX < stand.x) and guard < 12 do
+ if not walk("right") then break end
+ guard = guard + 1
+ end
+ while (ow.player.cellX > stand.x) and guard < 12 do
+ if not walk("left") then break end
+ guard = guard + 1
+ end
+ while (ow.player.cellY > stand.y) and guard < 16 do
+ if not walk("up") then break end
+ guard = guard + 1
+ end
+ if ow.player.cellX ~= stand.x or ow.player.cellY ~= stand.y then
+ U.log("walk did not reach the counter, teleporting to",
+ stand.x, stand.y)
+ U.teleport(game, MAP, stand.x, stand.y, stand.facing)
+ U.wait(20)
+ ow = game.overworld
+ end
+ ow.player.facing = stand.facing
+ U.wait(10)
+ end
+
+ local fx, fy = ow.player:facingCell()
+ check("player is at the counter facing the nurse",
+ ow.map:isCounterCell(fx, fy) and ow.player.facing == "up")
+ check("follower survived the walk over", follower() ~= nil)
+ shot("bug417_at_counter")
+
+ -- talk, say YES, and mash through the whole sequence; stop the moment the
+ -- overworld is back on top so the last A cannot re-open the nurse
+ local hurt = 0
+ for _, mon in ipairs(game.save.party) do
+ if mon.hp < mon.stats.hp then hurt = hurt + 1 end
+ end
+ check("the party is hurt going in, so the heal check means something",
+ hurt == #game.save.party)
+
+ U.tap(game, "a")
+ U.wait(10)
+ local sawHop, sawMachine, hopFrames = false, false, 0
+ local shotHop, shotMachine = false, false
+ for _ = 1, 600 do
+ local cur = game.overworld
+ if cur.pikaHop then
+ sawHop = true
+ hopFrames = hopFrames + 1
+ if not shotHop and hopFrames > 16 then
+ shotHop = shot("bug417_hop")
+ end
+ end
+ if cur.healAnim then
+ sawMachine = true
+ if not shotMachine then shotMachine = shot("bug417_machine") end
+ end
+ -- the hop deliberately runs with the overworld back on top (both text
+ -- boxes have popped themselves by then), so "overworld is top" alone is
+ -- not the end of the sequence -- wait for the party to be healed and
+ -- both held animations to be over
+ local partyUp = #game.save.party > 0
+ for _, mon in ipairs(game.save.party) do
+ if mon.hp ~= mon.stats.hp then partyUp = false end
+ end
+ if partyUp and not cur.pikaHop and not cur.healAnim
+ and game.stack:top() == cur then
+ break
+ end
+ U.tap(game, "a")
+ U.wait(4)
+ end
+ U.wait(30)
+
+ check("the heal script ran back out to the overworld",
+ game.stack:top() == game.overworld)
+ check("Pikachu hopped to the counter (#417)", sawHop)
+ check("the healing machine ran", sawMachine)
+ local healed = #game.save.party > 0
+ for _, mon in ipairs(game.save.party) do
+ if mon.hp ~= mon.stats.hp or mon.status ~= nil then healed = false end
+ end
+ check("the party is actually healed", healed)
+ local pika = follower()
+ check("follower is back on screen after the heal", pika ~= nil)
+ if pika then
+ U.log(("follower rests at cell (%d, %d) facing %s")
+ :format(pika.cellX, pika.cellY, tostring(pika.facing)))
+ end
+ shot("bug417_after_heal")
+
+ U.log(ok and "ALL PASS" or "SOME CHECKS FAILED")
+ for _, s in ipairs(shots) do U.log("shot", s) end
+
+ U.log("Standing still with Pikachu right behind you, all it should do is")
+ U.log("glance around: pikachu_follow.asm only rolls the bounce/spin/shuffle")
+ U.log("animations when the follower is 2+ cells adrift, so at a normal one")
+ U.log("cell gap the facing changes ARE the whole idle behaviour. A sprite")
+ U.log("frozen one way for the whole sample is the bug. To see the livelier")
+ U.log("animations, strand it first -- hop a ledge or cut through a door so")
+ U.log("it falls behind, then stand still before it catches up.")
+ U.log("You are parked at the Viridian counter facing the nurse: press A and")
+ U.log("say YES to watch Pikachu jump up onto the counter again.")
+
+ while true do
+ coroutine.yield()
+ end
+end
diff --git a/tests/drivers/pikachu_ledge_bug408_bug409_test.lua b/tests/drivers/pikachu_ledge_bug408_bug409_test.lua
new file mode 100644
index 00000000..c4920236
--- /dev/null
+++ b/tests/drivers/pikachu_ledge_bug408_bug409_test.lua
@@ -0,0 +1,252 @@
+-- Ledge hop with the Yellow follower: one shadow under the jumper (#408)
+-- and Pikachu clearing the ledge in one motion instead of stopping on it
+-- (#409). The hop cell is searched out of the loaded map's own blocks
+-- against data.field.ledges (pokeyellow data/tilesets/ledge_tiles.asm), so
+-- a map edit moves the test instead of breaking it. Never add
+-- POKEPORT_SPEED here: it scales only the logic clock while audio keeps its
+-- own real-time accumulator, which desyncs the exact 32 frames being judged.
+-- POKEPORT_DRIVER=tests/drivers/pikachu_ledge_bug408_bug409_test.lua POKEPORT_IDENTITY=bug408 POKEPORT_TOUCH=0 POKEPORT_VERSION=yellow love .
+return function(game)
+ local U = dofile("tests/drivers/util.lua")
+ local GameVersion = require("src.core.GameVersion")
+ local Pokemon = require("src.pokemon.Pokemon")
+
+ local results = {}
+ local function check(label, ok)
+ results[#results + 1] = { label = label, ok = ok and true or false }
+ return ok
+ end
+ local function report()
+ for _, r in ipairs(results) do U.log(r.ok and "PASS" or "FAIL", r.label) end
+ end
+
+ if not GameVersion.isYellow() then
+ check("running under POKEPORT_VERSION=yellow", false)
+ report()
+ U.log("Nothing else in this driver applies to RED/BLUE: there is no")
+ U.log("follower to hop, and the four-quadrant shadow is correct there.")
+ while true do coroutine.yield() end
+ end
+
+ -- ShouldPikachuSpawn's two preconditions (engine/pikachu/
+ -- pikachu_follow.asm): the lab gift happened and a healthy Pikachu is in
+ -- the party. Without both, ow.npcs never gets a follower and every
+ -- follower check below would read as the bug.
+ game.save.flags = game.save.flags or {}
+ game.save.flags.EVENT_GOT_STARTER = true
+ game.save.party = { Pokemon.new(game.data, "PIKACHU", 20) }
+ game.save.onBike = false
+
+ -- ROUTE_1 (10x18 blocks) is the first outdoor map with a plain
+ -- south-facing ledge run; (5, 4) is the standing cell of one, read out of
+ -- the cached blocks rather than typed from a map screenshot. scanHop
+ -- re-derives it below and this only picks the starting point.
+ local MAP = "ROUTE_1"
+ local WANT = { x = 5, y = 4 }
+
+ -- data.field.ledges rows for the loaded tileset, in the shape
+ -- OverworldState:checkLedgeHop matches (facing == input == the pressed
+ -- direction, standing tile under the player, ledge tile in front).
+ local function ledgeRows(map, dir)
+ local rows = {}
+ for _, l in ipairs(game.data.field.ledges or {}) do
+ if (l.tileset or "OVERWORLD") == map.def.tileset
+ and l.facing == dir and l.input == dir then
+ rows[#rows + 1] = l
+ end
+ end
+ return rows
+ end
+
+ local function ledgeTileSet(map)
+ local set = {}
+ for _, l in ipairs(game.data.field.ledges or {}) do
+ if (l.tileset or "OVERWORLD") == map.def.tileset then
+ set[l.ledgeTile] = true
+ end
+ end
+ return set
+ end
+
+ -- a cell the player can hop south from, with two walkable cells above it
+ -- to walk in from and a walkable landing two cells below
+ local function hopCellOk(map, cx, cy)
+ if not (map:inBounds(cx, cy) and map:inBounds(cx, cy + 2)) then
+ return false
+ end
+ if not map:isWalkableCell(cx, cy) then return false end
+ if not map:isWalkableCell(cx, cy + 2) then return false end
+ if not (map:isWalkableCell(cx, cy - 1)
+ and map:isWalkableCell(cx, cy - 2)) then
+ return false
+ end
+ local standing = map:cellTile(cx, cy)
+ local front = map:cellTile(cx, cy + 1)
+ for _, l in ipairs(ledgeRows(map, "down")) do
+ if l.standingTile == standing and l.ledgeTile == front then return true end
+ end
+ return false
+ end
+
+ local function scanHop(map)
+ for cy = 2, map.heightCells - 3 do
+ for cx = 0, map.widthCells - 1 do
+ if hopCellOk(map, cx, cy) then return cx, cy end
+ end
+ end
+ return nil
+ end
+
+ U.teleport(game, MAP, WANT.x, WANT.y - 2, "down")
+ U.wait(20)
+
+ local ow = game.overworld
+ check("overworld is up on " .. MAP, ow ~= nil and ow.map.id == MAP)
+ if not ow then
+ report()
+ while true do coroutine.yield() end
+ end
+
+ local hx, hy = WANT.x, WANT.y
+ if not hopCellOk(ow.map, hx, hy) then
+ local sx, sy = scanHop(ow.map)
+ if sx then
+ U.log(("(%d, %d) is no longer a south ledge; using"):format(WANT.x, WANT.y),
+ sx, sy)
+ hx, hy = sx, sy
+ U.teleport(game, MAP, hx, hy - 2, "down")
+ U.wait(20)
+ ow = game.overworld
+ end
+ end
+ check(("a south ledge to hop at (%d, %d)"):format(hx, hy),
+ hopCellOk(ow.map, hx, hy))
+
+ local LEDGES = ledgeTileSet(ow.map)
+
+ local function follower()
+ for _, n in ipairs(ow.npcs or {}) do
+ if n.pikachuFollower then return n end
+ end
+ return nil
+ end
+
+ check("the follower spawned", follower() ~= nil)
+
+ -- sampled every frame from here on: the two things that only exist
+ -- mid-motion. A follower at rest on a ledge tile is #409 exactly -- it
+ -- walked onto the ledge and stopped there instead of clearing it.
+ local maxHop, sawHopStep, restedOnLedge = 0, false, false
+ local function sample()
+ local p = ow.player
+ if p.hopFrames and p.hopFrames > maxHop then maxHop = p.hopFrames end
+ local npc = follower()
+ if not npc then return end
+ if npc.hopStep then sawHopStep = true end
+ if not npc.moving and LEDGES[ow.map:cellTile(npc.cellX, npc.cellY)] then
+ restedOnLedge = true
+ end
+ end
+
+ local function step(n)
+ for _ = 1, n do
+ coroutine.yield()
+ sample()
+ end
+ end
+
+ -- walk south into the ledge, one frame of held Down at a time, and let go
+ -- the moment the hop commits so the landing cannot roll straight into a
+ -- second hop
+ local walked = 0
+ for _ = 1, 200 do
+ table.insert(game.input.pressQueue, "down")
+ game.input.state["down"] = true
+ coroutine.yield()
+ sample()
+ walked = walked + 1
+ if ow.player.hopFrames and ow.player.hopFrames > 0 then break end
+ end
+ game.input.state["down"] = false
+
+ check("the player's ledge hop actually fired", maxHop > 0)
+
+ -- mid-arc: count the shadow quads one Player:draw puts down. Player:draw
+ -- issues its shadow copies back to back before the sprite, so the longest
+ -- run of consecutive love.graphics.draw calls carrying shadowImg is that
+ -- per-frame count. Yellow's LedgeHoppingShadowOAM is two entries (dbsprite
+ -- 9,11 and 10,11 OAM_XFLIP, engine/overworld/ledges.asm) mirrored into one
+ -- 16x8 ellipse; RED's four-quadrant block is what #408 was leaking in.
+ local shadowDraws
+ local img = ow.player.shadowImg
+ check("the hop shadow tile loaded", img ~= nil)
+ if img then
+ local real = love.graphics.draw
+ local run, best = 0, 0
+ love.graphics.draw = function(a, ...)
+ if a == img then
+ run = run + 1
+ if run > best then best = run end
+ else
+ run = 0
+ end
+ return real(a, ...)
+ end
+ step(4)
+ love.graphics.draw = real
+ shadowDraws = best
+ check("exactly one mirrored pair of shadow quads per frame (2 draws)",
+ shadowDraws == 2)
+ end
+
+ local SHOT_DIR = os.getenv("SHOT_DIR") or "/tmp/shots"
+ local midShot = SHOT_DIR .. "/bug408_hop_midair.png"
+ if ow.player.hopFrames and ow.player.hopFrames > 0 then
+ check("mid-arc screenshot reached disk", U.shot(game, midShot) and true)
+ U.log("captured", midShot, "at hopFrames", ow.player.hopFrames)
+ else
+ check("mid-arc screenshot reached disk", false)
+ U.log("the arc was already over before the capture; no mid-air frame")
+ end
+
+ -- let the follower finish crossing (its hop is one normal step's frames
+ -- with a doubled step vector, pikachu_follow.asm Func_fca0a)
+ step(120)
+
+ local npc = follower()
+ check("the follower is still on the map", npc ~= nil)
+ if npc then
+ local tile = ow.map:cellTile(npc.cellX, npc.cellY)
+ check("the follower came to rest on a walkable cell",
+ ow.map:isWalkableCell(npc.cellX, npc.cellY))
+ check("that cell is not a ledge tile", not LEDGES[tile])
+ check("the follower ended below the ledge row", npc.cellY > hy + 1)
+ check("it took the doubled hop step, not two walks", sawHopStep)
+ U.log(("follower rests at (%d, %d), tile %s; player at (%d, %d)")
+ :format(npc.cellX, npc.cellY, tostring(tile),
+ ow.player.cellX, ow.player.cellY))
+ end
+ check("the follower never stood still on a ledge tile", not restedOnLedge)
+
+ local afterShot = SHOT_DIR .. "/bug409_after_follow.png"
+ check("landing screenshot reached disk", U.shot(game, afterShot) and true)
+ U.log("captured", afterShot)
+ U.log("walked", walked, "frames into the ledge at", hx, hy)
+
+ report()
+
+ -- hand the pad back one cell short of the same ledge, so Down alone
+ -- re-runs the hop as many times as the reader wants
+ U.teleport(game, MAP, hx, hy - 1, "down")
+ U.wait(20)
+
+ U.log("Hold Down to hop the ledge again from here.")
+ U.log("During the arc there should be one flat ellipse on the ground under")
+ U.log("the player, not a taller blob with a seam across its middle, and")
+ U.log("Pikachu should clear both cells in one motion. The near miss to")
+ U.log("watch for is Pikachu pausing a beat on the ledge tile itself.")
+
+ while true do
+ coroutine.yield()
+ end
+end
diff --git a/tests/drivers/pikachu_talk_bug407_test.lua b/tests/drivers/pikachu_talk_bug407_test.lua
new file mode 100644
index 00000000..98838278
--- /dev/null
+++ b/tests/drivers/pikachu_talk_bug407_test.lua
@@ -0,0 +1,239 @@
+-- Manual check that the Yellow follower answers an A press (#407).
+-- TalkToPikachu (pokeyellow engine/pikachu/pikachu_emotions.asm) picks an
+-- emotion, plays its bubble + voiced clip and raises the framed pikapic;
+-- the port's follower is a frame behind the player, so the old not-moving
+-- gate in OverworldState:interact ate the press right after a step landed.
+-- No POKEPORT_SPEED: it scales the logic clock only, and the cry runs on
+-- the real-time audio accumulator, so a fast run desyncs what is judged.
+-- POKEPORT_DRIVER=tests/drivers/pikachu_talk_bug407_test.lua POKEPORT_IDENTITY=bug407 POKEPORT_TOUCH=0 POKEPORT_VERSION=yellow love .
+return function(game)
+ local U = dofile("tests/drivers/util.lua")
+ local GameVersion = require("src.core.GameVersion")
+ local Pokemon = require("src.pokemon.Pokemon")
+ local Sound = require("src.core.Sound")
+
+ local SHOT_DIR = os.getenv("SHOT_DIR") or "/tmp/shots"
+ local OPPOSITE = { up = "down", down = "up", left = "right", right = "left" }
+
+ local function check(label, ok)
+ U.log(ok and "PASS" or "FAIL", label)
+ return ok
+ end
+
+ local function idle()
+ while true do coroutine.yield() end
+ end
+
+ -- the Yellow cache is a separate mount; on Red/Blue there is no follower
+ -- at all and every line below would fail for the wrong reason
+ if not check("running the Yellow cache (POKEPORT_VERSION=yellow)",
+ GameVersion.isYellow()) then
+ U.log("Red and Blue have no follower. Re-run with POKEPORT_VERSION=yellow.")
+ idle()
+ end
+
+ -- ShouldPikachuSpawn's three inputs (pikachu_follow.asm): the lab gift
+ -- happened, a healthy starter Pikachu is in the party, and the sprite
+ -- exists in the cache. Happiness/mood are left at their boot values
+ -- (90 / 128, init_player_data.asm) so the mood matrix lands on the same
+ -- cell a fresh save would pick.
+ game.save.party = { Pokemon.new(game.data, "PIKACHU", 12) }
+ game.save.player.name = "bryan"
+ game.save.flags = game.save.flags or {}
+ game.save.flags.EVENT_GOT_STARTER = true
+
+ -- pokeyellow data/maps/objects/PalletTown.asm: the town's objects sit at
+ -- (10,4), (3,8) and (11,14) and its warps at (5,5), (13,5), (12,11), so
+ -- the road cells around (10,8) are clear of all of them.
+ local MAP = "PALLET_TOWN"
+ local START = { x = 10, y = 8, facing = "down" }
+
+ U.teleport(game, MAP, START.x, START.y, START.facing)
+ U.wait(10)
+
+ local ow = game.overworld
+ local function follower()
+ for _, n in ipairs(ow.npcs or {}) do
+ if n.pikachuFollower then return n end
+ end
+ return nil
+ end
+
+ local npc = follower()
+ if not check("follower is in ow.npcs with pikachuFollower set", npc ~= nil) then
+ U.log("EVENT_GOT_STARTER:", tostring(game.save.flags.EVENT_GOT_STARTER),
+ "party PIKACHU hp:",
+ tostring(game.save.party[1] and game.save.party[1].hp),
+ "SPRITE_PIKACHU:",
+ tostring(game.data.sprites and game.data.sprites.SPRITE_PIKACHU ~= nil))
+ idle()
+ end
+
+ -- one real step, so the follower trails onto the cell just vacated and
+ -- the press lands in exactly the window #407 used to swallow. A later
+ -- map edit that walls (10,9) in degrades to any free neighbour instead
+ -- of walking into a fence.
+ local p = ow.player
+ local DIRS = { { "down", 0, 1 }, { "up", 0, -1 },
+ { "left", -1, 0 }, { "right", 1, 0 } }
+ local stepDir
+ for _, d in ipairs(DIRS) do
+ local cx, cy = p.cellX + d[2], p.cellY + d[3]
+ if ow.map:inBounds(cx, cy) and ow.map:isWalkableCell(cx, cy)
+ and not ow:npcAtCell(cx, cy) then
+ stepDir = d[1]
+ break
+ end
+ end
+ if not check("a walkable neighbour to step into exists", stepDir ~= nil) then
+ idle()
+ end
+ U.hold(game, stepDir, 24) -- 16 frame step plus the turn frame and slack
+ U.wait(6)
+
+ -- turn back the way we came: tryMove on a new facing only turns, so the
+ -- tap cannot walk back onto the follower's cell
+ U.tap(game, OPPOSITE[stepDir])
+ U.wait(6)
+
+ local function facingFollower()
+ local fx, fy = ow.player:facingCell()
+ return ow:npcAtCell(fx, fy) == npc
+ end
+
+ if not facingFollower() then
+ -- the follower is somewhere else (a step it could not take, a mod):
+ -- turn toward whichever neighbouring cell it actually occupies
+ for _, d in ipairs(DIRS) do
+ if npc.cellX == ow.player.cellX + d[2]
+ and npc.cellY == ow.player.cellY + d[3] then
+ U.log("follower is", d[1], "of the player, turning that way instead")
+ U.tap(game, d[1])
+ U.wait(6)
+ break
+ end
+ end
+ end
+ check("player is facing the follower's cell", facingFollower())
+ U.log("player at", ow.player.cellX, ow.player.cellY,
+ "facing", ow.player.facing,
+ "| follower at", npc.cellX, npc.cellY)
+
+ -- a muted run sounds exactly like the bug, so say so before anyone
+ -- listens for the clip (Sound.setVolumeLevel reads save.options.sfxVol)
+ local sfxVol = game.save.options and game.save.options.sfxVol
+ U.log("save.options.sfxVol:", tostring(sfxVol))
+ if (sfxVol or 0) == 0 then
+ U.log("WARNING sfx volume is 0: no cry can be heard whether or not one")
+ U.log("WARNING plays. Raise it in OPTIONS before judging the sound half.")
+ end
+
+ -- record what the talk actually asked the mixer for: PCM clip, chip
+ -- fallback, or nothing at all. playCry calls Sound.playPikaCry through
+ -- the table, so the wrapper sees the fallback too.
+ local cries = {}
+ local realPika, realChip = Sound.playPikaCry, Sound.playCry
+ Sound.playPikaCry = function(data, n)
+ local src = realPika(data, n)
+ cries[#cries + 1] = { kind = "pcm clip", id = n, src = src }
+ return src
+ end
+ Sound.playCry = function(data, species)
+ local src = realChip(data, species)
+ cries[#cries + 1] = { kind = "chip cry", id = species, src = src }
+ return src
+ end
+ local function restoreSound()
+ Sound.playPikaCry, Sound.playCry = realPika, realChip
+ end
+
+ -- data.field.emotionBubbles is the sheet TalkToPikachu's bubble index
+ -- resolves against; an unbuilt Yellow cache carries only the three
+ -- shared bubbles and the talk degrades to a silent hold
+ local sheet = game.data.field and game.data.field.emotionBubbles
+ local function bubbleReport(emote)
+ if emote.bubble == false or emote.bubble == nil then
+ U.log("this emotion has NO bubble: a cry and the framed pic are all it")
+ U.log("puts on screen, which is correct behavior, not the bug")
+ return true
+ end
+ local rect = sheet and sheet.bubbles and sheet.bubbles[emote.bubble]
+ local ok = rect ~= nil and (sheet.path ~= nil)
+ check("bubble index " .. tostring(emote.bubble) ..
+ " resolves against the cache sheet", ok)
+ if ok then
+ U.log("bubble", rect.name or "?", "crop",
+ rect.x, rect.y, rect.w, rect.h, "of", sheet.path)
+ end
+ return ok
+ end
+
+ local function reportCries(from)
+ for i = #cries, 1, -1 do
+ if i > from then
+ U.log("cry:", cries[i].kind, tostring(cries[i].id),
+ cries[i].src and "source created" or "NO SOURCE")
+ end
+ end
+ return #cries > from
+ end
+
+ -- ---- press one: whatever the mood matrix picks on a boot-value save ----
+ local before = #cries
+ U.tap(game, "a")
+ U.wait(6)
+
+ local emote = ow.emote
+ check("the A press reached the follower (ow.emote is set)",
+ emote ~= nil and emote.npc == npc)
+ if not emote then
+ restoreSound()
+ U.log("Nothing answered the press. That is #407 exactly: no bubble, no")
+ U.log("cry, no framed picture, and the map keeps running underneath.")
+ idle()
+ end
+ check("the framed pikapic path resolved",
+ type(emote.pikaPic) == "string"
+ and love.filesystem.getInfo(emote.pikaPic) ~= nil)
+ check("a cry source was created", reportCries(before))
+ bubbleReport(emote)
+ U.log("happiness", tostring(game.save.pikachuHappiness or 90),
+ "mood", tostring(game.save.pikachuMood or 128))
+ U.log("on boot values (90 / 128) the matrix cell is emotion 5:")
+ U.log("PCM clip 31 and no bubble at all, so sound with no bubble is right")
+ if U.shot(game, SHOT_DIR .. "/bug407_talk_mood.png") then
+ U.log("captured", SHOT_DIR .. "/bug407_talk_mood.png")
+ end
+
+ -- ---- press two: a scripted emotion that must show a bubble ----
+ -- wPikachuEmotionModifier 5 is MapSpecificPikachuExpression's fifth
+ -- entry, emotion 25: BOLT_BUBBLE plus PCM clip 35. Forcing it takes the
+ -- mood roll out of the picture, so a missing bubble here is a real fault.
+ U.wait(70) -- the 50 frame hold, plus slack, before input is looked at again
+ game.save.pikachuEmotionModifier = 5
+ check("still facing the follower for the second press", facingFollower())
+ before = #cries
+ U.tap(game, "a")
+ U.wait(6)
+
+ emote = ow.emote
+ check("emotion 25 (forced) answered the press", emote ~= nil)
+ if emote then
+ check("emotion 25 carries a bubble index", type(emote.bubble) == "number")
+ bubbleReport(emote)
+ check("emotion 25 played a cry", reportCries(before))
+ if U.shot(game, SHOT_DIR .. "/bug407_talk_bolt.png") then
+ U.log("captured", SHOT_DIR .. "/bug407_talk_bolt.png")
+ end
+ end
+ restoreSound()
+
+ U.log("Both presses have already happened; the screen shows the second.")
+ U.log("A framed Pikachu picture sits over the map with a lightning bubble")
+ U.log("above the follower and a voiced squeak plays. Face it and press A")
+ U.log("again for the mood-picked one: on a fresh save that emotion has a")
+ U.log("cry but no bubble, which is right. Nothing at all -- no box, no")
+ U.log("picture, no sound -- is #407 still biting.")
+
+ idle()
+end
diff --git a/tests/drivers/surfing_minigame_test.lua b/tests/drivers/surfing_minigame_test.lua
new file mode 100644
index 00000000..5fb6145d
--- /dev/null
+++ b/tests/drivers/surfing_minigame_test.lua
@@ -0,0 +1,92 @@
+-- Driver: Summer Beach House gate + Surfing Pikachu minigame
+-- (data/scripts/yellow_beach_house.lua, src/ui/SurfingMinigame.lua).
+-- POKEPORT_VERSION=yellow POKEPORT_DRIVER=tests/drivers/surfing_minigame_test.lua love .
+-- Talks to the Surfin' Dude without a surfing Pikachu (burger line),
+-- then with one: plays a run -- paddle, jump, spin, land -- rides to
+-- the results card, and checks the high score persisted; finally pokes
+-- the printer for the hi-score print offer.
+return function(game)
+ local U = dofile("tests/drivers/util.lua")
+ local DIR = os.getenv("SHOT_DIR") or "/tmp/shots"
+ local Pokemon = require("src.pokemon.Pokemon")
+
+ game.save.party = { Pokemon.new(game.data, "PIKACHU", 50) }
+
+ U.teleport(game, "SUMMER_BEACH_HOUSE", 2, 2, "up")
+ local ow = game.overworld
+ -- dude is at (2,3); stand at (2,2)... face down instead
+ ow.player.facing = "down"
+ U.wait(5)
+
+ U.tap(game, "a")
+ U.wait(30)
+ U.shot(game, DIR .. "/surf_0_no_surf.png")
+ -- close the burger line fully
+ for _ = 1, 40 do
+ if game.stack:top() == ow then break end
+ U.tap(game, "a")
+ U.wait(4)
+ end
+ U.log("gate without SURF done")
+
+ -- now teach SURF and retry: mash A through pitch + YES into the game
+ game.save.party[1].moves = { { id = "SURF", pp = 15 } }
+ local offerShot = false
+ for _ = 1, 300 do
+ local top = game.stack:top()
+ if top and top.seaY then break end
+ if not offerShot and top ~= ow and top and top.pages then
+ U.shot(game, DIR .. "/surf_1_offer.png")
+ offerShot = true
+ end
+ U.tap(game, "a")
+ U.wait(4)
+ end
+ local mg = game.stack:top()
+ U.log("minigame running:", tostring(mg and mg.seaY ~= nil))
+ if mg and mg.seaY then
+ for _ = 1, 8 do U.tap(game, "a") U.wait(3) end -- paddle
+ U.shot(game, DIR .. "/surf_2_ride.png")
+ U.tap(game, "up") -- launch
+ U.hold(game, "right", 30) -- spin
+ U.shot(game, DIR .. "/surf_3_air.png")
+ -- let it land and ride out the rest of the run
+ for _ = 1, 4000 do
+ if mg.phase == "results" then break end
+ if mg.phase == "ride" and (U.frame() % 4) == 0 then
+ U.tap(game, "a")
+ end
+ U.wait(1)
+ end
+ U.shot(game, DIR .. "/surf_4_results.png")
+ U.log("phase:", mg.phase, "score:", mg.score,
+ "hi:", tostring(game.save.surfingHighScore))
+ U.tap(game, "a") -- dismiss results
+ U.wait(20)
+ end
+
+ -- printer: should offer the hi-score print after surfing this visit
+ U.teleport(game, "SUMMER_BEACH_HOUSE", 6, 2, "up")
+ ow = game.overworld
+ ow.surfedThisVisit = true
+ U.wait(5)
+ -- printer is a bg event on the top wall; poke the talk script directly
+ local MapScripts = require("data.scripts.init")
+ local handler = MapScripts.talkScript("SUMMER_BEACH_HOUSE",
+ "TEXT_SUMMERBEACHHOUSE_PRINTER")
+ U.log("printer handler:", type(handler))
+ if type(handler) == "function" then
+ local finished = false
+ handler(game, ow, nil, function() finished = true end)
+ for _ = 1, 200 do
+ if finished then break end
+ U.tap(game, "a")
+ U.wait(4)
+ end
+ U.shot(game, DIR .. "/surf_5_printer.png")
+ U.log("printer flow finished:", tostring(finished))
+ end
+
+ U.log("DONE")
+ love.event.quit()
+end
diff --git a/tests/engine/launcher_mods_tests.lua b/tests/engine/launcher_mods_tests.lua
index 9329944b..2f4044c5 100644
--- a/tests/engine/launcher_mods_tests.lua
+++ b/tests/engine/launcher_mods_tests.lua
@@ -230,4 +230,52 @@ do
"the copy uses the literal picked path")
end
+-- ------- pickStrays: which mods dropped beside the game are worth adopting
+
+do
+ -- the case this exists for: a player unzipped a mod next to the executable
+ -- of a non-portable install, where the game has no way to read it
+ local rows = LauncherMods.pickStrays({
+ { id = "b_mod", name = "B", folder = "/game", path = "m/b_mod" },
+ { id = "a_mod", name = "A", folder = "/game", path = "m/a_mod" },
+ }, {})
+ eq(#rows, 2, "an uninstalled stray is worth adopting")
+ eq(rows[1].id, "a_mod", "rows come back sorted by id")
+ eq(rows[2].id, "b_mod", "both of them")
+ eq(rows[1].path, "m/a_mod", "carrying the path the copy reads from")
+ eq(rows[1].folder, "/game", "and the folder it was found in, for the notice")
+end
+
+do
+ -- already installed: the player has a working copy and the loose folder is
+ -- just where they first put it. Silence is right -- adopting would make a
+ -- second copy, and warning would nag on every open.
+ local rows = LauncherMods.pickStrays({
+ { id = "have", name = "Have" },
+ { id = "want", name = "Want" },
+ }, { have = true })
+ eq(#rows, 1, "a stray the game can already see is not a stray")
+ eq(rows[1].id, "want", "only the one it cannot see is adopted")
+end
+
+do
+ -- two game folders can both hold the same id (a launcher install plus an
+ -- older manual one). First wins, matching discover()'s duplicate rule.
+ local rows = LauncherMods.pickStrays({
+ { id = "dup", name = "First", folder = "/a" },
+ { id = "dup", name = "Second", folder = "/b" },
+ }, {})
+ eq(#rows, 1, "a duplicate id across two game folders is adopted once")
+ eq(rows[1].name, "First", "and the first one found wins")
+end
+
+do
+ eq(#LauncherMods.pickStrays({}, {}), 0, "no candidates, nothing to adopt")
+ eq(#LauncherMods.pickStrays(nil, nil), 0, "and nil is not an error")
+ eq(#LauncherMods.pickStrays({ { name = "no id" } }, {}), 0,
+ "a row with no id is dropped rather than crashing the panel")
+ local rows = LauncherMods.pickStrays({ { id = "bare" } }, {})
+ eq(rows[1].name, "bare", "a nameless row falls back to its id")
+end
+
T.finish("launcher_mods")
diff --git a/tests/engine/launcher_page_scroll.lua b/tests/engine/launcher_page_scroll.lua
new file mode 100644
index 00000000..04141e42
--- /dev/null
+++ b/tests/engine/launcher_page_scroll.lua
@@ -0,0 +1,63 @@
+-- Launcher page scroll (src/import/RomImporter.lua): the column under the tab
+-- bar -- panel, updater banner, footer -- scrolls as one when the window is too
+-- short to hold it. Before this, a stacked single-column layout on a narrow
+-- window ran under a footer pinned to the window bottom, and the part below the
+-- fold could not be reached at all. The arithmetic is pure, so pin it here
+-- rather than in a screenshot.
+package.path = "./?.lua;./?/init.lua;" .. package.path
+if not _G.love then _G.love = require("tests.love_stub") end
+
+local T = require("tests.modkit")
+local RomImporter = require("src.import.RomImporter")
+
+local pageScrollFor = RomImporter.pageScrollFor
+
+-- ------------------------------------------------------------- fits: inert
+local paged, scroll, maxPage = pageScrollFor(400, 600, 0)
+T.eq(paged, false, "a column shorter than the viewport does not scroll")
+T.eq(maxPage, 0, "and has nowhere to scroll to")
+T.eq(scroll, 0, "and sits at the top")
+
+-- An exact fit is still not a scroll: one pixel of slack would show a thumb
+-- for nothing and put the wheel on the page instead of the slot list.
+paged, _, maxPage = pageScrollFor(600, 600, 0)
+T.eq(paged, false, "a column exactly as tall as the viewport does not scroll")
+T.eq(maxPage, 0, "an exact fit has no scroll extent")
+
+-- --------------------------------------------------------- overflows: scrolls
+paged, scroll, maxPage = pageScrollFor(900, 600, 0)
+T.eq(paged, true, "a column taller than the viewport scrolls")
+T.eq(maxPage, 300, "the extent is exactly the overflow")
+T.eq(scroll, 0, "a fresh page starts at the top")
+
+-- The bottom of the travel shows the footer: the whole overflow is reachable,
+-- which is the point of the change (#footer under the fold).
+_, scroll = pageScrollFor(900, 600, 300)
+T.eq(scroll, 300, "the offset can reach the end of the column")
+_, scroll = pageScrollFor(900, 600, 5000)
+T.eq(scroll, 300, "an offset past the end clamps to it")
+_, scroll = pageScrollFor(900, 600, -40)
+T.eq(scroll, 0, "an offset above the top clamps to it")
+
+-- ------------------------------------------------------- the window grows back
+-- Resizing taller has to pull the page back down with it; leaving the offset
+-- where it was would park the content above the viewport with no way back.
+_, scroll, maxPage = pageScrollFor(900, 800, 300)
+T.eq(maxPage, 100, "a taller window leaves less to scroll")
+T.eq(scroll, 100, "and drags a deeper offset back to the new end")
+paged, scroll = pageScrollFor(900, 900, 300)
+T.eq(paged, false, "growing past the content stops the scrolling")
+T.eq(scroll, 0, "and returns the page to the top")
+
+-- ---------------------------------------------------------------- degenerate
+-- draw() computes the viewport from the window height, so a window smaller than
+-- the pinned header hands this a negative number; it must not become extra
+-- travel.
+_, _, maxPage = pageScrollFor(500, -120, 0)
+T.eq(maxPage, 500, "a negative viewport counts as no room, not as more of it")
+paged, scroll, maxPage = pageScrollFor(nil, nil, nil)
+T.eq(paged, false, "a first frame with nothing measured yet does not scroll")
+T.eq(scroll, 0, "and sits at the top")
+T.eq(maxPage, 0, "with no extent")
+
+T.finish("launcher page scroll")
diff --git a/tests/engine/save_file_io_tests.lua b/tests/engine/save_file_io_tests.lua
index bf6b0e2a..6645c7c9 100644
--- a/tests/engine/save_file_io_tests.lua
+++ b/tests/engine/save_file_io_tests.lua
@@ -96,7 +96,14 @@ local function syntheticSave(name)
moves = { { id = "TACKLE", pp = 35, ppUps = 0 } },
nickname = "SQ", ot = name, otId = seed.player.id, catchRate = 45,
} }
- return GenSave.encode(seed, data, nil)
+ -- The current-map view pointer is part of wMainData's map cache, not a
+ -- modeled save field. Pokémon Red restores that cache before Continue,
+ -- so it is a useful canary for the import -> slot -> export path.
+ local raw = GenSave.encode(seed, data, nil)
+ local cacheOff = OFF.mainData + 104
+ local cacheTemplate = raw:sub(1, cacheOff) .. string.char(0xA5)
+ .. raw:sub(cacheOff + 2)
+ return GenSave.encode(seed, data, cacheTemplate)
end
-- ---------------------------------------------- importToSlot -> listSlots
@@ -149,6 +156,8 @@ do
eq(outBytes and #outBytes, GenSave.SAVE_SIZE, "the export is exactly 32768 bytes")
check(outBytes and mainChecksumValid(outBytes),
"the export carries a valid main-data checksum")
+ eq(outBytes and outBytes:byte(OFF.mainData + 105), 0xA5,
+ "the export keeps the saved current-map cache")
-- the export re-imports to an equivalent save
local re = SaveConvert.importSav(outBytes, "red")
diff --git a/tests/engine/wide_battle_layout.lua b/tests/engine/wide_battle_layout.lua
index 9a349e77..5571af39 100644
--- a/tests/engine/wide_battle_layout.lua
+++ b/tests/engine/wide_battle_layout.lua
@@ -6,12 +6,20 @@ package.path = "./?.lua;./?/init.lua;" .. package.path
local T = require("tests.modkit")
local WideBattle = require("src.battle.WideBattle")
local Renderer = require("src.render.Renderer")
+local Game = require("src.core.Game")
T.eq(WideBattle.WIDTH, 304, "the wide layout runs on a 304px native surface")
T.eq(WideBattle.HEIGHT, 144, "the wide surface keeps the native height")
T.eq(WideBattle.FIELD_BOTTOM, 104,
"the lower 40 rows are the message / command windows")
+local wide = { isWideBattleLayout = function() return true end }
+local normal = { isWideBattleLayout = function() return false end }
+T.eq(Game.wideBattleInStack({ states = { normal, wide, normal } }), wide,
+ "a wide battle remains the surface owner under a classic overlay")
+T.eq(Game.wideBattleInStack({ states = { normal } }), nil,
+ "a classic stack keeps the normal surface")
+
-- move grid: slots are laid out 1 2 / 3 4
T.eq(WideBattle.moveGridIndex(1, 4, "right"), 2, "RIGHT crosses the row")
T.eq(WideBattle.moveGridIndex(2, 4, "left"), 1, "LEFT crosses the row")
diff --git a/tests/mod_audio_tests.lua b/tests/mod_audio_tests.lua
index d5f423e9..31da1708 100644
--- a/tests/mod_audio_tests.lua
+++ b/tests/mod_audio_tests.lua
@@ -1,8 +1,7 @@
--- Audio modding (M9): per-definition shape dispatch in Music/Sound, failure
--- isolation instead of a latching global disable, the granular
--- sfx/cries/map_songs merge, the ChipAsm assembler and its def-local blob
--- mode in ChipAudio, the song-literal tables and their fallbacks, and the
--- music.select hook plus the audio events.
+-- Audio modding (M9): ChipAsm assembler and its def-local blob mode in
+-- ChipAudio, chip/wav shape dispatch in Music/Sound, failure isolation, the
+-- granular sfx/cries/map_songs merge, song-literal tables and their
+-- fallbacks, and the music.select hook plus the audio events.
package.path = "./?.lua;./?/init.lua;" .. package.path
local S = require("tests.harness").suite("mod audio")
@@ -18,12 +17,8 @@ _G.love = love
local savedAudio, savedSound = love.audio, love.sound
local assets = {
- ["assets/theme.ogg"] = true,
- ["assets/theme_loop.ogg"] = true,
- ["assets/other.ogg"] = true,
["assets/beep.wav"] = true,
- ["assets/chime.ogg"] = true,
- ["assets/cry.ogg"] = true,
+ ["assets/chime.wav"] = true,
}
local sources = {}
@@ -216,6 +211,10 @@ check(segment.startSample == 0 and segment.volume == 13
check(segment.endSample > 0, "drum segment spans samples")
-- ------- ChipAudio: def-local blobs render without touching programs.bin
+-- Force unity mix so amplitude/pitch checks are independent of the
+-- CHANNEL_VOLUME / CHANNEL_PITCH knobs in ChipAudio.lua.
+ChipAudio.setChannelVolumes({ 1, 1, 1, 1 })
+ChipAudio.setChannelPitches({ 1, 1, 1, 1 })
local blobData = { audio = {} }
@@ -254,14 +253,67 @@ local waveSong = ChipAsm.song{
waves = { flatWave },
}
local waveTrace = ChipAudio._traceFirstMusicSampleForTest(blobData, waveSong)
-check(math.abs(waveTrace[1].value - 0.55) < 1e-9,
+check(math.abs(waveTrace[1].value - 1) < 1e-9,
"def-local waves drive the wave channel")
-- def-local drums are honored over the ROM's noise headers
local drumTrace = ChipAudio._traceFirstMusicSampleForTest(blobData, drumDef)
check(drumTrace[1].drumSegments == 1, "def-local drums reach the noise channel")
--- ------- data fixtures
+-- per-hardware-channel gains scale only that layer; restore to 1x after
+local fullPulse = ChipAudio._traceFirstMusicSampleForTest(blobData, blobSong)
+local fullDrum = ChipAudio._traceFirstMusicSampleForTest(blobData, drumDef)
+local fullWave = ChipAudio._traceFirstMusicSampleForTest(blobData, waveSong)
+ChipAudio.setChannelVolume(1, 0.5)
+local halfPulse = ChipAudio._traceFirstMusicSampleForTest(blobData, blobSong)
+ChipAudio.setChannelVolumes({ 1, 1, 0, 0.5 })
+local muteWave = ChipAudio._traceFirstMusicSampleForTest(blobData, waveSong)
+local halfDrum = ChipAudio._traceFirstMusicSampleForTest(blobData, drumDef)
+local pulseWhileOthers = ChipAudio._traceFirstMusicSampleForTest(blobData, blobSong)
+ChipAudio.setChannelVolumes({ 1, 1, 1, 1 })
+check(math.abs(halfPulse[1].value - fullPulse[1].value * 0.5) < 1e-9,
+ "channel 1 volume 0.5 halves the pulse sample")
+check(muteWave[1].value == 0, "channel 3 volume 0 mutes the wave sample")
+check(math.abs(halfDrum[1].value - fullDrum[1].value * 0.5) < 1e-9,
+ "channel 4 volume 0.5 halves the drum sample")
+check(math.abs(pulseWhileOthers[1].value - fullPulse[1].value) < 1e-9,
+ "muting wave/noise does not change pulse amplitude")
+check(math.abs(fullWave[1].value) > 0, "wave sample is nonzero at unity gain")
+local vols = ChipAudio.getChannelVolumes()
+check(vols[1] == 1 and vols[2] == 1 and vols[3] == 1 and vols[4] == 1,
+ "channel volumes restore to 1")
+check(ChipAudio.getNoiseVolume() == 1, "noise-volume alias tracks channel 4")
+
+-- per-channel pitch scales oscillator rate (zero-crossings ~double at 2x)
+local function zeroCrossings(sd)
+ local count, prev = 0, sd:getSample(0)
+ for index = 1, sd:getSampleCount() - 1 do
+ local sample = sd:getSample(index)
+ if prev * sample < 0 then count = count + 1 end
+ prev = sample
+ end
+ return count
+end
+ChipAudio.setChannelVolumes({ 1, 1, 1, 1 })
+ChipAudio.setChannelPitches({ 1, 1, 1, 1 })
+local pitchBase = ChipAudio._renderMusicChannelForTest(blobData, blobSong, 0.25, 1)
+ChipAudio.setChannelPitch(1, 2)
+local pitchOctave = ChipAudio._renderMusicChannelForTest(blobData, blobSong, 0.25, 1)
+ChipAudio.setChannelPitch(1, 0)
+local pitchFrozen = ChipAudio._renderMusicChannelForTest(blobData, blobSong, 0.25, 1)
+ChipAudio.setChannelPitches({ 1, 1, 1, 1 })
+local baseX = zeroCrossings(pitchBase)
+local octaveX = zeroCrossings(pitchOctave)
+check(baseX > 10, "unity pitch produces a tone with zero crossings")
+check(octaveX > baseX * 1.7 and octaveX < baseX * 2.3,
+ "channel 1 pitch 2 roughly doubles zero crossings")
+check(zeroCrossings(pitchFrozen) == 0,
+ "channel 1 pitch 0 freezes the oscillator")
+local pitches = ChipAudio.getChannelPitches()
+check(pitches[1] == 1 and pitches[2] == 1 and pitches[3] == 1 and pitches[4] == 1,
+ "channel pitches restore to 1")
+
+-- ------- data fixtures (chip + wav only)
local chipSong = ChipAsm.song{
channels = { { hw = 1, program = {
@@ -272,31 +324,39 @@ local chipSong = ChipAsm.song{
} } },
}
+local chipSongB = ChipAsm.song{
+ channels = { { hw = 1, program = {
+ { notetype = { speed = 12, volume = 10, fade = 0 } },
+ { octave = 5 },
+ { note = "G", len = 8 },
+ { loop = { count = 0, to = 1 } },
+ } } },
+}
+
+local chipSfx = ChipAsm.sfx{ channels = { { hw = 1, program = {
+ { squareNote = { len = 8, volume = 15, fade = 1, frequency = 0x600 } },
+} } } }
+
local function fixtureData()
return {
audio = {
songs = {
Music_Chip = chipSong,
- Music_File = { file = "assets/theme.ogg" },
- Music_Split = { file = "assets/theme.ogg",
- loopFile = "assets/theme_loop.ogg" },
- Music_Other = { file = "assets/other.ogg" },
- Music_Broken = { file = "assets/missing.ogg" },
- Music_BikeRiding = { file = "assets/other.ogg" },
- Music_PalletTown = { file = "assets/theme.ogg" },
+ Music_Other = chipSongB,
+ Music_Broken = { file = "assets/missing.wav" },
+ Music_BikeRiding = chipSongB,
+ Music_PalletTown = chipSong,
},
sfx = {
Beep = "assets/beep.wav",
- Chime = { file = "assets/chime.ogg", fanfare = true },
+ Chime = { file = "assets/chime.wav", fanfare = true },
Level_Up = "assets/beep.wav",
- Broken = { file = "assets/missing.ogg" },
- Chip_Sfx = ChipAsm.sfx{ channels = { { hw = 1, program = {
- { squareNote = { len = 8, volume = 15, fade = 1, frequency = 0x600 } },
- } } } },
+ Broken = { file = "assets/missing.wav" },
+ Chip_Sfx = chipSfx,
},
cries = {},
mapSongs = { PALLET_TOWN = "Music_PalletTown" },
- battle = { wild = "Music_Chip", wildWin = "Music_File" },
+ battle = { wild = "Music_Chip", wildWin = "Music_Other" },
},
}
end
@@ -308,7 +368,7 @@ local function reset(data)
return data
end
--- ------- dispatch: the branch follows the definition, not a global flag
+-- ------- dispatch: chip and wav branches
local data = reset(fixtureData())
@@ -318,38 +378,17 @@ check(lastSource() and lastSource().queueable,
check(lastSource().playing, "the chip song started")
local chipSource = lastSource()
-Music.play(data, "Music_File")
-check(lastSource() and not lastSource().queueable
- and lastSource().file == "assets/theme.ogg",
- "a file def becomes a stream source")
+Music.play(data, "Music_Other")
+check(lastSource() and lastSource().queueable and lastSource().playing,
+ "a second chip song streams through ChipAudio")
check(not chipSource.playing, "the outgoing chip song was stopped")
-check(lastSource().looping == true, "a looping file song loops")
-
--- intro/loop chaining now works regardless of import mode
-Music.play(data, "Music_Split")
-local intro = sources[#sources - 1]
-local body = sources[#sources]
-check(intro.file == "assets/theme.ogg" and body.file == "assets/theme_loop.ogg",
- "a split def loads both files")
-check(intro.looping == false and body.looping == true,
- "the intro plays once and the body loops")
-check(intro.playing and not body.playing, "the loop body waits for the intro")
-intro.playing = false
-Music.update(data)
-check(body.playing, "update() chains the intro into the loop body")
-
--- a file song never latches chip playback off for the songs around it
-Music.play(data, "Music_Chip")
-check(lastSource().queueable and lastSource().playing,
- "a chip song still plays after a file song")
-check(not body.playing, "the outgoing file song was stopped")
-- playOnce must survive the threaded "empty QueueableSource" window:
-- Source:isPlaying is false until the first worker buffer lands, and that
-- gap must not look like the jingle already ended (Poké Center heal).
data = reset(fixtureData())
Music.playMap(data, "PALLET_TOWN", false, false)
-check(Music.playOnce(data, "Music_Chip"), "playOnce starts a chip jingle")
+check(Music.playOnce(data, "Music_Other"), "playOnce starts a chip jingle")
local jingle = lastSource()
local clearAwait = ChipAudio._simulateAwaitingFirstBufferForTest()
check(clearAwait ~= nil, "test can force the awaiting-first-buffer window")
@@ -374,17 +413,17 @@ check(lastSource() and lastSource().mode == "static"
-- ------- failure isolation: a bad def costs one log line, nothing else
data = reset(fixtureData())
-Music.play(data, "Music_File")
+Music.play(data, "Music_Chip")
local playing = lastSource()
local before = loggedCount("bad song def")
Music.play(data, "Music_Broken")
-Music.play(data, "Music_File")
+Music.play(data, "Music_Chip")
Music.play(data, "Music_Broken")
check(loggedCount("bad song def") == before + 1,
"a broken song def is logged exactly once")
check(playing.playing, "the previous song keeps playing through a bad def")
Music.play(data, "Music_Other")
-check(lastSource().file == "assets/other.ogg" and lastSource().playing,
+check(lastSource().queueable and lastSource().playing,
"a bad def does not disable the rest of the music")
local sfxBefore = loggedCount("bad sfx def")
@@ -397,32 +436,26 @@ Sound.play(data, "Beep")
check(lastSource() and lastSource().file == "assets/beep.wav",
"a bad sfx does not disable the rest of the effects")
--- ------- cries: every authoring variant plays
+-- ------- cries: chip and derived variants
data = reset(fixtureData())
data.audio.cries.RHYDON = {
header = { address = 0x4000, bank = 2, engine = 1 }, pitch = 0, length = 0,
}
-data.audio.cries.CHIPMON = { chip = ChipAsm.sfx{ channels = { { hw = 1,
- program = { { squareNote = { len = 8, volume = 15, fade = 1,
- frequency = 0x600 } } } } } }.chip,
- pitch = 0, length = 0 }
+data.audio.cries.CHIPMON = { chip = chipSfx.chip, pitch = 0, length = 0 }
data.audio.cries.SHELLORD = { base = "CHIPMON", pitch = 0x2A, length = 0x50 }
-data.audio.cries.FILEMON = { file = "assets/cry.ogg", pitch = 1.1 }
data.audio.cries.CHAINMON = { base = "SHELLORD" }
check(Sound.playCry(data, "CHIPMON"), "a chip cry plays")
check(Sound.playCry(data, "SHELLORD"), "a derived cry plays")
check(Sound.playCry(data, "CHAINMON"), "a derived cry chain resolves")
-local fileCry = Sound.playCry(data, "FILEMON")
-check(fileCry and fileCry.file == "assets/cry.ogg", "a file cry plays")
-check(fileCry.pitch == 1.1, "a file cry honors its playback rate")
check(Sound.playCry(data, "NOBODY") == nil, "an unregistered species is silent")
-- GROWL/ROAR layer their own tempo shift on top of any cry shape
-Sound.playMoveCry(data, "FILEMON", 0xC0)
-check(math.abs(fileCry.pitch - 256 / (128 + 0xC0)) < 1e-9,
- "playMoveCry layers the move's tempo shift onto a file cry")
+local chipCry = Sound.playCry(data, "CHIPMON")
+Sound.playMoveCry(data, "CHIPMON", 0xC0)
+check(math.abs(chipCry.pitch - 256 / (128 + 0xC0)) < 1e-9,
+ "playMoveCry layers the move's tempo shift onto a chip cry")
data.audio.cries.ORPHAN = { base = "MISSING" }
local cryBefore = loggedCount("bad cry def")
@@ -438,14 +471,14 @@ check(Music.special(data, "title") == "Music_TitleScreen",
check(Music.special(data, "bike") == "Music_BikeRiding",
"the bike role falls back to Music_BikeRiding")
Music.playMap(data, "PALLET_TOWN", true, false)
-check(lastSource().file == "assets/other.ogg",
+check(lastSource().queueable,
"the fallback outdoor set engages the bike theme")
data = reset(fixtureData())
-data.audio.special = { bike = "Music_File" }
+data.audio.special = { bike = "Music_Other" }
data.audio.outdoorSongs = { Music_PalletTown = true }
Music.playMap(data, "PALLET_TOWN", true, false)
-check(lastSource().file == "assets/theme.ogg",
+check(lastSource().queueable,
"a renamed bike theme engages on outdoor maps")
check(Music.special(data, "title") == "Music_TitleScreen",
"roles the data table omits still fall back")
@@ -453,7 +486,7 @@ check(Music.special(data, "title") == "Music_TitleScreen",
data = reset(fixtureData())
data.audio.outdoorSongs = {}
Music.playMap(data, "PALLET_TOWN", true, false)
-check(lastSource().file == "assets/theme.ogg",
+check(lastSource().queueable,
"a map outside the outdoor set keeps its own theme on the bike")
-- fanfare ducking: the shared table or the definition's own flag
@@ -487,12 +520,12 @@ check(lastSource() ~= firstBeep, "Sound.invalidate drops the cached source")
data = reset(fixtureData())
Music.play(data, "Music_Broken")
check(#sources == 0, "a broken def creates no source")
-data.audio.songs.Music_Broken = { file = "assets/other.ogg" }
+data.audio.songs.Music_Broken = chipSongB
Music.play(data, "Music_Broken")
check(#sources == 0, "a failed label stays negatively cached")
Music.reload()
Music.play(data, "Music_Broken")
-check(lastSource() and lastSource().file == "assets/other.ogg",
+check(lastSource() and lastSource().queueable,
"Music.reload re-resolves a repaired def")
ChipAudio.invalidate()
@@ -527,7 +560,7 @@ check(seen[3].reason == "victory" and seen[3].kind == "wild",
"playVictory reaches the hook")
Music.playOnce(data, "Music_Other")
check(seen[4].reason == "once", "playOnce reaches the hook")
-Music.play(data, "Music_Split")
+Music.play(data, "Music_Chip")
check(seen[5].reason == "direct", "a direct play defaults to the direct reason")
-- returning nil silences the cue; returning a label plays that label
@@ -535,27 +568,25 @@ Music.reload()
resetSources()
hooks:removeOwner("test")
hooks:wrap("music.select", function() return nil end, nil, "silencer")
-Music.play(data, "Music_File")
+Music.play(data, "Music_Chip")
check(#sources == 0, "a hook returning nil silences the cue")
hooks:removeOwner("silencer")
hooks:wrap("music.select", function(nextLink, song, ctx)
- if song == "Music_File" then return nextLink("Music_Other", ctx) end
+ if song == "Music_Chip" then return nextLink("Music_Other", ctx) end
return nextLink(song, ctx)
end, nil, "swap")
-Music.play(data, "Music_File")
-check(lastSource().file == "assets/other.ogg", "a hook may swap the label")
--- the swapped label is what dedupe compares, so re-asking still restarts
--- nothing but a genuinely different choice does
Music.play(data, "Music_Chip")
+check(lastSource().queueable, "a hook may swap the label")
+Music.play(data, "Music_Other")
check(lastSource().queueable, "an unswapped label still plays")
-- a throwing wrapper is skipped and the chain continues
hooks:wrap("music.select", function() error("boom", 0) end, nil, "thrower")
Music.reload()
resetSources()
-Music.play(data, "Music_File")
-check(lastSource() and lastSource().file == "assets/other.ogg",
+Music.play(data, "Music_Chip")
+check(lastSource() and lastSource().queueable,
"a throwing wrapper is skipped and the surviving chain still runs")
hooks:removeOwner("thrower")
hooks:removeOwner("swap")
@@ -570,13 +601,13 @@ events:on("sound.played", function(p) played[#played + 1] = p end, nil, "test")
Music.playMap(data, "PALLET_TOWN", false, false)
check(started[1] and started[1].song == "Music_PalletTown"
- and started[1].reason == "map" and started[1].chip == false,
+ and started[1].reason == "map" and started[1].chip == true,
"music.started carries the song, reason and chip flag")
-Music.play(data, "Music_Chip")
+Music.play(data, "Music_Other")
check(started[2].previous == "Music_PalletTown" and started[2].chip == true,
"music.started names the song it replaced")
Music.stop()
-check(#stopped == 1 and stopped[1].song == "Music_Chip",
+check(#stopped == 1 and stopped[1].song == "Music_Other",
"music.stopped names the song that was playing")
Music.stop()
check(#stopped == 1, "stopping silence emits nothing")
@@ -587,9 +618,9 @@ check(played[1] and played[1].kind == "sfx" and played[1].name == "Beep",
Sound.playMove(data, { sound = "Chip_Sfx", pitch = 0x10, tempo = 0x90 })
check(played[2].kind == "move" and played[2].name == "Chip_Sfx",
"sound.played fires for a move sound")
-data.audio.cries.FILEMON = { file = "assets/cry.ogg" }
-Sound.playCry(data, "FILEMON")
-check(played[3].kind == "cry" and played[3].species == "FILEMON",
+data.audio.cries.CHIPMON = { chip = chipSfx.chip, pitch = 0, length = 0 }
+Sound.playCry(data, "CHIPMON")
+check(played[3].kind == "cry" and played[3].species == "CHIPMON",
"sound.played fires for a cry")
Runtime.install(savedEvents, savedHooks)
@@ -639,14 +670,22 @@ end
local granularFiles = {
["mods/coast/manifest.json"] = manifestJson("coast", 2),
["mods/coast/main.lua"] = [[
+local ChipAsm = require("src.audio.ChipAsm")
return function(mod)
- mod.content.music:register("Music_CoastTown", {
- file = "assets/theme.ogg", loopFile = "assets/theme_loop.ogg" })
+ mod.content.music:register("Music_CoastTown", ChipAsm.song{
+ channels = { { hw = 1, program = {
+ { notetype = { speed = 12, volume = 12, fade = 0 } },
+ { octave = 4 }, { note = "C", len = 8 },
+ { loop = { count = 0, to = 1 } },
+ } } },
+ })
mod.content.sfx:register("Shell_Found", {
- file = "assets/chime.ogg", fanfare = true })
+ file = "assets/chime.wav", fanfare = true })
mod.content.cries:register("SHELLORD", {
header = { address = 16696, bank = 2, engine = 1 }, pitch = 42, length = 80 })
- mod.content.cries:register("REEFMON", { file = "assets/cry.ogg" })
+ mod.content.cries:register("REEFMON", ChipAsm.sfx{ channels = { { hw = 1,
+ program = { { squareNote = { len = 4, volume = 15, fade = 1,
+ frequency = 0x500 } } } } } })
mod.content.map_songs:override("PALLET_TOWN", "Music_CoastTown")
mod.content.cries:patch("RHYDON", { pitch = 200 })
mod.content.sfx:remove("Beep")
@@ -660,7 +699,8 @@ merged.audio.cries.RHYDON = {
local granular = Loader.new({ fs = memfs(granularFiles) })
check(granular:load(merged) == true,
"the granular audio mod loads: " .. table.concat(granular.errors, "; "))
-check(merged.audio.songs.Music_CoastTown.loopFile == "assets/theme_loop.ogg",
+check(merged.audio.songs.Music_CoastTown
+ and merged.audio.songs.Music_CoastTown.chip,
"music merges into data.audio.songs")
check(merged.audio.sfx.Shell_Found.fanfare == true,
"sfx merges into data.audio.sfx")
@@ -676,12 +716,12 @@ check(merged.audio.sfx.Beep == nil, "remove tombstones an sfx")
-- the merged map song plays through the ordinary map path
reset(merged)
Music.playMap(merged, "PALLET_TOWN", false, false)
-check(sources[1] and sources[1].file == "assets/theme.ogg" and sources[1].playing,
+check(sources[1] and sources[1].queueable and sources[1].playing,
"a mod's map song plays on the map it claims")
-- a brand-new species sounds everywhere a vanilla one does
local reefCry = Sound.playCry(merged, "REEFMON")
-check(reefCry and reefCry.file == "assets/cry.ogg" and reefCry.playing,
+check(reefCry and reefCry.playing,
"a species the mod invented plays its registered cry")
-- and the hook can still take the map theme away from it
@@ -693,7 +733,7 @@ mapHooks:wrap("music.select", function(nextLink, song, ctx)
end, nil, "night")
reset(merged)
Music.playMap(merged, "PALLET_TOWN", false, false)
-check(lastSource().file == "assets/other.ogg",
+check(lastSource().queueable,
"music.select overrides the track for a map")
Runtime.install(savedEvents, savedHooks)
@@ -701,8 +741,15 @@ Runtime.install(savedEvents, savedHooks)
local bootstrapFiles = {
["mods/tc/manifest.json"] = manifestJson("tc", 2),
["mods/tc/main.lua"] = [[
+local ChipAsm = require("src.audio.ChipAsm")
return function(mod)
- mod.content.music:register("Music_TC", { file = "assets/theme.ogg" })
+ mod.content.music:register("Music_TC", ChipAsm.song{
+ channels = { { hw = 1, program = {
+ { notetype = { speed = 12, volume = 12, fade = 0 } },
+ { octave = 4 }, { note = "C", len = 8 },
+ { loop = { count = 0, to = 1 } },
+ } } },
+ })
mod.content.map_songs:register("TC_TOWN", "Music_TC")
end
]],
@@ -722,14 +769,14 @@ local v1Files = {
["mods/legacy/manifest.json"] = manifestJson("legacy", 1),
["mods/legacy/main.lua"] = [[
return function(mod)
- mod.content.audio:override("sfx", { Beep = "assets/other.ogg",
+ mod.content.audio:override("sfx", { Beep = "assets/chime.wav",
Legacy_Only = "assets/beep.wav" })
end
]],
["mods/modern/manifest.json"] = manifestJson("modern", 2, '["legacy"]'),
["mods/modern/main.lua"] = [[
return function(mod)
- mod.content.sfx:override("Beep", "assets/chime.ogg")
+ mod.content.sfx:override("Beep", "assets/beep.wav")
end
]],
}
@@ -739,7 +786,7 @@ check(v1Loader:load(v1Data) == true,
"the v1 audio registry still loads: " .. table.concat(v1Loader.errors, "; "))
check(v1Data.audio.sfx.Legacy_Only == "assets/beep.wav",
"the v1 whole-table replacement still applies")
-check(v1Data.audio.sfx.Beep == "assets/chime.ogg",
+check(v1Data.audio.sfx.Beep == "assets/beep.wav",
"a granular registration beats a v1 whole-table replacement")
check(v1Data.audio._owners.sfx.Beep == "modern",
"the granular writer owns the id even when a v1 table landed on it first")
@@ -761,11 +808,11 @@ local badFiles = {
["mods/coast/manifest.json"] = manifestJson("coast", 2),
["mods/coast/main.lua"] = [[
return function(mod)
- mod.content.music:register("Music_Bad", { file = "assets/missing.ogg" })
- mod.content.sfx:register("Sfx_Bad", { file = "assets/missing.ogg" })
- mod.content.sfx:register("Loop_Bad", { file = "assets/missing.ogg" })
- mod.content.cries:register("BADMON", { file = "assets/missing.ogg" })
- mod.content.sfx:register("Gone", { file = "assets/missing.ogg" })
+ mod.content.music:register("Music_Bad", { file = "assets/missing.wav" })
+ mod.content.sfx:register("Sfx_Bad", { file = "assets/missing.wav" })
+ mod.content.sfx:register("Loop_Bad", { file = "assets/missing.wav" })
+ mod.content.cries:register("BADMON", { file = "assets/missing.wav" })
+ mod.content.sfx:register("Gone", { file = "assets/missing.wav" })
mod.content.sfx:remove("Gone")
end
]],
@@ -812,7 +859,7 @@ check(#badLoader.errors == errorsBefore + 4,
"a known-bad def reports to Loader.errors once, not per play")
-- an engine-owned def has no mod to blame, so it stays a console line
-badData.audio.songs.Music_BaseBad = { file = "assets/missing.ogg" }
+badData.audio.songs.Music_BaseBad = { file = "assets/missing.wav" }
Music.play(badData, "Music_BaseBad")
check(loggedCount("bad song def") > 0 and #badLoader.errors == errorsBefore + 4,
"a base-owned failure never lands in Loader.errors")
diff --git a/tests/parity_oaks_aide_repeat.lua b/tests/parity_oaks_aide_repeat.lua
new file mode 100644
index 00000000..a4100f59
--- /dev/null
+++ b/tests/parity_oaks_aide_repeat.lua
@@ -0,0 +1,39 @@
+-- Parity: after a reward, each Oak's Aide repeats its item explanation
+-- instead of the pre-reward "come back" text (engine/events/oaks_aide.asm).
+package.path = "./?.lua;./?/init.lua;" .. package.path
+if not _G.love then _G.love = require("tests.love_stub") end
+local S = require("tests.harness").suite("parity Oak's Aide repeat text")
+local eq = S.eq
+local Data = require("src.core.Data")
+if not Data.maps then Data:load() end
+local Font = require("src.render.Font")
+Font.load(Data)
+
+local scripts = require("data.scripts.init")
+local CASES = {
+ { map = "ROUTE_2_GATE", text = "TEXT_ROUTE2GATE_OAKS_AIDE",
+ item = "HM_FLASH", label = "_Route2GateOaksAideFlashExplanationText",
+ value = "FLASH" },
+ { map = "ROUTE_11_GATE_2F", text = "TEXT_ROUTE11GATE2F_OAKS_AIDE",
+ item = "ITEMFINDER", label = "_Route11Gate2FOaksAideItemfinderDescriptionText",
+ value = "FINDER" },
+ { map = "ROUTE_15_GATE_2F", text = "TEXT_ROUTE15GATE2F_OAKS_AIDE",
+ item = "EXP_ALL", label = "_Route15Gate2FOaksAideExpAllText",
+ value = "EXP" },
+}
+
+for _, case in ipairs(CASES) do
+ local pushed = {}
+ local game = {
+ data = { items = { [case.item] = { name = case.item } },
+ text = { [case.label] = case.value } },
+ save = { flags = { ["EVENT_GOT_" .. case.item] = true },
+ player = { name = "RED" }, pokedex = { owned = {} } },
+ stack = { push = function(_, state) pushed[#pushed + 1] = state end },
+ }
+ scripts.talkScript(case.map, case.text)(game, {}, nil, function() end)
+ eq(pushed[1] and pushed[1].pages[1][1], case.value,
+ case.item .. " aide repeats its item explanation")
+end
+
+S.finish()
diff --git a/tests/parity_ss_anne_snorlax_dex.lua b/tests/parity_ss_anne_snorlax_dex.lua
new file mode 100644
index 00000000..c74a3d40
--- /dev/null
+++ b/tests/parity_ss_anne_snorlax_dex.lua
@@ -0,0 +1,24 @@
+-- Parity: the S.S. Anne passenger's Snorlax description opens the Pokédex
+-- entry and records Snorlax as seen (pokered/scripts/SSAnne2FRooms.asm).
+package.path = "./?.lua;./?/init.lua;" .. package.path
+local S = require("tests.harness").suite("parity ss anne Snorlax dex")
+local check, eq = S.check, S.eq
+
+local scripts = require("data.scripts.init")
+local script = scripts.talkScript("SS_ANNE_2F_ROOMS",
+ "TEXT_SSANNE2FROOMS_GENTLEMAN3")
+
+check(script ~= nil, "the S.S. Anne passenger has a talk script")
+eq(script[2][1], "show_text", "the passenger's line appears first")
+eq(script[3][1], "mark_seen", "the Pokédex preview marks Snorlax seen")
+eq(script[3][2], "SNORLAX", "the preview marks Snorlax seen")
+eq(script[4][1], "push_screen", "the Pokédex entry opens after the line")
+eq(script[4][2], "DexEntryMenu", "the Pokédex entry uses DexEntryMenu")
+eq(script[4][3], "SNORLAX", "the Pokédex entry is for Snorlax")
+
+local save = { pokedex = { seen = {}, owned = {} } }
+require("src.script.Commands").mark_seen({ save = save }, "SNORLAX")
+check(save.pokedex.seen.SNORLAX, "the preview records Snorlax as seen")
+check(not save.pokedex.owned.SNORLAX, "the preview does not mark Snorlax owned")
+
+S.finish()
diff --git a/tests/parity_true_color_ui.lua b/tests/parity_true_color_ui.lua
new file mode 100644
index 00000000..dae04ac8
--- /dev/null
+++ b/tests/parity_true_color_ui.lua
@@ -0,0 +1,88 @@
+-- True-color Pokemon art is drawn on the UI canvas in addition to battle.
+-- The Pokedex, title screen, and Oak's intro need to report the exact
+-- rectangle they draw so PaletteFX can put the unshaded copy over the SGB
+-- palette pass. Run with `luajit tests/parity_true_color_ui.lua`.
+
+package.path = "./?.lua;./?/init.lua;" .. package.path
+if not _G.love then _G.love = require("tests.love_stub") end
+
+local S = require("tests.harness").suite("parity true-color ui")
+local check = S.check
+
+local Data = require("src.core.Data")
+if not Data.maps then Data:load() end
+require("src.render.Font").load(Data)
+
+local PaletteFX = require("src.render.PaletteFX")
+local Sound = require("src.core.Sound")
+local DexEntryMenu = require("src.ui.DexEntryMenu")
+local TitleState = require("src.ui.TitleState")
+local OakSpeech = require("src.ui.OakSpeech")
+
+local savedCry = Sound.playCry
+Sound.playCry = function() end
+
+local function uiRects(draw)
+ PaletteFX.clearTrueColor()
+ PaletteFX.setPass("ui")
+ draw()
+ local rects = PaletteFX.trueColorRects("ui")
+ PaletteFX.setPass(nil)
+ return rects
+end
+
+local def = Data.pokemon.PIKACHU
+local savedTrueColor = def.trueColor
+def.trueColor = true
+
+local game = {
+ data = Data,
+ save = { pokedex = { owned = { PIKACHU = true } } },
+ stack = { pop = function() end },
+}
+local dex = DexEntryMenu.new(game, "PIKACHU")
+check(dex.spriteTrueColor == true,
+ "Pokedex keeps a Pokemon sprite's trueColor flag")
+local dexRects = uiRects(function() dex:draw() end)
+local dx, dy = 8, math.max(0, 60 - dex.sprite:getHeight())
+check(#dexRects == 1 and dexRects[1].x == dx and dexRects[1].y == dy
+ and dexRects[1].w == dex.sprite:getWidth()
+ and dexRects[1].h == dex.sprite:getHeight(),
+ "Pokedex reports the true-color sprite rectangle")
+
+local titleGame = {
+ data = { pokemon = Data.pokemon,
+ field = { title = { cycleSpecies = { "PIKACHU" } } } },
+}
+local title = TitleState.new(titleGame, {})
+local titleSprite, titleTrueColor = title:currentSprite()
+check(titleSprite and titleTrueColor,
+ "title cache keeps a Pokemon sprite's trueColor flag")
+local titleRects = uiRects(function() title:draw() end)
+local tx = 40 + math.floor((56 - titleSprite:getWidth()) / 2)
+check(#titleRects == 1 and titleRects[1].x == tx
+ and titleRects[1].y == 136 - titleSprite:getHeight()
+ and titleRects[1].w == 82 - tx
+ and titleRects[1].h == titleSprite:getHeight(),
+ "title reports the visible true-color sprite rectangle")
+
+local oak = OakSpeech.new({
+ data = { pokemon = Data.pokemon, trainers = {},
+ field = { oakSpeech = { demoSpecies = "PIKACHU" } } },
+}, nil)
+oak.pic, oak.picFlip = oak.demoPic, true
+oak.picTrueColor = oak.demoTrueColor
+check(oak.demoTrueColor == true,
+ "Oak intro keeps the demo Pokemon's trueColor flag")
+local oakRects = uiRects(function() oak:draw() end)
+local ow, oh = oak.demoPic:getDimensions()
+local ox = 48 + math.floor((8 - ow / 8) / 2) * 8
+local oy = 32 + (7 - oh / 8) * 8
+check(#oakRects == 1 and oakRects[1].x == ox and oakRects[1].y == oy
+ and oakRects[1].w == ow and oakRects[1].h == oh,
+ "Oak intro reports the true-color sprite rectangle")
+
+def.trueColor = savedTrueColor
+Sound.playCry = savedCry
+PaletteFX.clearTrueColor()
+S.finish()
diff --git a/tests/save_convert_tests.lua b/tests/save_convert_tests.lua
index 29c77e18..a775f0c4 100644
--- a/tests/save_convert_tests.lua
+++ b/tests/save_convert_tests.lua
@@ -297,9 +297,10 @@ check(scSave and scSave.lastHeal and scSave.lastHeal.map == scSave.player.map,
"SaveConvert.importSav: lastHeal derives from the decoded position")
check(scSave and scSave.lastOutdoor and scSave.lastOutdoor.id ~= nil,
"SaveConvert.importSav: lastOutdoor is set")
--- the import template + decode warnings never leak into the slot table
-check(scSave and scSave.rawImport == nil and scSave.warnings == nil,
- "SaveConvert.importSav: rawImport/warnings stripped from the returned table")
+-- The original SRAM image carries the current-map cache that Red restores on
+-- Continue, while decode warnings are only import diagnostics.
+check(scSave and type(scSave.rawImport) == "string" and scSave.warnings == nil,
+ "SaveConvert.importSav: keeps the SRAM template but drops warnings")
-- size / type validation
local badSize, badSizeErr = SaveConvert.importSav("too short", 2)
diff --git a/tools/build_rom_data.py b/tools/build_rom_data.py
index 4e1813a6..8428812b 100755
--- a/tools/build_rom_data.py
+++ b/tools/build_rom_data.py
@@ -1,9 +1,9 @@
#!/usr/bin/env python3
-"""Build game data directly from a canonical Pokemon Red ROM.
+"""Build game data directly from a canonical Pokemon Red/Blue/Yellow ROM.
-It accepts one user-provided, canonical US Pokemon Red ROM. Symbol
-addresses and assembly-erased names are bundled as non-ROM metadata, so no
-pret/pokered checkout, RGBDS build, or external .sym file is required.
+It accepts one user-provided, canonical US Gen-1 ROM. Symbol addresses and
+assembly-erased names are bundled as non-ROM metadata, so no pret checkout,
+RGBDS build, or external .sym file is required for the public ROM path.
"""
from __future__ import annotations
@@ -21,8 +21,11 @@ from PIL import Image
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from extract import util # noqa: E402
-from rom_data import (RomImage, SymbolTable, bcd, decode_text, # noqa: E402
- decompress_pic, load_manifest, read_string)
+from rom_data import ( # noqa: E402
+ CANONICAL_BLUE_SHA1, CANONICAL_RED_SHA1, CANONICAL_YELLOW_SHA1,
+ RomImage, SymbolTable, bcd, decode_text, decompress_pic, load_manifest,
+ read_string,
+)
DATASETS = (
@@ -31,6 +34,19 @@ DATASETS = (
"text", "field", "battle_anims",
)
+_TOOLS_DIR = os.path.dirname(os.path.abspath(__file__))
+VERSION_MANIFESTS = {
+ "red": os.path.join(_TOOLS_DIR, "rom_manifest.json"),
+ "blue": os.path.join(_TOOLS_DIR, "rom_manifest_blue.json"),
+ "yellow": os.path.join(_TOOLS_DIR, "rom_manifest_yellow.json"),
+}
+VERSION_SHA1 = {
+ "red": CANONICAL_RED_SHA1,
+ "blue": CANONICAL_BLUE_SHA1,
+ "yellow": CANONICAL_YELLOW_SHA1,
+}
+SHA1_TO_VERSION = {sha1: version for version, sha1 in VERSION_SHA1.items()}
+
GB_SHADES = (
(255, 255, 255, 255),
(170, 170, 170, 255),
@@ -46,6 +62,36 @@ def _symbol(symbols, name):
raise ValueError(f"required symbol {name!r} is missing") from exc
+def _has_symbol(symbols, name):
+ return name in symbols.by_name
+
+
+def resolve_manifest_path(version, manifest_arg):
+ """Pick the shipped manifest for --version, or an explicit --manifest path."""
+ if manifest_arg is not None:
+ return manifest_arg
+ path = VERSION_MANIFESTS[version]
+ if not os.path.isfile(path):
+ raise ValueError(
+ f"manifest for version {version!r} is missing: {path} "
+ f"(generate it before extracting)")
+ return path
+
+
+def version_for_manifest(manifest, requested_version=None, manifest_explicit=False):
+ """Resolve game version from an explicit flag or the manifest romSha1."""
+ rom_sha1 = manifest.get("romSha1")
+ detected = SHA1_TO_VERSION.get(rom_sha1)
+ if manifest_explicit:
+ # Explicit --manifest wins: hash/version come from the file itself.
+ return detected or requested_version or "red"
+ if requested_version and detected and requested_version != detected:
+ raise ValueError(
+ f"--version {requested_version} does not match manifest romSha1 "
+ f"{rom_sha1} ({detected})")
+ return detected or requested_version or "red"
+
+
def extract_constants(manifest, out_dir):
data = manifest["constants"]
util.write_lua(
@@ -227,8 +273,12 @@ def extract_tilesets(rom, symbols, manifest, out_dir, assets_dir):
list(blocks_raw[offset:offset + 16])
for offset in range(0, len(blocks_raw), 16)
]
+ # Red/Blue keep collision lists in ROM0; Yellow moved them to bank 1
+ # (pokeyellow Overworld_Coll at 01:4ac2). Pointers in $4000-$7FFF are
+ # banked; treat ROM0-range pointers as bank 0.
+ coll_bank = 0 if collision_pointer < 0x4000 else 1
walkable = sorted(_read_terminated(
- rom, 0, collision_pointer, 0xFF))
+ rom, coll_bank, collision_pointer, 0xFF))
warp_pointer = rom.word(
warp_pointers.bank, warp_pointers.address + index * 2)
warp_tiles = sorted(set(_read_terminated(
@@ -356,19 +406,33 @@ def extract_sprites(rom, symbols, manifest, out_dir, assets_dir):
pointer = rom.word(table.bank, address)
first_half_length = rom.byte(table.bank, address + 2)
bank = rom.byte(table.bank, address + 3)
- byte_length = spec["imageWidth"] * spec["imageHeight"] // 4
- frames = spec["imageHeight"] // 16
+ width = spec["imageWidth"]
+ height = spec["imageHeight"]
+ byte_length = width * height // 4
+ frames = height // 16
expected_length = first_half_length * (2 if frames >= 6 else 1)
if byte_length != expected_length:
- raise ValueError(
- f"{const_name}: ROM sprite length {expected_length} does not "
- f"match atlas length {byte_length}")
+ # Commercial ROM sheet length wins over pret PNG atlases (Yellow's
+ # nurse.png is 16x64 but SpriteSheetPointerTable still stores 12
+ # tiles / 192 bytes).
+ byte_length = expected_length
+ if byte_length * 4 % width:
+ raise ValueError(
+ f"{const_name}: ROM sprite length {byte_length} is not "
+ f"tile-aligned for width {width}")
+ height = byte_length * 4 // width
+ frames = height // 16
+ expected_length = first_half_length * (2 if frames >= 6 else 1)
+ if byte_length != expected_length:
+ raise ValueError(
+ f"{const_name}: ROM sprite length {expected_length} does not "
+ f"match atlas length {width * spec['imageHeight'] // 4}")
base = spec["imageBase"]
if base not in written:
_write_2bpp_png(
rom.bytes(bank, pointer, byte_length),
- spec["imageWidth"], spec["imageHeight"],
+ width, height,
os.path.join(assets_dir, "sprites", base + ".png"),
transparent_color0=True)
written.add(base)
@@ -1040,9 +1104,25 @@ def extract_palettes(rom, symbols, manifest, out_dir):
"order": order,
"pokemon": mon_pals,
}
+ if _has_symbol(symbols, "CGBBasePalettes"):
+ cgb_table = _symbol(symbols, "CGBBasePalettes")
+ cgb = {}
+ for index, name in enumerate(order):
+ colors = []
+ for color in range(4):
+ value = rom.word(
+ cgb_table.bank, cgb_table.address + index * 8 + color * 2)
+ colors.append([
+ _scale5(value & 0x1F),
+ _scale5((value >> 5) & 0x1F),
+ _scale5((value >> 10) & 0x1F),
+ ])
+ cgb[name] = colors
+ data["cgbBase"] = cgb
+ data["source"] = data["source"] + " + CGBBasePalettes"
util.write_lua(
os.path.join(out_dir, "palettes.lua"), data,
- header="Source: canonical Pokemon Red ROM; 4 RGB colors per palette")
+ header="Source: canonical Gen-1 ROM; 4 RGB colors per palette")
return data
@@ -1216,7 +1296,9 @@ def extract_pokemon(rom, symbols, manifest, out_dir, assets_dir):
type_by_id = _types_by_id(manifest)
names = _symbol(symbols, "MonsterNames")
base_stats = _symbol(symbols, "BaseStats")
- mew_stats = _symbol(symbols, "MewBaseStats")
+ # Red/Blue keep Mew outside BaseStats at MewBaseStats; Yellow folds Mew
+ # into BaseStats at dex 151 (pret/pokeyellow), so the symbol is optional.
+ mew_stats = symbols.by_name.get("MewBaseStats")
decoded_names = []
for index in range(len(species_order)):
@@ -1232,7 +1314,7 @@ def extract_pokemon(rom, symbols, manifest, out_dir, assets_dir):
("MISSINGNO", "UNUSED", "FOSSIL_", "MON_GHOST")):
continue
dex = dex_by_species[species]
- if species == "MEW":
+ if species == "MEW" and mew_stats is not None:
row = rom.bytes(mew_stats.bank, mew_stats.address, 28)
else:
row = rom.bytes(
@@ -1634,6 +1716,111 @@ def extract_field(rom, symbols, manifest, out_dir, assets_dir):
raw_2bpp(
"GameFreakLogoGraphics", 72, 8, "title/gamefreak_inc.png")
+ # Yellow fixed Pikachu title (pret/pokeyellow title_yellow.asm): tilemap
+ # composition over both tile banks -- PokemonLogoGraphics in vChars2
+ # (BG ids $00-$7F), TitlePikachuBGGraphics in vChars1 (ids $80-$EF),
+ # TitlePikachuOBGraphics at vChars1 tile $70 (ids $F0-$FC, also the eye
+ # OAM tiles), PokemonLogoCornerGraphics at vChars1 tile $7D ($FD-$FF).
+ # Mirrors RomExtractor:extractYellowTitleArt.
+ if _has_symbol(symbols, "TitlePikachuBGGraphics"):
+ raw_2bpp(
+ "TitlePikachuBGGraphics", 128, 32, "title/pikachu_bg.png",
+ transparent=True)
+ raw_2bpp(
+ "TitlePikachuOBGraphics", 96, 8, "title/pikachu_ob.png",
+ transparent=True)
+
+ def sheet_tiles(label, count, transparent=False):
+ symbol = _symbol(symbols, label)
+ raw = rom.bytes(symbol.bank, symbol.address, count * 16)
+ return [
+ _decode_2bpp(raw[index:index + 16], 8, 8, transparent)
+ for index in range(0, len(raw), 16)
+ ]
+
+ # tile counts = Graphics..GraphicsEnd symbol gaps in pokeyellow.sym
+ logo_tiles = sheet_tiles("PokemonLogoGraphics", 115)
+ corner_tiles = sheet_tiles("PokemonLogoCornerGraphics", 3)
+ bg_tiles = sheet_tiles("TitlePikachuBGGraphics", 64)
+ ob_tiles = sheet_tiles("TitlePikachuOBGraphics", 12)
+ ob_clear = sheet_tiles("TitlePikachuOBGraphics", 12, True)
+
+ def tile_for(tid):
+ if tid < 0x80:
+ return logo_tiles[tid]
+ if tid < 0xF0:
+ return bg_tiles[tid - 0x80]
+ if tid < 0xFD:
+ return ob_tiles[tid - 0xF0]
+ return corner_tiles[tid - 0xFD]
+
+ def matte_color0(pose):
+ from collections import deque
+ w, h = pose.size
+ seen = set()
+ q = deque()
+
+ def add(x, y):
+ if (x, y) in seen or not (0 <= x < w and 0 <= y < h):
+ return
+ if pose.getpixel((x, y)) == (255, 255, 255, 255):
+ seen.add((x, y))
+ q.append((x, y))
+ for x in range(w):
+ add(x, 0); add(x, h - 1)
+ for y in range(h):
+ add(0, y); add(w - 1, y)
+ while q:
+ x, y = q.popleft()
+ pose.putpixel((x, y), (255, 255, 255, 0))
+ add(x - 1, y); add(x + 1, y); add(x, y - 1); add(x, y + 1)
+ return pose
+
+ def compose(cols, rows, cells):
+ pose = Image.new("RGBA", (cols * 8, rows * 8), (255, 255, 255, 0))
+ for tid, cx, cy in cells:
+ pose.paste(tile_for(tid), (cx * 8, cy * 8))
+ return pose
+
+ def map_cells(label, cols, rows):
+ loc = _symbol(symbols, label)
+ ids = list(rom.bytes(loc.bank, loc.address, cols * rows))
+ return [
+ (tid, index % cols, index // cols)
+ for index, tid in enumerate(ids)
+ ]
+
+ # 16x7 logo box at (2,1); overwrites the scrambled sequential rip
+ # above (Yellow's logo sheet is deduplicated, Red's is not)
+ _save_png(
+ compose(16, 7, map_cells("TitleScreenPokemonLogoTilemap", 16, 7)),
+ os.path.join(assets_dir, "title/pokemon_logo.png"))
+
+ # 7x4 bubble at (6,4) + the two tail tiles poked at (9,8)
+ bubble_cells = map_cells("TitleScreenPikaBubbleTilemap", 7, 4)
+ bubble_cells += [(0x64, 3, 4), (0x65, 4, 4)]
+ _save_png(
+ matte_color0(compose(7, 5, bubble_cells)),
+ os.path.join(assets_dir, "title/pika_bubble.png"))
+
+ # 12x9 Pikachu at (4,8) + right-ear edge tiles down column 16 and
+ # the baked OAM eyes (TitleScreenPikachuEyesOAMData, left eye
+ # x-flipped, attr $22)
+ pika_cells = map_cells("TitleScreenPikachuTilemap", 12, 9)
+ pika_cells += [(0x96, 12, 2), (0x9d, 12, 3),
+ (0xa7, 12, 4), (0xb1, 12, 5)]
+ pikachu = matte_color0(compose(13, 9, pika_cells))
+ for ob_index, px, py, flip in (
+ (1, 24, 16, True), (0, 32, 16, True),
+ (3, 24, 24, True), (2, 32, 24, True),
+ (0, 56, 16, False), (1, 64, 16, False),
+ (2, 56, 24, False), (3, 64, 24, False)):
+ eye = ob_clear[ob_index]
+ if flip:
+ eye = eye.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
+ pikachu.paste(eye, (px, py), eye)
+ _save_png(pikachu, os.path.join(assets_dir, "title/pikachu.png"))
+
falling_star = raw_2bpp(
"FallingStar", 8, 8, "intro/falling_star.png",
transparent=True)
@@ -1684,31 +1871,47 @@ def extract_field(rom, symbols, manifest, out_dir, assets_dir):
(8, row * 8))
_save_png(star, os.path.join(assets_dir, "intro/big_star.png"))
- gengar = _symbol(symbols, "FightIntroBackMon")
- gengar_raw = rom.bytes(gengar.bank, gengar.address, 96 * 16)
- gengar_tiles = [
- _decode_2bpp(gengar_raw[index:index + 16], 8, 8)
- for index in range(0, len(gengar_raw), 16)
- ]
- for number in (1, 2, 3):
- tilemap = _symbol(symbols, f"GengarIntroTiles{number}")
- tile_ids = rom.bytes(tilemap.bank, tilemap.address, 49)
- pose = Image.new("RGBA", (56, 56))
- for index, tile_id in enumerate(tile_ids):
- pose.paste(
- gengar_tiles[tile_id],
- ((index % 7) * 8, (index // 7) * 8))
- pose = _matte_color0(pose)
- _save_png(
- pose, os.path.join(
- assets_dir, "intro", f"gengar_{number}.png"))
+ # Yellow replaces the Gengar/Nidorino fight intro (no FightIntro* symbols).
+ # Still emit the Red/Blue asset paths so Title/Intro loaders stay happy.
+ if _has_symbol(symbols, "FightIntroBackMon"):
+ gengar = _symbol(symbols, "FightIntroBackMon")
+ gengar_raw = rom.bytes(gengar.bank, gengar.address, 96 * 16)
+ gengar_tiles = [
+ _decode_2bpp(gengar_raw[index:index + 16], 8, 8)
+ for index in range(0, len(gengar_raw), 16)
+ ]
+ for number in (1, 2, 3):
+ tilemap = _symbol(symbols, f"GengarIntroTiles{number}")
+ tile_ids = rom.bytes(tilemap.bank, tilemap.address, 49)
+ pose = Image.new("RGBA", (56, 56))
+ for index, tile_id in enumerate(tile_ids):
+ pose.paste(
+ gengar_tiles[tile_id],
+ ((index % 7) * 8, (index // 7) * 8))
+ pose = _matte_color0(pose)
+ _save_png(
+ pose, os.path.join(
+ assets_dir, "intro", f"gengar_{number}.png"))
+ else:
+ blank = Image.new("RGBA", (56, 56), (0, 0, 0, 0))
+ for number in (1, 2, 3):
+ _save_png(
+ blank, os.path.join(
+ assets_dir, "intro", f"gengar_{number}.png"))
- for number, label in enumerate((
- "FightIntroFrontMon", "FightIntroFrontMon2",
- "FightIntroFrontMon3"), start=1):
- raw_2bpp(
- label, 48, 48, f"intro/red_nidorino_{number}.png",
- transparent=True, columns=True)
+ if _has_symbol(symbols, "FightIntroFrontMon"):
+ for number, label in enumerate((
+ "FightIntroFrontMon", "FightIntroFrontMon2",
+ "FightIntroFrontMon3"), start=1):
+ raw_2bpp(
+ label, 48, 48, f"intro/red_nidorino_{number}.png",
+ transparent=True, columns=True)
+ else:
+ blank = Image.new("RGBA", (48, 48), (255, 255, 255, 0))
+ for number in (1, 2, 3):
+ _save_png(
+ blank, os.path.join(
+ assets_dir, "intro", f"red_nidorino_{number}.png"))
for number in (1, 2):
_write_compressed_pic(
@@ -1864,10 +2067,16 @@ def build(rom, symbols, manifest, out_dir, assets_dir, datasets):
def main():
parser = argparse.ArgumentParser(description=__doc__)
- parser.add_argument("--rom", required=True, help="canonical Pokemon Red ROM")
parser.add_argument(
- "--manifest",
- default=os.path.join(os.path.dirname(__file__), "rom_manifest.json"))
+ "--rom", required=True,
+ help="canonical US Pokemon Red, Blue, or Yellow ROM")
+ parser.add_argument(
+ "--version", choices=sorted(VERSION_MANIFESTS), default="red",
+ help="select the shipped manifest for this version (default: red)")
+ parser.add_argument(
+ "--manifest", default=None,
+ help="explicit manifest path (overrides --version default path; "
+ "RomImage hash still comes from the file's romSha1)")
parser.add_argument("--out", default="data/generated")
parser.add_argument("--assets", default="assets/generated")
parser.add_argument("--clean", action="store_true")
@@ -1877,8 +2086,13 @@ def main():
args = parser.parse_args()
try:
- manifest = load_manifest(args.manifest)
- rom = RomImage(args.rom, manifest["romSha1"])
+ manifest_explicit = args.manifest is not None
+ manifest_path = resolve_manifest_path(args.version, args.manifest)
+ manifest = load_manifest(manifest_path)
+ version = version_for_manifest(
+ manifest, args.version, manifest_explicit=manifest_explicit)
+ expected_sha1 = manifest.get("romSha1") or VERSION_SHA1[version]
+ rom = RomImage(args.rom, expected_sha1)
symbols = SymbolTable(manifest["symbols"])
except (OSError, ValueError, KeyError, json.JSONDecodeError) as exc:
print(f"error: {exc}", file=sys.stderr)
@@ -1896,7 +2110,8 @@ def main():
except (ValueError, KeyError, IndexError) as exc:
print(f"error: {exc}", file=sys.stderr)
return 1
- print(f"\ndone: decoded {', '.join(datasets)} from ROM {rom.sha1}")
+ print(
+ f"\ndone: decoded {', '.join(datasets)} from {version} ROM {rom.sha1}")
return 0
diff --git a/tools/extract/field.py b/tools/extract/field.py
index 898fb298..36740642 100644
--- a/tools/extract/field.py
+++ b/tools/extract/field.py
@@ -755,14 +755,14 @@ def parse_badge_gates(pokered):
def parse_preset_names(pokered):
- """constants/player_constants.asm: the _RED preset name menus.
+ """constants/player_constants.asm: preset name menus.
The naming menus (engine/movie/oak_speech/oak_speech2.asm with
data/player/names.asm / names_list.asm) offer NEW NAME plus these
- three presets each.
+ three presets each. Red/Blue gate the lists with IF DEF(_RED)/_BLUE;
+ Yellow ships a single ungated set (YELLOW/ASH/JACK, BLUE/GARY/JOHN).
+ read_asm resolves version conditionals via util.ASM_DEFINES.
"""
- # read_asm resolves the version conditionals (util.ASM_DEFINES), so
- # only the _RED name set reaches us
player, rival = [], []
path = os.path.join(pokered, "constants/player_constants.asm")
for lineno, line in read_asm(path):
@@ -1116,24 +1116,16 @@ def parse_credits(pokered):
os.path.join(pokered, "constants/credits_constants.asm"),
stop_at="NUM_CRED_STRINGS")
- # CreditsTextPointers: CRED_* value -> string label
+ # CreditsTextPointers: CRED_* value -> string label.
+ # Version-gated CredVersion / CreditsText_Version bodies (Red/Blue IF
+ # DEF) are resolved by read_asm via util.ASM_DEFINES; Yellow has no
+ # gates and a single "YELLOW VERSION" string.
pointers = []
strings = {}
- skip = False
label = None
path = os.path.join(pokered, "data/credits/credits_text.asm")
for lineno, line in read_asm(path):
s = line.strip()
- if re.match(r"IF\s+DEF\(_RED\)", s):
- continue
- if re.match(r"IF\s+DEF\(", s):
- skip = True
- continue
- if s == "ENDC":
- skip = False
- continue
- if skip:
- continue
m = re.match(r"dw\s+(\w+)$", s)
if m:
pointers.append(m.group(1))
@@ -1142,6 +1134,7 @@ def parse_credits(pokered):
if m and m.group(1) != "CreditsTextPointers":
label = m.group(1)
continue
+ # Optional trailing @ terminator (Yellow omits it on some lines).
m = re.match(r'db\s+(-\d+),\s*"([^"]*)"$', s)
if m and label:
strings[label] = {
@@ -1445,9 +1438,20 @@ def extract(pokered, out_dir):
or badge_gates["ROUTE_23"]["guards"][-1]["badge"] != "CASCADEBADGE" \
or len(badge_gates["ROUTE_22_GATE"]["coords"]) != 2:
util.die("badge gate extraction sanity check failed")
- if "RED" not in preset_names["player"] or "BLUE" not in preset_names["rival"] \
- or len(preset_names["player"]) != 3 or len(preset_names["rival"]) != 3:
+ if len(preset_names["player"]) != 3 or len(preset_names["rival"]) != 3:
util.die("preset name extraction sanity check failed")
+ # Red expects RED/ASH/JACK + BLUE/GARY/JOHN. Yellow ships YELLOW/... with
+ # no IF DEF gates; Blue swaps player/rival. Only enforce the Red pair when
+ # building Red (ASM_DEFINES has _RED) or when RED already appears.
+ if "_RED" in util.ASM_DEFINES or "RED" in preset_names["player"]:
+ if "YELLOW" in preset_names["player"]:
+ pass # pokeyellow ungated presets; Red name check does not apply
+ elif "RED" not in preset_names["player"] \
+ or "BLUE" not in preset_names["rival"]:
+ util.die("preset name extraction sanity check failed")
+ elif "YELLOW" in preset_names["player"]:
+ if "BLUE" not in preset_names["rival"]:
+ util.die("preset name extraction sanity check failed")
if "ROCK_TUNNEL_1F" not in dark_maps["maps"]:
util.die("dark map extraction sanity check failed")
if warp_carpets["tiles"]["down"] != [0x01, 0x12, 0x17, 0x3D, 0x04, 0x18, 0x33] \
diff --git a/tools/lua_to_json.lua b/tools/lua_to_json.lua
new file mode 100644
index 00000000..2d404f0b
--- /dev/null
+++ b/tools/lua_to_json.lua
@@ -0,0 +1,102 @@
+-- Dump one generated data table as JSON.
+--
+-- luajit tools/lua_to_json.lua data/generated/maps.lua
+--
+-- The generated tables are plain data (the extractor serializes them with no
+-- functions or cycles), so a straight recursive encode is enough. This exists
+-- so Python tooling -- tools/tiled_export.py -- can read the same records the
+-- engine reads without carrying a Lua parser of its own, which is the usual
+-- way those two drift apart.
+
+local path = ...
+if not path then
+ io.stderr:write("usage: luajit tools/lua_to_json.lua \n")
+ os.exit(2)
+end
+
+local chunk, err = loadfile(path)
+if not chunk then
+ io.stderr:write("cannot load " .. path .. ": " .. tostring(err) .. "\n")
+ os.exit(1)
+end
+local root = chunk()
+
+local ESCAPES = {
+ ['"'] = '\\"', ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f",
+ ["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t",
+}
+
+local function encodeString(s)
+ return '"' .. s:gsub('[%c"\\]', function(c)
+ return ESCAPES[c] or string.format("\\u%04x", c:byte())
+ end) .. '"'
+end
+
+local function encodeNumber(n)
+ if n ~= n or n == math.huge or n == -math.huge then
+ error("non-finite number in " .. path)
+ end
+ -- integers must not pick up a ".0": tile and block ids are compared as
+ -- integers on the Python side and in the exported Lua
+ if n % 1 == 0 then return string.format("%d", n) end
+ return string.format("%.17g", n)
+end
+
+-- A table is an array when its keys are exactly 1..#t. Empty tables encode as
+-- [] and the reader coerces; nothing in the generated data distinguishes an
+-- empty list from an empty map.
+local function isArray(t)
+ local count = 0
+ for k in pairs(t) do
+ if type(k) ~= "number" or k % 1 ~= 0 or k < 1 then return false end
+ count = count + 1
+ end
+ return count == #t
+end
+
+local out = {}
+local function emit(s) out[#out + 1] = s end
+
+local function encode(value)
+ local kind = type(value)
+ if value == nil then
+ emit("null")
+ elseif kind == "boolean" then
+ emit(value and "true" or "false")
+ elseif kind == "number" then
+ emit(encodeNumber(value))
+ elseif kind == "string" then
+ emit(encodeString(value))
+ elseif kind == "table" then
+ if isArray(value) then
+ emit("[")
+ for i = 1, #value do
+ if i > 1 then emit(",") end
+ encode(value[i])
+ end
+ emit("]")
+ else
+ -- sort keys so a regenerated dump is byte-stable and diffable
+ local keys = {}
+ for k in pairs(value) do keys[#keys + 1] = k end
+ table.sort(keys, function(a, b)
+ if type(a) == type(b) then return a < b end
+ return type(a) == "number"
+ end)
+ emit("{")
+ for i, k in ipairs(keys) do
+ if i > 1 then emit(",") end
+ emit(encodeString(tostring(k)))
+ emit(":")
+ encode(value[k])
+ end
+ emit("}")
+ end
+ else
+ error("cannot encode a " .. kind .. " in " .. path)
+ end
+end
+
+encode(root)
+io.write(table.concat(out))
+io.write("\n")
diff --git a/tools/make_yellow_manifest.py b/tools/make_yellow_manifest.py
new file mode 100755
index 00000000..f1527e2b
--- /dev/null
+++ b/tools/make_yellow_manifest.py
@@ -0,0 +1,478 @@
+#!/usr/bin/env python3
+"""Derive the Pokemon Yellow import manifest from the shipped Red manifest.
+
+Yellow is a separate pret tree (pokeyellow), not a `_YELLOW` flip of pokered.
+Most of the ~3268 Red manifest symbols still exist under the same names in
+pokeyellow.sym (~3123 with shifted addresses). The remainder need aliases,
+synthetic addresses (Mew in BaseStats), or omission (FightIntro* — Yellow's
+intro movie is different; RomExtractor must skip those).
+
+Map/object/sprite/tileset/text metadata diverge enough that those sections are
+rebuilt from pokeyellow source (same helpers as make_rom_manifest.py), while
+ROM-address tables and other Red-shaped sections keep the derive-and-remap
+path.
+
+Usage mirrors make_blue_manifest.py: deep-copy Red, remap symbols, override
+version-gated field bits, write tools/rom_manifest_yellow.json.
+"""
+
+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 extract import constants, field, util # noqa: E402
+from make_rom_manifest import ( # noqa: E402
+ _music_label,
+ map_metadata,
+ simple_constants,
+ sprite_metadata,
+ text_metadata,
+ tileset_metadata,
+)
+import re # noqa: E402
+from rom_data import SymbolTable # noqa: E402
+from yellow_symbol_aliases import ( # noqa: E402
+ FAN_CLUB_ID_RENAMES,
+ GAME_CORNER_ID_RENAMES,
+ MAP_CONST_RENAMES,
+ MAP_LABEL_RENAMES,
+ OMIT_INTRO_SYMBOLS,
+ SYMBOL_ALIASES,
+)
+
+try:
+ from rom_data import CANONICAL_YELLOW_SHA1
+except ImportError: # pragma: no cover — constant lands with GameVersion work
+ CANONICAL_YELLOW_SHA1 = "cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1"
+
+DEV = "/Users/bryanbassett/Documents/development"
+DEFAULT_RED = os.path.join(os.path.dirname(__file__), "rom_manifest.json")
+DEFAULT_OUT = os.path.join(os.path.dirname(__file__), "rom_manifest_yellow.json")
+DEFAULT_POKEYELLOW = os.path.join(DEV, "pokeyellow")
+DEFAULT_SYMBOLS = os.path.join(DEV, "pokeyellow-symbols/pokeyellow.sym")
+
+BASE_STATS_ENTRY_SIZE = 28
+MEW_DEX_NUMBER = 151
+
+# Yellow-only symbols Red never referenced. Title / intro / CGB tables must
+# be injected so RomExtractor can rip them (make_yellow_manifest only remaps
+# Red's name set by default).
+YELLOW_EXTRA_SYMBOLS = (
+ "TitlePikachuBGGraphics",
+ "TitlePikachuOBGraphics",
+ "TitleScreenPikachuTilemap",
+ "TitleScreenPikaBubbleTilemap",
+ "TitleScreenPokemonLogoTilemap",
+ "PokemonLogoCornerGraphics",
+ "YellowIntroGraphics1",
+ "YellowIntroGraphics2",
+ "YellowIntroCloudGFX",
+ "PikachuCriesPointerTable",
+ "CGBBasePalettes",
+ # the five Pikachu-only emotion bubbles (emotion_bubbles.asm)
+ "SkullEmote",
+ "HeartEmote",
+ "BoltEmote",
+ "ZzzEmote",
+ "FishEmote",
+ # Surfing Pikachu minigame sheets (gfx/surfing_pikachu.asm)
+ "SurfingPikachu1Graphics1",
+ "SurfingPikachu1Graphics2",
+ "SurfingPikachu1Graphics3",
+)
+
+# Yellow-only dialogue whose bank labels carry no leading underscore, so
+# the text-label scan misses them (scripts/CeruleanMelaniesHouse.asm --
+# the Bulbasaur gift and the pet flavor lines).
+YELLOW_EXTRA_TEXT_LABELS = (
+ "MelanieText1", "MelanieText2", "MelanieText3",
+ "MelanieText4", "MelanieText5",
+ "MelanieBulbasaurText", "MelanieOddishText", "MelanieSandshrewText",
+)
+
+YELLOW_EXTRA_PALETTES = (
+ "PIKACHUS_BEACH",
+ "PIKACHU_PORTRAIT",
+ "PIKACHUS_BEACH_TITLE",
+)
+
+
+def _rename_keys(obj, renames):
+ """Recursively rename dict keys (and rewrite matching string values)."""
+ if isinstance(obj, dict):
+ out = {}
+ for key, value in obj.items():
+ new_key = renames.get(key, key)
+ out[new_key] = _rename_keys(value, renames)
+ return out
+ if isinstance(obj, list):
+ return [_rename_keys(item, renames) for item in obj]
+ if isinstance(obj, str):
+ return renames.get(obj, obj)
+ return obj
+
+
+def _replace_strings(obj, renames):
+ """Recursively replace string values (and list entries) via renames."""
+ if isinstance(obj, dict):
+ return {k: _replace_strings(v, renames) for k, v in obj.items()}
+ if isinstance(obj, list):
+ return [_replace_strings(item, renames) for item in obj]
+ if isinstance(obj, str):
+ return renames.get(obj, obj)
+ return obj
+
+
+def _drop_strings(obj, dropped):
+ """Remove dropped names from lists and as dict keys / string values."""
+ if isinstance(obj, dict):
+ out = {}
+ for key, value in obj.items():
+ if key in dropped:
+ continue
+ if isinstance(value, str) and value in dropped:
+ continue
+ out[key] = _drop_strings(value, dropped)
+ return out
+ if isinstance(obj, list):
+ result = []
+ for item in obj:
+ if isinstance(item, str) and item in dropped:
+ continue
+ result.append(_drop_strings(item, dropped))
+ return result
+ return obj
+
+
+def _resolve_mew_base_stats(yellow_symbols):
+ base = yellow_symbols.by_name.get("BaseStats")
+ if base is None:
+ raise SystemExit("pokeyellow.sym missing BaseStats (needed for Mew)")
+ return [base.bank, base.address + (MEW_DEX_NUMBER - 1) * BASE_STATS_ENTRY_SIZE]
+
+
+def _rebuild_map_songs(pokeyellow, map_order, music_headers):
+ """Zip pokeyellow data/maps/songs.asm onto the Yellow mapOrder."""
+ map_song_consts = []
+ path = os.path.join(pokeyellow, "data/maps/songs.asm")
+ for _, line in util.read_asm(path):
+ match = re.match(r"db\s+(MUSIC_\w+),", line.strip())
+ if match:
+ map_song_consts.append(match.group(1))
+ if len(map_song_consts) != len(map_order):
+ raise SystemExit(
+ f"Yellow songs.asm has {len(map_song_consts)} entries but "
+ f"mapOrder has {len(map_order)}")
+
+ out = {}
+ missing = []
+ for map_name, const_name in zip(map_order, map_song_consts):
+ label = _music_label(const_name, music_headers)
+ if label not in music_headers:
+ missing.append(f"{map_name}:{const_name}->{label}")
+ continue
+ out[map_name] = label
+ if missing:
+ raise SystemExit(
+ "Yellow map songs could not resolve music headers: "
+ + ", ".join(missing[:12])
+ + (" ..." if len(missing) > 12 else ""))
+ return out
+
+
+def _rebuild_yellow_sourced(yellow, pokeyellow):
+ """Replace sections that Yellow authors differently from Red."""
+ map_order, map_dims = constants.extract_map_constants(pokeyellow)
+ tileset_order = [
+ n for n in simple_constants(
+ pokeyellow, "constants/tileset_constants.asm") if n
+ ]
+ sprite_consts = simple_constants(
+ pokeyellow, "constants/sprite_constants.asm")
+ sprite_order = [n or "UNUSED" for n in sprite_consts[1:]]
+ tile_animations = [
+ name or "UNUSED"
+ for name in simple_constants(
+ pokeyellow, "constants/map_data_constants.asm")
+ if name and name.startswith("TILEANIM_")
+ ]
+
+ yellow["constants"]["mapOrder"] = map_order
+ yellow["constants"]["maps"] = map_dims
+ yellow["constants"]["tilesetOrder"] = tileset_order
+ yellow["constants"]["spriteOrder"] = sprite_order
+
+ yellow["maps"] = map_metadata(pokeyellow, map_dims)
+ yellow["tilesets"] = tileset_metadata(pokeyellow, tileset_order)
+ yellow["sprites"] = sprite_metadata(pokeyellow, sprite_order)
+ yellow["text"] = text_metadata(pokeyellow)
+ yellow["tileAnimations"] = tile_animations
+
+ yellow["audio"]["mapSongs"] = _rebuild_map_songs(
+ pokeyellow, map_order, yellow["audio"]["musicHeaders"])
+ # Red's positional header mapping lands Yellow's intro song
+ # (pokeyellow Music_YellowIntro, 1f:4294) under the name
+ # Music_IntroBattle; expose it under its own name too so the Yellow
+ # intro movie state can ask for the right label.
+ headers = yellow["audio"]["musicHeaders"]
+ if "Music_YellowIntro" not in headers and "Music_IntroBattle" in headers:
+ headers["Music_YellowIntro"] = dict(headers["Music_IntroBattle"])
+ return {
+ "mapCount": len(map_order),
+ "mapMeta": len(yellow["maps"]),
+ "tilesets": len(tileset_order),
+ "sprites": len(sprite_order),
+ "textLabels": len(yellow["text"]["labels"]),
+ }
+
+
+def derive(red, pokeyellow, symbols_path):
+ """Return the Yellow manifest derived from the Red manifest dict."""
+ yellow = copy.deepcopy(red)
+ yellow["romSha1"] = CANONICAL_YELLOW_SHA1
+ yellow_symbols = SymbolTable(symbols_path)
+
+ omit = set(OMIT_INTRO_SYMBOLS)
+ dropped = {name for name, alias in SYMBOL_ALIASES.items() if alias is None}
+ dropped |= omit
+ symbol_renames = {
+ name: alias for name, alias in SYMBOL_ALIASES.items() if alias
+ }
+
+ # Structural renames for Red-shaped leftovers (field townMap, etc.) before
+ # Yellow-sourced sections overwrite maps/text/sprites/tilesets.
+ structural = {}
+ structural.update(MAP_CONST_RENAMES)
+ structural.update(MAP_LABEL_RENAMES)
+ structural.update(GAME_CORNER_ID_RENAMES)
+ structural.update(FAN_CLUB_ID_RENAMES)
+ structural.update(symbol_renames)
+ yellow = _rename_keys(yellow, structural)
+ yellow = _replace_strings(yellow, structural)
+ yellow = _drop_strings(yellow, dropped)
+
+ rebuilt = _rebuild_yellow_sourced(yellow, pokeyellow)
+
+ for label in YELLOW_EXTRA_TEXT_LABELS:
+ if label not in yellow["text"]["labels"]:
+ yellow["text"]["labels"].append(label)
+
+ # Rebuild symbols from Red's name set with Yellow addresses / aliases,
+ # then ensure every Yellow-sourced label/header is present.
+ resolved = {}
+ missing = []
+ alias_hits = 0
+ for name in red["symbols"]:
+ if name in omit or name in dropped:
+ continue
+ if name == "MewBaseStats":
+ resolved["MewBaseStats"] = _resolve_mew_base_stats(yellow_symbols)
+ alias_hits += 1
+ continue
+ target = symbol_renames.get(name, name)
+ if name in symbol_renames:
+ alias_hits += 1
+ # Structural map-header rename may already have changed the key.
+ target = MAP_LABEL_RENAMES.get(target, target)
+ if target.endswith("_h"):
+ base = target[:-2]
+ target = MAP_LABEL_RENAMES.get(base, base) + "_h" \
+ if base in MAP_LABEL_RENAMES else target
+ symbol = yellow_symbols.by_name.get(target)
+ if symbol is None:
+ # Drop Red-only symbols that Yellow-sourced sections no longer need.
+ continue
+ resolved[target] = [symbol.bank, symbol.address]
+
+ print(
+ "warning: omitting Yellow-incompatible intro symbols "
+ f"(RomExtractor must skip): {', '.join(OMIT_INTRO_SYMBOLS)}"
+ )
+
+ for label in yellow["text"]["labels"]:
+ if label in resolved:
+ continue
+ symbol = yellow_symbols.by_name.get(label)
+ if symbol is None:
+ missing.append(label)
+ continue
+ resolved[label] = [symbol.bank, symbol.address]
+ for spec in yellow["maps"].values():
+ header = spec["label"] + "_h"
+ if header in resolved:
+ continue
+ symbol = yellow_symbols.by_name.get(header)
+ if symbol is None:
+ missing.append(header)
+ continue
+ resolved[header] = [symbol.bank, symbol.address]
+
+ # Pointer asm labels (ViridianPokeCenterChanseyText etc.) also need symbols
+ # when extract_text resolves through them.
+ for pointers in yellow["text"]["pointers"].values():
+ for spec in pointers.values():
+ for key in ("label", "text"):
+ name = spec.get(key)
+ if not name or name in resolved:
+ continue
+ symbol = yellow_symbols.by_name.get(name)
+ if symbol is not None:
+ resolved[name] = [symbol.bank, symbol.address]
+
+ yellow["symbols"] = resolved
+
+ for name in YELLOW_EXTRA_SYMBOLS:
+ symbol = yellow_symbols.by_name.get(name)
+ if symbol is None:
+ raise SystemExit(f"pokeyellow.sym missing Yellow extra symbol {name}")
+ yellow["symbols"][name] = [symbol.bank, symbol.address]
+
+ # Yellow-only songs live in music bank $20, which Red's engine never
+ # had; ship the bank in the audio pack and add their headers.
+ yellow["audio"]["programBanks"] = [2, 8, 31, 32]
+ for name in ("Music_MeetJessieJames", "Music_SurfingPikachu",
+ "Music_GBPrinter"):
+ symbol = yellow_symbols.by_name.get(name)
+ if symbol is None:
+ raise SystemExit(f"pokeyellow.sym missing Yellow song {name}")
+ yellow["audio"]["musicHeaders"][name] = {
+ "bank": symbol.bank, "address": symbol.address, "engine": 3,
+ }
+
+ # SuperPalettes grows by three Yellow-only SGB entries after GAMEFREAK.
+ order = list(yellow.get("paletteOrder") or [])
+ for name in YELLOW_EXTRA_PALETTES:
+ if name not in order:
+ order.append(name)
+ yellow["paletteOrder"] = order
+
+ # Yellow appends ICON_PIKACHU ($a) after Red's ten party icons
+ # (constants/icon_constants.asm); MonPartyData nybble $a resolves to
+ # it, drawn from the overworld PikachuSprite sheet.
+ icons = list(yellow.get("iconOrder") or [])
+ if "PIKACHU" not in icons:
+ icons.append("PIKACHU")
+ yellow["iconOrder"] = icons
+
+ still_missing = []
+ for name in yellow["symbols"]:
+ if name == "MewBaseStats":
+ continue
+ if name not in yellow_symbols.by_name:
+ still_missing.append(name)
+ if still_missing or missing:
+ raise SystemExit(
+ "pokeyellow.sym is missing symbols the manifest needs: "
+ + ", ".join(sorted(set(still_missing + missing))[:20])
+ + (" ..." if len(set(still_missing + missing)) > 20 else ""))
+
+ # Version-gated field bits from pokeyellow.
+ saved = util.ASM_DEFINES
+ util.ASM_DEFINES = set()
+ try:
+ yellow["field"]["presetNames"] = field.parse_preset_names(pokeyellow)
+ try:
+ yellow["field"]["credits"] = field.parse_credits(pokeyellow)
+ except SystemExit as exc:
+ print(f"warning: parse_credits failed ({exc}); keeping Red credits")
+ # TODO: hand-author a Yellow credits banner if pret layout drifts.
+ finally:
+ util.ASM_DEFINES = saved
+
+ presets = yellow["field"]["presetNames"]
+ if "YELLOW" not in presets["player"] or "BLUE" not in presets["rival"]:
+ raise SystemExit(
+ f"Yellow preset-name parse unexpected: {presets!r}")
+
+ # Fixed Pikachu title (no TitleMons cycle); extractor fills image paths.
+ title = yellow["field"].setdefault("title", {})
+ title["layout"] = "yellow_pikachu"
+ title["cycleSpecies"] = []
+ title["music"] = title.get("music") or "Music_TitleScreen"
+ title["pikachuBg"] = {
+ "path": "assets/generated/title/pikachu_bg.png",
+ "width": 128, "height": 32,
+ }
+ title["pikachuOb"] = {
+ "path": "assets/generated/title/pikachu_ob.png",
+ "width": 96, "height": 8,
+ }
+ title["pikachu"] = {
+ "path": "assets/generated/title/pikachu.png",
+ "width": 96, "height": 72,
+ }
+ title["pikaBubble"] = {
+ "path": "assets/generated/title/pika_bubble.png",
+ "width": 56, "height": 32,
+ }
+
+ # Yellow's emote sheet grows the five Pikachu-only bubbles
+ # (engine/overworld/emotion_bubbles.asm Skull/Heart/Bolt/Zzz/FishEmote,
+ # constants/script_constants.asm order); RomExtractor rips whatever
+ # this bubble list names.
+ yellow_bubbles = ["EXCLAMATION_BUBBLE", "QUESTION_BUBBLE", "SMILE_BUBBLE",
+ "SKULL_BUBBLE", "HEART_BUBBLE", "BOLT_BUBBLE",
+ "ZZZ_BUBBLE", "FISH_BUBBLE"]
+ yellow["field"]["emotionBubbles"] = {
+ "path": "assets/generated/emotes.png",
+ "width": 16 * len(yellow_bubbles), "height": 16,
+ "bubbles": [{"name": name, "x": i * 16, "y": 0, "w": 16, "h": 16}
+ for i, name in enumerate(yellow_bubbles)],
+ }
+
+ # Ensure Melanie / Summer Beach town-map entries exist after rebuild.
+ locations = yellow["field"]["townMap"]["locations"]
+ if "CERULEAN_MELANIES_HOUSE" not in locations \
+ and "CERULEAN_CITY" in locations:
+ locations["CERULEAN_MELANIES_HOUSE"] = dict(locations["CERULEAN_CITY"])
+ if "SUMMER_BEACH_HOUSE" not in locations and "ROUTE_19" in locations:
+ locations["SUMMER_BEACH_HOUSE"] = dict(locations["ROUTE_19"])
+
+ meta = {
+ "aliasCount": alias_hits,
+ "omittedIntro": list(OMIT_INTRO_SYMBOLS),
+ "droppedSymbols": sorted(dropped - omit),
+ "rebuilt": rebuilt,
+ }
+ return yellow, meta
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--red", default=DEFAULT_RED,
+ help="shipped Red manifest to derive from")
+ parser.add_argument("--pokeyellow", default=DEFAULT_POKEYELLOW,
+ help="pokeyellow source checkout")
+ parser.add_argument("--symbols", default=DEFAULT_SYMBOLS,
+ help="pokeyellow.sym symbol file")
+ parser.add_argument("--out", default=DEFAULT_OUT)
+ args = parser.parse_args()
+
+ pokeyellow = os.path.abspath(args.pokeyellow)
+ if not os.path.isfile(os.path.join(pokeyellow, "main.asm")):
+ raise SystemExit(f"{pokeyellow} is not a pokeyellow checkout")
+ with open(args.red, encoding="utf-8") as f:
+ red = json.load(f)
+
+ yellow, meta = derive(red, pokeyellow, os.path.abspath(args.symbols))
+ with open(args.out, "w", encoding="utf-8", newline="\n") as f:
+ json.dump(yellow, f, ensure_ascii=False, indent=2, sort_keys=True)
+ f.write("\n")
+
+ print(f"wrote {args.out}")
+ print(f"symbols: {len(yellow['symbols'])}")
+ print(f"aliases applied: {meta['aliasCount']}")
+ print(f"omitted intro: {meta['omittedIntro']}")
+ print(f"dropped: {len(meta['droppedSymbols'])} "
+ f"({', '.join(meta['droppedSymbols'][:8])}...)")
+ print(f"rebuilt: {meta['rebuilt']}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tools/rom_data.py b/tools/rom_data.py
index 800e1652..a7203b9b 100644
--- a/tools/rom_data.py
+++ b/tools/rom_data.py
@@ -10,6 +10,7 @@ from dataclasses import dataclass
CANONICAL_RED_SHA1 = "ea9bcae617fdf159b045185467ae58b2e4a48b9a"
CANONICAL_BLUE_SHA1 = "d7037c83e1ae5b39bde3c30787637ba1d4c48ce2"
+CANONICAL_YELLOW_SHA1 = "cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1"
ROM_BANK_SIZE = 0x4000
diff --git a/tools/rom_manifest_yellow.json b/tools/rom_manifest_yellow.json
new file mode 100644
index 00000000..9d565854
--- /dev/null
+++ b/tools/rom_manifest_yellow.json
@@ -0,0 +1,50480 @@
+{
+ "audio": {
+ "battle": {
+ "final": "Music_FinalBattle",
+ "gym": "Music_GymLeaderBattle",
+ "gymWin": "Music_DefeatedGymLeader",
+ "trainer": "Music_TrainerBattle",
+ "trainerWin": "Music_DefeatedTrainer",
+ "wild": "Music_WildBattle",
+ "wildWin": "Music_DefeatedWildMon"
+ },
+ "cryData": {
+ "address": 21574,
+ "bank": 14
+ },
+ "cryHeaders": {
+ "0": {
+ "address": 16444,
+ "bank": 2,
+ "engine": 1
+ },
+ "1": {
+ "address": 16453,
+ "bank": 2,
+ "engine": 1
+ },
+ "10": {
+ "address": 16534,
+ "bank": 2,
+ "engine": 1
+ },
+ "11": {
+ "address": 16543,
+ "bank": 2,
+ "engine": 1
+ },
+ "12": {
+ "address": 16552,
+ "bank": 2,
+ "engine": 1
+ },
+ "13": {
+ "address": 16561,
+ "bank": 2,
+ "engine": 1
+ },
+ "14": {
+ "address": 16570,
+ "bank": 2,
+ "engine": 1
+ },
+ "15": {
+ "address": 16579,
+ "bank": 2,
+ "engine": 1
+ },
+ "16": {
+ "address": 16588,
+ "bank": 2,
+ "engine": 1
+ },
+ "17": {
+ "address": 16597,
+ "bank": 2,
+ "engine": 1
+ },
+ "18": {
+ "address": 16606,
+ "bank": 2,
+ "engine": 1
+ },
+ "19": {
+ "address": 16615,
+ "bank": 2,
+ "engine": 1
+ },
+ "2": {
+ "address": 16462,
+ "bank": 2,
+ "engine": 1
+ },
+ "20": {
+ "address": 16624,
+ "bank": 2,
+ "engine": 1
+ },
+ "21": {
+ "address": 16633,
+ "bank": 2,
+ "engine": 1
+ },
+ "22": {
+ "address": 16642,
+ "bank": 2,
+ "engine": 1
+ },
+ "23": {
+ "address": 16651,
+ "bank": 2,
+ "engine": 1
+ },
+ "24": {
+ "address": 16660,
+ "bank": 2,
+ "engine": 1
+ },
+ "25": {
+ "address": 16669,
+ "bank": 2,
+ "engine": 1
+ },
+ "26": {
+ "address": 16678,
+ "bank": 2,
+ "engine": 1
+ },
+ "27": {
+ "address": 16687,
+ "bank": 2,
+ "engine": 1
+ },
+ "28": {
+ "address": 16696,
+ "bank": 2,
+ "engine": 1
+ },
+ "29": {
+ "address": 16705,
+ "bank": 2,
+ "engine": 1
+ },
+ "3": {
+ "address": 16471,
+ "bank": 2,
+ "engine": 1
+ },
+ "30": {
+ "address": 16714,
+ "bank": 2,
+ "engine": 1
+ },
+ "31": {
+ "address": 16723,
+ "bank": 2,
+ "engine": 1
+ },
+ "32": {
+ "address": 16732,
+ "bank": 2,
+ "engine": 1
+ },
+ "33": {
+ "address": 16741,
+ "bank": 2,
+ "engine": 1
+ },
+ "34": {
+ "address": 16750,
+ "bank": 2,
+ "engine": 1
+ },
+ "35": {
+ "address": 16759,
+ "bank": 2,
+ "engine": 1
+ },
+ "36": {
+ "address": 16768,
+ "bank": 2,
+ "engine": 1
+ },
+ "37": {
+ "address": 16777,
+ "bank": 2,
+ "engine": 1
+ },
+ "4": {
+ "address": 16480,
+ "bank": 2,
+ "engine": 1
+ },
+ "5": {
+ "address": 16489,
+ "bank": 2,
+ "engine": 1
+ },
+ "6": {
+ "address": 16498,
+ "bank": 2,
+ "engine": 1
+ },
+ "7": {
+ "address": 16507,
+ "bank": 2,
+ "engine": 1
+ },
+ "8": {
+ "address": 16516,
+ "bank": 2,
+ "engine": 1
+ },
+ "9": {
+ "address": 16525,
+ "bank": 2,
+ "engine": 1
+ }
+ },
+ "mapSongs": {
+ "AGATHAS_ROOM": "Music_PokemonTower",
+ "BIKE_SHOP": "Music_Cities2",
+ "BILLS_HOUSE": "Music_Cities2",
+ "BLUES_HOUSE": "Music_PalletTown",
+ "BRUNOS_ROOM": "Music_Dungeon1",
+ "CELADON_CHIEF_HOUSE": "Music_Celadon",
+ "CELADON_CITY": "Music_Celadon",
+ "CELADON_DINER": "Music_Celadon",
+ "CELADON_GYM": "Music_Gym",
+ "CELADON_HOTEL": "Music_Celadon",
+ "CELADON_MANSION_1F": "Music_Celadon",
+ "CELADON_MANSION_2F": "Music_Celadon",
+ "CELADON_MANSION_3F": "Music_Celadon",
+ "CELADON_MANSION_ROOF": "Music_Celadon",
+ "CELADON_MANSION_ROOF_HOUSE": "Music_Celadon",
+ "CELADON_MART_1F": "Music_Pokecenter",
+ "CELADON_MART_2F": "Music_Pokecenter",
+ "CELADON_MART_3F": "Music_Pokecenter",
+ "CELADON_MART_4F": "Music_Pokecenter",
+ "CELADON_MART_5F": "Music_Pokecenter",
+ "CELADON_MART_ELEVATOR": "Music_Pokecenter",
+ "CELADON_MART_ROOF": "Music_Pokecenter",
+ "CELADON_POKECENTER": "Music_Pokecenter",
+ "CERULEAN_BADGE_HOUSE": "Music_Cities1",
+ "CERULEAN_CAVE_1F": "Music_Dungeon1",
+ "CERULEAN_CAVE_2F": "Music_Dungeon1",
+ "CERULEAN_CAVE_B1F": "Music_Dungeon1",
+ "CERULEAN_CITY": "Music_Cities2",
+ "CERULEAN_GYM": "Music_Gym",
+ "CERULEAN_MART": "Music_Pokecenter",
+ "CERULEAN_MELANIES_HOUSE": "Music_Cities2",
+ "CERULEAN_POKECENTER": "Music_Pokecenter",
+ "CERULEAN_TRASHED_HOUSE": "Music_Cities2",
+ "CERULEAN_TRASHED_HOUSE_COPY": "Music_Dungeon3",
+ "CHAMPIONS_ROOM": "Music_IndigoPlateau",
+ "CINNABAR_GYM": "Music_Gym",
+ "CINNABAR_ISLAND": "Music_Cinnabar",
+ "CINNABAR_LAB": "Music_Cinnabar",
+ "CINNABAR_LAB_FOSSIL_ROOM": "Music_Cinnabar",
+ "CINNABAR_LAB_METRONOME_ROOM": "Music_Cinnabar",
+ "CINNABAR_LAB_TRADE_ROOM": "Music_Cinnabar",
+ "CINNABAR_MART": "Music_Pokecenter",
+ "CINNABAR_MART_COPY": "Music_Cinnabar",
+ "CINNABAR_POKECENTER": "Music_Pokecenter",
+ "COLOSSEUM": "Music_Celadon",
+ "COPYCATS_HOUSE_1F": "Music_Cities1",
+ "COPYCATS_HOUSE_2F": "Music_Cities1",
+ "DAYCARE": "Music_Cities1",
+ "DIGLETTS_CAVE": "Music_Dungeon2",
+ "DIGLETTS_CAVE_ROUTE_11": "Music_Dungeon2",
+ "DIGLETTS_CAVE_ROUTE_2": "Music_Dungeon2",
+ "FIGHTING_DOJO": "Music_Cities1",
+ "FUCHSIA_BILLS_GRANDPAS_HOUSE": "Music_Cities2",
+ "FUCHSIA_CITY": "Music_Cities2",
+ "FUCHSIA_GOOD_ROD_HOUSE": "Music_Cities2",
+ "FUCHSIA_GYM": "Music_Gym",
+ "FUCHSIA_MART": "Music_Pokecenter",
+ "FUCHSIA_MEETING_ROOM": "Music_Cities2",
+ "FUCHSIA_POKECENTER": "Music_Pokecenter",
+ "GAME_CORNER": "Music_GameCorner",
+ "GAME_CORNER_PRIZE_ROOM": "Music_Celadon",
+ "HALL_OF_FAME": "Music_PalletTown",
+ "INDIGO_PLATEAU": "Music_IndigoPlateau",
+ "INDIGO_PLATEAU_LOBBY": "Music_IndigoPlateau",
+ "LANCES_ROOM": "Music_IndigoPlateau",
+ "LAVENDER_CUBONE_HOUSE": "Music_Lavender",
+ "LAVENDER_MART": "Music_Pokecenter",
+ "LAVENDER_POKECENTER": "Music_Pokecenter",
+ "LAVENDER_TOWN": "Music_Lavender",
+ "LORELEIS_ROOM": "Music_Gym",
+ "MR_FUJIS_HOUSE": "Music_Lavender",
+ "MR_PSYCHICS_HOUSE": "Music_Cities1",
+ "MT_MOON_1F": "Music_Dungeon3",
+ "MT_MOON_B1F": "Music_Dungeon3",
+ "MT_MOON_B2F": "Music_Dungeon3",
+ "MT_MOON_POKECENTER": "Music_Pokecenter",
+ "MUSEUM_1F": "Music_Cities1",
+ "MUSEUM_2F": "Music_Cities1",
+ "NAME_RATERS_HOUSE": "Music_Cities2",
+ "OAKS_LAB": "Music_OaksLab",
+ "PALLET_TOWN": "Music_PalletTown",
+ "PEWTER_CITY": "Music_Cities1",
+ "PEWTER_GYM": "Music_Gym",
+ "PEWTER_MART": "Music_Pokecenter",
+ "PEWTER_NIDORAN_HOUSE": "Music_Cities1",
+ "PEWTER_POKECENTER": "Music_Pokecenter",
+ "PEWTER_SPEECH_HOUSE": "Music_Cities1",
+ "POKEMON_FAN_CLUB": "Music_Vermilion",
+ "POKEMON_MANSION_1F": "Music_CinnabarMansion",
+ "POKEMON_MANSION_2F": "Music_CinnabarMansion",
+ "POKEMON_MANSION_3F": "Music_CinnabarMansion",
+ "POKEMON_MANSION_B1F": "Music_CinnabarMansion",
+ "POKEMON_TOWER_1F": "Music_PokemonTower",
+ "POKEMON_TOWER_2F": "Music_PokemonTower",
+ "POKEMON_TOWER_3F": "Music_PokemonTower",
+ "POKEMON_TOWER_4F": "Music_PokemonTower",
+ "POKEMON_TOWER_5F": "Music_PokemonTower",
+ "POKEMON_TOWER_6F": "Music_PokemonTower",
+ "POKEMON_TOWER_7F": "Music_PokemonTower",
+ "POWER_PLANT": "Music_Dungeon1",
+ "REDS_HOUSE_1F": "Music_PalletTown",
+ "REDS_HOUSE_2F": "Music_PalletTown",
+ "ROCKET_HIDEOUT_B1F": "Music_Dungeon1",
+ "ROCKET_HIDEOUT_B2F": "Music_Dungeon1",
+ "ROCKET_HIDEOUT_B3F": "Music_Dungeon1",
+ "ROCKET_HIDEOUT_B4F": "Music_Dungeon1",
+ "ROCKET_HIDEOUT_ELEVATOR": "Music_Dungeon1",
+ "ROCK_TUNNEL_1F": "Music_Dungeon3",
+ "ROCK_TUNNEL_B1F": "Music_Dungeon3",
+ "ROCK_TUNNEL_POKECENTER": "Music_Pokecenter",
+ "ROUTE_1": "Music_Routes1",
+ "ROUTE_10": "Music_Routes3",
+ "ROUTE_11": "Music_Routes4",
+ "ROUTE_11_GATE_1F": "Music_Vermilion",
+ "ROUTE_11_GATE_2F": "Music_Vermilion",
+ "ROUTE_12": "Music_Routes4",
+ "ROUTE_12_GATE_1F": "Music_Cities1",
+ "ROUTE_12_GATE_2F": "Music_Cities1",
+ "ROUTE_12_SUPER_ROD_HOUSE": "Music_Celadon",
+ "ROUTE_13": "Music_Routes4",
+ "ROUTE_14": "Music_Routes4",
+ "ROUTE_15": "Music_Routes4",
+ "ROUTE_15_GATE_1F": "Music_Cities1",
+ "ROUTE_15_GATE_2F": "Music_Cities1",
+ "ROUTE_16": "Music_Routes3",
+ "ROUTE_16_FLY_HOUSE": "Music_Celadon",
+ "ROUTE_16_GATE_1F": "Music_Cities1",
+ "ROUTE_16_GATE_2F": "Music_Cities1",
+ "ROUTE_17": "Music_Routes3",
+ "ROUTE_18": "Music_Routes3",
+ "ROUTE_18_GATE_1F": "Music_Cities1",
+ "ROUTE_18_GATE_2F": "Music_Cities1",
+ "ROUTE_19": "Music_Routes3",
+ "ROUTE_2": "Music_Routes1",
+ "ROUTE_20": "Music_Routes3",
+ "ROUTE_21": "Music_Routes3",
+ "ROUTE_22": "Music_Routes3",
+ "ROUTE_22_GATE": "Music_Dungeon2",
+ "ROUTE_23": "Music_IndigoPlateau",
+ "ROUTE_24": "Music_Routes2",
+ "ROUTE_25": "Music_Routes2",
+ "ROUTE_2_GATE": "Music_Cities1",
+ "ROUTE_2_TRADE_HOUSE": "Music_Cities1",
+ "ROUTE_3": "Music_Routes3",
+ "ROUTE_4": "Music_Routes3",
+ "ROUTE_5": "Music_Routes3",
+ "ROUTE_5_GATE": "Music_Cities1",
+ "ROUTE_6": "Music_Routes3",
+ "ROUTE_6_GATE": "Music_Cities1",
+ "ROUTE_7": "Music_Routes3",
+ "ROUTE_7_GATE": "Music_Cities1",
+ "ROUTE_8": "Music_Routes3",
+ "ROUTE_8_GATE": "Music_Cities1",
+ "ROUTE_9": "Music_Routes3",
+ "SAFARI_ZONE_CENTER": "Music_SafariZone",
+ "SAFARI_ZONE_CENTER_REST_HOUSE": "Music_SafariZone",
+ "SAFARI_ZONE_EAST": "Music_SafariZone",
+ "SAFARI_ZONE_EAST_REST_HOUSE": "Music_SafariZone",
+ "SAFARI_ZONE_GATE": "Music_Cities2",
+ "SAFARI_ZONE_NORTH": "Music_SafariZone",
+ "SAFARI_ZONE_NORTH_REST_HOUSE": "Music_SafariZone",
+ "SAFARI_ZONE_SECRET_HOUSE": "Music_SafariZone",
+ "SAFARI_ZONE_WEST": "Music_SafariZone",
+ "SAFARI_ZONE_WEST_REST_HOUSE": "Music_SafariZone",
+ "SAFFRON_CITY": "Music_Cities1",
+ "SAFFRON_GYM": "Music_Gym",
+ "SAFFRON_MART": "Music_Pokecenter",
+ "SAFFRON_PIDGEY_HOUSE": "Music_Cities1",
+ "SAFFRON_POKECENTER": "Music_Pokecenter",
+ "SEAFOAM_ISLANDS_1F": "Music_Dungeon2",
+ "SEAFOAM_ISLANDS_B1F": "Music_Dungeon2",
+ "SEAFOAM_ISLANDS_B2F": "Music_Dungeon2",
+ "SEAFOAM_ISLANDS_B3F": "Music_Dungeon2",
+ "SEAFOAM_ISLANDS_B4F": "Music_Dungeon2",
+ "SILPH_CO_10F": "Music_SilphCo",
+ "SILPH_CO_11F": "Music_SilphCo",
+ "SILPH_CO_1F": "Music_SilphCo",
+ "SILPH_CO_2F": "Music_SilphCo",
+ "SILPH_CO_3F": "Music_SilphCo",
+ "SILPH_CO_4F": "Music_SilphCo",
+ "SILPH_CO_5F": "Music_SilphCo",
+ "SILPH_CO_6F": "Music_SilphCo",
+ "SILPH_CO_7F": "Music_SilphCo",
+ "SILPH_CO_8F": "Music_SilphCo",
+ "SILPH_CO_9F": "Music_SilphCo",
+ "SILPH_CO_ELEVATOR": "Music_SilphCo",
+ "SS_ANNE_1F": "Music_SSAnne",
+ "SS_ANNE_1F_ROOMS": "Music_SSAnne",
+ "SS_ANNE_2F": "Music_SSAnne",
+ "SS_ANNE_2F_ROOMS": "Music_SSAnne",
+ "SS_ANNE_3F": "Music_SSAnne",
+ "SS_ANNE_B1F": "Music_SSAnne",
+ "SS_ANNE_B1F_ROOMS": "Music_SSAnne",
+ "SS_ANNE_BOW": "Music_SSAnne",
+ "SS_ANNE_CAPTAINS_ROOM": "Music_SSAnne",
+ "SS_ANNE_KITCHEN": "Music_SSAnne",
+ "SUMMER_BEACH_HOUSE": "Music_Routes3",
+ "TRADE_CENTER": "Music_Celadon",
+ "UNDERGROUND_PATH_NORTH_SOUTH": "Music_Routes1",
+ "UNDERGROUND_PATH_ROUTE_5": "Music_Cities1",
+ "UNDERGROUND_PATH_ROUTE_6": "Music_Cities1",
+ "UNDERGROUND_PATH_ROUTE_6_COPY": "Music_Vermilion",
+ "UNDERGROUND_PATH_ROUTE_7": "Music_Cities1",
+ "UNDERGROUND_PATH_ROUTE_7_COPY": "Music_Celadon",
+ "UNDERGROUND_PATH_ROUTE_8": "Music_Cities1",
+ "UNDERGROUND_PATH_WEST_EAST": "Music_Routes1",
+ "UNUSED_MAP_0B": "Music_Cities1",
+ "UNUSED_MAP_69": "Music_Dungeon2",
+ "UNUSED_MAP_6A": "Music_Dungeon2",
+ "UNUSED_MAP_6B": "Music_SSAnne",
+ "UNUSED_MAP_6D": "Music_PokemonTower",
+ "UNUSED_MAP_6E": "Music_Dungeon1",
+ "UNUSED_MAP_6F": "Music_SilphCo",
+ "UNUSED_MAP_70": "Music_SilphCo",
+ "UNUSED_MAP_72": "Music_SSAnne",
+ "UNUSED_MAP_73": "Music_SSAnne",
+ "UNUSED_MAP_74": "Music_SSAnne",
+ "UNUSED_MAP_75": "Music_SSAnne",
+ "UNUSED_MAP_CC": "Music_Dungeon1",
+ "UNUSED_MAP_CD": "Music_Dungeon1",
+ "UNUSED_MAP_CE": "Music_Dungeon1",
+ "UNUSED_MAP_E7": "Music_Cinnabar",
+ "UNUSED_MAP_ED": "Music_SilphCo",
+ "UNUSED_MAP_EE": "Music_SilphCo",
+ "UNUSED_MAP_F1": "Music_SilphCo",
+ "UNUSED_MAP_F2": "Music_SilphCo",
+ "UNUSED_MAP_F3": "Music_SilphCo",
+ "UNUSED_MAP_F4": "Music_SilphCo",
+ "VERMILION_CITY": "Music_Vermilion",
+ "VERMILION_DOCK": "Music_SSAnne",
+ "VERMILION_GYM": "Music_Gym",
+ "VERMILION_MART": "Music_Pokecenter",
+ "VERMILION_OLD_ROD_HOUSE": "Music_Cities2",
+ "VERMILION_PIDGEY_HOUSE": "Music_Vermilion",
+ "VERMILION_POKECENTER": "Music_Pokecenter",
+ "VERMILION_TRADE_HOUSE": "Music_Vermilion",
+ "VICTORY_ROAD_1F": "Music_Dungeon3",
+ "VICTORY_ROAD_2F": "Music_Dungeon3",
+ "VICTORY_ROAD_3F": "Music_Dungeon3",
+ "VIRIDIAN_CITY": "Music_Cities1",
+ "VIRIDIAN_FOREST": "Music_Dungeon2",
+ "VIRIDIAN_FOREST_NORTH_GATE": "Music_Cities1",
+ "VIRIDIAN_FOREST_SOUTH_GATE": "Music_Cities1",
+ "VIRIDIAN_GYM": "Music_Gym",
+ "VIRIDIAN_MART": "Music_Pokecenter",
+ "VIRIDIAN_NICKNAME_HOUSE": "Music_Cities1",
+ "VIRIDIAN_POKECENTER": "Music_Pokecenter",
+ "VIRIDIAN_SCHOOL_HOUSE": "Music_Cities1",
+ "WARDENS_HOUSE": "Music_Cities2"
+ },
+ "musicHeaders": {
+ "Music_BikeRiding": {
+ "address": 17014,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_Celadon": {
+ "address": 16990,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_Cinnabar": {
+ "address": 16999,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_CinnabarMansion": {
+ "address": 17092,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_Cities1": {
+ "address": 16969,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_Cities2": {
+ "address": 16981,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_Credits": {
+ "address": 16981,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_DefeatedGymLeader": {
+ "address": 17140,
+ "bank": 8,
+ "engine": 2
+ },
+ "Music_DefeatedTrainer": {
+ "address": 17122,
+ "bank": 8,
+ "engine": 2
+ },
+ "Music_DefeatedWildMon": {
+ "address": 17131,
+ "bank": 8,
+ "engine": 2
+ },
+ "Music_Dungeon1": {
+ "address": 17056,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_Dungeon2": {
+ "address": 17068,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_Dungeon3": {
+ "address": 17080,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_FinalBattle": {
+ "address": 17113,
+ "bank": 8,
+ "engine": 2
+ },
+ "Music_GBPrinter": {
+ "address": 16873,
+ "bank": 32,
+ "engine": 3
+ },
+ "Music_GameCorner": {
+ "address": 17035,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_Gym": {
+ "address": 16960,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_GymLeaderBattle": {
+ "address": 17086,
+ "bank": 8,
+ "engine": 2
+ },
+ "Music_HallOfFame": {
+ "address": 16990,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_IndigoPlateau": {
+ "address": 17137,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_IntroBattle": {
+ "address": 17044,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_JigglypuffSong": {
+ "address": 17008,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_Lavender": {
+ "address": 17020,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_MeetEvilTrainer": {
+ "address": 17122,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_MeetFemaleTrainer": {
+ "address": 17131,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_MeetJessieJames": {
+ "address": 16852,
+ "bank": 32,
+ "engine": 3
+ },
+ "Music_MeetMaleTrainer": {
+ "address": 17140,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_MeetProfOak": {
+ "address": 17041,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_MeetRival": {
+ "address": 17050,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_MuseumGuy": {
+ "address": 17059,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_OaksLab": {
+ "address": 16999,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_PalletTown": {
+ "address": 16942,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_PkmnHealed": {
+ "address": 17080,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_Pokecenter": {
+ "address": 16951,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_PokemonTower": {
+ "address": 17104,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_Routes1": {
+ "address": 17089,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_Routes2": {
+ "address": 17101,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_Routes3": {
+ "address": 17113,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_Routes4": {
+ "address": 17125,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_SSAnne": {
+ "address": 17032,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_SafariZone": {
+ "address": 17071,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_SilphCo": {
+ "address": 17113,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_Surfing": {
+ "address": 17026,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_SurfingPikachu": {
+ "address": 16843,
+ "bank": 32,
+ "engine": 3
+ },
+ "Music_TitleScreen": {
+ "address": 16969,
+ "bank": 31,
+ "engine": 3
+ },
+ "Music_TrainerBattle": {
+ "address": 17095,
+ "bank": 8,
+ "engine": 2
+ },
+ "Music_Vermilion": {
+ "address": 17008,
+ "bank": 2,
+ "engine": 1
+ },
+ "Music_WildBattle": {
+ "address": 17104,
+ "bank": 8,
+ "engine": 2
+ },
+ "Music_YellowIntro": {
+ "address": 17044,
+ "bank": 31,
+ "engine": 3
+ }
+ },
+ "noiseHeaders": {
+ "1": {
+ "1": {
+ "address": 16387,
+ "bank": 2,
+ "engine": 1
+ },
+ "10": {
+ "address": 16414,
+ "bank": 2,
+ "engine": 1
+ },
+ "11": {
+ "address": 16417,
+ "bank": 2,
+ "engine": 1
+ },
+ "12": {
+ "address": 16420,
+ "bank": 2,
+ "engine": 1
+ },
+ "13": {
+ "address": 16423,
+ "bank": 2,
+ "engine": 1
+ },
+ "14": {
+ "address": 16426,
+ "bank": 2,
+ "engine": 1
+ },
+ "15": {
+ "address": 16429,
+ "bank": 2,
+ "engine": 1
+ },
+ "16": {
+ "address": 16432,
+ "bank": 2,
+ "engine": 1
+ },
+ "17": {
+ "address": 16435,
+ "bank": 2,
+ "engine": 1
+ },
+ "18": {
+ "address": 16438,
+ "bank": 2,
+ "engine": 1
+ },
+ "19": {
+ "address": 16441,
+ "bank": 2,
+ "engine": 1
+ },
+ "2": {
+ "address": 16390,
+ "bank": 2,
+ "engine": 1
+ },
+ "3": {
+ "address": 16393,
+ "bank": 2,
+ "engine": 1
+ },
+ "4": {
+ "address": 16396,
+ "bank": 2,
+ "engine": 1
+ },
+ "5": {
+ "address": 16399,
+ "bank": 2,
+ "engine": 1
+ },
+ "6": {
+ "address": 16402,
+ "bank": 2,
+ "engine": 1
+ },
+ "7": {
+ "address": 16405,
+ "bank": 2,
+ "engine": 1
+ },
+ "8": {
+ "address": 16408,
+ "bank": 2,
+ "engine": 1
+ },
+ "9": {
+ "address": 16411,
+ "bank": 2,
+ "engine": 1
+ }
+ },
+ "2": {
+ "1": {
+ "address": 16387,
+ "bank": 8,
+ "engine": 2
+ },
+ "10": {
+ "address": 16414,
+ "bank": 8,
+ "engine": 2
+ },
+ "11": {
+ "address": 16417,
+ "bank": 8,
+ "engine": 2
+ },
+ "12": {
+ "address": 16420,
+ "bank": 8,
+ "engine": 2
+ },
+ "13": {
+ "address": 16423,
+ "bank": 8,
+ "engine": 2
+ },
+ "14": {
+ "address": 16426,
+ "bank": 8,
+ "engine": 2
+ },
+ "15": {
+ "address": 16429,
+ "bank": 8,
+ "engine": 2
+ },
+ "16": {
+ "address": 16432,
+ "bank": 8,
+ "engine": 2
+ },
+ "17": {
+ "address": 16435,
+ "bank": 8,
+ "engine": 2
+ },
+ "18": {
+ "address": 16438,
+ "bank": 8,
+ "engine": 2
+ },
+ "19": {
+ "address": 16441,
+ "bank": 8,
+ "engine": 2
+ },
+ "2": {
+ "address": 16390,
+ "bank": 8,
+ "engine": 2
+ },
+ "3": {
+ "address": 16393,
+ "bank": 8,
+ "engine": 2
+ },
+ "4": {
+ "address": 16396,
+ "bank": 8,
+ "engine": 2
+ },
+ "5": {
+ "address": 16399,
+ "bank": 8,
+ "engine": 2
+ },
+ "6": {
+ "address": 16402,
+ "bank": 8,
+ "engine": 2
+ },
+ "7": {
+ "address": 16405,
+ "bank": 8,
+ "engine": 2
+ },
+ "8": {
+ "address": 16408,
+ "bank": 8,
+ "engine": 2
+ },
+ "9": {
+ "address": 16411,
+ "bank": 8,
+ "engine": 2
+ }
+ },
+ "3": {
+ "1": {
+ "address": 16387,
+ "bank": 31,
+ "engine": 3
+ },
+ "10": {
+ "address": 16414,
+ "bank": 31,
+ "engine": 3
+ },
+ "11": {
+ "address": 16417,
+ "bank": 31,
+ "engine": 3
+ },
+ "12": {
+ "address": 16420,
+ "bank": 31,
+ "engine": 3
+ },
+ "13": {
+ "address": 16423,
+ "bank": 31,
+ "engine": 3
+ },
+ "14": {
+ "address": 16426,
+ "bank": 31,
+ "engine": 3
+ },
+ "15": {
+ "address": 16429,
+ "bank": 31,
+ "engine": 3
+ },
+ "16": {
+ "address": 16432,
+ "bank": 31,
+ "engine": 3
+ },
+ "17": {
+ "address": 16435,
+ "bank": 31,
+ "engine": 3
+ },
+ "18": {
+ "address": 16438,
+ "bank": 31,
+ "engine": 3
+ },
+ "19": {
+ "address": 16441,
+ "bank": 31,
+ "engine": 3
+ },
+ "2": {
+ "address": 16390,
+ "bank": 31,
+ "engine": 3
+ },
+ "3": {
+ "address": 16393,
+ "bank": 31,
+ "engine": 3
+ },
+ "4": {
+ "address": 16396,
+ "bank": 31,
+ "engine": 3
+ },
+ "5": {
+ "address": 16399,
+ "bank": 31,
+ "engine": 3
+ },
+ "6": {
+ "address": 16402,
+ "bank": 31,
+ "engine": 3
+ },
+ "7": {
+ "address": 16405,
+ "bank": 31,
+ "engine": 3
+ },
+ "8": {
+ "address": 16408,
+ "bank": 31,
+ "engine": 3
+ },
+ "9": {
+ "address": 16411,
+ "bank": 31,
+ "engine": 3
+ }
+ }
+ },
+ "programBanks": [
+ 2,
+ 8,
+ 31,
+ 32
+ ],
+ "sfxHeaders": {
+ "59": {
+ "address": 16912,
+ "bank": 2,
+ "engine": 1
+ },
+ "Arrow_Tiles": {
+ "address": 16885,
+ "bank": 2,
+ "engine": 1
+ },
+ "Ball_Poof": {
+ "address": 16825,
+ "bank": 8,
+ "engine": 2
+ },
+ "Ball_Toss": {
+ "address": 16819,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_09": {
+ "address": 16861,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_0B": {
+ "address": 16867,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_0C": {
+ "address": 16870,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_0D": {
+ "address": 16873,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_0E": {
+ "address": 16876,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_0F": {
+ "address": 16879,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_12": {
+ "address": 16888,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_13": {
+ "address": 16891,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_14": {
+ "address": 16894,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_16": {
+ "address": 16900,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_17": {
+ "address": 16903,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_18": {
+ "address": 16906,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_19": {
+ "address": 16909,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_1B": {
+ "address": 16915,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_1C": {
+ "address": 16918,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_1E": {
+ "address": 16924,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_20": {
+ "address": 16933,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_21": {
+ "address": 16936,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_22": {
+ "address": 16939,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_23": {
+ "address": 16942,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_24": {
+ "address": 16945,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_25": {
+ "address": 16951,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_26": {
+ "address": 16954,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_27": {
+ "address": 16957,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_28": {
+ "address": 16966,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_29": {
+ "address": 16975,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_2A": {
+ "address": 16981,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_2B": {
+ "address": 16990,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_2C": {
+ "address": 16996,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_2E": {
+ "address": 17014,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_2F": {
+ "address": 17023,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_31": {
+ "address": 17041,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_32": {
+ "address": 17047,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_33": {
+ "address": 17053,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_34": {
+ "address": 17059,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_35": {
+ "address": 17068,
+ "bank": 8,
+ "engine": 2
+ },
+ "Battle_36": {
+ "address": 17074,
+ "bank": 8,
+ "engine": 2
+ },
+ "Caught_Mon": {
+ "address": 16846,
+ "bank": 8,
+ "engine": 2
+ },
+ "Collision": {
+ "address": 16924,
+ "bank": 2,
+ "engine": 1
+ },
+ "Cut": {
+ "address": 16900,
+ "bank": 2,
+ "engine": 1
+ },
+ "Damage": {
+ "address": 16882,
+ "bank": 8,
+ "engine": 2
+ },
+ "Denied": {
+ "address": 16879,
+ "bank": 2,
+ "engine": 1
+ },
+ "Dex_Page_Added": {
+ "address": 16840,
+ "bank": 8,
+ "engine": 2
+ },
+ "Doubleslap": {
+ "address": 16921,
+ "bank": 8,
+ "engine": 2
+ },
+ "Enter_PC": {
+ "address": 16849,
+ "bank": 2,
+ "engine": 1
+ },
+ "Faint_Fall": {
+ "address": 16858,
+ "bank": 8,
+ "engine": 2
+ },
+ "Faint_Thud": {
+ "address": 16831,
+ "bank": 8,
+ "engine": 2
+ },
+ "Fly": {
+ "address": 16876,
+ "bank": 2,
+ "engine": 1
+ },
+ "Get_Item1": {
+ "address": 16786,
+ "bank": 2,
+ "engine": 1
+ },
+ "Get_Item2": {
+ "address": 16795,
+ "bank": 2,
+ "engine": 1
+ },
+ "Get_Key_Item": {
+ "address": 16828,
+ "bank": 2,
+ "engine": 1
+ },
+ "Go_Inside": {
+ "address": 16903,
+ "bank": 2,
+ "engine": 1
+ },
+ "Go_Outside": {
+ "address": 16927,
+ "bank": 2,
+ "engine": 1
+ },
+ "Heal_Ailment": {
+ "address": 16810,
+ "bank": 2,
+ "engine": 1
+ },
+ "Heal_HP": {
+ "address": 16807,
+ "bank": 2,
+ "engine": 1
+ },
+ "Healing_Machine": {
+ "address": 16858,
+ "bank": 2,
+ "engine": 1
+ },
+ "Horn_Drill": {
+ "address": 16930,
+ "bank": 8,
+ "engine": 2
+ },
+ "Intro_Crash": {
+ "address": 16948,
+ "bank": 31,
+ "engine": 3
+ },
+ "Intro_Hip": {
+ "address": 16939,
+ "bank": 31,
+ "engine": 3
+ },
+ "Intro_Hop": {
+ "address": 16942,
+ "bank": 31,
+ "engine": 3
+ },
+ "Intro_Lunge": {
+ "address": 16936,
+ "bank": 31,
+ "engine": 3
+ },
+ "Intro_Raise": {
+ "address": 16945,
+ "bank": 31,
+ "engine": 3
+ },
+ "Intro_Whoosh": {
+ "address": 16951,
+ "bank": 31,
+ "engine": 3
+ },
+ "Ledge": {
+ "address": 16870,
+ "bank": 2,
+ "engine": 1
+ },
+ "Level_Up": {
+ "address": 16786,
+ "bank": 8,
+ "engine": 2
+ },
+ "Not_Very_Effective": {
+ "address": 16885,
+ "bank": 8,
+ "engine": 2
+ },
+ "Peck": {
+ "address": 16855,
+ "bank": 8,
+ "engine": 2
+ },
+ "Poisoned": {
+ "address": 16837,
+ "bank": 2,
+ "engine": 1
+ },
+ "Pokedex_Rating": {
+ "address": 16819,
+ "bank": 2,
+ "engine": 1
+ },
+ "Pokeflute": {
+ "address": 16936,
+ "bank": 2,
+ "engine": 1
+ },
+ "Pound": {
+ "address": 16864,
+ "bank": 8,
+ "engine": 2
+ },
+ "Press_AB": {
+ "address": 16816,
+ "bank": 2,
+ "engine": 1
+ },
+ "Psybeam": {
+ "address": 17005,
+ "bank": 8,
+ "engine": 2
+ },
+ "Psychic_M": {
+ "address": 17032,
+ "bank": 8,
+ "engine": 2
+ },
+ "Purchase": {
+ "address": 16918,
+ "bank": 2,
+ "engine": 1
+ },
+ "Push_Boulder": {
+ "address": 16888,
+ "bank": 2,
+ "engine": 1
+ },
+ "Run": {
+ "address": 16837,
+ "bank": 8,
+ "engine": 2
+ },
+ "SS_Anne_Horn": {
+ "address": 16891,
+ "bank": 2,
+ "engine": 1
+ },
+ "Safari_Zone_PA": {
+ "address": 16939,
+ "bank": 2,
+ "engine": 1
+ },
+ "Save": {
+ "address": 16930,
+ "bank": 2,
+ "engine": 1
+ },
+ "Shooting_Star": {
+ "address": 16966,
+ "bank": 31,
+ "engine": 3
+ },
+ "Shrink": {
+ "address": 16852,
+ "bank": 2,
+ "engine": 1
+ },
+ "Slots_New_Spin": {
+ "address": 16960,
+ "bank": 31,
+ "engine": 3
+ },
+ "Slots_Reward": {
+ "address": 16957,
+ "bank": 31,
+ "engine": 3
+ },
+ "Slots_Stop_Wheel": {
+ "address": 16954,
+ "bank": 31,
+ "engine": 3
+ },
+ "Start_Menu": {
+ "address": 16813,
+ "bank": 2,
+ "engine": 1
+ },
+ "Super_Effective": {
+ "address": 16912,
+ "bank": 8,
+ "engine": 2
+ },
+ "Swap": {
+ "address": 16906,
+ "bank": 2,
+ "engine": 1
+ },
+ "Switch": {
+ "address": 16855,
+ "bank": 2,
+ "engine": 1
+ },
+ "Teleport_Enter1": {
+ "address": 16864,
+ "bank": 2,
+ "engine": 1
+ },
+ "Teleport_Enter2": {
+ "address": 16873,
+ "bank": 2,
+ "engine": 1
+ },
+ "Teleport_Exit1": {
+ "address": 16861,
+ "bank": 2,
+ "engine": 1
+ },
+ "Teleport_Exit2": {
+ "address": 16867,
+ "bank": 2,
+ "engine": 1
+ },
+ "Tink": {
+ "address": 16804,
+ "bank": 2,
+ "engine": 1
+ },
+ "Trade_Machine": {
+ "address": 16840,
+ "bank": 2,
+ "engine": 1
+ },
+ "Trainer_Appeared": {
+ "address": 17083,
+ "bank": 8,
+ "engine": 2
+ },
+ "Turn_Off_PC": {
+ "address": 16846,
+ "bank": 2,
+ "engine": 1
+ },
+ "Turn_On_PC": {
+ "address": 16843,
+ "bank": 2,
+ "engine": 1
+ },
+ "Vine_Whip": {
+ "address": 16897,
+ "bank": 8,
+ "engine": 2
+ },
+ "Withdraw_Deposit": {
+ "address": 16897,
+ "bank": 2,
+ "engine": 1
+ }
+ },
+ "waveBanks": {
+ "1": {
+ "address": 17267,
+ "bank": 2
+ },
+ "2": {
+ "address": 17267,
+ "bank": 8
+ },
+ "3": {
+ "address": 17267,
+ "bank": 31
+ }
+ }
+ },
+ "battleAnimations": {
+ "baseCoordCount": 177,
+ "firstSpecialEffect": 216,
+ "frameBlockCount": 122,
+ "miscAnimations": [
+ "SHOWPIC_ANIM",
+ "STATUS_AFFECTED_ANIM",
+ "ANIM_A8",
+ "ENEMY_HUD_SHAKE_ANIM",
+ "TRADE_BALL_DROP_ANIM",
+ "TRADE_BALL_SHAKE_ANIM",
+ "TRADE_BALL_TILT_ANIM",
+ "TRADE_BALL_POOF_ANIM",
+ "XSTATITEM_ANIM",
+ "XSTATITEM_DUPLICATE_ANIM",
+ "SHRINKING_SQUARE_ANIM",
+ "ANIM_B1",
+ "ANIM_B2",
+ "ANIM_B3",
+ "ANIM_B4",
+ "ANIM_B5",
+ "ANIM_B6",
+ "ANIM_B7",
+ "ANIM_B8",
+ "ANIM_B9",
+ "BURN_PSN_ANIM",
+ "ANIM_BB",
+ "SLP_PLAYER_ANIM",
+ "SLP_ANIM",
+ "CONF_PLAYER_ANIM",
+ "CONF_ANIM",
+ "SLIDE_DOWN_ANIM",
+ "TOSS_ANIM",
+ "SHAKE_ANIM",
+ "POOF_ANIM",
+ "BLOCKBALL_ANIM",
+ "GREATTOSS_ANIM",
+ "ULTRATOSS_ANIM",
+ "SHAKE_SCREEN_ANIM",
+ "HIDEPIC_ANIM",
+ "ROCK_ANIM",
+ "BAIT_ANIM"
+ ],
+ "moveCount": 165,
+ "specialEffects": {
+ "216": "SE_WAVY_SCREEN",
+ "217": "SE_SUBSTITUTE_MON",
+ "218": "SE_SHAKE_BACK_AND_FORTH",
+ "219": "SE_SLIDE_ENEMY_MON_OFF",
+ "220": "SE_SHOW_ENEMY_MON_PIC",
+ "221": "SE_SHOW_MON_PIC",
+ "222": "SE_BLINK_ENEMY_MON",
+ "223": "SE_HIDE_ENEMY_MON_PIC",
+ "224": "SE_FLASH_ENEMY_MON_PIC",
+ "225": "SE_DELAY_ANIMATION_10",
+ "226": "SE_SPIRAL_BALLS_INWARD",
+ "227": "SE_SHAKE_ENEMY_HUD_2",
+ "228": "SE_SHAKE_ENEMY_HUD",
+ "229": "SE_SLIDE_MON_HALF_OFF",
+ "230": "SE_PETALS_FALLING",
+ "231": "SE_LEAVES_FALLING",
+ "232": "SE_TRANSFORM_MON",
+ "233": "SE_SLIDE_MON_DOWN_AND_HIDE",
+ "234": "SE_MINIMIZE_MON",
+ "235": "SE_BOUNCE_UP_AND_DOWN",
+ "236": "SE_SHOOT_MANY_BALLS_UPWARD",
+ "237": "SE_SHOOT_BALLS_UPWARD",
+ "238": "SE_SQUISH_MON_PIC",
+ "239": "SE_HIDE_MON_PIC",
+ "240": "SE_LIGHT_SCREEN_PALETTE",
+ "241": "SE_RESET_MON_POSITION",
+ "242": "SE_MOVE_MON_HORIZONTALLY",
+ "243": "SE_BLINK_MON",
+ "244": "SE_SLIDE_MON_OFF",
+ "245": "SE_FLASH_MON_PIC",
+ "246": "SE_SLIDE_MON_DOWN",
+ "247": "SE_SLIDE_MON_UP",
+ "248": "SE_FLASH_SCREEN_LONG",
+ "249": "SE_DARKEN_MON_PALETTE",
+ "250": "SE_WATER_DROPLETS_EVERYWHERE",
+ "251": "SE_SHAKE_SCREEN",
+ "252": "SE_RESET_SCREEN_PALETTE",
+ "253": "SE_DARK_SCREEN_PALETTE",
+ "254": "SE_DARK_SCREEN_FLASH"
+ },
+ "subanimCount": 86,
+ "subanimTypes": [
+ "NORMAL",
+ "HVFLIP",
+ "HFLIP",
+ "COORDFLIP",
+ "REVERSE",
+ "ENEMY"
+ ],
+ "tilesheets": [
+ {
+ "height": 40,
+ "path": "assets/generated/battle/anims/move_anim_0.png",
+ "source": "gfx/battle/move_anim_0.png",
+ "width": 128
+ },
+ {
+ "height": 40,
+ "path": "assets/generated/battle/anims/move_anim_1.png",
+ "source": "gfx/battle/move_anim_1.png",
+ "width": 128
+ },
+ {
+ "height": 40,
+ "path": "assets/generated/battle/anims/move_anim_0.png",
+ "source": "gfx/battle/move_anim_0.png",
+ "width": 128
+ }
+ ]
+ },
+ "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": "'d",
+ "188": "'l",
+ "189": "'s",
+ "19": "ド",
+ "190": "'t",
+ "191": "'v",
+ "192": "た",
+ "193": "ち",
+ "194": "つ",
+ "195": "て",
+ "196": "と",
+ "197": "な",
+ "198": "に",
+ "199": "ぬ",
+ "200": "ね",
+ "201": "の",
+ "202": "は",
+ "203": "ひ",
+ "204": "ふ",
+ "205": "へ",
+ "206": "ほ",
+ "207": "ま",
+ "208": "み",
+ "209": "む",
+ "210": "め",
+ "211": "も",
+ "212": "や",
+ "213": "ゆ",
+ "214": "よ",
+ "215": "ら",
+ "216": "り",
+ "217": "る",
+ "218": "れ",
+ "219": "ろ",
+ "220": "わ",
+ "221": "を",
+ "222": "ん",
+ "223": "っ",
+ "224": "'",
+ "225": "",
+ "226": "",
+ "227": "-",
+ "228": "'r",
+ "229": "'m",
+ "230": "?",
+ "231": "!",
+ "232": ".",
+ "233": "ァ",
+ "234": "ゥ",
+ "235": "ェ",
+ "236": "▷",
+ "237": "▲",
+ "238": "▼",
+ "239": "♂",
+ "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": "ボ",
+ "38": "が",
+ "39": "ぎ",
+ "40": "ぐ",
+ "41": "げ",
+ "42": "ご",
+ "43": "ざ",
+ "44": "じ",
+ "45": "ず",
+ "46": "ぜ",
+ "47": "ぞ",
+ "48": "だ",
+ "49": "ぢ",
+ "5": "ガ",
+ "50": "づ",
+ "51": "で",
+ "52": "ど",
+ "58": "ば",
+ "59": "び",
+ "6": "ギ",
+ "60": "ぶ",
+ "61": "べ",
+ "62": "ぼ",
+ "64": "パ",
+ "65": "ピ",
+ "66": "プ",
+ "67": "ポ",
+ "68": "ぱ",
+ "69": "ぴ",
+ "7": "グ",
+ "70": "ぷ",
+ "71": "ぺ",
+ "72": "ぽ",
+ "73": "\f",
+ "74": "POKéMON",
+ "75": "<_CONT>",
+ "76": "",
+ "78": "\n",
+ "79": "\n",
+ "8": "ゲ",
+ "80": "",
+ "81": "\f",
+ "82": "{PLAYER}",
+ "83": "{RIVAL}",
+ "84": "POKé",
+ "85": "\u000b",
+ "86": "……",
+ "87": "",
+ "88": "",
+ "89": "{TARGET}",
+ "9": "ゴ",
+ "90": "{USER}",
+ "91": "PC",
+ "92": "TM",
+ "93": "TRAINER",
+ "94": "ROCKET",
+ "95": "",
+ "96": "",
+ "97": "",
+ "98": "",
+ "99": ""
+ },
+ "constants": {
+ "mapOrder": [
+ "PALLET_TOWN",
+ "VIRIDIAN_CITY",
+ "PEWTER_CITY",
+ "CERULEAN_CITY",
+ "LAVENDER_TOWN",
+ "VERMILION_CITY",
+ "CELADON_CITY",
+ "FUCHSIA_CITY",
+ "CINNABAR_ISLAND",
+ "INDIGO_PLATEAU",
+ "SAFFRON_CITY",
+ "UNUSED_MAP_0B",
+ "ROUTE_1",
+ "ROUTE_2",
+ "ROUTE_3",
+ "ROUTE_4",
+ "ROUTE_5",
+ "ROUTE_6",
+ "ROUTE_7",
+ "ROUTE_8",
+ "ROUTE_9",
+ "ROUTE_10",
+ "ROUTE_11",
+ "ROUTE_12",
+ "ROUTE_13",
+ "ROUTE_14",
+ "ROUTE_15",
+ "ROUTE_16",
+ "ROUTE_17",
+ "ROUTE_18",
+ "ROUTE_19",
+ "ROUTE_20",
+ "ROUTE_21",
+ "ROUTE_22",
+ "ROUTE_23",
+ "ROUTE_24",
+ "ROUTE_25",
+ "REDS_HOUSE_1F",
+ "REDS_HOUSE_2F",
+ "BLUES_HOUSE",
+ "OAKS_LAB",
+ "VIRIDIAN_POKECENTER",
+ "VIRIDIAN_MART",
+ "VIRIDIAN_SCHOOL_HOUSE",
+ "VIRIDIAN_NICKNAME_HOUSE",
+ "VIRIDIAN_GYM",
+ "DIGLETTS_CAVE_ROUTE_2",
+ "VIRIDIAN_FOREST_NORTH_GATE",
+ "ROUTE_2_TRADE_HOUSE",
+ "ROUTE_2_GATE",
+ "VIRIDIAN_FOREST_SOUTH_GATE",
+ "VIRIDIAN_FOREST",
+ "MUSEUM_1F",
+ "MUSEUM_2F",
+ "PEWTER_GYM",
+ "PEWTER_NIDORAN_HOUSE",
+ "PEWTER_MART",
+ "PEWTER_SPEECH_HOUSE",
+ "PEWTER_POKECENTER",
+ "MT_MOON_1F",
+ "MT_MOON_B1F",
+ "MT_MOON_B2F",
+ "CERULEAN_TRASHED_HOUSE",
+ "CERULEAN_MELANIES_HOUSE",
+ "CERULEAN_POKECENTER",
+ "CERULEAN_GYM",
+ "BIKE_SHOP",
+ "CERULEAN_MART",
+ "MT_MOON_POKECENTER",
+ "CERULEAN_TRASHED_HOUSE_COPY",
+ "ROUTE_5_GATE",
+ "UNDERGROUND_PATH_ROUTE_5",
+ "DAYCARE",
+ "ROUTE_6_GATE",
+ "UNDERGROUND_PATH_ROUTE_6",
+ "UNDERGROUND_PATH_ROUTE_6_COPY",
+ "ROUTE_7_GATE",
+ "UNDERGROUND_PATH_ROUTE_7",
+ "UNDERGROUND_PATH_ROUTE_7_COPY",
+ "ROUTE_8_GATE",
+ "UNDERGROUND_PATH_ROUTE_8",
+ "ROCK_TUNNEL_POKECENTER",
+ "ROCK_TUNNEL_1F",
+ "POWER_PLANT",
+ "ROUTE_11_GATE_1F",
+ "DIGLETTS_CAVE_ROUTE_11",
+ "ROUTE_11_GATE_2F",
+ "ROUTE_12_GATE_1F",
+ "BILLS_HOUSE",
+ "VERMILION_POKECENTER",
+ "POKEMON_FAN_CLUB",
+ "VERMILION_MART",
+ "VERMILION_GYM",
+ "VERMILION_PIDGEY_HOUSE",
+ "VERMILION_DOCK",
+ "SS_ANNE_1F",
+ "SS_ANNE_2F",
+ "SS_ANNE_3F",
+ "SS_ANNE_B1F",
+ "SS_ANNE_BOW",
+ "SS_ANNE_KITCHEN",
+ "SS_ANNE_CAPTAINS_ROOM",
+ "SS_ANNE_1F_ROOMS",
+ "SS_ANNE_2F_ROOMS",
+ "SS_ANNE_B1F_ROOMS",
+ "UNUSED_MAP_69",
+ "UNUSED_MAP_6A",
+ "UNUSED_MAP_6B",
+ "VICTORY_ROAD_1F",
+ "UNUSED_MAP_6D",
+ "UNUSED_MAP_6E",
+ "UNUSED_MAP_6F",
+ "UNUSED_MAP_70",
+ "LANCES_ROOM",
+ "UNUSED_MAP_72",
+ "UNUSED_MAP_73",
+ "UNUSED_MAP_74",
+ "UNUSED_MAP_75",
+ "HALL_OF_FAME",
+ "UNDERGROUND_PATH_NORTH_SOUTH",
+ "CHAMPIONS_ROOM",
+ "UNDERGROUND_PATH_WEST_EAST",
+ "CELADON_MART_1F",
+ "CELADON_MART_2F",
+ "CELADON_MART_3F",
+ "CELADON_MART_4F",
+ "CELADON_MART_ROOF",
+ "CELADON_MART_ELEVATOR",
+ "CELADON_MANSION_1F",
+ "CELADON_MANSION_2F",
+ "CELADON_MANSION_3F",
+ "CELADON_MANSION_ROOF",
+ "CELADON_MANSION_ROOF_HOUSE",
+ "CELADON_POKECENTER",
+ "CELADON_GYM",
+ "GAME_CORNER",
+ "CELADON_MART_5F",
+ "GAME_CORNER_PRIZE_ROOM",
+ "CELADON_DINER",
+ "CELADON_CHIEF_HOUSE",
+ "CELADON_HOTEL",
+ "LAVENDER_POKECENTER",
+ "POKEMON_TOWER_1F",
+ "POKEMON_TOWER_2F",
+ "POKEMON_TOWER_3F",
+ "POKEMON_TOWER_4F",
+ "POKEMON_TOWER_5F",
+ "POKEMON_TOWER_6F",
+ "POKEMON_TOWER_7F",
+ "MR_FUJIS_HOUSE",
+ "LAVENDER_MART",
+ "LAVENDER_CUBONE_HOUSE",
+ "FUCHSIA_MART",
+ "FUCHSIA_BILLS_GRANDPAS_HOUSE",
+ "FUCHSIA_POKECENTER",
+ "WARDENS_HOUSE",
+ "SAFARI_ZONE_GATE",
+ "FUCHSIA_GYM",
+ "FUCHSIA_MEETING_ROOM",
+ "SEAFOAM_ISLANDS_B1F",
+ "SEAFOAM_ISLANDS_B2F",
+ "SEAFOAM_ISLANDS_B3F",
+ "SEAFOAM_ISLANDS_B4F",
+ "VERMILION_OLD_ROD_HOUSE",
+ "FUCHSIA_GOOD_ROD_HOUSE",
+ "POKEMON_MANSION_1F",
+ "CINNABAR_GYM",
+ "CINNABAR_LAB",
+ "CINNABAR_LAB_TRADE_ROOM",
+ "CINNABAR_LAB_METRONOME_ROOM",
+ "CINNABAR_LAB_FOSSIL_ROOM",
+ "CINNABAR_POKECENTER",
+ "CINNABAR_MART",
+ "CINNABAR_MART_COPY",
+ "INDIGO_PLATEAU_LOBBY",
+ "COPYCATS_HOUSE_1F",
+ "COPYCATS_HOUSE_2F",
+ "FIGHTING_DOJO",
+ "SAFFRON_GYM",
+ "SAFFRON_PIDGEY_HOUSE",
+ "SAFFRON_MART",
+ "SILPH_CO_1F",
+ "SAFFRON_POKECENTER",
+ "MR_PSYCHICS_HOUSE",
+ "ROUTE_15_GATE_1F",
+ "ROUTE_15_GATE_2F",
+ "ROUTE_16_GATE_1F",
+ "ROUTE_16_GATE_2F",
+ "ROUTE_16_FLY_HOUSE",
+ "ROUTE_12_SUPER_ROD_HOUSE",
+ "ROUTE_18_GATE_1F",
+ "ROUTE_18_GATE_2F",
+ "SEAFOAM_ISLANDS_1F",
+ "ROUTE_22_GATE",
+ "VICTORY_ROAD_2F",
+ "ROUTE_12_GATE_2F",
+ "VERMILION_TRADE_HOUSE",
+ "DIGLETTS_CAVE",
+ "VICTORY_ROAD_3F",
+ "ROCKET_HIDEOUT_B1F",
+ "ROCKET_HIDEOUT_B2F",
+ "ROCKET_HIDEOUT_B3F",
+ "ROCKET_HIDEOUT_B4F",
+ "ROCKET_HIDEOUT_ELEVATOR",
+ "UNUSED_MAP_CC",
+ "UNUSED_MAP_CD",
+ "UNUSED_MAP_CE",
+ "SILPH_CO_2F",
+ "SILPH_CO_3F",
+ "SILPH_CO_4F",
+ "SILPH_CO_5F",
+ "SILPH_CO_6F",
+ "SILPH_CO_7F",
+ "SILPH_CO_8F",
+ "POKEMON_MANSION_2F",
+ "POKEMON_MANSION_3F",
+ "POKEMON_MANSION_B1F",
+ "SAFARI_ZONE_EAST",
+ "SAFARI_ZONE_NORTH",
+ "SAFARI_ZONE_WEST",
+ "SAFARI_ZONE_CENTER",
+ "SAFARI_ZONE_CENTER_REST_HOUSE",
+ "SAFARI_ZONE_SECRET_HOUSE",
+ "SAFARI_ZONE_WEST_REST_HOUSE",
+ "SAFARI_ZONE_EAST_REST_HOUSE",
+ "SAFARI_ZONE_NORTH_REST_HOUSE",
+ "CERULEAN_CAVE_2F",
+ "CERULEAN_CAVE_B1F",
+ "CERULEAN_CAVE_1F",
+ "NAME_RATERS_HOUSE",
+ "CERULEAN_BADGE_HOUSE",
+ "UNUSED_MAP_E7",
+ "ROCK_TUNNEL_B1F",
+ "SILPH_CO_9F",
+ "SILPH_CO_10F",
+ "SILPH_CO_11F",
+ "SILPH_CO_ELEVATOR",
+ "UNUSED_MAP_ED",
+ "UNUSED_MAP_EE",
+ "TRADE_CENTER",
+ "COLOSSEUM",
+ "UNUSED_MAP_F1",
+ "UNUSED_MAP_F2",
+ "UNUSED_MAP_F3",
+ "UNUSED_MAP_F4",
+ "LORELEIS_ROOM",
+ "BRUNOS_ROOM",
+ "AGATHAS_ROOM",
+ "SUMMER_BEACH_HOUSE"
+ ],
+ "maps": {
+ "AGATHAS_ROOM": {
+ "height": 6,
+ "index": 247,
+ "width": 5
+ },
+ "BIKE_SHOP": {
+ "height": 4,
+ "index": 66,
+ "width": 4
+ },
+ "BILLS_HOUSE": {
+ "height": 4,
+ "index": 88,
+ "width": 4
+ },
+ "BLUES_HOUSE": {
+ "height": 4,
+ "index": 39,
+ "width": 4
+ },
+ "BRUNOS_ROOM": {
+ "height": 6,
+ "index": 246,
+ "width": 5
+ },
+ "CELADON_CHIEF_HOUSE": {
+ "height": 4,
+ "index": 139,
+ "width": 4
+ },
+ "CELADON_CITY": {
+ "height": 18,
+ "index": 6,
+ "width": 25
+ },
+ "CELADON_DINER": {
+ "height": 4,
+ "index": 138,
+ "width": 5
+ },
+ "CELADON_GYM": {
+ "height": 9,
+ "index": 134,
+ "width": 5
+ },
+ "CELADON_HOTEL": {
+ "height": 4,
+ "index": 140,
+ "width": 7
+ },
+ "CELADON_MANSION_1F": {
+ "height": 6,
+ "index": 128,
+ "width": 4
+ },
+ "CELADON_MANSION_2F": {
+ "height": 6,
+ "index": 129,
+ "width": 4
+ },
+ "CELADON_MANSION_3F": {
+ "height": 6,
+ "index": 130,
+ "width": 4
+ },
+ "CELADON_MANSION_ROOF": {
+ "height": 6,
+ "index": 131,
+ "width": 4
+ },
+ "CELADON_MANSION_ROOF_HOUSE": {
+ "height": 4,
+ "index": 132,
+ "width": 4
+ },
+ "CELADON_MART_1F": {
+ "height": 4,
+ "index": 122,
+ "width": 10
+ },
+ "CELADON_MART_2F": {
+ "height": 4,
+ "index": 123,
+ "width": 10
+ },
+ "CELADON_MART_3F": {
+ "height": 4,
+ "index": 124,
+ "width": 10
+ },
+ "CELADON_MART_4F": {
+ "height": 4,
+ "index": 125,
+ "width": 10
+ },
+ "CELADON_MART_5F": {
+ "height": 4,
+ "index": 136,
+ "width": 10
+ },
+ "CELADON_MART_ELEVATOR": {
+ "height": 2,
+ "index": 127,
+ "width": 2
+ },
+ "CELADON_MART_ROOF": {
+ "height": 4,
+ "index": 126,
+ "width": 10
+ },
+ "CELADON_POKECENTER": {
+ "height": 4,
+ "index": 133,
+ "width": 7
+ },
+ "CERULEAN_BADGE_HOUSE": {
+ "height": 4,
+ "index": 230,
+ "width": 4
+ },
+ "CERULEAN_CAVE_1F": {
+ "height": 9,
+ "index": 228,
+ "width": 15
+ },
+ "CERULEAN_CAVE_2F": {
+ "height": 9,
+ "index": 226,
+ "width": 15
+ },
+ "CERULEAN_CAVE_B1F": {
+ "height": 9,
+ "index": 227,
+ "width": 15
+ },
+ "CERULEAN_CITY": {
+ "height": 18,
+ "index": 3,
+ "width": 20
+ },
+ "CERULEAN_GYM": {
+ "height": 7,
+ "index": 65,
+ "width": 5
+ },
+ "CERULEAN_MART": {
+ "height": 4,
+ "index": 67,
+ "width": 4
+ },
+ "CERULEAN_MELANIES_HOUSE": {
+ "height": 4,
+ "index": 63,
+ "width": 4
+ },
+ "CERULEAN_POKECENTER": {
+ "height": 4,
+ "index": 64,
+ "width": 7
+ },
+ "CERULEAN_TRASHED_HOUSE": {
+ "height": 4,
+ "index": 62,
+ "width": 4
+ },
+ "CERULEAN_TRASHED_HOUSE_COPY": {
+ "height": 4,
+ "index": 69,
+ "width": 4
+ },
+ "CHAMPIONS_ROOM": {
+ "height": 4,
+ "index": 120,
+ "width": 4
+ },
+ "CINNABAR_GYM": {
+ "height": 9,
+ "index": 166,
+ "width": 10
+ },
+ "CINNABAR_ISLAND": {
+ "height": 9,
+ "index": 8,
+ "width": 10
+ },
+ "CINNABAR_LAB": {
+ "height": 4,
+ "index": 167,
+ "width": 9
+ },
+ "CINNABAR_LAB_FOSSIL_ROOM": {
+ "height": 4,
+ "index": 170,
+ "width": 4
+ },
+ "CINNABAR_LAB_METRONOME_ROOM": {
+ "height": 4,
+ "index": 169,
+ "width": 4
+ },
+ "CINNABAR_LAB_TRADE_ROOM": {
+ "height": 4,
+ "index": 168,
+ "width": 4
+ },
+ "CINNABAR_MART": {
+ "height": 4,
+ "index": 172,
+ "width": 4
+ },
+ "CINNABAR_MART_COPY": {
+ "height": 4,
+ "index": 173,
+ "width": 4
+ },
+ "CINNABAR_POKECENTER": {
+ "height": 4,
+ "index": 171,
+ "width": 7
+ },
+ "COLOSSEUM": {
+ "height": 4,
+ "index": 240,
+ "width": 5
+ },
+ "COPYCATS_HOUSE_1F": {
+ "height": 4,
+ "index": 175,
+ "width": 4
+ },
+ "COPYCATS_HOUSE_2F": {
+ "height": 4,
+ "index": 176,
+ "width": 4
+ },
+ "DAYCARE": {
+ "height": 4,
+ "index": 72,
+ "width": 4
+ },
+ "DIGLETTS_CAVE": {
+ "height": 18,
+ "index": 197,
+ "width": 20
+ },
+ "DIGLETTS_CAVE_ROUTE_11": {
+ "height": 4,
+ "index": 85,
+ "width": 4
+ },
+ "DIGLETTS_CAVE_ROUTE_2": {
+ "height": 4,
+ "index": 46,
+ "width": 4
+ },
+ "FIGHTING_DOJO": {
+ "height": 6,
+ "index": 177,
+ "width": 5
+ },
+ "FUCHSIA_BILLS_GRANDPAS_HOUSE": {
+ "height": 4,
+ "index": 153,
+ "width": 4
+ },
+ "FUCHSIA_CITY": {
+ "height": 18,
+ "index": 7,
+ "width": 20
+ },
+ "FUCHSIA_GOOD_ROD_HOUSE": {
+ "height": 4,
+ "index": 164,
+ "width": 4
+ },
+ "FUCHSIA_GYM": {
+ "height": 9,
+ "index": 157,
+ "width": 5
+ },
+ "FUCHSIA_MART": {
+ "height": 4,
+ "index": 152,
+ "width": 4
+ },
+ "FUCHSIA_MEETING_ROOM": {
+ "height": 4,
+ "index": 158,
+ "width": 7
+ },
+ "FUCHSIA_POKECENTER": {
+ "height": 4,
+ "index": 154,
+ "width": 7
+ },
+ "GAME_CORNER": {
+ "height": 9,
+ "index": 135,
+ "width": 10
+ },
+ "GAME_CORNER_PRIZE_ROOM": {
+ "height": 4,
+ "index": 137,
+ "width": 5
+ },
+ "HALL_OF_FAME": {
+ "height": 4,
+ "index": 118,
+ "width": 5
+ },
+ "INDIGO_PLATEAU": {
+ "height": 9,
+ "index": 9,
+ "width": 10
+ },
+ "INDIGO_PLATEAU_LOBBY": {
+ "height": 6,
+ "index": 174,
+ "width": 8
+ },
+ "LANCES_ROOM": {
+ "height": 13,
+ "index": 113,
+ "width": 13
+ },
+ "LAVENDER_CUBONE_HOUSE": {
+ "height": 4,
+ "index": 151,
+ "width": 4
+ },
+ "LAVENDER_MART": {
+ "height": 4,
+ "index": 150,
+ "width": 4
+ },
+ "LAVENDER_POKECENTER": {
+ "height": 4,
+ "index": 141,
+ "width": 7
+ },
+ "LAVENDER_TOWN": {
+ "height": 9,
+ "index": 4,
+ "width": 10
+ },
+ "LORELEIS_ROOM": {
+ "height": 6,
+ "index": 245,
+ "width": 5
+ },
+ "MR_FUJIS_HOUSE": {
+ "height": 4,
+ "index": 149,
+ "width": 4
+ },
+ "MR_PSYCHICS_HOUSE": {
+ "height": 4,
+ "index": 183,
+ "width": 4
+ },
+ "MT_MOON_1F": {
+ "height": 18,
+ "index": 59,
+ "width": 20
+ },
+ "MT_MOON_B1F": {
+ "height": 14,
+ "index": 60,
+ "width": 14
+ },
+ "MT_MOON_B2F": {
+ "height": 18,
+ "index": 61,
+ "width": 20
+ },
+ "MT_MOON_POKECENTER": {
+ "height": 4,
+ "index": 68,
+ "width": 7
+ },
+ "MUSEUM_1F": {
+ "height": 4,
+ "index": 52,
+ "width": 10
+ },
+ "MUSEUM_2F": {
+ "height": 4,
+ "index": 53,
+ "width": 7
+ },
+ "NAME_RATERS_HOUSE": {
+ "height": 4,
+ "index": 229,
+ "width": 4
+ },
+ "OAKS_LAB": {
+ "height": 6,
+ "index": 40,
+ "width": 5
+ },
+ "PALLET_TOWN": {
+ "height": 9,
+ "index": 0,
+ "width": 10
+ },
+ "PEWTER_CITY": {
+ "height": 18,
+ "index": 2,
+ "width": 20
+ },
+ "PEWTER_GYM": {
+ "height": 7,
+ "index": 54,
+ "width": 5
+ },
+ "PEWTER_MART": {
+ "height": 4,
+ "index": 56,
+ "width": 4
+ },
+ "PEWTER_NIDORAN_HOUSE": {
+ "height": 4,
+ "index": 55,
+ "width": 4
+ },
+ "PEWTER_POKECENTER": {
+ "height": 4,
+ "index": 58,
+ "width": 7
+ },
+ "PEWTER_SPEECH_HOUSE": {
+ "height": 4,
+ "index": 57,
+ "width": 4
+ },
+ "POKEMON_FAN_CLUB": {
+ "height": 4,
+ "index": 90,
+ "width": 4
+ },
+ "POKEMON_MANSION_1F": {
+ "height": 14,
+ "index": 165,
+ "width": 15
+ },
+ "POKEMON_MANSION_2F": {
+ "height": 14,
+ "index": 214,
+ "width": 15
+ },
+ "POKEMON_MANSION_3F": {
+ "height": 9,
+ "index": 215,
+ "width": 15
+ },
+ "POKEMON_MANSION_B1F": {
+ "height": 14,
+ "index": 216,
+ "width": 15
+ },
+ "POKEMON_TOWER_1F": {
+ "height": 9,
+ "index": 142,
+ "width": 10
+ },
+ "POKEMON_TOWER_2F": {
+ "height": 9,
+ "index": 143,
+ "width": 10
+ },
+ "POKEMON_TOWER_3F": {
+ "height": 9,
+ "index": 144,
+ "width": 10
+ },
+ "POKEMON_TOWER_4F": {
+ "height": 9,
+ "index": 145,
+ "width": 10
+ },
+ "POKEMON_TOWER_5F": {
+ "height": 9,
+ "index": 146,
+ "width": 10
+ },
+ "POKEMON_TOWER_6F": {
+ "height": 9,
+ "index": 147,
+ "width": 10
+ },
+ "POKEMON_TOWER_7F": {
+ "height": 9,
+ "index": 148,
+ "width": 10
+ },
+ "POWER_PLANT": {
+ "height": 18,
+ "index": 83,
+ "width": 20
+ },
+ "REDS_HOUSE_1F": {
+ "height": 4,
+ "index": 37,
+ "width": 4
+ },
+ "REDS_HOUSE_2F": {
+ "height": 4,
+ "index": 38,
+ "width": 4
+ },
+ "ROCKET_HIDEOUT_B1F": {
+ "height": 14,
+ "index": 199,
+ "width": 15
+ },
+ "ROCKET_HIDEOUT_B2F": {
+ "height": 14,
+ "index": 200,
+ "width": 15
+ },
+ "ROCKET_HIDEOUT_B3F": {
+ "height": 14,
+ "index": 201,
+ "width": 15
+ },
+ "ROCKET_HIDEOUT_B4F": {
+ "height": 12,
+ "index": 202,
+ "width": 15
+ },
+ "ROCKET_HIDEOUT_ELEVATOR": {
+ "height": 4,
+ "index": 203,
+ "width": 3
+ },
+ "ROCK_TUNNEL_1F": {
+ "height": 18,
+ "index": 82,
+ "width": 20
+ },
+ "ROCK_TUNNEL_B1F": {
+ "height": 18,
+ "index": 232,
+ "width": 20
+ },
+ "ROCK_TUNNEL_POKECENTER": {
+ "height": 4,
+ "index": 81,
+ "width": 7
+ },
+ "ROUTE_1": {
+ "height": 18,
+ "index": 12,
+ "width": 10
+ },
+ "ROUTE_10": {
+ "height": 36,
+ "index": 21,
+ "width": 10
+ },
+ "ROUTE_11": {
+ "height": 9,
+ "index": 22,
+ "width": 30
+ },
+ "ROUTE_11_GATE_1F": {
+ "height": 5,
+ "index": 84,
+ "width": 4
+ },
+ "ROUTE_11_GATE_2F": {
+ "height": 4,
+ "index": 86,
+ "width": 4
+ },
+ "ROUTE_12": {
+ "height": 54,
+ "index": 23,
+ "width": 10
+ },
+ "ROUTE_12_GATE_1F": {
+ "height": 4,
+ "index": 87,
+ "width": 5
+ },
+ "ROUTE_12_GATE_2F": {
+ "height": 4,
+ "index": 195,
+ "width": 4
+ },
+ "ROUTE_12_SUPER_ROD_HOUSE": {
+ "height": 4,
+ "index": 189,
+ "width": 4
+ },
+ "ROUTE_13": {
+ "height": 9,
+ "index": 24,
+ "width": 30
+ },
+ "ROUTE_14": {
+ "height": 27,
+ "index": 25,
+ "width": 10
+ },
+ "ROUTE_15": {
+ "height": 9,
+ "index": 26,
+ "width": 30
+ },
+ "ROUTE_15_GATE_1F": {
+ "height": 5,
+ "index": 184,
+ "width": 4
+ },
+ "ROUTE_15_GATE_2F": {
+ "height": 4,
+ "index": 185,
+ "width": 4
+ },
+ "ROUTE_16": {
+ "height": 9,
+ "index": 27,
+ "width": 20
+ },
+ "ROUTE_16_FLY_HOUSE": {
+ "height": 4,
+ "index": 188,
+ "width": 4
+ },
+ "ROUTE_16_GATE_1F": {
+ "height": 7,
+ "index": 186,
+ "width": 4
+ },
+ "ROUTE_16_GATE_2F": {
+ "height": 4,
+ "index": 187,
+ "width": 4
+ },
+ "ROUTE_17": {
+ "height": 72,
+ "index": 28,
+ "width": 10
+ },
+ "ROUTE_18": {
+ "height": 9,
+ "index": 29,
+ "width": 25
+ },
+ "ROUTE_18_GATE_1F": {
+ "height": 5,
+ "index": 190,
+ "width": 4
+ },
+ "ROUTE_18_GATE_2F": {
+ "height": 4,
+ "index": 191,
+ "width": 4
+ },
+ "ROUTE_19": {
+ "height": 27,
+ "index": 30,
+ "width": 10
+ },
+ "ROUTE_2": {
+ "height": 36,
+ "index": 13,
+ "width": 10
+ },
+ "ROUTE_20": {
+ "height": 9,
+ "index": 31,
+ "width": 50
+ },
+ "ROUTE_21": {
+ "height": 45,
+ "index": 32,
+ "width": 10
+ },
+ "ROUTE_22": {
+ "height": 9,
+ "index": 33,
+ "width": 20
+ },
+ "ROUTE_22_GATE": {
+ "height": 4,
+ "index": 193,
+ "width": 5
+ },
+ "ROUTE_23": {
+ "height": 72,
+ "index": 34,
+ "width": 10
+ },
+ "ROUTE_24": {
+ "height": 18,
+ "index": 35,
+ "width": 10
+ },
+ "ROUTE_25": {
+ "height": 9,
+ "index": 36,
+ "width": 30
+ },
+ "ROUTE_2_GATE": {
+ "height": 4,
+ "index": 49,
+ "width": 5
+ },
+ "ROUTE_2_TRADE_HOUSE": {
+ "height": 4,
+ "index": 48,
+ "width": 4
+ },
+ "ROUTE_3": {
+ "height": 9,
+ "index": 14,
+ "width": 35
+ },
+ "ROUTE_4": {
+ "height": 9,
+ "index": 15,
+ "width": 45
+ },
+ "ROUTE_5": {
+ "height": 18,
+ "index": 16,
+ "width": 10
+ },
+ "ROUTE_5_GATE": {
+ "height": 3,
+ "index": 70,
+ "width": 4
+ },
+ "ROUTE_6": {
+ "height": 18,
+ "index": 17,
+ "width": 10
+ },
+ "ROUTE_6_GATE": {
+ "height": 3,
+ "index": 73,
+ "width": 4
+ },
+ "ROUTE_7": {
+ "height": 9,
+ "index": 18,
+ "width": 10
+ },
+ "ROUTE_7_GATE": {
+ "height": 4,
+ "index": 76,
+ "width": 3
+ },
+ "ROUTE_8": {
+ "height": 9,
+ "index": 19,
+ "width": 30
+ },
+ "ROUTE_8_GATE": {
+ "height": 4,
+ "index": 79,
+ "width": 3
+ },
+ "ROUTE_9": {
+ "height": 9,
+ "index": 20,
+ "width": 30
+ },
+ "SAFARI_ZONE_CENTER": {
+ "height": 13,
+ "index": 220,
+ "width": 15
+ },
+ "SAFARI_ZONE_CENTER_REST_HOUSE": {
+ "height": 4,
+ "index": 221,
+ "width": 4
+ },
+ "SAFARI_ZONE_EAST": {
+ "height": 13,
+ "index": 217,
+ "width": 15
+ },
+ "SAFARI_ZONE_EAST_REST_HOUSE": {
+ "height": 4,
+ "index": 224,
+ "width": 4
+ },
+ "SAFARI_ZONE_GATE": {
+ "height": 3,
+ "index": 156,
+ "width": 4
+ },
+ "SAFARI_ZONE_NORTH": {
+ "height": 18,
+ "index": 218,
+ "width": 20
+ },
+ "SAFARI_ZONE_NORTH_REST_HOUSE": {
+ "height": 4,
+ "index": 225,
+ "width": 4
+ },
+ "SAFARI_ZONE_SECRET_HOUSE": {
+ "height": 4,
+ "index": 222,
+ "width": 4
+ },
+ "SAFARI_ZONE_WEST": {
+ "height": 13,
+ "index": 219,
+ "width": 15
+ },
+ "SAFARI_ZONE_WEST_REST_HOUSE": {
+ "height": 4,
+ "index": 223,
+ "width": 4
+ },
+ "SAFFRON_CITY": {
+ "height": 18,
+ "index": 10,
+ "width": 20
+ },
+ "SAFFRON_GYM": {
+ "height": 9,
+ "index": 178,
+ "width": 10
+ },
+ "SAFFRON_MART": {
+ "height": 4,
+ "index": 180,
+ "width": 4
+ },
+ "SAFFRON_PIDGEY_HOUSE": {
+ "height": 4,
+ "index": 179,
+ "width": 4
+ },
+ "SAFFRON_POKECENTER": {
+ "height": 4,
+ "index": 182,
+ "width": 7
+ },
+ "SEAFOAM_ISLANDS_1F": {
+ "height": 9,
+ "index": 192,
+ "width": 15
+ },
+ "SEAFOAM_ISLANDS_B1F": {
+ "height": 9,
+ "index": 159,
+ "width": 15
+ },
+ "SEAFOAM_ISLANDS_B2F": {
+ "height": 9,
+ "index": 160,
+ "width": 15
+ },
+ "SEAFOAM_ISLANDS_B3F": {
+ "height": 9,
+ "index": 161,
+ "width": 15
+ },
+ "SEAFOAM_ISLANDS_B4F": {
+ "height": 9,
+ "index": 162,
+ "width": 15
+ },
+ "SILPH_CO_10F": {
+ "height": 9,
+ "index": 234,
+ "width": 8
+ },
+ "SILPH_CO_11F": {
+ "height": 9,
+ "index": 235,
+ "width": 9
+ },
+ "SILPH_CO_1F": {
+ "height": 9,
+ "index": 181,
+ "width": 15
+ },
+ "SILPH_CO_2F": {
+ "height": 9,
+ "index": 207,
+ "width": 15
+ },
+ "SILPH_CO_3F": {
+ "height": 9,
+ "index": 208,
+ "width": 15
+ },
+ "SILPH_CO_4F": {
+ "height": 9,
+ "index": 209,
+ "width": 15
+ },
+ "SILPH_CO_5F": {
+ "height": 9,
+ "index": 210,
+ "width": 15
+ },
+ "SILPH_CO_6F": {
+ "height": 9,
+ "index": 211,
+ "width": 13
+ },
+ "SILPH_CO_7F": {
+ "height": 9,
+ "index": 212,
+ "width": 13
+ },
+ "SILPH_CO_8F": {
+ "height": 9,
+ "index": 213,
+ "width": 13
+ },
+ "SILPH_CO_9F": {
+ "height": 9,
+ "index": 233,
+ "width": 13
+ },
+ "SILPH_CO_ELEVATOR": {
+ "height": 2,
+ "index": 236,
+ "width": 2
+ },
+ "SS_ANNE_1F": {
+ "height": 9,
+ "index": 95,
+ "width": 20
+ },
+ "SS_ANNE_1F_ROOMS": {
+ "height": 8,
+ "index": 102,
+ "width": 12
+ },
+ "SS_ANNE_2F": {
+ "height": 9,
+ "index": 96,
+ "width": 20
+ },
+ "SS_ANNE_2F_ROOMS": {
+ "height": 8,
+ "index": 103,
+ "width": 12
+ },
+ "SS_ANNE_3F": {
+ "height": 3,
+ "index": 97,
+ "width": 10
+ },
+ "SS_ANNE_B1F": {
+ "height": 4,
+ "index": 98,
+ "width": 15
+ },
+ "SS_ANNE_B1F_ROOMS": {
+ "height": 8,
+ "index": 104,
+ "width": 12
+ },
+ "SS_ANNE_BOW": {
+ "height": 7,
+ "index": 99,
+ "width": 10
+ },
+ "SS_ANNE_CAPTAINS_ROOM": {
+ "height": 4,
+ "index": 101,
+ "width": 3
+ },
+ "SS_ANNE_KITCHEN": {
+ "height": 8,
+ "index": 100,
+ "width": 7
+ },
+ "SUMMER_BEACH_HOUSE": {
+ "height": 4,
+ "index": 248,
+ "width": 7
+ },
+ "TRADE_CENTER": {
+ "height": 4,
+ "index": 239,
+ "width": 5
+ },
+ "UNDERGROUND_PATH_NORTH_SOUTH": {
+ "height": 24,
+ "index": 119,
+ "width": 4
+ },
+ "UNDERGROUND_PATH_ROUTE_5": {
+ "height": 4,
+ "index": 71,
+ "width": 4
+ },
+ "UNDERGROUND_PATH_ROUTE_6": {
+ "height": 4,
+ "index": 74,
+ "width": 4
+ },
+ "UNDERGROUND_PATH_ROUTE_6_COPY": {
+ "height": 4,
+ "index": 75,
+ "width": 4
+ },
+ "UNDERGROUND_PATH_ROUTE_7": {
+ "height": 4,
+ "index": 77,
+ "width": 4
+ },
+ "UNDERGROUND_PATH_ROUTE_7_COPY": {
+ "height": 4,
+ "index": 78,
+ "width": 4
+ },
+ "UNDERGROUND_PATH_ROUTE_8": {
+ "height": 4,
+ "index": 80,
+ "width": 4
+ },
+ "UNDERGROUND_PATH_WEST_EAST": {
+ "height": 4,
+ "index": 121,
+ "width": 25
+ },
+ "UNUSED_MAP_0B": {
+ "height": 0,
+ "index": 11,
+ "width": 0
+ },
+ "UNUSED_MAP_69": {
+ "height": 0,
+ "index": 105,
+ "width": 0
+ },
+ "UNUSED_MAP_6A": {
+ "height": 0,
+ "index": 106,
+ "width": 0
+ },
+ "UNUSED_MAP_6B": {
+ "height": 0,
+ "index": 107,
+ "width": 0
+ },
+ "UNUSED_MAP_6D": {
+ "height": 0,
+ "index": 109,
+ "width": 0
+ },
+ "UNUSED_MAP_6E": {
+ "height": 0,
+ "index": 110,
+ "width": 0
+ },
+ "UNUSED_MAP_6F": {
+ "height": 0,
+ "index": 111,
+ "width": 0
+ },
+ "UNUSED_MAP_70": {
+ "height": 0,
+ "index": 112,
+ "width": 0
+ },
+ "UNUSED_MAP_72": {
+ "height": 0,
+ "index": 114,
+ "width": 0
+ },
+ "UNUSED_MAP_73": {
+ "height": 0,
+ "index": 115,
+ "width": 0
+ },
+ "UNUSED_MAP_74": {
+ "height": 0,
+ "index": 116,
+ "width": 0
+ },
+ "UNUSED_MAP_75": {
+ "height": 0,
+ "index": 117,
+ "width": 0
+ },
+ "UNUSED_MAP_CC": {
+ "height": 0,
+ "index": 204,
+ "width": 0
+ },
+ "UNUSED_MAP_CD": {
+ "height": 0,
+ "index": 205,
+ "width": 0
+ },
+ "UNUSED_MAP_CE": {
+ "height": 0,
+ "index": 206,
+ "width": 0
+ },
+ "UNUSED_MAP_E7": {
+ "height": 0,
+ "index": 231,
+ "width": 0
+ },
+ "UNUSED_MAP_ED": {
+ "height": 0,
+ "index": 237,
+ "width": 0
+ },
+ "UNUSED_MAP_EE": {
+ "height": 0,
+ "index": 238,
+ "width": 0
+ },
+ "UNUSED_MAP_F1": {
+ "height": 0,
+ "index": 241,
+ "width": 0
+ },
+ "UNUSED_MAP_F2": {
+ "height": 0,
+ "index": 242,
+ "width": 0
+ },
+ "UNUSED_MAP_F3": {
+ "height": 0,
+ "index": 243,
+ "width": 0
+ },
+ "UNUSED_MAP_F4": {
+ "height": 0,
+ "index": 244,
+ "width": 0
+ },
+ "VERMILION_CITY": {
+ "height": 18,
+ "index": 5,
+ "width": 20
+ },
+ "VERMILION_DOCK": {
+ "height": 6,
+ "index": 94,
+ "width": 14
+ },
+ "VERMILION_GYM": {
+ "height": 9,
+ "index": 92,
+ "width": 5
+ },
+ "VERMILION_MART": {
+ "height": 4,
+ "index": 91,
+ "width": 4
+ },
+ "VERMILION_OLD_ROD_HOUSE": {
+ "height": 4,
+ "index": 163,
+ "width": 4
+ },
+ "VERMILION_PIDGEY_HOUSE": {
+ "height": 4,
+ "index": 93,
+ "width": 4
+ },
+ "VERMILION_POKECENTER": {
+ "height": 4,
+ "index": 89,
+ "width": 7
+ },
+ "VERMILION_TRADE_HOUSE": {
+ "height": 4,
+ "index": 196,
+ "width": 4
+ },
+ "VICTORY_ROAD_1F": {
+ "height": 9,
+ "index": 108,
+ "width": 10
+ },
+ "VICTORY_ROAD_2F": {
+ "height": 9,
+ "index": 194,
+ "width": 15
+ },
+ "VICTORY_ROAD_3F": {
+ "height": 9,
+ "index": 198,
+ "width": 15
+ },
+ "VIRIDIAN_CITY": {
+ "height": 18,
+ "index": 1,
+ "width": 20
+ },
+ "VIRIDIAN_FOREST": {
+ "height": 24,
+ "index": 51,
+ "width": 17
+ },
+ "VIRIDIAN_FOREST_NORTH_GATE": {
+ "height": 4,
+ "index": 47,
+ "width": 5
+ },
+ "VIRIDIAN_FOREST_SOUTH_GATE": {
+ "height": 4,
+ "index": 50,
+ "width": 5
+ },
+ "VIRIDIAN_GYM": {
+ "height": 9,
+ "index": 45,
+ "width": 10
+ },
+ "VIRIDIAN_MART": {
+ "height": 4,
+ "index": 42,
+ "width": 4
+ },
+ "VIRIDIAN_NICKNAME_HOUSE": {
+ "height": 4,
+ "index": 44,
+ "width": 4
+ },
+ "VIRIDIAN_POKECENTER": {
+ "height": 4,
+ "index": 41,
+ "width": 7
+ },
+ "VIRIDIAN_SCHOOL_HOUSE": {
+ "height": 4,
+ "index": 43,
+ "width": 4
+ },
+ "WARDENS_HOUSE": {
+ "height": 4,
+ "index": 155,
+ "width": 5
+ }
+ },
+ "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"
+ ],
+ "source": "ROM metadata manifest",
+ "speciesOrder": [
+ "RHYDON",
+ "KANGASKHAN",
+ "NIDORAN_M",
+ "CLEFAIRY",
+ "SPEAROW",
+ "VOLTORB",
+ "NIDOKING",
+ "SLOWBRO",
+ "IVYSAUR",
+ "EXEGGUTOR",
+ "LICKITUNG",
+ "EXEGGCUTE",
+ "GRIMER",
+ "GENGAR",
+ "NIDORAN_F",
+ "NIDOQUEEN",
+ "CUBONE",
+ "RHYHORN",
+ "LAPRAS",
+ "ARCANINE",
+ "MEW",
+ "GYARADOS",
+ "SHELLDER",
+ "TENTACOOL",
+ "GASTLY",
+ "SCYTHER",
+ "STARYU",
+ "BLASTOISE",
+ "PINSIR",
+ "TANGELA",
+ "UNUSED",
+ "UNUSED",
+ "GROWLITHE",
+ "ONIX",
+ "FEAROW",
+ "PIDGEY",
+ "SLOWPOKE",
+ "KADABRA",
+ "GRAVELER",
+ "CHANSEY",
+ "MACHOKE",
+ "MR_MIME",
+ "HITMONLEE",
+ "HITMONCHAN",
+ "ARBOK",
+ "PARASECT",
+ "PSYDUCK",
+ "DROWZEE",
+ "GOLEM",
+ "UNUSED",
+ "MAGMAR",
+ "UNUSED",
+ "ELECTABUZZ",
+ "MAGNETON",
+ "KOFFING",
+ "UNUSED",
+ "MANKEY",
+ "SEEL",
+ "DIGLETT",
+ "TAUROS",
+ "UNUSED",
+ "UNUSED",
+ "UNUSED",
+ "FARFETCHD",
+ "VENONAT",
+ "DRAGONITE",
+ "UNUSED",
+ "UNUSED",
+ "UNUSED",
+ "DODUO",
+ "POLIWAG",
+ "JYNX",
+ "MOLTRES",
+ "ARTICUNO",
+ "ZAPDOS",
+ "DITTO",
+ "MEOWTH",
+ "KRABBY",
+ "UNUSED",
+ "UNUSED",
+ "UNUSED",
+ "VULPIX",
+ "NINETALES",
+ "PIKACHU",
+ "RAICHU",
+ "UNUSED",
+ "UNUSED",
+ "DRATINI",
+ "DRAGONAIR",
+ "KABUTO",
+ "KABUTOPS",
+ "HORSEA",
+ "SEADRA",
+ "UNUSED",
+ "UNUSED",
+ "SANDSHREW",
+ "SANDSLASH",
+ "OMANYTE",
+ "OMASTAR",
+ "JIGGLYPUFF",
+ "WIGGLYTUFF",
+ "EEVEE",
+ "FLAREON",
+ "JOLTEON",
+ "VAPOREON",
+ "MACHOP",
+ "ZUBAT",
+ "EKANS",
+ "PARAS",
+ "POLIWHIRL",
+ "POLIWRATH",
+ "WEEDLE",
+ "KAKUNA",
+ "BEEDRILL",
+ "UNUSED",
+ "DODRIO",
+ "PRIMEAPE",
+ "DUGTRIO",
+ "VENOMOTH",
+ "DEWGONG",
+ "UNUSED",
+ "UNUSED",
+ "CATERPIE",
+ "METAPOD",
+ "BUTTERFREE",
+ "MACHAMP",
+ "UNUSED",
+ "GOLDUCK",
+ "HYPNO",
+ "GOLBAT",
+ "MEWTWO",
+ "SNORLAX",
+ "MAGIKARP",
+ "UNUSED",
+ "UNUSED",
+ "MUK",
+ "UNUSED",
+ "KINGLER",
+ "CLOYSTER",
+ "UNUSED",
+ "ELECTRODE",
+ "CLEFABLE",
+ "WEEZING",
+ "PERSIAN",
+ "MAROWAK",
+ "UNUSED",
+ "HAUNTER",
+ "ABRA",
+ "ALAKAZAM",
+ "PIDGEOTTO",
+ "PIDGEOT",
+ "STARMIE",
+ "BULBASAUR",
+ "VENUSAUR",
+ "TENTACRUEL",
+ "UNUSED",
+ "GOLDEEN",
+ "SEAKING",
+ "UNUSED",
+ "UNUSED",
+ "UNUSED",
+ "UNUSED",
+ "PONYTA",
+ "RAPIDASH",
+ "RATTATA",
+ "RATICATE",
+ "NIDORINO",
+ "NIDORINA",
+ "GEODUDE",
+ "PORYGON",
+ "AERODACTYL",
+ "UNUSED",
+ "MAGNEMITE",
+ "UNUSED",
+ "UNUSED",
+ "CHARMANDER",
+ "SQUIRTLE",
+ "CHARMELEON",
+ "WARTORTLE",
+ "CHARIZARD",
+ "UNUSED",
+ "FOSSIL_KABUTOPS",
+ "FOSSIL_AERODACTYL",
+ "MON_GHOST",
+ "ODDISH",
+ "GLOOM",
+ "VILEPLUME",
+ "BELLSPROUT",
+ "WEEPINBELL",
+ "VICTREEBEL"
+ ],
+ "spriteOrder": [
+ "SPRITE_RED",
+ "SPRITE_BLUE",
+ "SPRITE_OAK",
+ "SPRITE_YOUNGSTER",
+ "SPRITE_MONSTER",
+ "SPRITE_COOLTRAINER_F",
+ "SPRITE_COOLTRAINER_M",
+ "SPRITE_LITTLE_GIRL",
+ "SPRITE_BIRD",
+ "SPRITE_MIDDLE_AGED_MAN",
+ "SPRITE_GAMBLER",
+ "SPRITE_SUPER_NERD",
+ "SPRITE_GIRL",
+ "SPRITE_HIKER",
+ "SPRITE_BEAUTY",
+ "SPRITE_GENTLEMAN",
+ "SPRITE_DAISY",
+ "SPRITE_BIKER",
+ "SPRITE_SAILOR",
+ "SPRITE_COOK",
+ "SPRITE_BIKE_SHOP_CLERK",
+ "SPRITE_MR_FUJI",
+ "SPRITE_GIOVANNI",
+ "SPRITE_ROCKET",
+ "SPRITE_CHANNELER",
+ "SPRITE_WAITER",
+ "SPRITE_SILPH_WORKER_F",
+ "SPRITE_MIDDLE_AGED_WOMAN",
+ "SPRITE_BRUNETTE_GIRL",
+ "SPRITE_LANCE",
+ "SPRITE_UNUSED_RED_1",
+ "SPRITE_SCIENTIST",
+ "SPRITE_ROCKER",
+ "SPRITE_SWIMMER",
+ "SPRITE_SAFARI_ZONE_WORKER",
+ "SPRITE_GYM_GUIDE",
+ "SPRITE_GRAMPS",
+ "SPRITE_CLERK",
+ "SPRITE_FISHING_GURU",
+ "SPRITE_GRANNY",
+ "SPRITE_NURSE",
+ "SPRITE_LINK_RECEPTIONIST",
+ "SPRITE_SILPH_PRESIDENT",
+ "SPRITE_SILPH_WORKER_M",
+ "SPRITE_WARDEN",
+ "SPRITE_CAPTAIN",
+ "SPRITE_FISHER",
+ "SPRITE_KOGA",
+ "SPRITE_GUARD",
+ "SPRITE_UNUSED_RED_2",
+ "SPRITE_MOM",
+ "SPRITE_BALDING_GUY",
+ "SPRITE_LITTLE_BOY",
+ "SPRITE_UNUSED_RED_3",
+ "SPRITE_GAMEBOY_KID",
+ "SPRITE_FAIRY",
+ "SPRITE_AGATHA",
+ "SPRITE_BRUNO",
+ "SPRITE_LORELEI",
+ "SPRITE_SEEL",
+ "SPRITE_PIKACHU",
+ "SPRITE_OFFICER_JENNY",
+ "SPRITE_SANDSHREW",
+ "SPRITE_ODDISH",
+ "SPRITE_BULBASAUR",
+ "SPRITE_JIGGLYPUFF",
+ "SPRITE_CLEFAIRY",
+ "SPRITE_CHANSEY",
+ "SPRITE_JESSIE",
+ "SPRITE_JAMES",
+ "SPRITE_POKE_BALL",
+ "SPRITE_FOSSIL",
+ "SPRITE_BOULDER",
+ "SPRITE_PAPER",
+ "SPRITE_POKEDEX",
+ "SPRITE_CLIPBOARD",
+ "SPRITE_SNORLAX",
+ "SPRITE_UNUSED_OLD_AMBER",
+ "SPRITE_OLD_AMBER",
+ "SPRITE_UNUSED_GAMBLER_ASLEEP_1",
+ "SPRITE_UNUSED_GAMBLER_ASLEEP_2",
+ "SPRITE_GAMBLER_ASLEEP"
+ ],
+ "tilesetOrder": [
+ "OVERWORLD",
+ "REDS_HOUSE_1",
+ "MART",
+ "FOREST",
+ "REDS_HOUSE_2",
+ "DOJO",
+ "POKECENTER",
+ "GYM",
+ "HOUSE",
+ "FOREST_GATE",
+ "MUSEUM",
+ "UNDERGROUND",
+ "GATE",
+ "SHIP",
+ "SHIP_PORT",
+ "CEMETERY",
+ "INTERIOR",
+ "CAVERN",
+ "LOBBY",
+ "MANSION",
+ "LAB",
+ "CLUB",
+ "FACILITY",
+ "PLATEAU",
+ "BEACH_HOUSE"
+ ],
+ "types": {
+ "BIRD": 6,
+ "BUG": 7,
+ "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,
+ "WATER": 21
+ }
+ },
+ "dexEntryLabels": {
+ "ABRA": "_AbraDexEntry",
+ "AERODACTYL": "_AerodactylDexEntry",
+ "ALAKAZAM": "_AlakazamDexEntry",
+ "ARBOK": "_ArbokDexEntry",
+ "ARCANINE": "_ArcanineDexEntry",
+ "ARTICUNO": "_ArticunoDexEntry",
+ "BEEDRILL": "_BeedrillDexEntry",
+ "BELLSPROUT": "_BellsproutDexEntry",
+ "BLASTOISE": "_BlastoiseDexEntry",
+ "BULBASAUR": "_BulbasaurDexEntry",
+ "BUTTERFREE": "_ButterfreeDexEntry",
+ "CATERPIE": "_CaterpieDexEntry",
+ "CHANSEY": "_ChanseyDexEntry",
+ "CHARIZARD": "_CharizardDexEntry",
+ "CHARMANDER": "_CharmanderDexEntry",
+ "CHARMELEON": "_CharmeleonDexEntry",
+ "CLEFABLE": "_ClefableDexEntry",
+ "CLEFAIRY": "_ClefairyDexEntry",
+ "CLOYSTER": "_CloysterDexEntry",
+ "CUBONE": "_CuboneDexEntry",
+ "DEWGONG": "_DewgongDexEntry",
+ "DIGLETT": "_DiglettDexEntry",
+ "DITTO": "_DittoDexEntry",
+ "DODRIO": "_DodrioDexEntry",
+ "DODUO": "_DoduoDexEntry",
+ "DRAGONAIR": "_DragonairDexEntry",
+ "DRAGONITE": "_DragoniteDexEntry",
+ "DRATINI": "_DratiniDexEntry",
+ "DROWZEE": "_DrowzeeDexEntry",
+ "DUGTRIO": "_DugtrioDexEntry",
+ "EEVEE": "_EeveeDexEntry",
+ "EKANS": "_EkansDexEntry",
+ "ELECTABUZZ": "_ElectabuzzDexEntry",
+ "ELECTRODE": "_ElectrodeDexEntry",
+ "EXEGGCUTE": "_ExeggcuteDexEntry",
+ "EXEGGUTOR": "_ExeggutorDexEntry",
+ "FARFETCHD": "_FarfetchdDexEntry",
+ "FEAROW": "_FearowDexEntry",
+ "FLAREON": "_FlareonDexEntry",
+ "GASTLY": "_GastlyDexEntry",
+ "GENGAR": "_GengarDexEntry",
+ "GEODUDE": "_GeodudeDexEntry",
+ "GLOOM": "_GloomDexEntry",
+ "GOLBAT": "_GolbatDexEntry",
+ "GOLDEEN": "_GoldeenDexEntry",
+ "GOLDUCK": "_GolduckDexEntry",
+ "GOLEM": "_GolemDexEntry",
+ "GRAVELER": "_GravelerDexEntry",
+ "GRIMER": "_GrimerDexEntry",
+ "GROWLITHE": "_GrowlitheDexEntry",
+ "GYARADOS": "_GyaradosDexEntry",
+ "HAUNTER": "_HaunterDexEntry",
+ "HITMONCHAN": "_HitmonchanDexEntry",
+ "HITMONLEE": "_HitmonleeDexEntry",
+ "HORSEA": "_HorseaDexEntry",
+ "HYPNO": "_HypnoDexEntry",
+ "IVYSAUR": "_IvysaurDexEntry",
+ "JIGGLYPUFF": "_JigglypuffDexEntry",
+ "JOLTEON": "_JolteonDexEntry",
+ "JYNX": "_JynxDexEntry",
+ "KABUTO": "_KabutoDexEntry",
+ "KABUTOPS": "_KabutopsDexEntry",
+ "KADABRA": "_KadabraDexEntry",
+ "KAKUNA": "_KakunaDexEntry",
+ "KANGASKHAN": "_KangaskhanDexEntry",
+ "KINGLER": "_KinglerDexEntry",
+ "KOFFING": "_KoffingDexEntry",
+ "KRABBY": "_KrabbyDexEntry",
+ "LAPRAS": "_LaprasDexEntry",
+ "LICKITUNG": "_LickitungDexEntry",
+ "MACHAMP": "_MachampDexEntry",
+ "MACHOKE": "_MachokeDexEntry",
+ "MACHOP": "_MachopDexEntry",
+ "MAGIKARP": "_MagikarpDexEntry",
+ "MAGMAR": "_MagmarDexEntry",
+ "MAGNEMITE": "_MagnemiteDexEntry",
+ "MAGNETON": "_MagnetonDexEntry",
+ "MANKEY": "_MankeyDexEntry",
+ "MAROWAK": "_MarowakDexEntry",
+ "MEOWTH": "_MeowthDexEntry",
+ "METAPOD": "_MetapodDexEntry",
+ "MEW": "_MewDexEntry",
+ "MEWTWO": "_MewtwoDexEntry",
+ "MOLTRES": "_MoltresDexEntry",
+ "MR_MIME": "_MrMimeDexEntry",
+ "MUK": "_MukDexEntry",
+ "NIDOKING": "_NidokingDexEntry",
+ "NIDOQUEEN": "_NidoqueenDexEntry",
+ "NIDORAN_F": "_NidoranFDexEntry",
+ "NIDORAN_M": "_NidoranMDexEntry",
+ "NIDORINA": "_NidorinaDexEntry",
+ "NIDORINO": "_NidorinoDexEntry",
+ "NINETALES": "_NinetalesDexEntry",
+ "ODDISH": "_OddishDexEntry",
+ "OMANYTE": "_OmanyteDexEntry",
+ "OMASTAR": "_OmastarDexEntry",
+ "ONIX": "_OnixDexEntry",
+ "PARAS": "_ParasDexEntry",
+ "PARASECT": "_ParasectDexEntry",
+ "PERSIAN": "_PersianDexEntry",
+ "PIDGEOT": "_PidgeotDexEntry",
+ "PIDGEOTTO": "_PidgeottoDexEntry",
+ "PIDGEY": "_PidgeyDexEntry",
+ "PIKACHU": "_PikachuDexEntry",
+ "PINSIR": "_PinsirDexEntry",
+ "POLIWAG": "_PoliwagDexEntry",
+ "POLIWHIRL": "_PoliwhirlDexEntry",
+ "POLIWRATH": "_PoliwrathDexEntry",
+ "PONYTA": "_PonytaDexEntry",
+ "PORYGON": "_PorygonDexEntry",
+ "PRIMEAPE": "_PrimeapeDexEntry",
+ "PSYDUCK": "_PsyduckDexEntry",
+ "RAICHU": "_RaichuDexEntry",
+ "RAPIDASH": "_RapidashDexEntry",
+ "RATICATE": "_RaticateDexEntry",
+ "RATTATA": "_RattataDexEntry",
+ "RHYDON": "_RhydonDexEntry",
+ "RHYHORN": "_RhyhornDexEntry",
+ "SANDSHREW": "_SandshrewDexEntry",
+ "SANDSLASH": "_SandslashDexEntry",
+ "SCYTHER": "_ScytherDexEntry",
+ "SEADRA": "_SeadraDexEntry",
+ "SEAKING": "_SeakingDexEntry",
+ "SEEL": "_SeelDexEntry",
+ "SHELLDER": "_ShellderDexEntry",
+ "SLOWBRO": "_SlowbroDexEntry",
+ "SLOWPOKE": "_SlowpokeDexEntry",
+ "SNORLAX": "_SnorlaxDexEntry",
+ "SPEAROW": "_SpearowDexEntry",
+ "SQUIRTLE": "_SquirtleDexEntry",
+ "STARMIE": "_StarmieDexEntry",
+ "STARYU": "_StaryuDexEntry",
+ "TANGELA": "_TangelaDexEntry",
+ "TAUROS": "_TaurosDexEntry",
+ "TENTACOOL": "_TentacoolDexEntry",
+ "TENTACRUEL": "_TentacruelDexEntry",
+ "VAPOREON": "_VaporeonDexEntry",
+ "VENOMOTH": "_VenomothDexEntry",
+ "VENONAT": "_VenonatDexEntry",
+ "VENUSAUR": "_VenusaurDexEntry",
+ "VICTREEBEL": "_VictreebelDexEntry",
+ "VILEPLUME": "_VileplumeDexEntry",
+ "VOLTORB": "_VoltorbDexEntry",
+ "VULPIX": "_VulpixDexEntry",
+ "WARTORTLE": "_WartortleDexEntry",
+ "WEEDLE": "_WeedleDexEntry",
+ "WEEPINBELL": "_WeepinbellDexEntry",
+ "WEEZING": "_WeezingDexEntry",
+ "WIGGLYTUFF": "_WigglytuffDexEntry",
+ "ZAPDOS": "_ZapdosDexEntry",
+ "ZUBAT": "_ZubatDexEntry"
+ },
+ "dexOrder": [
+ "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",
+ "FARFETCHD",
+ "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"
+ ],
+ "field": {
+ "badgeGates": {
+ "ROUTE_22_GATE": {
+ "badge": "BOULDERBADGE",
+ "coords": [
+ {
+ "x": 4,
+ "y": 2
+ },
+ {
+ "x": 5,
+ "y": 2
+ }
+ ],
+ "failText": "Route22GateGuardNoBoulderbadgeText",
+ "passText": "Route22GateGuardGoRightAheadText",
+ "text": "Route22GateGuardText"
+ },
+ "ROUTE_23": {
+ "failText": "Route23YouDontHaveTheBadgeYetText",
+ "guards": [
+ {
+ "badge": "EARTHBADGE",
+ "event": "EVENT_PASSED_EARTHBADGE_CHECK",
+ "maxX": 13,
+ "sprite": 1,
+ "text": "Route23Guard1Text",
+ "y": 35
+ },
+ {
+ "badge": "VOLCANOBADGE",
+ "event": "EVENT_PASSED_VOLCANOBADGE_CHECK",
+ "sprite": 2,
+ "text": "Route23Guard2Text",
+ "y": 56
+ },
+ {
+ "badge": "MARSHBADGE",
+ "event": "EVENT_PASSED_MARSHBADGE_CHECK",
+ "sprite": 3,
+ "text": "Route23Swimmer1Text",
+ "y": 85
+ },
+ {
+ "badge": "SOULBADGE",
+ "event": "EVENT_PASSED_SOULBADGE_CHECK",
+ "sprite": 4,
+ "text": "Route23Swimmer2Text",
+ "y": 96
+ },
+ {
+ "badge": "RAINBOWBADGE",
+ "event": "EVENT_PASSED_RAINBOWBADGE_CHECK",
+ "sprite": 5,
+ "text": "Route23Guard3Text",
+ "y": 105
+ },
+ {
+ "badge": "THUNDERBADGE",
+ "event": "EVENT_PASSED_THUNDERBADGE_CHECK",
+ "sprite": 6,
+ "text": "Route23Guard4Text",
+ "y": 119
+ },
+ {
+ "badge": "CASCADEBADGE",
+ "event": "EVENT_PASSED_CASCADEBADGE_CHECK",
+ "sprite": 7,
+ "text": "Route23Guard5Text",
+ "y": 136
+ }
+ ],
+ "passText": "Route23OhThatIsTheBadgeText"
+ }
+ },
+ "battleHud": {
+ "fontBattleExtra": {
+ "height": 16,
+ "path": "assets/generated/battle/font_battle_extra.png",
+ "tileBase": 98,
+ "width": 120
+ },
+ "hud1": {
+ "height": 8,
+ "path": "assets/generated/battle/battle_hud_1.png",
+ "tileBase": 109,
+ "width": 24
+ },
+ "hud2": {
+ "height": 8,
+ "path": "assets/generated/battle/battle_hud_2.png",
+ "tileBase": 115,
+ "width": 24
+ },
+ "hud3": {
+ "height": 8,
+ "path": "assets/generated/battle/battle_hud_3.png",
+ "tileBase": 118,
+ "width": 24
+ }
+ },
+ "bikeRiding": {
+ "maps": [
+ "ROUTE_23",
+ "INDIGO_PLATEAU"
+ ],
+ "tilesets": [
+ "OVERWORLD",
+ "FOREST",
+ "UNDERGROUND",
+ "SHIP_PORT",
+ "CAVERN"
+ ]
+ },
+ "cardKeyDoors": {
+ "closedDoors": {
+ "ROCKET_HIDEOUT_B1F": [
+ {
+ "block": 84,
+ "bx": 12,
+ "by": 8,
+ "event": "EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_4",
+ "open": 14
+ }
+ ],
+ "ROCKET_HIDEOUT_B4F": [
+ {
+ "block": 45,
+ "bx": 12,
+ "by": 5,
+ "events": [
+ "EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_0",
+ "EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_1"
+ ],
+ "open": 14
+ }
+ ],
+ "SILPH_CO_10F": [
+ {
+ "block": 84,
+ "bx": 5,
+ "by": 4,
+ "event": "EVENT_SILPH_CO_10_UNLOCKED_DOOR",
+ "open": 14
+ }
+ ],
+ "SILPH_CO_11F": [
+ {
+ "block": 32,
+ "bx": 3,
+ "by": 6,
+ "event": "EVENT_SILPH_CO_11_UNLOCKED_DOOR",
+ "open": 3
+ }
+ ],
+ "SILPH_CO_2F": [
+ {
+ "block": 84,
+ "bx": 2,
+ "by": 2,
+ "event": "EVENT_SILPH_CO_2_UNLOCKED_DOOR1",
+ "open": 14
+ },
+ {
+ "block": 84,
+ "bx": 2,
+ "by": 5,
+ "event": "EVENT_SILPH_CO_2_UNLOCKED_DOOR2",
+ "open": 14
+ }
+ ],
+ "SILPH_CO_3F": [
+ {
+ "block": 95,
+ "bx": 4,
+ "by": 4,
+ "event": "EVENT_SILPH_CO_3_UNLOCKED_DOOR1",
+ "open": 14
+ },
+ {
+ "block": 95,
+ "bx": 8,
+ "by": 4,
+ "event": "EVENT_SILPH_CO_3_UNLOCKED_DOOR2",
+ "open": 14
+ }
+ ],
+ "SILPH_CO_4F": [
+ {
+ "block": 84,
+ "bx": 2,
+ "by": 6,
+ "event": "EVENT_SILPH_CO_4_UNLOCKED_DOOR1",
+ "open": 14
+ },
+ {
+ "block": 84,
+ "bx": 6,
+ "by": 4,
+ "event": "EVENT_SILPH_CO_4_UNLOCKED_DOOR2",
+ "open": 14
+ }
+ ],
+ "SILPH_CO_5F": [
+ {
+ "block": 95,
+ "bx": 3,
+ "by": 2,
+ "event": "EVENT_SILPH_CO_5_UNLOCKED_DOOR1",
+ "open": 14
+ },
+ {
+ "block": 95,
+ "bx": 3,
+ "by": 6,
+ "event": "EVENT_SILPH_CO_5_UNLOCKED_DOOR2",
+ "open": 14
+ },
+ {
+ "block": 95,
+ "bx": 7,
+ "by": 5,
+ "event": "EVENT_SILPH_CO_5_UNLOCKED_DOOR3",
+ "open": 14
+ }
+ ],
+ "SILPH_CO_6F": [
+ {
+ "block": 95,
+ "bx": 2,
+ "by": 6,
+ "event": "EVENT_SILPH_CO_6_UNLOCKED_DOOR",
+ "open": 14
+ }
+ ],
+ "SILPH_CO_7F": [
+ {
+ "block": 84,
+ "bx": 5,
+ "by": 3,
+ "event": "EVENT_SILPH_CO_7_UNLOCKED_DOOR1",
+ "open": 14
+ },
+ {
+ "block": 84,
+ "bx": 10,
+ "by": 2,
+ "event": "EVENT_SILPH_CO_7_UNLOCKED_DOOR2",
+ "open": 14
+ },
+ {
+ "block": 84,
+ "bx": 10,
+ "by": 6,
+ "event": "EVENT_SILPH_CO_7_UNLOCKED_DOOR3",
+ "open": 14
+ }
+ ],
+ "SILPH_CO_8F": [
+ {
+ "block": 95,
+ "bx": 3,
+ "by": 4,
+ "event": "EVENT_SILPH_CO_8_UNLOCKED_DOOR",
+ "open": 14
+ }
+ ],
+ "SILPH_CO_9F": [
+ {
+ "block": 95,
+ "bx": 1,
+ "by": 4,
+ "event": "EVENT_SILPH_CO_9_UNLOCKED_DOOR1",
+ "open": 14
+ },
+ {
+ "block": 84,
+ "bx": 9,
+ "by": 2,
+ "event": "EVENT_SILPH_CO_9_UNLOCKED_DOOR2",
+ "open": 14
+ },
+ {
+ "block": 84,
+ "bx": 9,
+ "by": 5,
+ "event": "EVENT_SILPH_CO_9_UNLOCKED_DOOR3",
+ "open": 14
+ },
+ {
+ "block": 95,
+ "bx": 5,
+ "by": 6,
+ "event": "EVENT_SILPH_CO_9_UNLOCKED_DOOR4",
+ "open": 14
+ }
+ ]
+ },
+ "doorTiles": [
+ 24,
+ 36
+ ],
+ "doors": {
+ "SILPH_CO_10F": [
+ {
+ "gate": 8,
+ "x": 10,
+ "y": 8
+ },
+ {
+ "gate": 9,
+ "x": 11,
+ "y": 8
+ }
+ ],
+ "SILPH_CO_11F": [
+ {
+ "gate": 20,
+ "x": 9,
+ "y": 8
+ },
+ {
+ "gate": 21,
+ "x": 9,
+ "y": 9
+ }
+ ],
+ "SILPH_CO_2F": [
+ {
+ "gate": 0,
+ "x": 4,
+ "y": 4
+ },
+ {
+ "gate": 1,
+ "x": 5,
+ "y": 4
+ }
+ ],
+ "SILPH_CO_3F": [
+ {
+ "gate": 10,
+ "x": 9,
+ "y": 8
+ },
+ {
+ "gate": 11,
+ "x": 9,
+ "y": 9
+ }
+ ],
+ "SILPH_CO_4F": [
+ {
+ "gate": 2,
+ "x": 4,
+ "y": 12
+ },
+ {
+ "gate": 3,
+ "x": 5,
+ "y": 12
+ }
+ ],
+ "SILPH_CO_5F": [
+ {
+ "gate": 12,
+ "x": 7,
+ "y": 4
+ },
+ {
+ "gate": 13,
+ "x": 7,
+ "y": 5
+ }
+ ],
+ "SILPH_CO_6F": [
+ {
+ "gate": 14,
+ "x": 5,
+ "y": 12
+ },
+ {
+ "gate": 15,
+ "x": 5,
+ "y": 13
+ }
+ ],
+ "SILPH_CO_7F": [
+ {
+ "gate": 4,
+ "x": 10,
+ "y": 6
+ },
+ {
+ "gate": 5,
+ "x": 11,
+ "y": 6
+ }
+ ],
+ "SILPH_CO_8F": [
+ {
+ "gate": 16,
+ "x": 7,
+ "y": 8
+ },
+ {
+ "gate": 17,
+ "x": 7,
+ "y": 9
+ }
+ ],
+ "SILPH_CO_9F": [
+ {
+ "gate": 6,
+ "x": 18,
+ "y": 4
+ },
+ {
+ "gate": 7,
+ "x": 19,
+ "y": 4
+ },
+ {
+ "gate": 18,
+ "x": 3,
+ "y": 8
+ },
+ {
+ "gate": 19,
+ "x": 3,
+ "y": 9
+ }
+ ]
+ },
+ "maps": [
+ "SILPH_CO_2F",
+ "SILPH_CO_3F",
+ "SILPH_CO_4F",
+ "SILPH_CO_5F",
+ "SILPH_CO_6F",
+ "SILPH_CO_7F",
+ "SILPH_CO_8F",
+ "SILPH_CO_9F",
+ "SILPH_CO_10F",
+ "SILPH_CO_11F"
+ ],
+ "openBlock": 14,
+ "silphCo11F": {
+ "doorTile": 94,
+ "openBlock": 3
+ }
+ },
+ "coinPurchases": [
+ {
+ "coins": 50,
+ "price": 1000
+ }
+ ],
+ "credits": {
+ "mons": [
+ "VENUSAUR",
+ "ARBOK",
+ "RHYHORN",
+ "FEAROW",
+ "ABRA",
+ "GRAVELER",
+ "HITMONLEE",
+ "TANGELA",
+ "STARMIE",
+ "GYARADOS",
+ "DITTO",
+ "OMASTAR",
+ "VILEPLUME",
+ "NIDOKING",
+ "PARASECT",
+ "GENGAR"
+ ],
+ "screens": [
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 6,
+ "text": "POKéMON"
+ },
+ {
+ "column": 3,
+ "text": "YELLOW VERSION"
+ }
+ ],
+ "mon": "VENUSAUR"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 6,
+ "text": "DIRECTOR"
+ },
+ {
+ "column": 3,
+ "text": "SATOSHI TAJIRI"
+ }
+ ],
+ "mon": "ARBOK"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 4,
+ "text": "PROGRAMMERS"
+ },
+ {
+ "column": 3,
+ "text": "TAKENORI OOTA"
+ },
+ {
+ "column": 2,
+ "text": "SHIGEKI MORIMOTO"
+ },
+ {
+ "column": 2,
+ "text": "TETSUYA WATANABE"
+ }
+ ]
+ },
+ {
+ "fade": false,
+ "lines": [
+ {
+ "column": 4,
+ "text": "PROGRAMMERS"
+ },
+ {
+ "column": 3,
+ "text": "JUNICHI MASUDA"
+ },
+ {
+ "column": 3,
+ "text": "SOUSUKE TAMADA"
+ }
+ ],
+ "mon": "RHYHORN"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 2,
+ "text": "CHARACTER DESIGN"
+ },
+ {
+ "column": 4,
+ "text": "KEN SUGIMORI"
+ },
+ {
+ "column": 3,
+ "text": "ATSUKO NISHIDA"
+ }
+ ],
+ "mon": "FEAROW"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 7,
+ "text": "MUSIC"
+ },
+ {
+ "column": 3,
+ "text": "JUNICHI MASUDA"
+ }
+ ]
+ },
+ {
+ "fade": false,
+ "lines": [
+ {
+ "column": 3,
+ "text": "SOUND EFFECTS"
+ },
+ {
+ "column": 3,
+ "text": "JUNICHI MASUDA"
+ },
+ {
+ "column": 2,
+ "text": "TETSUYA WATANABE"
+ }
+ ],
+ "mon": "ABRA"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 4,
+ "text": "GAME DESIGN"
+ },
+ {
+ "column": 3,
+ "text": "SATOSHI TAJIRI"
+ },
+ {
+ "column": 4,
+ "text": "KOHJI NISHINO"
+ }
+ ],
+ "mon": "GRAVELER"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 3,
+ "text": "MONSTER DESIGN"
+ },
+ {
+ "column": 4,
+ "text": "KEN SUGIMORI"
+ },
+ {
+ "column": 3,
+ "text": "ATSUKO NISHIDA"
+ },
+ {
+ "column": 2,
+ "text": "HIRONOBU YOSHIDA"
+ }
+ ],
+ "mon": "HITMONLEE"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 3,
+ "text": "GAME SCENARIO"
+ },
+ {
+ "column": 3,
+ "text": "SATOSHI TAJIRI"
+ }
+ ]
+ },
+ {
+ "fade": false,
+ "lines": [
+ {
+ "column": 3,
+ "text": "GAME SCENARIO"
+ },
+ {
+ "column": 1,
+ "text": "TOSHINOBU MATSUMIYA"
+ }
+ ],
+ "mon": "TANGELA"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 2,
+ "text": "PARAMETRIC DESIGN"
+ },
+ {
+ "column": 4,
+ "text": "KOHJI NISHINO"
+ }
+ ],
+ "mon": "STARMIE"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 5,
+ "text": "MAP DESIGN"
+ },
+ {
+ "column": 3,
+ "text": "SATOSHI TAJIRI"
+ },
+ {
+ "column": 4,
+ "text": "KOHJI NISHINO"
+ },
+ {
+ "column": 4,
+ "text": "NOBUHIRO SEYA"
+ }
+ ],
+ "mon": "GYARADOS"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 3,
+ "text": "PRODUCT TESTING"
+ },
+ {
+ "column": 3,
+ "text": "KAZUHITO SEKINE"
+ },
+ {
+ "column": 4,
+ "text": "NOBUHIRO SEYA"
+ }
+ ]
+ },
+ {
+ "fade": false,
+ "lines": [
+ {
+ "column": 3,
+ "text": "PRODUCT TESTING"
+ },
+ {
+ "column": 2,
+ "text": "KAZUSHI SHIMAMURA"
+ },
+ {
+ "column": 0,
+ "text": "TERUYUKI SHIMOYAMADA"
+ }
+ ],
+ "mon": "DITTO"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 3,
+ "text": "SPECIAL THANKS"
+ },
+ {
+ "column": 5,
+ "text": "SHOGAKUKAN"
+ }
+ ],
+ "mon": "OMASTAR"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 6,
+ "text": "××××××××"
+ },
+ {
+ "column": 4,
+ "text": "IKUE OOTANI"
+ }
+ ],
+ "mon": "VILEPLUME"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 6,
+ "text": "PRODUCER"
+ },
+ {
+ "column": 2,
+ "text": "TAKEHIRO IZUSHI"
+ }
+ ]
+ },
+ {
+ "fade": false,
+ "lines": [
+ {
+ "column": 6,
+ "text": "PRODUCER"
+ },
+ {
+ "column": 1,
+ "text": "TAKASHI KAWAGUCHI"
+ }
+ ]
+ },
+ {
+ "fade": false,
+ "lines": [
+ {
+ "column": 6,
+ "text": "PRODUCER"
+ },
+ {
+ "column": 1,
+ "text": "TSUNEKAZU ISHIHARA"
+ }
+ ],
+ "mon": "NIDOKING"
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 2,
+ "text": "US VERSION STAFF"
+ }
+ ]
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 2,
+ "text": "US COORDINATION"
+ },
+ {
+ "column": 4,
+ "text": "GAIL TILDEN"
+ }
+ ]
+ },
+ {
+ "fade": false,
+ "lines": [
+ {
+ "column": 2,
+ "text": "US COORDINATION"
+ },
+ {
+ "column": 3,
+ "text": "NAOKO KAWAKAMI"
+ },
+ {
+ "column": 3,
+ "text": "HIRO NAKAMURA"
+ }
+ ]
+ },
+ {
+ "fade": false,
+ "lines": [
+ {
+ "column": 2,
+ "text": "US COORDINATION"
+ },
+ {
+ "column": 3,
+ "text": "RANDY SHOEMAKE"
+ },
+ {
+ "column": 4,
+ "text": "SARA OSBORNE"
+ }
+ ]
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 2,
+ "text": "TEXT TRANSLATION"
+ },
+ {
+ "column": 3,
+ "text": "NOB OGASAWARA"
+ }
+ ]
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 4,
+ "text": "PROGRAMMERS"
+ },
+ {
+ "column": 2,
+ "text": "TERUKI MURAKAWA"
+ },
+ {
+ "column": 4,
+ "text": "KOHTA FUKUI"
+ }
+ ]
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 2,
+ "text": "CHARACTER DESIGN"
+ },
+ {
+ "column": 1,
+ "text": "TAKEHIKO HOSOKAWA"
+ }
+ ]
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 3,
+ "text": "SPECIAL THANKS"
+ },
+ {
+ "column": 4,
+ "text": "KENJI OKUBO"
+ },
+ {
+ "column": 2,
+ "text": "TAKAHIRO HARADA"
+ }
+ ]
+ },
+ {
+ "fade": false,
+ "lines": [
+ {
+ "column": 3,
+ "text": "SPECIAL THANKS"
+ },
+ {
+ "column": 2,
+ "text": "KIMIKO NAKAMICHI"
+ },
+ {
+ "column": 3,
+ "text": "KAMON YOSHIMURA"
+ },
+ {
+ "column": 3,
+ "text": "SAKAE YAMAZAKI"
+ }
+ ]
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 3,
+ "text": "PRODUCT TESTING"
+ },
+ {
+ "column": 4,
+ "text": "PAAD TESTING"
+ },
+ {
+ "column": 0,
+ "text": "NCL SUPER MARIO CLUB"
+ }
+ ]
+ },
+ {
+ "fade": true,
+ "lines": [
+ {
+ "column": 1,
+ "text": "EXECUTIVE PRODUCER"
+ },
+ {
+ "column": 2,
+ "text": "HIROSHI YAMAUCHI"
+ }
+ ],
+ "mon": "PARASECT"
+ },
+ {
+ "copyright": true,
+ "fade": true,
+ "lines": [],
+ "mon": "GENGAR"
+ }
+ ]
+ },
+ "cutTreeSwaps": [
+ {
+ "after": 109,
+ "before": 50
+ },
+ {
+ "after": 108,
+ "before": 51
+ },
+ {
+ "after": 111,
+ "before": 52
+ },
+ {
+ "after": 76,
+ "before": 53
+ },
+ {
+ "after": 110,
+ "before": 96
+ },
+ {
+ "after": 10,
+ "before": 11
+ },
+ {
+ "after": 53,
+ "before": 60
+ },
+ {
+ "after": 53,
+ "before": 63
+ },
+ {
+ "after": 54,
+ "before": 61
+ }
+ ],
+ "darkMaps": {
+ "entryMap": "ROCK_TUNNEL_1F",
+ "flashBadge": "BOULDERBADGE",
+ "maps": [
+ "ROCK_TUNNEL_1F",
+ "ROCK_TUNNEL_B1F"
+ ],
+ "palOffset": 6
+ },
+ "dungeonTransitionMaps": {
+ "maps": [
+ "VIRIDIAN_FOREST",
+ "ROCK_TUNNEL_1F",
+ "SEAFOAM_ISLANDS_1F",
+ "ROCK_TUNNEL_B1F"
+ ],
+ "ranges": [
+ {
+ "first": "MT_MOON_1F",
+ "last": "MT_MOON_B2F"
+ },
+ {
+ "first": "SS_ANNE_1F",
+ "last": "HALL_OF_FAME"
+ },
+ {
+ "first": "LAVENDER_POKECENTER",
+ "last": "LAVENDER_CUBONE_HOUSE"
+ },
+ {
+ "first": "SILPH_CO_2F",
+ "last": "CERULEAN_CAVE_1F"
+ }
+ ]
+ },
+ "emotionBubbles": {
+ "bubbles": [
+ {
+ "h": 16,
+ "name": "EXCLAMATION_BUBBLE",
+ "w": 16,
+ "x": 0,
+ "y": 0
+ },
+ {
+ "h": 16,
+ "name": "QUESTION_BUBBLE",
+ "w": 16,
+ "x": 16,
+ "y": 0
+ },
+ {
+ "h": 16,
+ "name": "SMILE_BUBBLE",
+ "w": 16,
+ "x": 32,
+ "y": 0
+ },
+ {
+ "h": 16,
+ "name": "SKULL_BUBBLE",
+ "w": 16,
+ "x": 48,
+ "y": 0
+ },
+ {
+ "h": 16,
+ "name": "HEART_BUBBLE",
+ "w": 16,
+ "x": 64,
+ "y": 0
+ },
+ {
+ "h": 16,
+ "name": "BOLT_BUBBLE",
+ "w": 16,
+ "x": 80,
+ "y": 0
+ },
+ {
+ "h": 16,
+ "name": "ZZZ_BUBBLE",
+ "w": 16,
+ "x": 96,
+ "y": 0
+ },
+ {
+ "h": 16,
+ "name": "FISH_BUBBLE",
+ "w": 16,
+ "x": 112,
+ "y": 0
+ }
+ ],
+ "height": 16,
+ "path": "assets/generated/emotes.png",
+ "width": 128
+ },
+ "flyOrder": [
+ "SEAFOAM_ISLANDS_B1F",
+ "SEAFOAM_ISLANDS_B1F",
+ "SEAFOAM_ISLANDS_B2F",
+ "SEAFOAM_ISLANDS_B2F",
+ "SEAFOAM_ISLANDS_B3F",
+ "SEAFOAM_ISLANDS_B3F",
+ "SEAFOAM_ISLANDS_B4F",
+ "SEAFOAM_ISLANDS_B4F",
+ "VICTORY_ROAD_2F",
+ "POKEMON_MANSION_1F",
+ "POKEMON_MANSION_1F",
+ "POKEMON_MANSION_2F",
+ "PALLET_TOWN",
+ "VIRIDIAN_CITY",
+ "PEWTER_CITY",
+ "CERULEAN_CITY",
+ "LAVENDER_TOWN",
+ "VERMILION_CITY",
+ "CELADON_CITY",
+ "FUCHSIA_CITY",
+ "CINNABAR_ISLAND",
+ "INDIGO_PLATEAU",
+ "SAFFRON_CITY",
+ "ROUTE_4",
+ "ROUTE_10"
+ ],
+ "flyWarps": {
+ "CELADON_CITY": {
+ "x": 41,
+ "y": 10
+ },
+ "CERULEAN_CITY": {
+ "x": 19,
+ "y": 18
+ },
+ "CINNABAR_ISLAND": {
+ "x": 11,
+ "y": 12
+ },
+ "FUCHSIA_CITY": {
+ "x": 19,
+ "y": 28
+ },
+ "INDIGO_PLATEAU": {
+ "x": 9,
+ "y": 6
+ },
+ "LAVENDER_TOWN": {
+ "x": 3,
+ "y": 6
+ },
+ "PALLET_TOWN": {
+ "x": 5,
+ "y": 6
+ },
+ "PEWTER_CITY": {
+ "x": 13,
+ "y": 26
+ },
+ "POKEMON_MANSION_1F": {
+ "x": 16,
+ "y": 14
+ },
+ "POKEMON_MANSION_2F": {
+ "x": 18,
+ "y": 14
+ },
+ "ROUTE_10": {
+ "x": 11,
+ "y": 20
+ },
+ "ROUTE_4": {
+ "x": 11,
+ "y": 6
+ },
+ "SAFFRON_CITY": {
+ "x": 9,
+ "y": 30
+ },
+ "SEAFOAM_ISLANDS_B1F": {
+ "x": 23,
+ "y": 7
+ },
+ "SEAFOAM_ISLANDS_B2F": {
+ "x": 22,
+ "y": 7
+ },
+ "SEAFOAM_ISLANDS_B3F": {
+ "x": 19,
+ "y": 7
+ },
+ "SEAFOAM_ISLANDS_B4F": {
+ "x": 5,
+ "y": 14
+ },
+ "VERMILION_CITY": {
+ "x": 11,
+ "y": 4
+ },
+ "VICTORY_ROAD_2F": {
+ "x": 22,
+ "y": 16
+ },
+ "VIRIDIAN_CITY": {
+ "x": 23,
+ "y": 26
+ }
+ },
+ "forcedMovement": {
+ "slopeMaps": [
+ "ROUTE_17"
+ ],
+ "tiles": {
+ "ROUTE_16": [
+ {
+ "mode": "bike",
+ "x": 17,
+ "y": 10
+ },
+ {
+ "mode": "bike",
+ "x": 17,
+ "y": 11
+ }
+ ],
+ "ROUTE_18": [
+ {
+ "mode": "bike",
+ "x": 33,
+ "y": 8
+ },
+ {
+ "mode": "bike",
+ "x": 33,
+ "y": 9
+ }
+ ],
+ "SEAFOAM_ISLANDS_B3F": [
+ {
+ "mode": "surf",
+ "x": 18,
+ "y": 7
+ },
+ {
+ "mode": "surf",
+ "x": 19,
+ "y": 7
+ }
+ ],
+ "SEAFOAM_ISLANDS_B4F": [
+ {
+ "mode": "surf",
+ "x": 4,
+ "y": 14
+ },
+ {
+ "mode": "surf",
+ "x": 5,
+ "y": 14
+ }
+ ]
+ }
+ },
+ "gameCornerPoster": {
+ "closedBlock": 42,
+ "event": "EVENT_FOUND_ROCKET_HIDEOUT",
+ "map": "GAME_CORNER",
+ "openBlock": 67,
+ "poster": {
+ "x": 9,
+ "y": 4
+ },
+ "posterText": "TEXT_GAMECORNER_POSTER",
+ "x": 8,
+ "y": 2
+ },
+ "hiddenCoins": {
+ "GAME_CORNER": [
+ {
+ "coins": 10,
+ "x": 0,
+ "y": 8
+ },
+ {
+ "coins": 10,
+ "x": 1,
+ "y": 16
+ },
+ {
+ "coins": 20,
+ "x": 3,
+ "y": 11
+ },
+ {
+ "coins": 10,
+ "x": 3,
+ "y": 14
+ },
+ {
+ "coins": 10,
+ "x": 4,
+ "y": 12
+ },
+ {
+ "coins": 20,
+ "x": 9,
+ "y": 12
+ },
+ {
+ "coins": 10,
+ "x": 9,
+ "y": 15
+ },
+ {
+ "coins": 10,
+ "x": 16,
+ "y": 14
+ },
+ {
+ "coins": 10,
+ "x": 10,
+ "y": 16
+ },
+ {
+ "coins": 40,
+ "x": 11,
+ "y": 7
+ },
+ {
+ "coins": 100,
+ "x": 15,
+ "y": 8
+ },
+ {
+ "coins": 10,
+ "x": 12,
+ "y": 15
+ }
+ ]
+ },
+ "hiddenExtras": {
+ "benchGuys": {
+ "CELADON_HOTEL": [
+ {
+ "facing": "left",
+ "text": "CeladonCityHotelText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "CELADON_POKECENTER": [
+ {
+ "facing": "left",
+ "text": "CeladonCityPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "CERULEAN_POKECENTER": [
+ {
+ "facing": "left",
+ "text": "CeruleanCityPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "CINNABAR_POKECENTER": [
+ {
+ "facing": "up",
+ "text": "CinnabarIslandPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "FUCHSIA_POKECENTER": [
+ {
+ "facing": "up",
+ "text": "FuchsiaCityPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "LAVENDER_POKECENTER": [
+ {
+ "facing": "left",
+ "text": "LavenderCityPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "MT_MOON_POKECENTER": [
+ {
+ "facing": "left",
+ "text": "MtMoonPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "PEWTER_POKECENTER": [
+ {
+ "facing": "left",
+ "text": "PewterCityPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "ROCK_TUNNEL_POKECENTER": [
+ {
+ "facing": "left",
+ "text": "RockTunnelPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "SAFARI_ZONE_EAST_REST_HOUSE": [
+ {
+ "facing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "SAFARI_ZONE_NORTH_REST_HOUSE": [
+ {
+ "facing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "SAFARI_ZONE_WEST_REST_HOUSE": [
+ {
+ "facing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "SAFFRON_POKECENTER": [
+ {
+ "facing": "up",
+ "text": "SaffronCityPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "VERMILION_POKECENTER": [
+ {
+ "facing": "up",
+ "text": "VermilionCityPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ],
+ "VIRIDIAN_POKECENTER": [
+ {
+ "facing": "left",
+ "text": "ViridianCityPokecenterBenchGuyText",
+ "textFacing": "left",
+ "x": 0,
+ "y": 4
+ }
+ ]
+ },
+ "gymStatues": {
+ "CELADON_GYM": [
+ {
+ "facing": "up",
+ "x": 3,
+ "y": 15
+ },
+ {
+ "facing": "up",
+ "x": 6,
+ "y": 15
+ }
+ ],
+ "CERULEAN_GYM": [
+ {
+ "facing": "up",
+ "x": 3,
+ "y": 11
+ },
+ {
+ "facing": "up",
+ "x": 6,
+ "y": 11
+ }
+ ],
+ "CINNABAR_GYM": [
+ {
+ "facing": "up",
+ "x": 17,
+ "y": 13
+ }
+ ],
+ "FUCHSIA_GYM": [
+ {
+ "facing": "up",
+ "x": 3,
+ "y": 15
+ },
+ {
+ "facing": "up",
+ "x": 6,
+ "y": 15
+ }
+ ],
+ "PEWTER_GYM": [
+ {
+ "facing": "up",
+ "x": 3,
+ "y": 10
+ },
+ {
+ "facing": "up",
+ "x": 6,
+ "y": 10
+ }
+ ],
+ "SAFFRON_GYM": [
+ {
+ "facing": "up",
+ "x": 9,
+ "y": 15
+ }
+ ],
+ "VERMILION_GYM": [
+ {
+ "facing": "up",
+ "x": 3,
+ "y": 14
+ },
+ {
+ "facing": "up",
+ "x": 6,
+ "y": 14
+ }
+ ],
+ "VIRIDIAN_GYM": [
+ {
+ "facing": "up",
+ "x": 15,
+ "y": 15
+ },
+ {
+ "facing": "up",
+ "x": 18,
+ "y": 15
+ }
+ ]
+ },
+ "pcTiles": {
+ "CELADON_HOTEL": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "CELADON_MANSION_2F": [
+ {
+ "facing": "up",
+ "x": 0,
+ "y": 5
+ }
+ ],
+ "CELADON_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "CERULEAN_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "CINNABAR_LAB_FOSSIL_ROOM": [
+ {
+ "facing": "up",
+ "x": 0,
+ "y": 4
+ },
+ {
+ "facing": "up",
+ "x": 2,
+ "y": 4
+ }
+ ],
+ "CINNABAR_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "FUCHSIA_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "INDIGO_PLATEAU_LOBBY": [
+ {
+ "facing": "up",
+ "x": 15,
+ "y": 7
+ }
+ ],
+ "LAVENDER_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "MT_MOON_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "PEWTER_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "REDS_HOUSE_2F": [
+ {
+ "facing": "up",
+ "x": 0,
+ "y": 1
+ }
+ ],
+ "ROCK_TUNNEL_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "SAFARI_ZONE_EAST_REST_HOUSE": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "SAFARI_ZONE_NORTH_REST_HOUSE": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "SAFARI_ZONE_WEST_REST_HOUSE": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "SAFFRON_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "SILPH_CO_11F": [
+ {
+ "facing": "up",
+ "x": 10,
+ "y": 12
+ }
+ ],
+ "VERMILION_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ],
+ "VIRIDIAN_POKECENTER": [
+ {
+ "facing": "up",
+ "x": 13,
+ "y": 3
+ }
+ ]
+ },
+ "printTrash": {
+ "SS_ANNE_KITCHEN": [
+ {
+ "facing": "down",
+ "x": 13,
+ "y": 5
+ },
+ {
+ "facing": "down",
+ "x": 13,
+ "y": 7
+ }
+ ],
+ "VERMILION_GYM": [
+ {
+ "facing": "down",
+ "x": 6,
+ "y": 1
+ }
+ ]
+ },
+ "trashCans": {
+ "adjacent": {
+ "0": [
+ 1,
+ 3
+ ],
+ "1": [
+ 0,
+ 2,
+ 4
+ ],
+ "10": [
+ 7,
+ 9,
+ 11,
+ 13
+ ],
+ "11": [
+ 8,
+ 10,
+ 14
+ ],
+ "12": [
+ 9,
+ 13
+ ],
+ "13": [
+ 10,
+ 12,
+ 14
+ ],
+ "14": [
+ 11,
+ 13
+ ],
+ "2": [
+ 1,
+ 5
+ ],
+ "3": [
+ 0,
+ 4,
+ 6
+ ],
+ "4": [
+ 1,
+ 3,
+ 5,
+ 7
+ ],
+ "5": [
+ 2,
+ 4,
+ 8
+ ],
+ "6": [
+ 3,
+ 7,
+ 9
+ ],
+ "7": [
+ 4,
+ 6,
+ 8,
+ 10
+ ],
+ "8": [
+ 5,
+ 7,
+ 11
+ ],
+ "9": [
+ 6,
+ 10,
+ 12
+ ]
+ },
+ "cans": [
+ {
+ "can": 0,
+ "x": 1,
+ "y": 7
+ },
+ {
+ "can": 1,
+ "x": 1,
+ "y": 9
+ },
+ {
+ "can": 2,
+ "x": 1,
+ "y": 11
+ },
+ {
+ "can": 3,
+ "x": 3,
+ "y": 7
+ },
+ {
+ "can": 4,
+ "x": 3,
+ "y": 9
+ },
+ {
+ "can": 5,
+ "x": 3,
+ "y": 11
+ },
+ {
+ "can": 6,
+ "x": 5,
+ "y": 7
+ },
+ {
+ "can": 7,
+ "x": 5,
+ "y": 9
+ },
+ {
+ "can": 8,
+ "x": 5,
+ "y": 11
+ },
+ {
+ "can": 9,
+ "x": 7,
+ "y": 7
+ },
+ {
+ "can": 10,
+ "x": 7,
+ "y": 9
+ },
+ {
+ "can": 11,
+ "x": 7,
+ "y": 11
+ },
+ {
+ "can": 12,
+ "x": 9,
+ "y": 7
+ },
+ {
+ "can": 13,
+ "x": 9,
+ "y": 9
+ },
+ {
+ "can": 14,
+ "x": 9,
+ "y": 11
+ }
+ ],
+ "columns": 5,
+ "firstLockCandidates": [
+ 0,
+ 2,
+ 4,
+ 6,
+ 8,
+ 10,
+ 12,
+ 14
+ ],
+ "firstLockEvent": "EVENT_1ST_LOCK_OPENED",
+ "map": "VERMILION_GYM",
+ "rows": 3,
+ "rules": "first switch: random even can (Random & $0e, rolled on Vermilion City load); second switch: random can adjacent to the first (GymTrashCans table); a wrong second can relocks and rerandomizes the first switch",
+ "secondLockEvent": "EVENT_2ND_LOCK_OPENED"
+ }
+ },
+ "hiddenItems": {
+ "CELADON_CITY": [
+ {
+ "item": "PP_UP",
+ "x": 48,
+ "y": 15
+ }
+ ],
+ "CERULEAN_CAVE_1F": [
+ {
+ "item": "RARE_CANDY",
+ "x": 14,
+ "y": 11
+ }
+ ],
+ "CERULEAN_CAVE_B1F": [
+ {
+ "item": "ULTRA_BALL",
+ "x": 27,
+ "y": 3
+ }
+ ],
+ "CERULEAN_CITY": [
+ {
+ "item": "RARE_CANDY",
+ "x": 15,
+ "y": 8
+ }
+ ],
+ "COPYCATS_HOUSE_2F": [
+ {
+ "item": "NUGGET",
+ "x": 1,
+ "y": 1
+ }
+ ],
+ "MT_MOON_B2F": [
+ {
+ "item": "MOON_STONE",
+ "x": 18,
+ "y": 12
+ },
+ {
+ "item": "ETHER",
+ "x": 33,
+ "y": 9
+ }
+ ],
+ "POKEMON_MANSION_1F": [
+ {
+ "item": "MOON_STONE",
+ "x": 8,
+ "y": 16
+ }
+ ],
+ "POKEMON_MANSION_3F": [
+ {
+ "item": "MAX_REVIVE",
+ "x": 1,
+ "y": 9
+ }
+ ],
+ "POKEMON_MANSION_B1F": [
+ {
+ "item": "RARE_CANDY",
+ "x": 1,
+ "y": 9
+ }
+ ],
+ "POKEMON_TOWER_5F": [
+ {
+ "item": "ELIXER",
+ "x": 4,
+ "y": 12
+ }
+ ],
+ "POWER_PLANT": [
+ {
+ "item": "MAX_ELIXER",
+ "x": 17,
+ "y": 16
+ },
+ {
+ "item": "PP_UP",
+ "x": 12,
+ "y": 1
+ }
+ ],
+ "ROCKET_HIDEOUT_B1F": [
+ {
+ "item": "PP_UP",
+ "x": 21,
+ "y": 15
+ }
+ ],
+ "ROCKET_HIDEOUT_B3F": [
+ {
+ "item": "NUGGET",
+ "x": 27,
+ "y": 17
+ }
+ ],
+ "ROCKET_HIDEOUT_B4F": [
+ {
+ "item": "SUPER_POTION",
+ "x": 25,
+ "y": 1
+ }
+ ],
+ "ROUTE_10": [
+ {
+ "item": "SUPER_POTION",
+ "x": 9,
+ "y": 17
+ },
+ {
+ "item": "MAX_ETHER",
+ "x": 16,
+ "y": 53
+ }
+ ],
+ "ROUTE_11": [
+ {
+ "item": "ESCAPE_ROPE",
+ "x": 48,
+ "y": 5
+ }
+ ],
+ "ROUTE_12": [
+ {
+ "item": "HYPER_POTION",
+ "x": 2,
+ "y": 63
+ }
+ ],
+ "ROUTE_13": [
+ {
+ "item": "PP_UP",
+ "x": 1,
+ "y": 14
+ },
+ {
+ "item": "CALCIUM",
+ "x": 16,
+ "y": 13
+ }
+ ],
+ "ROUTE_17": [
+ {
+ "item": "RARE_CANDY",
+ "x": 15,
+ "y": 14
+ },
+ {
+ "item": "FULL_RESTORE",
+ "x": 8,
+ "y": 45
+ },
+ {
+ "item": "PP_UP",
+ "x": 17,
+ "y": 72
+ },
+ {
+ "item": "MAX_REVIVE",
+ "x": 4,
+ "y": 91
+ },
+ {
+ "item": "MAX_ELIXER",
+ "x": 8,
+ "y": 121
+ }
+ ],
+ "ROUTE_23": [
+ {
+ "item": "FULL_RESTORE",
+ "x": 9,
+ "y": 44
+ },
+ {
+ "item": "ULTRA_BALL",
+ "x": 19,
+ "y": 70
+ },
+ {
+ "item": "MAX_ETHER",
+ "x": 8,
+ "y": 90
+ }
+ ],
+ "ROUTE_25": [
+ {
+ "item": "ETHER",
+ "x": 38,
+ "y": 3
+ },
+ {
+ "item": "ELIXER",
+ "x": 10,
+ "y": 1
+ }
+ ],
+ "ROUTE_4": [
+ {
+ "item": "GREAT_BALL",
+ "x": 40,
+ "y": 3
+ }
+ ],
+ "ROUTE_9": [
+ {
+ "item": "ETHER",
+ "x": 14,
+ "y": 7
+ }
+ ],
+ "SAFARI_ZONE_GATE": [
+ {
+ "item": "NUGGET",
+ "x": 10,
+ "y": 1
+ }
+ ],
+ "SAFARI_ZONE_WEST": [
+ {
+ "item": "REVIVE",
+ "x": 6,
+ "y": 5
+ }
+ ],
+ "SEAFOAM_ISLANDS_B2F": [
+ {
+ "item": "NUGGET",
+ "x": 15,
+ "y": 15
+ }
+ ],
+ "SEAFOAM_ISLANDS_B3F": [
+ {
+ "item": "MAX_ELIXER",
+ "x": 9,
+ "y": 16
+ }
+ ],
+ "SEAFOAM_ISLANDS_B4F": [
+ {
+ "item": "ULTRA_BALL",
+ "x": 25,
+ "y": 17
+ }
+ ],
+ "SILPH_CO_5F": [
+ {
+ "item": "ELIXER",
+ "x": 12,
+ "y": 3
+ }
+ ],
+ "SILPH_CO_9F": [
+ {
+ "item": "MAX_POTION",
+ "x": 2,
+ "y": 15
+ }
+ ],
+ "SS_ANNE_B1F_ROOMS": [
+ {
+ "item": "HYPER_POTION",
+ "x": 3,
+ "y": 1
+ }
+ ],
+ "SS_ANNE_KITCHEN": [
+ {
+ "item": "GREAT_BALL",
+ "x": 13,
+ "y": 9
+ }
+ ],
+ "UNDERGROUND_PATH_NORTH_SOUTH": [
+ {
+ "item": "FULL_RESTORE",
+ "x": 3,
+ "y": 4
+ },
+ {
+ "item": "X_SPECIAL",
+ "x": 4,
+ "y": 34
+ }
+ ],
+ "UNDERGROUND_PATH_WEST_EAST": [
+ {
+ "item": "NUGGET",
+ "x": 12,
+ "y": 2
+ },
+ {
+ "item": "ELIXER",
+ "x": 21,
+ "y": 5
+ }
+ ],
+ "UNUSED_MAP_6F": [
+ {
+ "item": "MAX_ELIXER",
+ "x": 14,
+ "y": 11
+ }
+ ],
+ "VERMILION_CITY": [
+ {
+ "item": "MAX_ETHER",
+ "x": 14,
+ "y": 11
+ }
+ ],
+ "VICTORY_ROAD_2F": [
+ {
+ "item": "ULTRA_BALL",
+ "x": 5,
+ "y": 2
+ },
+ {
+ "item": "FULL_RESTORE",
+ "x": 26,
+ "y": 7
+ }
+ ],
+ "VIRIDIAN_CITY": [
+ {
+ "item": "POTION",
+ "x": 14,
+ "y": 4
+ }
+ ],
+ "VIRIDIAN_FOREST": [
+ {
+ "item": "POTION",
+ "x": 1,
+ "y": 18
+ },
+ {
+ "item": "ANTIDOTE",
+ "x": 16,
+ "y": 42
+ }
+ ]
+ },
+ "indoorEncounters": {
+ "excludedTileset": "FOREST",
+ "firstIndoorMap": 37
+ },
+ "intro": {
+ "bigStar": {
+ "height": 16,
+ "path": "assets/generated/intro/big_star.png",
+ "width": 16
+ },
+ "fallingStar": {
+ "height": 8,
+ "path": "assets/generated/intro/falling_star.png",
+ "width": 8
+ },
+ "fallingStarBlink": {
+ "height": 8,
+ "path": "assets/generated/intro/falling_star_blink.png",
+ "width": 8
+ },
+ "gamefreakLogo": {
+ "height": 24,
+ "path": "assets/generated/intro/gamefreak_logo.png",
+ "width": 16
+ },
+ "gamefreakPresents": {
+ "height": 8,
+ "path": "assets/generated/intro/gamefreak_presents.png",
+ "width": 104
+ },
+ "gamefreakText": {
+ "height": 8,
+ "path": "assets/generated/intro/gamefreak_text.png",
+ "width": 80
+ },
+ "gengar": {
+ "frame1": {
+ "height": 56,
+ "path": "assets/generated/intro/gengar_1.png",
+ "width": 56
+ },
+ "frame2": {
+ "height": 56,
+ "path": "assets/generated/intro/gengar_2.png",
+ "width": 56
+ },
+ "frame3": {
+ "height": 56,
+ "path": "assets/generated/intro/gengar_3.png",
+ "width": 56
+ }
+ },
+ "nidorino": {
+ "frame1": {
+ "height": 48,
+ "path": "assets/generated/intro/red_nidorino_1.png",
+ "width": 48
+ },
+ "frame2": {
+ "height": 48,
+ "path": "assets/generated/intro/red_nidorino_2.png",
+ "width": 48
+ },
+ "frame3": {
+ "height": 48,
+ "path": "assets/generated/intro/red_nidorino_3.png",
+ "width": 48
+ }
+ }
+ },
+ "ledges": [
+ {
+ "facing": "down",
+ "input": "down",
+ "ledgeTile": 55,
+ "standingTile": 44
+ },
+ {
+ "facing": "down",
+ "input": "down",
+ "ledgeTile": 54,
+ "standingTile": 57
+ },
+ {
+ "facing": "down",
+ "input": "down",
+ "ledgeTile": 55,
+ "standingTile": 57
+ },
+ {
+ "facing": "left",
+ "input": "left",
+ "ledgeTile": 39,
+ "standingTile": 44
+ },
+ {
+ "facing": "left",
+ "input": "left",
+ "ledgeTile": 39,
+ "standingTile": 57
+ },
+ {
+ "facing": "right",
+ "input": "right",
+ "ledgeTile": 13,
+ "standingTile": 44
+ },
+ {
+ "facing": "right",
+ "input": "right",
+ "ledgeTile": 29,
+ "standingTile": 44
+ },
+ {
+ "facing": "right",
+ "input": "right",
+ "ledgeTile": 13,
+ "standingTile": 57
+ }
+ ],
+ "oakSpeech": {
+ "shrink1": "assets/generated/intro/shrink1.png",
+ "shrink2": "assets/generated/intro/shrink2.png"
+ },
+ "oldManBattle": {
+ "afterText": "ViridianCityOldManYouNeedToWeakenTheTargetText",
+ "battleType": "BATTLE_TYPE_OLD_MAN",
+ "level": 5,
+ "map": "VIRIDIAN_CITY",
+ "species": "WEEDLE",
+ "text": "ViridianCityOldManText"
+ },
+ "overworldFx": {
+ "battleTransition": {
+ "height": 8,
+ "path": "assets/generated/fx/battle_transition.png",
+ "width": 8
+ },
+ "cutTree": {
+ "height": 16,
+ "path": "assets/generated/fx/cut_tree.png",
+ "width": 16
+ },
+ "fishingRod": {
+ "height": 24,
+ "path": "assets/generated/fx/fishing_rod.png",
+ "width": 8
+ },
+ "healMachine": {
+ "height": 16,
+ "path": "assets/generated/fx/heal_machine.png",
+ "width": 8
+ },
+ "pokedexFrame": {
+ "height": 48,
+ "path": "assets/generated/fx/pokedex.png",
+ "width": 24
+ },
+ "redFishBack": {
+ "height": 8,
+ "path": "assets/generated/fx/red_fish_back.png",
+ "width": 16
+ },
+ "redFishFront": {
+ "height": 8,
+ "path": "assets/generated/fx/red_fish_front.png",
+ "width": 16
+ },
+ "redFishSide": {
+ "height": 8,
+ "path": "assets/generated/fx/red_fish_side.png",
+ "width": 16
+ },
+ "shadow": {
+ "height": 8,
+ "path": "assets/generated/fx/shadow.png",
+ "width": 8
+ },
+ "smoke": {
+ "height": 8,
+ "path": "assets/generated/fx/smoke.png",
+ "width": 8
+ }
+ },
+ "pcItemCap": 50,
+ "presetNames": {
+ "customOption": "NEW NAME",
+ "player": [
+ "YELLOW",
+ "ASH",
+ "JACK"
+ ],
+ "rival": [
+ "BLUE",
+ "GARY",
+ "JOHN"
+ ]
+ },
+ "seafoam": {
+ "SEAFOAM_ISLANDS_1F": {
+ "holeDestination": "SEAFOAM_ISLANDS_B1F",
+ "holes": [
+ {
+ "boulderEvent": "EVENT_SEAFOAM1_BOULDER1_DOWN_HOLE",
+ "hideObject": "TOGGLE_SEAFOAM_ISLANDS_1F_BOULDER_1",
+ "landsAt": {
+ "x": 17,
+ "y": 6
+ },
+ "showObject": "TOGGLE_SEAFOAM_ISLANDS_B1F_BOULDER_1",
+ "x": 17,
+ "y": 6
+ },
+ {
+ "boulderEvent": "EVENT_SEAFOAM1_BOULDER2_DOWN_HOLE",
+ "hideObject": "TOGGLE_SEAFOAM_ISLANDS_1F_BOULDER_2",
+ "landsAt": {
+ "x": 22,
+ "y": 6
+ },
+ "showObject": "TOGGLE_SEAFOAM_ISLANDS_B1F_BOULDER_2",
+ "x": 24,
+ "y": 6
+ }
+ ]
+ },
+ "SEAFOAM_ISLANDS_B1F": {
+ "holeDestination": "SEAFOAM_ISLANDS_B2F",
+ "holes": [
+ {
+ "boulderEvent": "EVENT_SEAFOAM2_BOULDER1_DOWN_HOLE",
+ "hideObject": "TOGGLE_SEAFOAM_ISLANDS_B1F_BOULDER_1",
+ "landsAt": {
+ "x": 18,
+ "y": 6
+ },
+ "showObject": "TOGGLE_SEAFOAM_ISLANDS_B2F_BOULDER_1",
+ "x": 18,
+ "y": 6
+ },
+ {
+ "boulderEvent": "EVENT_SEAFOAM2_BOULDER2_DOWN_HOLE",
+ "hideObject": "TOGGLE_SEAFOAM_ISLANDS_B1F_BOULDER_2",
+ "landsAt": {
+ "x": 23,
+ "y": 6
+ },
+ "showObject": "TOGGLE_SEAFOAM_ISLANDS_B2F_BOULDER_2",
+ "x": 23,
+ "y": 6
+ }
+ ]
+ },
+ "SEAFOAM_ISLANDS_B3F": {
+ "currents": [
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "down"
+ },
+ {
+ "count": 2,
+ "dir": "right"
+ },
+ {
+ "count": 6,
+ "dir": "down"
+ }
+ ],
+ "x": 18,
+ "y": 7
+ },
+ {
+ "moves": [
+ {
+ "count": 1,
+ "dir": "left"
+ },
+ {
+ "count": 4,
+ "dir": "down"
+ },
+ {
+ "count": 2,
+ "dir": "right"
+ },
+ {
+ "count": 6,
+ "dir": "down"
+ }
+ ],
+ "x": 19,
+ "y": 7
+ }
+ ],
+ "currentsDisabledByEvents": [
+ "EVENT_SEAFOAM3_BOULDER1_DOWN_HOLE",
+ "EVENT_SEAFOAM3_BOULDER2_DOWN_HOLE"
+ ],
+ "entryCurrent": {
+ "moves": [
+ {
+ "count": 3,
+ "dir": "down"
+ },
+ {
+ "count": 5,
+ "dir": "right"
+ },
+ {
+ "count": 6,
+ "dir": "down"
+ }
+ ],
+ "x": 15,
+ "y": 8
+ },
+ "holeDestination": "SEAFOAM_ISLANDS_B4F",
+ "holes": [
+ {
+ "boulderEvent": "EVENT_SEAFOAM4_BOULDER1_DOWN_HOLE",
+ "hideObject": "TOGGLE_SEAFOAM_ISLANDS_B3F_BOULDER_1",
+ "landsAt": {
+ "x": 4,
+ "y": 15
+ },
+ "showObject": "TOGGLE_SEAFOAM_ISLANDS_B4F_BOULDER_1",
+ "x": 3,
+ "y": 16
+ },
+ {
+ "boulderEvent": "EVENT_SEAFOAM4_BOULDER2_DOWN_HOLE",
+ "hideObject": "TOGGLE_SEAFOAM_ISLANDS_B3F_BOULDER_2",
+ "landsAt": {
+ "x": 5,
+ "y": 15
+ },
+ "showObject": "TOGGLE_SEAFOAM_ISLANDS_B4F_BOULDER_2",
+ "x": 6,
+ "y": 16
+ }
+ ],
+ "pluggedByHolesOn": {
+ "holes": [
+ {
+ "boulderEvent": "EVENT_SEAFOAM3_BOULDER1_DOWN_HOLE",
+ "hideObject": "TOGGLE_SEAFOAM_ISLANDS_B2F_BOULDER_1",
+ "landsAt": {
+ "x": 18,
+ "y": 6
+ },
+ "showObject": "TOGGLE_SEAFOAM_ISLANDS_B3F_BOULDER_5",
+ "x": 19,
+ "y": 6
+ },
+ {
+ "boulderEvent": "EVENT_SEAFOAM3_BOULDER2_DOWN_HOLE",
+ "hideObject": "TOGGLE_SEAFOAM_ISLANDS_B2F_BOULDER_2",
+ "landsAt": {
+ "x": 19,
+ "y": 6
+ },
+ "showObject": "TOGGLE_SEAFOAM_ISLANDS_B3F_BOULDER_6",
+ "x": 22,
+ "y": 6
+ }
+ ],
+ "map": "SEAFOAM_ISLANDS_B2F"
+ }
+ },
+ "SEAFOAM_ISLANDS_B4F": {
+ "currents": [
+ {
+ "moves": [
+ {
+ "count": 1,
+ "dir": "up"
+ },
+ {
+ "count": 3,
+ "dir": "right"
+ },
+ {
+ "count": 3,
+ "dir": "up"
+ }
+ ],
+ "x": 4,
+ "y": 14
+ },
+ {
+ "moves": [
+ {
+ "count": 1,
+ "dir": "up"
+ },
+ {
+ "count": 2,
+ "dir": "right"
+ },
+ {
+ "count": 3,
+ "dir": "up"
+ }
+ ],
+ "x": 5,
+ "y": 14
+ }
+ ],
+ "currentsDisabledByEvents": [
+ "EVENT_SEAFOAM4_BOULDER1_DOWN_HOLE",
+ "EVENT_SEAFOAM4_BOULDER2_DOWN_HOLE"
+ ],
+ "forcedExit": {
+ "activeUntilEvents": [
+ "EVENT_SEAFOAM3_BOULDER1_DOWN_HOLE",
+ "EVENT_SEAFOAM3_BOULDER2_DOWN_HOLE"
+ ],
+ "coords": [
+ {
+ "x": 20,
+ "y": 17
+ },
+ {
+ "x": 21,
+ "y": 17
+ },
+ {
+ "x": 20,
+ "y": 16
+ },
+ {
+ "x": 21,
+ "y": 16
+ }
+ ]
+ }
+ }
+ },
+ "slotMachines": {
+ "GAME_CORNER": [
+ {
+ "state": "ok",
+ "x": 18,
+ "y": 15
+ },
+ {
+ "state": "ok",
+ "x": 18,
+ "y": 14
+ },
+ {
+ "state": "ok",
+ "x": 18,
+ "y": 13
+ },
+ {
+ "state": "ok",
+ "x": 18,
+ "y": 12
+ },
+ {
+ "state": "ok",
+ "x": 18,
+ "y": 11
+ },
+ {
+ "state": "keys",
+ "x": 18,
+ "y": 10
+ },
+ {
+ "state": "ok",
+ "x": 13,
+ "y": 10
+ },
+ {
+ "state": "ok",
+ "x": 13,
+ "y": 11
+ },
+ {
+ "state": "out_to_lunch",
+ "x": 13,
+ "y": 12
+ },
+ {
+ "state": "ok",
+ "x": 13,
+ "y": 13
+ },
+ {
+ "state": "ok",
+ "x": 13,
+ "y": 14
+ },
+ {
+ "state": "ok",
+ "x": 13,
+ "y": 15
+ },
+ {
+ "state": "ok",
+ "x": 12,
+ "y": 15
+ },
+ {
+ "state": "ok",
+ "x": 12,
+ "y": 14
+ },
+ {
+ "state": "ok",
+ "x": 12,
+ "y": 13
+ },
+ {
+ "state": "ok",
+ "x": 12,
+ "y": 12
+ },
+ {
+ "state": "ok",
+ "x": 12,
+ "y": 11
+ },
+ {
+ "state": "ok",
+ "x": 12,
+ "y": 10
+ },
+ {
+ "state": "ok",
+ "x": 7,
+ "y": 10
+ },
+ {
+ "state": "ok",
+ "x": 7,
+ "y": 11
+ },
+ {
+ "state": "ok",
+ "x": 7,
+ "y": 12
+ },
+ {
+ "state": "ok",
+ "x": 7,
+ "y": 13
+ },
+ {
+ "state": "ok",
+ "x": 7,
+ "y": 14
+ },
+ {
+ "state": "ok",
+ "x": 7,
+ "y": 15
+ },
+ {
+ "state": "ok",
+ "x": 6,
+ "y": 15
+ },
+ {
+ "state": "ok",
+ "x": 6,
+ "y": 14
+ },
+ {
+ "state": "ok",
+ "x": 6,
+ "y": 13
+ },
+ {
+ "state": "out_of_order",
+ "x": 6,
+ "y": 12
+ },
+ {
+ "state": "ok",
+ "x": 6,
+ "y": 11
+ },
+ {
+ "state": "ok",
+ "x": 6,
+ "y": 10
+ },
+ {
+ "state": "ok",
+ "x": 1,
+ "y": 10
+ },
+ {
+ "state": "ok",
+ "x": 1,
+ "y": 11
+ },
+ {
+ "state": "ok",
+ "x": 1,
+ "y": 12
+ },
+ {
+ "state": "ok",
+ "x": 1,
+ "y": 13
+ },
+ {
+ "state": "ok",
+ "x": 1,
+ "y": 14
+ },
+ {
+ "state": "ok",
+ "x": 1,
+ "y": 15
+ }
+ ]
+ },
+ "slotSymbols": {
+ "height": 16,
+ "order": [
+ "7",
+ "BAR",
+ "CHERRY",
+ "FISH",
+ "BIRD",
+ "MOUSE"
+ ],
+ "sheet": "assets/generated/slots/symbols.png",
+ "sheets": {
+ "background": {
+ "height": 24,
+ "path": "assets/generated/slots/red_slots_1.png",
+ "width": 128
+ },
+ "wheel": {
+ "height": 48,
+ "path": "assets/generated/slots/red_slots_2.png",
+ "width": 32
+ }
+ },
+ "symbols": {
+ "7": {
+ "h": 16,
+ "sheet": "assets/generated/slots/symbols.png",
+ "tiles": 512,
+ "w": 16,
+ "x": 0,
+ "y": 0
+ },
+ "BAR": {
+ "h": 16,
+ "sheet": "assets/generated/slots/symbols.png",
+ "tiles": 1540,
+ "w": 16,
+ "x": 16,
+ "y": 0
+ },
+ "BIRD": {
+ "h": 16,
+ "sheet": "assets/generated/slots/symbols.png",
+ "tiles": 4624,
+ "w": 16,
+ "x": 64,
+ "y": 0
+ },
+ "CHERRY": {
+ "h": 16,
+ "sheet": "assets/generated/slots/symbols.png",
+ "tiles": 2568,
+ "w": 16,
+ "x": 32,
+ "y": 0
+ },
+ "FISH": {
+ "h": 16,
+ "sheet": "assets/generated/slots/symbols.png",
+ "tiles": 3596,
+ "w": 16,
+ "x": 48,
+ "y": 0
+ },
+ "MOUSE": {
+ "h": 16,
+ "sheet": "assets/generated/slots/symbols.png",
+ "tiles": 5652,
+ "w": 16,
+ "x": 80,
+ "y": 0
+ }
+ },
+ "tilemap": {
+ "cols": 20,
+ "rows": 12,
+ "sheet": "assets/generated/slots/red_slots_1.png",
+ "tileCols": 16,
+ "tiles": [
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2,
+ 3,
+ 4,
+ 5,
+ 0,
+ 0,
+ 6,
+ 7,
+ 8,
+ 9,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ [
+ 10,
+ 14,
+ 11,
+ 35,
+ 28,
+ 30,
+ 31,
+ 28,
+ 28,
+ 30,
+ 31,
+ 28,
+ 28,
+ 30,
+ 31,
+ 28,
+ 35,
+ 10,
+ 14,
+ 11
+ ],
+ [
+ 12,
+ 15,
+ 13,
+ 36,
+ 29,
+ 32,
+ 33,
+ 29,
+ 29,
+ 32,
+ 33,
+ 29,
+ 29,
+ 32,
+ 33,
+ 29,
+ 36,
+ 12,
+ 15,
+ 13
+ ],
+ [
+ 10,
+ 16,
+ 11,
+ 35,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 35,
+ 10,
+ 16,
+ 11
+ ],
+ [
+ 12,
+ 17,
+ 13,
+ 36,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 36,
+ 12,
+ 17,
+ 13
+ ],
+ [
+ 10,
+ 18,
+ 11,
+ 35,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 35,
+ 10,
+ 18,
+ 11
+ ],
+ [
+ 12,
+ 19,
+ 13,
+ 36,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 36,
+ 12,
+ 19,
+ 13
+ ],
+ [
+ 10,
+ 16,
+ 11,
+ 35,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 35,
+ 10,
+ 16,
+ 11
+ ],
+ [
+ 12,
+ 17,
+ 13,
+ 36,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 22,
+ 23,
+ 23,
+ 22,
+ 36,
+ 12,
+ 17,
+ 13
+ ],
+ [
+ 10,
+ 14,
+ 11,
+ 35,
+ 0,
+ 24,
+ 25,
+ 0,
+ 0,
+ 24,
+ 25,
+ 0,
+ 0,
+ 24,
+ 25,
+ 0,
+ 35,
+ 10,
+ 14,
+ 11
+ ],
+ [
+ 12,
+ 15,
+ 13,
+ 36,
+ 1,
+ 26,
+ 27,
+ 1,
+ 1,
+ 26,
+ 27,
+ 1,
+ 1,
+ 26,
+ 27,
+ 1,
+ 36,
+ 12,
+ 15,
+ 13
+ ]
+ ]
+ },
+ "width": 96
+ },
+ "slotWheels": [
+ [
+ "7",
+ "MOUSE",
+ "FISH",
+ "BAR",
+ "CHERRY",
+ "7",
+ "FISH",
+ "BIRD",
+ "BAR",
+ "CHERRY",
+ "7",
+ "MOUSE",
+ "BIRD",
+ "BAR",
+ "CHERRY",
+ "7",
+ "MOUSE",
+ "FISH"
+ ],
+ [
+ "7",
+ "FISH",
+ "CHERRY",
+ "BIRD",
+ "MOUSE",
+ "BAR",
+ "CHERRY",
+ "FISH",
+ "BIRD",
+ "CHERRY",
+ "BAR",
+ "FISH",
+ "BIRD",
+ "CHERRY",
+ "MOUSE",
+ "7",
+ "FISH",
+ "CHERRY"
+ ],
+ [
+ "7",
+ "BIRD",
+ "FISH",
+ "CHERRY",
+ "MOUSE",
+ "BIRD",
+ "FISH",
+ "CHERRY",
+ "MOUSE",
+ "BIRD",
+ "FISH",
+ "CHERRY",
+ "MOUSE",
+ "BIRD",
+ "BAR",
+ "7",
+ "BIRD",
+ "FISH"
+ ]
+ ],
+ "spinners": {
+ "ROCKET_HIDEOUT_B2F": [
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "left"
+ }
+ ],
+ "x": 4,
+ "y": 9
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ }
+ ],
+ "x": 4,
+ "y": 11
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ },
+ {
+ "count": 4,
+ "dir": "up"
+ }
+ ],
+ "x": 4,
+ "y": 15
+ },
+ {
+ "moves": [
+ {
+ "count": 1,
+ "dir": "up"
+ },
+ {
+ "count": 4,
+ "dir": "right"
+ },
+ {
+ "count": 4,
+ "dir": "up"
+ }
+ ],
+ "x": 4,
+ "y": 16
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "left"
+ }
+ ],
+ "x": 4,
+ "y": 19
+ },
+ {
+ "moves": [
+ {
+ "count": 3,
+ "dir": "up"
+ },
+ {
+ "count": 2,
+ "dir": "left"
+ }
+ ],
+ "x": 4,
+ "y": 22
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ },
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 5,
+ "y": 14
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "up"
+ }
+ ],
+ "x": 6,
+ "y": 22
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "up"
+ }
+ ],
+ "x": 6,
+ "y": 24
+ },
+ {
+ "moves": [
+ {
+ "count": 6,
+ "dir": "left"
+ }
+ ],
+ "x": 8,
+ "y": 9
+ },
+ {
+ "moves": [
+ {
+ "count": 1,
+ "dir": "up"
+ }
+ ],
+ "x": 8,
+ "y": 12
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "up"
+ }
+ ],
+ "x": 8,
+ "y": 15
+ },
+ {
+ "moves": [
+ {
+ "count": 6,
+ "dir": "left"
+ }
+ ],
+ "x": 8,
+ "y": 19
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "up"
+ },
+ {
+ "count": 6,
+ "dir": "left"
+ }
+ ],
+ "x": 8,
+ "y": 23
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 9,
+ "y": 14
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 9,
+ "y": 22
+ },
+ {
+ "moves": [
+ {
+ "count": 8,
+ "dir": "left"
+ }
+ ],
+ "x": 10,
+ "y": 9
+ },
+ {
+ "moves": [
+ {
+ "count": 1,
+ "dir": "up"
+ },
+ {
+ "count": 8,
+ "dir": "left"
+ }
+ ],
+ "x": 10,
+ "y": 10
+ },
+ {
+ "moves": [
+ {
+ "count": 6,
+ "dir": "up"
+ },
+ {
+ "count": 8,
+ "dir": "left"
+ }
+ ],
+ "x": 10,
+ "y": 15
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ },
+ {
+ "count": 2,
+ "dir": "up"
+ }
+ ],
+ "x": 10,
+ "y": 17
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "up"
+ },
+ {
+ "count": 4,
+ "dir": "right"
+ },
+ {
+ "count": 2,
+ "dir": "up"
+ }
+ ],
+ "x": 10,
+ "y": 19
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ }
+ ],
+ "x": 10,
+ "y": 25
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "down"
+ },
+ {
+ "count": 4,
+ "dir": "right"
+ },
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 11,
+ "y": 14
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ },
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 11,
+ "y": 16
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 11,
+ "y": 18
+ },
+ {
+ "moves": [
+ {
+ "count": 10,
+ "dir": "left"
+ }
+ ],
+ "x": 12,
+ "y": 9
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "up"
+ },
+ {
+ "count": 10,
+ "dir": "left"
+ }
+ ],
+ "x": 12,
+ "y": 11
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "up"
+ },
+ {
+ "count": 10,
+ "dir": "left"
+ }
+ ],
+ "x": 12,
+ "y": 13
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "right"
+ },
+ {
+ "count": 2,
+ "dir": "up"
+ }
+ ],
+ "x": 12,
+ "y": 17
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "down"
+ },
+ {
+ "count": 1,
+ "dir": "right"
+ }
+ ],
+ "x": 13,
+ "y": 10
+ },
+ {
+ "moves": [
+ {
+ "count": 1,
+ "dir": "right"
+ }
+ ],
+ "x": 13,
+ "y": 12
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "right"
+ },
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 13,
+ "y": 16
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "left"
+ },
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 13,
+ "y": 18
+ },
+ {
+ "moves": [
+ {
+ "count": 3,
+ "dir": "left"
+ },
+ {
+ "count": 2,
+ "dir": "up"
+ },
+ {
+ "count": 4,
+ "dir": "right"
+ },
+ {
+ "count": 2,
+ "dir": "up"
+ }
+ ],
+ "x": 13,
+ "y": 19
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "left"
+ },
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 13,
+ "y": 22
+ },
+ {
+ "moves": [
+ {
+ "count": 5,
+ "dir": "left"
+ },
+ {
+ "count": 4,
+ "dir": "up"
+ },
+ {
+ "count": 6,
+ "dir": "left"
+ }
+ ],
+ "x": 13,
+ "y": 23
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "up"
+ }
+ ],
+ "x": 14,
+ "y": 17
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 15,
+ "y": 16
+ },
+ {
+ "moves": [
+ {
+ "count": 1,
+ "dir": "up"
+ }
+ ],
+ "x": 16,
+ "y": 14
+ },
+ {
+ "moves": [
+ {
+ "count": 3,
+ "dir": "up"
+ }
+ ],
+ "x": 16,
+ "y": 16
+ },
+ {
+ "moves": [
+ {
+ "count": 5,
+ "dir": "up"
+ }
+ ],
+ "x": 16,
+ "y": 18
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "left"
+ },
+ {
+ "count": 2,
+ "dir": "down"
+ },
+ {
+ "count": 1,
+ "dir": "right"
+ }
+ ],
+ "x": 17,
+ "y": 10
+ },
+ {
+ "moves": [
+ {
+ "count": 5,
+ "dir": "left"
+ },
+ {
+ "count": 2,
+ "dir": "up"
+ },
+ {
+ "count": 10,
+ "dir": "left"
+ }
+ ],
+ "x": 17,
+ "y": 11
+ }
+ ],
+ "ROCKET_HIDEOUT_B3F": [
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ }
+ ],
+ "x": 10,
+ "y": 13
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ },
+ {
+ "count": 4,
+ "dir": "up"
+ },
+ {
+ "count": 4,
+ "dir": "right"
+ }
+ ],
+ "x": 10,
+ "y": 19
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ },
+ {
+ "count": 4,
+ "dir": "down"
+ }
+ ],
+ "x": 11,
+ "y": 18
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "left"
+ }
+ ],
+ "x": 12,
+ "y": 11
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "right"
+ },
+ {
+ "count": 2,
+ "dir": "up"
+ },
+ {
+ "count": 4,
+ "dir": "right"
+ }
+ ],
+ "x": 12,
+ "y": 17
+ },
+ {
+ "moves": [
+ {
+ "count": 3,
+ "dir": "up"
+ },
+ {
+ "count": 2,
+ "dir": "right"
+ },
+ {
+ "count": 2,
+ "dir": "up"
+ },
+ {
+ "count": 4,
+ "dir": "right"
+ }
+ ],
+ "x": 12,
+ "y": 20
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ }
+ ],
+ "x": 13,
+ "y": 16
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "right"
+ }
+ ],
+ "x": 14,
+ "y": 11
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "right"
+ }
+ ],
+ "x": 14,
+ "y": 15
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "up"
+ },
+ {
+ "count": 4,
+ "dir": "right"
+ }
+ ],
+ "x": 14,
+ "y": 17
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "up"
+ },
+ {
+ "count": 4,
+ "dir": "right"
+ }
+ ],
+ "x": 14,
+ "y": 19
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "right"
+ }
+ ],
+ "x": 15,
+ "y": 16
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "down"
+ }
+ ],
+ "x": 15,
+ "y": 18
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "up"
+ }
+ ],
+ "x": 16,
+ "y": 13
+ },
+ {
+ "moves": [
+ {
+ "count": 4,
+ "dir": "down"
+ }
+ ],
+ "x": 17,
+ "y": 12
+ },
+ {
+ "moves": [
+ {
+ "count": 1,
+ "dir": "up"
+ }
+ ],
+ "x": 18,
+ "y": 16
+ }
+ ],
+ "VIRIDIAN_GYM": [
+ {
+ "moves": [
+ {
+ "count": 9,
+ "dir": "up"
+ }
+ ],
+ "x": 19,
+ "y": 11
+ },
+ {
+ "moves": [
+ {
+ "count": 8,
+ "dir": "left"
+ }
+ ],
+ "x": 19,
+ "y": 1
+ },
+ {
+ "moves": [
+ {
+ "count": 9,
+ "dir": "down"
+ }
+ ],
+ "x": 18,
+ "y": 2
+ },
+ {
+ "moves": [
+ {
+ "count": 6,
+ "dir": "right"
+ }
+ ],
+ "x": 11,
+ "y": 2
+ },
+ {
+ "moves": [
+ {
+ "count": 2,
+ "dir": "down"
+ }
+ ],
+ "x": 16,
+ "y": 10
+ },
+ {
+ "moves": [
+ {
+ "count": 7,
+ "dir": "down"
+ }
+ ],
+ "x": 4,
+ "y": 6
+ },
+ {
+ "moves": [
+ {
+ "count": 8,
+ "dir": "right"
+ }
+ ],
+ "x": 5,
+ "y": 13
+ },
+ {
+ "moves": [
+ {
+ "count": 9,
+ "dir": "right"
+ }
+ ],
+ "x": 4,
+ "y": 14
+ },
+ {
+ "moves": [
+ {
+ "count": 8,
+ "dir": "up"
+ }
+ ],
+ "x": 0,
+ "y": 15
+ },
+ {
+ "moves": [
+ {
+ "count": 6,
+ "dir": "up"
+ }
+ ],
+ "x": 1,
+ "y": 15
+ },
+ {
+ "moves": [
+ {
+ "count": 6,
+ "dir": "left"
+ }
+ ],
+ "x": 13,
+ "y": 16
+ },
+ {
+ "moves": [
+ {
+ "count": 12,
+ "dir": "left"
+ }
+ ],
+ "x": 13,
+ "y": 17
+ }
+ ]
+ },
+ "superRod": {
+ "CELADON_CITY": [
+ {
+ "level": 23,
+ "species": "POLIWHIRL"
+ },
+ {
+ "level": 15,
+ "species": "SLOWPOKE"
+ }
+ ],
+ "CERULEAN_CAVE_1F": [
+ {
+ "level": 23,
+ "species": "SLOWBRO"
+ },
+ {
+ "level": 23,
+ "species": "SEAKING"
+ },
+ {
+ "level": 23,
+ "species": "KINGLER"
+ },
+ {
+ "level": 23,
+ "species": "SEADRA"
+ }
+ ],
+ "CERULEAN_CAVE_2F": [
+ {
+ "level": 23,
+ "species": "SLOWBRO"
+ },
+ {
+ "level": 23,
+ "species": "SEAKING"
+ },
+ {
+ "level": 23,
+ "species": "KINGLER"
+ },
+ {
+ "level": 23,
+ "species": "SEADRA"
+ }
+ ],
+ "CERULEAN_CAVE_B1F": [
+ {
+ "level": 23,
+ "species": "SLOWBRO"
+ },
+ {
+ "level": 23,
+ "species": "SEAKING"
+ },
+ {
+ "level": 23,
+ "species": "KINGLER"
+ },
+ {
+ "level": 23,
+ "species": "SEADRA"
+ }
+ ],
+ "CERULEAN_CITY": [
+ {
+ "level": 15,
+ "species": "PSYDUCK"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ }
+ ],
+ "CERULEAN_GYM": [
+ {
+ "level": 15,
+ "species": "PSYDUCK"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ }
+ ],
+ "CINNABAR_ISLAND": [
+ {
+ "level": 15,
+ "species": "STARYU"
+ },
+ {
+ "level": 15,
+ "species": "HORSEA"
+ },
+ {
+ "level": 15,
+ "species": "SHELLDER"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ }
+ ],
+ "FUCHSIA_CITY": [
+ {
+ "level": 23,
+ "species": "SEAKING"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "MAGIKARP"
+ }
+ ],
+ "PALLET_TOWN": [
+ {
+ "level": 15,
+ "species": "TENTACOOL"
+ },
+ {
+ "level": 15,
+ "species": "POLIWAG"
+ }
+ ],
+ "ROUTE_10": [
+ {
+ "level": 23,
+ "species": "POLIWHIRL"
+ },
+ {
+ "level": 15,
+ "species": "SLOWPOKE"
+ }
+ ],
+ "ROUTE_11": [
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "SHELLDER"
+ }
+ ],
+ "ROUTE_12": [
+ {
+ "level": 5,
+ "species": "TENTACOOL"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "MAGIKARP"
+ }
+ ],
+ "ROUTE_13": [
+ {
+ "level": 5,
+ "species": "TENTACOOL"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "MAGIKARP"
+ }
+ ],
+ "ROUTE_17": [
+ {
+ "level": 5,
+ "species": "TENTACOOL"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "MAGIKARP"
+ }
+ ],
+ "ROUTE_18": [
+ {
+ "level": 5,
+ "species": "TENTACOOL"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "MAGIKARP"
+ }
+ ],
+ "ROUTE_19": [
+ {
+ "level": 15,
+ "species": "STARYU"
+ },
+ {
+ "level": 15,
+ "species": "HORSEA"
+ },
+ {
+ "level": 15,
+ "species": "SHELLDER"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ }
+ ],
+ "ROUTE_20": [
+ {
+ "level": 15,
+ "species": "STARYU"
+ },
+ {
+ "level": 15,
+ "species": "HORSEA"
+ },
+ {
+ "level": 15,
+ "species": "SHELLDER"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ }
+ ],
+ "ROUTE_21": [
+ {
+ "level": 15,
+ "species": "STARYU"
+ },
+ {
+ "level": 15,
+ "species": "HORSEA"
+ },
+ {
+ "level": 15,
+ "species": "SHELLDER"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ }
+ ],
+ "ROUTE_22": [
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "POLIWAG"
+ }
+ ],
+ "ROUTE_23": [
+ {
+ "level": 23,
+ "species": "SLOWBRO"
+ },
+ {
+ "level": 23,
+ "species": "SEAKING"
+ },
+ {
+ "level": 23,
+ "species": "KINGLER"
+ },
+ {
+ "level": 23,
+ "species": "SEADRA"
+ }
+ ],
+ "ROUTE_24": [
+ {
+ "level": 15,
+ "species": "PSYDUCK"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ }
+ ],
+ "ROUTE_25": [
+ {
+ "level": 15,
+ "species": "PSYDUCK"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ }
+ ],
+ "ROUTE_4": [
+ {
+ "level": 15,
+ "species": "PSYDUCK"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ }
+ ],
+ "ROUTE_6": [
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "SHELLDER"
+ }
+ ],
+ "SAFARI_ZONE_CENTER": [
+ {
+ "level": 15,
+ "species": "DRATINI"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "PSYDUCK"
+ },
+ {
+ "level": 15,
+ "species": "SLOWPOKE"
+ }
+ ],
+ "SAFARI_ZONE_EAST": [
+ {
+ "level": 15,
+ "species": "DRATINI"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "PSYDUCK"
+ },
+ {
+ "level": 15,
+ "species": "SLOWPOKE"
+ }
+ ],
+ "SAFARI_ZONE_NORTH": [
+ {
+ "level": 15,
+ "species": "DRATINI"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "PSYDUCK"
+ },
+ {
+ "level": 15,
+ "species": "SLOWPOKE"
+ }
+ ],
+ "SAFARI_ZONE_WEST": [
+ {
+ "level": 15,
+ "species": "DRATINI"
+ },
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "PSYDUCK"
+ },
+ {
+ "level": 15,
+ "species": "SLOWPOKE"
+ }
+ ],
+ "SEAFOAM_ISLANDS_B3F": [
+ {
+ "level": 15,
+ "species": "STARYU"
+ },
+ {
+ "level": 15,
+ "species": "HORSEA"
+ },
+ {
+ "level": 15,
+ "species": "SHELLDER"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ }
+ ],
+ "SEAFOAM_ISLANDS_B4F": [
+ {
+ "level": 15,
+ "species": "STARYU"
+ },
+ {
+ "level": 15,
+ "species": "HORSEA"
+ },
+ {
+ "level": 15,
+ "species": "SHELLDER"
+ },
+ {
+ "level": 15,
+ "species": "GOLDEEN"
+ }
+ ],
+ "VERMILION_CITY": [
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "SHELLDER"
+ }
+ ],
+ "VERMILION_DOCK": [
+ {
+ "level": 15,
+ "species": "KRABBY"
+ },
+ {
+ "level": 15,
+ "species": "SHELLDER"
+ }
+ ],
+ "VIRIDIAN_CITY": [
+ {
+ "level": 15,
+ "species": "TENTACOOL"
+ },
+ {
+ "level": 15,
+ "species": "POLIWAG"
+ }
+ ]
+ },
+ "tilePairs": {
+ "land": [
+ {
+ "a": 32,
+ "b": 5,
+ "tileset": "CAVERN"
+ },
+ {
+ "a": 65,
+ "b": 5,
+ "tileset": "CAVERN"
+ },
+ {
+ "a": 48,
+ "b": 46,
+ "tileset": "FOREST"
+ },
+ {
+ "a": 42,
+ "b": 5,
+ "tileset": "CAVERN"
+ },
+ {
+ "a": 5,
+ "b": 33,
+ "tileset": "CAVERN"
+ },
+ {
+ "a": 82,
+ "b": 46,
+ "tileset": "FOREST"
+ },
+ {
+ "a": 85,
+ "b": 46,
+ "tileset": "FOREST"
+ },
+ {
+ "a": 86,
+ "b": 46,
+ "tileset": "FOREST"
+ },
+ {
+ "a": 32,
+ "b": 46,
+ "tileset": "FOREST"
+ },
+ {
+ "a": 94,
+ "b": 46,
+ "tileset": "FOREST"
+ },
+ {
+ "a": 95,
+ "b": 46,
+ "tileset": "FOREST"
+ }
+ ],
+ "water": [
+ {
+ "a": 20,
+ "b": 46,
+ "tileset": "FOREST"
+ },
+ {
+ "a": 72,
+ "b": 46,
+ "tileset": "FOREST"
+ },
+ {
+ "a": 20,
+ "b": 5,
+ "tileset": "CAVERN"
+ }
+ ]
+ },
+ "title": {
+ "copyright": {
+ "height": 8,
+ "path": "assets/generated/title/copyright.png",
+ "width": 152
+ },
+ "cycleSpecies": [],
+ "gamefreakInc": {
+ "height": 8,
+ "path": "assets/generated/title/gamefreak_inc.png",
+ "width": 72
+ },
+ "layout": "yellow_pikachu",
+ "logo": {
+ "height": 56,
+ "path": "assets/generated/title/pokemon_logo.png",
+ "width": 128
+ },
+ "music": "Music_TitleScreen",
+ "pikaBubble": {
+ "height": 32,
+ "path": "assets/generated/title/pika_bubble.png",
+ "width": 56
+ },
+ "pikachu": {
+ "height": 72,
+ "path": "assets/generated/title/pikachu.png",
+ "width": 96
+ },
+ "pikachuBg": {
+ "height": 32,
+ "path": "assets/generated/title/pikachu_bg.png",
+ "width": 128
+ },
+ "pikachuOb": {
+ "height": 8,
+ "path": "assets/generated/title/pikachu_ob.png",
+ "width": 96
+ },
+ "player": {
+ "height": 56,
+ "path": "assets/generated/title/player.png",
+ "width": 40
+ },
+ "version": {
+ "height": 8,
+ "path": "assets/generated/title/red_version.png",
+ "width": 80
+ }
+ },
+ "townMap": {
+ "background": {
+ "cursor": {
+ "height": 16,
+ "path": "assets/generated/townmap/cursor.png",
+ "width": 16
+ },
+ "map": [
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 7,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 7,
+ 7,
+ 8,
+ 4,
+ 4,
+ 4,
+ 4,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 6,
+ 6,
+ 6,
+ 6,
+ 8,
+ 4,
+ 4,
+ 6,
+ 6,
+ 5,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 12,
+ 7,
+ 7,
+ 7,
+ 5,
+ 7,
+ 7,
+ 7,
+ 7,
+ 6,
+ 6,
+ 4,
+ 6,
+ 6,
+ 7,
+ 6,
+ 5,
+ 7,
+ 7,
+ 7,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 6,
+ 6,
+ 6,
+ 12,
+ 6,
+ 11,
+ 4,
+ 6,
+ 6,
+ 12,
+ 6,
+ 12,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 6,
+ 6,
+ 6,
+ 7,
+ 11,
+ 4,
+ 4,
+ 6,
+ 6,
+ 7,
+ 6,
+ 7,
+ 6,
+ 7,
+ 7,
+ 7,
+ 5,
+ 7,
+ 7,
+ 5,
+ 7,
+ 7,
+ 7,
+ 5,
+ 4,
+ 4,
+ 4,
+ 6,
+ 6,
+ 7,
+ 6,
+ 7,
+ 6,
+ 7,
+ 6,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 6,
+ 6,
+ 6,
+ 7,
+ 4,
+ 4,
+ 4,
+ 6,
+ 6,
+ 7,
+ 6,
+ 7,
+ 6,
+ 7,
+ 11,
+ 10,
+ 6,
+ 6,
+ 6,
+ 7,
+ 6,
+ 6,
+ 6,
+ 7,
+ 4,
+ 4,
+ 4,
+ 6,
+ 6,
+ 7,
+ 7,
+ 5,
+ 6,
+ 7,
+ 4,
+ 4,
+ 4,
+ 10,
+ 6,
+ 7,
+ 6,
+ 6,
+ 6,
+ 7,
+ 4,
+ 4,
+ 4,
+ 6,
+ 11,
+ 10,
+ 6,
+ 7,
+ 6,
+ 7,
+ 6,
+ 4,
+ 4,
+ 4,
+ 6,
+ 5,
+ 7,
+ 7,
+ 7,
+ 7,
+ 9,
+ 4,
+ 4,
+ 11,
+ 4,
+ 4,
+ 6,
+ 7,
+ 6,
+ 7,
+ 11,
+ 4,
+ 4,
+ 4,
+ 10,
+ 6,
+ 6,
+ 6,
+ 6,
+ 7,
+ 11,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 6,
+ 5,
+ 11,
+ 15,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 6,
+ 7,
+ 7,
+ 7,
+ 7,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 10,
+ 7,
+ 4,
+ 15,
+ 4,
+ 4,
+ 9,
+ 6,
+ 6,
+ 6,
+ 7,
+ 6,
+ 6,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 15,
+ 4,
+ 13,
+ 14,
+ 7,
+ 7,
+ 5,
+ 7,
+ 7,
+ 7,
+ 6,
+ 11,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 9,
+ 7,
+ 8,
+ 4,
+ 4,
+ 10,
+ 6,
+ 7,
+ 11,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 6,
+ 5,
+ 7,
+ 14,
+ 12,
+ 14,
+ 14,
+ 13,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4,
+ 4
+ ],
+ "tiles": {
+ "height": 32,
+ "path": "assets/generated/townmap/tiles.png",
+ "width": 32
+ }
+ },
+ "cursorOrder": [
+ "PALLET_TOWN",
+ "ROUTE_1",
+ "VIRIDIAN_CITY",
+ "ROUTE_2",
+ "VIRIDIAN_FOREST",
+ "DIGLETTS_CAVE",
+ "PEWTER_CITY",
+ "ROUTE_3",
+ "MT_MOON_1F",
+ "ROUTE_4",
+ "CERULEAN_CITY",
+ "ROUTE_24",
+ "ROUTE_25",
+ "BILLS_HOUSE",
+ "ROUTE_5",
+ "ROUTE_6",
+ "VERMILION_CITY",
+ "SS_ANNE_1F",
+ "ROUTE_9",
+ "ROCK_TUNNEL_POKECENTER",
+ "ROUTE_10",
+ "LAVENDER_TOWN",
+ "POKEMON_TOWER_2F",
+ "ROUTE_8",
+ "ROUTE_7",
+ "CELADON_CITY",
+ "SAFFRON_CITY",
+ "ROUTE_11",
+ "ROUTE_12",
+ "ROUTE_13",
+ "ROUTE_14",
+ "ROUTE_15",
+ "ROUTE_16",
+ "ROUTE_17",
+ "ROUTE_18",
+ "FUCHSIA_CITY",
+ "SAFARI_ZONE_EAST",
+ "ROUTE_19",
+ "SEAFOAM_ISLANDS_B1F",
+ "ROUTE_20",
+ "CINNABAR_ISLAND",
+ "ROUTE_21",
+ "ROUTE_22",
+ "ROUTE_23",
+ "VICTORY_ROAD_3F",
+ "INDIGO_PLATEAU",
+ "POWER_PLANT"
+ ],
+ "gridPixelSize": 8,
+ "locations": {
+ "AGATHAS_ROOM": {
+ "name": "POKéMON LEAGUE",
+ "x": 0,
+ "y": 2
+ },
+ "BIKE_SHOP": {
+ "name": "CERULEAN CITY",
+ "x": 10,
+ "y": 2
+ },
+ "BILLS_HOUSE": {
+ "name": "SEA COTTAGE",
+ "x": 12,
+ "y": 0
+ },
+ "BLUES_HOUSE": {
+ "name": "PALLET TOWN",
+ "x": 2,
+ "y": 11
+ },
+ "BRUNOS_ROOM": {
+ "name": "POKéMON LEAGUE",
+ "x": 0,
+ "y": 2
+ },
+ "CELADON_CHIEF_HOUSE": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_CITY": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_DINER": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_GYM": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_HOTEL": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MANSION_1F": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MANSION_2F": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MANSION_3F": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MANSION_ROOF": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MANSION_ROOF_HOUSE": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MART_1F": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MART_2F": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MART_3F": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MART_4F": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MART_5F": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MART_ELEVATOR": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_MART_ROOF": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CELADON_POKECENTER": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "CERULEAN_BADGE_HOUSE": {
+ "name": "CERULEAN CITY",
+ "x": 10,
+ "y": 2
+ },
+ "CERULEAN_CAVE_1F": {
+ "name": "CERULEAN CAVE",
+ "x": 9,
+ "y": 1
+ },
+ "CERULEAN_CAVE_2F": {
+ "name": "CERULEAN CAVE",
+ "x": 9,
+ "y": 1
+ },
+ "CERULEAN_CAVE_B1F": {
+ "name": "CERULEAN CAVE",
+ "x": 9,
+ "y": 1
+ },
+ "CERULEAN_CITY": {
+ "name": "CERULEAN CITY",
+ "x": 10,
+ "y": 2
+ },
+ "CERULEAN_GYM": {
+ "name": "CERULEAN CITY",
+ "x": 10,
+ "y": 2
+ },
+ "CERULEAN_MART": {
+ "name": "CERULEAN CITY",
+ "x": 10,
+ "y": 2
+ },
+ "CERULEAN_MELANIES_HOUSE": {
+ "name": "CERULEAN CITY",
+ "x": 10,
+ "y": 2
+ },
+ "CERULEAN_POKECENTER": {
+ "name": "CERULEAN CITY",
+ "x": 10,
+ "y": 2
+ },
+ "CERULEAN_TRASHED_HOUSE": {
+ "name": "CERULEAN CITY",
+ "x": 10,
+ "y": 2
+ },
+ "CERULEAN_TRASHED_HOUSE_COPY": {
+ "name": "CERULEAN CITY",
+ "x": 10,
+ "y": 2
+ },
+ "CHAMPIONS_ROOM": {
+ "name": "POKéMON LEAGUE",
+ "x": 0,
+ "y": 2
+ },
+ "CINNABAR_GYM": {
+ "name": "CINNABAR ISLAND",
+ "x": 2,
+ "y": 15
+ },
+ "CINNABAR_ISLAND": {
+ "name": "CINNABAR ISLAND",
+ "x": 2,
+ "y": 15
+ },
+ "CINNABAR_LAB": {
+ "name": "CINNABAR ISLAND",
+ "x": 2,
+ "y": 15
+ },
+ "CINNABAR_LAB_FOSSIL_ROOM": {
+ "name": "CINNABAR ISLAND",
+ "x": 2,
+ "y": 15
+ },
+ "CINNABAR_LAB_METRONOME_ROOM": {
+ "name": "CINNABAR ISLAND",
+ "x": 2,
+ "y": 15
+ },
+ "CINNABAR_LAB_TRADE_ROOM": {
+ "name": "CINNABAR ISLAND",
+ "x": 2,
+ "y": 15
+ },
+ "CINNABAR_MART": {
+ "name": "CINNABAR ISLAND",
+ "x": 2,
+ "y": 15
+ },
+ "CINNABAR_MART_COPY": {
+ "name": "CINNABAR ISLAND",
+ "x": 2,
+ "y": 15
+ },
+ "CINNABAR_POKECENTER": {
+ "name": "CINNABAR ISLAND",
+ "x": 2,
+ "y": 15
+ },
+ "COLOSSEUM": {
+ "name": "POKéMON LEAGUE",
+ "x": 0,
+ "y": 2
+ },
+ "COPYCATS_HOUSE_1F": {
+ "name": "SAFFRON CITY",
+ "x": 10,
+ "y": 5
+ },
+ "COPYCATS_HOUSE_2F": {
+ "name": "SAFFRON CITY",
+ "x": 10,
+ "y": 5
+ },
+ "DAYCARE": {
+ "name": "ROUTE 5",
+ "x": 10,
+ "y": 4
+ },
+ "DIGLETTS_CAVE": {
+ "name": "DIGLETT's CAVE",
+ "x": 3,
+ "y": 4
+ },
+ "DIGLETTS_CAVE_ROUTE_11": {
+ "name": "ROUTE 11",
+ "x": 13,
+ "y": 9
+ },
+ "DIGLETTS_CAVE_ROUTE_2": {
+ "name": "ROUTE 2",
+ "x": 2,
+ "y": 6
+ },
+ "FIGHTING_DOJO": {
+ "name": "SAFFRON CITY",
+ "x": 10,
+ "y": 5
+ },
+ "FUCHSIA_BILLS_GRANDPAS_HOUSE": {
+ "name": "FUCHSIA CITY",
+ "x": 8,
+ "y": 13
+ },
+ "FUCHSIA_CITY": {
+ "name": "FUCHSIA CITY",
+ "x": 8,
+ "y": 13
+ },
+ "FUCHSIA_GOOD_ROD_HOUSE": {
+ "name": "FUCHSIA CITY",
+ "x": 8,
+ "y": 13
+ },
+ "FUCHSIA_GYM": {
+ "name": "FUCHSIA CITY",
+ "x": 8,
+ "y": 13
+ },
+ "FUCHSIA_MART": {
+ "name": "FUCHSIA CITY",
+ "x": 8,
+ "y": 13
+ },
+ "FUCHSIA_MEETING_ROOM": {
+ "name": "FUCHSIA CITY",
+ "x": 8,
+ "y": 13
+ },
+ "FUCHSIA_POKECENTER": {
+ "name": "FUCHSIA CITY",
+ "x": 8,
+ "y": 13
+ },
+ "GAME_CORNER": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "GAME_CORNER_PRIZE_ROOM": {
+ "name": "CELADON CITY",
+ "x": 7,
+ "y": 5
+ },
+ "HALL_OF_FAME": {
+ "name": "POKéMON LEAGUE",
+ "x": 0,
+ "y": 2
+ },
+ "INDIGO_PLATEAU": {
+ "name": "INDIGO PLATEAU",
+ "x": 0,
+ "y": 2
+ },
+ "INDIGO_PLATEAU_LOBBY": {
+ "name": "INDIGO PLATEAU",
+ "x": 0,
+ "y": 2
+ },
+ "LANCES_ROOM": {
+ "name": "POKéMON LEAGUE",
+ "x": 0,
+ "y": 2
+ },
+ "LAVENDER_CUBONE_HOUSE": {
+ "name": "LAVENDER TOWN",
+ "x": 14,
+ "y": 5
+ },
+ "LAVENDER_MART": {
+ "name": "LAVENDER TOWN",
+ "x": 14,
+ "y": 5
+ },
+ "LAVENDER_POKECENTER": {
+ "name": "LAVENDER TOWN",
+ "x": 14,
+ "y": 5
+ },
+ "LAVENDER_TOWN": {
+ "name": "LAVENDER TOWN",
+ "x": 14,
+ "y": 5
+ },
+ "LORELEIS_ROOM": {
+ "name": "POKéMON LEAGUE",
+ "x": 0,
+ "y": 2
+ },
+ "MR_FUJIS_HOUSE": {
+ "name": "LAVENDER TOWN",
+ "x": 14,
+ "y": 5
+ },
+ "MR_PSYCHICS_HOUSE": {
+ "name": "SAFFRON CITY",
+ "x": 10,
+ "y": 5
+ },
+ "MT_MOON_1F": {
+ "name": "MT.MOON",
+ "x": 6,
+ "y": 2
+ },
+ "MT_MOON_B1F": {
+ "name": "MT.MOON",
+ "x": 6,
+ "y": 2
+ },
+ "MT_MOON_B2F": {
+ "name": "MT.MOON",
+ "x": 6,
+ "y": 2
+ },
+ "MT_MOON_POKECENTER": {
+ "name": "ROUTE 4",
+ "x": 5,
+ "y": 2
+ },
+ "MUSEUM_1F": {
+ "name": "PEWTER CITY",
+ "x": 2,
+ "y": 3
+ },
+ "MUSEUM_2F": {
+ "name": "PEWTER CITY",
+ "x": 2,
+ "y": 3
+ },
+ "NAME_RATERS_HOUSE": {
+ "name": "LAVENDER TOWN",
+ "x": 14,
+ "y": 5
+ },
+ "OAKS_LAB": {
+ "name": "PALLET TOWN",
+ "x": 2,
+ "y": 11
+ },
+ "PALLET_TOWN": {
+ "name": "PALLET TOWN",
+ "x": 2,
+ "y": 11
+ },
+ "PEWTER_CITY": {
+ "name": "PEWTER CITY",
+ "x": 2,
+ "y": 3
+ },
+ "PEWTER_GYM": {
+ "name": "PEWTER CITY",
+ "x": 2,
+ "y": 3
+ },
+ "PEWTER_MART": {
+ "name": "PEWTER CITY",
+ "x": 2,
+ "y": 3
+ },
+ "PEWTER_NIDORAN_HOUSE": {
+ "name": "PEWTER CITY",
+ "x": 2,
+ "y": 3
+ },
+ "PEWTER_POKECENTER": {
+ "name": "PEWTER CITY",
+ "x": 2,
+ "y": 3
+ },
+ "PEWTER_SPEECH_HOUSE": {
+ "name": "PEWTER CITY",
+ "x": 2,
+ "y": 3
+ },
+ "POKEMON_FAN_CLUB": {
+ "name": "VERMILION CITY",
+ "x": 10,
+ "y": 9
+ },
+ "POKEMON_MANSION_1F": {
+ "name": "POKéMON MANSION",
+ "x": 2,
+ "y": 15
+ },
+ "POKEMON_MANSION_2F": {
+ "name": "POKéMON MANSION",
+ "x": 2,
+ "y": 15
+ },
+ "POKEMON_MANSION_3F": {
+ "name": "POKéMON MANSION",
+ "x": 2,
+ "y": 15
+ },
+ "POKEMON_MANSION_B1F": {
+ "name": "POKéMON MANSION",
+ "x": 2,
+ "y": 15
+ },
+ "POKEMON_TOWER_1F": {
+ "name": "POKéMON TOWER",
+ "x": 15,
+ "y": 5
+ },
+ "POKEMON_TOWER_2F": {
+ "name": "POKéMON TOWER",
+ "x": 15,
+ "y": 5
+ },
+ "POKEMON_TOWER_3F": {
+ "name": "POKéMON TOWER",
+ "x": 15,
+ "y": 5
+ },
+ "POKEMON_TOWER_4F": {
+ "name": "POKéMON TOWER",
+ "x": 15,
+ "y": 5
+ },
+ "POKEMON_TOWER_5F": {
+ "name": "POKéMON TOWER",
+ "x": 15,
+ "y": 5
+ },
+ "POKEMON_TOWER_6F": {
+ "name": "POKéMON TOWER",
+ "x": 15,
+ "y": 5
+ },
+ "POKEMON_TOWER_7F": {
+ "name": "POKéMON TOWER",
+ "x": 15,
+ "y": 5
+ },
+ "POWER_PLANT": {
+ "name": "POWER PLANT",
+ "x": 15,
+ "y": 4
+ },
+ "REDS_HOUSE_1F": {
+ "name": "PALLET TOWN",
+ "x": 2,
+ "y": 11
+ },
+ "REDS_HOUSE_2F": {
+ "name": "PALLET TOWN",
+ "x": 2,
+ "y": 11
+ },
+ "ROCKET_HIDEOUT_B1F": {
+ "name": "ROCKET HQ",
+ "x": 7,
+ "y": 5
+ },
+ "ROCKET_HIDEOUT_B2F": {
+ "name": "ROCKET HQ",
+ "x": 7,
+ "y": 5
+ },
+ "ROCKET_HIDEOUT_B3F": {
+ "name": "ROCKET HQ",
+ "x": 7,
+ "y": 5
+ },
+ "ROCKET_HIDEOUT_B4F": {
+ "name": "ROCKET HQ",
+ "x": 7,
+ "y": 5
+ },
+ "ROCKET_HIDEOUT_ELEVATOR": {
+ "name": "ROCKET HQ",
+ "x": 7,
+ "y": 5
+ },
+ "ROCK_TUNNEL_1F": {
+ "name": "ROCK TUNNEL",
+ "x": 14,
+ "y": 3
+ },
+ "ROCK_TUNNEL_B1F": {
+ "name": "ROCK TUNNEL",
+ "x": 14,
+ "y": 3
+ },
+ "ROCK_TUNNEL_POKECENTER": {
+ "name": "ROCK TUNNEL",
+ "x": 14,
+ "y": 3
+ },
+ "ROUTE_1": {
+ "name": "ROUTE 1",
+ "x": 2,
+ "y": 10
+ },
+ "ROUTE_10": {
+ "name": "ROUTE 10",
+ "x": 14,
+ "y": 4
+ },
+ "ROUTE_11": {
+ "name": "ROUTE 11",
+ "x": 12,
+ "y": 9
+ },
+ "ROUTE_11_GATE_1F": {
+ "name": "ROUTE 11",
+ "x": 13,
+ "y": 9
+ },
+ "ROUTE_11_GATE_2F": {
+ "name": "ROUTE 11",
+ "x": 13,
+ "y": 9
+ },
+ "ROUTE_12": {
+ "name": "ROUTE 12",
+ "x": 14,
+ "y": 9
+ },
+ "ROUTE_12_GATE_1F": {
+ "name": "ROUTE 12",
+ "x": 14,
+ "y": 7
+ },
+ "ROUTE_12_GATE_2F": {
+ "name": "ROUTE 12",
+ "x": 14,
+ "y": 7
+ },
+ "ROUTE_12_SUPER_ROD_HOUSE": {
+ "name": "ROUTE 12",
+ "x": 14,
+ "y": 10
+ },
+ "ROUTE_13": {
+ "name": "ROUTE 13",
+ "x": 13,
+ "y": 11
+ },
+ "ROUTE_14": {
+ "name": "ROUTE 14",
+ "x": 11,
+ "y": 12
+ },
+ "ROUTE_15": {
+ "name": "ROUTE 15",
+ "x": 10,
+ "y": 13
+ },
+ "ROUTE_15_GATE_1F": {
+ "name": "ROUTE 15",
+ "x": 9,
+ "y": 13
+ },
+ "ROUTE_15_GATE_2F": {
+ "name": "ROUTE 15",
+ "x": 9,
+ "y": 13
+ },
+ "ROUTE_16": {
+ "name": "ROUTE 16",
+ "x": 5,
+ "y": 5
+ },
+ "ROUTE_16_FLY_HOUSE": {
+ "name": "ROUTE 16",
+ "x": 4,
+ "y": 5
+ },
+ "ROUTE_16_GATE_1F": {
+ "name": "ROUTE 16",
+ "x": 4,
+ "y": 5
+ },
+ "ROUTE_16_GATE_2F": {
+ "name": "ROUTE 16",
+ "x": 4,
+ "y": 5
+ },
+ "ROUTE_17": {
+ "name": "ROUTE 17",
+ "x": 4,
+ "y": 8
+ },
+ "ROUTE_18": {
+ "name": "ROUTE 18",
+ "x": 6,
+ "y": 13
+ },
+ "ROUTE_18_GATE_1F": {
+ "name": "ROUTE 18",
+ "x": 7,
+ "y": 13
+ },
+ "ROUTE_18_GATE_2F": {
+ "name": "ROUTE 18",
+ "x": 7,
+ "y": 13
+ },
+ "ROUTE_19": {
+ "name": "SEA ROUTE 19",
+ "x": 6,
+ "y": 15
+ },
+ "ROUTE_2": {
+ "name": "ROUTE 2",
+ "x": 2,
+ "y": 6
+ },
+ "ROUTE_20": {
+ "name": "SEA ROUTE 20",
+ "x": 4,
+ "y": 15
+ },
+ "ROUTE_21": {
+ "name": "SEA ROUTE 21",
+ "x": 2,
+ "y": 13
+ },
+ "ROUTE_22": {
+ "name": "ROUTE 22",
+ "x": 0,
+ "y": 8
+ },
+ "ROUTE_22_GATE": {
+ "name": "ROUTE 22",
+ "x": 0,
+ "y": 7
+ },
+ "ROUTE_23": {
+ "name": "ROUTE 23",
+ "x": 0,
+ "y": 6
+ },
+ "ROUTE_24": {
+ "name": "ROUTE 24",
+ "x": 10,
+ "y": 1
+ },
+ "ROUTE_25": {
+ "name": "ROUTE 25",
+ "x": 11,
+ "y": 0
+ },
+ "ROUTE_2_GATE": {
+ "name": "ROUTE 2",
+ "x": 2,
+ "y": 6
+ },
+ "ROUTE_2_TRADE_HOUSE": {
+ "name": "ROUTE 2",
+ "x": 2,
+ "y": 6
+ },
+ "ROUTE_3": {
+ "name": "ROUTE 3",
+ "x": 4,
+ "y": 3
+ },
+ "ROUTE_4": {
+ "name": "ROUTE 4",
+ "x": 8,
+ "y": 2
+ },
+ "ROUTE_5": {
+ "name": "ROUTE 5",
+ "x": 10,
+ "y": 3
+ },
+ "ROUTE_5_GATE": {
+ "name": "ROUTE 5",
+ "x": 10,
+ "y": 4
+ },
+ "ROUTE_6": {
+ "name": "ROUTE 6",
+ "x": 10,
+ "y": 8
+ },
+ "ROUTE_6_GATE": {
+ "name": "ROUTE 6",
+ "x": 10,
+ "y": 6
+ },
+ "ROUTE_7": {
+ "name": "ROUTE 7",
+ "x": 8,
+ "y": 5
+ },
+ "ROUTE_7_GATE": {
+ "name": "ROUTE 7",
+ "x": 9,
+ "y": 5
+ },
+ "ROUTE_8": {
+ "name": "ROUTE 8",
+ "x": 13,
+ "y": 5
+ },
+ "ROUTE_8_GATE": {
+ "name": "ROUTE 8",
+ "x": 11,
+ "y": 5
+ },
+ "ROUTE_9": {
+ "name": "ROUTE 9",
+ "x": 13,
+ "y": 2
+ },
+ "SAFARI_ZONE_CENTER": {
+ "name": "SAFARI ZONE",
+ "x": 8,
+ "y": 12
+ },
+ "SAFARI_ZONE_CENTER_REST_HOUSE": {
+ "name": "SAFARI ZONE",
+ "x": 8,
+ "y": 12
+ },
+ "SAFARI_ZONE_EAST": {
+ "name": "SAFARI ZONE",
+ "x": 8,
+ "y": 12
+ },
+ "SAFARI_ZONE_EAST_REST_HOUSE": {
+ "name": "SAFARI ZONE",
+ "x": 8,
+ "y": 12
+ },
+ "SAFARI_ZONE_GATE": {
+ "name": "SAFARI ZONE",
+ "x": 8,
+ "y": 12
+ },
+ "SAFARI_ZONE_NORTH": {
+ "name": "SAFARI ZONE",
+ "x": 8,
+ "y": 12
+ },
+ "SAFARI_ZONE_NORTH_REST_HOUSE": {
+ "name": "SAFARI ZONE",
+ "x": 8,
+ "y": 12
+ },
+ "SAFARI_ZONE_SECRET_HOUSE": {
+ "name": "SAFARI ZONE",
+ "x": 8,
+ "y": 12
+ },
+ "SAFARI_ZONE_WEST": {
+ "name": "SAFARI ZONE",
+ "x": 8,
+ "y": 12
+ },
+ "SAFARI_ZONE_WEST_REST_HOUSE": {
+ "name": "SAFARI ZONE",
+ "x": 8,
+ "y": 12
+ },
+ "SAFFRON_CITY": {
+ "name": "SAFFRON CITY",
+ "x": 10,
+ "y": 5
+ },
+ "SAFFRON_GYM": {
+ "name": "SAFFRON CITY",
+ "x": 10,
+ "y": 5
+ },
+ "SAFFRON_MART": {
+ "name": "SAFFRON CITY",
+ "x": 10,
+ "y": 5
+ },
+ "SAFFRON_PIDGEY_HOUSE": {
+ "name": "SAFFRON CITY",
+ "x": 10,
+ "y": 5
+ },
+ "SAFFRON_POKECENTER": {
+ "name": "SAFFRON CITY",
+ "x": 10,
+ "y": 5
+ },
+ "SEAFOAM_ISLANDS_1F": {
+ "name": "SEAFOAM ISLANDS",
+ "x": 5,
+ "y": 15
+ },
+ "SEAFOAM_ISLANDS_B1F": {
+ "name": "SEAFOAM ISLANDS",
+ "x": 5,
+ "y": 15
+ },
+ "SEAFOAM_ISLANDS_B2F": {
+ "name": "SEAFOAM ISLANDS",
+ "x": 5,
+ "y": 15
+ },
+ "SEAFOAM_ISLANDS_B3F": {
+ "name": "SEAFOAM ISLANDS",
+ "x": 5,
+ "y": 15
+ },
+ "SEAFOAM_ISLANDS_B4F": {
+ "name": "SEAFOAM ISLANDS",
+ "x": 5,
+ "y": 15
+ },
+ "SILPH_CO_10F": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_11F": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_1F": {
+ "name": "SAFFRON CITY",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_2F": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_3F": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_4F": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_5F": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_6F": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_7F": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_8F": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_9F": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SILPH_CO_ELEVATOR": {
+ "name": "SILPH CO.",
+ "x": 10,
+ "y": 5
+ },
+ "SS_ANNE_1F": {
+ "name": "S.S.ANNE",
+ "x": 9,
+ "y": 10
+ },
+ "SS_ANNE_1F_ROOMS": {
+ "name": "S.S.ANNE",
+ "x": 9,
+ "y": 10
+ },
+ "SS_ANNE_2F": {
+ "name": "S.S.ANNE",
+ "x": 9,
+ "y": 10
+ },
+ "SS_ANNE_2F_ROOMS": {
+ "name": "S.S.ANNE",
+ "x": 9,
+ "y": 10
+ },
+ "SS_ANNE_3F": {
+ "name": "S.S.ANNE",
+ "x": 9,
+ "y": 10
+ },
+ "SS_ANNE_B1F": {
+ "name": "S.S.ANNE",
+ "x": 9,
+ "y": 10
+ },
+ "SS_ANNE_B1F_ROOMS": {
+ "name": "S.S.ANNE",
+ "x": 9,
+ "y": 10
+ },
+ "SS_ANNE_BOW": {
+ "name": "S.S.ANNE",
+ "x": 9,
+ "y": 10
+ },
+ "SS_ANNE_CAPTAINS_ROOM": {
+ "name": "S.S.ANNE",
+ "x": 9,
+ "y": 10
+ },
+ "SS_ANNE_KITCHEN": {
+ "name": "S.S.ANNE",
+ "x": 9,
+ "y": 10
+ },
+ "SUMMER_BEACH_HOUSE": {
+ "name": "SEA ROUTE 19",
+ "x": 6,
+ "y": 15
+ },
+ "TRADE_CENTER": {
+ "name": "POKéMON LEAGUE",
+ "x": 0,
+ "y": 2
+ },
+ "UNDERGROUND_PATH_NORTH_SOUTH": {
+ "name": "UNDERGROUND PATH",
+ "x": 10,
+ "y": 5
+ },
+ "UNDERGROUND_PATH_ROUTE_5": {
+ "name": "ROUTE 5",
+ "x": 10,
+ "y": 4
+ },
+ "UNDERGROUND_PATH_ROUTE_6": {
+ "name": "ROUTE 6",
+ "x": 10,
+ "y": 6
+ },
+ "UNDERGROUND_PATH_ROUTE_6_COPY": {
+ "name": "ROUTE 6",
+ "x": 10,
+ "y": 6
+ },
+ "UNDERGROUND_PATH_ROUTE_7": {
+ "name": "ROUTE 7",
+ "x": 9,
+ "y": 5
+ },
+ "UNDERGROUND_PATH_ROUTE_7_COPY": {
+ "name": "ROUTE 7",
+ "x": 9,
+ "y": 5
+ },
+ "UNDERGROUND_PATH_ROUTE_8": {
+ "name": "ROUTE 8",
+ "x": 11,
+ "y": 5
+ },
+ "UNDERGROUND_PATH_WEST_EAST": {
+ "name": "UNDERGROUND PATH",
+ "x": 10,
+ "y": 5
+ },
+ "VERMILION_CITY": {
+ "name": "VERMILION CITY",
+ "x": 10,
+ "y": 9
+ },
+ "VERMILION_DOCK": {
+ "name": "VERMILION CITY",
+ "x": 10,
+ "y": 9
+ },
+ "VERMILION_GYM": {
+ "name": "VERMILION CITY",
+ "x": 10,
+ "y": 9
+ },
+ "VERMILION_MART": {
+ "name": "VERMILION CITY",
+ "x": 10,
+ "y": 9
+ },
+ "VERMILION_OLD_ROD_HOUSE": {
+ "name": "VERMILION CITY",
+ "x": 10,
+ "y": 9
+ },
+ "VERMILION_PIDGEY_HOUSE": {
+ "name": "VERMILION CITY",
+ "x": 10,
+ "y": 9
+ },
+ "VERMILION_POKECENTER": {
+ "name": "VERMILION CITY",
+ "x": 10,
+ "y": 9
+ },
+ "VERMILION_TRADE_HOUSE": {
+ "name": "VERMILION CITY",
+ "x": 10,
+ "y": 9
+ },
+ "VICTORY_ROAD_1F": {
+ "name": "VICTORY ROAD",
+ "x": 0,
+ "y": 4
+ },
+ "VICTORY_ROAD_2F": {
+ "name": "VICTORY ROAD",
+ "x": 0,
+ "y": 4
+ },
+ "VICTORY_ROAD_3F": {
+ "name": "VICTORY ROAD",
+ "x": 0,
+ "y": 4
+ },
+ "VIRIDIAN_CITY": {
+ "name": "VIRIDIAN CITY",
+ "x": 2,
+ "y": 8
+ },
+ "VIRIDIAN_FOREST": {
+ "name": "VIRIDIAN FOREST",
+ "x": 2,
+ "y": 4
+ },
+ "VIRIDIAN_FOREST_NORTH_GATE": {
+ "name": "ROUTE 2",
+ "x": 2,
+ "y": 6
+ },
+ "VIRIDIAN_FOREST_SOUTH_GATE": {
+ "name": "ROUTE 2",
+ "x": 2,
+ "y": 6
+ },
+ "VIRIDIAN_GYM": {
+ "name": "VIRIDIAN CITY",
+ "x": 2,
+ "y": 8
+ },
+ "VIRIDIAN_MART": {
+ "name": "VIRIDIAN CITY",
+ "x": 2,
+ "y": 8
+ },
+ "VIRIDIAN_NICKNAME_HOUSE": {
+ "name": "VIRIDIAN CITY",
+ "x": 2,
+ "y": 8
+ },
+ "VIRIDIAN_POKECENTER": {
+ "name": "VIRIDIAN CITY",
+ "x": 2,
+ "y": 8
+ },
+ "VIRIDIAN_SCHOOL_HOUSE": {
+ "name": "VIRIDIAN CITY",
+ "x": 2,
+ "y": 8
+ },
+ "WARDENS_HOUSE": {
+ "name": "FUCHSIA CITY",
+ "x": 8,
+ "y": 13
+ }
+ }
+ },
+ "trades": [
+ {
+ "dialogset": 1,
+ "get": "NIDORINA",
+ "give": "NIDORINO",
+ "nickname": "TERRY"
+ },
+ {
+ "dialogset": 1,
+ "get": "MR_MIME",
+ "give": "ABRA",
+ "nickname": "MARCEL"
+ },
+ {
+ "dialogset": 3,
+ "get": "BEEDRILL",
+ "give": "BUTTERFREE",
+ "nickname": "CHIKUCHIKU"
+ },
+ {
+ "dialogset": 1,
+ "get": "SEEL",
+ "give": "PONYTA",
+ "nickname": "SAILOR"
+ },
+ {
+ "dialogset": 3,
+ "get": "FARFETCHD",
+ "give": "SPEAROW",
+ "nickname": "DUX"
+ },
+ {
+ "dialogset": 1,
+ "get": "LICKITUNG",
+ "give": "SLOWBRO",
+ "nickname": "MARC"
+ },
+ {
+ "dialogset": 2,
+ "get": "JYNX",
+ "give": "POLIWHIRL",
+ "nickname": "LOLA"
+ },
+ {
+ "dialogset": 2,
+ "get": "ELECTRODE",
+ "give": "RAICHU",
+ "nickname": "DORIS"
+ },
+ {
+ "dialogset": 3,
+ "get": "TANGELA",
+ "give": "VENONAT",
+ "nickname": "CRINKLES"
+ },
+ {
+ "dialogset": 3,
+ "get": "NIDORAN_F",
+ "give": "NIDORAN_M",
+ "nickname": "SPOT"
+ }
+ ],
+ "warpCarpets": {
+ "edgeMaps": [
+ "SS_ANNE_3F"
+ ],
+ "function2Maps": [
+ "ROCKET_HIDEOUT_B1F",
+ "ROCKET_HIDEOUT_B2F",
+ "ROCKET_HIDEOUT_B4F",
+ "ROCK_TUNNEL_1F"
+ ],
+ "function2Tilesets": [
+ "OVERWORLD",
+ "SHIP",
+ "SHIP_PORT",
+ "PLATEAU"
+ ],
+ "ssAnneBow": {
+ "map": "SS_ANNE_BOW",
+ "tile": 21
+ },
+ "tiles": {
+ "down": [
+ 1,
+ 18,
+ 23,
+ 61,
+ 4,
+ 24,
+ 51
+ ],
+ "left": [
+ 26,
+ 75
+ ],
+ "right": [
+ 15,
+ 78
+ ],
+ "up": [
+ 1,
+ 92
+ ]
+ }
+ },
+ "waterTilesets": [
+ "OVERWORLD",
+ "FOREST",
+ "DOJO",
+ "GYM",
+ "SHIP",
+ "SHIP_PORT",
+ "CAVERN",
+ "FACILITY",
+ "PLATEAU"
+ ]
+ },
+ "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": 114,
+ "seq": ""
+ },
+ {
+ "code": 106,
+ "seq": ""
+ },
+ {
+ "code": 105,
+ "seq": ""
+ },
+ {
+ "code": 109,
+ "seq": ""
+ },
+ {
+ "code": 242,
+ "seq": ""
+ },
+ {
+ "code": 240,
+ "seq": ""
+ },
+ {
+ "code": 115,
+ "seq": ""
+ },
+ {
+ "code": 110,
+ "seq": ""
+ },
+ {
+ "code": 226,
+ "seq": ""
+ },
+ {
+ "code": 225,
+ "seq": ""
+ },
+ {
+ "code": 112,
+ "seq": ""
+ },
+ {
+ "code": 187,
+ "seq": "'d"
+ },
+ {
+ "code": 188,
+ "seq": "'l"
+ },
+ {
+ "code": 229,
+ "seq": "'m"
+ },
+ {
+ "code": 228,
+ "seq": "'r"
+ },
+ {
+ "code": 189,
+ "seq": "'s"
+ },
+ {
+ "code": 190,
+ "seq": "'t"
+ },
+ {
+ "code": 191,
+ "seq": "'v"
+ },
+ {
+ "code": 127,
+ "seq": " "
+ },
+ {
+ "code": 231,
+ "seq": "!"
+ },
+ {
+ "code": 115,
+ "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": 241,
+ "seq": "×"
+ },
+ {
+ "code": 186,
+ "seq": "é"
+ },
+ {
+ "code": 112,
+ "seq": "‘"
+ },
+ {
+ "code": 113,
+ "seq": "’"
+ },
+ {
+ "code": 114,
+ "seq": "“"
+ },
+ {
+ "code": 115,
+ "seq": "”"
+ },
+ {
+ "code": 117,
+ "seq": "…"
+ },
+ {
+ "code": 96,
+ "seq": "′"
+ },
+ {
+ "code": 97,
+ "seq": "″"
+ },
+ {
+ "code": 116,
+ "seq": "№"
+ },
+ {
+ "code": 117,
+ "seq": "⋯"
+ },
+ {
+ "code": 122,
+ "seq": "─"
+ },
+ {
+ "code": 124,
+ "seq": "│"
+ },
+ {
+ "code": 121,
+ "seq": "┌"
+ },
+ {
+ "code": 123,
+ "seq": "┐"
+ },
+ {
+ "code": 125,
+ "seq": "└"
+ },
+ {
+ "code": 126,
+ "seq": "┘"
+ },
+ {
+ "code": 237,
+ "seq": "▲"
+ },
+ {
+ "code": 237,
+ "seq": "▶"
+ },
+ {
+ "code": 236,
+ "seq": "▷"
+ },
+ {
+ "code": 238,
+ "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": 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": 2,
+ "growthRates": [
+ "MEDIUM_FAST",
+ "SLIGHTLY_FAST",
+ "SLIGHTLY_SLOW",
+ "MEDIUM_SLOW",
+ "FAST",
+ "SLOW"
+ ],
+ "hms": [
+ "CUT",
+ "FLY",
+ "SURF",
+ "STRENGTH",
+ "FLASH"
+ ],
+ "iconOrder": [
+ "MON",
+ "BALL",
+ "HELIX",
+ "FAIRY",
+ "BIRD",
+ "WATER",
+ "BUG",
+ "GRASS",
+ "SNAKE",
+ "QUADRUPED",
+ "PIKACHU"
+ ],
+ "items": [
+ "MASTER_BALL",
+ "ULTRA_BALL",
+ "GREAT_BALL",
+ "POKE_BALL",
+ "TOWN_MAP",
+ "BICYCLE",
+ "SURFBOARD",
+ "SAFARI_BALL",
+ "POKEDEX",
+ "MOON_STONE",
+ "ANTIDOTE",
+ "BURN_HEAL",
+ "ICE_HEAL",
+ "AWAKENING",
+ "PARLYZ_HEAL",
+ "FULL_RESTORE",
+ "MAX_POTION",
+ "HYPER_POTION",
+ "SUPER_POTION",
+ "POTION",
+ "BOULDERBADGE",
+ "CASCADEBADGE",
+ "THUNDERBADGE",
+ "RAINBOWBADGE",
+ "SOULBADGE",
+ "MARSHBADGE",
+ "VOLCANOBADGE",
+ "EARTHBADGE",
+ "ESCAPE_ROPE",
+ "REPEL",
+ "OLD_AMBER",
+ "FIRE_STONE",
+ "THUNDER_STONE",
+ "WATER_STONE",
+ "HP_UP",
+ "PROTEIN",
+ "IRON",
+ "CARBOS",
+ "CALCIUM",
+ "RARE_CANDY",
+ "DOME_FOSSIL",
+ "HELIX_FOSSIL",
+ "SECRET_KEY",
+ "ITEM_2C",
+ "BIKE_VOUCHER",
+ "X_ACCURACY",
+ "LEAF_STONE",
+ "CARD_KEY",
+ "NUGGET",
+ "ITEM_32",
+ "POKE_DOLL",
+ "FULL_HEAL",
+ "REVIVE",
+ "MAX_REVIVE",
+ "GUARD_SPEC",
+ "SUPER_REPEL",
+ "MAX_REPEL",
+ "DIRE_HIT",
+ "COIN",
+ "FRESH_WATER",
+ "SODA_POP",
+ "LEMONADE",
+ "S_S_TICKET",
+ "GOLD_TEETH",
+ "X_ATTACK",
+ "X_DEFEND",
+ "X_SPEED",
+ "X_SPECIAL",
+ "COIN_CASE",
+ "OAKS_PARCEL",
+ "ITEMFINDER",
+ "SILPH_SCOPE",
+ "POKE_FLUTE",
+ "LIFT_KEY",
+ "EXP_ALL",
+ "OLD_ROD",
+ "GOOD_ROD",
+ "SUPER_ROD",
+ "PP_UP",
+ "ETHER",
+ "MAX_ETHER",
+ "ELIXER",
+ "MAX_ELIXER",
+ "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_B4F"
+ ],
+ "maps": {
+ "AGATHAS_ROOM": {
+ "blockLength": 30,
+ "label": "AgathasRoom",
+ "objects": [
+ {
+ "name": "AGATHASROOM_AGATHA",
+ "text": "TEXT_AGATHASROOM_AGATHA",
+ "trainerClass": "OPP_AGATHA",
+ "trainerParty": 1
+ }
+ ],
+ "signTexts": []
+ },
+ "BIKE_SHOP": {
+ "blockLength": 16,
+ "label": "BikeShop",
+ "objects": [
+ {
+ "name": "BIKESHOP_CLERK",
+ "text": "TEXT_BIKESHOP_CLERK"
+ },
+ {
+ "name": "BIKESHOP_MIDDLE_AGED_WOMAN",
+ "text": "TEXT_BIKESHOP_MIDDLE_AGED_WOMAN"
+ },
+ {
+ "name": "BIKESHOP_YOUNGSTER",
+ "text": "TEXT_BIKESHOP_YOUNGSTER"
+ }
+ ],
+ "signTexts": []
+ },
+ "BILLS_HOUSE": {
+ "blockLength": 16,
+ "label": "BillsHouse",
+ "objects": [
+ {
+ "name": "BILLSHOUSE_BILL_POKEMON",
+ "text": "TEXT_BILLSHOUSE_BILL_POKEMON"
+ },
+ {
+ "hidden": true,
+ "name": "BILLSHOUSE_BILL1",
+ "text": "TEXT_BILLSHOUSE_BILL_SS_TICKET"
+ },
+ {
+ "hidden": true,
+ "name": "BILLSHOUSE_BILL2",
+ "text": "TEXT_BILLSHOUSE_BILL_CHECK_OUT_MY_RARE_POKEMON"
+ }
+ ],
+ "signTexts": []
+ },
+ "BLUES_HOUSE": {
+ "blockLength": 16,
+ "label": "BluesHouse",
+ "objects": [
+ {
+ "item": "0",
+ "name": "BLUESHOUSE_DAISY1",
+ "text": "TEXT_BLUESHOUSE_DAISY_SITTING"
+ },
+ {
+ "hidden": true,
+ "item": "0",
+ "name": "BLUESHOUSE_DAISY2",
+ "text": "TEXT_BLUESHOUSE_DAISY_WALKING"
+ },
+ {
+ "item": "0",
+ "name": "BLUESHOUSE_TOWN_MAP",
+ "text": "TEXT_BLUESHOUSE_TOWN_MAP"
+ }
+ ],
+ "signTexts": []
+ },
+ "BRUNOS_ROOM": {
+ "blockLength": 30,
+ "label": "BrunosRoom",
+ "objects": [
+ {
+ "name": "BRUNOSROOM_BRUNO",
+ "text": "TEXT_BRUNOSROOM_BRUNO",
+ "trainerClass": "OPP_BRUNO",
+ "trainerParty": 1
+ }
+ ],
+ "signTexts": []
+ },
+ "CELADON_CHIEF_HOUSE": {
+ "blockLength": 16,
+ "label": "CeladonChiefHouse",
+ "objects": [
+ {
+ "name": "CELADONCHIEFHOUSE_CHIEF",
+ "text": "TEXT_CELADONCHIEFHOUSE_CHIEF"
+ },
+ {
+ "name": "CELADONCHIEFHOUSE_ROCKET",
+ "text": "TEXT_CELADONCHIEFHOUSE_ROCKET"
+ },
+ {
+ "name": "CELADONCHIEFHOUSE_SAILOR",
+ "text": "TEXT_CELADONCHIEFHOUSE_SAILOR"
+ }
+ ],
+ "signTexts": []
+ },
+ "CELADON_CITY": {
+ "blockLength": 450,
+ "label": "CeladonCity",
+ "objects": [
+ {
+ "name": "CELADONCITY_LITTLE_GIRL",
+ "text": "TEXT_CELADONCITY_LITTLE_GIRL"
+ },
+ {
+ "name": "CELADONCITY_GRAMPS1",
+ "text": "TEXT_CELADONCITY_GRAMPS1"
+ },
+ {
+ "name": "CELADONCITY_GIRL",
+ "text": "TEXT_CELADONCITY_GIRL"
+ },
+ {
+ "name": "CELADONCITY_GRAMPS2",
+ "text": "TEXT_CELADONCITY_GRAMPS2"
+ },
+ {
+ "name": "CELADONCITY_GRAMPS3",
+ "text": "TEXT_CELADONCITY_GRAMPS3"
+ },
+ {
+ "name": "CELADONCITY_FISHER",
+ "text": "TEXT_CELADONCITY_FISHER"
+ },
+ {
+ "name": "CELADONCITY_POLIWRATH",
+ "text": "TEXT_CELADONCITY_POLIWRATH"
+ },
+ {
+ "name": "CELADONCITY_ROCKET1",
+ "text": "TEXT_CELADONCITY_ROCKET1"
+ },
+ {
+ "name": "CELADONCITY_ROCKET2",
+ "text": "TEXT_CELADONCITY_ROCKET2"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CELADONCITY_TRAINER_TIPS1",
+ "TEXT_CELADONCITY_SIGN",
+ "TEXT_CELADONCITY_POKECENTER_SIGN",
+ "TEXT_CELADONCITY_GYM_SIGN",
+ "TEXT_CELADONCITY_MANSION_SIGN",
+ "TEXT_CELADONCITY_DEPTSTORE_SIGN",
+ "TEXT_CELADONCITY_TRAINER_TIPS2",
+ "TEXT_CELADONCITY_PRIZEEXCHANGE_SIGN",
+ "TEXT_CELADONCITY_GAMECORNER_SIGN"
+ ]
+ },
+ "CELADON_DINER": {
+ "blockLength": 20,
+ "label": "CeladonDiner",
+ "objects": [
+ {
+ "name": "CELADONDINER_COOK",
+ "text": "TEXT_CELADONDINER_COOK"
+ },
+ {
+ "name": "CELADONDINER_MIDDLE_AGED_WOMAN",
+ "text": "TEXT_CELADONDINER_MIDDLE_AGED_WOMAN"
+ },
+ {
+ "name": "CELADONDINER_MIDDLE_AGED_MAN",
+ "text": "TEXT_CELADONDINER_MIDDLE_AGED_MAN"
+ },
+ {
+ "name": "CELADONDINER_FISHER",
+ "text": "TEXT_CELADONDINER_FISHER"
+ },
+ {
+ "name": "CELADONDINER_GYM_GUIDE",
+ "text": "TEXT_CELADONDINER_GYM_GUIDE"
+ }
+ ],
+ "signTexts": []
+ },
+ "CELADON_GYM": {
+ "blockLength": 45,
+ "label": "CeladonGym",
+ "objects": [
+ {
+ "name": "CELADONGYM_ERIKA",
+ "text": "TEXT_CELADONGYM_ERIKA",
+ "trainerClass": "OPP_ERIKA",
+ "trainerParty": 1
+ },
+ {
+ "name": "CELADONGYM_COOLTRAINER_F1",
+ "text": "TEXT_CELADONGYM_COOLTRAINER_F1",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 17
+ },
+ {
+ "name": "CELADONGYM_BEAUTY1",
+ "text": "TEXT_CELADONGYM_BEAUTY1",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 1
+ },
+ {
+ "name": "CELADONGYM_COOLTRAINER_F2",
+ "text": "TEXT_CELADONGYM_COOLTRAINER_F2",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 11
+ },
+ {
+ "name": "CELADONGYM_BEAUTY2",
+ "text": "TEXT_CELADONGYM_BEAUTY2",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 2
+ },
+ {
+ "name": "CELADONGYM_COOLTRAINER_F3",
+ "text": "TEXT_CELADONGYM_COOLTRAINER_F3",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 18
+ },
+ {
+ "name": "CELADONGYM_BEAUTY3",
+ "text": "TEXT_CELADONGYM_BEAUTY3",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 3
+ },
+ {
+ "name": "CELADONGYM_COOLTRAINER_F4",
+ "text": "TEXT_CELADONGYM_COOLTRAINER_F4",
+ "trainerClass": "OPP_COOLTRAINER_F",
+ "trainerParty": 1
+ }
+ ],
+ "signTexts": []
+ },
+ "CELADON_HOTEL": {
+ "blockLength": 28,
+ "label": "CeladonHotel",
+ "objects": [
+ {
+ "name": "CELADONHOTEL_GRANNY",
+ "text": "TEXT_CELADONHOTEL_GRANNY"
+ },
+ {
+ "name": "CELADONHOTEL_BEAUTY",
+ "text": "TEXT_CELADONHOTEL_BEAUTY"
+ },
+ {
+ "name": "CELADONHOTEL_SUPER_NERD",
+ "text": "TEXT_CELADONHOTEL_SUPER_NERD"
+ }
+ ],
+ "signTexts": []
+ },
+ "CELADON_MANSION_1F": {
+ "blockLength": 24,
+ "label": "CeladonMansion1F",
+ "objects": [
+ {
+ "name": "CELADONMANSION1F_MEOWTH",
+ "text": "TEXT_CELADONMANSION1F_MEOWTH"
+ },
+ {
+ "name": "CELADONMANSION1F_GRANNY",
+ "text": "TEXT_CELADONMANSION1F_GRANNY"
+ },
+ {
+ "name": "CELADONMANSION1F_CLEFAIRY",
+ "text": "TEXT_CELADONMANSION1F_CLEFAIRY"
+ },
+ {
+ "name": "CELADONMANSION1F_NIDORANF",
+ "text": "TEXT_CELADONMANSION1F_NIDORANF"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CELADONMANSION1F_MANAGERS_SUITE_SIGN"
+ ]
+ },
+ "CELADON_MANSION_2F": {
+ "blockLength": 24,
+ "label": "CeladonMansion2F",
+ "objects": [],
+ "signTexts": [
+ "TEXT_CELADONMANSION2F_MEETING_ROOM_SIGN"
+ ]
+ },
+ "CELADON_MANSION_3F": {
+ "blockLength": 24,
+ "label": "CeladonMansion3F",
+ "objects": [
+ {
+ "name": "CELADONMANSION3F_PROGRAMMER",
+ "text": "TEXT_CELADONMANSION3F_PROGRAMMER"
+ },
+ {
+ "name": "CELADONMANSION3F_GRAPHIC_ARTIST",
+ "text": "TEXT_CELADONMANSION3F_GRAPHIC_ARTIST"
+ },
+ {
+ "name": "CELADONMANSION3F_WRITER",
+ "text": "TEXT_CELADONMANSION3F_WRITER"
+ },
+ {
+ "name": "CELADONMANSION3F_GAME_DESIGNER",
+ "text": "TEXT_CELADONMANSION3F_GAME_DESIGNER"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CELADONMANSION3F_GAME_PROGRAM_PC",
+ "TEXT_CELADONMANSION3F_PLAYING_GAME_PC",
+ "TEXT_CELADONMANSION3F_GAME_SCRIPT_PC",
+ "TEXT_CELADONMANSION3F_DEV_ROOM_SIGN"
+ ]
+ },
+ "CELADON_MANSION_ROOF": {
+ "blockLength": 24,
+ "label": "CeladonMansionRoof",
+ "objects": [],
+ "signTexts": [
+ "TEXT_CELADONMANSIONROOF_HOUSE_SIGN"
+ ]
+ },
+ "CELADON_MANSION_ROOF_HOUSE": {
+ "blockLength": 16,
+ "label": "CeladonMansionRoofHouse",
+ "objects": [
+ {
+ "name": "CELADONMANSION_ROOF_HOUSE_HIKER",
+ "text": "TEXT_CELADONMANSION_ROOF_HOUSE_HIKER"
+ },
+ {
+ "name": "CELADONMANSION_ROOF_HOUSE_EEVEE_POKEBALL",
+ "text": "TEXT_CELADONMANSION_ROOF_HOUSE_EEVEE_POKEBALL"
+ }
+ ],
+ "signTexts": []
+ },
+ "CELADON_MART_1F": {
+ "blockLength": 40,
+ "label": "CeladonMart1F",
+ "objects": [
+ {
+ "name": "CELADONMART1F_RECEPTIONIST",
+ "text": "TEXT_CELADONMART1F_RECEPTIONIST"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CELADONMART1F_DIRECTORY_SIGN",
+ "TEXT_CELADONMART1F_CURRENT_FLOOR_SIGN"
+ ]
+ },
+ "CELADON_MART_2F": {
+ "blockLength": 40,
+ "label": "CeladonMart2F",
+ "objects": [
+ {
+ "name": "CELADONMART2F_CLERK1",
+ "text": "TEXT_CELADONMART2F_CLERK1"
+ },
+ {
+ "name": "CELADONMART2F_CLERK2",
+ "text": "TEXT_CELADONMART2F_CLERK2"
+ },
+ {
+ "name": "CELADONMART2F_MIDDLE_AGED_MAN",
+ "text": "TEXT_CELADONMART2F_MIDDLE_AGED_MAN"
+ },
+ {
+ "name": "CELADONMART2F_GIRL",
+ "text": "TEXT_CELADONMART2F_GIRL"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CELADONMART2F_CURRENT_FLOOR_SIGN"
+ ]
+ },
+ "CELADON_MART_3F": {
+ "blockLength": 40,
+ "label": "CeladonMart3F",
+ "objects": [
+ {
+ "name": "CELADONMART3F_CLERK",
+ "text": "TEXT_CELADONMART3F_CLERK"
+ },
+ {
+ "name": "CELADONMART3F_GAMEBOY_KID1",
+ "text": "TEXT_CELADONMART3F_GAMEBOY_KID1"
+ },
+ {
+ "name": "CELADONMART3F_GAMEBOY_KID2",
+ "text": "TEXT_CELADONMART3F_GAMEBOY_KID2"
+ },
+ {
+ "name": "CELADONMART3F_GAMEBOY_KID3",
+ "text": "TEXT_CELADONMART3F_GAMEBOY_KID3"
+ },
+ {
+ "name": "CELADONMART3F_LITTLE_BOY",
+ "text": "TEXT_CELADONMART3F_LITTLE_BOY"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CELADONMART3F_SNES1",
+ "TEXT_CELADONMART3F_RPG",
+ "TEXT_CELADONMART3F_SNES2",
+ "TEXT_CELADONMART3F_SPORTS_GAME",
+ "TEXT_CELADONMART3F_SNES3",
+ "TEXT_CELADONMART3F_PUZZLE_GAME",
+ "TEXT_CELADONMART3F_SNES4",
+ "TEXT_CELADONMART3F_FIGHTING_GAME",
+ "TEXT_CELADONMART3F_CURRENT_FLOOR_SIGN",
+ "TEXT_CELADONMART3F_POKEMON_POSTER1",
+ "TEXT_CELADONMART3F_POKEMON_POSTER2",
+ "TEXT_CELADONMART3F_POKEMON_POSTER3"
+ ]
+ },
+ "CELADON_MART_4F": {
+ "blockLength": 40,
+ "label": "CeladonMart4F",
+ "objects": [
+ {
+ "name": "CELADONMART4F_CLERK",
+ "text": "TEXT_CELADONMART4F_CLERK"
+ },
+ {
+ "name": "CELADONMART4F_SUPER_NERD",
+ "text": "TEXT_CELADONMART4F_SUPER_NERD"
+ },
+ {
+ "name": "CELADONMART4F_YOUNGSTER",
+ "text": "TEXT_CELADONMART4F_YOUNGSTER"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CELADONMART4F_CURRENT_FLOOR_SIGN"
+ ]
+ },
+ "CELADON_MART_5F": {
+ "blockLength": 40,
+ "label": "CeladonMart5F",
+ "objects": [
+ {
+ "name": "CELADONMART5F_GENTLEMAN",
+ "text": "TEXT_CELADONMART5F_GENTLEMAN"
+ },
+ {
+ "name": "CELADONMART5F_SAILOR",
+ "text": "TEXT_CELADONMART5F_SAILOR"
+ },
+ {
+ "name": "CELADONMART5F_CLERK1",
+ "text": "TEXT_CELADONMART5F_CLERK1"
+ },
+ {
+ "name": "CELADONMART5F_CLERK2",
+ "text": "TEXT_CELADONMART5F_CLERK2"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CELADONMART5F_CURRENT_FLOOR_SIGN"
+ ]
+ },
+ "CELADON_MART_ELEVATOR": {
+ "blockLength": 4,
+ "label": "CeladonMartElevator",
+ "objects": [],
+ "signTexts": [
+ "TEXT_CELADONMARTELEVATOR"
+ ]
+ },
+ "CELADON_MART_ROOF": {
+ "blockLength": 40,
+ "label": "CeladonMartRoof",
+ "objects": [
+ {
+ "name": "CELADONMARTROOF_SUPER_NERD",
+ "text": "TEXT_CELADONMARTROOF_SUPER_NERD"
+ },
+ {
+ "name": "CELADONMARTROOF_LITTLE_GIRL",
+ "text": "TEXT_CELADONMARTROOF_LITTLE_GIRL"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CELADONMARTROOF_VENDING_MACHINE1",
+ "TEXT_CELADONMARTROOF_VENDING_MACHINE2",
+ "TEXT_CELADONMARTROOF_VENDING_MACHINE3",
+ "TEXT_CELADONMARTROOF_CURRENT_FLOOR_SIGN"
+ ]
+ },
+ "CELADON_POKECENTER": {
+ "blockLength": 28,
+ "label": "CeladonPokecenter",
+ "objects": [
+ {
+ "name": "CELADONPOKECENTER_NURSE",
+ "text": "TEXT_CELADONPOKECENTER_NURSE"
+ },
+ {
+ "name": "CELADONPOKECENTER_GENTLEMAN",
+ "text": "TEXT_CELADONPOKECENTER_GENTLEMAN"
+ },
+ {
+ "name": "CELADONPOKECENTER_BEAUTY",
+ "text": "TEXT_CELADONPOKECENTER_BEAUTY"
+ },
+ {
+ "name": "CELADONPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_CELADONPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "CELADONPOKECENTER_CHANSEY",
+ "text": "TEXT_CELADONPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "CERULEAN_BADGE_HOUSE": {
+ "blockLength": 16,
+ "label": "CeruleanBadgeHouse",
+ "objects": [
+ {
+ "name": "CERULEANBADGEHOUSE_MIDDLE_AGED_MAN",
+ "text": "TEXT_CERULEANBADGEHOUSE_MIDDLE_AGED_MAN"
+ }
+ ],
+ "signTexts": []
+ },
+ "CERULEAN_CAVE_1F": {
+ "blockLength": 135,
+ "label": "CeruleanCave1F",
+ "objects": [
+ {
+ "item": "RARE_CANDY",
+ "name": "CERULEANCAVE1F_RARE_CANDY",
+ "text": "TEXT_CERULEANCAVE1F_RARE_CANDY"
+ },
+ {
+ "item": "MAX_ELIXER",
+ "name": "CERULEANCAVE1F_MAX_ELIXER",
+ "text": "TEXT_CERULEANCAVE1F_MAX_ELIXER"
+ },
+ {
+ "item": "MAX_REVIVE",
+ "name": "CERULEANCAVE1F_MAX_REVIVE",
+ "text": "TEXT_CERULEANCAVE1F_MAX_REVIVE"
+ },
+ {
+ "item": "ULTRA_BALL",
+ "name": "CERULEANCAVE1F_ULTRA_BALL",
+ "text": "TEXT_CERULEANCAVE1F_ULTRA_BALL"
+ }
+ ],
+ "signTexts": []
+ },
+ "CERULEAN_CAVE_2F": {
+ "blockLength": 135,
+ "label": "CeruleanCave2F",
+ "objects": [
+ {
+ "item": "RARE_CANDY",
+ "name": "CERULEANCAVE2F_RARE_CANDY",
+ "text": "TEXT_CERULEANCAVE2F_RARE_CANDY"
+ },
+ {
+ "item": "ULTRA_BALL",
+ "name": "CERULEANCAVE2F_ULTRA_BALL",
+ "text": "TEXT_CERULEANCAVE2F_ULTRA_BALL"
+ },
+ {
+ "item": "MAX_REVIVE",
+ "name": "CERULEANCAVE2F_MAX_REVIVE",
+ "text": "TEXT_CERULEANCAVE2F_MAX_REVIVE"
+ },
+ {
+ "item": "FULL_RESTORE",
+ "name": "CERULEANCAVE2F_FULL_RESTORE",
+ "text": "TEXT_CERULEANCAVE2F_FULL_RESTORE"
+ }
+ ],
+ "signTexts": []
+ },
+ "CERULEAN_CAVE_B1F": {
+ "blockLength": 135,
+ "label": "CeruleanCaveB1F",
+ "objects": [
+ {
+ "name": "CERULEANCAVEB1F_MEWTWO",
+ "pokemon": "MEWTWO",
+ "text": "TEXT_CERULEANCAVEB1F_MEWTWO"
+ },
+ {
+ "item": "ULTRA_BALL",
+ "name": "CERULEANCAVEB1F_ULTRA_BALL1",
+ "text": "TEXT_CERULEANCAVEB1F_ULTRA_BALL1"
+ },
+ {
+ "item": "ULTRA_BALL",
+ "name": "CERULEANCAVEB1F_ULTRA_BALL2",
+ "text": "TEXT_CERULEANCAVEB1F_ULTRA_BALL2"
+ },
+ {
+ "item": "MAX_REVIVE",
+ "name": "CERULEANCAVEB1F_MAX_REVIVE",
+ "text": "TEXT_CERULEANCAVEB1F_MAX_REVIVE"
+ },
+ {
+ "item": "MAX_ELIXER",
+ "name": "CERULEANCAVEB1F_MAX_ELIXER",
+ "text": "TEXT_CERULEANCAVEB1F_MAX_ELIXER"
+ }
+ ],
+ "signTexts": []
+ },
+ "CERULEAN_CITY": {
+ "blockLength": 360,
+ "label": "CeruleanCity",
+ "objects": [
+ {
+ "hidden": true,
+ "name": "CERULEANCITY_RIVAL",
+ "text": "TEXT_CERULEANCITY_RIVAL"
+ },
+ {
+ "name": "CERULEANCITY_ROCKET",
+ "text": "TEXT_CERULEANCITY_ROCKET",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 5
+ },
+ {
+ "name": "CERULEANCITY_COOLTRAINER_M",
+ "text": "TEXT_CERULEANCITY_COOLTRAINER_M"
+ },
+ {
+ "name": "CERULEANCITY_SUPER_NERD1",
+ "text": "TEXT_CERULEANCITY_SUPER_NERD1"
+ },
+ {
+ "name": "CERULEANCITY_SUPER_NERD2",
+ "text": "TEXT_CERULEANCITY_SUPER_NERD2"
+ },
+ {
+ "hidden": true,
+ "name": "CERULEANCITY_GUARD1",
+ "text": "TEXT_CERULEANCITY_GUARD1"
+ },
+ {
+ "name": "CERULEANCITY_COOLTRAINER_F1",
+ "text": "TEXT_CERULEANCITY_COOLTRAINER_F1"
+ },
+ {
+ "name": "CERULEANCITY_ELECTRODE",
+ "text": "TEXT_CERULEANCITY_ELECTRODE"
+ },
+ {
+ "name": "CERULEANCITY_COOLTRAINER_F2",
+ "text": "TEXT_CERULEANCITY_COOLTRAINER_F2"
+ },
+ {
+ "name": "CERULEANCITY_SUPER_NERD3",
+ "text": "TEXT_CERULEANCITY_SUPER_NERD3"
+ },
+ {
+ "name": "CERULEANCITY_GUARD2",
+ "text": "TEXT_CERULEANCITY_GUARD2"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CERULEANCITY_SIGN",
+ "TEXT_CERULEANCITY_TRAINER_TIPS",
+ "TEXT_CERULEANCITY_MART_SIGN",
+ "TEXT_CERULEANCITY_POKECENTER_SIGN",
+ "TEXT_CERULEANCITY_BIKESHOP_SIGN",
+ "TEXT_CERULEANCITY_GYM_SIGN"
+ ]
+ },
+ "CERULEAN_GYM": {
+ "blockLength": 35,
+ "label": "CeruleanGym",
+ "objects": [
+ {
+ "name": "CERULEANGYM_MISTY",
+ "text": "TEXT_CERULEANGYM_MISTY",
+ "trainerClass": "OPP_MISTY",
+ "trainerParty": 1
+ },
+ {
+ "name": "CERULEANGYM_COOLTRAINER_F",
+ "text": "TEXT_CERULEANGYM_COOLTRAINER_F",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 1
+ },
+ {
+ "name": "CERULEANGYM_SWIMMER",
+ "text": "TEXT_CERULEANGYM_SWIMMER",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 1
+ },
+ {
+ "name": "CERULEANGYM_GYM_GUIDE",
+ "text": "TEXT_CERULEANGYM_GYM_GUIDE"
+ }
+ ],
+ "signTexts": []
+ },
+ "CERULEAN_MART": {
+ "blockLength": 16,
+ "label": "CeruleanMart",
+ "objects": [
+ {
+ "name": "CERULEANMART_CLERK",
+ "text": "TEXT_CERULEANMART_CLERK"
+ },
+ {
+ "name": "CERULEANMART_COOLTRAINER_M",
+ "text": "TEXT_CERULEANMART_COOLTRAINER_M"
+ },
+ {
+ "name": "CERULEANMART_COOLTRAINER_F",
+ "text": "TEXT_CERULEANMART_COOLTRAINER_F"
+ }
+ ],
+ "signTexts": []
+ },
+ "CERULEAN_MELANIES_HOUSE": {
+ "blockLength": 16,
+ "label": "CeruleanMelaniesHouse",
+ "objects": [
+ {
+ "name": "CERULEANMELANIESHOUSE_MELANIE",
+ "text": "TEXT_CERULEANMELANIESHOUSE_MELANIE"
+ },
+ {
+ "name": "CERULEANMELANIESHOUSE_BULBASAUR",
+ "text": "TEXT_CERULEANMELANIESHOUSE_BULBASAUR"
+ },
+ {
+ "name": "CERULEANMELANIESHOUSE_ODDISH",
+ "text": "TEXT_CERULEANMELANIESHOUSE_ODDISH"
+ },
+ {
+ "name": "CERULEANMELANIESHOUSE_SANDSHREW",
+ "text": "TEXT_CERULEANMELANIESHOUSE_SANDSHREW"
+ }
+ ],
+ "signTexts": []
+ },
+ "CERULEAN_POKECENTER": {
+ "blockLength": 28,
+ "label": "CeruleanPokecenter",
+ "objects": [
+ {
+ "name": "CERULEANPOKECENTER_NURSE",
+ "text": "TEXT_CERULEANPOKECENTER_NURSE"
+ },
+ {
+ "name": "CERULEANPOKECENTER_SUPER_NERD",
+ "text": "TEXT_CERULEANPOKECENTER_SUPER_NERD"
+ },
+ {
+ "name": "CERULEANPOKECENTER_GENTLEMAN",
+ "text": "TEXT_CERULEANPOKECENTER_GENTLEMAN"
+ },
+ {
+ "name": "CERULEANPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_CERULEANPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "CERULEANPOKECENTER_CHANSEY",
+ "text": "TEXT_CERULEANPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "CERULEAN_TRASHED_HOUSE": {
+ "blockLength": 16,
+ "label": "CeruleanTrashedHouse",
+ "objects": [
+ {
+ "name": "CERULEANTRASHEDHOUSE_FISHING_GURU",
+ "text": "TEXT_CERULEANTRASHEDHOUSE_FISHING_GURU"
+ },
+ {
+ "name": "CERULEANTRASHEDHOUSE_GIRL",
+ "text": "TEXT_CERULEANTRASHEDHOUSE_GIRL"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CERULEANTRASHEDHOUSE_WALL_HOLE"
+ ]
+ },
+ "CHAMPIONS_ROOM": {
+ "blockLength": 16,
+ "label": "ChampionsRoom",
+ "objects": [
+ {
+ "name": "CHAMPIONSROOM_RIVAL",
+ "text": "TEXT_CHAMPIONSROOM_RIVAL"
+ },
+ {
+ "hidden": true,
+ "name": "CHAMPIONSROOM_OAK",
+ "text": "TEXT_CHAMPIONSROOM_OAK"
+ }
+ ],
+ "signTexts": []
+ },
+ "CINNABAR_GYM": {
+ "blockLength": 90,
+ "label": "CinnabarGym",
+ "objects": [
+ {
+ "name": "CINNABARGYM_BLAINE",
+ "text": "TEXT_CINNABARGYM_BLAINE",
+ "trainerClass": "OPP_BLAINE",
+ "trainerParty": 1
+ },
+ {
+ "name": "CINNABARGYM_SUPER_NERD1",
+ "text": "TEXT_CINNABARGYM_SUPER_NERD1",
+ "trainerClass": "OPP_SUPER_NERD",
+ "trainerParty": 9
+ },
+ {
+ "name": "CINNABARGYM_SUPER_NERD2",
+ "text": "TEXT_CINNABARGYM_SUPER_NERD2",
+ "trainerClass": "OPP_BURGLAR",
+ "trainerParty": 4
+ },
+ {
+ "name": "CINNABARGYM_SUPER_NERD3",
+ "text": "TEXT_CINNABARGYM_SUPER_NERD3",
+ "trainerClass": "OPP_SUPER_NERD",
+ "trainerParty": 10
+ },
+ {
+ "name": "CINNABARGYM_SUPER_NERD4",
+ "text": "TEXT_CINNABARGYM_SUPER_NERD4",
+ "trainerClass": "OPP_BURGLAR",
+ "trainerParty": 5
+ },
+ {
+ "name": "CINNABARGYM_SUPER_NERD5",
+ "text": "TEXT_CINNABARGYM_SUPER_NERD5",
+ "trainerClass": "OPP_SUPER_NERD",
+ "trainerParty": 11
+ },
+ {
+ "name": "CINNABARGYM_SUPER_NERD6",
+ "text": "TEXT_CINNABARGYM_SUPER_NERD6",
+ "trainerClass": "OPP_BURGLAR",
+ "trainerParty": 6
+ },
+ {
+ "name": "CINNABARGYM_SUPER_NERD7",
+ "text": "TEXT_CINNABARGYM_SUPER_NERD7",
+ "trainerClass": "OPP_SUPER_NERD",
+ "trainerParty": 12
+ },
+ {
+ "name": "CINNABARGYM_GYM_GUIDE",
+ "text": "TEXT_CINNABARGYM_GYM_GUIDE"
+ }
+ ],
+ "signTexts": []
+ },
+ "CINNABAR_ISLAND": {
+ "blockLength": 90,
+ "label": "CinnabarIsland",
+ "objects": [
+ {
+ "name": "CINNABARISLAND_GIRL",
+ "text": "TEXT_CINNABARISLAND_GIRL"
+ },
+ {
+ "name": "CINNABARISLAND_GAMBLER",
+ "text": "TEXT_CINNABARISLAND_GAMBLER"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CINNABARISLAND_SIGN",
+ "TEXT_CINNABARISLAND_MART_SIGN",
+ "TEXT_CINNABARISLAND_POKECENTER_SIGN",
+ "TEXT_CINNABARISLAND_POKEMONLAB_SIGN",
+ "TEXT_CINNABARISLAND_GYM_SIGN"
+ ]
+ },
+ "CINNABAR_LAB": {
+ "blockLength": 36,
+ "label": "CinnabarLab",
+ "objects": [
+ {
+ "name": "CINNABARLAB_FISHING_GURU",
+ "text": "TEXT_CINNABARLAB_FISHING_GURU"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CINNABARLAB_PHOTO",
+ "TEXT_CINNABARLAB_MEETING_ROOM_SIGN",
+ "TEXT_CINNABARLAB_R_AND_D_SIGN",
+ "TEXT_CINNABARLAB_TESTING_ROOM_SIGN"
+ ]
+ },
+ "CINNABAR_LAB_FOSSIL_ROOM": {
+ "blockLength": 16,
+ "label": "CinnabarLabFossilRoom",
+ "objects": [
+ {
+ "name": "CINNABARLABFOSSILROOM_SCIENTIST1",
+ "text": "TEXT_CINNABARLABFOSSILROOM_SCIENTIST1"
+ },
+ {
+ "name": "CINNABARLABFOSSILROOM_SCIENTIST2",
+ "text": "TEXT_CINNABARLABFOSSILROOM_SCIENTIST2"
+ }
+ ],
+ "signTexts": []
+ },
+ "CINNABAR_LAB_METRONOME_ROOM": {
+ "blockLength": 16,
+ "label": "CinnabarLabMetronomeRoom",
+ "objects": [
+ {
+ "name": "CINNABARLABMETRONOMEROOM_SCIENTIST1",
+ "text": "TEXT_CINNABARLABMETRONOMEROOM_SCIENTIST1"
+ },
+ {
+ "name": "CINNABARLABMETRONOMEROOM_SCIENTIST2",
+ "text": "TEXT_CINNABARLABMETRONOMEROOM_SCIENTIST2"
+ }
+ ],
+ "signTexts": [
+ "TEXT_CINNABARLABMETRONOMEROOM_PC_KEYBOARD",
+ "TEXT_CINNABARLABMETRONOMEROOM_PC_MONITOR",
+ "TEXT_CINNABARLABMETRONOMEROOM_AMBER_PIPE"
+ ]
+ },
+ "CINNABAR_LAB_TRADE_ROOM": {
+ "blockLength": 16,
+ "label": "CinnabarLabTradeRoom",
+ "objects": [
+ {
+ "name": "CINNABARLABTRADEROOM_SUPER_NERD",
+ "text": "TEXT_CINNABARLABTRADEROOM_SUPER_NERD"
+ },
+ {
+ "name": "CINNABARLABTRADEROOM_GRAMPS",
+ "text": "TEXT_CINNABARLABTRADEROOM_GRAMPS"
+ },
+ {
+ "name": "CINNABARLABTRADEROOM_BEAUTY",
+ "text": "TEXT_CINNABARLABTRADEROOM_BEAUTY"
+ }
+ ],
+ "signTexts": []
+ },
+ "CINNABAR_MART": {
+ "blockLength": 16,
+ "label": "CinnabarMart",
+ "objects": [
+ {
+ "name": "CINNABARMART_CLERK",
+ "text": "TEXT_CINNABARMART_CLERK"
+ },
+ {
+ "name": "CINNABARMART_SILPH_WORKER_F",
+ "text": "TEXT_CINNABARMART_SILPH_WORKER_F"
+ },
+ {
+ "name": "CINNABARMART_SCIENTIST",
+ "text": "TEXT_CINNABARMART_SCIENTIST"
+ }
+ ],
+ "signTexts": []
+ },
+ "CINNABAR_POKECENTER": {
+ "blockLength": 28,
+ "label": "CinnabarPokecenter",
+ "objects": [
+ {
+ "name": "CINNABARPOKECENTER_NURSE",
+ "text": "TEXT_CINNABARPOKECENTER_NURSE"
+ },
+ {
+ "name": "CINNABARPOKECENTER_COOLTRAINER_F",
+ "text": "TEXT_CINNABARPOKECENTER_COOLTRAINER_F"
+ },
+ {
+ "name": "CINNABARPOKECENTER_GENTLEMAN",
+ "text": "TEXT_CINNABARPOKECENTER_GENTLEMAN"
+ },
+ {
+ "name": "CINNABARPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_CINNABARPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "CINNABARPOKECENTER_CHANSEY",
+ "text": "TEXT_CINNABARPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "COLOSSEUM": {
+ "blockLength": 20,
+ "label": "Colosseum",
+ "objects": [
+ {
+ "name": "COLOSSEUM_OPPONENT",
+ "text": "TEXT_COLOSSEUM_OPPONENT"
+ }
+ ],
+ "signTexts": []
+ },
+ "COPYCATS_HOUSE_1F": {
+ "blockLength": 16,
+ "label": "CopycatsHouse1F",
+ "objects": [
+ {
+ "name": "COPYCATSHOUSE1F_MIDDLE_AGED_WOMAN",
+ "text": "TEXT_COPYCATSHOUSE1F_MIDDLE_AGED_WOMAN"
+ },
+ {
+ "name": "COPYCATSHOUSE1F_MIDDLE_AGED_MAN",
+ "text": "TEXT_COPYCATSHOUSE1F_MIDDLE_AGED_MAN"
+ },
+ {
+ "name": "COPYCATSHOUSE1F_CHANSEY",
+ "text": "TEXT_COPYCATSHOUSE1F_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "COPYCATS_HOUSE_2F": {
+ "blockLength": 16,
+ "label": "CopycatsHouse2F",
+ "objects": [
+ {
+ "name": "COPYCATSHOUSE2F_COPYCAT",
+ "text": "TEXT_COPYCATSHOUSE2F_COPYCAT"
+ },
+ {
+ "name": "COPYCATSHOUSE2F_DODUO",
+ "text": "TEXT_COPYCATSHOUSE2F_DODUO"
+ },
+ {
+ "name": "COPYCATSHOUSE2F_MONSTER",
+ "text": "TEXT_COPYCATSHOUSE2F_MONSTER"
+ },
+ {
+ "name": "COPYCATSHOUSE2F_BIRD",
+ "text": "TEXT_COPYCATSHOUSE2F_BIRD"
+ },
+ {
+ "name": "COPYCATSHOUSE2F_FAIRY",
+ "text": "TEXT_COPYCATSHOUSE2F_FAIRY"
+ }
+ ],
+ "signTexts": [
+ "TEXT_COPYCATSHOUSE2F_SNES",
+ "TEXT_COPYCATSHOUSE2F_PC"
+ ]
+ },
+ "DAYCARE": {
+ "blockLength": 16,
+ "label": "Daycare",
+ "objects": [
+ {
+ "name": "DAYCARE_GENTLEMAN",
+ "text": "TEXT_DAYCARE_GENTLEMAN"
+ }
+ ],
+ "signTexts": []
+ },
+ "DIGLETTS_CAVE": {
+ "blockLength": 360,
+ "label": "DiglettsCave",
+ "objects": [],
+ "signTexts": []
+ },
+ "DIGLETTS_CAVE_ROUTE_11": {
+ "blockLength": 16,
+ "label": "DiglettsCaveRoute11",
+ "objects": [
+ {
+ "name": "DIGLETTSCAVEROUTE11_GAMBLER",
+ "text": "TEXT_DIGLETTSCAVEROUTE11_GAMBLER"
+ }
+ ],
+ "signTexts": []
+ },
+ "DIGLETTS_CAVE_ROUTE_2": {
+ "blockLength": 16,
+ "label": "DiglettsCaveRoute2",
+ "objects": [
+ {
+ "name": "DIGLETTSCAVEROUTE2_FISHING_GURU",
+ "text": "TEXT_DIGLETTSCAVEROUTE2_FISHING_GURU"
+ }
+ ],
+ "signTexts": []
+ },
+ "FIGHTING_DOJO": {
+ "blockLength": 30,
+ "label": "FightingDojo",
+ "objects": [
+ {
+ "name": "FIGHTINGDOJO_KARATE_MASTER",
+ "text": "TEXT_FIGHTINGDOJO_KARATE_MASTER",
+ "trainerClass": "OPP_BLACKBELT",
+ "trainerParty": 1
+ },
+ {
+ "name": "FIGHTINGDOJO_BLACKBELT1",
+ "text": "TEXT_FIGHTINGDOJO_BLACKBELT1",
+ "trainerClass": "OPP_BLACKBELT",
+ "trainerParty": 2
+ },
+ {
+ "name": "FIGHTINGDOJO_BLACKBELT2",
+ "text": "TEXT_FIGHTINGDOJO_BLACKBELT2",
+ "trainerClass": "OPP_BLACKBELT",
+ "trainerParty": 3
+ },
+ {
+ "name": "FIGHTINGDOJO_BLACKBELT3",
+ "text": "TEXT_FIGHTINGDOJO_BLACKBELT3",
+ "trainerClass": "OPP_BLACKBELT",
+ "trainerParty": 4
+ },
+ {
+ "name": "FIGHTINGDOJO_BLACKBELT4",
+ "text": "TEXT_FIGHTINGDOJO_BLACKBELT4",
+ "trainerClass": "OPP_BLACKBELT",
+ "trainerParty": 5
+ },
+ {
+ "name": "FIGHTINGDOJO_HITMONLEE_POKE_BALL",
+ "text": "TEXT_FIGHTINGDOJO_HITMONLEE_POKE_BALL"
+ },
+ {
+ "name": "FIGHTINGDOJO_HITMONCHAN_POKE_BALL",
+ "text": "TEXT_FIGHTINGDOJO_HITMONCHAN_POKE_BALL"
+ }
+ ],
+ "signTexts": []
+ },
+ "FUCHSIA_BILLS_GRANDPAS_HOUSE": {
+ "blockLength": 16,
+ "label": "FuchsiaBillsGrandpasHouse",
+ "objects": [
+ {
+ "name": "FUCHSIABILLSGRANDPASHOUSE_MIDDLE_AGED_WOMAN",
+ "text": "TEXT_FUCHSIABILLSGRANDPASHOUSE_MIDDLE_AGED_WOMAN"
+ },
+ {
+ "name": "FUCHSIABILLSGRANDPASHOUSE_BILLS_GRANDPA",
+ "text": "TEXT_FUCHSIABILLSGRANDPASHOUSE_BILLS_GRANDPA"
+ },
+ {
+ "name": "FUCHSIABILLSGRANDPASHOUSE_YOUNGSTER",
+ "text": "TEXT_FUCHSIABILLSGRANDPASHOUSE_YOUNGSTER"
+ }
+ ],
+ "signTexts": []
+ },
+ "FUCHSIA_CITY": {
+ "blockLength": 360,
+ "label": "FuchsiaCity",
+ "objects": [
+ {
+ "name": "FUCHSIACITY_YOUNGSTER1",
+ "text": "TEXT_FUCHSIACITY_YOUNGSTER1"
+ },
+ {
+ "name": "FUCHSIACITY_GAMBLER",
+ "text": "TEXT_FUCHSIACITY_GAMBLER"
+ },
+ {
+ "name": "FUCHSIACITY_ERIK",
+ "text": "TEXT_FUCHSIACITY_ERIK"
+ },
+ {
+ "name": "FUCHSIACITY_YOUNGSTER2",
+ "text": "TEXT_FUCHSIACITY_YOUNGSTER2"
+ },
+ {
+ "name": "FUCHSIACITY_CHANSEY",
+ "text": "TEXT_FUCHSIACITY_CHANSEY"
+ },
+ {
+ "name": "FUCHSIACITY_VOLTORB",
+ "text": "TEXT_FUCHSIACITY_VOLTORB"
+ },
+ {
+ "name": "FUCHSIACITY_KANGASKHAN",
+ "text": "TEXT_FUCHSIACITY_KANGASKHAN"
+ },
+ {
+ "name": "FUCHSIACITY_SLOWPOKE",
+ "text": "TEXT_FUCHSIACITY_SLOWPOKE"
+ },
+ {
+ "name": "FUCHSIACITY_LAPRAS",
+ "text": "TEXT_FUCHSIACITY_LAPRAS"
+ },
+ {
+ "name": "FUCHSIACITY_FOSSIL",
+ "text": "TEXT_FUCHSIACITY_FOSSIL"
+ }
+ ],
+ "signTexts": [
+ "TEXT_FUCHSIACITY_SIGN1",
+ "TEXT_FUCHSIACITY_SIGN2",
+ "TEXT_FUCHSIACITY_SAFARI_GAME_SIGN",
+ "TEXT_FUCHSIACITY_MART_SIGN",
+ "TEXT_FUCHSIACITY_POKECENTER_SIGN",
+ "TEXT_FUCHSIACITY_WARDENS_HOME_SIGN",
+ "TEXT_FUCHSIACITY_SAFARI_ZONE_SIGN",
+ "TEXT_FUCHSIACITY_GYM_SIGN",
+ "TEXT_FUCHSIACITY_CHANSEY_SIGN",
+ "TEXT_FUCHSIACITY_VOLTORB_SIGN",
+ "TEXT_FUCHSIACITY_KANGASKHAN_SIGN",
+ "TEXT_FUCHSIACITY_SLOWPOKE_SIGN",
+ "TEXT_FUCHSIACITY_LAPRAS_SIGN",
+ "TEXT_FUCHSIACITY_FOSSIL_SIGN"
+ ]
+ },
+ "FUCHSIA_GOOD_ROD_HOUSE": {
+ "blockLength": 16,
+ "label": "FuchsiaGoodRodHouse",
+ "objects": [
+ {
+ "name": "FUCHSIAGOODRODHOUSE_FISHING_GURU",
+ "text": "TEXT_FUCHSIAGOODRODHOUSE_FISHING_GURU"
+ }
+ ],
+ "signTexts": []
+ },
+ "FUCHSIA_GYM": {
+ "blockLength": 45,
+ "label": "FuchsiaGym",
+ "objects": [
+ {
+ "name": "FUCHSIAGYM_KOGA",
+ "text": "TEXT_FUCHSIAGYM_KOGA",
+ "trainerClass": "OPP_KOGA",
+ "trainerParty": 1
+ },
+ {
+ "name": "FUCHSIAGYM_ROCKER1",
+ "text": "TEXT_FUCHSIAGYM_ROCKER1",
+ "trainerClass": "OPP_JUGGLER",
+ "trainerParty": 7
+ },
+ {
+ "name": "FUCHSIAGYM_ROCKER2",
+ "text": "TEXT_FUCHSIAGYM_ROCKER2",
+ "trainerClass": "OPP_JUGGLER",
+ "trainerParty": 3
+ },
+ {
+ "name": "FUCHSIAGYM_ROCKER3",
+ "text": "TEXT_FUCHSIAGYM_ROCKER3",
+ "trainerClass": "OPP_JUGGLER",
+ "trainerParty": 8
+ },
+ {
+ "name": "FUCHSIAGYM_ROCKER4",
+ "text": "TEXT_FUCHSIAGYM_ROCKER4",
+ "trainerClass": "OPP_TAMER",
+ "trainerParty": 1
+ },
+ {
+ "name": "FUCHSIAGYM_ROCKER5",
+ "text": "TEXT_FUCHSIAGYM_ROCKER5",
+ "trainerClass": "OPP_TAMER",
+ "trainerParty": 2
+ },
+ {
+ "name": "FUCHSIAGYM_ROCKER6",
+ "text": "TEXT_FUCHSIAGYM_ROCKER6",
+ "trainerClass": "OPP_JUGGLER",
+ "trainerParty": 4
+ },
+ {
+ "name": "FUCHSIAGYM_GYM_GUIDE",
+ "text": "TEXT_FUCHSIAGYM_GYM_GUIDE"
+ }
+ ],
+ "signTexts": []
+ },
+ "FUCHSIA_MART": {
+ "blockLength": 16,
+ "label": "FuchsiaMart",
+ "objects": [
+ {
+ "name": "FUCHSIAMART_CLERK",
+ "text": "TEXT_FUCHSIAMART_CLERK"
+ },
+ {
+ "name": "FUCHSIAMART_MIDDLE_AGED_MAN",
+ "text": "TEXT_FUCHSIAMART_MIDDLE_AGED_MAN"
+ },
+ {
+ "name": "FUCHSIAMART_COOLTRAINER_F",
+ "text": "TEXT_FUCHSIAMART_COOLTRAINER_F"
+ }
+ ],
+ "signTexts": []
+ },
+ "FUCHSIA_MEETING_ROOM": {
+ "blockLength": 28,
+ "label": "FuchsiaMeetingRoom",
+ "objects": [
+ {
+ "name": "FUCHSIAMEETINGROOM_SAFARI_ZONE_WORKER1",
+ "text": "TEXT_FUCHSIAMEETINGROOM_SAFARI_ZONE_WORKER1"
+ },
+ {
+ "name": "FUCHSIAMEETINGROOM_SAFARI_ZONE_WORKER2",
+ "text": "TEXT_FUCHSIAMEETINGROOM_SAFARI_ZONE_WORKER2"
+ },
+ {
+ "name": "FUCHSIAMEETINGROOM_SAFARI_ZONE_WORKER3",
+ "text": "TEXT_FUCHSIAMEETINGROOM_SAFARI_ZONE_WORKER3"
+ }
+ ],
+ "signTexts": []
+ },
+ "FUCHSIA_POKECENTER": {
+ "blockLength": 28,
+ "label": "FuchsiaPokecenter",
+ "objects": [
+ {
+ "name": "FUCHSIAPOKECENTER_NURSE",
+ "text": "TEXT_FUCHSIAPOKECENTER_NURSE"
+ },
+ {
+ "name": "FUCHSIAPOKECENTER_ROCKER",
+ "text": "TEXT_FUCHSIAPOKECENTER_ROCKER"
+ },
+ {
+ "name": "FUCHSIAPOKECENTER_COOLTRAINER_F",
+ "text": "TEXT_FUCHSIAPOKECENTER_COOLTRAINER_F"
+ },
+ {
+ "name": "FUCHSIAPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_FUCHSIAPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "FUCHSIAPOKECENTER_CHANSEY",
+ "text": "TEXT_FUCHSIAPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "GAME_CORNER": {
+ "blockLength": 90,
+ "label": "GameCorner",
+ "objects": [
+ {
+ "name": "GAMECORNER_BEAUTY1",
+ "text": "TEXT_GAMECORNER_BEAUTY1"
+ },
+ {
+ "name": "GAMECORNER_CLERK",
+ "text": "TEXT_GAMECORNER_CLERK"
+ },
+ {
+ "name": "GAMECORNER_MIDDLE_AGED_MAN1",
+ "text": "TEXT_GAMECORNER_MIDDLE_AGED_MAN1"
+ },
+ {
+ "name": "GAMECORNER_BEAUTY2",
+ "text": "TEXT_GAMECORNER_BEAUTY2"
+ },
+ {
+ "name": "GAMECORNER_FISHING_GURU1",
+ "text": "TEXT_GAMECORNER_FISHING_GURU1"
+ },
+ {
+ "name": "GAMECORNER_MIDDLE_AGED_WOMAN",
+ "text": "TEXT_GAMECORNER_MIDDLE_AGED_WOMAN"
+ },
+ {
+ "name": "GAMECORNER_GYM_GUIDE",
+ "text": "TEXT_GAMECORNER_GYM_GUIDE"
+ },
+ {
+ "name": "GAMECORNER_GAMBLER",
+ "text": "TEXT_GAMECORNER_GAMBLER"
+ },
+ {
+ "name": "GAMECORNER_MIDDLE_AGED_MAN2",
+ "text": "TEXT_GAMECORNER_MIDDLE_AGED_MAN2"
+ },
+ {
+ "name": "GAMECORNER_FISHING_GURU2",
+ "text": "TEXT_GAMECORNER_FISHING_GURU2"
+ },
+ {
+ "name": "GAMECORNER_ROCKET",
+ "text": "TEXT_GAMECORNER_ROCKET",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 7
+ }
+ ],
+ "signTexts": [
+ "TEXT_GAMECORNER_POSTER"
+ ]
+ },
+ "GAME_CORNER_PRIZE_ROOM": {
+ "blockLength": 20,
+ "label": "GameCornerPrizeRoom",
+ "objects": [
+ {
+ "name": "GAMECORNERPRIZEROOM_BALDING_GUY",
+ "text": "TEXT_GAMECORNERPRIZEROOM_BALDING_GUY"
+ },
+ {
+ "name": "GAMECORNERPRIZEROOM_GAMBLER",
+ "text": "TEXT_GAMECORNERPRIZEROOM_GAMBLER"
+ }
+ ],
+ "signTexts": [
+ "TEXT_GAMECORNERPRIZEROOM_PRIZE_VENDOR_1",
+ "TEXT_GAMECORNERPRIZEROOM_PRIZE_VENDOR_2",
+ "TEXT_GAMECORNERPRIZEROOM_PRIZE_VENDOR_3"
+ ]
+ },
+ "HALL_OF_FAME": {
+ "blockLength": 20,
+ "label": "HallOfFame",
+ "objects": [
+ {
+ "name": "HALLOFFAME_OAK",
+ "text": "TEXT_HALLOFFAME_OAK"
+ }
+ ],
+ "signTexts": []
+ },
+ "INDIGO_PLATEAU": {
+ "blockLength": 90,
+ "label": "IndigoPlateau",
+ "objects": [],
+ "signTexts": []
+ },
+ "INDIGO_PLATEAU_LOBBY": {
+ "blockLength": 48,
+ "label": "IndigoPlateauLobby",
+ "objects": [
+ {
+ "name": "INDIGOPLATEAULOBBY_NURSE",
+ "text": "TEXT_INDIGOPLATEAULOBBY_NURSE"
+ },
+ {
+ "name": "INDIGOPLATEAULOBBY_GYM_GUIDE",
+ "text": "TEXT_INDIGOPLATEAULOBBY_GYM_GUIDE"
+ },
+ {
+ "name": "INDIGOPLATEAULOBBY_COOLTRAINER_F",
+ "text": "TEXT_INDIGOPLATEAULOBBY_COOLTRAINER_F"
+ },
+ {
+ "name": "INDIGOPLATEAULOBBY_CLERK",
+ "text": "TEXT_INDIGOPLATEAULOBBY_CLERK"
+ },
+ {
+ "name": "INDIGOPLATEAULOBBY_LINK_RECEPTIONIST",
+ "text": "TEXT_INDIGOPLATEAULOBBY_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "INDIGOPLATEAULOBBY_CHANSEY",
+ "text": "TEXT_INDIGOPLATEAULOBBY_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "LANCES_ROOM": {
+ "blockLength": 169,
+ "label": "LancesRoom",
+ "objects": [
+ {
+ "name": "LANCESROOM_LANCE",
+ "text": "TEXT_LANCESROOM_LANCE",
+ "trainerClass": "OPP_LANCE",
+ "trainerParty": 1
+ }
+ ],
+ "signTexts": []
+ },
+ "LAVENDER_CUBONE_HOUSE": {
+ "blockLength": 16,
+ "label": "LavenderCuboneHouse",
+ "objects": [
+ {
+ "name": "LAVENDERCUBONEHOUSE_CUBONE",
+ "text": "TEXT_LAVENDERCUBONEHOUSE_CUBONE"
+ },
+ {
+ "name": "LAVENDERCUBONEHOUSE_BRUNETTE_GIRL",
+ "text": "TEXT_LAVENDERCUBONEHOUSE_BRUNETTE_GIRL"
+ }
+ ],
+ "signTexts": []
+ },
+ "LAVENDER_MART": {
+ "blockLength": 16,
+ "label": "LavenderMart",
+ "objects": [
+ {
+ "name": "LAVENDERMART_CLERK",
+ "text": "TEXT_LAVENDERMART_CLERK"
+ },
+ {
+ "name": "LAVENDERMART_BALDING_GUY",
+ "text": "TEXT_LAVENDERMART_BALDING_GUY"
+ },
+ {
+ "name": "LAVENDERMART_COOLTRAINER_M",
+ "text": "TEXT_LAVENDERMART_COOLTRAINER_M"
+ }
+ ],
+ "signTexts": []
+ },
+ "LAVENDER_POKECENTER": {
+ "blockLength": 28,
+ "label": "LavenderPokecenter",
+ "objects": [
+ {
+ "name": "LAVENDERPOKECENTER_NURSE",
+ "text": "TEXT_LAVENDERPOKECENTER_NURSE"
+ },
+ {
+ "name": "LAVENDERPOKECENTER_GENTLEMAN",
+ "text": "TEXT_LAVENDERPOKECENTER_GENTLEMAN"
+ },
+ {
+ "name": "LAVENDERPOKECENTER_LITTLE_GIRL",
+ "text": "TEXT_LAVENDERPOKECENTER_LITTLE_GIRL"
+ },
+ {
+ "name": "LAVENDERPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_LAVENDERPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "LAVENDERPOKECENTER_CHANSEY",
+ "text": "TEXT_LAVENDERPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "LAVENDER_TOWN": {
+ "blockLength": 90,
+ "label": "LavenderTown",
+ "objects": [
+ {
+ "name": "LAVENDERTOWN_LITTLE_GIRL",
+ "text": "TEXT_LAVENDERTOWN_LITTLE_GIRL"
+ },
+ {
+ "name": "LAVENDERTOWN_COOLTRAINER_M",
+ "text": "TEXT_LAVENDERTOWN_COOLTRAINER_M"
+ },
+ {
+ "name": "LAVENDERTOWN_SUPER_NERD",
+ "text": "TEXT_LAVENDERTOWN_SUPER_NERD"
+ }
+ ],
+ "signTexts": [
+ "TEXT_LAVENDERTOWN_SIGN",
+ "TEXT_LAVENDERTOWN_SILPH_SCOPE_SIGN",
+ "TEXT_LAVENDERTOWN_MART_SIGN",
+ "TEXT_LAVENDERTOWN_POKECENTER_SIGN",
+ "TEXT_LAVENDERTOWN_POKEMON_HOUSE_SIGN",
+ "TEXT_LAVENDERTOWN_POKEMON_TOWER_SIGN"
+ ]
+ },
+ "LORELEIS_ROOM": {
+ "blockLength": 30,
+ "label": "LoreleisRoom",
+ "objects": [
+ {
+ "name": "LORELEISROOM_LORELEI",
+ "text": "TEXT_LORELEISROOM_LORELEI",
+ "trainerClass": "OPP_LORELEI",
+ "trainerParty": 1
+ }
+ ],
+ "signTexts": []
+ },
+ "MR_FUJIS_HOUSE": {
+ "blockLength": 16,
+ "label": "MrFujisHouse",
+ "objects": [
+ {
+ "name": "MRFUJISHOUSE_SUPER_NERD",
+ "text": "TEXT_MRFUJISHOUSE_SUPER_NERD"
+ },
+ {
+ "name": "MRFUJISHOUSE_LITTLE_GIRL",
+ "text": "TEXT_MRFUJISHOUSE_LITTLE_GIRL"
+ },
+ {
+ "name": "MRFUJISHOUSE_PSYDUCK",
+ "text": "TEXT_MRFUJISHOUSE_PSYDUCK"
+ },
+ {
+ "name": "MRFUJISHOUSE_NIDORINO",
+ "text": "TEXT_MRFUJISHOUSE_NIDORINO"
+ },
+ {
+ "hidden": true,
+ "name": "MRFUJISHOUSE_MR_FUJI",
+ "text": "TEXT_MRFUJISHOUSE_MR_FUJI"
+ },
+ {
+ "name": "MRFUJISHOUSE_POKEDEX",
+ "text": "TEXT_MRFUJISHOUSE_POKEDEX"
+ }
+ ],
+ "signTexts": []
+ },
+ "MR_PSYCHICS_HOUSE": {
+ "blockLength": 16,
+ "label": "MrPsychicsHouse",
+ "objects": [
+ {
+ "name": "MRPSYCHICSHOUSE_MR_PSYCHIC",
+ "text": "TEXT_MRPSYCHICSHOUSE_MR_PSYCHIC"
+ }
+ ],
+ "signTexts": []
+ },
+ "MT_MOON_1F": {
+ "blockLength": 360,
+ "label": "MtMoon1F",
+ "objects": [
+ {
+ "name": "MTMOON1F_HIKER",
+ "text": "TEXT_MTMOON1F_HIKER",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 1
+ },
+ {
+ "name": "MTMOON1F_YOUNGSTER1",
+ "text": "TEXT_MTMOON1F_YOUNGSTER1",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 3
+ },
+ {
+ "name": "MTMOON1F_COOLTRAINER_F1",
+ "text": "TEXT_MTMOON1F_COOLTRAINER_F1",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 5
+ },
+ {
+ "name": "MTMOON1F_SUPER_NERD",
+ "text": "TEXT_MTMOON1F_SUPER_NERD",
+ "trainerClass": "OPP_SUPER_NERD",
+ "trainerParty": 1
+ },
+ {
+ "name": "MTMOON1F_COOLTRAINER_F2",
+ "text": "TEXT_MTMOON1F_COOLTRAINER_F2",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 6
+ },
+ {
+ "name": "MTMOON1F_YOUNGSTER2",
+ "text": "TEXT_MTMOON1F_YOUNGSTER2",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 7
+ },
+ {
+ "name": "MTMOON1F_YOUNGSTER3",
+ "text": "TEXT_MTMOON1F_YOUNGSTER3",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 8
+ },
+ {
+ "item": "POTION",
+ "name": "MTMOON1F_POTION1",
+ "text": "TEXT_MTMOON1F_POTION1"
+ },
+ {
+ "item": "MOON_STONE",
+ "name": "MTMOON1F_MOON_STONE",
+ "text": "TEXT_MTMOON1F_MOON_STONE"
+ },
+ {
+ "item": "RARE_CANDY",
+ "name": "MTMOON1F_RARE_CANDY",
+ "text": "TEXT_MTMOON1F_RARE_CANDY"
+ },
+ {
+ "item": "ESCAPE_ROPE",
+ "name": "MTMOON1F_ESCAPE_ROPE",
+ "text": "TEXT_MTMOON1F_ESCAPE_ROPE"
+ },
+ {
+ "item": "POTION",
+ "name": "MTMOON1F_POTION2",
+ "text": "TEXT_MTMOON1F_POTION2"
+ },
+ {
+ "item": "TM_WATER_GUN",
+ "name": "MTMOON1F_TM_WATER_GUN",
+ "text": "TEXT_MTMOON1F_TM_WATER_GUN"
+ }
+ ],
+ "signTexts": [
+ "TEXT_MTMOON1F_BEWARE_ZUBAT_SIGN"
+ ]
+ },
+ "MT_MOON_B1F": {
+ "blockLength": 196,
+ "label": "MtMoonB1F",
+ "objects": [],
+ "signTexts": []
+ },
+ "MT_MOON_B2F": {
+ "blockLength": 360,
+ "label": "MtMoonB2F",
+ "objects": [
+ {
+ "name": "MTMOONB2F_SUPER_NERD",
+ "text": "TEXT_MTMOONB2F_SUPER_NERD",
+ "trainerClass": "OPP_SUPER_NERD",
+ "trainerParty": 2
+ },
+ {
+ "hidden": true,
+ "name": "MTMOONB2F_JESSIE",
+ "text": "TEXT_MTMOONB2F_JESSIE"
+ },
+ {
+ "name": "MTMOONB2F_ROCKET1",
+ "text": "TEXT_MTMOONB2F_ROCKET1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 2
+ },
+ {
+ "name": "MTMOONB2F_ROCKET2",
+ "text": "TEXT_MTMOONB2F_ROCKET2",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 3
+ },
+ {
+ "name": "MTMOONB2F_ROCKET3",
+ "text": "TEXT_MTMOONB2F_ROCKET3",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 1
+ },
+ {
+ "hidden": true,
+ "name": "MTMOONB2F_JAMES",
+ "text": "TEXT_MTMOONB2F_JAMES"
+ },
+ {
+ "name": "MTMOONB2F_DOME_FOSSIL",
+ "text": "TEXT_MTMOONB2F_DOME_FOSSIL"
+ },
+ {
+ "name": "MTMOONB2F_HELIX_FOSSIL",
+ "text": "TEXT_MTMOONB2F_HELIX_FOSSIL"
+ },
+ {
+ "item": "HP_UP",
+ "name": "MTMOONB2F_HP_UP",
+ "text": "TEXT_MTMOONB2F_HP_UP"
+ },
+ {
+ "item": "TM_MEGA_PUNCH",
+ "name": "MTMOONB2F_TM_MEGA_PUNCH",
+ "text": "TEXT_MTMOONB2F_TM_MEGA_PUNCH"
+ }
+ ],
+ "signTexts": []
+ },
+ "MT_MOON_POKECENTER": {
+ "blockLength": 28,
+ "label": "MtMoonPokecenter",
+ "objects": [
+ {
+ "name": "MTMOONPOKECENTER_NURSE",
+ "text": "TEXT_MTMOONPOKECENTER_NURSE"
+ },
+ {
+ "name": "MTMOONPOKECENTER_YOUNGSTER",
+ "text": "TEXT_MTMOONPOKECENTER_YOUNGSTER"
+ },
+ {
+ "name": "MTMOONPOKECENTER_GENTLEMAN",
+ "text": "TEXT_MTMOONPOKECENTER_GENTLEMAN"
+ },
+ {
+ "name": "MTMOONPOKECENTER_MAGIKARP_SALESMAN",
+ "text": "TEXT_MTMOONPOKECENTER_MAGIKARP_SALESMAN"
+ },
+ {
+ "name": "MTMOONPOKECENTER_CLIPBOARD",
+ "text": "TEXT_MTMOONPOKECENTER_CLIPBOARD"
+ },
+ {
+ "name": "MTMOONPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_MTMOONPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "MTMOONPOKECENTER_CHANSEY",
+ "text": "TEXT_MTMOONPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "MUSEUM_1F": {
+ "blockLength": 40,
+ "label": "Museum1F",
+ "objects": [
+ {
+ "name": "MUSEUM1F_SCIENTIST1",
+ "text": "TEXT_MUSEUM1F_SCIENTIST1"
+ },
+ {
+ "name": "MUSEUM1F_GAMBLER",
+ "text": "TEXT_MUSEUM1F_GAMBLER"
+ },
+ {
+ "name": "MUSEUM1F_SCIENTIST2",
+ "text": "TEXT_MUSEUM1F_SCIENTIST2"
+ },
+ {
+ "name": "MUSEUM1F_SCIENTIST3",
+ "text": "TEXT_MUSEUM1F_SCIENTIST3"
+ },
+ {
+ "name": "MUSEUM1F_OLD_AMBER",
+ "text": "TEXT_MUSEUM1F_OLD_AMBER"
+ }
+ ],
+ "signTexts": []
+ },
+ "MUSEUM_2F": {
+ "blockLength": 28,
+ "label": "Museum2F",
+ "objects": [
+ {
+ "name": "MUSEUM2F_YOUNGSTER",
+ "text": "TEXT_MUSEUM2F_YOUNGSTER"
+ },
+ {
+ "name": "MUSEUM2F_GRAMPS",
+ "text": "TEXT_MUSEUM2F_GRAMPS"
+ },
+ {
+ "name": "MUSEUM2F_SCIENTIST",
+ "text": "TEXT_MUSEUM2F_SCIENTIST"
+ },
+ {
+ "name": "MUSEUM2F_BRUNETTE_GIRL",
+ "text": "TEXT_MUSEUM2F_BRUNETTE_GIRL"
+ },
+ {
+ "name": "MUSEUM2F_HIKER",
+ "text": "TEXT_MUSEUM2F_HIKER"
+ }
+ ],
+ "signTexts": [
+ "TEXT_MUSEUM2F_SPACE_SHUTTLE_SIGN",
+ "TEXT_MUSEUM2F_MOON_STONE_SIGN"
+ ]
+ },
+ "NAME_RATERS_HOUSE": {
+ "blockLength": 16,
+ "label": "NameRatersHouse",
+ "objects": [
+ {
+ "name": "NAMERATERSHOUSE_NAME_RATER",
+ "text": "TEXT_NAMERATERSHOUSE_NAME_RATER"
+ }
+ ],
+ "signTexts": []
+ },
+ "OAKS_LAB": {
+ "blockLength": 30,
+ "label": "OaksLab",
+ "objects": [
+ {
+ "name": "OAKSLAB_RIVAL",
+ "text": "TEXT_OAKSLAB_RIVAL",
+ "trainerClass": "OPP_RIVAL1",
+ "trainerParty": 1
+ },
+ {
+ "name": "OAKSLAB_EEVEE_POKE_BALL",
+ "text": "TEXT_OAKSLAB_EEVEE_POKE_BALL"
+ },
+ {
+ "hidden": true,
+ "name": "OAKSLAB_OAK1",
+ "text": "TEXT_OAKSLAB_OAK1"
+ },
+ {
+ "name": "OAKSLAB_POKEDEX1",
+ "text": "TEXT_OAKSLAB_POKEDEX1"
+ },
+ {
+ "name": "OAKSLAB_POKEDEX2",
+ "text": "TEXT_OAKSLAB_POKEDEX2"
+ },
+ {
+ "hidden": true,
+ "name": "OAKSLAB_OAK2",
+ "text": "TEXT_OAKSLAB_OAK2"
+ },
+ {
+ "name": "OAKSLAB_GIRL",
+ "text": "TEXT_OAKSLAB_GIRL"
+ },
+ {
+ "name": "OAKSLAB_SCIENTIST1",
+ "text": "TEXT_OAKSLAB_SCIENTIST1"
+ },
+ {
+ "name": "OAKSLAB_SCIENTIST2",
+ "text": "TEXT_OAKSLAB_SCIENTIST2"
+ }
+ ],
+ "signTexts": []
+ },
+ "PALLET_TOWN": {
+ "blockLength": 90,
+ "label": "PalletTown",
+ "objects": [
+ {
+ "hidden": true,
+ "name": "PALLETTOWN_OAK",
+ "text": "TEXT_PALLETTOWN_OAK"
+ },
+ {
+ "name": "PALLETTOWN_GIRL",
+ "text": "TEXT_PALLETTOWN_GIRL"
+ },
+ {
+ "name": "PALLETTOWN_FISHER",
+ "text": "TEXT_PALLETTOWN_FISHER"
+ }
+ ],
+ "signTexts": [
+ "TEXT_PALLETTOWN_OAKSLAB_SIGN",
+ "TEXT_PALLETTOWN_SIGN",
+ "TEXT_PALLETTOWN_PLAYERSHOUSE_SIGN",
+ "TEXT_PALLETTOWN_RIVALSHOUSE_SIGN"
+ ]
+ },
+ "PEWTER_CITY": {
+ "blockLength": 360,
+ "label": "PewterCity",
+ "objects": [
+ {
+ "name": "PEWTERCITY_COOLTRAINER_F",
+ "text": "TEXT_PEWTERCITY_COOLTRAINER_F"
+ },
+ {
+ "name": "PEWTERCITY_COOLTRAINER_M",
+ "text": "TEXT_PEWTERCITY_COOLTRAINER_M"
+ },
+ {
+ "name": "PEWTERCITY_SUPER_NERD1",
+ "text": "TEXT_PEWTERCITY_SUPER_NERD1"
+ },
+ {
+ "name": "PEWTERCITY_SUPER_NERD2",
+ "text": "TEXT_PEWTERCITY_SUPER_NERD2"
+ },
+ {
+ "name": "PEWTERCITY_YOUNGSTER",
+ "text": "TEXT_PEWTERCITY_YOUNGSTER"
+ }
+ ],
+ "signTexts": [
+ "TEXT_PEWTERCITY_TRAINER_TIPS",
+ "TEXT_PEWTERCITY_POLICE_NOTICE_SIGN",
+ "TEXT_PEWTERCITY_MART_SIGN",
+ "TEXT_PEWTERCITY_POKECENTER_SIGN",
+ "TEXT_PEWTERCITY_MUSEUM_SIGN",
+ "TEXT_PEWTERCITY_GYM_SIGN",
+ "TEXT_PEWTERCITY_SIGN"
+ ]
+ },
+ "PEWTER_GYM": {
+ "blockLength": 35,
+ "label": "PewterGym",
+ "objects": [
+ {
+ "name": "PEWTERGYM_BROCK",
+ "text": "TEXT_PEWTERGYM_BROCK",
+ "trainerClass": "OPP_BROCK",
+ "trainerParty": 1
+ },
+ {
+ "name": "PEWTERGYM_COOLTRAINER_M",
+ "text": "TEXT_PEWTERGYM_COOLTRAINER_M",
+ "trainerClass": "OPP_JR_TRAINER_M",
+ "trainerParty": 1
+ },
+ {
+ "name": "PEWTERGYM_GYM_GUIDE",
+ "text": "TEXT_PEWTERGYM_GYM_GUIDE"
+ }
+ ],
+ "signTexts": []
+ },
+ "PEWTER_MART": {
+ "blockLength": 16,
+ "label": "PewterMart",
+ "objects": [
+ {
+ "name": "PEWTERMART_CLERK",
+ "text": "TEXT_PEWTERMART_CLERK"
+ },
+ {
+ "name": "PEWTERMART_YOUNGSTER",
+ "text": "TEXT_PEWTERMART_YOUNGSTER"
+ },
+ {
+ "name": "PEWTERMART_SUPER_NERD",
+ "text": "TEXT_PEWTERMART_SUPER_NERD"
+ }
+ ],
+ "signTexts": []
+ },
+ "PEWTER_NIDORAN_HOUSE": {
+ "blockLength": 16,
+ "label": "PewterNidoranHouse",
+ "objects": [
+ {
+ "name": "PEWTERNIDORANHOUSE_NIDORAN",
+ "text": "TEXT_PEWTERNIDORANHOUSE_NIDORAN"
+ },
+ {
+ "name": "PEWTERNIDORANHOUSE_LITTLE_BOY",
+ "text": "TEXT_PEWTERNIDORANHOUSE_LITTLE_BOY"
+ },
+ {
+ "name": "PEWTERNIDORANHOUSE_MIDDLE_AGED_MAN",
+ "text": "TEXT_PEWTERNIDORANHOUSE_MIDDLE_AGED_MAN"
+ }
+ ],
+ "signTexts": []
+ },
+ "PEWTER_POKECENTER": {
+ "blockLength": 28,
+ "label": "PewterPokecenter",
+ "objects": [
+ {
+ "name": "PEWTERPOKECENTER_NURSE",
+ "text": "TEXT_PEWTERPOKECENTER_NURSE"
+ },
+ {
+ "name": "PEWTERPOKECENTER_GENTLEMAN",
+ "text": "TEXT_PEWTERPOKECENTER_GENTLEMAN"
+ },
+ {
+ "name": "PEWTERPOKECENTER_JIGGLYPUFF",
+ "text": "TEXT_PEWTERPOKECENTER_JIGGLYPUFF"
+ },
+ {
+ "name": "PEWTERPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_PEWTERPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "PEWTERPOKECENTER_COOLTRAINER_F",
+ "text": "TEXT_PEWTERPOKECENTER_COOLTRAINER_F"
+ },
+ {
+ "name": "PEWTERPOKECENTER_CHANSEY",
+ "text": "TEXT_PEWTERPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "PEWTER_SPEECH_HOUSE": {
+ "blockLength": 16,
+ "label": "PewterSpeechHouse",
+ "objects": [
+ {
+ "name": "PEWTERSPEECHHOUSE_GAMBLER",
+ "text": "TEXT_PEWTERSPEECHHOUSE_GAMBLER"
+ },
+ {
+ "name": "PEWTERSPEECHHOUSE_YOUNGSTER",
+ "text": "TEXT_PEWTERSPEECHHOUSE_YOUNGSTER"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_FAN_CLUB": {
+ "blockLength": 16,
+ "label": "PokemonFanClub",
+ "objects": [
+ {
+ "name": "POKEMONFANCLUB_CLEFAIRY_FAN",
+ "text": "TEXT_POKEMONFANCLUB_CLEFAIRY_FAN"
+ },
+ {
+ "name": "POKEMONFANCLUB_SEEL_FAN",
+ "text": "TEXT_POKEMONFANCLUB_SEEL_FAN"
+ },
+ {
+ "name": "POKEMONFANCLUB_CLEFAIRY",
+ "text": "TEXT_POKEMONFANCLUB_CLEFAIRY"
+ },
+ {
+ "name": "POKEMONFANCLUB_SEEL",
+ "text": "TEXT_POKEMONFANCLUB_SEEL"
+ },
+ {
+ "name": "POKEMONFANCLUB_CHAIRMAN",
+ "text": "TEXT_POKEMONFANCLUB_CHAIRMAN"
+ },
+ {
+ "name": "POKEMONFANCLUB_RECEPTIONIST",
+ "text": "TEXT_POKEMONFANCLUB_RECEPTIONIST"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_MANSION_1F": {
+ "blockLength": 210,
+ "label": "PokemonMansion1F",
+ "objects": [
+ {
+ "name": "POKEMONMANSION1F_SCIENTIST",
+ "text": "TEXT_POKEMONMANSION1F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 4
+ },
+ {
+ "item": "ESCAPE_ROPE",
+ "name": "POKEMONMANSION1F_ESCAPE_ROPE",
+ "text": "TEXT_POKEMONMANSION1F_ESCAPE_ROPE"
+ },
+ {
+ "item": "CARBOS",
+ "name": "POKEMONMANSION1F_CARBOS",
+ "text": "TEXT_POKEMONMANSION1F_CARBOS"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_MANSION_2F": {
+ "blockLength": 210,
+ "label": "PokemonMansion2F",
+ "objects": [
+ {
+ "name": "POKEMONMANSION2F_SUPER_NERD",
+ "text": "TEXT_POKEMONMANSION2F_SUPER_NERD",
+ "trainerClass": "OPP_BURGLAR",
+ "trainerParty": 7
+ },
+ {
+ "item": "CALCIUM",
+ "name": "POKEMONMANSION2F_CALCIUM",
+ "text": "TEXT_POKEMONMANSION2F_CALCIUM"
+ },
+ {
+ "name": "POKEMONMANSION2F_DIARY1",
+ "text": "TEXT_POKEMONMANSION2F_DIARY1"
+ },
+ {
+ "name": "POKEMONMANSION2F_DIARY2",
+ "text": "TEXT_POKEMONMANSION2F_DIARY2"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_MANSION_3F": {
+ "blockLength": 135,
+ "label": "PokemonMansion3F",
+ "objects": [
+ {
+ "name": "POKEMONMANSION3F_SUPER_NERD",
+ "text": "TEXT_POKEMONMANSION3F_SUPER_NERD",
+ "trainerClass": "OPP_BURGLAR",
+ "trainerParty": 8
+ },
+ {
+ "name": "POKEMONMANSION3F_SCIENTIST",
+ "text": "TEXT_POKEMONMANSION3F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 12
+ },
+ {
+ "item": "MAX_POTION",
+ "name": "POKEMONMANSION3F_MAX_POTION",
+ "text": "TEXT_POKEMONMANSION3F_MAX_POTION"
+ },
+ {
+ "item": "IRON",
+ "name": "POKEMONMANSION3F_IRON",
+ "text": "TEXT_POKEMONMANSION3F_IRON"
+ },
+ {
+ "name": "POKEMONMANSION3F_DIARY",
+ "text": "TEXT_POKEMONMANSION3F_DIARY"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_MANSION_B1F": {
+ "blockLength": 210,
+ "label": "PokemonMansionB1F",
+ "objects": [
+ {
+ "name": "POKEMONMANSIONB1F_BURGLAR",
+ "text": "TEXT_POKEMONMANSIONB1F_BURGLAR",
+ "trainerClass": "OPP_BURGLAR",
+ "trainerParty": 9
+ },
+ {
+ "name": "POKEMONMANSIONB1F_SCIENTIST",
+ "text": "TEXT_POKEMONMANSIONB1F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 13
+ },
+ {
+ "item": "RARE_CANDY",
+ "name": "POKEMONMANSIONB1F_RARE_CANDY",
+ "text": "TEXT_POKEMONMANSIONB1F_RARE_CANDY"
+ },
+ {
+ "item": "FULL_RESTORE",
+ "name": "POKEMONMANSIONB1F_FULL_RESTORE",
+ "text": "TEXT_POKEMONMANSIONB1F_FULL_RESTORE"
+ },
+ {
+ "item": "TM_BLIZZARD",
+ "name": "POKEMONMANSIONB1F_TM_BLIZZARD",
+ "text": "TEXT_POKEMONMANSIONB1F_TM_BLIZZARD"
+ },
+ {
+ "item": "TM_SOLARBEAM",
+ "name": "POKEMONMANSIONB1F_TM_SOLARBEAM",
+ "text": "TEXT_POKEMONMANSIONB1F_TM_SOLARBEAM"
+ },
+ {
+ "name": "POKEMONMANSIONB1F_DIARY",
+ "text": "TEXT_POKEMONMANSIONB1F_DIARY"
+ },
+ {
+ "item": "SECRET_KEY",
+ "name": "POKEMONMANSIONB1F_SECRET_KEY",
+ "text": "TEXT_POKEMONMANSIONB1F_SECRET_KEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_TOWER_1F": {
+ "blockLength": 90,
+ "label": "PokemonTower1F",
+ "objects": [
+ {
+ "name": "POKEMONTOWER1F_RECEPTIONIST",
+ "text": "TEXT_POKEMONTOWER1F_RECEPTIONIST"
+ },
+ {
+ "name": "POKEMONTOWER1F_MIDDLE_AGED_WOMAN",
+ "text": "TEXT_POKEMONTOWER1F_MIDDLE_AGED_WOMAN"
+ },
+ {
+ "name": "POKEMONTOWER1F_BALDING_GUY",
+ "text": "TEXT_POKEMONTOWER1F_BALDING_GUY"
+ },
+ {
+ "name": "POKEMONTOWER1F_GIRL",
+ "text": "TEXT_POKEMONTOWER1F_GIRL"
+ },
+ {
+ "name": "POKEMONTOWER1F_CHANNELER",
+ "text": "TEXT_POKEMONTOWER1F_CHANNELER"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_TOWER_2F": {
+ "blockLength": 90,
+ "label": "PokemonTower2F",
+ "objects": [
+ {
+ "name": "POKEMONTOWER2F_RIVAL",
+ "text": "TEXT_POKEMONTOWER2F_RIVAL"
+ },
+ {
+ "name": "POKEMONTOWER2F_CHANNELER",
+ "text": "TEXT_POKEMONTOWER2F_CHANNELER"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_TOWER_3F": {
+ "blockLength": 90,
+ "label": "PokemonTower3F",
+ "objects": [
+ {
+ "name": "POKEMONTOWER3F_CHANNELER1",
+ "text": "TEXT_POKEMONTOWER3F_CHANNELER1",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 5
+ },
+ {
+ "name": "POKEMONTOWER3F_CHANNELER2",
+ "text": "TEXT_POKEMONTOWER3F_CHANNELER2",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 6
+ },
+ {
+ "name": "POKEMONTOWER3F_CHANNELER3",
+ "text": "TEXT_POKEMONTOWER3F_CHANNELER3",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 8
+ },
+ {
+ "item": "ESCAPE_ROPE",
+ "name": "POKEMONTOWER3F_ESCAPE_ROPE",
+ "text": "TEXT_POKEMONTOWER3F_ESCAPE_ROPE"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_TOWER_4F": {
+ "blockLength": 90,
+ "label": "PokemonTower4F",
+ "objects": [
+ {
+ "name": "POKEMONTOWER4F_CHANNELER1",
+ "text": "TEXT_POKEMONTOWER4F_CHANNELER1",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 9
+ },
+ {
+ "name": "POKEMONTOWER4F_CHANNELER2",
+ "text": "TEXT_POKEMONTOWER4F_CHANNELER2",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 10
+ },
+ {
+ "name": "POKEMONTOWER4F_CHANNELER3",
+ "text": "TEXT_POKEMONTOWER4F_CHANNELER3",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 12
+ },
+ {
+ "item": "ELIXER",
+ "name": "POKEMONTOWER4F_ELIXER",
+ "text": "TEXT_POKEMONTOWER4F_ELIXER"
+ },
+ {
+ "item": "AWAKENING",
+ "name": "POKEMONTOWER4F_AWAKENING",
+ "text": "TEXT_POKEMONTOWER4F_AWAKENING"
+ },
+ {
+ "item": "HP_UP",
+ "name": "POKEMONTOWER4F_HP_UP",
+ "text": "TEXT_POKEMONTOWER4F_HP_UP"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_TOWER_5F": {
+ "blockLength": 90,
+ "label": "PokemonTower5F",
+ "objects": [
+ {
+ "name": "POKEMONTOWER5F_CHANNELER1",
+ "text": "TEXT_POKEMONTOWER5F_CHANNELER1"
+ },
+ {
+ "name": "POKEMONTOWER5F_CHANNELER2",
+ "text": "TEXT_POKEMONTOWER5F_CHANNELER2",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 14
+ },
+ {
+ "name": "POKEMONTOWER5F_CHANNELER3",
+ "text": "TEXT_POKEMONTOWER5F_CHANNELER3",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 16
+ },
+ {
+ "name": "POKEMONTOWER5F_CHANNELER4",
+ "text": "TEXT_POKEMONTOWER5F_CHANNELER4",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 17
+ },
+ {
+ "name": "POKEMONTOWER5F_CHANNELER5",
+ "text": "TEXT_POKEMONTOWER5F_CHANNELER5",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 18
+ },
+ {
+ "item": "NUGGET",
+ "name": "POKEMONTOWER5F_NUGGET",
+ "text": "TEXT_POKEMONTOWER5F_NUGGET"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_TOWER_6F": {
+ "blockLength": 90,
+ "label": "PokemonTower6F",
+ "objects": [
+ {
+ "name": "POKEMONTOWER6F_CHANNELER1",
+ "text": "TEXT_POKEMONTOWER6F_CHANNELER1",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 19
+ },
+ {
+ "name": "POKEMONTOWER6F_CHANNELER2",
+ "text": "TEXT_POKEMONTOWER6F_CHANNELER2",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 20
+ },
+ {
+ "name": "POKEMONTOWER6F_CHANNELER3",
+ "text": "TEXT_POKEMONTOWER6F_CHANNELER3",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 21
+ },
+ {
+ "item": "RARE_CANDY",
+ "name": "POKEMONTOWER6F_RARE_CANDY",
+ "text": "TEXT_POKEMONTOWER6F_RARE_CANDY"
+ },
+ {
+ "item": "X_ACCURACY",
+ "name": "POKEMONTOWER6F_X_ACCURACY",
+ "text": "TEXT_POKEMONTOWER6F_X_ACCURACY"
+ }
+ ],
+ "signTexts": []
+ },
+ "POKEMON_TOWER_7F": {
+ "blockLength": 90,
+ "label": "PokemonTower7F",
+ "objects": [
+ {
+ "hidden": true,
+ "name": "POKEMONTOWER7F_JESSIE",
+ "text": "TEXT_POKEMONTOWER7F_JESSIE"
+ },
+ {
+ "hidden": true,
+ "name": "POKEMONTOWER7F_JAMES",
+ "text": "TEXT_POKEMONTOWER7F_JAMES"
+ },
+ {
+ "name": "POKEMONTOWER7F_MR_FUJI",
+ "text": "TEXT_POKEMONTOWER7F_MR_FUJI"
+ }
+ ],
+ "signTexts": []
+ },
+ "POWER_PLANT": {
+ "blockLength": 360,
+ "label": "PowerPlant",
+ "objects": [
+ {
+ "name": "POWERPLANT_VOLTORB1",
+ "pokemon": "VOLTORB",
+ "text": "TEXT_POWERPLANT_VOLTORB1"
+ },
+ {
+ "name": "POWERPLANT_VOLTORB2",
+ "pokemon": "VOLTORB",
+ "text": "TEXT_POWERPLANT_VOLTORB2"
+ },
+ {
+ "name": "POWERPLANT_VOLTORB3",
+ "pokemon": "VOLTORB",
+ "text": "TEXT_POWERPLANT_VOLTORB3"
+ },
+ {
+ "name": "POWERPLANT_ELECTRODE1",
+ "pokemon": "ELECTRODE",
+ "text": "TEXT_POWERPLANT_ELECTRODE1"
+ },
+ {
+ "name": "POWERPLANT_VOLTORB4",
+ "pokemon": "VOLTORB",
+ "text": "TEXT_POWERPLANT_VOLTORB4"
+ },
+ {
+ "name": "POWERPLANT_VOLTORB5",
+ "pokemon": "VOLTORB",
+ "text": "TEXT_POWERPLANT_VOLTORB5"
+ },
+ {
+ "name": "POWERPLANT_ELECTRODE2",
+ "pokemon": "ELECTRODE",
+ "text": "TEXT_POWERPLANT_ELECTRODE2"
+ },
+ {
+ "name": "POWERPLANT_VOLTORB6",
+ "pokemon": "VOLTORB",
+ "text": "TEXT_POWERPLANT_VOLTORB6"
+ },
+ {
+ "name": "POWERPLANT_ZAPDOS",
+ "pokemon": "ZAPDOS",
+ "text": "TEXT_POWERPLANT_ZAPDOS"
+ },
+ {
+ "item": "CARBOS",
+ "name": "POWERPLANT_CARBOS",
+ "text": "TEXT_POWERPLANT_CARBOS"
+ },
+ {
+ "item": "HP_UP",
+ "name": "POWERPLANT_HP_UP",
+ "text": "TEXT_POWERPLANT_HP_UP"
+ },
+ {
+ "item": "RARE_CANDY",
+ "name": "POWERPLANT_RARE_CANDY",
+ "text": "TEXT_POWERPLANT_RARE_CANDY"
+ },
+ {
+ "item": "TM_THUNDER",
+ "name": "POWERPLANT_TM_THUNDER",
+ "text": "TEXT_POWERPLANT_TM_THUNDER"
+ },
+ {
+ "item": "TM_REFLECT",
+ "name": "POWERPLANT_TM_REFLECT",
+ "text": "TEXT_POWERPLANT_TM_REFLECT"
+ }
+ ],
+ "signTexts": []
+ },
+ "REDS_HOUSE_1F": {
+ "blockLength": 16,
+ "label": "RedsHouse1F",
+ "objects": [
+ {
+ "name": "REDSHOUSE1F_MOM",
+ "text": "TEXT_REDSHOUSE1F_MOM"
+ }
+ ],
+ "signTexts": [
+ "TEXT_REDSHOUSE1F_TV"
+ ]
+ },
+ "REDS_HOUSE_2F": {
+ "blockLength": 16,
+ "label": "RedsHouse2F",
+ "objects": [],
+ "signTexts": []
+ },
+ "ROCKET_HIDEOUT_B1F": {
+ "blockLength": 210,
+ "label": "RocketHideoutB1F",
+ "objects": [
+ {
+ "name": "ROCKETHIDEOUTB1F_ROCKET1",
+ "text": "TEXT_ROCKETHIDEOUTB1F_ROCKET1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 8
+ },
+ {
+ "name": "ROCKETHIDEOUTB1F_ROCKET2",
+ "text": "TEXT_ROCKETHIDEOUTB1F_ROCKET2",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROCKETHIDEOUTB1F_ROCKET3",
+ "text": "TEXT_ROCKETHIDEOUTB1F_ROCKET3",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 10
+ },
+ {
+ "name": "ROCKETHIDEOUTB1F_ROCKET4",
+ "text": "TEXT_ROCKETHIDEOUTB1F_ROCKET4",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 11
+ },
+ {
+ "name": "ROCKETHIDEOUTB1F_ROCKET5",
+ "text": "TEXT_ROCKETHIDEOUTB1F_ROCKET5",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 12
+ },
+ {
+ "item": "ESCAPE_ROPE",
+ "name": "ROCKETHIDEOUTB1F_ESCAPE_ROPE",
+ "text": "TEXT_ROCKETHIDEOUTB1F_ESCAPE_ROPE"
+ },
+ {
+ "item": "HYPER_POTION",
+ "name": "ROCKETHIDEOUTB1F_HYPER_POTION",
+ "text": "TEXT_ROCKETHIDEOUTB1F_HYPER_POTION"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROCKET_HIDEOUT_B2F": {
+ "blockLength": 210,
+ "label": "RocketHideoutB2F",
+ "objects": [
+ {
+ "name": "ROCKETHIDEOUTB2F_ROCKET",
+ "text": "TEXT_ROCKETHIDEOUTB2F_ROCKET",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 13
+ },
+ {
+ "item": "MOON_STONE",
+ "name": "ROCKETHIDEOUTB2F_MOON_STONE",
+ "text": "TEXT_ROCKETHIDEOUTB2F_MOON_STONE"
+ },
+ {
+ "item": "NUGGET",
+ "name": "ROCKETHIDEOUTB2F_NUGGET",
+ "text": "TEXT_ROCKETHIDEOUTB2F_NUGGET"
+ },
+ {
+ "item": "TM_HORN_DRILL",
+ "name": "ROCKETHIDEOUTB2F_TM_HORN_DRILL",
+ "text": "TEXT_ROCKETHIDEOUTB2F_TM_HORN_DRILL"
+ },
+ {
+ "item": "SUPER_POTION",
+ "name": "ROCKETHIDEOUTB2F_SUPER_POTION",
+ "text": "TEXT_ROCKETHIDEOUTB2F_SUPER_POTION"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROCKET_HIDEOUT_B3F": {
+ "blockLength": 210,
+ "label": "RocketHideoutB3F",
+ "objects": [
+ {
+ "name": "ROCKETHIDEOUTB3F_ROCKET1",
+ "text": "TEXT_ROCKETHIDEOUTB3F_ROCKET1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 14
+ },
+ {
+ "name": "ROCKETHIDEOUTB3F_ROCKET2",
+ "text": "TEXT_ROCKETHIDEOUTB3F_ROCKET2",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 15
+ },
+ {
+ "item": "TM_DOUBLE_EDGE",
+ "name": "ROCKETHIDEOUTB3F_TM_DOUBLE_EDGE",
+ "text": "TEXT_ROCKETHIDEOUTB3F_TM_DOUBLE_EDGE"
+ },
+ {
+ "item": "RARE_CANDY",
+ "name": "ROCKETHIDEOUTB3F_RARE_CANDY",
+ "text": "TEXT_ROCKETHIDEOUTB3F_RARE_CANDY"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROCKET_HIDEOUT_B4F": {
+ "blockLength": 180,
+ "label": "RocketHideoutB4F",
+ "objects": [
+ {
+ "name": "ROCKETHIDEOUTB4F_GIOVANNI",
+ "text": "TEXT_ROCKETHIDEOUTB4F_GIOVANNI",
+ "trainerClass": "OPP_GIOVANNI",
+ "trainerParty": 1
+ },
+ {
+ "hidden": true,
+ "name": "ROCKETHIDEOUTB4F_JAMES",
+ "text": "TEXT_ROCKETHIDEOUTB4F_JAMES"
+ },
+ {
+ "hidden": true,
+ "name": "ROCKETHIDEOUTB4F_JESSIE",
+ "text": "TEXT_ROCKETHIDEOUTB4F_JESSIE"
+ },
+ {
+ "name": "ROCKETHIDEOUTB4F_ROCKET",
+ "text": "TEXT_ROCKETHIDEOUTB4F_ROCKET",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 18
+ },
+ {
+ "item": "HP_UP",
+ "name": "ROCKETHIDEOUTB4F_HP_UP",
+ "text": "TEXT_ROCKETHIDEOUTB4F_HP_UP"
+ },
+ {
+ "item": "TM_RAZOR_WIND",
+ "name": "ROCKETHIDEOUTB4F_TM_RAZOR_WIND",
+ "text": "TEXT_ROCKETHIDEOUTB4F_TM_RAZOR_WIND"
+ },
+ {
+ "item": "IRON",
+ "name": "ROCKETHIDEOUTB4F_IRON",
+ "text": "TEXT_ROCKETHIDEOUTB4F_IRON"
+ },
+ {
+ "hidden": true,
+ "item": "SILPH_SCOPE",
+ "name": "ROCKETHIDEOUTB4F_SILPH_SCOPE",
+ "text": "TEXT_ROCKETHIDEOUTB4F_SILPH_SCOPE"
+ },
+ {
+ "hidden": true,
+ "item": "LIFT_KEY",
+ "name": "ROCKETHIDEOUTB4F_LIFT_KEY",
+ "text": "TEXT_ROCKETHIDEOUTB4F_LIFT_KEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROCKET_HIDEOUT_ELEVATOR": {
+ "blockLength": 12,
+ "label": "RocketHideoutElevator",
+ "objects": [],
+ "signTexts": [
+ "TEXT_ROCKETHIDEOUTELEVATOR"
+ ]
+ },
+ "ROCK_TUNNEL_1F": {
+ "blockLength": 360,
+ "label": "RockTunnel1F",
+ "objects": [
+ {
+ "name": "ROCKTUNNEL1F_HIKER1",
+ "text": "TEXT_ROCKTUNNEL1F_HIKER1",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 12
+ },
+ {
+ "name": "ROCKTUNNEL1F_HIKER2",
+ "text": "TEXT_ROCKTUNNEL1F_HIKER2",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 13
+ },
+ {
+ "name": "ROCKTUNNEL1F_HIKER3",
+ "text": "TEXT_ROCKTUNNEL1F_HIKER3",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 14
+ },
+ {
+ "name": "ROCKTUNNEL1F_SUPER_NERD",
+ "text": "TEXT_ROCKTUNNEL1F_SUPER_NERD",
+ "trainerClass": "OPP_POKEMANIAC",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROCKTUNNEL1F_COOLTRAINER_F1",
+ "text": "TEXT_ROCKTUNNEL1F_COOLTRAINER_F1",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 17
+ },
+ {
+ "name": "ROCKTUNNEL1F_COOLTRAINER_F2",
+ "text": "TEXT_ROCKTUNNEL1F_COOLTRAINER_F2",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 18
+ },
+ {
+ "name": "ROCKTUNNEL1F_COOLTRAINER_F3",
+ "text": "TEXT_ROCKTUNNEL1F_COOLTRAINER_F3",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 19
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROCKTUNNEL1F_SIGN"
+ ]
+ },
+ "ROCK_TUNNEL_B1F": {
+ "blockLength": 360,
+ "label": "RockTunnelB1F",
+ "objects": [
+ {
+ "name": "ROCKTUNNELB1F_COOLTRAINER_F1",
+ "text": "TEXT_ROCKTUNNELB1F_COOLTRAINER_F1",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROCKTUNNELB1F_HIKER1",
+ "text": "TEXT_ROCKTUNNELB1F_HIKER1",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROCKTUNNELB1F_SUPER_NERD1",
+ "text": "TEXT_ROCKTUNNELB1F_SUPER_NERD1",
+ "trainerClass": "OPP_POKEMANIAC",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROCKTUNNELB1F_SUPER_NERD2",
+ "text": "TEXT_ROCKTUNNELB1F_SUPER_NERD2",
+ "trainerClass": "OPP_POKEMANIAC",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROCKTUNNELB1F_HIKER2",
+ "text": "TEXT_ROCKTUNNELB1F_HIKER2",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 10
+ },
+ {
+ "name": "ROCKTUNNELB1F_COOLTRAINER_F2",
+ "text": "TEXT_ROCKTUNNELB1F_COOLTRAINER_F2",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 10
+ },
+ {
+ "name": "ROCKTUNNELB1F_HIKER3",
+ "text": "TEXT_ROCKTUNNELB1F_HIKER3",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 11
+ },
+ {
+ "name": "ROCKTUNNELB1F_SUPER_NERD3",
+ "text": "TEXT_ROCKTUNNELB1F_SUPER_NERD3",
+ "trainerClass": "OPP_POKEMANIAC",
+ "trainerParty": 5
+ }
+ ],
+ "signTexts": []
+ },
+ "ROCK_TUNNEL_POKECENTER": {
+ "blockLength": 28,
+ "label": "RockTunnelPokecenter",
+ "objects": [
+ {
+ "name": "ROCKTUNNELPOKECENTER_NURSE",
+ "text": "TEXT_ROCKTUNNELPOKECENTER_NURSE"
+ },
+ {
+ "name": "ROCKTUNNELPOKECENTER_GENTLEMAN",
+ "text": "TEXT_ROCKTUNNELPOKECENTER_GENTLEMAN"
+ },
+ {
+ "name": "ROCKTUNNELPOKECENTER_FISHER",
+ "text": "TEXT_ROCKTUNNELPOKECENTER_FISHER"
+ },
+ {
+ "name": "ROCKTUNNELPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_ROCKTUNNELPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "ROCKTUNNELPOKECENTER_CHANSEY",
+ "text": "TEXT_ROCKTUNNELPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_1": {
+ "blockLength": 180,
+ "label": "Route1",
+ "objects": [
+ {
+ "name": "ROUTE1_YOUNGSTER1",
+ "text": "TEXT_ROUTE1_YOUNGSTER1"
+ },
+ {
+ "name": "ROUTE1_YOUNGSTER2",
+ "text": "TEXT_ROUTE1_YOUNGSTER2"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE1_SIGN"
+ ]
+ },
+ "ROUTE_10": {
+ "blockLength": 360,
+ "label": "Route10",
+ "objects": [
+ {
+ "name": "ROUTE10_SUPER_NERD1",
+ "text": "TEXT_ROUTE10_SUPER_NERD1",
+ "trainerClass": "OPP_POKEMANIAC",
+ "trainerParty": 1
+ },
+ {
+ "name": "ROUTE10_HIKER1",
+ "text": "TEXT_ROUTE10_HIKER1",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE10_SUPER_NERD2",
+ "text": "TEXT_ROUTE10_SUPER_NERD2",
+ "trainerClass": "OPP_POKEMANIAC",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE10_COOLTRAINER_F1",
+ "text": "TEXT_ROUTE10_COOLTRAINER_F1",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE10_HIKER2",
+ "text": "TEXT_ROUTE10_HIKER2",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 8
+ },
+ {
+ "name": "ROUTE10_COOLTRAINER_F2",
+ "text": "TEXT_ROUTE10_COOLTRAINER_F2",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 8
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE10_ROCKTUNNEL_NORTH_SIGN",
+ "TEXT_ROUTE10_POKECENTER_SIGN",
+ "TEXT_ROUTE10_ROCKTUNNEL_SOUTH_SIGN",
+ "TEXT_ROUTE10_POWERPLANT_SIGN"
+ ]
+ },
+ "ROUTE_11": {
+ "blockLength": 270,
+ "label": "Route11",
+ "objects": [
+ {
+ "name": "ROUTE11_GAMBLER1",
+ "text": "TEXT_ROUTE11_GAMBLER1",
+ "trainerClass": "OPP_GAMBLER",
+ "trainerParty": 1
+ },
+ {
+ "name": "ROUTE11_GAMBLER2",
+ "text": "TEXT_ROUTE11_GAMBLER2",
+ "trainerClass": "OPP_GAMBLER",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE11_YOUNGSTER1",
+ "text": "TEXT_ROUTE11_YOUNGSTER1",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROUTE11_SUPER_NERD1",
+ "text": "TEXT_ROUTE11_SUPER_NERD1",
+ "trainerClass": "OPP_ENGINEER",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE11_YOUNGSTER2",
+ "text": "TEXT_ROUTE11_YOUNGSTER2",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 10
+ },
+ {
+ "name": "ROUTE11_GAMBLER3",
+ "text": "TEXT_ROUTE11_GAMBLER3",
+ "trainerClass": "OPP_GAMBLER",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROUTE11_GAMBLER4",
+ "text": "TEXT_ROUTE11_GAMBLER4",
+ "trainerClass": "OPP_GAMBLER",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROUTE11_YOUNGSTER3",
+ "text": "TEXT_ROUTE11_YOUNGSTER3",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 11
+ },
+ {
+ "name": "ROUTE11_SUPER_NERD2",
+ "text": "TEXT_ROUTE11_SUPER_NERD2",
+ "trainerClass": "OPP_ENGINEER",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROUTE11_YOUNGSTER4",
+ "text": "TEXT_ROUTE11_YOUNGSTER4",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 12
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE11_DIGLETTSCAVE_SIGN"
+ ]
+ },
+ "ROUTE_11_GATE_1F": {
+ "blockLength": 20,
+ "label": "Route11Gate1F",
+ "objects": [
+ {
+ "name": "ROUTE11GATE1F_GUARD",
+ "text": "TEXT_ROUTE11GATE1F_GUARD"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_11_GATE_2F": {
+ "blockLength": 16,
+ "label": "Route11Gate2F",
+ "objects": [
+ {
+ "name": "ROUTE11GATE2F_YOUNGSTER",
+ "text": "TEXT_ROUTE11GATE2F_YOUNGSTER"
+ },
+ {
+ "name": "ROUTE11GATE2F_OAKS_AIDE",
+ "text": "TEXT_ROUTE11GATE2F_OAKS_AIDE"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE11GATE2F_LEFT_BINOCULARS",
+ "TEXT_ROUTE11GATE2F_RIGHT_BINOCULARS"
+ ]
+ },
+ "ROUTE_12": {
+ "blockLength": 540,
+ "label": "Route12",
+ "objects": [
+ {
+ "name": "ROUTE12_SNORLAX",
+ "text": "TEXT_ROUTE12_SNORLAX"
+ },
+ {
+ "name": "ROUTE12_FISHER1",
+ "text": "TEXT_ROUTE12_FISHER1",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROUTE12_FISHER2",
+ "text": "TEXT_ROUTE12_FISHER2",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROUTE12_COOLTRAINER_M",
+ "text": "TEXT_ROUTE12_COOLTRAINER_M",
+ "trainerClass": "OPP_JR_TRAINER_M",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROUTE12_SUPER_NERD",
+ "text": "TEXT_ROUTE12_SUPER_NERD",
+ "trainerClass": "OPP_ROCKER",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE12_FISHER3",
+ "text": "TEXT_ROUTE12_FISHER3",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE12_FISHER4",
+ "text": "TEXT_ROUTE12_FISHER4",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE12_FISHER5",
+ "text": "TEXT_ROUTE12_FISHER5",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 11
+ },
+ {
+ "item": "TM_PAY_DAY",
+ "name": "ROUTE12_TM_PAY_DAY",
+ "text": "TEXT_ROUTE12_TM_PAY_DAY"
+ },
+ {
+ "item": "IRON",
+ "name": "ROUTE12_IRON",
+ "text": "TEXT_ROUTE12_IRON"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE12_SIGN",
+ "TEXT_ROUTE12_SPORT_FISHING_SIGN"
+ ]
+ },
+ "ROUTE_12_GATE_1F": {
+ "blockLength": 20,
+ "label": "Route12Gate1F",
+ "objects": [
+ {
+ "name": "ROUTE12GATE1F_GUARD",
+ "text": "TEXT_ROUTE12GATE1F_GUARD"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_12_GATE_2F": {
+ "blockLength": 16,
+ "label": "Route12Gate2F",
+ "objects": [
+ {
+ "name": "ROUTE12GATE2F_BRUNETTE_GIRL",
+ "text": "TEXT_ROUTE12GATE2F_BRUNETTE_GIRL"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE12GATE2F_LEFT_BINOCULARS",
+ "TEXT_ROUTE12GATE2F_RIGHT_BINOCULARS"
+ ]
+ },
+ "ROUTE_12_SUPER_ROD_HOUSE": {
+ "blockLength": 16,
+ "label": "Route12SuperRodHouse",
+ "objects": [
+ {
+ "name": "ROUTE12SUPERRODHOUSE_FISHING_GURU",
+ "text": "TEXT_ROUTE12SUPERRODHOUSE_FISHING_GURU"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_13": {
+ "blockLength": 270,
+ "label": "Route13",
+ "objects": [
+ {
+ "name": "ROUTE13_COOLTRAINER_M1",
+ "text": "TEXT_ROUTE13_COOLTRAINER_M1",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 1
+ },
+ {
+ "name": "ROUTE13_COOLTRAINER_F1",
+ "text": "TEXT_ROUTE13_COOLTRAINER_F1",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 12
+ },
+ {
+ "name": "ROUTE13_COOLTRAINER_F2",
+ "text": "TEXT_ROUTE13_COOLTRAINER_F2",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 13
+ },
+ {
+ "name": "ROUTE13_COOLTRAINER_F3",
+ "text": "TEXT_ROUTE13_COOLTRAINER_F3",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 14
+ },
+ {
+ "name": "ROUTE13_COOLTRAINER_F4",
+ "text": "TEXT_ROUTE13_COOLTRAINER_F4",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 15
+ },
+ {
+ "name": "ROUTE13_COOLTRAINER_M2",
+ "text": "TEXT_ROUTE13_COOLTRAINER_M2",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE13_BEAUTY1",
+ "text": "TEXT_ROUTE13_BEAUTY1",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROUTE13_BEAUTY2",
+ "text": "TEXT_ROUTE13_BEAUTY2",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE13_BIKER",
+ "text": "TEXT_ROUTE13_BIKER",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 1
+ },
+ {
+ "name": "ROUTE13_COOLTRAINER_M3",
+ "text": "TEXT_ROUTE13_COOLTRAINER_M3",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 3
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE13_TRAINER_TIPS1",
+ "TEXT_ROUTE13_TRAINER_TIPS2",
+ "TEXT_ROUTE13_SIGN"
+ ]
+ },
+ "ROUTE_14": {
+ "blockLength": 270,
+ "label": "Route14",
+ "objects": [
+ {
+ "name": "ROUTE14_COOLTRAINER_M1",
+ "text": "TEXT_ROUTE14_COOLTRAINER_M1",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 14
+ },
+ {
+ "name": "ROUTE14_COOLTRAINER_M2",
+ "text": "TEXT_ROUTE14_COOLTRAINER_M2",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 15
+ },
+ {
+ "name": "ROUTE14_COOLTRAINER_M3",
+ "text": "TEXT_ROUTE14_COOLTRAINER_M3",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 16
+ },
+ {
+ "name": "ROUTE14_COOLTRAINER_M4",
+ "text": "TEXT_ROUTE14_COOLTRAINER_M4",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 17
+ },
+ {
+ "name": "ROUTE14_COOLTRAINER_M5",
+ "text": "TEXT_ROUTE14_COOLTRAINER_M5",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROUTE14_COOLTRAINER_M6",
+ "text": "TEXT_ROUTE14_COOLTRAINER_M6",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE14_BIKER1",
+ "text": "TEXT_ROUTE14_BIKER1",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 13
+ },
+ {
+ "name": "ROUTE14_BIKER2",
+ "text": "TEXT_ROUTE14_BIKER2",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 14
+ },
+ {
+ "name": "ROUTE14_BIKER3",
+ "text": "TEXT_ROUTE14_BIKER3",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 15
+ },
+ {
+ "name": "ROUTE14_BIKER4",
+ "text": "TEXT_ROUTE14_BIKER4",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 2
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE14_SIGN"
+ ]
+ },
+ "ROUTE_15": {
+ "blockLength": 270,
+ "label": "Route15",
+ "objects": [
+ {
+ "name": "ROUTE15_COOLTRAINER_F1",
+ "text": "TEXT_ROUTE15_COOLTRAINER_F1",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 20
+ },
+ {
+ "name": "ROUTE15_COOLTRAINER_F2",
+ "text": "TEXT_ROUTE15_COOLTRAINER_F2",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 21
+ },
+ {
+ "name": "ROUTE15_COOLTRAINER_M1",
+ "text": "TEXT_ROUTE15_COOLTRAINER_M1",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE15_COOLTRAINER_M2",
+ "text": "TEXT_ROUTE15_COOLTRAINER_M2",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE15_BEAUTY1",
+ "text": "TEXT_ROUTE15_BEAUTY1",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROUTE15_BEAUTY2",
+ "text": "TEXT_ROUTE15_BEAUTY2",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 10
+ },
+ {
+ "name": "ROUTE15_BIKER1",
+ "text": "TEXT_ROUTE15_BIKER1",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROUTE15_BIKER2",
+ "text": "TEXT_ROUTE15_BIKER2",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROUTE15_COOLTRAINER_F3",
+ "text": "TEXT_ROUTE15_COOLTRAINER_F3",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 22
+ },
+ {
+ "name": "ROUTE15_COOLTRAINER_F4",
+ "text": "TEXT_ROUTE15_COOLTRAINER_F4",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 23
+ },
+ {
+ "item": "TM_RAGE",
+ "name": "ROUTE15_TM_RAGE",
+ "text": "TEXT_ROUTE15_TM_RAGE"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE15_SIGN"
+ ]
+ },
+ "ROUTE_15_GATE_1F": {
+ "blockLength": 20,
+ "label": "Route15Gate1F",
+ "objects": [
+ {
+ "name": "ROUTE15GATE1F_GUARD",
+ "text": "TEXT_ROUTE15GATE1F_GUARD"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_15_GATE_2F": {
+ "blockLength": 16,
+ "label": "Route15Gate2F",
+ "objects": [
+ {
+ "name": "ROUTE15GATE2F_OAKS_AIDE",
+ "text": "TEXT_ROUTE15GATE2F_OAKS_AIDE"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE15GATE2F_BINOCULARS"
+ ]
+ },
+ "ROUTE_16": {
+ "blockLength": 180,
+ "label": "Route16",
+ "objects": [
+ {
+ "name": "ROUTE16_BIKER1",
+ "text": "TEXT_ROUTE16_BIKER1",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE16_BIKER2",
+ "text": "TEXT_ROUTE16_BIKER2",
+ "trainerClass": "OPP_CUE_BALL",
+ "trainerParty": 1
+ },
+ {
+ "name": "ROUTE16_BIKER3",
+ "text": "TEXT_ROUTE16_BIKER3",
+ "trainerClass": "OPP_CUE_BALL",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE16_BIKER4",
+ "text": "TEXT_ROUTE16_BIKER4",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE16_BIKER5",
+ "text": "TEXT_ROUTE16_BIKER5",
+ "trainerClass": "OPP_CUE_BALL",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROUTE16_BIKER6",
+ "text": "TEXT_ROUTE16_BIKER6",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE16_SNORLAX",
+ "text": "TEXT_ROUTE16_SNORLAX"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE16_CYCLING_ROAD_SIGN",
+ "TEXT_ROUTE16_SIGN"
+ ]
+ },
+ "ROUTE_16_FLY_HOUSE": {
+ "blockLength": 16,
+ "label": "Route16FlyHouse",
+ "objects": [
+ {
+ "name": "ROUTE16FLYHOUSE_BRUNETTE_GIRL",
+ "text": "TEXT_ROUTE16FLYHOUSE_BRUNETTE_GIRL"
+ },
+ {
+ "name": "ROUTE16FLYHOUSE_FEAROW",
+ "text": "TEXT_ROUTE16FLYHOUSE_FEAROW"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_16_GATE_1F": {
+ "blockLength": 28,
+ "label": "Route16Gate1F",
+ "objects": [
+ {
+ "name": "ROUTE16GATE1F_GUARD",
+ "text": "TEXT_ROUTE16GATE1F_GUARD"
+ },
+ {
+ "name": "ROUTE16GATE1F_GAMBLER",
+ "text": "TEXT_ROUTE16GATE1F_GAMBLER"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_16_GATE_2F": {
+ "blockLength": 16,
+ "label": "Route16Gate2F",
+ "objects": [
+ {
+ "name": "ROUTE16GATE2F_LITTLE_BOY",
+ "text": "TEXT_ROUTE16GATE2F_LITTLE_BOY"
+ },
+ {
+ "name": "ROUTE16GATE2F_LITTLE_GIRL",
+ "text": "TEXT_ROUTE16GATE2F_LITTLE_GIRL"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE16GATE2F_LEFT_BINOCULARS",
+ "TEXT_ROUTE16GATE2F_RIGHT_BINOCULARS"
+ ]
+ },
+ "ROUTE_17": {
+ "blockLength": 720,
+ "label": "Route17",
+ "objects": [
+ {
+ "name": "ROUTE17_BIKER1",
+ "text": "TEXT_ROUTE17_BIKER1",
+ "trainerClass": "OPP_CUE_BALL",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROUTE17_BIKER2",
+ "text": "TEXT_ROUTE17_BIKER2",
+ "trainerClass": "OPP_CUE_BALL",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE17_BIKER3",
+ "text": "TEXT_ROUTE17_BIKER3",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 8
+ },
+ {
+ "name": "ROUTE17_BIKER4",
+ "text": "TEXT_ROUTE17_BIKER4",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROUTE17_BIKER5",
+ "text": "TEXT_ROUTE17_BIKER5",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 10
+ },
+ {
+ "name": "ROUTE17_BIKER6",
+ "text": "TEXT_ROUTE17_BIKER6",
+ "trainerClass": "OPP_CUE_BALL",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE17_BIKER7",
+ "text": "TEXT_ROUTE17_BIKER7",
+ "trainerClass": "OPP_CUE_BALL",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE17_BIKER8",
+ "text": "TEXT_ROUTE17_BIKER8",
+ "trainerClass": "OPP_CUE_BALL",
+ "trainerParty": 8
+ },
+ {
+ "name": "ROUTE17_BIKER9",
+ "text": "TEXT_ROUTE17_BIKER9",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 11
+ },
+ {
+ "name": "ROUTE17_BIKER10",
+ "text": "TEXT_ROUTE17_BIKER10",
+ "trainerClass": "OPP_BIKER",
+ "trainerParty": 12
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE17_NOTICE_SIGN1",
+ "TEXT_ROUTE17_TRAINER_TIPS1",
+ "TEXT_ROUTE17_TRAINER_TIPS2",
+ "TEXT_ROUTE17_SIGN",
+ "TEXT_ROUTE17_NOTICE_SIGN2",
+ "TEXT_ROUTE17_CYCLING_ROAD_ENDS_SIGN"
+ ]
+ },
+ "ROUTE_18": {
+ "blockLength": 225,
+ "label": "Route18",
+ "objects": [
+ {
+ "name": "ROUTE18_COOLTRAINER_M1",
+ "text": "TEXT_ROUTE18_COOLTRAINER_M1",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 8
+ },
+ {
+ "name": "ROUTE18_COOLTRAINER_M2",
+ "text": "TEXT_ROUTE18_COOLTRAINER_M2",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROUTE18_COOLTRAINER_M3",
+ "text": "TEXT_ROUTE18_COOLTRAINER_M3",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 10
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE18_SIGN",
+ "TEXT_ROUTE18_CYCLING_ROAD_SIGN"
+ ]
+ },
+ "ROUTE_18_GATE_1F": {
+ "blockLength": 20,
+ "label": "Route18Gate1F",
+ "objects": [
+ {
+ "name": "ROUTE18GATE1F_GUARD",
+ "text": "TEXT_ROUTE18GATE1F_GUARD"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_18_GATE_2F": {
+ "blockLength": 16,
+ "label": "Route18Gate2F",
+ "objects": [
+ {
+ "name": "ROUTE18GATE2F_COOK",
+ "text": "TEXT_ROUTE18GATE2F_COOK"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE18GATE2F_LEFT_BINOCULARS",
+ "TEXT_ROUTE18GATE2F_RIGHT_BINOCULARS"
+ ]
+ },
+ "ROUTE_19": {
+ "blockLength": 270,
+ "label": "Route19",
+ "objects": [
+ {
+ "name": "ROUTE19_COOLTRAINER_M1",
+ "text": "TEXT_ROUTE19_COOLTRAINER_M1",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE19_COOLTRAINER_M2",
+ "text": "TEXT_ROUTE19_COOLTRAINER_M2",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROUTE19_SWIMMER1",
+ "text": "TEXT_ROUTE19_SWIMMER1",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROUTE19_SWIMMER2",
+ "text": "TEXT_ROUTE19_SWIMMER2",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE19_SWIMMER3",
+ "text": "TEXT_ROUTE19_SWIMMER3",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE19_SWIMMER4",
+ "text": "TEXT_ROUTE19_SWIMMER4",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE19_SWIMMER5",
+ "text": "TEXT_ROUTE19_SWIMMER5",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 12
+ },
+ {
+ "name": "ROUTE19_SWIMMER6",
+ "text": "TEXT_ROUTE19_SWIMMER6",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 13
+ },
+ {
+ "name": "ROUTE19_SWIMMER7",
+ "text": "TEXT_ROUTE19_SWIMMER7",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 8
+ },
+ {
+ "name": "ROUTE19_SWIMMER8",
+ "text": "TEXT_ROUTE19_SWIMMER8",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 14
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE19_SIGN"
+ ]
+ },
+ "ROUTE_2": {
+ "blockLength": 360,
+ "label": "Route2",
+ "objects": [
+ {
+ "item": "MOON_STONE",
+ "name": "ROUTE2_MOON_STONE",
+ "text": "TEXT_ROUTE2_MOON_STONE"
+ },
+ {
+ "item": "HP_UP",
+ "name": "ROUTE2_HP_UP",
+ "text": "TEXT_ROUTE2_HP_UP"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE2_SIGN",
+ "TEXT_ROUTE2_DIGLETTS_CAVE_SIGN"
+ ]
+ },
+ "ROUTE_20": {
+ "blockLength": 450,
+ "label": "Route20",
+ "objects": [
+ {
+ "name": "ROUTE20_SWIMMER1",
+ "text": "TEXT_ROUTE20_SWIMMER1",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROUTE20_SWIMMER2",
+ "text": "TEXT_ROUTE20_SWIMMER2",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 15
+ },
+ {
+ "name": "ROUTE20_SWIMMER3",
+ "text": "TEXT_ROUTE20_SWIMMER3",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE20_SWIMMER4",
+ "text": "TEXT_ROUTE20_SWIMMER4",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 24
+ },
+ {
+ "name": "ROUTE20_SWIMMER5",
+ "text": "TEXT_ROUTE20_SWIMMER5",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 10
+ },
+ {
+ "name": "ROUTE20_SWIMMER6",
+ "text": "TEXT_ROUTE20_SWIMMER6",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 11
+ },
+ {
+ "name": "ROUTE20_COOLTRAINER_M",
+ "text": "TEXT_ROUTE20_COOLTRAINER_M",
+ "trainerClass": "OPP_BIRD_KEEPER",
+ "trainerParty": 11
+ },
+ {
+ "name": "ROUTE20_SWIMMER7",
+ "text": "TEXT_ROUTE20_SWIMMER7",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE20_SWIMMER8",
+ "text": "TEXT_ROUTE20_SWIMMER8",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 16
+ },
+ {
+ "name": "ROUTE20_SWIMMER9",
+ "text": "TEXT_ROUTE20_SWIMMER9",
+ "trainerClass": "OPP_BEAUTY",
+ "trainerParty": 8
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE20_SEAFOAM_ISLANDS_WEST_SIGN",
+ "TEXT_ROUTE20_SEAFOAM_ISLANDS_EAST_SIGN"
+ ]
+ },
+ "ROUTE_21": {
+ "blockLength": 450,
+ "label": "Route21",
+ "objects": [
+ {
+ "name": "ROUTE21_FISHER1",
+ "text": "TEXT_ROUTE21_FISHER1",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE21_FISHER2",
+ "text": "TEXT_ROUTE21_FISHER2",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROUTE21_SWIMMER1",
+ "text": "TEXT_ROUTE21_SWIMMER1",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 12
+ },
+ {
+ "name": "ROUTE21_SWIMMER2",
+ "text": "TEXT_ROUTE21_SWIMMER2",
+ "trainerClass": "OPP_CUE_BALL",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROUTE21_SWIMMER3",
+ "text": "TEXT_ROUTE21_SWIMMER3",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 13
+ },
+ {
+ "name": "ROUTE21_SWIMMER4",
+ "text": "TEXT_ROUTE21_SWIMMER4",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 14
+ },
+ {
+ "name": "ROUTE21_SWIMMER5",
+ "text": "TEXT_ROUTE21_SWIMMER5",
+ "trainerClass": "OPP_SWIMMER",
+ "trainerParty": 15
+ },
+ {
+ "name": "ROUTE21_FISHER3",
+ "text": "TEXT_ROUTE21_FISHER3",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 8
+ },
+ {
+ "name": "ROUTE21_FISHER4",
+ "text": "TEXT_ROUTE21_FISHER4",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 10
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_22": {
+ "blockLength": 180,
+ "label": "Route22",
+ "objects": [
+ {
+ "hidden": true,
+ "name": "ROUTE22_RIVAL1",
+ "text": "TEXT_ROUTE22_RIVAL1"
+ },
+ {
+ "hidden": true,
+ "name": "ROUTE22_RIVAL2",
+ "text": "TEXT_ROUTE22_RIVAL2"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE22_POKEMON_LEAGUE_SIGN"
+ ]
+ },
+ "ROUTE_22_GATE": {
+ "blockLength": 20,
+ "label": "Route22Gate",
+ "objects": [
+ {
+ "name": "ROUTE22GATE_GUARD",
+ "text": "TEXT_ROUTE22GATE_GUARD"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_23": {
+ "blockLength": 720,
+ "label": "Route23",
+ "objects": [
+ {
+ "name": "ROUTE23_GUARD1",
+ "text": "TEXT_ROUTE23_GUARD1"
+ },
+ {
+ "name": "ROUTE23_GUARD2",
+ "text": "TEXT_ROUTE23_GUARD2"
+ },
+ {
+ "name": "ROUTE23_SWIMMER1",
+ "text": "TEXT_ROUTE23_SWIMMER1"
+ },
+ {
+ "name": "ROUTE23_SWIMMER2",
+ "text": "TEXT_ROUTE23_SWIMMER2"
+ },
+ {
+ "name": "ROUTE23_GUARD3",
+ "text": "TEXT_ROUTE23_GUARD3"
+ },
+ {
+ "name": "ROUTE23_GUARD4",
+ "text": "TEXT_ROUTE23_GUARD4"
+ },
+ {
+ "name": "ROUTE23_GUARD5",
+ "text": "TEXT_ROUTE23_GUARD5"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE23_VICTORY_ROAD_GATE_SIGN"
+ ]
+ },
+ "ROUTE_24": {
+ "blockLength": 180,
+ "label": "Route24",
+ "objects": [
+ {
+ "name": "ROUTE24_COOLTRAINER_M1",
+ "text": "TEXT_ROUTE24_COOLTRAINER_M1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE24_COOLTRAINER_M2",
+ "text": "TEXT_ROUTE24_COOLTRAINER_M2",
+ "trainerClass": "OPP_JR_TRAINER_M",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE24_COOLTRAINER_M3",
+ "text": "TEXT_ROUTE24_COOLTRAINER_M3",
+ "trainerClass": "OPP_JR_TRAINER_M",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROUTE24_COOLTRAINER_F1",
+ "text": "TEXT_ROUTE24_COOLTRAINER_F1",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE24_YOUNGSTER1",
+ "text": "TEXT_ROUTE24_YOUNGSTER1",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROUTE24_COOLTRAINER_F2",
+ "text": "TEXT_ROUTE24_COOLTRAINER_F2",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 8
+ },
+ {
+ "name": "ROUTE24_YOUNGSTER2",
+ "text": "TEXT_ROUTE24_YOUNGSTER2",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 9
+ },
+ {
+ "item": "TM_THUNDER_WAVE",
+ "name": "ROUTE24_TM_THUNDER_WAVE",
+ "text": "TEXT_ROUTE24_TM_THUNDER_WAVE"
+ },
+ {
+ "name": "ROUTE24_COOLTRAINER_M4",
+ "text": "TEXT_ROUTE24_COOLTRAINER_M4"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_25": {
+ "blockLength": 270,
+ "label": "Route25",
+ "objects": [
+ {
+ "name": "ROUTE25_YOUNGSTER1",
+ "text": "TEXT_ROUTE25_YOUNGSTER1",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE25_YOUNGSTER2",
+ "text": "TEXT_ROUTE25_YOUNGSTER2",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE25_COOLTRAINER_M",
+ "text": "TEXT_ROUTE25_COOLTRAINER_M",
+ "trainerClass": "OPP_JR_TRAINER_M",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE25_COOLTRAINER_F1",
+ "text": "TEXT_ROUTE25_COOLTRAINER_F1",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 9
+ },
+ {
+ "name": "ROUTE25_YOUNGSTER3",
+ "text": "TEXT_ROUTE25_YOUNGSTER3",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE25_COOLTRAINER_F2",
+ "text": "TEXT_ROUTE25_COOLTRAINER_F2",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 10
+ },
+ {
+ "name": "ROUTE25_HIKER1",
+ "text": "TEXT_ROUTE25_HIKER1",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE25_HIKER2",
+ "text": "TEXT_ROUTE25_HIKER2",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROUTE25_HIKER3",
+ "text": "TEXT_ROUTE25_HIKER3",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 4
+ },
+ {
+ "item": "TM_SEISMIC_TOSS",
+ "name": "ROUTE25_TM_SEISMIC_TOSS",
+ "text": "TEXT_ROUTE25_TM_SEISMIC_TOSS"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE25_BILL_SIGN"
+ ]
+ },
+ "ROUTE_2_GATE": {
+ "blockLength": 20,
+ "label": "Route2Gate",
+ "objects": [
+ {
+ "name": "ROUTE2GATE_OAKS_AIDE",
+ "text": "TEXT_ROUTE2GATE_OAKS_AIDE"
+ },
+ {
+ "name": "ROUTE2GATE_YOUNGSTER",
+ "text": "TEXT_ROUTE2GATE_YOUNGSTER"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_2_TRADE_HOUSE": {
+ "blockLength": 16,
+ "label": "Route2TradeHouse",
+ "objects": [
+ {
+ "name": "ROUTE2TRADEHOUSE_SCIENTIST",
+ "text": "TEXT_ROUTE2TRADEHOUSE_SCIENTIST"
+ },
+ {
+ "name": "ROUTE2TRADEHOUSE_GAMEBOY_KID",
+ "text": "TEXT_ROUTE2TRADEHOUSE_GAMEBOY_KID"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_3": {
+ "blockLength": 315,
+ "label": "Route3",
+ "objects": [
+ {
+ "name": "ROUTE3_SUPER_NERD",
+ "text": "TEXT_ROUTE3_SUPER_NERD"
+ },
+ {
+ "name": "ROUTE3_YOUNGSTER1",
+ "text": "TEXT_ROUTE3_YOUNGSTER1",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROUTE3_YOUNGSTER2",
+ "text": "TEXT_ROUTE3_YOUNGSTER2",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 1
+ },
+ {
+ "name": "ROUTE3_COOLTRAINER_F1",
+ "text": "TEXT_ROUTE3_COOLTRAINER_F1",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 1
+ },
+ {
+ "name": "ROUTE3_YOUNGSTER3",
+ "text": "TEXT_ROUTE3_YOUNGSTER3",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE3_COOLTRAINER_F2",
+ "text": "TEXT_ROUTE3_COOLTRAINER_F2",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE3_YOUNGSTER4",
+ "text": "TEXT_ROUTE3_YOUNGSTER4",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 2
+ },
+ {
+ "name": "ROUTE3_YOUNGSTER5",
+ "text": "TEXT_ROUTE3_YOUNGSTER5",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE3_COOLTRAINER_F3",
+ "text": "TEXT_ROUTE3_COOLTRAINER_F3",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 3
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE3_SIGN"
+ ]
+ },
+ "ROUTE_4": {
+ "blockLength": 405,
+ "label": "Route4",
+ "objects": [
+ {
+ "name": "ROUTE4_COOLTRAINER_F1",
+ "text": "TEXT_ROUTE4_COOLTRAINER_F1"
+ },
+ {
+ "name": "ROUTE4_COOLTRAINER_F2",
+ "text": "TEXT_ROUTE4_COOLTRAINER_F2",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 4
+ },
+ {
+ "item": "TM_WHIRLWIND",
+ "name": "ROUTE4_TM_WHIRLWIND",
+ "text": "TEXT_ROUTE4_TM_WHIRLWIND"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE4_POKECENTER_SIGN",
+ "TEXT_ROUTE4_MT_MOON_SIGN",
+ "TEXT_ROUTE4_SIGN"
+ ]
+ },
+ "ROUTE_5": {
+ "blockLength": 180,
+ "label": "Route5",
+ "objects": [],
+ "signTexts": [
+ "TEXT_ROUTE5_UNDERGROUND_PATH_SIGN"
+ ]
+ },
+ "ROUTE_5_GATE": {
+ "blockLength": 12,
+ "label": "Route5Gate",
+ "objects": [
+ {
+ "name": "ROUTE5GATE_GUARD",
+ "text": "TEXT_ROUTE5GATE_GUARD"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_6": {
+ "blockLength": 180,
+ "label": "Route6",
+ "objects": [
+ {
+ "name": "ROUTE6_COOLTRAINER_M1",
+ "text": "TEXT_ROUTE6_COOLTRAINER_M1",
+ "trainerClass": "OPP_JR_TRAINER_M",
+ "trainerParty": 10
+ },
+ {
+ "name": "ROUTE6_COOLTRAINER_F1",
+ "text": "TEXT_ROUTE6_COOLTRAINER_F1",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 25
+ },
+ {
+ "name": "ROUTE6_YOUNGSTER1",
+ "text": "TEXT_ROUTE6_YOUNGSTER1",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 10
+ },
+ {
+ "name": "ROUTE6_COOLTRAINER_M2",
+ "text": "TEXT_ROUTE6_COOLTRAINER_M2",
+ "trainerClass": "OPP_JR_TRAINER_M",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE6_COOLTRAINER_F2",
+ "text": "TEXT_ROUTE6_COOLTRAINER_F2",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROUTE6_YOUNGSTER2",
+ "text": "TEXT_ROUTE6_YOUNGSTER2",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 11
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE6_UNDERGROUND_PATH_SIGN"
+ ]
+ },
+ "ROUTE_6_GATE": {
+ "blockLength": 12,
+ "label": "Route6Gate",
+ "objects": [
+ {
+ "name": "ROUTE6GATE_GUARD",
+ "text": "TEXT_ROUTE6GATE_GUARD"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_7": {
+ "blockLength": 90,
+ "label": "Route7",
+ "objects": [],
+ "signTexts": [
+ "TEXT_ROUTE7_UNDERGROUND_PATH_SIGN"
+ ]
+ },
+ "ROUTE_7_GATE": {
+ "blockLength": 12,
+ "label": "Route7Gate",
+ "objects": [
+ {
+ "name": "ROUTE7GATE_GUARD",
+ "text": "TEXT_ROUTE7GATE_GUARD"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_8": {
+ "blockLength": 270,
+ "label": "Route8",
+ "objects": [
+ {
+ "name": "ROUTE8_SUPER_NERD1",
+ "text": "TEXT_ROUTE8_SUPER_NERD1",
+ "trainerClass": "OPP_SUPER_NERD",
+ "trainerParty": 3
+ },
+ {
+ "name": "ROUTE8_GAMBLER1",
+ "text": "TEXT_ROUTE8_GAMBLER1",
+ "trainerClass": "OPP_GAMBLER",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE8_SUPER_NERD2",
+ "text": "TEXT_ROUTE8_SUPER_NERD2",
+ "trainerClass": "OPP_SUPER_NERD",
+ "trainerParty": 4
+ },
+ {
+ "name": "ROUTE8_COOLTRAINER_F1",
+ "text": "TEXT_ROUTE8_COOLTRAINER_F1",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 13
+ },
+ {
+ "name": "ROUTE8_SUPER_NERD3",
+ "text": "TEXT_ROUTE8_SUPER_NERD3",
+ "trainerClass": "OPP_SUPER_NERD",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE8_COOLTRAINER_F2",
+ "text": "TEXT_ROUTE8_COOLTRAINER_F2",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 14
+ },
+ {
+ "name": "ROUTE8_COOLTRAINER_F3",
+ "text": "TEXT_ROUTE8_COOLTRAINER_F3",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 15
+ },
+ {
+ "name": "ROUTE8_GAMBLER2",
+ "text": "TEXT_ROUTE8_GAMBLER2",
+ "trainerClass": "OPP_GAMBLER",
+ "trainerParty": 7
+ },
+ {
+ "name": "ROUTE8_COOLTRAINER_F4",
+ "text": "TEXT_ROUTE8_COOLTRAINER_F4",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 16
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE8_UNDERGROUND_SIGN"
+ ]
+ },
+ "ROUTE_8_GATE": {
+ "blockLength": 12,
+ "label": "Route8Gate",
+ "objects": [
+ {
+ "name": "ROUTE8GATE_GUARD",
+ "text": "TEXT_ROUTE8GATE_GUARD"
+ }
+ ],
+ "signTexts": []
+ },
+ "ROUTE_9": {
+ "blockLength": 270,
+ "label": "Route9",
+ "objects": [
+ {
+ "name": "ROUTE9_COOLTRAINER_F1",
+ "text": "TEXT_ROUTE9_COOLTRAINER_F1",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE9_COOLTRAINER_M1",
+ "text": "TEXT_ROUTE9_COOLTRAINER_M1",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 14
+ },
+ {
+ "name": "ROUTE9_COOLTRAINER_M2",
+ "text": "TEXT_ROUTE9_COOLTRAINER_M2",
+ "trainerClass": "OPP_JR_TRAINER_M",
+ "trainerParty": 8
+ },
+ {
+ "name": "ROUTE9_COOLTRAINER_F2",
+ "text": "TEXT_ROUTE9_COOLTRAINER_F2",
+ "trainerClass": "OPP_JR_TRAINER_F",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE9_HIKER1",
+ "text": "TEXT_ROUTE9_HIKER1",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 11
+ },
+ {
+ "name": "ROUTE9_HIKER2",
+ "text": "TEXT_ROUTE9_HIKER2",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 6
+ },
+ {
+ "name": "ROUTE9_YOUNGSTER1",
+ "text": "TEXT_ROUTE9_YOUNGSTER1",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 13
+ },
+ {
+ "name": "ROUTE9_HIKER3",
+ "text": "TEXT_ROUTE9_HIKER3",
+ "trainerClass": "OPP_HIKER",
+ "trainerParty": 5
+ },
+ {
+ "name": "ROUTE9_YOUNGSTER2",
+ "text": "TEXT_ROUTE9_YOUNGSTER2",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 14
+ },
+ {
+ "item": "TM_TELEPORT",
+ "name": "ROUTE9_TM_TELEPORT",
+ "text": "TEXT_ROUTE9_TM_TELEPORT"
+ }
+ ],
+ "signTexts": [
+ "TEXT_ROUTE9_SIGN"
+ ]
+ },
+ "SAFARI_ZONE_CENTER": {
+ "blockLength": 195,
+ "label": "SafariZoneCenter",
+ "objects": [
+ {
+ "item": "NUGGET",
+ "name": "SAFARIZONECENTER_NUGGET",
+ "text": "TEXT_SAFARIZONECENTER_NUGGET"
+ }
+ ],
+ "signTexts": [
+ "TEXT_SAFARIZONECENTER_REST_HOUSE_SIGN",
+ "TEXT_SAFARIZONECENTER_TRAINER_TIPS_SIGN"
+ ]
+ },
+ "SAFARI_ZONE_CENTER_REST_HOUSE": {
+ "blockLength": 16,
+ "label": "SafariZoneCenterRestHouse",
+ "objects": [
+ {
+ "name": "SAFARIZONECENTERRESTHOUSE_GIRL",
+ "text": "TEXT_SAFARIZONECENTERRESTHOUSE_GIRL"
+ },
+ {
+ "name": "SAFARIZONECENTERRESTHOUSE_SCIENTIST",
+ "text": "TEXT_SAFARIZONECENTERRESTHOUSE_SCIENTIST"
+ }
+ ],
+ "signTexts": []
+ },
+ "SAFARI_ZONE_EAST": {
+ "blockLength": 195,
+ "label": "SafariZoneEast",
+ "objects": [
+ {
+ "item": "FULL_RESTORE",
+ "name": "SAFARIZONEEAST_FULL_RESTORE",
+ "text": "TEXT_SAFARIZONEEAST_FULL_RESTORE"
+ },
+ {
+ "item": "MAX_POTION",
+ "name": "SAFARIZONEEAST_MAX_RESTORE",
+ "text": "TEXT_SAFARIZONEEAST_MAX_RESTORE"
+ },
+ {
+ "item": "CARBOS",
+ "name": "SAFARIZONEEAST_CARBOS",
+ "text": "TEXT_SAFARIZONEEAST_CARBOS"
+ },
+ {
+ "item": "TM_EGG_BOMB",
+ "name": "SAFARIZONEEAST_TM_EGG_BOMB",
+ "text": "TEXT_SAFARIZONEEAST_TM_EGG_BOMB"
+ }
+ ],
+ "signTexts": [
+ "TEXT_SAFARIZONEEAST_REST_HOUSE_SIGN",
+ "TEXT_SAFARIZONEEAST_TRAINER_TIPS",
+ "TEXT_SAFARIZONEEAST_SIGN"
+ ]
+ },
+ "SAFARI_ZONE_EAST_REST_HOUSE": {
+ "blockLength": 16,
+ "label": "SafariZoneEastRestHouse",
+ "objects": [
+ {
+ "name": "SAFARIZONEEASTRESTHOUSE_SCIENTIST",
+ "text": "TEXT_SAFARIZONEEASTRESTHOUSE_SCIENTIST"
+ },
+ {
+ "name": "SAFARIZONEEASTRESTHOUSE_ROCKER",
+ "text": "TEXT_SAFARIZONEEASTRESTHOUSE_ROCKER"
+ },
+ {
+ "name": "SAFARIZONEEASTRESTHOUSE_SILPH_WORKER_M",
+ "text": "TEXT_SAFARIZONEEASTRESTHOUSE_SILPH_WORKER_M"
+ }
+ ],
+ "signTexts": []
+ },
+ "SAFARI_ZONE_GATE": {
+ "blockLength": 12,
+ "label": "SafariZoneGate",
+ "objects": [
+ {
+ "name": "SAFARIZONEGATE_SAFARI_ZONE_WORKER1",
+ "text": "TEXT_SAFARIZONEGATE_SAFARI_ZONE_WORKER1"
+ },
+ {
+ "name": "SAFARIZONEGATE_SAFARI_ZONE_WORKER2",
+ "text": "TEXT_SAFARIZONEGATE_SAFARI_ZONE_WORKER2"
+ }
+ ],
+ "signTexts": []
+ },
+ "SAFARI_ZONE_NORTH": {
+ "blockLength": 360,
+ "label": "SafariZoneNorth",
+ "objects": [
+ {
+ "item": "PROTEIN",
+ "name": "SAFARIZONENORTH_PROTEIN",
+ "text": "TEXT_SAFARIZONENORTH_PROTEIN"
+ },
+ {
+ "item": "TM_SKULL_BASH",
+ "name": "SAFARIZONENORTH_TM_SKULL_BASH",
+ "text": "TEXT_SAFARIZONENORTH_TM_SKULL_BASH"
+ }
+ ],
+ "signTexts": [
+ "TEXT_SAFARIZONENORTH_REST_HOUSE_SIGN",
+ "TEXT_SAFARIZONENORTH_TRAINER_TIPS_1",
+ "TEXT_SAFARIZONENORTH_SIGN",
+ "TEXT_SAFARIZONENORTH_TRAINER_TIPS_2",
+ "TEXT_SAFARIZONENORTH_TRAINER_TIPS_3"
+ ]
+ },
+ "SAFARI_ZONE_NORTH_REST_HOUSE": {
+ "blockLength": 16,
+ "label": "SafariZoneNorthRestHouse",
+ "objects": [
+ {
+ "name": "SAFARIZONENORTHRESTHOUSE_SCIENTIST",
+ "text": "TEXT_SAFARIZONENORTHRESTHOUSE_SCIENTIST"
+ },
+ {
+ "name": "SAFARIZONENORTHRESTHOUSE_SAFARI_ZONE_WORKER",
+ "text": "TEXT_SAFARIZONENORTHRESTHOUSE_SAFARI_ZONE_WORKER"
+ },
+ {
+ "name": "SAFARIZONENORTHRESTHOUSE_GENTLEMAN",
+ "text": "TEXT_SAFARIZONENORTHRESTHOUSE_GENTLEMAN"
+ }
+ ],
+ "signTexts": []
+ },
+ "SAFARI_ZONE_SECRET_HOUSE": {
+ "blockLength": 16,
+ "label": "SafariZoneSecretHouse",
+ "objects": [
+ {
+ "name": "SAFARIZONESECRETHOUSE_FISHING_GURU",
+ "text": "TEXT_SAFARIZONESECRETHOUSE_FISHING_GURU"
+ }
+ ],
+ "signTexts": []
+ },
+ "SAFARI_ZONE_WEST": {
+ "blockLength": 195,
+ "label": "SafariZoneWest",
+ "objects": [
+ {
+ "item": "MAX_POTION",
+ "name": "SAFARIZONEWEST_MAX_POTION",
+ "text": "TEXT_SAFARIZONEWEST_MAX_POTION"
+ },
+ {
+ "item": "TM_DOUBLE_TEAM",
+ "name": "SAFARIZONEWEST_TM_DOUBLE_TEAM",
+ "text": "TEXT_SAFARIZONEWEST_TM_DOUBLE_TEAM"
+ },
+ {
+ "item": "MAX_REVIVE",
+ "name": "SAFARIZONEWEST_MAX_REVIVE",
+ "text": "TEXT_SAFARIZONEWEST_MAX_REVIVE"
+ },
+ {
+ "item": "GOLD_TEETH",
+ "name": "SAFARIZONEWEST_GOLD_TEETH",
+ "text": "TEXT_SAFARIZONEWEST_GOLD_TEETH"
+ }
+ ],
+ "signTexts": [
+ "TEXT_SAFARIZONEWEST_REST_HOUSE_SIGN",
+ "TEXT_SAFARIZONEWEST_FIND_WARDENS_TEETH_SIGN",
+ "TEXT_SAFARIZONEWEST_TRAINER_TIPS",
+ "TEXT_SAFARIZONEWEST_SIGN"
+ ]
+ },
+ "SAFARI_ZONE_WEST_REST_HOUSE": {
+ "blockLength": 16,
+ "label": "SafariZoneWestRestHouse",
+ "objects": [
+ {
+ "name": "SAFARIZONEWESTRESTHOUSE_SCIENTIST",
+ "text": "TEXT_SAFARIZONEWESTRESTHOUSE_SCIENTIST"
+ },
+ {
+ "name": "SAFARIZONEWESTRESTHOUSE_COOLTRAINER_M",
+ "text": "TEXT_SAFARIZONEWESTRESTHOUSE_COOLTRAINER_M"
+ },
+ {
+ "name": "SAFARIZONEWESTRESTHOUSE_SILPH_WORKER_F",
+ "text": "TEXT_SAFARIZONEWESTRESTHOUSE_SILPH_WORKER_F"
+ }
+ ],
+ "signTexts": []
+ },
+ "SAFFRON_CITY": {
+ "blockLength": 360,
+ "label": "SaffronCity",
+ "objects": [
+ {
+ "name": "SAFFRONCITY_ROCKET1",
+ "text": "TEXT_SAFFRONCITY_ROCKET1"
+ },
+ {
+ "name": "SAFFRONCITY_ROCKET2",
+ "text": "TEXT_SAFFRONCITY_ROCKET2"
+ },
+ {
+ "name": "SAFFRONCITY_ROCKET3",
+ "text": "TEXT_SAFFRONCITY_ROCKET3"
+ },
+ {
+ "name": "SAFFRONCITY_ROCKET4",
+ "text": "TEXT_SAFFRONCITY_ROCKET4"
+ },
+ {
+ "name": "SAFFRONCITY_ROCKET5",
+ "text": "TEXT_SAFFRONCITY_ROCKET5"
+ },
+ {
+ "name": "SAFFRONCITY_ROCKET6",
+ "text": "TEXT_SAFFRONCITY_ROCKET6"
+ },
+ {
+ "name": "SAFFRONCITY_ROCKET7",
+ "text": "TEXT_SAFFRONCITY_ROCKET7"
+ },
+ {
+ "hidden": true,
+ "name": "SAFFRONCITY_SCIENTIST",
+ "text": "TEXT_SAFFRONCITY_SCIENTIST"
+ },
+ {
+ "hidden": true,
+ "name": "SAFFRONCITY_SILPH_WORKER_M",
+ "text": "TEXT_SAFFRONCITY_SILPH_WORKER_M"
+ },
+ {
+ "hidden": true,
+ "name": "SAFFRONCITY_SILPH_WORKER_F",
+ "text": "TEXT_SAFFRONCITY_SILPH_WORKER_F"
+ },
+ {
+ "hidden": true,
+ "name": "SAFFRONCITY_GENTLEMAN",
+ "text": "TEXT_SAFFRONCITY_GENTLEMAN"
+ },
+ {
+ "hidden": true,
+ "name": "SAFFRONCITY_PIDGEOT",
+ "text": "TEXT_SAFFRONCITY_PIDGEOT"
+ },
+ {
+ "hidden": true,
+ "name": "SAFFRONCITY_ROCKER",
+ "text": "TEXT_SAFFRONCITY_ROCKER"
+ },
+ {
+ "name": "SAFFRONCITY_ROCKET8",
+ "text": "TEXT_SAFFRONCITY_ROCKET8"
+ }
+ ],
+ "signTexts": [
+ "TEXT_SAFFRONCITY_SIGN",
+ "TEXT_SAFFRONCITY_FIGHTING_DOJO_SIGN",
+ "TEXT_SAFFRONCITY_GYM_SIGN",
+ "TEXT_SAFFRONCITY_MART_SIGN",
+ "TEXT_SAFFRONCITY_TRAINER_TIPS1",
+ "TEXT_SAFFRONCITY_TRAINER_TIPS2",
+ "TEXT_SAFFRONCITY_SILPH_CO_SIGN",
+ "TEXT_SAFFRONCITY_POKECENTER_SIGN",
+ "TEXT_SAFFRONCITY_MR_PSYCHICS_HOUSE_SIGN",
+ "TEXT_SAFFRONCITY_SILPH_CO_LATEST_PRODUCT_SIGN"
+ ]
+ },
+ "SAFFRON_GYM": {
+ "blockLength": 90,
+ "label": "SaffronGym",
+ "objects": [
+ {
+ "name": "SAFFRONGYM_SABRINA",
+ "text": "TEXT_SAFFRONGYM_SABRINA",
+ "trainerClass": "OPP_SABRINA",
+ "trainerParty": 1
+ },
+ {
+ "name": "SAFFRONGYM_CHANNELER1",
+ "text": "TEXT_SAFFRONGYM_CHANNELER1",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 22
+ },
+ {
+ "name": "SAFFRONGYM_YOUNGSTER1",
+ "text": "TEXT_SAFFRONGYM_YOUNGSTER1",
+ "trainerClass": "OPP_PSYCHIC_TR",
+ "trainerParty": 1
+ },
+ {
+ "name": "SAFFRONGYM_CHANNELER2",
+ "text": "TEXT_SAFFRONGYM_CHANNELER2",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 23
+ },
+ {
+ "name": "SAFFRONGYM_YOUNGSTER2",
+ "text": "TEXT_SAFFRONGYM_YOUNGSTER2",
+ "trainerClass": "OPP_PSYCHIC_TR",
+ "trainerParty": 2
+ },
+ {
+ "name": "SAFFRONGYM_CHANNELER3",
+ "text": "TEXT_SAFFRONGYM_CHANNELER3",
+ "trainerClass": "OPP_CHANNELER",
+ "trainerParty": 24
+ },
+ {
+ "name": "SAFFRONGYM_YOUNGSTER3",
+ "text": "TEXT_SAFFRONGYM_YOUNGSTER3",
+ "trainerClass": "OPP_PSYCHIC_TR",
+ "trainerParty": 3
+ },
+ {
+ "name": "SAFFRONGYM_YOUNGSTER4",
+ "text": "TEXT_SAFFRONGYM_YOUNGSTER4",
+ "trainerClass": "OPP_PSYCHIC_TR",
+ "trainerParty": 4
+ },
+ {
+ "name": "SAFFRONGYM_GYM_GUIDE",
+ "text": "TEXT_SAFFRONGYM_GYM_GUIDE"
+ }
+ ],
+ "signTexts": []
+ },
+ "SAFFRON_MART": {
+ "blockLength": 16,
+ "label": "SaffronMart",
+ "objects": [
+ {
+ "name": "SAFFRONMART_CLERK",
+ "text": "TEXT_SAFFRONMART_CLERK"
+ },
+ {
+ "name": "SAFFRONMART_SUPER_NERD",
+ "text": "TEXT_SAFFRONMART_SUPER_NERD"
+ },
+ {
+ "name": "SAFFRONMART_COOLTRAINER_F",
+ "text": "TEXT_SAFFRONMART_COOLTRAINER_F"
+ }
+ ],
+ "signTexts": []
+ },
+ "SAFFRON_PIDGEY_HOUSE": {
+ "blockLength": 16,
+ "label": "SaffronPidgeyHouse",
+ "objects": [
+ {
+ "name": "SAFFRONPIDGEYHOUSE_BRUNETTE_GIRL",
+ "text": "TEXT_SAFFRONPIDGEYHOUSE_BRUNETTE_GIRL"
+ },
+ {
+ "name": "SAFFRONPIDGEYHOUSE_PIDGEY",
+ "text": "TEXT_SAFFRONPIDGEYHOUSE_PIDGEY"
+ },
+ {
+ "name": "SAFFRONPIDGEYHOUSE_YOUNGSTER",
+ "text": "TEXT_SAFFRONPIDGEYHOUSE_YOUNGSTER"
+ },
+ {
+ "name": "SAFFRONPIDGEYHOUSE_PAPER",
+ "text": "TEXT_SAFFRONPIDGEYHOUSE_PAPER"
+ }
+ ],
+ "signTexts": []
+ },
+ "SAFFRON_POKECENTER": {
+ "blockLength": 28,
+ "label": "SaffronPokecenter",
+ "objects": [
+ {
+ "name": "SAFFRONPOKECENTER_NURSE",
+ "text": "TEXT_SAFFRONPOKECENTER_NURSE"
+ },
+ {
+ "name": "SAFFRONPOKECENTER_BEAUTY",
+ "text": "TEXT_SAFFRONPOKECENTER_BEAUTY"
+ },
+ {
+ "name": "SAFFRONPOKECENTER_GENTLEMAN",
+ "text": "TEXT_SAFFRONPOKECENTER_GENTLEMAN"
+ },
+ {
+ "name": "SAFFRONPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_SAFFRONPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "SAFFRONPOKECENTER_CHANSEY",
+ "text": "TEXT_SAFFRONPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "SEAFOAM_ISLANDS_1F": {
+ "blockLength": 135,
+ "label": "SeafoamIslands1F",
+ "objects": [
+ {
+ "name": "SEAFOAMISLANDS1F_BOULDER1",
+ "text": "TEXT_SEAFOAMISLANDS1F_BOULDER1"
+ },
+ {
+ "name": "SEAFOAMISLANDS1F_BOULDER2",
+ "text": "TEXT_SEAFOAMISLANDS1F_BOULDER2"
+ }
+ ],
+ "signTexts": []
+ },
+ "SEAFOAM_ISLANDS_B1F": {
+ "blockLength": 135,
+ "label": "SeafoamIslandsB1F",
+ "objects": [
+ {
+ "hidden": true,
+ "name": "SEAFOAMISLANDSB1F_BOULDER1",
+ "text": "TEXT_SEAFOAMISLANDSB1F_BOULDER1"
+ },
+ {
+ "hidden": true,
+ "name": "SEAFOAMISLANDSB1F_BOULDER2",
+ "text": "TEXT_SEAFOAMISLANDSB1F_BOULDER2"
+ }
+ ],
+ "signTexts": []
+ },
+ "SEAFOAM_ISLANDS_B2F": {
+ "blockLength": 135,
+ "label": "SeafoamIslandsB2F",
+ "objects": [
+ {
+ "hidden": true,
+ "name": "SEAFOAMISLANDSB2F_BOULDER1",
+ "text": "TEXT_SEAFOAMISLANDSB2F_BOULDER1"
+ },
+ {
+ "hidden": true,
+ "name": "SEAFOAMISLANDSB2F_BOULDER2",
+ "text": "TEXT_SEAFOAMISLANDSB2F_BOULDER2"
+ }
+ ],
+ "signTexts": []
+ },
+ "SEAFOAM_ISLANDS_B3F": {
+ "blockLength": 135,
+ "label": "SeafoamIslandsB3F",
+ "objects": [
+ {
+ "name": "SEAFOAMISLANDSB3F_BOULDER1",
+ "text": "TEXT_SEAFOAMISLANDSB3F_BOULDER1"
+ },
+ {
+ "name": "SEAFOAMISLANDSB3F_BOULDER2",
+ "text": "TEXT_SEAFOAMISLANDSB3F_BOULDER2"
+ },
+ {
+ "name": "SEAFOAMISLANDSB3F_BOULDER3",
+ "text": "TEXT_SEAFOAMISLANDSB3F_BOULDER3"
+ },
+ {
+ "name": "SEAFOAMISLANDSB3F_BOULDER4",
+ "text": "TEXT_SEAFOAMISLANDSB3F_BOULDER4"
+ },
+ {
+ "hidden": true,
+ "name": "SEAFOAMISLANDSB3F_BOULDER5",
+ "text": "TEXT_SEAFOAMISLANDSB3F_BOULDER5"
+ },
+ {
+ "hidden": true,
+ "name": "SEAFOAMISLANDSB3F_BOULDER6",
+ "text": "TEXT_SEAFOAMISLANDSB3F_BOULDER6"
+ }
+ ],
+ "signTexts": []
+ },
+ "SEAFOAM_ISLANDS_B4F": {
+ "blockLength": 135,
+ "label": "SeafoamIslandsB4F",
+ "objects": [
+ {
+ "hidden": true,
+ "name": "SEAFOAMISLANDSB4F_BOULDER1",
+ "text": "TEXT_SEAFOAMISLANDSB4F_BOULDER1"
+ },
+ {
+ "hidden": true,
+ "name": "SEAFOAMISLANDSB4F_BOULDER2",
+ "text": "TEXT_SEAFOAMISLANDSB4F_BOULDER2"
+ },
+ {
+ "name": "SEAFOAMISLANDSB4F_ARTICUNO",
+ "pokemon": "ARTICUNO",
+ "text": "TEXT_SEAFOAMISLANDSB4F_ARTICUNO"
+ }
+ ],
+ "signTexts": [
+ "TEXT_SEAFOAMISLANDSB4F_BOULDERS_SIGN",
+ "TEXT_SEAFOAMISLANDSB4F_DANGER_SIGN"
+ ]
+ },
+ "SILPH_CO_10F": {
+ "blockLength": 72,
+ "label": "SilphCo10F",
+ "objects": [
+ {
+ "name": "SILPHCO10F_ROCKET",
+ "text": "TEXT_SILPHCO10F_ROCKET",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 39
+ },
+ {
+ "name": "SILPHCO10F_SCIENTIST",
+ "text": "TEXT_SILPHCO10F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 11
+ },
+ {
+ "name": "SILPHCO10F_SILPH_WORKER_F",
+ "text": "TEXT_SILPHCO10F_SILPH_WORKER_F"
+ },
+ {
+ "item": "TM_EARTHQUAKE",
+ "name": "SILPHCO10F_TM_EARTHQUAKE",
+ "text": "TEXT_SILPHCO10F_TM_EARTHQUAKE"
+ },
+ {
+ "item": "RARE_CANDY",
+ "name": "SILPHCO10F_RARE_CANDY",
+ "text": "TEXT_SILPHCO10F_RARE_CANDY"
+ },
+ {
+ "item": "CARBOS",
+ "name": "SILPHCO10F_CARBOS",
+ "text": "TEXT_SILPHCO10F_CARBOS"
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_11F": {
+ "blockLength": 81,
+ "label": "SilphCo11F",
+ "objects": [
+ {
+ "name": "SILPHCO11F_SILPH_PRESIDENT",
+ "text": "TEXT_SILPHCO11F_SILPH_PRESIDENT"
+ },
+ {
+ "name": "SILPHCO11F_BEAUTY",
+ "text": "TEXT_SILPHCO11F_BEAUTY"
+ },
+ {
+ "name": "SILPHCO11F_GIOVANNI",
+ "text": "TEXT_SILPHCO11F_GIOVANNI",
+ "trainerClass": "OPP_GIOVANNI",
+ "trainerParty": 2
+ },
+ {
+ "name": "SILPHCO11F_JAMES",
+ "text": "TEXT_SILPHCO11F_JAMES"
+ },
+ {
+ "name": "SILPHCO11F_ROCKET",
+ "text": "TEXT_SILPHCO11F_ROCKET",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 40
+ },
+ {
+ "name": "SILPHCO11F_JESSIE",
+ "text": "TEXT_SILPHCO11F_JESSIE"
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_1F": {
+ "blockLength": 135,
+ "label": "SilphCo1F",
+ "objects": [
+ {
+ "hidden": true,
+ "name": "SILPHCO1F_LINK_RECEPTIONIST",
+ "text": "TEXT_SILPHCO1F_LINK_RECEPTIONIST"
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_2F": {
+ "blockLength": 135,
+ "label": "SilphCo2F",
+ "objects": [
+ {
+ "name": "SILPHCO2F_SILPH_WORKER_F",
+ "text": "TEXT_SILPHCO2F_SILPH_WORKER_F"
+ },
+ {
+ "name": "SILPHCO2F_SCIENTIST1",
+ "text": "TEXT_SILPHCO2F_SCIENTIST1",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 2
+ },
+ {
+ "name": "SILPHCO2F_SCIENTIST2",
+ "text": "TEXT_SILPHCO2F_SCIENTIST2",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 3
+ },
+ {
+ "name": "SILPHCO2F_ROCKET1",
+ "text": "TEXT_SILPHCO2F_ROCKET1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 23
+ },
+ {
+ "name": "SILPHCO2F_ROCKET2",
+ "text": "TEXT_SILPHCO2F_ROCKET2",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 24
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_3F": {
+ "blockLength": 135,
+ "label": "SilphCo3F",
+ "objects": [
+ {
+ "name": "SILPHCO3F_SILPH_WORKER_M",
+ "text": "TEXT_SILPHCO3F_SILPH_WORKER_M"
+ },
+ {
+ "name": "SILPHCO3F_ROCKET",
+ "text": "TEXT_SILPHCO3F_ROCKET",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 25
+ },
+ {
+ "name": "SILPHCO3F_SCIENTIST",
+ "text": "TEXT_SILPHCO3F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 4
+ },
+ {
+ "item": "HYPER_POTION",
+ "name": "SILPHCO3F_HYPER_POTION",
+ "text": "TEXT_SILPHCO3F_HYPER_POTION"
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_4F": {
+ "blockLength": 135,
+ "label": "SilphCo4F",
+ "objects": [
+ {
+ "name": "SILPHCO4F_SILPH_WORKER_M",
+ "text": "TEXT_SILPHCO4F_SILPH_WORKER_M"
+ },
+ {
+ "name": "SILPHCO4F_ROCKET1",
+ "text": "TEXT_SILPHCO4F_ROCKET1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 26
+ },
+ {
+ "name": "SILPHCO4F_SCIENTIST",
+ "text": "TEXT_SILPHCO4F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 5
+ },
+ {
+ "name": "SILPHCO4F_ROCKET2",
+ "text": "TEXT_SILPHCO4F_ROCKET2",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 27
+ },
+ {
+ "item": "FULL_HEAL",
+ "name": "SILPHCO4F_FULL_HEAL",
+ "text": "TEXT_SILPHCO4F_FULL_HEAL"
+ },
+ {
+ "item": "MAX_REVIVE",
+ "name": "SILPHCO4F_MAX_REVIVE",
+ "text": "TEXT_SILPHCO4F_MAX_REVIVE"
+ },
+ {
+ "item": "ESCAPE_ROPE",
+ "name": "SILPHCO4F_ESCAPE_ROPE",
+ "text": "TEXT_SILPHCO4F_ESCAPE_ROPE"
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_5F": {
+ "blockLength": 135,
+ "label": "SilphCo5F",
+ "objects": [
+ {
+ "name": "SILPHCO5F_SILPH_WORKER_M",
+ "text": "TEXT_SILPHCO5F_SILPH_WORKER_M"
+ },
+ {
+ "name": "SILPHCO5F_ROCKET1",
+ "text": "TEXT_SILPHCO5F_ROCKET1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 28
+ },
+ {
+ "name": "SILPHCO5F_SCIENTIST",
+ "text": "TEXT_SILPHCO5F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 6
+ },
+ {
+ "name": "SILPHCO5F_ROCKER",
+ "text": "TEXT_SILPHCO5F_ROCKER",
+ "trainerClass": "OPP_JUGGLER",
+ "trainerParty": 1
+ },
+ {
+ "name": "SILPHCO5F_ROCKET2",
+ "text": "TEXT_SILPHCO5F_ROCKET2",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 29
+ },
+ {
+ "item": "TM_TAKE_DOWN",
+ "name": "SILPHCO5F_TM_TAKE_DOWN",
+ "text": "TEXT_SILPHCO5F_TM_TAKE_DOWN"
+ },
+ {
+ "item": "PROTEIN",
+ "name": "SILPHCO5F_PROTEIN",
+ "text": "TEXT_SILPHCO5F_PROTEIN"
+ },
+ {
+ "item": "CARD_KEY",
+ "name": "SILPHCO5F_CARD_KEY",
+ "text": "TEXT_SILPHCO5F_CARD_KEY"
+ },
+ {
+ "name": "SILPHCO5F_POKEMON_REPORT1",
+ "text": "TEXT_SILPHCO5F_POKEMON_REPORT1"
+ },
+ {
+ "name": "SILPHCO5F_POKEMON_REPORT2",
+ "text": "TEXT_SILPHCO5F_POKEMON_REPORT2"
+ },
+ {
+ "name": "SILPHCO5F_POKEMON_REPORT3",
+ "text": "TEXT_SILPHCO5F_POKEMON_REPORT3"
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_6F": {
+ "blockLength": 117,
+ "label": "SilphCo6F",
+ "objects": [
+ {
+ "name": "SILPHCO6F_SILPH_WORKER_M1",
+ "text": "TEXT_SILPHCO6F_SILPH_WORKER_M1"
+ },
+ {
+ "name": "SILPHCO6F_SILPH_WORKER_M2",
+ "text": "TEXT_SILPHCO6F_SILPH_WORKER_M2"
+ },
+ {
+ "name": "SILPHCO6F_SILPH_WORKER_F1",
+ "text": "TEXT_SILPHCO6F_SILPH_WORKER_F1"
+ },
+ {
+ "name": "SILPHCO6F_SILPH_WORKER_F2",
+ "text": "TEXT_SILPHCO6F_SILPH_WORKER_F2"
+ },
+ {
+ "name": "SILPHCO6F_SILPH_WORKER_M3",
+ "text": "TEXT_SILPHCO6F_SILPH_WORKER_M3"
+ },
+ {
+ "name": "SILPHCO6F_ROCKET1",
+ "text": "TEXT_SILPHCO6F_ROCKET1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 30
+ },
+ {
+ "name": "SILPHCO6F_SCIENTIST",
+ "text": "TEXT_SILPHCO6F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 7
+ },
+ {
+ "name": "SILPHCO6F_ROCKET2",
+ "text": "TEXT_SILPHCO6F_ROCKET2",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 31
+ },
+ {
+ "item": "HP_UP",
+ "name": "SILPHCO6F_HP_UP",
+ "text": "TEXT_SILPHCO6F_HP_UP"
+ },
+ {
+ "item": "X_ACCURACY",
+ "name": "SILPHCO6F_X_ACCURACY",
+ "text": "TEXT_SILPHCO6F_X_ACCURACY"
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_7F": {
+ "blockLength": 117,
+ "label": "SilphCo7F",
+ "objects": [
+ {
+ "name": "SILPHCO7F_SILPH_WORKER_M1",
+ "text": "TEXT_SILPHCO7F_SILPH_WORKER_M1"
+ },
+ {
+ "name": "SILPHCO7F_SILPH_WORKER_M2",
+ "text": "TEXT_SILPHCO7F_SILPH_WORKER_M2"
+ },
+ {
+ "name": "SILPHCO7F_SILPH_WORKER_M3",
+ "text": "TEXT_SILPHCO7F_SILPH_WORKER_M3"
+ },
+ {
+ "name": "SILPHCO7F_SILPH_WORKER_M4",
+ "text": "TEXT_SILPHCO7F_SILPH_WORKER_M4"
+ },
+ {
+ "name": "SILPHCO7F_ROCKET1",
+ "text": "TEXT_SILPHCO7F_ROCKET1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 32
+ },
+ {
+ "name": "SILPHCO7F_SCIENTIST",
+ "text": "TEXT_SILPHCO7F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 8
+ },
+ {
+ "name": "SILPHCO7F_ROCKET2",
+ "text": "TEXT_SILPHCO7F_ROCKET2",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 33
+ },
+ {
+ "name": "SILPHCO7F_ROCKET3",
+ "text": "TEXT_SILPHCO7F_ROCKET3",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 34
+ },
+ {
+ "name": "SILPHCO7F_RIVAL",
+ "text": "TEXT_SILPHCO7F_RIVAL"
+ },
+ {
+ "item": "CALCIUM",
+ "name": "SILPHCO7F_CALCIUM",
+ "text": "TEXT_SILPHCO7F_CALCIUM"
+ },
+ {
+ "item": "TM_SWORDS_DANCE",
+ "name": "SILPHCO7F_TM_SWORDS_DANCE",
+ "text": "TEXT_SILPHCO7F_TM_SWORDS_DANCE"
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_8F": {
+ "blockLength": 117,
+ "label": "SilphCo8F",
+ "objects": [
+ {
+ "name": "SILPHCO8F_SILPH_WORKER_M",
+ "text": "TEXT_SILPHCO8F_SILPH_WORKER_M"
+ },
+ {
+ "name": "SILPHCO8F_ROCKET1",
+ "text": "TEXT_SILPHCO8F_ROCKET1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 35
+ },
+ {
+ "name": "SILPHCO8F_SCIENTIST",
+ "text": "TEXT_SILPHCO8F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 9
+ },
+ {
+ "name": "SILPHCO8F_ROCKET2",
+ "text": "TEXT_SILPHCO8F_ROCKET2",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 36
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_9F": {
+ "blockLength": 117,
+ "label": "SilphCo9F",
+ "objects": [
+ {
+ "name": "SILPHCO9F_NURSE",
+ "text": "TEXT_SILPHCO9F_NURSE"
+ },
+ {
+ "name": "SILPHCO9F_ROCKET1",
+ "text": "TEXT_SILPHCO9F_ROCKET1",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 37
+ },
+ {
+ "name": "SILPHCO9F_SCIENTIST",
+ "text": "TEXT_SILPHCO9F_SCIENTIST",
+ "trainerClass": "OPP_SCIENTIST",
+ "trainerParty": 10
+ },
+ {
+ "name": "SILPHCO9F_ROCKET2",
+ "text": "TEXT_SILPHCO9F_ROCKET2",
+ "trainerClass": "OPP_ROCKET",
+ "trainerParty": 38
+ }
+ ],
+ "signTexts": []
+ },
+ "SILPH_CO_ELEVATOR": {
+ "blockLength": 4,
+ "label": "SilphCoElevator",
+ "objects": [],
+ "signTexts": [
+ "TEXT_SILPHCOELEVATOR_ELEVATOR"
+ ]
+ },
+ "SS_ANNE_1F": {
+ "blockLength": 180,
+ "label": "SSAnne1F",
+ "objects": [
+ {
+ "name": "SSANNE1F_WAITER",
+ "text": "TEXT_SSANNE1F_WAITER"
+ },
+ {
+ "name": "SSANNE1F_SAILOR",
+ "text": "TEXT_SSANNE1F_SAILOR"
+ }
+ ],
+ "signTexts": []
+ },
+ "SS_ANNE_1F_ROOMS": {
+ "blockLength": 96,
+ "label": "SSAnne1FRooms",
+ "objects": [
+ {
+ "name": "SSANNE1FROOMS_GENTLEMAN1",
+ "text": "TEXT_SSANNE1FROOMS_GENTLEMAN1",
+ "trainerClass": "OPP_GENTLEMAN",
+ "trainerParty": 1
+ },
+ {
+ "name": "SSANNE1FROOMS_GENTLEMAN2",
+ "text": "TEXT_SSANNE1FROOMS_GENTLEMAN2",
+ "trainerClass": "OPP_GENTLEMAN",
+ "trainerParty": 2
+ },
+ {
+ "name": "SSANNE1FROOMS_YOUNGSTER",
+ "text": "TEXT_SSANNE1FROOMS_YOUNGSTER",
+ "trainerClass": "OPP_YOUNGSTER",
+ "trainerParty": 8
+ },
+ {
+ "name": "SSANNE1FROOMS_COOLTRAINER_F",
+ "text": "TEXT_SSANNE1FROOMS_COOLTRAINER_F",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 11
+ },
+ {
+ "name": "SSANNE1FROOMS_GIRL1",
+ "text": "TEXT_SSANNE1FROOMS_GIRL1"
+ },
+ {
+ "name": "SSANNE1FROOMS_MIDDLE_AGED_MAN",
+ "text": "TEXT_SSANNE1FROOMS_MIDDLE_AGED_MAN"
+ },
+ {
+ "name": "SSANNE1FROOMS_LITTLE_GIRL",
+ "text": "TEXT_SSANNE1FROOMS_LITTLE_GIRL"
+ },
+ {
+ "name": "SSANNE1FROOMS_WIGGLYTUFF",
+ "text": "TEXT_SSANNE1FROOMS_WIGGLYTUFF"
+ },
+ {
+ "name": "SSANNE1FROOMS_GIRL2",
+ "text": "TEXT_SSANNE1FROOMS_GIRL2"
+ },
+ {
+ "item": "TM_BODY_SLAM",
+ "name": "SSANNE1FROOMS_TM_BODY_SLAM",
+ "text": "TEXT_SSANNE1FROOMS_TM_BODY_SLAM"
+ },
+ {
+ "name": "SSANNE1FROOMS_GENTLEMAN3",
+ "text": "TEXT_SSANNE1FROOMS_GENTLEMAN3"
+ }
+ ],
+ "signTexts": []
+ },
+ "SS_ANNE_2F": {
+ "blockLength": 180,
+ "label": "SSAnne2F",
+ "objects": [
+ {
+ "name": "SSANNE2F_WAITER",
+ "text": "TEXT_SSANNE2F_WAITER"
+ },
+ {
+ "hidden": true,
+ "name": "SSANNE2F_RIVAL",
+ "text": "TEXT_SSANNE2F_RIVAL",
+ "trainerClass": "OPP_RIVAL1",
+ "trainerParty": 1
+ }
+ ],
+ "signTexts": []
+ },
+ "SS_ANNE_2F_ROOMS": {
+ "blockLength": 96,
+ "label": "SSAnne2FRooms",
+ "objects": [
+ {
+ "name": "SSANNE2FROOMS_GENTLEMAN1",
+ "text": "TEXT_SSANNE2FROOMS_GENTLEMAN1",
+ "trainerClass": "OPP_GENTLEMAN",
+ "trainerParty": 3
+ },
+ {
+ "name": "SSANNE2FROOMS_FISHER",
+ "text": "TEXT_SSANNE2FROOMS_FISHER",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 1
+ },
+ {
+ "name": "SSANNE2FROOMS_GENTLEMAN2",
+ "text": "TEXT_SSANNE2FROOMS_GENTLEMAN2",
+ "trainerClass": "OPP_GENTLEMAN",
+ "trainerParty": 5
+ },
+ {
+ "name": "SSANNE2FROOMS_COOLTRAINER_F",
+ "text": "TEXT_SSANNE2FROOMS_COOLTRAINER_F",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 12
+ },
+ {
+ "name": "SSANNE2FROOMS_GENTLEMAN3",
+ "text": "TEXT_SSANNE2FROOMS_GENTLEMAN3"
+ },
+ {
+ "item": "MAX_ETHER",
+ "name": "SSANNE2FROOMS_MAX_ETHER",
+ "text": "TEXT_SSANNE2FROOMS_MAX_ETHER"
+ },
+ {
+ "name": "SSANNE2FROOMS_GENTLEMAN4",
+ "text": "TEXT_SSANNE2FROOMS_GENTLEMAN4"
+ },
+ {
+ "name": "SSANNE2FROOMS_GRAMPS",
+ "text": "TEXT_SSANNE2FROOMS_GRAMPS"
+ },
+ {
+ "item": "RARE_CANDY",
+ "name": "SSANNE2FROOMS_RARE_CANDY",
+ "text": "TEXT_SSANNE2FROOMS_RARE_CANDY"
+ },
+ {
+ "name": "SSANNE2FROOMS_GENTLEMAN5",
+ "text": "TEXT_SSANNE2FROOMS_GENTLEMAN5"
+ },
+ {
+ "name": "SSANNE2FROOMS_LITTLE_BOY",
+ "text": "TEXT_SSANNE2FROOMS_LITTLE_BOY"
+ },
+ {
+ "name": "SSANNE2FROOMS_BRUNETTE_GIRL",
+ "text": "TEXT_SSANNE2FROOMS_BRUNETTE_GIRL"
+ },
+ {
+ "name": "SSANNE2FROOMS_BEAUTY",
+ "text": "TEXT_SSANNE2FROOMS_BEAUTY"
+ }
+ ],
+ "signTexts": []
+ },
+ "SS_ANNE_3F": {
+ "blockLength": 30,
+ "label": "SSAnne3F",
+ "objects": [
+ {
+ "name": "SSANNE3F_SAILOR",
+ "text": "TEXT_SSANNE3F_SAILOR"
+ }
+ ],
+ "signTexts": []
+ },
+ "SS_ANNE_B1F": {
+ "blockLength": 60,
+ "label": "SSAnneB1F",
+ "objects": [],
+ "signTexts": []
+ },
+ "SS_ANNE_B1F_ROOMS": {
+ "blockLength": 96,
+ "label": "SSAnneB1FRooms",
+ "objects": [
+ {
+ "name": "SSANNEB1FROOMS_SAILOR1",
+ "text": "TEXT_SSANNEB1FROOMS_SAILOR1",
+ "trainerClass": "OPP_SAILOR",
+ "trainerParty": 3
+ },
+ {
+ "name": "SSANNEB1FROOMS_SAILOR2",
+ "text": "TEXT_SSANNEB1FROOMS_SAILOR2",
+ "trainerClass": "OPP_SAILOR",
+ "trainerParty": 4
+ },
+ {
+ "name": "SSANNEB1FROOMS_SAILOR3",
+ "text": "TEXT_SSANNEB1FROOMS_SAILOR3",
+ "trainerClass": "OPP_SAILOR",
+ "trainerParty": 5
+ },
+ {
+ "name": "SSANNEB1FROOMS_SAILOR4",
+ "text": "TEXT_SSANNEB1FROOMS_SAILOR4",
+ "trainerClass": "OPP_SAILOR",
+ "trainerParty": 6
+ },
+ {
+ "name": "SSANNEB1FROOMS_SAILOR5",
+ "text": "TEXT_SSANNEB1FROOMS_SAILOR5",
+ "trainerClass": "OPP_SAILOR",
+ "trainerParty": 7
+ },
+ {
+ "name": "SSANNEB1FROOMS_FISHER",
+ "text": "TEXT_SSANNEB1FROOMS_FISHER",
+ "trainerClass": "OPP_FISHER",
+ "trainerParty": 2
+ },
+ {
+ "name": "SSANNEB1FROOMS_SUPER_NERD",
+ "text": "TEXT_SSANNEB1FROOMS_SUPER_NERD"
+ },
+ {
+ "name": "SSANNEB1FROOMS_MACHOKE",
+ "text": "TEXT_SSANNEB1FROOMS_MACHOKE"
+ },
+ {
+ "item": "ETHER",
+ "name": "SSANNEB1FROOMS_ETHER",
+ "text": "TEXT_SSANNEB1FROOMS_ETHER"
+ },
+ {
+ "item": "TM_REST",
+ "name": "SSANNEB1FROOMS_TM_REST",
+ "text": "TEXT_SSANNEB1FROOMS_TM_REST"
+ },
+ {
+ "item": "MAX_POTION",
+ "name": "SSANNEB1FROOMS_MAX_POTION",
+ "text": "TEXT_SSANNEB1FROOMS_MAX_POTION"
+ }
+ ],
+ "signTexts": []
+ },
+ "SS_ANNE_BOW": {
+ "blockLength": 70,
+ "label": "SSAnneBow",
+ "objects": [
+ {
+ "name": "SSANNEBOW_SUPER_NERD",
+ "text": "TEXT_SSANNEBOW_SUPER_NERD"
+ },
+ {
+ "name": "SSANNEBOW_SAILOR1",
+ "text": "TEXT_SSANNEBOW_SAILOR1"
+ },
+ {
+ "name": "SSANNEBOW_COOLTRAINER_M",
+ "text": "TEXT_SSANNEBOW_COOLTRAINER_M"
+ },
+ {
+ "name": "SSANNEBOW_SAILOR2",
+ "text": "TEXT_SSANNEBOW_SAILOR2",
+ "trainerClass": "OPP_SAILOR",
+ "trainerParty": 1
+ },
+ {
+ "name": "SSANNEBOW_SAILOR3",
+ "text": "TEXT_SSANNEBOW_SAILOR3",
+ "trainerClass": "OPP_SAILOR",
+ "trainerParty": 2
+ }
+ ],
+ "signTexts": []
+ },
+ "SS_ANNE_CAPTAINS_ROOM": {
+ "blockLength": 12,
+ "label": "SSAnneCaptainsRoom",
+ "objects": [
+ {
+ "name": "SSANNECAPTAINSROOM_CAPTAIN",
+ "text": "TEXT_SSANNECAPTAINSROOM_CAPTAIN"
+ }
+ ],
+ "signTexts": [
+ "TEXT_SSANNECAPTAINSROOM_TRASH",
+ "TEXT_SSANNECAPTAINSROOM_SEASICK_BOOK"
+ ]
+ },
+ "SS_ANNE_KITCHEN": {
+ "blockLength": 56,
+ "label": "SSAnneKitchen",
+ "objects": [
+ {
+ "name": "SSANNEKITCHEN_COOK1",
+ "text": "TEXT_SSANNEKITCHEN_COOK1"
+ },
+ {
+ "name": "SSANNEKITCHEN_COOK2",
+ "text": "TEXT_SSANNEKITCHEN_COOK2"
+ },
+ {
+ "name": "SSANNEKITCHEN_COOK3",
+ "text": "TEXT_SSANNEKITCHEN_COOK3"
+ },
+ {
+ "name": "SSANNEKITCHEN_COOK4",
+ "text": "TEXT_SSANNEKITCHEN_COOK4"
+ },
+ {
+ "name": "SSANNEKITCHEN_COOK5",
+ "text": "TEXT_SSANNEKITCHEN_COOK5"
+ },
+ {
+ "name": "SSANNEKITCHEN_COOK6",
+ "text": "TEXT_SSANNEKITCHEN_COOK6"
+ },
+ {
+ "name": "SSANNEKITCHEN_COOK7",
+ "text": "TEXT_SSANNEKITCHEN_COOK7"
+ }
+ ],
+ "signTexts": []
+ },
+ "SUMMER_BEACH_HOUSE": {
+ "blockLength": 28,
+ "label": "SummerBeachHouse",
+ "objects": [
+ {
+ "name": "SUMMERBEACHHOUSE_SURFINDUDE",
+ "text": "TEXT_SUMMERBEACHHOUSE_SURFINDUDE"
+ },
+ {
+ "name": "SUMMERBEACHHOUSE_PIKACHU",
+ "text": "TEXT_SUMMERBEACHHOUSE_PIKACHU"
+ }
+ ],
+ "signTexts": [
+ "TEXT_SUMMERBEACHHOUSE_POSTER1",
+ "TEXT_SUMMERBEACHHOUSE_POSTER2",
+ "TEXT_SUMMERBEACHHOUSE_POSTER3",
+ "TEXT_SUMMERBEACHHOUSE_PRINTER"
+ ]
+ },
+ "TRADE_CENTER": {
+ "blockLength": 20,
+ "label": "TradeCenter",
+ "objects": [
+ {
+ "name": "TRADECENTER_OPPONENT",
+ "text": "TEXT_TRADECENTER_OPPONENT"
+ }
+ ],
+ "signTexts": []
+ },
+ "UNDERGROUND_PATH_NORTH_SOUTH": {
+ "blockLength": 92,
+ "label": "UndergroundPathNorthSouth",
+ "objects": [],
+ "signTexts": []
+ },
+ "UNDERGROUND_PATH_ROUTE_5": {
+ "blockLength": 16,
+ "label": "UndergroundPathRoute5",
+ "objects": [
+ {
+ "name": "UNDERGROUNDPATHROUTE5_LITTLE_GIRL",
+ "text": "TEXT_UNDERGROUNDPATHROUTE5_LITTLE_GIRL"
+ }
+ ],
+ "signTexts": []
+ },
+ "UNDERGROUND_PATH_ROUTE_6": {
+ "blockLength": 16,
+ "label": "UndergroundPathRoute6",
+ "objects": [
+ {
+ "name": "UNDERGROUNDPATHROUTE6_GIRL",
+ "text": "TEXT_UNDERGROUNDPATHROUTE6_GIRL"
+ }
+ ],
+ "signTexts": []
+ },
+ "UNDERGROUND_PATH_ROUTE_7": {
+ "blockLength": 16,
+ "label": "UndergroundPathRoute7",
+ "objects": [
+ {
+ "name": "UNDERGROUNDPATHROUTE7_MIDDLE_AGED_MAN",
+ "text": "TEXT_UNDERGROUNDPATHROUTE7_MIDDLE_AGED_MAN"
+ }
+ ],
+ "signTexts": []
+ },
+ "UNDERGROUND_PATH_ROUTE_8": {
+ "blockLength": 16,
+ "label": "UndergroundPathRoute8",
+ "objects": [
+ {
+ "name": "UNDERGROUNDPATHROUTE8_GIRL",
+ "text": "TEXT_UNDERGROUNDPATHROUTE8_GIRL"
+ }
+ ],
+ "signTexts": []
+ },
+ "UNDERGROUND_PATH_WEST_EAST": {
+ "blockLength": 100,
+ "label": "UndergroundPathWestEast",
+ "objects": [],
+ "signTexts": []
+ },
+ "VERMILION_CITY": {
+ "blockLength": 360,
+ "label": "VermilionCity",
+ "objects": [
+ {
+ "name": "VERMILIONCITY_BEAUTY",
+ "text": "TEXT_VERMILIONCITY_BEAUTY"
+ },
+ {
+ "name": "VERMILIONCITY_GAMBLER1",
+ "text": "TEXT_VERMILIONCITY_GAMBLER1"
+ },
+ {
+ "name": "VERMILIONCITY_SAILOR1",
+ "text": "TEXT_VERMILIONCITY_SAILOR1"
+ },
+ {
+ "name": "VERMILIONCITY_GAMBLER2",
+ "text": "TEXT_VERMILIONCITY_GAMBLER2"
+ },
+ {
+ "name": "VERMILIONCITY_MACHOP",
+ "text": "TEXT_VERMILIONCITY_MACHOP"
+ },
+ {
+ "name": "VERMILIONCITY_SAILOR2",
+ "text": "TEXT_VERMILIONCITY_SAILOR2"
+ },
+ {
+ "name": "VERMILIONCITY_OFFICER_JENNY",
+ "text": "TEXT_VERMILIONCITY_OFFICER_JENNY"
+ }
+ ],
+ "signTexts": [
+ "TEXT_VERMILIONCITY_SIGN",
+ "TEXT_VERMILIONCITY_NOTICE_SIGN",
+ "TEXT_VERMILIONCITY_MART_SIGN",
+ "TEXT_VERMILIONCITY_POKECENTER_SIGN",
+ "TEXT_VERMILIONCITY_POKEMON_FAN_CLUB_SIGN",
+ "TEXT_VERMILIONCITY_GYM_SIGN",
+ "TEXT_VERMILIONCITY_HARBOR_SIGN"
+ ]
+ },
+ "VERMILION_DOCK": {
+ "blockLength": 84,
+ "label": "VermilionDock",
+ "objects": [],
+ "signTexts": []
+ },
+ "VERMILION_GYM": {
+ "blockLength": 45,
+ "label": "VermilionGym",
+ "objects": [
+ {
+ "name": "VERMILIONGYM_LT_SURGE",
+ "text": "TEXT_VERMILIONGYM_LT_SURGE",
+ "trainerClass": "OPP_LT_SURGE",
+ "trainerParty": 1
+ },
+ {
+ "name": "VERMILIONGYM_GENTLEMAN",
+ "text": "TEXT_VERMILIONGYM_GENTLEMAN",
+ "trainerClass": "OPP_GENTLEMAN",
+ "trainerParty": 3
+ },
+ {
+ "name": "VERMILIONGYM_SUPER_NERD",
+ "text": "TEXT_VERMILIONGYM_SUPER_NERD",
+ "trainerClass": "OPP_ROCKER",
+ "trainerParty": 1
+ },
+ {
+ "name": "VERMILIONGYM_SAILOR",
+ "text": "TEXT_VERMILIONGYM_SAILOR",
+ "trainerClass": "OPP_SAILOR",
+ "trainerParty": 8
+ },
+ {
+ "name": "VERMILIONGYM_GYM_GUIDE",
+ "text": "TEXT_VERMILIONGYM_GYM_GUIDE"
+ }
+ ],
+ "signTexts": []
+ },
+ "VERMILION_MART": {
+ "blockLength": 16,
+ "label": "VermilionMart",
+ "objects": [
+ {
+ "name": "VERMILIONMART_CLERK",
+ "text": "TEXT_VERMILIONMART_CLERK"
+ },
+ {
+ "name": "VERMILIONMART_COOLTRAINER_M",
+ "text": "TEXT_VERMILIONMART_COOLTRAINER_M"
+ },
+ {
+ "name": "VERMILIONMART_COOLTRAINER_F",
+ "text": "TEXT_VERMILIONMART_COOLTRAINER_F"
+ }
+ ],
+ "signTexts": []
+ },
+ "VERMILION_OLD_ROD_HOUSE": {
+ "blockLength": 16,
+ "label": "VermilionOldRodHouse",
+ "objects": [
+ {
+ "name": "VERMILIONOLDRODHOUSE_FISHING_GURU",
+ "text": "TEXT_VERMILIONOLDRODHOUSE_FISHING_GURU"
+ }
+ ],
+ "signTexts": []
+ },
+ "VERMILION_PIDGEY_HOUSE": {
+ "blockLength": 16,
+ "label": "VermilionPidgeyHouse",
+ "objects": [
+ {
+ "name": "VERMILIONPIDGEYHOUSE_YOUNGSTER",
+ "text": "TEXT_VERMILIONPIDGEYHOUSE_YOUNGSTER"
+ },
+ {
+ "name": "VERMILIONPIDGEYHOUSE_PIDGEY",
+ "text": "TEXT_VERMILIONPIDGEYHOUSE_PIDGEY"
+ },
+ {
+ "name": "VERMILIONPIDGEYHOUSE_LETTER",
+ "text": "TEXT_VERMILIONPIDGEYHOUSE_LETTER"
+ }
+ ],
+ "signTexts": []
+ },
+ "VERMILION_POKECENTER": {
+ "blockLength": 28,
+ "label": "VermilionPokecenter",
+ "objects": [
+ {
+ "name": "VERMILIONPOKECENTER_NURSE",
+ "text": "TEXT_VERMILIONPOKECENTER_NURSE"
+ },
+ {
+ "name": "VERMILIONPOKECENTER_FISHING_GURU",
+ "text": "TEXT_VERMILIONPOKECENTER_FISHING_GURU"
+ },
+ {
+ "name": "VERMILIONPOKECENTER_SAILOR",
+ "text": "TEXT_VERMILIONPOKECENTER_SAILOR"
+ },
+ {
+ "name": "VERMILIONPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_VERMILIONPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "VERMILIONPOKECENTER_CHANSEY",
+ "text": "TEXT_VERMILIONPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "VERMILION_TRADE_HOUSE": {
+ "blockLength": 16,
+ "label": "VermilionTradeHouse",
+ "objects": [
+ {
+ "name": "VERMILIONTRADEHOUSE_GENTLEMAN",
+ "text": "TEXT_VERMILIONTRADEHOUSE_GENTLEMAN"
+ }
+ ],
+ "signTexts": []
+ },
+ "VICTORY_ROAD_1F": {
+ "blockLength": 90,
+ "label": "VictoryRoad1F",
+ "objects": [
+ {
+ "name": "VICTORYROAD1F_COOLTRAINER_F",
+ "text": "TEXT_VICTORYROAD1F_COOLTRAINER_F",
+ "trainerClass": "OPP_COOLTRAINER_F",
+ "trainerParty": 5
+ },
+ {
+ "name": "VICTORYROAD1F_COOLTRAINER_M",
+ "text": "TEXT_VICTORYROAD1F_COOLTRAINER_M",
+ "trainerClass": "OPP_COOLTRAINER_M",
+ "trainerParty": 5
+ },
+ {
+ "item": "TM_SKY_ATTACK",
+ "name": "VICTORYROAD1F_TM_SKY_ATTACK",
+ "text": "TEXT_VICTORYROAD1F_TM_SKY_ATTACK"
+ },
+ {
+ "item": "RARE_CANDY",
+ "name": "VICTORYROAD1F_RARE_CANDY",
+ "text": "TEXT_VICTORYROAD1F_RARE_CANDY"
+ },
+ {
+ "name": "VICTORYROAD1F_BOULDER1",
+ "text": "TEXT_VICTORYROAD1F_BOULDER1"
+ },
+ {
+ "name": "VICTORYROAD1F_BOULDER2",
+ "text": "TEXT_VICTORYROAD1F_BOULDER2"
+ },
+ {
+ "name": "VICTORYROAD1F_BOULDER3",
+ "text": "TEXT_VICTORYROAD1F_BOULDER3"
+ }
+ ],
+ "signTexts": []
+ },
+ "VICTORY_ROAD_2F": {
+ "blockLength": 135,
+ "label": "VictoryRoad2F",
+ "objects": [
+ {
+ "name": "VICTORYROAD2F_HIKER",
+ "text": "TEXT_VICTORYROAD2F_HIKER",
+ "trainerClass": "OPP_BLACKBELT",
+ "trainerParty": 9
+ },
+ {
+ "name": "VICTORYROAD2F_SUPER_NERD1",
+ "text": "TEXT_VICTORYROAD2F_SUPER_NERD1",
+ "trainerClass": "OPP_JUGGLER",
+ "trainerParty": 2
+ },
+ {
+ "name": "VICTORYROAD2F_COOLTRAINER_M",
+ "text": "TEXT_VICTORYROAD2F_COOLTRAINER_M",
+ "trainerClass": "OPP_TAMER",
+ "trainerParty": 5
+ },
+ {
+ "name": "VICTORYROAD2F_SUPER_NERD2",
+ "text": "TEXT_VICTORYROAD2F_SUPER_NERD2",
+ "trainerClass": "OPP_POKEMANIAC",
+ "trainerParty": 6
+ },
+ {
+ "name": "VICTORYROAD2F_SUPER_NERD3",
+ "text": "TEXT_VICTORYROAD2F_SUPER_NERD3",
+ "trainerClass": "OPP_JUGGLER",
+ "trainerParty": 5
+ },
+ {
+ "name": "VICTORYROAD2F_MOLTRES",
+ "pokemon": "MOLTRES",
+ "text": "TEXT_VICTORYROAD2F_MOLTRES"
+ },
+ {
+ "item": "TM_SUBMISSION",
+ "name": "VICTORYROAD2F_TM_SUBMISSION",
+ "text": "TEXT_VICTORYROAD2F_TM_SUBMISSION"
+ },
+ {
+ "item": "FULL_HEAL",
+ "name": "VICTORYROAD2F_FULL_HEAL",
+ "text": "TEXT_VICTORYROAD2F_FULL_HEAL"
+ },
+ {
+ "item": "TM_MEGA_KICK",
+ "name": "VICTORYROAD2F_TM_MEGA_KICK",
+ "text": "TEXT_VICTORYROAD2F_TM_MEGA_KICK"
+ },
+ {
+ "item": "GUARD_SPEC",
+ "name": "VICTORYROAD2F_GUARD_SPEC",
+ "text": "TEXT_VICTORYROAD2F_GUARD_SPEC"
+ },
+ {
+ "name": "VICTORYROAD2F_BOULDER1",
+ "text": "TEXT_VICTORYROAD2F_BOULDER1"
+ },
+ {
+ "name": "VICTORYROAD2F_BOULDER2",
+ "text": "TEXT_VICTORYROAD2F_BOULDER2"
+ },
+ {
+ "name": "VICTORYROAD2F_BOULDER3",
+ "text": "TEXT_VICTORYROAD2F_BOULDER3"
+ }
+ ],
+ "signTexts": []
+ },
+ "VICTORY_ROAD_3F": {
+ "blockLength": 135,
+ "label": "VictoryRoad3F",
+ "objects": [
+ {
+ "name": "VICTORYROAD3F_COOLTRAINER_M1",
+ "text": "TEXT_VICTORYROAD3F_COOLTRAINER_M1",
+ "trainerClass": "OPP_COOLTRAINER_M",
+ "trainerParty": 2
+ },
+ {
+ "name": "VICTORYROAD3F_COOLTRAINER_F1",
+ "text": "TEXT_VICTORYROAD3F_COOLTRAINER_F1",
+ "trainerClass": "OPP_COOLTRAINER_F",
+ "trainerParty": 2
+ },
+ {
+ "name": "VICTORYROAD3F_COOLTRAINER_M2",
+ "text": "TEXT_VICTORYROAD3F_COOLTRAINER_M2",
+ "trainerClass": "OPP_COOLTRAINER_M",
+ "trainerParty": 3
+ },
+ {
+ "name": "VICTORYROAD3F_COOLTRAINER_F2",
+ "text": "TEXT_VICTORYROAD3F_COOLTRAINER_F2",
+ "trainerClass": "OPP_COOLTRAINER_F",
+ "trainerParty": 3
+ },
+ {
+ "item": "MAX_REVIVE",
+ "name": "VICTORYROAD3F_MAX_REVIVE",
+ "text": "TEXT_VICTORYROAD3F_MAX_REVIVE"
+ },
+ {
+ "item": "TM_EXPLOSION",
+ "name": "VICTORYROAD3F_TM_EXPLOSION",
+ "text": "TEXT_VICTORYROAD3F_TM_EXPLOSION"
+ },
+ {
+ "name": "VICTORYROAD3F_BOULDER1",
+ "text": "TEXT_VICTORYROAD3F_BOULDER1"
+ },
+ {
+ "name": "VICTORYROAD3F_BOULDER2",
+ "text": "TEXT_VICTORYROAD3F_BOULDER2"
+ },
+ {
+ "name": "VICTORYROAD3F_BOULDER3",
+ "text": "TEXT_VICTORYROAD3F_BOULDER3"
+ },
+ {
+ "name": "VICTORYROAD3F_BOULDER4",
+ "text": "TEXT_VICTORYROAD3F_BOULDER4"
+ }
+ ],
+ "signTexts": []
+ },
+ "VIRIDIAN_CITY": {
+ "blockLength": 360,
+ "label": "ViridianCity",
+ "objects": [
+ {
+ "name": "VIRIDIANCITY_YOUNGSTER1",
+ "text": "TEXT_VIRIDIANCITY_YOUNGSTER1"
+ },
+ {
+ "name": "VIRIDIANCITY_GAMBLER1",
+ "text": "TEXT_VIRIDIANCITY_GAMBLER1"
+ },
+ {
+ "name": "VIRIDIANCITY_YOUNGSTER2",
+ "text": "TEXT_VIRIDIANCITY_YOUNGSTER2"
+ },
+ {
+ "name": "VIRIDIANCITY_GIRL",
+ "text": "TEXT_VIRIDIANCITY_GIRL"
+ },
+ {
+ "name": "VIRIDIANCITY_OLD_MAN_SLEEPY",
+ "text": "TEXT_VIRIDIANCITY_OLD_MAN_SLEEPY"
+ },
+ {
+ "name": "VIRIDIANCITY_FISHER",
+ "text": "TEXT_VIRIDIANCITY_FISHER"
+ },
+ {
+ "hidden": true,
+ "name": "VIRIDIANCITY_OLD_MAN",
+ "text": "TEXT_VIRIDIANCITY_OLD_MAN"
+ },
+ {
+ "hidden": true,
+ "name": "VIRIDIANCITY_OLD_MAN2",
+ "text": "TEXT_VIRIDIANCITY_OLD_MAN2"
+ }
+ ],
+ "signTexts": [
+ "TEXT_VIRIDIANCITY_SIGN",
+ "TEXT_VIRIDIANCITY_TRAINER_TIPS1",
+ "TEXT_VIRIDIANCITY_TRAINER_TIPS2",
+ "TEXT_VIRIDIANCITY_MART_SIGN",
+ "TEXT_VIRIDIANCITY_POKECENTER_SIGN",
+ "TEXT_VIRIDIANCITY_GYM_SIGN"
+ ]
+ },
+ "VIRIDIAN_FOREST": {
+ "blockLength": 408,
+ "label": "ViridianForest",
+ "objects": [
+ {
+ "name": "VIRIDIANFOREST_YOUNGSTER1",
+ "text": "TEXT_VIRIDIANFOREST_YOUNGSTER1"
+ },
+ {
+ "name": "VIRIDIANFOREST_YOUNGSTER2",
+ "text": "TEXT_VIRIDIANFOREST_YOUNGSTER2",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 1
+ },
+ {
+ "name": "VIRIDIANFOREST_YOUNGSTER3",
+ "text": "TEXT_VIRIDIANFOREST_YOUNGSTER3",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 2
+ },
+ {
+ "name": "VIRIDIANFOREST_YOUNGSTER4",
+ "text": "TEXT_VIRIDIANFOREST_YOUNGSTER4",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 3
+ },
+ {
+ "name": "VIRIDIANFOREST_COOLTRAINER_F",
+ "text": "TEXT_VIRIDIANFOREST_COOLTRAINER_F",
+ "trainerClass": "OPP_LASS",
+ "trainerParty": 19
+ },
+ {
+ "name": "VIRIDIANFOREST_YOUNGSTER5",
+ "text": "TEXT_VIRIDIANFOREST_YOUNGSTER5",
+ "trainerClass": "OPP_BUG_CATCHER",
+ "trainerParty": 15
+ },
+ {
+ "item": "POTION",
+ "name": "VIRIDIANFOREST_POTION1",
+ "text": "TEXT_VIRIDIANFOREST_POTION1"
+ },
+ {
+ "item": "POTION",
+ "name": "VIRIDIANFOREST_POTION2",
+ "text": "TEXT_VIRIDIANFOREST_POTION2"
+ },
+ {
+ "item": "POKE_BALL",
+ "name": "VIRIDIANFOREST_POKE_BALL",
+ "text": "TEXT_VIRIDIANFOREST_POKE_BALL"
+ },
+ {
+ "name": "VIRIDIANFOREST_YOUNGSTER6",
+ "text": "TEXT_VIRIDIANFOREST_YOUNGSTER6"
+ }
+ ],
+ "signTexts": [
+ "TEXT_VIRIDIANFOREST_TRAINER_TIPS1",
+ "TEXT_VIRIDIANFOREST_USE_ANTIDOTE_SIGN",
+ "TEXT_VIRIDIANFOREST_TRAINER_TIPS2",
+ "TEXT_VIRIDIANFOREST_TRAINER_TIPS3",
+ "TEXT_VIRIDIANFOREST_TRAINER_TIPS4",
+ "TEXT_VIRIDIANFOREST_LEAVING_SIGN"
+ ]
+ },
+ "VIRIDIAN_FOREST_NORTH_GATE": {
+ "blockLength": 20,
+ "label": "ViridianForestNorthGate",
+ "objects": [
+ {
+ "name": "VIRIDIANFORESTNORTHGATE_SUPER_NERD",
+ "text": "TEXT_VIRIDIANFORESTNORTHGATE_SUPER_NERD"
+ },
+ {
+ "name": "VIRIDIANFORESTNORTHGATE_GRAMPS",
+ "text": "TEXT_VIRIDIANFORESTNORTHGATE_GRAMPS"
+ }
+ ],
+ "signTexts": []
+ },
+ "VIRIDIAN_FOREST_SOUTH_GATE": {
+ "blockLength": 20,
+ "label": "ViridianForestSouthGate",
+ "objects": [
+ {
+ "name": "VIRIDIANFORESTSOUTHGATE_GIRL",
+ "text": "TEXT_VIRIDIANFORESTSOUTHGATE_GIRL"
+ },
+ {
+ "name": "VIRIDIANFORESTSOUTHGATE_LITTLE_GIRL",
+ "text": "TEXT_VIRIDIANFORESTSOUTHGATE_LITTLE_GIRL"
+ }
+ ],
+ "signTexts": []
+ },
+ "VIRIDIAN_GYM": {
+ "blockLength": 90,
+ "label": "ViridianGym",
+ "objects": [
+ {
+ "name": "VIRIDIANGYM_GIOVANNI",
+ "text": "TEXT_VIRIDIANGYM_GIOVANNI",
+ "trainerClass": "OPP_GIOVANNI",
+ "trainerParty": 3
+ },
+ {
+ "name": "VIRIDIANGYM_COOLTRAINER_M1",
+ "text": "TEXT_VIRIDIANGYM_COOLTRAINER_M1",
+ "trainerClass": "OPP_COOLTRAINER_M",
+ "trainerParty": 9
+ },
+ {
+ "name": "VIRIDIANGYM_HIKER1",
+ "text": "TEXT_VIRIDIANGYM_HIKER1",
+ "trainerClass": "OPP_BLACKBELT",
+ "trainerParty": 6
+ },
+ {
+ "name": "VIRIDIANGYM_ROCKER1",
+ "text": "TEXT_VIRIDIANGYM_ROCKER1",
+ "trainerClass": "OPP_TAMER",
+ "trainerParty": 3
+ },
+ {
+ "name": "VIRIDIANGYM_HIKER2",
+ "text": "TEXT_VIRIDIANGYM_HIKER2",
+ "trainerClass": "OPP_BLACKBELT",
+ "trainerParty": 7
+ },
+ {
+ "name": "VIRIDIANGYM_COOLTRAINER_M2",
+ "text": "TEXT_VIRIDIANGYM_COOLTRAINER_M2",
+ "trainerClass": "OPP_COOLTRAINER_M",
+ "trainerParty": 10
+ },
+ {
+ "name": "VIRIDIANGYM_HIKER3",
+ "text": "TEXT_VIRIDIANGYM_HIKER3",
+ "trainerClass": "OPP_BLACKBELT",
+ "trainerParty": 8
+ },
+ {
+ "name": "VIRIDIANGYM_ROCKER2",
+ "text": "TEXT_VIRIDIANGYM_ROCKER2",
+ "trainerClass": "OPP_TAMER",
+ "trainerParty": 4
+ },
+ {
+ "name": "VIRIDIANGYM_COOLTRAINER_M3",
+ "text": "TEXT_VIRIDIANGYM_COOLTRAINER_M3",
+ "trainerClass": "OPP_COOLTRAINER_M",
+ "trainerParty": 1
+ },
+ {
+ "name": "VIRIDIANGYM_GYM_GUIDE",
+ "text": "TEXT_VIRIDIANGYM_GYM_GUIDE"
+ },
+ {
+ "item": "REVIVE",
+ "name": "VIRIDIANGYM_REVIVE",
+ "text": "TEXT_VIRIDIANGYM_REVIVE"
+ }
+ ],
+ "signTexts": []
+ },
+ "VIRIDIAN_MART": {
+ "blockLength": 16,
+ "label": "ViridianMart",
+ "objects": [
+ {
+ "name": "VIRIDIANMART_CLERK",
+ "text": "TEXT_VIRIDIANMART_CLERK"
+ },
+ {
+ "name": "VIRIDIANMART_YOUNGSTER",
+ "text": "TEXT_VIRIDIANMART_YOUNGSTER"
+ },
+ {
+ "name": "VIRIDIANMART_COOLTRAINER_M",
+ "text": "TEXT_VIRIDIANMART_COOLTRAINER_M"
+ }
+ ],
+ "signTexts": []
+ },
+ "VIRIDIAN_NICKNAME_HOUSE": {
+ "blockLength": 16,
+ "label": "ViridianNicknameHouse",
+ "objects": [
+ {
+ "name": "VIRIDIANNICKNAMEHOUSE_BALDING_GUY",
+ "text": "TEXT_VIRIDIANNICKNAMEHOUSE_BALDING_GUY"
+ },
+ {
+ "name": "VIRIDIANNICKNAMEHOUSE_LITTLE_GIRL",
+ "text": "TEXT_VIRIDIANNICKNAMEHOUSE_LITTLE_GIRL"
+ },
+ {
+ "name": "VIRIDIANNICKNAMEHOUSE_SPEAROW",
+ "text": "TEXT_VIRIDIANNICKNAMEHOUSE_SPEAROW"
+ },
+ {
+ "name": "VIRIDIANNICKNAMEHOUSE_SPEARY_SIGN",
+ "text": "TEXT_VIRIDIANNICKNAMEHOUSE_SPEARY_SIGN"
+ }
+ ],
+ "signTexts": []
+ },
+ "VIRIDIAN_POKECENTER": {
+ "blockLength": 28,
+ "label": "ViridianPokecenter",
+ "objects": [
+ {
+ "name": "VIRIDIANPOKECENTER_NURSE",
+ "text": "TEXT_VIRIDIANPOKECENTER_NURSE"
+ },
+ {
+ "name": "VIRIDIANPOKECENTER_GENTLEMAN",
+ "text": "TEXT_VIRIDIANPOKECENTER_GENTLEMAN"
+ },
+ {
+ "name": "VIRIDIANPOKECENTER_COOLTRAINER_M",
+ "text": "TEXT_VIRIDIANPOKECENTER_COOLTRAINER_M"
+ },
+ {
+ "name": "VIRIDIANPOKECENTER_LINK_RECEPTIONIST",
+ "text": "TEXT_VIRIDIANPOKECENTER_LINK_RECEPTIONIST"
+ },
+ {
+ "name": "VIRIDIANPOKECENTER_CHANSEY",
+ "text": "TEXT_VIRIDIANPOKECENTER_CHANSEY"
+ }
+ ],
+ "signTexts": []
+ },
+ "VIRIDIAN_SCHOOL_HOUSE": {
+ "blockLength": 16,
+ "label": "ViridianSchoolHouse",
+ "objects": [
+ {
+ "name": "VIRIDIANSCHOOLHOUSE_BRUNETTE_GIRL",
+ "text": "TEXT_VIRIDIANSCHOOLHOUSE_BRUNETTE_GIRL"
+ },
+ {
+ "name": "VIRIDIANSCHOOLHOUSE_COOLTRAINER_F",
+ "text": "TEXT_VIRIDIANSCHOOLHOUSE_COOLTRAINER_F"
+ },
+ {
+ "name": "VIRIDIANSCHOOLHOUSE_LITTLE_GIRL",
+ "text": "TEXT_VIRIDIANSCHOOLHOUSE_LITTLE_GIRL"
+ }
+ ],
+ "signTexts": []
+ },
+ "WARDENS_HOUSE": {
+ "blockLength": 20,
+ "label": "WardensHouse",
+ "objects": [
+ {
+ "name": "WARDENSHOUSE_WARDEN",
+ "text": "TEXT_WARDENSHOUSE_WARDEN"
+ },
+ {
+ "item": "RARE_CANDY",
+ "name": "WARDENSHOUSE_RARE_CANDY",
+ "text": "TEXT_WARDENSHOUSE_RARE_CANDY"
+ },
+ {
+ "name": "WARDENSHOUSE_BOULDER",
+ "text": "TEXT_WARDENSHOUSE_BOULDER"
+ }
+ ],
+ "signTexts": [
+ "TEXT_WARDENSHOUSE_DISPLAY_LEFT",
+ "TEXT_WARDENSHOUSE_DISPLAY_RIGHT"
+ ]
+ }
+ },
+ "moveEffects": [
+ "NO_ADDITIONAL_EFFECT",
+ "EFFECT_01",
+ "POISON_SIDE_EFFECT1",
+ "DRAIN_HP_EFFECT",
+ "BURN_SIDE_EFFECT1",
+ "FREEZE_SIDE_EFFECT1",
+ "PARALYZE_SIDE_EFFECT1",
+ "EXPLODE_EFFECT",
+ "DREAM_EATER_EFFECT",
+ "MIRROR_MOVE_EFFECT",
+ "ATTACK_UP1_EFFECT",
+ "DEFENSE_UP1_EFFECT",
+ "SPEED_UP1_EFFECT",
+ "SPECIAL_UP1_EFFECT",
+ "ACCURACY_UP1_EFFECT",
+ "EVASION_UP1_EFFECT",
+ "PAY_DAY_EFFECT",
+ "SWIFT_EFFECT",
+ "ATTACK_DOWN1_EFFECT",
+ "DEFENSE_DOWN1_EFFECT",
+ "SPEED_DOWN1_EFFECT",
+ "SPECIAL_DOWN1_EFFECT",
+ "ACCURACY_DOWN1_EFFECT",
+ "EVASION_DOWN1_EFFECT",
+ "CONVERSION_EFFECT",
+ "HAZE_EFFECT",
+ "BIDE_EFFECT",
+ "THRASH_PETAL_DANCE_EFFECT",
+ "SWITCH_AND_TELEPORT_EFFECT",
+ "TWO_TO_FIVE_ATTACKS_EFFECT",
+ "EFFECT_1E",
+ "FLINCH_SIDE_EFFECT1",
+ "SLEEP_EFFECT",
+ "POISON_SIDE_EFFECT2",
+ "BURN_SIDE_EFFECT2",
+ "FREEZE_SIDE_EFFECT2",
+ "PARALYZE_SIDE_EFFECT2",
+ "FLINCH_SIDE_EFFECT2",
+ "OHKO_EFFECT",
+ "CHARGE_EFFECT",
+ "SUPER_FANG_EFFECT",
+ "SPECIAL_DAMAGE_EFFECT",
+ "TRAPPING_EFFECT",
+ "FLY_EFFECT",
+ "ATTACK_TWICE_EFFECT",
+ "JUMP_KICK_EFFECT",
+ "MIST_EFFECT",
+ "FOCUS_ENERGY_EFFECT",
+ "RECOIL_EFFECT",
+ "CONFUSION_EFFECT",
+ "ATTACK_UP2_EFFECT",
+ "DEFENSE_UP2_EFFECT",
+ "SPEED_UP2_EFFECT",
+ "SPECIAL_UP2_EFFECT",
+ "ACCURACY_UP2_EFFECT",
+ "EVASION_UP2_EFFECT",
+ "HEAL_EFFECT",
+ "TRANSFORM_EFFECT",
+ "ATTACK_DOWN2_EFFECT",
+ "DEFENSE_DOWN2_EFFECT",
+ "SPEED_DOWN2_EFFECT",
+ "SPECIAL_DOWN2_EFFECT",
+ "ACCURACY_DOWN2_EFFECT",
+ "EVASION_DOWN2_EFFECT",
+ "LIGHT_SCREEN_EFFECT",
+ "REFLECT_EFFECT",
+ "POISON_EFFECT",
+ "PARALYZE_EFFECT",
+ "ATTACK_DOWN_SIDE_EFFECT",
+ "DEFENSE_DOWN_SIDE_EFFECT",
+ "SPEED_DOWN_SIDE_EFFECT",
+ "SPECIAL_DOWN_SIDE_EFFECT",
+ "UNUSED",
+ "UNUSED",
+ "UNUSED",
+ "UNUSED",
+ "CONFUSION_SIDE_EFFECT",
+ "TWINEEDLE_EFFECT",
+ "UNUSED",
+ "SUBSTITUTE_EFFECT",
+ "HYPER_BEAM_EFFECT",
+ "RAGE_EFFECT",
+ "MIMIC_EFFECT",
+ "METRONOME_EFFECT",
+ "LEECH_SEED_EFFECT",
+ "SPLASH_EFFECT",
+ "DISABLE_EFFECT"
+ ],
+ "numItems": 83,
+ "paletteOrder": [
+ "ROUTE",
+ "PALLET",
+ "VIRIDIAN",
+ "PEWTER",
+ "CERULEAN",
+ "LAVENDER",
+ "VERMILION",
+ "CELADON",
+ "FUCHSIA",
+ "CINNABAR",
+ "INDIGO",
+ "SAFFRON",
+ "TOWNMAP",
+ "LOGO1",
+ "LOGO2",
+ "0F",
+ "MEWMON",
+ "BLUEMON",
+ "REDMON",
+ "CYANMON",
+ "PURPLEMON",
+ "BROWNMON",
+ "GREENMON",
+ "PINKMON",
+ "YELLOWMON",
+ "GRAYMON",
+ "SLOTS1",
+ "SLOTS2",
+ "SLOTS3",
+ "SLOTS4",
+ "BLACK",
+ "GREENBAR",
+ "YELLOWBAR",
+ "REDBAR",
+ "BADGE",
+ "CAVE",
+ "GAMEFREAK",
+ "PIKACHUS_BEACH",
+ "PIKACHU_PORTRAIT",
+ "PIKACHUS_BEACH_TITLE"
+ ],
+ "pokemonAssets": {
+ "ABRA": {
+ "back": "abrab",
+ "backLabel": "AbraPicBack",
+ "front": "abra",
+ "frontLabel": "AbraPicFront"
+ },
+ "AERODACTYL": {
+ "back": "aerodactylb",
+ "backLabel": "AerodactylPicBack",
+ "front": "aerodactyl",
+ "frontLabel": "AerodactylPicFront"
+ },
+ "ALAKAZAM": {
+ "back": "alakazamb",
+ "backLabel": "AlakazamPicBack",
+ "front": "alakazam",
+ "frontLabel": "AlakazamPicFront"
+ },
+ "ARBOK": {
+ "back": "arbokb",
+ "backLabel": "ArbokPicBack",
+ "front": "arbok",
+ "frontLabel": "ArbokPicFront"
+ },
+ "ARCANINE": {
+ "back": "arcanineb",
+ "backLabel": "ArcaninePicBack",
+ "front": "arcanine",
+ "frontLabel": "ArcaninePicFront"
+ },
+ "ARTICUNO": {
+ "back": "articunob",
+ "backLabel": "ArticunoPicBack",
+ "front": "articuno",
+ "frontLabel": "ArticunoPicFront"
+ },
+ "BEEDRILL": {
+ "back": "beedrillb",
+ "backLabel": "BeedrillPicBack",
+ "front": "beedrill",
+ "frontLabel": "BeedrillPicFront"
+ },
+ "BELLSPROUT": {
+ "back": "bellsproutb",
+ "backLabel": "BellsproutPicBack",
+ "front": "bellsprout",
+ "frontLabel": "BellsproutPicFront"
+ },
+ "BLASTOISE": {
+ "back": "blastoiseb",
+ "backLabel": "BlastoisePicBack",
+ "front": "blastoise",
+ "frontLabel": "BlastoisePicFront"
+ },
+ "BULBASAUR": {
+ "back": "bulbasaurb",
+ "backLabel": "BulbasaurPicBack",
+ "front": "bulbasaur",
+ "frontLabel": "BulbasaurPicFront"
+ },
+ "BUTTERFREE": {
+ "back": "butterfreeb",
+ "backLabel": "ButterfreePicBack",
+ "front": "butterfree",
+ "frontLabel": "ButterfreePicFront"
+ },
+ "CATERPIE": {
+ "back": "caterpieb",
+ "backLabel": "CaterpiePicBack",
+ "front": "caterpie",
+ "frontLabel": "CaterpiePicFront"
+ },
+ "CHANSEY": {
+ "back": "chanseyb",
+ "backLabel": "ChanseyPicBack",
+ "front": "chansey",
+ "frontLabel": "ChanseyPicFront"
+ },
+ "CHARIZARD": {
+ "back": "charizardb",
+ "backLabel": "CharizardPicBack",
+ "front": "charizard",
+ "frontLabel": "CharizardPicFront"
+ },
+ "CHARMANDER": {
+ "back": "charmanderb",
+ "backLabel": "CharmanderPicBack",
+ "front": "charmander",
+ "frontLabel": "CharmanderPicFront"
+ },
+ "CHARMELEON": {
+ "back": "charmeleonb",
+ "backLabel": "CharmeleonPicBack",
+ "front": "charmeleon",
+ "frontLabel": "CharmeleonPicFront"
+ },
+ "CLEFABLE": {
+ "back": "clefableb",
+ "backLabel": "ClefablePicBack",
+ "front": "clefable",
+ "frontLabel": "ClefablePicFront"
+ },
+ "CLEFAIRY": {
+ "back": "clefairyb",
+ "backLabel": "ClefairyPicBack",
+ "front": "clefairy",
+ "frontLabel": "ClefairyPicFront"
+ },
+ "CLOYSTER": {
+ "back": "cloysterb",
+ "backLabel": "CloysterPicBack",
+ "front": "cloyster",
+ "frontLabel": "CloysterPicFront"
+ },
+ "CUBONE": {
+ "back": "cuboneb",
+ "backLabel": "CubonePicBack",
+ "front": "cubone",
+ "frontLabel": "CubonePicFront"
+ },
+ "DEWGONG": {
+ "back": "dewgongb",
+ "backLabel": "DewgongPicBack",
+ "front": "dewgong",
+ "frontLabel": "DewgongPicFront"
+ },
+ "DIGLETT": {
+ "back": "diglettb",
+ "backLabel": "DiglettPicBack",
+ "front": "diglett",
+ "frontLabel": "DiglettPicFront"
+ },
+ "DITTO": {
+ "back": "dittob",
+ "backLabel": "DittoPicBack",
+ "front": "ditto",
+ "frontLabel": "DittoPicFront"
+ },
+ "DODRIO": {
+ "back": "dodriob",
+ "backLabel": "DodrioPicBack",
+ "front": "dodrio",
+ "frontLabel": "DodrioPicFront"
+ },
+ "DODUO": {
+ "back": "doduob",
+ "backLabel": "DoduoPicBack",
+ "front": "doduo",
+ "frontLabel": "DoduoPicFront"
+ },
+ "DRAGONAIR": {
+ "back": "dragonairb",
+ "backLabel": "DragonairPicBack",
+ "front": "dragonair",
+ "frontLabel": "DragonairPicFront"
+ },
+ "DRAGONITE": {
+ "back": "dragoniteb",
+ "backLabel": "DragonitePicBack",
+ "front": "dragonite",
+ "frontLabel": "DragonitePicFront"
+ },
+ "DRATINI": {
+ "back": "dratinib",
+ "backLabel": "DratiniPicBack",
+ "front": "dratini",
+ "frontLabel": "DratiniPicFront"
+ },
+ "DROWZEE": {
+ "back": "drowzeeb",
+ "backLabel": "DrowzeePicBack",
+ "front": "drowzee",
+ "frontLabel": "DrowzeePicFront"
+ },
+ "DUGTRIO": {
+ "back": "dugtriob",
+ "backLabel": "DugtrioPicBack",
+ "front": "dugtrio",
+ "frontLabel": "DugtrioPicFront"
+ },
+ "EEVEE": {
+ "back": "eeveeb",
+ "backLabel": "EeveePicBack",
+ "front": "eevee",
+ "frontLabel": "EeveePicFront"
+ },
+ "EKANS": {
+ "back": "ekansb",
+ "backLabel": "EkansPicBack",
+ "front": "ekans",
+ "frontLabel": "EkansPicFront"
+ },
+ "ELECTABUZZ": {
+ "back": "electabuzzb",
+ "backLabel": "ElectabuzzPicBack",
+ "front": "electabuzz",
+ "frontLabel": "ElectabuzzPicFront"
+ },
+ "ELECTRODE": {
+ "back": "electrodeb",
+ "backLabel": "ElectrodePicBack",
+ "front": "electrode",
+ "frontLabel": "ElectrodePicFront"
+ },
+ "EXEGGCUTE": {
+ "back": "exeggcuteb",
+ "backLabel": "ExeggcutePicBack",
+ "front": "exeggcute",
+ "frontLabel": "ExeggcutePicFront"
+ },
+ "EXEGGUTOR": {
+ "back": "exeggutorb",
+ "backLabel": "ExeggutorPicBack",
+ "front": "exeggutor",
+ "frontLabel": "ExeggutorPicFront"
+ },
+ "FARFETCHD": {
+ "back": "farfetchdb",
+ "backLabel": "FarfetchdPicBack",
+ "front": "farfetchd",
+ "frontLabel": "FarfetchdPicFront"
+ },
+ "FEAROW": {
+ "back": "fearowb",
+ "backLabel": "FearowPicBack",
+ "front": "fearow",
+ "frontLabel": "FearowPicFront"
+ },
+ "FLAREON": {
+ "back": "flareonb",
+ "backLabel": "FlareonPicBack",
+ "front": "flareon",
+ "frontLabel": "FlareonPicFront"
+ },
+ "GASTLY": {
+ "back": "gastlyb",
+ "backLabel": "GastlyPicBack",
+ "front": "gastly",
+ "frontLabel": "GastlyPicFront"
+ },
+ "GENGAR": {
+ "back": "gengarb",
+ "backLabel": "GengarPicBack",
+ "front": "gengar",
+ "frontLabel": "GengarPicFront"
+ },
+ "GEODUDE": {
+ "back": "geodudeb",
+ "backLabel": "GeodudePicBack",
+ "front": "geodude",
+ "frontLabel": "GeodudePicFront"
+ },
+ "GLOOM": {
+ "back": "gloomb",
+ "backLabel": "GloomPicBack",
+ "front": "gloom",
+ "frontLabel": "GloomPicFront"
+ },
+ "GOLBAT": {
+ "back": "golbatb",
+ "backLabel": "GolbatPicBack",
+ "front": "golbat",
+ "frontLabel": "GolbatPicFront"
+ },
+ "GOLDEEN": {
+ "back": "goldeenb",
+ "backLabel": "GoldeenPicBack",
+ "front": "goldeen",
+ "frontLabel": "GoldeenPicFront"
+ },
+ "GOLDUCK": {
+ "back": "golduckb",
+ "backLabel": "GolduckPicBack",
+ "front": "golduck",
+ "frontLabel": "GolduckPicFront"
+ },
+ "GOLEM": {
+ "back": "golemb",
+ "backLabel": "GolemPicBack",
+ "front": "golem",
+ "frontLabel": "GolemPicFront"
+ },
+ "GRAVELER": {
+ "back": "gravelerb",
+ "backLabel": "GravelerPicBack",
+ "front": "graveler",
+ "frontLabel": "GravelerPicFront"
+ },
+ "GRIMER": {
+ "back": "grimerb",
+ "backLabel": "GrimerPicBack",
+ "front": "grimer",
+ "frontLabel": "GrimerPicFront"
+ },
+ "GROWLITHE": {
+ "back": "growlitheb",
+ "backLabel": "GrowlithePicBack",
+ "front": "growlithe",
+ "frontLabel": "GrowlithePicFront"
+ },
+ "GYARADOS": {
+ "back": "gyaradosb",
+ "backLabel": "GyaradosPicBack",
+ "front": "gyarados",
+ "frontLabel": "GyaradosPicFront"
+ },
+ "HAUNTER": {
+ "back": "haunterb",
+ "backLabel": "HaunterPicBack",
+ "front": "haunter",
+ "frontLabel": "HaunterPicFront"
+ },
+ "HITMONCHAN": {
+ "back": "hitmonchanb",
+ "backLabel": "HitmonchanPicBack",
+ "front": "hitmonchan",
+ "frontLabel": "HitmonchanPicFront"
+ },
+ "HITMONLEE": {
+ "back": "hitmonleeb",
+ "backLabel": "HitmonleePicBack",
+ "front": "hitmonlee",
+ "frontLabel": "HitmonleePicFront"
+ },
+ "HORSEA": {
+ "back": "horseab",
+ "backLabel": "HorseaPicBack",
+ "front": "horsea",
+ "frontLabel": "HorseaPicFront"
+ },
+ "HYPNO": {
+ "back": "hypnob",
+ "backLabel": "HypnoPicBack",
+ "front": "hypno",
+ "frontLabel": "HypnoPicFront"
+ },
+ "IVYSAUR": {
+ "back": "ivysaurb",
+ "backLabel": "IvysaurPicBack",
+ "front": "ivysaur",
+ "frontLabel": "IvysaurPicFront"
+ },
+ "JIGGLYPUFF": {
+ "back": "jigglypuffb",
+ "backLabel": "JigglypuffPicBack",
+ "front": "jigglypuff",
+ "frontLabel": "JigglypuffPicFront"
+ },
+ "JOLTEON": {
+ "back": "jolteonb",
+ "backLabel": "JolteonPicBack",
+ "front": "jolteon",
+ "frontLabel": "JolteonPicFront"
+ },
+ "JYNX": {
+ "back": "jynxb",
+ "backLabel": "JynxPicBack",
+ "front": "jynx",
+ "frontLabel": "JynxPicFront"
+ },
+ "KABUTO": {
+ "back": "kabutob",
+ "backLabel": "KabutoPicBack",
+ "front": "kabuto",
+ "frontLabel": "KabutoPicFront"
+ },
+ "KABUTOPS": {
+ "back": "kabutopsb",
+ "backLabel": "KabutopsPicBack",
+ "front": "kabutops",
+ "frontLabel": "KabutopsPicFront"
+ },
+ "KADABRA": {
+ "back": "kadabrab",
+ "backLabel": "KadabraPicBack",
+ "front": "kadabra",
+ "frontLabel": "KadabraPicFront"
+ },
+ "KAKUNA": {
+ "back": "kakunab",
+ "backLabel": "KakunaPicBack",
+ "front": "kakuna",
+ "frontLabel": "KakunaPicFront"
+ },
+ "KANGASKHAN": {
+ "back": "kangaskhanb",
+ "backLabel": "KangaskhanPicBack",
+ "front": "kangaskhan",
+ "frontLabel": "KangaskhanPicFront"
+ },
+ "KINGLER": {
+ "back": "kinglerb",
+ "backLabel": "KinglerPicBack",
+ "front": "kingler",
+ "frontLabel": "KinglerPicFront"
+ },
+ "KOFFING": {
+ "back": "koffingb",
+ "backLabel": "KoffingPicBack",
+ "front": "koffing",
+ "frontLabel": "KoffingPicFront"
+ },
+ "KRABBY": {
+ "back": "krabbyb",
+ "backLabel": "KrabbyPicBack",
+ "front": "krabby",
+ "frontLabel": "KrabbyPicFront"
+ },
+ "LAPRAS": {
+ "back": "laprasb",
+ "backLabel": "LaprasPicBack",
+ "front": "lapras",
+ "frontLabel": "LaprasPicFront"
+ },
+ "LICKITUNG": {
+ "back": "lickitungb",
+ "backLabel": "LickitungPicBack",
+ "front": "lickitung",
+ "frontLabel": "LickitungPicFront"
+ },
+ "MACHAMP": {
+ "back": "machampb",
+ "backLabel": "MachampPicBack",
+ "front": "machamp",
+ "frontLabel": "MachampPicFront"
+ },
+ "MACHOKE": {
+ "back": "machokeb",
+ "backLabel": "MachokePicBack",
+ "front": "machoke",
+ "frontLabel": "MachokePicFront"
+ },
+ "MACHOP": {
+ "back": "machopb",
+ "backLabel": "MachopPicBack",
+ "front": "machop",
+ "frontLabel": "MachopPicFront"
+ },
+ "MAGIKARP": {
+ "back": "magikarpb",
+ "backLabel": "MagikarpPicBack",
+ "front": "magikarp",
+ "frontLabel": "MagikarpPicFront"
+ },
+ "MAGMAR": {
+ "back": "magmarb",
+ "backLabel": "MagmarPicBack",
+ "front": "magmar",
+ "frontLabel": "MagmarPicFront"
+ },
+ "MAGNEMITE": {
+ "back": "magnemiteb",
+ "backLabel": "MagnemitePicBack",
+ "front": "magnemite",
+ "frontLabel": "MagnemitePicFront"
+ },
+ "MAGNETON": {
+ "back": "magnetonb",
+ "backLabel": "MagnetonPicBack",
+ "front": "magneton",
+ "frontLabel": "MagnetonPicFront"
+ },
+ "MANKEY": {
+ "back": "mankeyb",
+ "backLabel": "MankeyPicBack",
+ "front": "mankey",
+ "frontLabel": "MankeyPicFront"
+ },
+ "MAROWAK": {
+ "back": "marowakb",
+ "backLabel": "MarowakPicBack",
+ "front": "marowak",
+ "frontLabel": "MarowakPicFront"
+ },
+ "MEOWTH": {
+ "back": "meowthb",
+ "backLabel": "MeowthPicBack",
+ "front": "meowth",
+ "frontLabel": "MeowthPicFront"
+ },
+ "METAPOD": {
+ "back": "metapodb",
+ "backLabel": "MetapodPicBack",
+ "front": "metapod",
+ "frontLabel": "MetapodPicFront"
+ },
+ "MEW": {
+ "back": "mewb",
+ "backLabel": "MewPicBack",
+ "front": "mew",
+ "frontLabel": "MewPicFront"
+ },
+ "MEWTWO": {
+ "back": "mewtwob",
+ "backLabel": "MewtwoPicBack",
+ "front": "mewtwo",
+ "frontLabel": "MewtwoPicFront"
+ },
+ "MOLTRES": {
+ "back": "moltresb",
+ "backLabel": "MoltresPicBack",
+ "front": "moltres",
+ "frontLabel": "MoltresPicFront"
+ },
+ "MR_MIME": {
+ "back": "mr.mimeb",
+ "backLabel": "MrMimePicBack",
+ "front": "mr.mime",
+ "frontLabel": "MrMimePicFront"
+ },
+ "MUK": {
+ "back": "mukb",
+ "backLabel": "MukPicBack",
+ "front": "muk",
+ "frontLabel": "MukPicFront"
+ },
+ "NIDOKING": {
+ "back": "nidokingb",
+ "backLabel": "NidokingPicBack",
+ "front": "nidoking",
+ "frontLabel": "NidokingPicFront"
+ },
+ "NIDOQUEEN": {
+ "back": "nidoqueenb",
+ "backLabel": "NidoqueenPicBack",
+ "front": "nidoqueen",
+ "frontLabel": "NidoqueenPicFront"
+ },
+ "NIDORAN_F": {
+ "back": "nidoranfb",
+ "backLabel": "NidoranFPicBack",
+ "front": "nidoranf",
+ "frontLabel": "NidoranFPicFront"
+ },
+ "NIDORAN_M": {
+ "back": "nidoranmb",
+ "backLabel": "NidoranMPicBack",
+ "front": "nidoranm",
+ "frontLabel": "NidoranMPicFront"
+ },
+ "NIDORINA": {
+ "back": "nidorinab",
+ "backLabel": "NidorinaPicBack",
+ "front": "nidorina",
+ "frontLabel": "NidorinaPicFront"
+ },
+ "NIDORINO": {
+ "back": "nidorinob",
+ "backLabel": "NidorinoPicBack",
+ "front": "nidorino",
+ "frontLabel": "NidorinoPicFront"
+ },
+ "NINETALES": {
+ "back": "ninetalesb",
+ "backLabel": "NinetalesPicBack",
+ "front": "ninetales",
+ "frontLabel": "NinetalesPicFront"
+ },
+ "ODDISH": {
+ "back": "oddishb",
+ "backLabel": "OddishPicBack",
+ "front": "oddish",
+ "frontLabel": "OddishPicFront"
+ },
+ "OMANYTE": {
+ "back": "omanyteb",
+ "backLabel": "OmanytePicBack",
+ "front": "omanyte",
+ "frontLabel": "OmanytePicFront"
+ },
+ "OMASTAR": {
+ "back": "omastarb",
+ "backLabel": "OmastarPicBack",
+ "front": "omastar",
+ "frontLabel": "OmastarPicFront"
+ },
+ "ONIX": {
+ "back": "onixb",
+ "backLabel": "OnixPicBack",
+ "front": "onix",
+ "frontLabel": "OnixPicFront"
+ },
+ "PARAS": {
+ "back": "parasb",
+ "backLabel": "ParasPicBack",
+ "front": "paras",
+ "frontLabel": "ParasPicFront"
+ },
+ "PARASECT": {
+ "back": "parasectb",
+ "backLabel": "ParasectPicBack",
+ "front": "parasect",
+ "frontLabel": "ParasectPicFront"
+ },
+ "PERSIAN": {
+ "back": "persianb",
+ "backLabel": "PersianPicBack",
+ "front": "persian",
+ "frontLabel": "PersianPicFront"
+ },
+ "PIDGEOT": {
+ "back": "pidgeotb",
+ "backLabel": "PidgeotPicBack",
+ "front": "pidgeot",
+ "frontLabel": "PidgeotPicFront"
+ },
+ "PIDGEOTTO": {
+ "back": "pidgeottob",
+ "backLabel": "PidgeottoPicBack",
+ "front": "pidgeotto",
+ "frontLabel": "PidgeottoPicFront"
+ },
+ "PIDGEY": {
+ "back": "pidgeyb",
+ "backLabel": "PidgeyPicBack",
+ "front": "pidgey",
+ "frontLabel": "PidgeyPicFront"
+ },
+ "PIKACHU": {
+ "back": "pikachub",
+ "backLabel": "PikachuPicBack",
+ "front": "pikachu",
+ "frontLabel": "PikachuPicFront"
+ },
+ "PINSIR": {
+ "back": "pinsirb",
+ "backLabel": "PinsirPicBack",
+ "front": "pinsir",
+ "frontLabel": "PinsirPicFront"
+ },
+ "POLIWAG": {
+ "back": "poliwagb",
+ "backLabel": "PoliwagPicBack",
+ "front": "poliwag",
+ "frontLabel": "PoliwagPicFront"
+ },
+ "POLIWHIRL": {
+ "back": "poliwhirlb",
+ "backLabel": "PoliwhirlPicBack",
+ "front": "poliwhirl",
+ "frontLabel": "PoliwhirlPicFront"
+ },
+ "POLIWRATH": {
+ "back": "poliwrathb",
+ "backLabel": "PoliwrathPicBack",
+ "front": "poliwrath",
+ "frontLabel": "PoliwrathPicFront"
+ },
+ "PONYTA": {
+ "back": "ponytab",
+ "backLabel": "PonytaPicBack",
+ "front": "ponyta",
+ "frontLabel": "PonytaPicFront"
+ },
+ "PORYGON": {
+ "back": "porygonb",
+ "backLabel": "PorygonPicBack",
+ "front": "porygon",
+ "frontLabel": "PorygonPicFront"
+ },
+ "PRIMEAPE": {
+ "back": "primeapeb",
+ "backLabel": "PrimeapePicBack",
+ "front": "primeape",
+ "frontLabel": "PrimeapePicFront"
+ },
+ "PSYDUCK": {
+ "back": "psyduckb",
+ "backLabel": "PsyduckPicBack",
+ "front": "psyduck",
+ "frontLabel": "PsyduckPicFront"
+ },
+ "RAICHU": {
+ "back": "raichub",
+ "backLabel": "RaichuPicBack",
+ "front": "raichu",
+ "frontLabel": "RaichuPicFront"
+ },
+ "RAPIDASH": {
+ "back": "rapidashb",
+ "backLabel": "RapidashPicBack",
+ "front": "rapidash",
+ "frontLabel": "RapidashPicFront"
+ },
+ "RATICATE": {
+ "back": "raticateb",
+ "backLabel": "RaticatePicBack",
+ "front": "raticate",
+ "frontLabel": "RaticatePicFront"
+ },
+ "RATTATA": {
+ "back": "rattatab",
+ "backLabel": "RattataPicBack",
+ "front": "rattata",
+ "frontLabel": "RattataPicFront"
+ },
+ "RHYDON": {
+ "back": "rhydonb",
+ "backLabel": "RhydonPicBack",
+ "front": "rhydon",
+ "frontLabel": "RhydonPicFront"
+ },
+ "RHYHORN": {
+ "back": "rhyhornb",
+ "backLabel": "RhyhornPicBack",
+ "front": "rhyhorn",
+ "frontLabel": "RhyhornPicFront"
+ },
+ "SANDSHREW": {
+ "back": "sandshrewb",
+ "backLabel": "SandshrewPicBack",
+ "front": "sandshrew",
+ "frontLabel": "SandshrewPicFront"
+ },
+ "SANDSLASH": {
+ "back": "sandslashb",
+ "backLabel": "SandslashPicBack",
+ "front": "sandslash",
+ "frontLabel": "SandslashPicFront"
+ },
+ "SCYTHER": {
+ "back": "scytherb",
+ "backLabel": "ScytherPicBack",
+ "front": "scyther",
+ "frontLabel": "ScytherPicFront"
+ },
+ "SEADRA": {
+ "back": "seadrab",
+ "backLabel": "SeadraPicBack",
+ "front": "seadra",
+ "frontLabel": "SeadraPicFront"
+ },
+ "SEAKING": {
+ "back": "seakingb",
+ "backLabel": "SeakingPicBack",
+ "front": "seaking",
+ "frontLabel": "SeakingPicFront"
+ },
+ "SEEL": {
+ "back": "seelb",
+ "backLabel": "SeelPicBack",
+ "front": "seel",
+ "frontLabel": "SeelPicFront"
+ },
+ "SHELLDER": {
+ "back": "shellderb",
+ "backLabel": "ShellderPicBack",
+ "front": "shellder",
+ "frontLabel": "ShellderPicFront"
+ },
+ "SLOWBRO": {
+ "back": "slowbrob",
+ "backLabel": "SlowbroPicBack",
+ "front": "slowbro",
+ "frontLabel": "SlowbroPicFront"
+ },
+ "SLOWPOKE": {
+ "back": "slowpokeb",
+ "backLabel": "SlowpokePicBack",
+ "front": "slowpoke",
+ "frontLabel": "SlowpokePicFront"
+ },
+ "SNORLAX": {
+ "back": "snorlaxb",
+ "backLabel": "SnorlaxPicBack",
+ "front": "snorlax",
+ "frontLabel": "SnorlaxPicFront"
+ },
+ "SPEAROW": {
+ "back": "spearowb",
+ "backLabel": "SpearowPicBack",
+ "front": "spearow",
+ "frontLabel": "SpearowPicFront"
+ },
+ "SQUIRTLE": {
+ "back": "squirtleb",
+ "backLabel": "SquirtlePicBack",
+ "front": "squirtle",
+ "frontLabel": "SquirtlePicFront"
+ },
+ "STARMIE": {
+ "back": "starmieb",
+ "backLabel": "StarmiePicBack",
+ "front": "starmie",
+ "frontLabel": "StarmiePicFront"
+ },
+ "STARYU": {
+ "back": "staryub",
+ "backLabel": "StaryuPicBack",
+ "front": "staryu",
+ "frontLabel": "StaryuPicFront"
+ },
+ "TANGELA": {
+ "back": "tangelab",
+ "backLabel": "TangelaPicBack",
+ "front": "tangela",
+ "frontLabel": "TangelaPicFront"
+ },
+ "TAUROS": {
+ "back": "taurosb",
+ "backLabel": "TaurosPicBack",
+ "front": "tauros",
+ "frontLabel": "TaurosPicFront"
+ },
+ "TENTACOOL": {
+ "back": "tentacoolb",
+ "backLabel": "TentacoolPicBack",
+ "front": "tentacool",
+ "frontLabel": "TentacoolPicFront"
+ },
+ "TENTACRUEL": {
+ "back": "tentacruelb",
+ "backLabel": "TentacruelPicBack",
+ "front": "tentacruel",
+ "frontLabel": "TentacruelPicFront"
+ },
+ "VAPOREON": {
+ "back": "vaporeonb",
+ "backLabel": "VaporeonPicBack",
+ "front": "vaporeon",
+ "frontLabel": "VaporeonPicFront"
+ },
+ "VENOMOTH": {
+ "back": "venomothb",
+ "backLabel": "VenomothPicBack",
+ "front": "venomoth",
+ "frontLabel": "VenomothPicFront"
+ },
+ "VENONAT": {
+ "back": "venonatb",
+ "backLabel": "VenonatPicBack",
+ "front": "venonat",
+ "frontLabel": "VenonatPicFront"
+ },
+ "VENUSAUR": {
+ "back": "venusaurb",
+ "backLabel": "VenusaurPicBack",
+ "front": "venusaur",
+ "frontLabel": "VenusaurPicFront"
+ },
+ "VICTREEBEL": {
+ "back": "victreebelb",
+ "backLabel": "VictreebelPicBack",
+ "front": "victreebel",
+ "frontLabel": "VictreebelPicFront"
+ },
+ "VILEPLUME": {
+ "back": "vileplumeb",
+ "backLabel": "VileplumePicBack",
+ "front": "vileplume",
+ "frontLabel": "VileplumePicFront"
+ },
+ "VOLTORB": {
+ "back": "voltorbb",
+ "backLabel": "VoltorbPicBack",
+ "front": "voltorb",
+ "frontLabel": "VoltorbPicFront"
+ },
+ "VULPIX": {
+ "back": "vulpixb",
+ "backLabel": "VulpixPicBack",
+ "front": "vulpix",
+ "frontLabel": "VulpixPicFront"
+ },
+ "WARTORTLE": {
+ "back": "wartortleb",
+ "backLabel": "WartortlePicBack",
+ "front": "wartortle",
+ "frontLabel": "WartortlePicFront"
+ },
+ "WEEDLE": {
+ "back": "weedleb",
+ "backLabel": "WeedlePicBack",
+ "front": "weedle",
+ "frontLabel": "WeedlePicFront"
+ },
+ "WEEPINBELL": {
+ "back": "weepinbellb",
+ "backLabel": "WeepinbellPicBack",
+ "front": "weepinbell",
+ "frontLabel": "WeepinbellPicFront"
+ },
+ "WEEZING": {
+ "back": "weezingb",
+ "backLabel": "WeezingPicBack",
+ "front": "weezing",
+ "frontLabel": "WeezingPicFront"
+ },
+ "WIGGLYTUFF": {
+ "back": "wigglytuffb",
+ "backLabel": "WigglytuffPicBack",
+ "front": "wigglytuff",
+ "frontLabel": "WigglytuffPicFront"
+ },
+ "ZAPDOS": {
+ "back": "zapdosb",
+ "backLabel": "ZapdosPicBack",
+ "front": "zapdos",
+ "frontLabel": "ZapdosPicFront"
+ },
+ "ZUBAT": {
+ "back": "zubatb",
+ "backLabel": "ZubatPicBack",
+ "front": "zubat",
+ "frontLabel": "ZubatPicFront"
+ }
+ },
+ "romSha1": "cc7d03262ebfaf2f06772c1a480c7d9d5f4a38e1",
+ "sfxKeys": {
+ "134": "Level_Up",
+ "145": "Ball_Toss",
+ "147": "Ball_Poof",
+ "149": "Faint_Thud",
+ "151": "Run",
+ "152": "Dex_Page_Added",
+ "154": "Caught_Mon",
+ "157": "Peck",
+ "158": "Faint_Fall",
+ "159": "Battle_09",
+ "160": "Pound",
+ "161": "Battle_0B",
+ "162": "Battle_0C",
+ "163": "Battle_0D",
+ "164": "Battle_0E",
+ "165": "Battle_0F",
+ "166": "Damage",
+ "167": "Not_Very_Effective",
+ "168": "Battle_12",
+ "169": "Battle_13",
+ "170": "Battle_14",
+ "171": "Vine_Whip",
+ "172": "Battle_16",
+ "173": "Battle_17",
+ "174": "Battle_18",
+ "175": "Battle_19",
+ "176": "Super_Effective",
+ "177": "Battle_1B",
+ "178": "Battle_1C",
+ "179": "Doubleslap",
+ "180": "Battle_1E",
+ "182": "Horn_Drill",
+ "183": "Battle_20",
+ "184": "Battle_21",
+ "185": "Battle_22",
+ "186": "Battle_23",
+ "187": "Battle_24",
+ "189": "Battle_25",
+ "190": "Battle_26",
+ "191": "Battle_27",
+ "194": "Battle_28",
+ "197": "Battle_29",
+ "199": "Battle_2A",
+ "202": "Battle_2B",
+ "204": "Battle_2C",
+ "207": "Psybeam",
+ "210": "Battle_2E",
+ "213": "Battle_2F",
+ "216": "Psychic_M",
+ "219": "Battle_31",
+ "221": "Battle_32",
+ "223": "Battle_33",
+ "225": "Battle_34",
+ "228": "Battle_35",
+ "230": "Battle_36",
+ "233": "Trainer_Appeared"
+ },
+ "sprites": {
+ "bike": {
+ "imageBase": "red_bike",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "RedBikeSprite"
+ },
+ "order": [
+ {
+ "id": "SPRITE_RED",
+ "imageBase": "red",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "RedSprite"
+ },
+ {
+ "id": "SPRITE_BLUE",
+ "imageBase": "blue",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "BlueSprite"
+ },
+ {
+ "id": "SPRITE_OAK",
+ "imageBase": "oak",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "OakSprite"
+ },
+ {
+ "id": "SPRITE_YOUNGSTER",
+ "imageBase": "youngster",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "YoungsterSprite"
+ },
+ {
+ "id": "SPRITE_MONSTER",
+ "imageBase": "monster",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "MonsterSprite"
+ },
+ {
+ "id": "SPRITE_COOLTRAINER_F",
+ "imageBase": "cooltrainer_f",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "CooltrainerFSprite"
+ },
+ {
+ "id": "SPRITE_COOLTRAINER_M",
+ "imageBase": "cooltrainer_m",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "CooltrainerMSprite"
+ },
+ {
+ "id": "SPRITE_LITTLE_GIRL",
+ "imageBase": "little_girl",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "LittleGirlSprite"
+ },
+ {
+ "id": "SPRITE_BIRD",
+ "imageBase": "bird",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "BirdSprite"
+ },
+ {
+ "id": "SPRITE_MIDDLE_AGED_MAN",
+ "imageBase": "middle_aged_man",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "MiddleAgedManSprite"
+ },
+ {
+ "id": "SPRITE_GAMBLER",
+ "imageBase": "gambler",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "GamblerSprite"
+ },
+ {
+ "id": "SPRITE_SUPER_NERD",
+ "imageBase": "super_nerd",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "SuperNerdSprite"
+ },
+ {
+ "id": "SPRITE_GIRL",
+ "imageBase": "girl",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "GirlSprite"
+ },
+ {
+ "id": "SPRITE_HIKER",
+ "imageBase": "hiker",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "HikerSprite"
+ },
+ {
+ "id": "SPRITE_BEAUTY",
+ "imageBase": "beauty",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "BeautySprite"
+ },
+ {
+ "id": "SPRITE_GENTLEMAN",
+ "imageBase": "gentleman",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "GentlemanSprite"
+ },
+ {
+ "id": "SPRITE_DAISY",
+ "imageBase": "daisy",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "DaisySprite"
+ },
+ {
+ "id": "SPRITE_BIKER",
+ "imageBase": "biker",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "BikerSprite"
+ },
+ {
+ "id": "SPRITE_SAILOR",
+ "imageBase": "sailor",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "SailorSprite"
+ },
+ {
+ "id": "SPRITE_COOK",
+ "imageBase": "cook",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "CookSprite"
+ },
+ {
+ "id": "SPRITE_BIKE_SHOP_CLERK",
+ "imageBase": "bike_shop_clerk",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "BikeShopClerkSprite"
+ },
+ {
+ "id": "SPRITE_MR_FUJI",
+ "imageBase": "mr_fuji",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "MrFujiSprite"
+ },
+ {
+ "id": "SPRITE_GIOVANNI",
+ "imageBase": "giovanni",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "GiovanniSprite"
+ },
+ {
+ "id": "SPRITE_ROCKET",
+ "imageBase": "rocket",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "RocketSprite"
+ },
+ {
+ "id": "SPRITE_CHANNELER",
+ "imageBase": "channeler",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "ChannelerSprite"
+ },
+ {
+ "id": "SPRITE_WAITER",
+ "imageBase": "waiter",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "WaiterSprite"
+ },
+ {
+ "id": "SPRITE_SILPH_WORKER_F",
+ "imageBase": "silph_worker_f",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "SilphWorkerFSprite"
+ },
+ {
+ "id": "SPRITE_MIDDLE_AGED_WOMAN",
+ "imageBase": "middle_aged_woman",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "MiddleAgedWomanSprite"
+ },
+ {
+ "id": "SPRITE_BRUNETTE_GIRL",
+ "imageBase": "brunette_girl",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "BrunetteGirlSprite"
+ },
+ {
+ "id": "SPRITE_LANCE",
+ "imageBase": "lance",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "LanceSprite"
+ },
+ {
+ "id": "SPRITE_UNUSED_RED_1",
+ "imageBase": "red",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "RedSprite"
+ },
+ {
+ "id": "SPRITE_SCIENTIST",
+ "imageBase": "scientist",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "ScientistSprite"
+ },
+ {
+ "id": "SPRITE_ROCKER",
+ "imageBase": "rocker",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "RockerSprite"
+ },
+ {
+ "id": "SPRITE_SWIMMER",
+ "imageBase": "swimmer",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "SwimmerSprite"
+ },
+ {
+ "id": "SPRITE_SAFARI_ZONE_WORKER",
+ "imageBase": "safari_zone_worker",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "SafariZoneWorkerSprite"
+ },
+ {
+ "id": "SPRITE_GYM_GUIDE",
+ "imageBase": "gym_guide",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "GymGuideSprite"
+ },
+ {
+ "id": "SPRITE_GRAMPS",
+ "imageBase": "gramps",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "GrampsSprite"
+ },
+ {
+ "id": "SPRITE_CLERK",
+ "imageBase": "clerk",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "ClerkSprite"
+ },
+ {
+ "id": "SPRITE_FISHING_GURU",
+ "imageBase": "fishing_guru",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "FishingGuruSprite"
+ },
+ {
+ "id": "SPRITE_GRANNY",
+ "imageBase": "granny",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "GrannySprite"
+ },
+ {
+ "id": "SPRITE_NURSE",
+ "imageBase": "nurse",
+ "imageHeight": 64,
+ "imageWidth": 16,
+ "label": "NurseSprite"
+ },
+ {
+ "id": "SPRITE_LINK_RECEPTIONIST",
+ "imageBase": "link_receptionist",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "LinkReceptionistSprite"
+ },
+ {
+ "id": "SPRITE_SILPH_PRESIDENT",
+ "imageBase": "silph_president",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "SilphPresidentSprite"
+ },
+ {
+ "id": "SPRITE_SILPH_WORKER_M",
+ "imageBase": "silph_worker_m",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "SilphWorkerMSprite"
+ },
+ {
+ "id": "SPRITE_WARDEN",
+ "imageBase": "warden",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "WardenSprite"
+ },
+ {
+ "id": "SPRITE_CAPTAIN",
+ "imageBase": "captain",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "CaptainSprite"
+ },
+ {
+ "id": "SPRITE_FISHER",
+ "imageBase": "fisher",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "FisherSprite"
+ },
+ {
+ "id": "SPRITE_KOGA",
+ "imageBase": "koga",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "KogaSprite"
+ },
+ {
+ "id": "SPRITE_GUARD",
+ "imageBase": "guard",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "GuardSprite"
+ },
+ {
+ "id": "SPRITE_UNUSED_RED_2",
+ "imageBase": "red",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "RedSprite"
+ },
+ {
+ "id": "SPRITE_MOM",
+ "imageBase": "mom",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "MomSprite"
+ },
+ {
+ "id": "SPRITE_BALDING_GUY",
+ "imageBase": "balding_guy",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "BaldingGuySprite"
+ },
+ {
+ "id": "SPRITE_LITTLE_BOY",
+ "imageBase": "little_boy",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "LittleBoySprite"
+ },
+ {
+ "id": "SPRITE_UNUSED_RED_3",
+ "imageBase": "red",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "RedSprite"
+ },
+ {
+ "id": "SPRITE_GAMEBOY_KID",
+ "imageBase": "gameboy_kid",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "GameboyKidSprite"
+ },
+ {
+ "id": "SPRITE_FAIRY",
+ "imageBase": "fairy",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "FairySprite"
+ },
+ {
+ "id": "SPRITE_AGATHA",
+ "imageBase": "agatha",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "AgathaSprite"
+ },
+ {
+ "id": "SPRITE_BRUNO",
+ "imageBase": "bruno",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "BrunoSprite"
+ },
+ {
+ "id": "SPRITE_LORELEI",
+ "imageBase": "lorelei",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "LoreleiSprite"
+ },
+ {
+ "id": "SPRITE_SEEL",
+ "imageBase": "seel",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "SeelSprite"
+ },
+ {
+ "id": "SPRITE_PIKACHU",
+ "imageBase": "pikachu",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "PikachuSprite"
+ },
+ {
+ "id": "SPRITE_OFFICER_JENNY",
+ "imageBase": "officer_jenny",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "OfficerJennySprite"
+ },
+ {
+ "id": "SPRITE_SANDSHREW",
+ "imageBase": "sandshrew",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "SandshrewSprite"
+ },
+ {
+ "id": "SPRITE_ODDISH",
+ "imageBase": "oddish",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "OddishSprite"
+ },
+ {
+ "id": "SPRITE_BULBASAUR",
+ "imageBase": "bulbasaur",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "BulbasaurSprite"
+ },
+ {
+ "id": "SPRITE_JIGGLYPUFF",
+ "imageBase": "jigglypuff",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "JigglypuffSprite"
+ },
+ {
+ "id": "SPRITE_CLEFAIRY",
+ "imageBase": "clefairy",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "ClefairySprite"
+ },
+ {
+ "id": "SPRITE_CHANSEY",
+ "imageBase": "chansey",
+ "imageHeight": 48,
+ "imageWidth": 16,
+ "label": "ChanseySprite"
+ },
+ {
+ "id": "SPRITE_JESSIE",
+ "imageBase": "jessie",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "JessieSprite"
+ },
+ {
+ "id": "SPRITE_JAMES",
+ "imageBase": "james",
+ "imageHeight": 96,
+ "imageWidth": 16,
+ "label": "JamesSprite"
+ },
+ {
+ "id": "SPRITE_POKE_BALL",
+ "imageBase": "poke_ball",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "PokeBallSprite"
+ },
+ {
+ "id": "SPRITE_FOSSIL",
+ "imageBase": "fossil",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "FossilSprite"
+ },
+ {
+ "id": "SPRITE_BOULDER",
+ "imageBase": "boulder",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "BoulderSprite"
+ },
+ {
+ "id": "SPRITE_PAPER",
+ "imageBase": "paper",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "PaperSprite"
+ },
+ {
+ "id": "SPRITE_POKEDEX",
+ "imageBase": "pokedex",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "PokedexSprite"
+ },
+ {
+ "id": "SPRITE_CLIPBOARD",
+ "imageBase": "clipboard",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "ClipboardSprite"
+ },
+ {
+ "id": "SPRITE_SNORLAX",
+ "imageBase": "snorlax",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "SnorlaxSprite"
+ },
+ {
+ "id": "SPRITE_UNUSED_OLD_AMBER",
+ "imageBase": "old_amber",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "OldAmberSprite"
+ },
+ {
+ "id": "SPRITE_OLD_AMBER",
+ "imageBase": "old_amber",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "OldAmberSprite"
+ },
+ {
+ "id": "SPRITE_UNUSED_GAMBLER_ASLEEP_1",
+ "imageBase": "gambler_asleep",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "GamblerAsleepSprite"
+ },
+ {
+ "id": "SPRITE_UNUSED_GAMBLER_ASLEEP_2",
+ "imageBase": "gambler_asleep",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "GamblerAsleepSprite"
+ },
+ {
+ "id": "SPRITE_GAMBLER_ASLEEP",
+ "imageBase": "gambler_asleep",
+ "imageHeight": 16,
+ "imageWidth": 16,
+ "label": "GamblerAsleepSprite"
+ }
+ ]
+ },
+ "symbols": {
+ "AbraPicBack": [
+ 12,
+ 29605
+ ],
+ "AbraPicFront": [
+ 12,
+ 29340
+ ],
+ "AerodactylPicBack": [
+ 13,
+ 23607
+ ],
+ "AerodactylPicFront": [
+ 13,
+ 23142
+ ],
+ "AgathaPic": [
+ 19,
+ 31214
+ ],
+ "AgathasRoomAgathaDontRunAwayText": [
+ 29,
+ 23983
+ ],
+ "AgathasRoomAgathaText": [
+ 29,
+ 23958
+ ],
+ "AgathasRoom_h": [
+ 29,
+ 23713
+ ],
+ "AlakazamPicBack": [
+ 12,
+ 30261
+ ],
+ "AlakazamPicFront": [
+ 12,
+ 29744
+ ],
+ "ArbokPicBack": [
+ 10,
+ 22645
+ ],
+ "ArbokPicFront": [
+ 10,
+ 22170
+ ],
+ "ArcaninePicBack": [
+ 9,
+ 26939
+ ],
+ "ArcaninePicFront": [
+ 9,
+ 26421
+ ],
+ "ArticunoPicBack": [
+ 11,
+ 16960
+ ],
+ "ArticunoPicFront": [
+ 11,
+ 16384
+ ],
+ "AttackAnimationPointers": [
+ 30,
+ 25130
+ ],
+ "BadgeNumbersTileGraphics": [
+ 61,
+ 24100
+ ],
+ "BaseStats": [
+ 14,
+ 17374
+ ],
+ "BattleHudTiles1": [
+ 4,
+ 19456
+ ],
+ "BattleHudTiles2": [
+ 4,
+ 19480
+ ],
+ "BattleHudTiles3": [
+ 4,
+ 19504
+ ],
+ "BattleTransitionTile": [
+ 28,
+ 19139
+ ],
+ "BeautyPic": [
+ 19,
+ 21983
+ ],
+ "BeedrillPicBack": [
+ 11,
+ 31530
+ ],
+ "BeedrillPicFront": [
+ 11,
+ 31003
+ ],
+ "BellsproutPicBack": [
+ 13,
+ 28725
+ ],
+ "BellsproutPicFront": [
+ 13,
+ 28510
+ ],
+ "BikeShopClerkText": [
+ 7,
+ 20558
+ ],
+ "BikeShopMiddleAgedWomanText": [
+ 7,
+ 20801
+ ],
+ "BikeShopYoungsterText": [
+ 7,
+ 20816
+ ],
+ "BikeShop_h": [
+ 7,
+ 20536
+ ],
+ "BikerPic": [
+ 19,
+ 19134
+ ],
+ "BillsHouseBillCheckOutMyRarePokemonText": [
+ 7,
+ 25196
+ ],
+ "BillsHouseBillDontLeaveText": [
+ 7,
+ 25167
+ ],
+ "BillsHouseBillPokemonText": [
+ 7,
+ 25172
+ ],
+ "BillsHouseBillSSTicketText": [
+ 7,
+ 25184
+ ],
+ "BillsHouse_h": [
+ 7,
+ 24686
+ ],
+ "BirdKeeperPic": [
+ 19,
+ 23771
+ ],
+ "BlackbeltPic": [
+ 19,
+ 24182
+ ],
+ "BlainePic": [
+ 19,
+ 28987
+ ],
+ "BlastoisePicBack": [
+ 9,
+ 30731
+ ],
+ "BlastoisePicFront": [
+ 9,
+ 30202
+ ],
+ "BluesHouseDaisySittingText": [
+ 6,
+ 23643
+ ],
+ "BluesHouseDaisyWalkingText": [
+ 6,
+ 23746
+ ],
+ "BluesHouseTownMapText": [
+ 6,
+ 23751
+ ],
+ "BluesHouse_h": [
+ 6,
+ 23599
+ ],
+ "BoltEmote": [
+ 16,
+ 21285
+ ],
+ "BoulderText": [
+ 0,
+ 9184
+ ],
+ "BrockPic": [
+ 19,
+ 27417
+ ],
+ "BrunoPic": [
+ 19,
+ 26910
+ ],
+ "BrunosRoomBrunoDontRunAwayText": [
+ 29,
+ 23634
+ ],
+ "BrunosRoomBrunoText": [
+ 29,
+ 23609
+ ],
+ "BrunosRoom_h": [
+ 29,
+ 23370
+ ],
+ "BugCatcherPic": [
+ 19,
+ 16582
+ ],
+ "BugIconFrame1": [
+ 28,
+ 23046
+ ],
+ "BugIconFrame2": [
+ 28,
+ 23110
+ ],
+ "BulbasaurPicBack": [
+ 13,
+ 16612
+ ],
+ "BulbasaurPicFront": [
+ 13,
+ 16384
+ ],
+ "BurglarPic": [
+ 19,
+ 19601
+ ],
+ "ButterfreePicBack": [
+ 12,
+ 20276
+ ],
+ "ButterfreePicFront": [
+ 12,
+ 19805
+ ],
+ "CGBBasePalettes": [
+ 28,
+ 27385
+ ],
+ "CaterpiePicBack": [
+ 12,
+ 19432
+ ],
+ "CaterpiePicFront": [
+ 12,
+ 19205
+ ],
+ "CeladonChiefHouseChiefText": [
+ 18,
+ 20990
+ ],
+ "CeladonChiefHouseRocketText": [
+ 18,
+ 20995
+ ],
+ "CeladonChiefHouseSailorText": [
+ 18,
+ 21000
+ ],
+ "CeladonChiefHouse_h": [
+ 18,
+ 20968
+ ],
+ "CeladonCityDeptStoreSignText": [
+ 6,
+ 23319
+ ],
+ "CeladonCityFisherText": [
+ 6,
+ 23264
+ ],
+ "CeladonCityGameCornerSignText": [
+ 6,
+ 23334
+ ],
+ "CeladonCityGirlText": [
+ 6,
+ 23181
+ ],
+ "CeladonCityGramps1Text": [
+ 6,
+ 23176
+ ],
+ "CeladonCityGramps2Text": [
+ 6,
+ 23186
+ ],
+ "CeladonCityGramps3Text": [
+ 6,
+ 23191
+ ],
+ "CeladonCityGymSignText": [
+ 6,
+ 23309
+ ],
+ "CeladonCityLittleGirlText": [
+ 6,
+ 23171
+ ],
+ "CeladonCityMansionSignText": [
+ 6,
+ 23314
+ ],
+ "CeladonCityPoliwrathText": [
+ 6,
+ 23269
+ ],
+ "CeladonCityPrizeExchangeSignText": [
+ 6,
+ 23329
+ ],
+ "CeladonCityRocket1Text": [
+ 6,
+ 23282
+ ],
+ "CeladonCityRocket2Text": [
+ 6,
+ 23287
+ ],
+ "CeladonCitySignText": [
+ 6,
+ 23304
+ ],
+ "CeladonCityTrainerTips1Text": [
+ 6,
+ 23292
+ ],
+ "CeladonCityTrainerTips2Text": [
+ 6,
+ 23324
+ ],
+ "CeladonCity_h": [
+ 6,
+ 16384
+ ],
+ "CeladonDinerCookText": [
+ 18,
+ 20866
+ ],
+ "CeladonDinerFisherText": [
+ 18,
+ 20881
+ ],
+ "CeladonDinerGymGuideText": [
+ 18,
+ 20886
+ ],
+ "CeladonDinerMiddleAgedManText": [
+ 18,
+ 20876
+ ],
+ "CeladonDinerMiddleAgedWomanText": [
+ 18,
+ 20871
+ ],
+ "CeladonDiner_h": [
+ 18,
+ 20840
+ ],
+ "CeladonGymBeauty1Text": [
+ 18,
+ 19121
+ ],
+ "CeladonGymBeauty2Text": [
+ 18,
+ 19171
+ ],
+ "CeladonGymBeauty3Text": [
+ 18,
+ 19221
+ ],
+ "CeladonGymCooltrainerF1Text": [
+ 18,
+ 19096
+ ],
+ "CeladonGymCooltrainerF2Text": [
+ 18,
+ 19146
+ ],
+ "CeladonGymCooltrainerF3Text": [
+ 18,
+ 19196
+ ],
+ "CeladonGymCooltrainerF4Text": [
+ 18,
+ 19246
+ ],
+ "CeladonGymErikaText": [
+ 18,
+ 18984
+ ],
+ "CeladonGymRainbowBadgeInfoText": [
+ 18,
+ 19076
+ ],
+ "CeladonGymReceivedTM21Text": [
+ 18,
+ 19081
+ ],
+ "CeladonGymTM21NoRoomText": [
+ 18,
+ 19091
+ ],
+ "CeladonGym_h": [
+ 18,
+ 18709
+ ],
+ "CeladonHotelBeautyText": [
+ 18,
+ 21085
+ ],
+ "CeladonHotelGrannyText": [
+ 18,
+ 21080
+ ],
+ "CeladonHotelSuperNerdText": [
+ 18,
+ 21090
+ ],
+ "CeladonHotel_h": [
+ 18,
+ 21059
+ ],
+ "CeladonMansion1FClefairyText": [
+ 18,
+ 17884
+ ],
+ "CeladonMansion1FGrannyText": [
+ 18,
+ 17850
+ ],
+ "CeladonMansion1FManagersSuiteSignText": [
+ 18,
+ 17910
+ ],
+ "CeladonMansion1FMeowthText": [
+ 18,
+ 17837
+ ],
+ "CeladonMansion1FNidoranFText": [
+ 18,
+ 17897
+ ],
+ "CeladonMansion1F_h": [
+ 18,
+ 17811
+ ],
+ "CeladonMansion2FMeetingRoomSignText": [
+ 18,
+ 18028
+ ],
+ "CeladonMansion2F_h": [
+ 18,
+ 18010
+ ],
+ "CeladonMansion3FDevRoomSignText": [
+ 18,
+ 18421
+ ],
+ "CeladonMansion3FGameDesignerText": [
+ 18,
+ 18318
+ ],
+ "CeladonMansion3FGameProgramPCText": [
+ 18,
+ 18385
+ ],
+ "CeladonMansion3FGameScriptPCText": [
+ 18,
+ 18409
+ ],
+ "CeladonMansion3FGraphicArtistText": [
+ 18,
+ 18170
+ ],
+ "CeladonMansion3FPlayingGamePCText": [
+ 18,
+ 18397
+ ],
+ "CeladonMansion3FProgrammerText": [
+ 18,
+ 18140
+ ],
+ "CeladonMansion3FWriterText": [
+ 18,
+ 18288
+ ],
+ "CeladonMansion3F_h": [
+ 18,
+ 18096
+ ],
+ "CeladonMansionRoofHouseEeveePokeballText": [
+ 7,
+ 22095
+ ],
+ "CeladonMansionRoofHouseHikerText": [
+ 7,
+ 22090
+ ],
+ "CeladonMansionRoofHouseSignText": [
+ 18,
+ 18547
+ ],
+ "CeladonMansionRoofHouse_h": [
+ 7,
+ 22070
+ ],
+ "CeladonMansionRoof_h": [
+ 18,
+ 18529
+ ],
+ "CeladonMart1FCurrentFloorSignText": [
+ 17,
+ 17111
+ ],
+ "CeladonMart1FDirectorySignText": [
+ 17,
+ 17106
+ ],
+ "CeladonMart1FReceptionistText": [
+ 17,
+ 17101
+ ],
+ "CeladonMart1F_h": [
+ 17,
+ 17079
+ ],
+ "CeladonMart2FClerk1Text": [
+ 0,
+ 9073
+ ],
+ "CeladonMart2FClerk2Text": [
+ 0,
+ 9085
+ ],
+ "CeladonMart2FCurrentFloorSignText": [
+ 21,
+ 24828
+ ],
+ "CeladonMart2FGirlText": [
+ 21,
+ 24823
+ ],
+ "CeladonMart2FMiddleAgedManText": [
+ 21,
+ 24818
+ ],
+ "CeladonMart2F_h": [
+ 21,
+ 24793
+ ],
+ "CeladonMart3FClerkText": [
+ 18,
+ 16776
+ ],
+ "CeladonMart3FCurrentFloorSignText": [
+ 18,
+ 16833
+ ],
+ "CeladonMart3FFightingGameText": [
+ 18,
+ 16828
+ ],
+ "CeladonMart3FGameBoyKid1Text": [
+ 18,
+ 16788
+ ],
+ "CeladonMart3FGameBoyKid2Text": [
+ 18,
+ 16793
+ ],
+ "CeladonMart3FGameBoyKid3Text": [
+ 18,
+ 16798
+ ],
+ "CeladonMart3FLittleBoyText": [
+ 18,
+ 16803
+ ],
+ "CeladonMart3FPokemonPosterText": [
+ 18,
+ 16838
+ ],
+ "CeladonMart3FPuzzleGameText": [
+ 18,
+ 16823
+ ],
+ "CeladonMart3FRPGText": [
+ 18,
+ 16813
+ ],
+ "CeladonMart3FSNESText": [
+ 18,
+ 16808
+ ],
+ "CeladonMart3FSportsGameText": [
+ 18,
+ 16818
+ ],
+ "CeladonMart3F_h": [
+ 18,
+ 16727
+ ],
+ "CeladonMart4FClerkText": [
+ 0,
+ 9097
+ ],
+ "CeladonMart4FCurrentFloorSignText": [
+ 18,
+ 17010
+ ],
+ "CeladonMart4FSuperNerdText": [
+ 18,
+ 17000
+ ],
+ "CeladonMart4FYoungsterText": [
+ 18,
+ 17005
+ ],
+ "CeladonMart4F_h": [
+ 18,
+ 16977
+ ],
+ "CeladonMart5FClerk1Text": [
+ 0,
+ 9105
+ ],
+ "CeladonMart5FClerk2Text": [
+ 0,
+ 9115
+ ],
+ "CeladonMart5FCurrentFloorSignText": [
+ 18,
+ 20643
+ ],
+ "CeladonMart5FGentlemanText": [
+ 18,
+ 20633
+ ],
+ "CeladonMart5FSailorText": [
+ 18,
+ 20638
+ ],
+ "CeladonMart5F_h": [
+ 18,
+ 20607
+ ],
+ "CeladonMartElevatorText": [
+ 18,
+ 17769
+ ],
+ "CeladonMartElevator_h": [
+ 18,
+ 17663
+ ],
+ "CeladonMartRoofCurrentFloorSignText": [
+ 18,
+ 17582
+ ],
+ "CeladonMartRoofLittleGirlText": [
+ 18,
+ 17527
+ ],
+ "CeladonMartRoofSuperNerdText": [
+ 18,
+ 17522
+ ],
+ "CeladonMartRoofVendingMachineText": [
+ 18,
+ 17581
+ ],
+ "CeladonMartRoof_h": [
+ 18,
+ 17104
+ ],
+ "CeladonPokecenterBeautyText": [
+ 18,
+ 18642
+ ],
+ "CeladonPokecenterChanseyText": [
+ 18,
+ 18647
+ ],
+ "CeladonPokecenterGentlemanText": [
+ 18,
+ 18637
+ ],
+ "CeladonPokecenterLinkReceptionistText": [
+ 18,
+ 18635
+ ],
+ "CeladonPokecenterNurseText": [
+ 18,
+ 18636
+ ],
+ "CeladonPokecenter_h": [
+ 18,
+ 18607
+ ],
+ "CeruleanBadgeHouseMiddleAgedManText": [
+ 29,
+ 18011
+ ],
+ "CeruleanBadgeHouse_h": [
+ 29,
+ 17987
+ ],
+ "CeruleanCave1F_h": [
+ 29,
+ 17725
+ ],
+ "CeruleanCave2F_h": [
+ 17,
+ 24659
+ ],
+ "CeruleanCaveB1FMewtwoText": [
+ 17,
+ 24957
+ ],
+ "CeruleanCaveB1F_h": [
+ 17,
+ 24897
+ ],
+ "CeruleanCityBikeShopSign": [
+ 6,
+ 22583
+ ],
+ "CeruleanCityCooltrainerF1Text": [
+ 6,
+ 22444
+ ],
+ "CeruleanCityCooltrainerF2Text": [
+ 6,
+ 22563
+ ],
+ "CeruleanCityCooltrainerMText": [
+ 6,
+ 22424
+ ],
+ "CeruleanCityElectrodeText": [
+ 6,
+ 22495
+ ],
+ "CeruleanCityGuardText": [
+ 6,
+ 22439
+ ],
+ "CeruleanCityGymSign": [
+ 6,
+ 22588
+ ],
+ "CeruleanCityRivalText": [
+ 6,
+ 22255
+ ],
+ "CeruleanCityRocketText": [
+ 6,
+ 22300
+ ],
+ "CeruleanCitySignText": [
+ 6,
+ 22573
+ ],
+ "CeruleanCitySuperNerd1Text": [
+ 6,
+ 22429
+ ],
+ "CeruleanCitySuperNerd2Text": [
+ 6,
+ 22434
+ ],
+ "CeruleanCitySuperNerd3Text": [
+ 6,
+ 22568
+ ],
+ "CeruleanCityTrainerTipsText": [
+ 6,
+ 22578
+ ],
+ "CeruleanCity_h": [
+ 6,
+ 18260
+ ],
+ "CeruleanGymCooltrainerFText": [
+ 23,
+ 18093
+ ],
+ "CeruleanGymGymGuideText": [
+ 23,
+ 18143
+ ],
+ "CeruleanGymMistyCascadeBadgeInfoText": [
+ 23,
+ 18072
+ ],
+ "CeruleanGymMistyReceivedTM11Text": [
+ 23,
+ 18077
+ ],
+ "CeruleanGymMistyTM11NoRoomText": [
+ 23,
+ 18083
+ ],
+ "CeruleanGymMistyText": [
+ 23,
+ 17985
+ ],
+ "CeruleanGymSwimmerText": [
+ 23,
+ 18118
+ ],
+ "CeruleanGym_h": [
+ 23,
+ 17783
+ ],
+ "CeruleanMartClerkText": [
+ 0,
+ 9037
+ ],
+ "CeruleanMartCooltrainerFText": [
+ 23,
+ 18289
+ ],
+ "CeruleanMartCooltrainerMText": [
+ 23,
+ 18284
+ ],
+ "CeruleanMart_h": [
+ 23,
+ 18263
+ ],
+ "CeruleanMelanieHouseBulbasaurText": [
+ 7,
+ 20453
+ ],
+ "CeruleanMelanieHouseMelanieText": [
+ 7,
+ 20300
+ ],
+ "CeruleanMelanieHouseOddishText": [
+ 7,
+ 20466
+ ],
+ "CeruleanMelanieHouseSandshrewText": [
+ 7,
+ 20479
+ ],
+ "CeruleanMelaniesHouse_h": [
+ 7,
+ 20276
+ ],
+ "CeruleanPokecenterChanseyText": [
+ 23,
+ 17693
+ ],
+ "CeruleanPokecenterGentlemanText": [
+ 23,
+ 17688
+ ],
+ "CeruleanPokecenterLinkReceptionistText": [
+ 23,
+ 17681
+ ],
+ "CeruleanPokecenterNurseText": [
+ 23,
+ 17682
+ ],
+ "CeruleanPokecenterSuperNerdText": [
+ 23,
+ 17683
+ ],
+ "CeruleanPokecenter_h": [
+ 23,
+ 17653
+ ],
+ "CeruleanTrashedHouseFishingGuruText": [
+ 7,
+ 20185
+ ],
+ "CeruleanTrashedHouseGirlText": [
+ 7,
+ 20223
+ ],
+ "CeruleanTrashedHouseWallHoleText": [
+ 7,
+ 20228
+ ],
+ "CeruleanTrashedHouse_h": [
+ 7,
+ 20163
+ ],
+ "ChampionsRoomOakComeWithMeText": [
+ 29,
+ 22954
+ ],
+ "ChampionsRoomOakCongratulatesPlayerText": [
+ 29,
+ 22925
+ ],
+ "ChampionsRoomOakDisappointedWithRivalText": [
+ 29,
+ 22949
+ ],
+ "ChampionsRoomOakText": [
+ 29,
+ 22920
+ ],
+ "ChampionsRoomRivalText": [
+ 29,
+ 22880
+ ],
+ "ChampionsRoom_h": [
+ 29,
+ 22432
+ ],
+ "ChannelerPic": [
+ 19,
+ 30753
+ ],
+ "ChanseyPicBack": [
+ 10,
+ 20015
+ ],
+ "ChanseyPicFront": [
+ 10,
+ 19704
+ ],
+ "CharizardPicBack": [
+ 13,
+ 26368
+ ],
+ "CharizardPicFront": [
+ 13,
+ 25769
+ ],
+ "CharmanderPicBack": [
+ 13,
+ 24316
+ ],
+ "CharmanderPicFront": [
+ 13,
+ 24048
+ ],
+ "CharmeleonPicBack": [
+ 13,
+ 25125
+ ],
+ "CharmeleonPicFront": [
+ 13,
+ 24776
+ ],
+ "CinnabarGymBlaineReceivedTM38Text": [
+ 29,
+ 20790
+ ],
+ "CinnabarGymBlaineTM38NoRoomText": [
+ 29,
+ 20800
+ ],
+ "CinnabarGymBlaineText": [
+ 29,
+ 20715
+ ],
+ "CinnabarGymBlaineVolcanoBadgeInfoText": [
+ 29,
+ 20785
+ ],
+ "CinnabarGymGymGuideText": [
+ 29,
+ 21278
+ ],
+ "CinnabarGymSuperNerd1": [
+ 29,
+ 20805
+ ],
+ "CinnabarGymSuperNerd2": [
+ 29,
+ 20858
+ ],
+ "CinnabarGymSuperNerd3": [
+ 29,
+ 20928
+ ],
+ "CinnabarGymSuperNerd4": [
+ 29,
+ 20998
+ ],
+ "CinnabarGymSuperNerd5": [
+ 29,
+ 21068
+ ],
+ "CinnabarGymSuperNerd6": [
+ 29,
+ 21138
+ ],
+ "CinnabarGymSuperNerd7": [
+ 29,
+ 21208
+ ],
+ "CinnabarGym_h": [
+ 29,
+ 20198
+ ],
+ "CinnabarIslandDoorIsLockedText": [
+ 7,
+ 17210
+ ],
+ "CinnabarIslandGamblerText": [
+ 7,
+ 17220
+ ],
+ "CinnabarIslandGirlText": [
+ 7,
+ 17215
+ ],
+ "CinnabarIslandGymSignText": [
+ 7,
+ 17235
+ ],
+ "CinnabarIslandPokemonLabSignText": [
+ 7,
+ 17230
+ ],
+ "CinnabarIslandSignText": [
+ 7,
+ 17225
+ ],
+ "CinnabarIsland_h": [
+ 7,
+ 16384
+ ],
+ "CinnabarLabFishingGuruText": [
+ 29,
+ 21525
+ ],
+ "CinnabarLabFossilRoomScientist1Text": [
+ 29,
+ 21991
+ ],
+ "CinnabarLabFossilRoomScientist2Text": [
+ 29,
+ 22101
+ ],
+ "CinnabarLabFossilRoom_h": [
+ 29,
+ 21920
+ ],
+ "CinnabarLabMeetingRoomSignText": [
+ 29,
+ 21535
+ ],
+ "CinnabarLabMetronomeRoomAmberPipeText": [
+ 29,
+ 21858
+ ],
+ "CinnabarLabMetronomeRoomPCText": [
+ 29,
+ 21853
+ ],
+ "CinnabarLabMetronomeRoomScientist1Text": [
+ 29,
+ 21775
+ ],
+ "CinnabarLabMetronomeRoomScientist2Text": [
+ 29,
+ 21848
+ ],
+ "CinnabarLabMetronomeRoom_h": [
+ 29,
+ 21750
+ ],
+ "CinnabarLabPhotoText": [
+ 29,
+ 21530
+ ],
+ "CinnabarLabRAndDSignText": [
+ 29,
+ 21540
+ ],
+ "CinnabarLabTestingRoomSignText": [
+ 29,
+ 21545
+ ],
+ "CinnabarLabTradeRoomBeautyText": [
+ 29,
+ 21682
+ ],
+ "CinnabarLabTradeRoomGrampsText": [
+ 29,
+ 21674
+ ],
+ "CinnabarLabTradeRoomSuperNerdText": [
+ 29,
+ 21669
+ ],
+ "CinnabarLabTradeRoom_h": [
+ 29,
+ 21648
+ ],
+ "CinnabarLab_h": [
+ 29,
+ 21499
+ ],
+ "CinnabarMartClerkText": [
+ 0,
+ 9140
+ ],
+ "CinnabarMartScientistText": [
+ 29,
+ 22299
+ ],
+ "CinnabarMartSilphWorkerFText": [
+ 29,
+ 22294
+ ],
+ "CinnabarMart_h": [
+ 29,
+ 22273
+ ],
+ "CinnabarPokecenterChanseyText": [
+ 29,
+ 22211
+ ],
+ "CinnabarPokecenterCooltrainerFText": [
+ 29,
+ 22200
+ ],
+ "CinnabarPokecenterGentlemanText": [
+ 29,
+ 22205
+ ],
+ "CinnabarPokecenterLinkReceptionistText": [
+ 29,
+ 22210
+ ],
+ "CinnabarPokecenterNurseText": [
+ 29,
+ 22199
+ ],
+ "CinnabarPokecenter_h": [
+ 29,
+ 22171
+ ],
+ "CircleTile": [
+ 61,
+ 24084
+ ],
+ "ClefablePicBack": [
+ 12,
+ 27090
+ ],
+ "ClefablePicFront": [
+ 12,
+ 26725
+ ],
+ "ClefairyPicBack": [
+ 9,
+ 18407
+ ],
+ "ClefairyPicFront": [
+ 9,
+ 18172
+ ],
+ "CloysterPicBack": [
+ 12,
+ 26201
+ ],
+ "CloysterPicFront": [
+ 12,
+ 25666
+ ],
+ "ColosseumOpponentText": [
+ 19,
+ 32503
+ ],
+ "Colosseum_h": [
+ 19,
+ 32486
+ ],
+ "CooltrainerFPic": [
+ 19,
+ 26521
+ ],
+ "CooltrainerMPic": [
+ 19,
+ 26128
+ ],
+ "CopycatsHouse1FChanseyText": [
+ 29,
+ 22373
+ ],
+ "CopycatsHouse1FMiddleAgedManText": [
+ 29,
+ 22368
+ ],
+ "CopycatsHouse1FMiddleAgedWomanText": [
+ 29,
+ 22363
+ ],
+ "CopycatsHouse1F_h": [
+ 29,
+ 22342
+ ],
+ "CopycatsHouse2FCopycatText": [
+ 23,
+ 19320
+ ],
+ "CopycatsHouse2FDoduoText": [
+ 23,
+ 19434
+ ],
+ "CopycatsHouse2FPCText": [
+ 23,
+ 19449
+ ],
+ "CopycatsHouse2FRareDollText": [
+ 23,
+ 19439
+ ],
+ "CopycatsHouse2FSNESText": [
+ 23,
+ 19444
+ ],
+ "CopycatsHouse2F_h": [
+ 23,
+ 19291
+ ],
+ "CryData": [
+ 14,
+ 21602
+ ],
+ "CubonePicBack": [
+ 9,
+ 25079
+ ],
+ "CubonePicFront": [
+ 9,
+ 24796
+ ],
+ "CueBallPic": [
+ 19,
+ 21071
+ ],
+ "DaycareGentlemanText": [
+ 21,
+ 25156
+ ],
+ "Daycare_h": [
+ 21,
+ 25139
+ ],
+ "DewgongPicBack": [
+ 12,
+ 19102
+ ],
+ "DewgongPicFront": [
+ 12,
+ 18663
+ ],
+ "DiglettPicBack": [
+ 10,
+ 27866
+ ],
+ "DiglettPicFront": [
+ 10,
+ 27708
+ ],
+ "DiglettsCaveRoute11GamblerText": [
+ 7,
+ 24271
+ ],
+ "DiglettsCaveRoute11_h": [
+ 7,
+ 24248
+ ],
+ "DiglettsCaveRoute2FishingGuruText": [
+ 7,
+ 22468
+ ],
+ "DiglettsCaveRoute2_h": [
+ 7,
+ 22446
+ ],
+ "DiglettsCave_h": [
+ 24,
+ 24441
+ ],
+ "DittoPicBack": [
+ 11,
+ 17853
+ ],
+ "DittoPicFront": [
+ 11,
+ 17693
+ ],
+ "DodrioPicBack": [
+ 12,
+ 16855
+ ],
+ "DodrioPicFront": [
+ 12,
+ 16384
+ ],
+ "DoduoPicBack": [
+ 10,
+ 30481
+ ],
+ "DoduoPicFront": [
+ 10,
+ 30163
+ ],
+ "DoorTileIDPointers": [
+ 6,
+ 26536
+ ],
+ "DragonairPicBack": [
+ 11,
+ 21450
+ ],
+ "DragonairPicFront": [
+ 11,
+ 21123
+ ],
+ "DragonitePicBack": [
+ 10,
+ 29990
+ ],
+ "DragonitePicFront": [
+ 10,
+ 29448
+ ],
+ "DratiniPicBack": [
+ 11,
+ 21024
+ ],
+ "DratiniPicFront": [
+ 11,
+ 20799
+ ],
+ "DrowzeePicBack": [
+ 10,
+ 24033
+ ],
+ "DrowzeePicFront": [
+ 10,
+ 23698
+ ],
+ "DugtrioPicBack": [
+ 12,
+ 17962
+ ],
+ "DugtrioPicFront": [
+ 12,
+ 17610
+ ],
+ "EeveePicBack": [
+ 11,
+ 26243
+ ],
+ "EeveePicFront": [
+ 11,
+ 25966
+ ],
+ "EkansPicBack": [
+ 11,
+ 28987
+ ],
+ "EkansPicFront": [
+ 11,
+ 28730
+ ],
+ "ElectabuzzPicBack": [
+ 10,
+ 25712
+ ],
+ "ElectabuzzPicFront": [
+ 10,
+ 25258
+ ],
+ "ElectrodePicBack": [
+ 12,
+ 26624
+ ],
+ "ElectrodePicFront": [
+ 12,
+ 26382
+ ],
+ "EngineerPic": [
+ 19,
+ 19978
+ ],
+ "ErikaPic": [
+ 19,
+ 28325
+ ],
+ "EvosMovesPointerTable": [
+ 14,
+ 29157
+ ],
+ "ExeggcutePicBack": [
+ 9,
+ 22695
+ ],
+ "ExeggcutePicFront": [
+ 9,
+ 22201
+ ],
+ "ExeggutorPicBack": [
+ 9,
+ 21429
+ ],
+ "ExeggutorPicFront": [
+ 9,
+ 20978
+ ],
+ "FallingStar": [
+ 28,
+ 16822
+ ],
+ "FarfetchdPicBack": [
+ 10,
+ 28976
+ ],
+ "FarfetchdPicFront": [
+ 10,
+ 28569
+ ],
+ "FearowPicBack": [
+ 10,
+ 17783
+ ],
+ "FearowPicFront": [
+ 10,
+ 17286
+ ],
+ "FightingDojoBlackbelt1Text": [
+ 23,
+ 19864
+ ],
+ "FightingDojoBlackbelt2Text": [
+ 23,
+ 19889
+ ],
+ "FightingDojoBlackbelt3Text": [
+ 23,
+ 19914
+ ],
+ "FightingDojoBlackbelt4Text": [
+ 23,
+ 19939
+ ],
+ "FightingDojoHitmonchanPokeBallText": [
+ 23,
+ 20036
+ ],
+ "FightingDojoHitmonleePokeBallText": [
+ 23,
+ 19964
+ ],
+ "FightingDojoKarateMasterText": [
+ 23,
+ 19770
+ ],
+ "FightingDojo_h": [
+ 23,
+ 19527
+ ],
+ "FishEmote": [
+ 16,
+ 21413
+ ],
+ "FisherPic": [
+ 19,
+ 20359
+ ],
+ "FlareonPicBack": [
+ 11,
+ 26700
+ ],
+ "FlareonPicFront": [
+ 11,
+ 26347
+ ],
+ "FlowerTile1": [
+ 0,
+ 7381
+ ],
+ "FlowerTile2": [
+ 0,
+ 7397
+ ],
+ "FlowerTile3": [
+ 0,
+ 7413
+ ],
+ "FontGraphics": [
+ 4,
+ 17920
+ ],
+ "FossilAerodactylPic": [
+ 13,
+ 26529
+ ],
+ "FossilKabutopsPic": [
+ 11,
+ 31634
+ ],
+ "FrameBlockBaseCoords": [
+ 30,
+ 32301
+ ],
+ "FrameBlockPointers": [
+ 30,
+ 28956
+ ],
+ "FuchsiaBillsGrandpasHouseBillsGrandpaText": [
+ 29,
+ 18540
+ ],
+ "FuchsiaBillsGrandpasHouseMiddleAgedWomanText": [
+ 29,
+ 18535
+ ],
+ "FuchsiaBillsGrandpasHouseYoungsterText": [
+ 29,
+ 18545
+ ],
+ "FuchsiaBillsGrandpasHouse_h": [
+ 29,
+ 18513
+ ],
+ "FuchsiaCityChanseySignText": [
+ 6,
+ 23440
+ ],
+ "FuchsiaCityErikText": [
+ 6,
+ 23400
+ ],
+ "FuchsiaCityFossilSignText": [
+ 6,
+ 23540
+ ],
+ "FuchsiaCityGamblerText": [
+ 6,
+ 23395
+ ],
+ "FuchsiaCityGymSignText": [
+ 6,
+ 23435
+ ],
+ "FuchsiaCityKangaskhanSignText": [
+ 6,
+ 23480
+ ],
+ "FuchsiaCityLaprasSignText": [
+ 6,
+ 23520
+ ],
+ "FuchsiaCityPokemonText": [
+ 6,
+ 23410
+ ],
+ "FuchsiaCitySafariGameSignText": [
+ 6,
+ 23420
+ ],
+ "FuchsiaCitySafariZoneSignText": [
+ 6,
+ 23430
+ ],
+ "FuchsiaCitySignText": [
+ 6,
+ 23415
+ ],
+ "FuchsiaCitySlowpokeSignText": [
+ 6,
+ 23500
+ ],
+ "FuchsiaCityVoltorbSignText": [
+ 6,
+ 23460
+ ],
+ "FuchsiaCityWardensHomeSignText": [
+ 6,
+ 23425
+ ],
+ "FuchsiaCityYoungster1Text": [
+ 6,
+ 23390
+ ],
+ "FuchsiaCityYoungster2Text": [
+ 6,
+ 23405
+ ],
+ "FuchsiaCity_h": [
+ 6,
+ 19379
+ ],
+ "FuchsiaGoodRodHouseFishingGuruText": [
+ 21,
+ 24945
+ ],
+ "FuchsiaGoodRodHouse_h": [
+ 21,
+ 24928
+ ],
+ "FuchsiaGymGymGuideText": [
+ 29,
+ 19938
+ ],
+ "FuchsiaGymKogaReceivedTM06Text": [
+ 29,
+ 19773
+ ],
+ "FuchsiaGymKogaSoulBadgeInfoText": [
+ 29,
+ 19768
+ ],
+ "FuchsiaGymKogaTM06NoRoomText": [
+ 29,
+ 19783
+ ],
+ "FuchsiaGymKogaText": [
+ 29,
+ 19676
+ ],
+ "FuchsiaGymRocker1Text": [
+ 29,
+ 19788
+ ],
+ "FuchsiaGymRocker2Text": [
+ 29,
+ 19813
+ ],
+ "FuchsiaGymRocker3Text": [
+ 29,
+ 19838
+ ],
+ "FuchsiaGymRocker4Text": [
+ 29,
+ 19863
+ ],
+ "FuchsiaGymRocker5Text": [
+ 29,
+ 19888
+ ],
+ "FuchsiaGymRocker6Text": [
+ 29,
+ 19913
+ ],
+ "FuchsiaGym_h": [
+ 29,
+ 19417
+ ],
+ "FuchsiaMartClerkText": [
+ 0,
+ 9123
+ ],
+ "FuchsiaMartCooltrainerFText": [
+ 7,
+ 22176
+ ],
+ "FuchsiaMartMiddleAgedManText": [
+ 7,
+ 22171
+ ],
+ "FuchsiaMart_h": [
+ 7,
+ 22149
+ ],
+ "FuchsiaMeetingRoomSafariZoneWorker1": [
+ 29,
+ 20117
+ ],
+ "FuchsiaMeetingRoomSafariZoneWorker2": [
+ 29,
+ 20122
+ ],
+ "FuchsiaMeetingRoomSafariZoneWorker3": [
+ 29,
+ 20127
+ ],
+ "FuchsiaMeetingRoom_h": [
+ 29,
+ 20095
+ ],
+ "FuchsiaPokecenterChanseyText": [
+ 29,
+ 18628
+ ],
+ "FuchsiaPokecenterCooltrainerFText": [
+ 29,
+ 18622
+ ],
+ "FuchsiaPokecenterLinkReceptionistText": [
+ 29,
+ 18627
+ ],
+ "FuchsiaPokecenterNurseText": [
+ 29,
+ 18616
+ ],
+ "FuchsiaPokecenterRockerText": [
+ 29,
+ 18617
+ ],
+ "FuchsiaPokecenter_h": [
+ 29,
+ 18588
+ ],
+ "GamblerPic": [
+ 19,
+ 21537
+ ],
+ "GameCornerBeauty1Text": [
+ 18,
+ 19656
+ ],
+ "GameCornerBeauty2Text": [
+ 18,
+ 19817
+ ],
+ "GameCornerClerkText": [
+ 18,
+ 19661
+ ],
+ "GameCornerFishingGuru1Text": [
+ 18,
+ 19822
+ ],
+ "GameCornerFishingGuru2Text": [
+ 18,
+ 20063
+ ],
+ "GameCornerGamblerText": [
+ 18,
+ 19960
+ ],
+ "GameCornerGymGuideText": [
+ 18,
+ 19930
+ ],
+ "GameCornerMiddleAgedMan1Text": [
+ 18,
+ 19812
+ ],
+ "GameCornerMiddleAgedMan2Text": [
+ 18,
+ 19965
+ ],
+ "GameCornerMiddleAgedWomanText": [
+ 18,
+ 19925
+ ],
+ "GameCornerPRizeRoomPrizeVendorText": [
+ 18,
+ 20778
+ ],
+ "GameCornerPosterText": [
+ 18,
+ 20225
+ ],
+ "GameCornerPrizeRoomBaldingGuyText": [
+ 18,
+ 20768
+ ],
+ "GameCornerPrizeRoomGamblerText": [
+ 18,
+ 20773
+ ],
+ "GameCornerPrizeRoom_h": [
+ 18,
+ 20743
+ ],
+ "GameCornerRocketAfterBattleText": [
+ 18,
+ 20220
+ ],
+ "GameCornerRocketText": [
+ 18,
+ 20161
+ ],
+ "GameCorner_h": [
+ 18,
+ 19400
+ ],
+ "GameFreakIntro": [
+ 16,
+ 23206
+ ],
+ "GameFreakLogoGraphics": [
+ 4,
+ 19832
+ ],
+ "GastlyPicBack": [
+ 9,
+ 29055
+ ],
+ "GastlyPicFront": [
+ 9,
+ 28852
+ ],
+ "GengarIntroTiles1": [
+ 30,
+ 23785
+ ],
+ "GengarIntroTiles2": [
+ 30,
+ 23834
+ ],
+ "GengarIntroTiles3": [
+ 30,
+ 23883
+ ],
+ "GengarPicBack": [
+ 9,
+ 23647
+ ],
+ "GengarPicFront": [
+ 9,
+ 23326
+ ],
+ "GentlemanPic": [
+ 19,
+ 29627
+ ],
+ "GeodudePicBack": [
+ 13,
+ 22701
+ ],
+ "GeodudePicFront": [
+ 13,
+ 22404
+ ],
+ "GhostPic": [
+ 13,
+ 26912
+ ],
+ "GiovanniPic": [
+ 19,
+ 25497
+ ],
+ "GloomPicBack": [
+ 13,
+ 27920
+ ],
+ "GloomPicFront": [
+ 13,
+ 27630
+ ],
+ "GolbatPicBack": [
+ 12,
+ 22711
+ ],
+ "GolbatPicFront": [
+ 12,
+ 22321
+ ],
+ "GoldeenPicBack": [
+ 13,
+ 18432
+ ],
+ "GoldeenPicFront": [
+ 13,
+ 18085
+ ],
+ "GolduckPicBack": [
+ 12,
+ 21585
+ ],
+ "GolduckPicFront": [
+ 12,
+ 21092
+ ],
+ "GolemPicBack": [
+ 10,
+ 24549
+ ],
+ "GolemPicFront": [
+ 10,
+ 24144
+ ],
+ "GravelerPicBack": [
+ 10,
+ 19530
+ ],
+ "GravelerPicFront": [
+ 10,
+ 19095
+ ],
+ "GrimerPicBack": [
+ 9,
+ 23128
+ ],
+ "GrimerPicFront": [
+ 9,
+ 22826
+ ],
+ "GrowlithePicBack": [
+ 10,
+ 16679
+ ],
+ "GrowlithePicFront": [
+ 10,
+ 16384
+ ],
+ "GyaradosPicBack": [
+ 9,
+ 28034
+ ],
+ "GyaradosPicFront": [
+ 9,
+ 27451
+ ],
+ "GymLeaderFaceAndBadgeTileGraphics": [
+ 3,
+ 26907
+ ],
+ "HallOfFameOakText": [
+ 22,
+ 25863
+ ],
+ "HallOfFame_h": [
+ 22,
+ 25645
+ ],
+ "HappyEmote": [
+ 16,
+ 21093
+ ],
+ "HaunterPicBack": [
+ 12,
+ 29205
+ ],
+ "HaunterPicFront": [
+ 12,
+ 28831
+ ],
+ "HeartEmote": [
+ 16,
+ 21221
+ ],
+ "HikerPic": [
+ 19,
+ 18663
+ ],
+ "HitmonchanPicBack": [
+ 10,
+ 22057
+ ],
+ "HitmonchanPicFront": [
+ 10,
+ 21748
+ ],
+ "HitmonleePicBack": [
+ 10,
+ 21654
+ ],
+ "HitmonleePicFront": [
+ 10,
+ 21223
+ ],
+ "HorseaPicBack": [
+ 11,
+ 22680
+ ],
+ "HorseaPicFront": [
+ 11,
+ 22438
+ ],
+ "HpBarAndStatusGraphics": [
+ 4,
+ 18976
+ ],
+ "HypnoPicBack": [
+ 12,
+ 22179
+ ],
+ "HypnoPicFront": [
+ 12,
+ 21740
+ ],
+ "IndigoPlateauLobbyChanseyText": [
+ 6,
+ 23949
+ ],
+ "IndigoPlateauLobbyClerkText": [
+ 0,
+ 9159
+ ],
+ "IndigoPlateauLobbyCooltrainerFText": [
+ 6,
+ 23943
+ ],
+ "IndigoPlateauLobbyGymGuideText": [
+ 6,
+ 23938
+ ],
+ "IndigoPlateauLobbyLinkReceptionistText": [
+ 6,
+ 23948
+ ],
+ "IndigoPlateauLobbyNurseText": [
+ 6,
+ 23937
+ ],
+ "IndigoPlateauLobby_h": [
+ 6,
+ 23877
+ ],
+ "IndigoPlateau_h": [
+ 20,
+ 18724
+ ],
+ "ItemNames": [
+ 1,
+ 17847
+ ],
+ "ItemPrices": [
+ 1,
+ 17556
+ ],
+ "IvysaurPicBack": [
+ 9,
+ 20851
+ ],
+ "IvysaurPicFront": [
+ 9,
+ 20457
+ ],
+ "JigglypuffPicBack": [
+ 11,
+ 25410
+ ],
+ "JigglypuffPicFront": [
+ 11,
+ 25181
+ ],
+ "JolteonPicBack": [
+ 11,
+ 27300
+ ],
+ "JolteonPicFront": [
+ 11,
+ 26837
+ ],
+ "JrTrainerFPic": [
+ 19,
+ 17800
+ ],
+ "JrTrainerMPic": [
+ 19,
+ 17488
+ ],
+ "JugglerPic": [
+ 19,
+ 22909
+ ],
+ "JynxPicBack": [
+ 10,
+ 31324
+ ],
+ "JynxPicFront": [
+ 10,
+ 30883
+ ],
+ "KabutoPicBack": [
+ 11,
+ 21781
+ ],
+ "KabutoPicFront": [
+ 11,
+ 21589
+ ],
+ "KabutopsPicBack": [
+ 11,
+ 22305
+ ],
+ "KabutopsPicFront": [
+ 11,
+ 21871
+ ],
+ "KadabraPicBack": [
+ 10,
+ 18948
+ ],
+ "KadabraPicFront": [
+ 10,
+ 18524
+ ],
+ "KakunaPicBack": [
+ 11,
+ 30921
+ ],
+ "KakunaPicFront": [
+ 11,
+ 30727
+ ],
+ "KangaskhanPicBack": [
+ 9,
+ 17673
+ ],
+ "KangaskhanPicFront": [
+ 9,
+ 17074
+ ],
+ "KeyItemFlags": [
+ 3,
+ 26333
+ ],
+ "KinglerPicBack": [
+ 12,
+ 25505
+ ],
+ "KinglerPicFront": [
+ 12,
+ 24993
+ ],
+ "KoffingPicBack": [
+ 10,
+ 26682
+ ],
+ "KoffingPicFront": [
+ 10,
+ 26386
+ ],
+ "KogaPic": [
+ 19,
+ 28609
+ ],
+ "KrabbyPicBack": [
+ 11,
+ 18557
+ ],
+ "KrabbyPicFront": [
+ 11,
+ 18306
+ ],
+ "LancePic": [
+ 19,
+ 31519
+ ],
+ "LancesRoomLanceText": [
+ 22,
+ 25407
+ ],
+ "LancesRoom_h": [
+ 22,
+ 25149
+ ],
+ "LaprasPicBack": [
+ 9,
+ 26290
+ ],
+ "LaprasPicFront": [
+ 9,
+ 25833
+ ],
+ "LassPic": [
+ 19,
+ 16896
+ ],
+ "LavenderCuboneHouseBrunetteGirlText": [
+ 7,
+ 21195
+ ],
+ "LavenderCuboneHouseCuboneText": [
+ 7,
+ 21182
+ ],
+ "LavenderCuboneHouse_h": [
+ 7,
+ 21162
+ ],
+ "LavenderMartBaldingGuyText": [
+ 23,
+ 18455
+ ],
+ "LavenderMartClerkText": [
+ 0,
+ 9061
+ ],
+ "LavenderMartCooltrainerMText": [
+ 23,
+ 18460
+ ],
+ "LavenderMart_h": [
+ 23,
+ 18434
+ ],
+ "LavenderPokecenterChanseyText": [
+ 23,
+ 18372
+ ],
+ "LavenderPokecenterGentlemanText": [
+ 23,
+ 18362
+ ],
+ "LavenderPokecenterLinkReceptionistText": [
+ 23,
+ 18360
+ ],
+ "LavenderPokecenterLittleGirlText": [
+ 23,
+ 18367
+ ],
+ "LavenderPokecenterNurseText": [
+ 23,
+ 18361
+ ],
+ "LavenderPokecenter_h": [
+ 23,
+ 18332
+ ],
+ "LavenderTownCooltrainerMText": [
+ 17,
+ 16715
+ ],
+ "LavenderTownLittleGirlText": [
+ 17,
+ 16672
+ ],
+ "LavenderTownPokemonHouseSignText": [
+ 17,
+ 16735
+ ],
+ "LavenderTownPokemonTowerSignText": [
+ 17,
+ 16740
+ ],
+ "LavenderTownSignText": [
+ 17,
+ 16725
+ ],
+ "LavenderTownSilphScopeSignText": [
+ 17,
+ 16730
+ ],
+ "LavenderTownSuperNerdText": [
+ 17,
+ 16720
+ ],
+ "LavenderTown_h": [
+ 17,
+ 16384
+ ],
+ "LedgeHoppingShadow": [
+ 6,
+ 26771
+ ],
+ "LickitungPicBack": [
+ 9,
+ 22048
+ ],
+ "LickitungPicFront": [
+ 9,
+ 21604
+ ],
+ "LoreleiPic": [
+ 19,
+ 30454
+ ],
+ "LoreleisRoomLoreleiDontRunAwayText": [
+ 29,
+ 23291
+ ],
+ "LoreleisRoomLoreleiText": [
+ 29,
+ 23266
+ ],
+ "LoreleisRoom_h": [
+ 29,
+ 23023
+ ],
+ "LtSurgePic": [
+ 19,
+ 27936
+ ],
+ "MachampPicBack": [
+ 12,
+ 20968
+ ],
+ "MachampPicFront": [
+ 12,
+ 20409
+ ],
+ "MachokePicBack": [
+ 10,
+ 20540
+ ],
+ "MachokePicFront": [
+ 10,
+ 20115
+ ],
+ "MachopPicBack": [
+ 11,
+ 28316
+ ],
+ "MachopPicFront": [
+ 11,
+ 28033
+ ],
+ "MagikarpPicBack": [
+ 12,
+ 24312
+ ],
+ "MagikarpPicFront": [
+ 12,
+ 23942
+ ],
+ "MagmarPicBack": [
+ 10,
+ 25090
+ ],
+ "MagmarPicFront": [
+ 10,
+ 24660
+ ],
+ "MagnemitePicBack": [
+ 13,
+ 23969
+ ],
+ "MagnemitePicFront": [
+ 13,
+ 23762
+ ],
+ "MagnetonPicBack": [
+ 10,
+ 26255
+ ],
+ "MagnetonPicFront": [
+ 10,
+ 25865
+ ],
+ "MankeyPicBack": [
+ 10,
+ 27188
+ ],
+ "MankeyPicFront": [
+ 10,
+ 26839
+ ],
+ "MarowakPicBack": [
+ 12,
+ 28694
+ ],
+ "MarowakPicFront": [
+ 12,
+ 28322
+ ],
+ "MartSignText": [
+ 0,
+ 9189
+ ],
+ "MelanieBulbasaurText": [
+ 42,
+ 28911
+ ],
+ "MelanieOddishText": [
+ 42,
+ 28937
+ ],
+ "MelanieSandshrewText": [
+ 42,
+ 28957
+ ],
+ "MelanieText1": [
+ 42,
+ 28659
+ ],
+ "MelanieText2": [
+ 42,
+ 28778
+ ],
+ "MelanieText3": [
+ 42,
+ 28826
+ ],
+ "MelanieText4": [
+ 42,
+ 28859
+ ],
+ "MelanieText5": [
+ 42,
+ 28886
+ ],
+ "MeowthPicBack": [
+ 11,
+ 18218
+ ],
+ "MeowthPicFront": [
+ 11,
+ 17929
+ ],
+ "MetapodPicBack": [
+ 12,
+ 19694
+ ],
+ "MetapodPicFront": [
+ 12,
+ 19521
+ ],
+ "MewBaseStats": [
+ 14,
+ 21574
+ ],
+ "MewPicBack": [
+ 9,
+ 27365
+ ],
+ "MewPicFront": [
+ 9,
+ 27090
+ ],
+ "MewtwoPicBack": [
+ 12,
+ 23322
+ ],
+ "MewtwoPicFront": [
+ 12,
+ 22828
+ ],
+ "MistyPic": [
+ 19,
+ 27668
+ ],
+ "MoltresPicBack": [
+ 10,
+ 31909
+ ],
+ "MoltresPicFront": [
+ 10,
+ 31430
+ ],
+ "MonPartyData": [
+ 28,
+ 22970
+ ],
+ "MonsterNames": [
+ 58,
+ 16384
+ ],
+ "MonsterPalettes": [
+ 28,
+ 26913
+ ],
+ "MoveAnimationTiles0": [
+ 30,
+ 16951
+ ],
+ "MoveAnimationTiles1": [
+ 30,
+ 18215
+ ],
+ "MoveAnimationTiles2": [
+ 30,
+ 16951
+ ],
+ "MoveAnimationTilesPointers": [
+ 30,
+ 16939
+ ],
+ "MoveNames": [
+ 47,
+ 16384
+ ],
+ "MoveSoundTable": [
+ 30,
+ 23064
+ ],
+ "Moves": [
+ 14,
+ 16384
+ ],
+ "MrFujisHouseLittleGirlText": [
+ 7,
+ 20963
+ ],
+ "MrFujisHouseMrFujiPokedexText": [
+ 7,
+ 21101
+ ],
+ "MrFujisHouseMrFujiText": [
+ 7,
+ 21024
+ ],
+ "MrFujisHouseNidorinoText": [
+ 7,
+ 21011
+ ],
+ "MrFujisHousePsyduckText": [
+ 7,
+ 20998
+ ],
+ "MrFujisHouseSuperNerdText": [
+ 7,
+ 20928
+ ],
+ "MrFujisHouse_h": [
+ 7,
+ 20900
+ ],
+ "MrMimePicBack": [
+ 10,
+ 21103
+ ],
+ "MrMimePicFront": [
+ 10,
+ 20684
+ ],
+ "MrPsychicsHouseMrPsychicText": [
+ 7,
+ 22347
+ ],
+ "MrPsychicsHouse_h": [
+ 7,
+ 22330
+ ],
+ "MtMoon1FBewareZubatSign": [
+ 18,
+ 23168
+ ],
+ "MtMoon1FCooltrainerF1Text": [
+ 18,
+ 23029
+ ],
+ "MtMoon1FCooltrainerF2Text": [
+ 18,
+ 23041
+ ],
+ "MtMoon1FHikerText": [
+ 18,
+ 23017
+ ],
+ "MtMoon1FSuperNerdText": [
+ 18,
+ 23035
+ ],
+ "MtMoon1FYoungster1Text": [
+ 18,
+ 23023
+ ],
+ "MtMoon1FYoungster2Text": [
+ 18,
+ 23047
+ ],
+ "MtMoon1FYoungster3Text": [
+ 18,
+ 23053
+ ],
+ "MtMoon1F_h": [
+ 18,
+ 22867
+ ],
+ "MtMoonB1FUnusedText": [
+ 20,
+ 23178
+ ],
+ "MtMoonB1F_h": [
+ 20,
+ 23160
+ ],
+ "MtMoonB2FDomeFossilText": [
+ 18,
+ 24694
+ ],
+ "MtMoonB2FHelixFossilText": [
+ 18,
+ 24755
+ ],
+ "MtMoonB2FJessieJamesText": [
+ 18,
+ 24541
+ ],
+ "MtMoonB2FRocket1Text": [
+ 18,
+ 24672
+ ],
+ "MtMoonB2FRocket2Text": [
+ 18,
+ 24678
+ ],
+ "MtMoonB2FRocket3Text": [
+ 18,
+ 24684
+ ],
+ "MtMoonB2FSuperNerdText": [
+ 18,
+ 24603
+ ],
+ "MtMoonB2FSuperNerdThenThisIsMineText": [
+ 18,
+ 24864
+ ],
+ "MtMoonB2FText12": [
+ 18,
+ 24542
+ ],
+ "MtMoonB2FText13": [
+ 18,
+ 24580
+ ],
+ "MtMoonB2FText14": [
+ 18,
+ 24590
+ ],
+ "MtMoonB2F_h": [
+ 18,
+ 23678
+ ],
+ "MtMoonPokecenterChanseyText": [
+ 18,
+ 21222
+ ],
+ "MtMoonPokecenterClipboardText": [
+ 18,
+ 21216
+ ],
+ "MtMoonPokecenterGentlemanText": [
+ 18,
+ 21199
+ ],
+ "MtMoonPokecenterLinkReceptionistText": [
+ 18,
+ 21221
+ ],
+ "MtMoonPokecenterMagikarpSalesmanText": [
+ 18,
+ 21204
+ ],
+ "MtMoonPokecenterNurseText": [
+ 18,
+ 21193
+ ],
+ "MtMoonPokecenterYoungsterText": [
+ 18,
+ 21194
+ ],
+ "MtMoonPokecenter_h": [
+ 18,
+ 21161
+ ],
+ "MukPicBack": [
+ 12,
+ 24852
+ ],
+ "MukPicFront": [
+ 12,
+ 24459
+ ],
+ "Museum1FGamblerText": [
+ 23,
+ 16698
+ ],
+ "Museum1FOldAmberText": [
+ 23,
+ 16734
+ ],
+ "Museum1FScientist1Text": [
+ 23,
+ 16686
+ ],
+ "Museum1FScientist2Text": [
+ 23,
+ 16710
+ ],
+ "Museum1FScientist3Text": [
+ 23,
+ 16722
+ ],
+ "Museum1F_h": [
+ 23,
+ 16611
+ ],
+ "Museum2FBrunetteGirlText": [
+ 23,
+ 16865
+ ],
+ "Museum2FGrampsText": [
+ 23,
+ 16855
+ ],
+ "Museum2FHikerText": [
+ 23,
+ 16870
+ ],
+ "Museum2FMoonStoneSignText": [
+ 23,
+ 16930
+ ],
+ "Museum2FScientistText": [
+ 23,
+ 16860
+ ],
+ "Museum2FSpaceShuttleSignText": [
+ 23,
+ 16925
+ ],
+ "Museum2FYoungsterText": [
+ 23,
+ 16850
+ ],
+ "Museum2F_h": [
+ 23,
+ 16820
+ ],
+ "NameRatersHouseNameRaterText": [
+ 7,
+ 21342
+ ],
+ "NameRatersHouse_h": [
+ 7,
+ 21262
+ ],
+ "NidokingPicBack": [
+ 9,
+ 19614
+ ],
+ "NidokingPicFront": [
+ 9,
+ 19054
+ ],
+ "NidoqueenPicBack": [
+ 9,
+ 24611
+ ],
+ "NidoqueenPicFront": [
+ 9,
+ 24058
+ ],
+ "NidoranFPicBack": [
+ 9,
+ 23987
+ ],
+ "NidoranFPicFront": [
+ 9,
+ 23745
+ ],
+ "NidoranMPicBack": [
+ 9,
+ 18077
+ ],
+ "NidoranMPicFront": [
+ 9,
+ 17823
+ ],
+ "NidorinaPicBack": [
+ 13,
+ 22269
+ ],
+ "NidorinaPicFront": [
+ 13,
+ 21879
+ ],
+ "NidorinoPicBack": [
+ 13,
+ 21724
+ ],
+ "NidorinoPicFront": [
+ 13,
+ 21375
+ ],
+ "NinetalesPicBack": [
+ 11,
+ 19667
+ ],
+ "NinetalesPicFront": [
+ 11,
+ 19126
+ ],
+ "NintendoCopyrightLogoGraphics": [
+ 4,
+ 19528
+ ],
+ "NothingWildMons": [
+ 3,
+ 19849
+ ],
+ "OaksLabEeveePokeBallText": [
+ 7,
+ 18828
+ ],
+ "OaksLabGirlText": [
+ 7,
+ 19128
+ ],
+ "OaksLabOak1Text": [
+ 7,
+ 18882
+ ],
+ "OaksLabOak2Text": [
+ 7,
+ 19123
+ ],
+ "OaksLabOakBePatientText": [
+ 7,
+ 19188
+ ],
+ "OaksLabOakChooseMonText": [
+ 7,
+ 19158
+ ],
+ "OaksLabOakDontGoAwayYetText": [
+ 7,
+ 19344
+ ],
+ "OaksLabOakGotPokedexText": [
+ 7,
+ 19459
+ ],
+ "OaksLabOakIHaveARequestText": [
+ 7,
+ 19449
+ ],
+ "OaksLabOakMyInventionPokedexText": [
+ 7,
+ 19454
+ ],
+ "OaksLabOakThatWasMyDreamText": [
+ 7,
+ 19465
+ ],
+ "OaksLabPikachuDislikesPokeballsText1": [
+ 7,
+ 19399
+ ],
+ "OaksLabPikachuDislikesPokeballsText2": [
+ 7,
+ 19424
+ ],
+ "OaksLabPlayerReceivedMonText": [
+ 7,
+ 19263
+ ],
+ "OaksLabPokedexText": [
+ 7,
+ 19108
+ ],
+ "OaksLabRivalFedUpWithWaitingText": [
+ 7,
+ 19143
+ ],
+ "OaksLabRivalGrampsText": [
+ 7,
+ 19439
+ ],
+ "OaksLabRivalIllTakeYouOnText": [
+ 7,
+ 19359
+ ],
+ "OaksLabRivalLeaveItAllToMeText": [
+ 7,
+ 19470
+ ],
+ "OaksLabRivalMyPokemonHasGrownStrongerText": [
+ 7,
+ 19444
+ ],
+ "OaksLabRivalReceivedMonText": [
+ 7,
+ 19203
+ ],
+ "OaksLabRivalSmellYouLaterText": [
+ 7,
+ 19384
+ ],
+ "OaksLabRivalText": [
+ 7,
+ 18776
+ ],
+ "OaksLabRivalWhatAboutMeText": [
+ 7,
+ 19173
+ ],
+ "OaksLabScientistText": [
+ 7,
+ 19475
+ ],
+ "OaksLab_h": [
+ 7,
+ 17286
+ ],
+ "OddishPicBack": [
+ 13,
+ 27478
+ ],
+ "OddishPicFront": [
+ 13,
+ 27254
+ ],
+ "OldManPicBack": [
+ 61,
+ 17473
+ ],
+ "OmanytePicBack": [
+ 11,
+ 24517
+ ],
+ "OmanytePicFront": [
+ 11,
+ 24294
+ ],
+ "OmastarPicBack": [
+ 11,
+ 25017
+ ],
+ "OmastarPicFront": [
+ 11,
+ 24610
+ ],
+ "OnixPicBack": [
+ 10,
+ 17155
+ ],
+ "OnixPicFront": [
+ 10,
+ 16778
+ ],
+ "PalletTownFisherText": [
+ 6,
+ 20497
+ ],
+ "PalletTownGirlText": [
+ 6,
+ 20492
+ ],
+ "PalletTownOakComeWithMe": [
+ 6,
+ 20487
+ ],
+ "PalletTownOakText": [
+ 6,
+ 20410
+ ],
+ "PalletTownOaksLabSignText": [
+ 6,
+ 20502
+ ],
+ "PalletTownPlayersHouseSignText": [
+ 6,
+ 20512
+ ],
+ "PalletTownRivalsHouseSignText": [
+ 6,
+ 20517
+ ],
+ "PalletTownSignText": [
+ 6,
+ 20507
+ ],
+ "PalletTown_h": [
+ 6,
+ 17057
+ ],
+ "ParasPicBack": [
+ 11,
+ 29324
+ ],
+ "ParasPicFront": [
+ 11,
+ 29058
+ ],
+ "ParasectPicBack": [
+ 10,
+ 23198
+ ],
+ "ParasectPicFront": [
+ 10,
+ 22796
+ ],
+ "PersianPicBack": [
+ 12,
+ 28183
+ ],
+ "PersianPicFront": [
+ 12,
+ 27752
+ ],
+ "PewterCityCooltrainerFText": [
+ 6,
+ 21604
+ ],
+ "PewterCityCooltrainerMText": [
+ 6,
+ 21609
+ ],
+ "PewterCityGymSignText": [
+ 6,
+ 21811
+ ],
+ "PewterCityMuseumSignText": [
+ 6,
+ 21806
+ ],
+ "PewterCityPoliceNoticeSignText": [
+ 6,
+ 21801
+ ],
+ "PewterCitySignText": [
+ 6,
+ 21816
+ ],
+ "PewterCitySuperNerd1ItsRightHereText": [
+ 6,
+ 21693
+ ],
+ "PewterCitySuperNerd1Text": [
+ 6,
+ 21614
+ ],
+ "PewterCitySuperNerd2Text": [
+ 6,
+ 21698
+ ],
+ "PewterCityTrainerTipsText": [
+ 6,
+ 21796
+ ],
+ "PewterCityYoungsterGoTakeOnBrockText": [
+ 6,
+ 21791
+ ],
+ "PewterCityYoungsterText": [
+ 6,
+ 21747
+ ],
+ "PewterCity_h": [
+ 6,
+ 17754
+ ],
+ "PewterGymBrockText": [
+ 23,
+ 17195
+ ],
+ "PewterGymBrockWaitTakeThisText": [
+ 23,
+ 17285
+ ],
+ "PewterGymCooltrainerMText": [
+ 23,
+ 17315
+ ],
+ "PewterGymGuideText": [
+ 23,
+ 17340
+ ],
+ "PewterGymReceivedTM34Text": [
+ 23,
+ 17290
+ ],
+ "PewterGymTM34NoRoomText": [
+ 23,
+ 17300
+ ],
+ "PewterGym_h": [
+ 23,
+ 16983
+ ],
+ "PewterMartClerkText": [
+ 0,
+ 9027
+ ],
+ "PewterMartSuperNerdText": [
+ 29,
+ 17672
+ ],
+ "PewterMartYoungsterText": [
+ 29,
+ 17657
+ ],
+ "PewterMart_h": [
+ 29,
+ 17630
+ ],
+ "PewterNidoranHouseLittleBoyText": [
+ 7,
+ 20054
+ ],
+ "PewterNidoranHouseMiddleAgedManText": [
+ 7,
+ 20059
+ ],
+ "PewterNidoranHouseNidoranText": [
+ 7,
+ 20038
+ ],
+ "PewterNidoranHouse_h": [
+ 7,
+ 20016
+ ],
+ "PewterPokecenterChanseyText": [
+ 23,
+ 17585
+ ],
+ "PewterPokecenterCooltrainerFText": [
+ 23,
+ 17573
+ ],
+ "PewterPokecenterGentlemanText": [
+ 23,
+ 17555
+ ],
+ "PewterPokecenterJigglypuffText": [
+ 23,
+ 17560
+ ],
+ "PewterPokecenterLinkReceptionistText": [
+ 23,
+ 17572
+ ],
+ "PewterPokecenterNurseText": [
+ 23,
+ 17554
+ ],
+ "PewterPokecenter_h": [
+ 23,
+ 17518
+ ],
+ "PewterSpeechHouseGamblerText": [
+ 7,
+ 20121
+ ],
+ "PewterSpeechHouseYoungsterText": [
+ 7,
+ 20126
+ ],
+ "PewterSpeechHouse_h": [
+ 7,
+ 20102
+ ],
+ "PickUpItemText": [
+ 0,
+ 9199
+ ],
+ "PidgeotPicBack": [
+ 12,
+ 31441
+ ],
+ "PidgeotPicFront": [
+ 12,
+ 30866
+ ],
+ "PidgeottoPicBack": [
+ 12,
+ 30763
+ ],
+ "PidgeottoPicFront": [
+ 12,
+ 30406
+ ],
+ "PidgeyPicBack": [
+ 10,
+ 18150
+ ],
+ "PidgeyPicFront": [
+ 10,
+ 17909
+ ],
+ "PikachuCriesPointerTable": [
+ 60,
+ 16526
+ ],
+ "PikachuPicBack": [
+ 11,
+ 20041
+ ],
+ "PikachuPicFront": [
+ 11,
+ 19797
+ ],
+ "PinsirPicBack": [
+ 9,
+ 31407
+ ],
+ "PinsirPicFront": [
+ 9,
+ 30868
+ ],
+ "PlantIconFrame1": [
+ 28,
+ 23078
+ ],
+ "PlantIconFrame2": [
+ 28,
+ 23142
+ ],
+ "PlayerCharacterTitleGraphics": [
+ 4,
+ 21048
+ ],
+ "PokeCenterFlashingMonitorAndHealBall": [
+ 28,
+ 17675
+ ],
+ "PokeCenterSignText": [
+ 0,
+ 9194
+ ],
+ "PokeballTileGraphics": [
+ 14,
+ 27176
+ ],
+ "PokedexEntryPointers": [
+ 16,
+ 17675
+ ],
+ "PokedexTileGraphics": [
+ 4,
+ 20504
+ ],
+ "PokemaniacPic": [
+ 19,
+ 18121
+ ],
+ "PokemonFanClubChairmanText": [
+ 22,
+ 23357
+ ],
+ "PokemonFanClubClefairyFanText": [
+ 22,
+ 23199
+ ],
+ "PokemonFanClubClefairyText": [
+ 22,
+ 23311
+ ],
+ "PokemonFanClubReceptionistText": [
+ 22,
+ 23603
+ ],
+ "PokemonFanClubSeelFanText": [
+ 22,
+ 23255
+ ],
+ "PokemonFanClubSeelText": [
+ 22,
+ 23334
+ ],
+ "PokemonFanClub_h": [
+ 22,
+ 23040
+ ],
+ "PokemonLogoCornerGraphics": [
+ 61,
+ 20011
+ ],
+ "PokemonLogoGraphics": [
+ 61,
+ 18171
+ ],
+ "PokemonMansion1FScientistText": [
+ 17,
+ 17378
+ ],
+ "PokemonMansion1FSwitchText": [
+ 17,
+ 17403
+ ],
+ "PokemonMansion1F_h": [
+ 17,
+ 17220
+ ],
+ "PokemonMansion2FDiary1Text": [
+ 20,
+ 24742
+ ],
+ "PokemonMansion2FDiary2Text": [
+ 20,
+ 24747
+ ],
+ "PokemonMansion2FSuperNerdText": [
+ 20,
+ 24717
+ ],
+ "PokemonMansion2FSwitchText": [
+ 20,
+ 24752
+ ],
+ "PokemonMansion2F_h": [
+ 20,
+ 24565
+ ],
+ "PokemonMansion3FDiaryText": [
+ 20,
+ 25354
+ ],
+ "PokemonMansion3FScientistText": [
+ 20,
+ 25314
+ ],
+ "PokemonMansion3FSuperNerdText": [
+ 20,
+ 25304
+ ],
+ "PokemonMansion3F_h": [
+ 20,
+ 25099
+ ],
+ "PokemonMansionB1FBurglarText": [
+ 20,
+ 25738
+ ],
+ "PokemonMansionB1FDiaryText": [
+ 20,
+ 25788
+ ],
+ "PokemonMansionB1FScientistText": [
+ 20,
+ 25748
+ ],
+ "PokemonMansionB1F_h": [
+ 20,
+ 25558
+ ],
+ "PokemonTower1FBaldingGuyText": [
+ 24,
+ 17476
+ ],
+ "PokemonTower1FChannelerText": [
+ 24,
+ 17486
+ ],
+ "PokemonTower1FGirlText": [
+ 24,
+ 17481
+ ],
+ "PokemonTower1FMiddleAgedWomanText": [
+ 24,
+ 17471
+ ],
+ "PokemonTower1FReceptionistText": [
+ 24,
+ 17466
+ ],
+ "PokemonTower1F_h": [
+ 24,
+ 17440
+ ],
+ "PokemonTower2FChannelerText": [
+ 24,
+ 17968
+ ],
+ "PokemonTower2FRivalText": [
+ 24,
+ 17886
+ ],
+ "PokemonTower2F_h": [
+ 24,
+ 17639
+ ],
+ "PokemonTower3FChanneler1Text": [
+ 24,
+ 18177
+ ],
+ "PokemonTower3FChanneler2Text": [
+ 24,
+ 18187
+ ],
+ "PokemonTower3FChanneler3Text": [
+ 24,
+ 18197
+ ],
+ "PokemonTower3F_h": [
+ 24,
+ 18095
+ ],
+ "PokemonTower4FChanneler1Text": [
+ 24,
+ 18479
+ ],
+ "PokemonTower4FChanneler2Text": [
+ 24,
+ 18489
+ ],
+ "PokemonTower4FChanneler3Text": [
+ 24,
+ 18499
+ ],
+ "PokemonTower4F_h": [
+ 24,
+ 18393
+ ],
+ "PokemonTower5FChanneler1Text": [
+ 24,
+ 18889
+ ],
+ "PokemonTower5FChanneler2Text": [
+ 24,
+ 18894
+ ],
+ "PokemonTower5FChanneler3Text": [
+ 24,
+ 18919
+ ],
+ "PokemonTower5FChanneler4Text": [
+ 24,
+ 18944
+ ],
+ "PokemonTower5FChanneler5Text": [
+ 24,
+ 18969
+ ],
+ "PokemonTower5FPurifiedZoneText": [
+ 24,
+ 18994
+ ],
+ "PokemonTower5F_h": [
+ 24,
+ 18709
+ ],
+ "PokemonTower6FBeGoneText": [
+ 24,
+ 19525
+ ],
+ "PokemonTower6FChanneler1Text": [
+ 24,
+ 19411
+ ],
+ "PokemonTower6FChanneler2Text": [
+ 24,
+ 19421
+ ],
+ "PokemonTower6FChanneler3Text": [
+ 24,
+ 19431
+ ],
+ "PokemonTower6FMarowakDepartedText": [
+ 24,
+ 19441
+ ],
+ "PokemonTower6F_h": [
+ 24,
+ 19154
+ ],
+ "PokemonTower7FJessieJamesText": [
+ 24,
+ 20224
+ ],
+ "PokemonTower7FMrFujiText": [
+ 24,
+ 20286
+ ],
+ "PokemonTower7FText4": [
+ 24,
+ 20225
+ ],
+ "PokemonTower7FText5": [
+ 24,
+ 20263
+ ],
+ "PokemonTower7FText6": [
+ 24,
+ 20273
+ ],
+ "PokemonTower7F_h": [
+ 24,
+ 19688
+ ],
+ "PoliwagPicBack": [
+ 10,
+ 30812
+ ],
+ "PoliwagPicFront": [
+ 10,
+ 30585
+ ],
+ "PoliwhirlPicBack": [
+ 11,
+ 29798
+ ],
+ "PoliwhirlPicFront": [
+ 11,
+ 29442
+ ],
+ "PoliwrathPicBack": [
+ 11,
+ 30385
+ ],
+ "PoliwrathPicFront": [
+ 11,
+ 29897
+ ],
+ "PonytaPicBack": [
+ 13,
+ 20171
+ ],
+ "PonytaPicFront": [
+ 13,
+ 19228
+ ],
+ "PorygonPicBack": [
+ 13,
+ 23046
+ ],
+ "PorygonPicFront": [
+ 13,
+ 22792
+ ],
+ "PowerPlantElectrode1Text": [
+ 7,
+ 23696
+ ],
+ "PowerPlantElectrode2Text": [
+ 7,
+ 23714
+ ],
+ "PowerPlantVoltorb1Text": [
+ 7,
+ 23678
+ ],
+ "PowerPlantVoltorb2Text": [
+ 7,
+ 23684
+ ],
+ "PowerPlantVoltorb3Text": [
+ 7,
+ 23690
+ ],
+ "PowerPlantVoltorb4Text": [
+ 7,
+ 23702
+ ],
+ "PowerPlantVoltorb5Text": [
+ 7,
+ 23708
+ ],
+ "PowerPlantVoltorb6Text": [
+ 7,
+ 23720
+ ],
+ "PowerPlantZapdosText": [
+ 7,
+ 23726
+ ],
+ "PowerPlant_h": [
+ 7,
+ 23492
+ ],
+ "PrimeapePicBack": [
+ 12,
+ 17490
+ ],
+ "PrimeapePicFront": [
+ 12,
+ 17020
+ ],
+ "ProfOakPic": [
+ 19,
+ 24890
+ ],
+ "PsychicPic": [
+ 19,
+ 22312
+ ],
+ "PsyduckPicBack": [
+ 10,
+ 23591
+ ],
+ "PsyduckPicFront": [
+ 10,
+ 23324
+ ],
+ "QuadrupedIconFrame1": [
+ 28,
+ 23206
+ ],
+ "QuadrupedIconFrame2": [
+ 28,
+ 23270
+ ],
+ "QuestionEmote": [
+ 16,
+ 21029
+ ],
+ "RaichuPicBack": [
+ 11,
+ 20657
+ ],
+ "RaichuPicFront": [
+ 11,
+ 20161
+ ],
+ "RapidashPicBack": [
+ 13,
+ 20307
+ ],
+ "RapidashPicFront": [
+ 13,
+ 19612
+ ],
+ "RaticatePicBack": [
+ 13,
+ 21258
+ ],
+ "RaticatePicFront": [
+ 13,
+ 20785
+ ],
+ "RattataPicBack": [
+ 13,
+ 20728
+ ],
+ "RattataPicFront": [
+ 13,
+ 20483
+ ],
+ "RedBikeSprite": [
+ 5,
+ 17393
+ ],
+ "RedFishingRodTiles": [
+ 30,
+ 25082
+ ],
+ "RedFishingTilesBack": [
+ 30,
+ 25018
+ ],
+ "RedFishingTilesFront": [
+ 30,
+ 24986
+ ],
+ "RedFishingTilesSide": [
+ 30,
+ 25050
+ ],
+ "RedPicBack": [
+ 61,
+ 17329
+ ],
+ "RedPicFront": [
+ 4,
+ 23191
+ ],
+ "RedsHouse1FMomText": [
+ 18,
+ 16650
+ ],
+ "RedsHouse1FTVText": [
+ 18,
+ 16662
+ ],
+ "RedsHouse1F_h": [
+ 18,
+ 16630
+ ],
+ "RedsHouse2F_h": [
+ 23,
+ 16548
+ ],
+ "RhydonPicBack": [
+ 9,
+ 16922
+ ],
+ "RhydonPicFront": [
+ 9,
+ 16384
+ ],
+ "RhyhornPicBack": [
+ 9,
+ 25655
+ ],
+ "RhyhornPicFront": [
+ 9,
+ 25193
+ ],
+ "Rival1Pic": [
+ 19,
+ 24649
+ ],
+ "Rival2Pic": [
+ 19,
+ 29882
+ ],
+ "Rival3Pic": [
+ 19,
+ 30177
+ ],
+ "RockTunnel1FCooltrainerF1Text": [
+ 17,
+ 17939
+ ],
+ "RockTunnel1FCooltrainerF2Text": [
+ 17,
+ 17945
+ ],
+ "RockTunnel1FCooltrainerF3Text": [
+ 17,
+ 17951
+ ],
+ "RockTunnel1FHiker1Text": [
+ 17,
+ 17915
+ ],
+ "RockTunnel1FHiker2Text": [
+ 17,
+ 17921
+ ],
+ "RockTunnel1FHiker3Text": [
+ 17,
+ 17927
+ ],
+ "RockTunnel1FSignText": [
+ 17,
+ 18066
+ ],
+ "RockTunnel1FSuperNerdText": [
+ 17,
+ 17933
+ ],
+ "RockTunnel1F_h": [
+ 17,
+ 17777
+ ],
+ "RockTunnelB1FCooltrainerF1Text": [
+ 17,
+ 25316
+ ],
+ "RockTunnelB1FCooltrainerF2Text": [
+ 17,
+ 25366
+ ],
+ "RockTunnelB1FHiker1Text": [
+ 17,
+ 25326
+ ],
+ "RockTunnelB1FHiker2Text": [
+ 17,
+ 25356
+ ],
+ "RockTunnelB1FHiker3Text": [
+ 17,
+ 25376
+ ],
+ "RockTunnelB1FSuperNerd1Text": [
+ 17,
+ 25336
+ ],
+ "RockTunnelB1FSuperNerd2Text": [
+ 17,
+ 25346
+ ],
+ "RockTunnelB1FSuperNerd3Text": [
+ 17,
+ 25386
+ ],
+ "RockTunnelB1F_h": [
+ 17,
+ 25166
+ ],
+ "RockTunnelPokecenterChanseyText": [
+ 18,
+ 21336
+ ],
+ "RockTunnelPokecenterFisherText": [
+ 18,
+ 21330
+ ],
+ "RockTunnelPokecenterGentlemanText": [
+ 18,
+ 21325
+ ],
+ "RockTunnelPokecenterLinkReceptionistText": [
+ 18,
+ 21335
+ ],
+ "RockTunnelPokecenterNurseText": [
+ 18,
+ 21324
+ ],
+ "RockTunnelPokecenter_h": [
+ 18,
+ 21296
+ ],
+ "RockerPic": [
+ 19,
+ 22595
+ ],
+ "RocketHideoutB1FRocket1Text": [
+ 17,
+ 19711
+ ],
+ "RocketHideoutB1FRocket2Text": [
+ 17,
+ 19721
+ ],
+ "RocketHideoutB1FRocket3Text": [
+ 17,
+ 19731
+ ],
+ "RocketHideoutB1FRocket4Text": [
+ 17,
+ 19741
+ ],
+ "RocketHideoutB1FRocket5Text": [
+ 17,
+ 19751
+ ],
+ "RocketHideoutB1F_h": [
+ 17,
+ 19550
+ ],
+ "RocketHideoutB2FRocketText": [
+ 17,
+ 20862
+ ],
+ "RocketHideoutB2F_h": [
+ 17,
+ 20155
+ ],
+ "RocketHideoutB3FRocket1Text": [
+ 17,
+ 21435
+ ],
+ "RocketHideoutB3FRocket2Text": [
+ 17,
+ 21460
+ ],
+ "RocketHideoutB3F_h": [
+ 17,
+ 21177
+ ],
+ "RocketHideoutB4FGiovanniHopeWeMeetAgainText": [
+ 17,
+ 22542
+ ],
+ "RocketHideoutB4FGiovanniText": [
+ 17,
+ 22468
+ ],
+ "RocketHideoutB4FJessieJamesText": [
+ 17,
+ 22406
+ ],
+ "RocketHideoutB4FRocketText": [
+ 17,
+ 22547
+ ],
+ "RocketHideoutB4FText11": [
+ 17,
+ 22407
+ ],
+ "RocketHideoutB4FText12": [
+ 17,
+ 22445
+ ],
+ "RocketHideoutB4FText13": [
+ 17,
+ 22455
+ ],
+ "RocketHideoutB4F_h": [
+ 17,
+ 21745
+ ],
+ "RocketHideoutElevatorText": [
+ 17,
+ 22977
+ ],
+ "RocketHideoutElevator_h": [
+ 17,
+ 22872
+ ],
+ "RocketPic": [
+ 19,
+ 25722
+ ],
+ "Route10CooltrainerF1Text": [
+ 22,
+ 21139
+ ],
+ "Route10CooltrainerF2Text": [
+ 22,
+ 21189
+ ],
+ "Route10Hiker1Text": [
+ 22,
+ 21089
+ ],
+ "Route10Hiker2Text": [
+ 22,
+ 21164
+ ],
+ "Route10PowerPlantSignText": [
+ 22,
+ 21219
+ ],
+ "Route10RockTunnelSignText": [
+ 22,
+ 21214
+ ],
+ "Route10SuperNerd1Text": [
+ 22,
+ 21064
+ ],
+ "Route10SuperNerd2Text": [
+ 22,
+ 21114
+ ],
+ "Route10_h": [
+ 22,
+ 17108
+ ],
+ "Route11DiglettsCaveSignText": [
+ 22,
+ 21642
+ ],
+ "Route11Gambler1Text": [
+ 22,
+ 21392
+ ],
+ "Route11Gambler2Text": [
+ 22,
+ 21417
+ ],
+ "Route11Gambler3Text": [
+ 22,
+ 21517
+ ],
+ "Route11Gambler4Text": [
+ 22,
+ 21542
+ ],
+ "Route11Gate1FGuardText": [
+ 18,
+ 21415
+ ],
+ "Route11Gate1F_h": [
+ 18,
+ 21398
+ ],
+ "Route11Gate2FLeftBinocularsText": [
+ 18,
+ 21567
+ ],
+ "Route11Gate2FOaksAideText": [
+ 18,
+ 21507
+ ],
+ "Route11Gate2FRightBinocularsText": [
+ 18,
+ 21605
+ ],
+ "Route11Gate2FYoungsterText": [
+ 18,
+ 21493
+ ],
+ "Route11Gate2F_h": [
+ 18,
+ 21470
+ ],
+ "Route11SuperNerd1Text": [
+ 22,
+ 21467
+ ],
+ "Route11SuperNerd2Text": [
+ 22,
+ 21592
+ ],
+ "Route11Youngster1Text": [
+ 22,
+ 21442
+ ],
+ "Route11Youngster2Text": [
+ 22,
+ 21492
+ ],
+ "Route11Youngster3Text": [
+ 22,
+ 21567
+ ],
+ "Route11Youngster4Text": [
+ 22,
+ 21617
+ ],
+ "Route11_h": [
+ 22,
+ 17598
+ ],
+ "Route12CooltrainerMText": [
+ 22,
+ 21955
+ ],
+ "Route12Fisher1Text": [
+ 22,
+ 21905
+ ],
+ "Route12Fisher2Text": [
+ 22,
+ 21930
+ ],
+ "Route12Fisher3Text": [
+ 22,
+ 22005
+ ],
+ "Route12Fisher4Text": [
+ 22,
+ 22030
+ ],
+ "Route12Fisher5Text": [
+ 22,
+ 22055
+ ],
+ "Route12Gate1FGuardText": [
+ 18,
+ 21664
+ ],
+ "Route12Gate1F_h": [
+ 18,
+ 21647
+ ],
+ "Route12Gate2FBrunetteGirlText": [
+ 18,
+ 21760
+ ],
+ "Route12Gate2FLeftBinocularsText": [
+ 18,
+ 21832
+ ],
+ "Route12Gate2FRightBinocularsText": [
+ 18,
+ 21844
+ ],
+ "Route12Gate2F_h": [
+ 18,
+ 21739
+ ],
+ "Route12SignText": [
+ 22,
+ 22080
+ ],
+ "Route12SnorlaxCalmedDownText": [
+ 22,
+ 21900
+ ],
+ "Route12SnorlaxText": [
+ 22,
+ 21890
+ ],
+ "Route12SnorlaxWokeUpText": [
+ 22,
+ 21895
+ ],
+ "Route12SportFishingSignText": [
+ 22,
+ 22085
+ ],
+ "Route12SuperNerdText": [
+ 22,
+ 21980
+ ],
+ "Route12SuperRodHouseFishingGuruText": [
+ 21,
+ 25782
+ ],
+ "Route12SuperRodHouse_h": [
+ 21,
+ 25765
+ ],
+ "Route12_h": [
+ 22,
+ 18029
+ ],
+ "Route13Beauty1Text": [
+ 21,
+ 22900
+ ],
+ "Route13Beauty2Text": [
+ 21,
+ 22925
+ ],
+ "Route13BikerText": [
+ 21,
+ 22950
+ ],
+ "Route13CooltrainerF1Text": [
+ 21,
+ 22775
+ ],
+ "Route13CooltrainerF2Text": [
+ 21,
+ 22800
+ ],
+ "Route13CooltrainerF3Text": [
+ 21,
+ 22825
+ ],
+ "Route13CooltrainerF4Text": [
+ 21,
+ 22850
+ ],
+ "Route13CooltrainerM1Text": [
+ 21,
+ 22750
+ ],
+ "Route13CooltrainerM2Text": [
+ 21,
+ 22875
+ ],
+ "Route13CooltrainerM3Text": [
+ 21,
+ 22975
+ ],
+ "Route13SignText": [
+ 21,
+ 23010
+ ],
+ "Route13TrainerTips1Text": [
+ 21,
+ 23000
+ ],
+ "Route13TrainerTips2Text": [
+ 21,
+ 23005
+ ],
+ "Route13_h": [
+ 21,
+ 18452
+ ],
+ "Route14Biker1Text": [
+ 21,
+ 23333
+ ],
+ "Route14Biker2Text": [
+ 21,
+ 23358
+ ],
+ "Route14Biker3Text": [
+ 21,
+ 23383
+ ],
+ "Route14Biker4Text": [
+ 21,
+ 23408
+ ],
+ "Route14CooltrainerM1Text": [
+ 21,
+ 23183
+ ],
+ "Route14CooltrainerM2Text": [
+ 21,
+ 23208
+ ],
+ "Route14CooltrainerM3Text": [
+ 21,
+ 23233
+ ],
+ "Route14CooltrainerM4Text": [
+ 21,
+ 23258
+ ],
+ "Route14CooltrainerM5Text": [
+ 21,
+ 23283
+ ],
+ "Route14CooltrainerM6Text": [
+ 21,
+ 23308
+ ],
+ "Route14SignText": [
+ 21,
+ 23433
+ ],
+ "Route14_h": [
+ 21,
+ 18849
+ ],
+ "Route15Beauty1Text": [
+ 22,
+ 22284
+ ],
+ "Route15Beauty2Text": [
+ 22,
+ 22290
+ ],
+ "Route15Biker1Text": [
+ 22,
+ 22296
+ ],
+ "Route15Biker2Text": [
+ 22,
+ 22302
+ ],
+ "Route15CooltrainerF1Text": [
+ 22,
+ 22260
+ ],
+ "Route15CooltrainerF2Text": [
+ 22,
+ 22266
+ ],
+ "Route15CooltrainerF3Text": [
+ 22,
+ 22308
+ ],
+ "Route15CooltrainerF4Text": [
+ 22,
+ 22314
+ ],
+ "Route15CooltrainerM1Text": [
+ 22,
+ 22272
+ ],
+ "Route15CooltrainerM2Text": [
+ 22,
+ 22278
+ ],
+ "Route15Gate1FGuardText": [
+ 18,
+ 21918
+ ],
+ "Route15Gate1F_h": [
+ 18,
+ 21901
+ ],
+ "Route15Gate2FBinocularsText": [
+ 18,
+ 22056
+ ],
+ "Route15Gate2FOaksAideText": [
+ 18,
+ 21992
+ ],
+ "Route15Gate2F_h": [
+ 18,
+ 21973
+ ],
+ "Route15SignText": [
+ 22,
+ 22474
+ ],
+ "Route15_h": [
+ 22,
+ 18732
+ ],
+ "Route16Biker1Text": [
+ 22,
+ 22708
+ ],
+ "Route16Biker2Text": [
+ 22,
+ 22733
+ ],
+ "Route16Biker3Text": [
+ 22,
+ 22758
+ ],
+ "Route16Biker4Text": [
+ 22,
+ 22783
+ ],
+ "Route16Biker5Text": [
+ 22,
+ 22808
+ ],
+ "Route16Biker6Text": [
+ 22,
+ 22833
+ ],
+ "Route16CyclingRoadSignText": [
+ 22,
+ 22873
+ ],
+ "Route16FlyHouseBrunetteGirlText": [
+ 7,
+ 24329
+ ],
+ "Route16FlyHouseFearowText": [
+ 7,
+ 24394
+ ],
+ "Route16FlyHouse_h": [
+ 7,
+ 24310
+ ],
+ "Route16Gate1FGamblerText": [
+ 18,
+ 22301
+ ],
+ "Route16Gate1FGuardText": [
+ 18,
+ 22263
+ ],
+ "Route16Gate1FGuardWaitUpText": [
+ 18,
+ 22296
+ ],
+ "Route16Gate1F_h": [
+ 18,
+ 22089
+ ],
+ "Route16Gate2FLeftBinocularsText": [
+ 18,
+ 22475
+ ],
+ "Route16Gate2FLittleBoyText": [
+ 18,
+ 22445
+ ],
+ "Route16Gate2FLittleGirlText": [
+ 18,
+ 22460
+ ],
+ "Route16Gate2FRightBinocularsText": [
+ 18,
+ 22487
+ ],
+ "Route16Gate2F_h": [
+ 18,
+ 22422
+ ],
+ "Route16SignText": [
+ 22,
+ 22878
+ ],
+ "Route16SnorlaxReturnedToMountainsText": [
+ 22,
+ 22868
+ ],
+ "Route16SnorlaxText": [
+ 22,
+ 22858
+ ],
+ "Route16SnorlaxWokeUpText": [
+ 22,
+ 22863
+ ],
+ "Route16_h": [
+ 22,
+ 19162
+ ],
+ "Route17Biker10Text": [
+ 21,
+ 23841
+ ],
+ "Route17Biker1Text": [
+ 21,
+ 23616
+ ],
+ "Route17Biker2Text": [
+ 21,
+ 23641
+ ],
+ "Route17Biker3Text": [
+ 21,
+ 23666
+ ],
+ "Route17Biker4Text": [
+ 21,
+ 23691
+ ],
+ "Route17Biker5Text": [
+ 21,
+ 23716
+ ],
+ "Route17Biker6Text": [
+ 21,
+ 23741
+ ],
+ "Route17Biker7Text": [
+ 21,
+ 23766
+ ],
+ "Route17Biker8Text": [
+ 21,
+ 23791
+ ],
+ "Route17Biker9Text": [
+ 21,
+ 23816
+ ],
+ "Route17CyclingRoadEndsSignText": [
+ 21,
+ 23891
+ ],
+ "Route17NoticeSign1Text": [
+ 21,
+ 23866
+ ],
+ "Route17NoticeSign2Text": [
+ 21,
+ 23886
+ ],
+ "Route17SignText": [
+ 21,
+ 23881
+ ],
+ "Route17TrainerTips1Text": [
+ 21,
+ 23871
+ ],
+ "Route17TrainerTips2Text": [
+ 21,
+ 23876
+ ],
+ "Route17_h": [
+ 21,
+ 19240
+ ],
+ "Route18CooltrainerM1Text": [
+ 22,
+ 22955
+ ],
+ "Route18CooltrainerM2Text": [
+ 22,
+ 22980
+ ],
+ "Route18CooltrainerM3Text": [
+ 22,
+ 23005
+ ],
+ "Route18CyclingRoadSignText": [
+ 22,
+ 23035
+ ],
+ "Route18Gate1FGuardExcuseMeText": [
+ 18,
+ 22729
+ ],
+ "Route18Gate1FGuardText": [
+ 18,
+ 22696
+ ],
+ "Route18Gate1F_h": [
+ 18,
+ 22529
+ ],
+ "Route18Gate2FCookText": [
+ 18,
+ 22805
+ ],
+ "Route18Gate2FLeftBinocularsText": [
+ 18,
+ 22819
+ ],
+ "Route18Gate2FRightBinocularsText": [
+ 18,
+ 22831
+ ],
+ "Route18Gate2F_h": [
+ 18,
+ 22784
+ ],
+ "Route18SignText": [
+ 22,
+ 23030
+ ],
+ "Route18_h": [
+ 22,
+ 19512
+ ],
+ "Route19CooltrainerM1Text": [
+ 21,
+ 24064
+ ],
+ "Route19CooltrainerM2Text": [
+ 21,
+ 24070
+ ],
+ "Route19SignText": [
+ 21,
+ 24278
+ ],
+ "Route19Swimmer1Text": [
+ 21,
+ 24076
+ ],
+ "Route19Swimmer2Text": [
+ 21,
+ 24082
+ ],
+ "Route19Swimmer3Text": [
+ 21,
+ 24088
+ ],
+ "Route19Swimmer4Text": [
+ 21,
+ 24094
+ ],
+ "Route19Swimmer5Text": [
+ 21,
+ 24100
+ ],
+ "Route19Swimmer6Text": [
+ 21,
+ 24106
+ ],
+ "Route19Swimmer7Text": [
+ 21,
+ 24112
+ ],
+ "Route19Swimmer8Text": [
+ 21,
+ 24118
+ ],
+ "Route19_h": [
+ 21,
+ 20096
+ ],
+ "Route1SignText": [
+ 7,
+ 17274
+ ],
+ "Route1Youngster1Text": [
+ 7,
+ 17250
+ ],
+ "Route1Youngster2Text": [
+ 7,
+ 17262
+ ],
+ "Route1_h": [
+ 7,
+ 16579
+ ],
+ "Route20CooltrainerMText": [
+ 20,
+ 19951
+ ],
+ "Route20SeafoamIslandsSignText": [
+ 20,
+ 20141
+ ],
+ "Route20Swimmer1Text": [
+ 20,
+ 19891
+ ],
+ "Route20Swimmer2Text": [
+ 20,
+ 19901
+ ],
+ "Route20Swimmer3Text": [
+ 20,
+ 19911
+ ],
+ "Route20Swimmer4Text": [
+ 20,
+ 19921
+ ],
+ "Route20Swimmer5Text": [
+ 20,
+ 19931
+ ],
+ "Route20Swimmer6Text": [
+ 20,
+ 19941
+ ],
+ "Route20Swimmer7Text": [
+ 20,
+ 19961
+ ],
+ "Route20Swimmer8Text": [
+ 20,
+ 19971
+ ],
+ "Route20Swimmer9Text": [
+ 20,
+ 19981
+ ],
+ "Route20_h": [
+ 20,
+ 16625
+ ],
+ "Route21Fisher1Text": [
+ 21,
+ 24435
+ ],
+ "Route21Fisher2Text": [
+ 21,
+ 24445
+ ],
+ "Route21Fisher3Text": [
+ 21,
+ 24505
+ ],
+ "Route21Fisher4Text": [
+ 21,
+ 24515
+ ],
+ "Route21Swimmer1Text": [
+ 21,
+ 24455
+ ],
+ "Route21Swimmer2Text": [
+ 21,
+ 24465
+ ],
+ "Route21Swimmer3Text": [
+ 21,
+ 24475
+ ],
+ "Route21Swimmer4Text": [
+ 21,
+ 24485
+ ],
+ "Route21Swimmer5Text": [
+ 21,
+ 24495
+ ],
+ "Route21_h": [
+ 21,
+ 20495
+ ],
+ "Route22GateGuardText": [
+ 7,
+ 24561
+ ],
+ "Route22Gate_h": [
+ 7,
+ 24449
+ ],
+ "Route22PokemonLeagueSignText": [
+ 20,
+ 20871
+ ],
+ "Route22Rival1Text": [
+ 20,
+ 20847
+ ],
+ "Route22Rival2Text": [
+ 20,
+ 20859
+ ],
+ "Route22_h": [
+ 20,
+ 16384
+ ],
+ "Route23Guard1Text": [
+ 20,
+ 21184
+ ],
+ "Route23Guard2Text": [
+ 20,
+ 21193
+ ],
+ "Route23Guard3Text": [
+ 20,
+ 21220
+ ],
+ "Route23Guard4Text": [
+ 20,
+ 21229
+ ],
+ "Route23Guard5Text": [
+ 20,
+ 21238
+ ],
+ "Route23Swimmer1Text": [
+ 20,
+ 21202
+ ],
+ "Route23Swimmer2Text": [
+ 20,
+ 21211
+ ],
+ "Route23VictoryRoadGateSignText": [
+ 20,
+ 21345
+ ],
+ "Route23_h": [
+ 20,
+ 17215
+ ],
+ "Route24CooltrainerF1Text": [
+ 20,
+ 21764
+ ],
+ "Route24CooltrainerF2Text": [
+ 20,
+ 21784
+ ],
+ "Route24CooltrainerM1Text": [
+ 20,
+ 21599
+ ],
+ "Route24CooltrainerM2Text": [
+ 20,
+ 21744
+ ],
+ "Route24CooltrainerM3Text": [
+ 20,
+ 21754
+ ],
+ "Route24CooltrainerM4Text": [
+ 20,
+ 21894
+ ],
+ "Route24Youngster1Text": [
+ 20,
+ 21774
+ ],
+ "Route24Youngster2Text": [
+ 20,
+ 21794
+ ],
+ "Route24_h": [
+ 20,
+ 18050
+ ],
+ "Route25BillSignText": [
+ 20,
+ 22471
+ ],
+ "Route25CooltrainerF1Text": [
+ 20,
+ 22276
+ ],
+ "Route25CooltrainerF2Text": [
+ 20,
+ 22296
+ ],
+ "Route25CooltrainerMText": [
+ 20,
+ 22266
+ ],
+ "Route25Hiker1Text": [
+ 20,
+ 22306
+ ],
+ "Route25Hiker2Text": [
+ 20,
+ 22316
+ ],
+ "Route25Hiker3Text": [
+ 20,
+ 22326
+ ],
+ "Route25Youngster1Text": [
+ 20,
+ 22246
+ ],
+ "Route25Youngster2Text": [
+ 20,
+ 22256
+ ],
+ "Route25Youngster3Text": [
+ 20,
+ 22286
+ ],
+ "Route25_h": [
+ 20,
+ 18337
+ ],
+ "Route2DiglettsCaveSignText": [
+ 21,
+ 21767
+ ],
+ "Route2GateOaksAideText": [
+ 23,
+ 21733
+ ],
+ "Route2GateYoungsterText": [
+ 23,
+ 21797
+ ],
+ "Route2Gate_h": [
+ 23,
+ 21714
+ ],
+ "Route2SignText": [
+ 21,
+ 21762
+ ],
+ "Route2TradeHouseGameboyKidText": [
+ 7,
+ 22531
+ ],
+ "Route2TradeHouseScientistText": [
+ 7,
+ 22526
+ ],
+ "Route2TradeHouse_h": [
+ 7,
+ 22507
+ ],
+ "Route2_h": [
+ 21,
+ 16384
+ ],
+ "Route3CooltrainerF1Text": [
+ 21,
+ 21969
+ ],
+ "Route3CooltrainerF2Text": [
+ 21,
+ 22019
+ ],
+ "Route3CooltrainerF3Text": [
+ 21,
+ 22094
+ ],
+ "Route3SignText": [
+ 21,
+ 22119
+ ],
+ "Route3SuperNerdText": [
+ 21,
+ 21914
+ ],
+ "Route3Youngster1Text": [
+ 21,
+ 21919
+ ],
+ "Route3Youngster2Text": [
+ 21,
+ 21944
+ ],
+ "Route3Youngster3Text": [
+ 21,
+ 21994
+ ],
+ "Route3Youngster4Text": [
+ 21,
+ 22044
+ ],
+ "Route3Youngster5Text": [
+ 21,
+ 22069
+ ],
+ "Route3_h": [
+ 21,
+ 16878
+ ],
+ "Route4CooltrainerF1Text": [
+ 21,
+ 22174
+ ],
+ "Route4CooltrainerF2Text": [
+ 21,
+ 22179
+ ],
+ "Route4MtMoonSignText": [
+ 21,
+ 22204
+ ],
+ "Route4SignText": [
+ 21,
+ 22209
+ ],
+ "Route4_h": [
+ 21,
+ 17304
+ ],
+ "Route5Gate_h": [
+ 7,
+ 22577
+ ],
+ "Route5UndergroundPathSignText": [
+ 21,
+ 22219
+ ],
+ "Route5_h": [
+ 21,
+ 17801
+ ],
+ "Route6CooltrainerF1Text": [
+ 22,
+ 20432
+ ],
+ "Route6CooltrainerF2Text": [
+ 22,
+ 20507
+ ],
+ "Route6CooltrainerM1Text": [
+ 22,
+ 20407
+ ],
+ "Route6CooltrainerM2Text": [
+ 22,
+ 20482
+ ],
+ "Route6Gate_h": [
+ 7,
+ 22843
+ ],
+ "Route6UndergroundPathSignText": [
+ 22,
+ 20557
+ ],
+ "Route6Youngster1Text": [
+ 22,
+ 20457
+ ],
+ "Route6Youngster2Text": [
+ 22,
+ 20532
+ ],
+ "Route6_h": [
+ 22,
+ 16384
+ ],
+ "Route7Gate_h": [
+ 7,
+ 23038
+ ],
+ "Route7UndergroundPathSignText": [
+ 18,
+ 16625
+ ],
+ "Route7_h": [
+ 18,
+ 16384
+ ],
+ "Route8CooltrainerF1Text": [
+ 22,
+ 20791
+ ],
+ "Route8CooltrainerF2Text": [
+ 22,
+ 20841
+ ],
+ "Route8CooltrainerF3Text": [
+ 22,
+ 20866
+ ],
+ "Route8CooltrainerF4Text": [
+ 22,
+ 20916
+ ],
+ "Route8Gambler1Text": [
+ 22,
+ 20741
+ ],
+ "Route8Gambler2Text": [
+ 22,
+ 20891
+ ],
+ "Route8Gate_h": [
+ 7,
+ 23237
+ ],
+ "Route8SuperNerd1Text": [
+ 22,
+ 20716
+ ],
+ "Route8SuperNerd2Text": [
+ 22,
+ 20766
+ ],
+ "Route8SuperNerd3Text": [
+ 22,
+ 20816
+ ],
+ "Route8UndergroundSignText": [
+ 22,
+ 20941
+ ],
+ "Route8_h": [
+ 22,
+ 16685
+ ],
+ "Route9AJText": [
+ 21,
+ 22386
+ ],
+ "Route9CooltrainerF1Text": [
+ 21,
+ 22380
+ ],
+ "Route9CooltrainerF2Text": [
+ 21,
+ 22398
+ ],
+ "Route9CooltrainerM2Text": [
+ 21,
+ 22392
+ ],
+ "Route9Hiker1Text": [
+ 21,
+ 22404
+ ],
+ "Route9Hiker2Text": [
+ 21,
+ 22410
+ ],
+ "Route9Hiker3Text": [
+ 21,
+ 22422
+ ],
+ "Route9SignText": [
+ 21,
+ 22573
+ ],
+ "Route9Youngster1Text": [
+ 21,
+ 22416
+ ],
+ "Route9Youngster2Text": [
+ 21,
+ 22428
+ ],
+ "Route9_h": [
+ 21,
+ 18062
+ ],
+ "SSAnne1FRoomsCooltrainerFText": [
+ 24,
+ 23069
+ ],
+ "SSAnne1FRoomsGentleman1Text": [
+ 24,
+ 23039
+ ],
+ "SSAnne1FRoomsGentleman2Text": [
+ 24,
+ 23049
+ ],
+ "SSAnne1FRoomsGentleman3Text": [
+ 24,
+ 23172
+ ],
+ "SSAnne1FRoomsGirl1Text": [
+ 24,
+ 23152
+ ],
+ "SSAnne1FRoomsGirl2Text": [
+ 24,
+ 23167
+ ],
+ "SSAnne1FRoomsLittleGirlText": [
+ 24,
+ 23162
+ ],
+ "SSAnne1FRoomsMiddleAgedManText": [
+ 24,
+ 23157
+ ],
+ "SSAnne1FRoomsWigglytuffText": [
+ 24,
+ 23079
+ ],
+ "SSAnne1FRoomsYoungsterText": [
+ 24,
+ 23059
+ ],
+ "SSAnne1FRooms_h": [
+ 24,
+ 22931
+ ],
+ "SSAnne1FSailorText": [
+ 24,
+ 21181
+ ],
+ "SSAnne1FWaiterText": [
+ 24,
+ 21176
+ ],
+ "SSAnne1F_h": [
+ 24,
+ 21156
+ ],
+ "SSAnne2FRivalCutMasterText": [
+ 24,
+ 21821
+ ],
+ "SSAnne2FRivalText": [
+ 24,
+ 21780
+ ],
+ "SSAnne2FRoomsBeautyText": [
+ 24,
+ 23644
+ ],
+ "SSAnne2FRoomsBrunetteGirlText": [
+ 24,
+ 23632
+ ],
+ "SSAnne2FRoomsCooltrainerFText": [
+ 24,
+ 23542
+ ],
+ "SSAnne2FRoomsFisherText": [
+ 24,
+ 23522
+ ],
+ "SSAnne2FRoomsGentleman1Text": [
+ 24,
+ 23512
+ ],
+ "SSAnne2FRoomsGentleman2Text": [
+ 24,
+ 23532
+ ],
+ "SSAnne2FRoomsGentleman3Text": [
+ 24,
+ 23552
+ ],
+ "SSAnne2FRoomsGentleman4Text": [
+ 24,
+ 23578
+ ],
+ "SSAnne2FRoomsGentleman5Text": [
+ 24,
+ 23608
+ ],
+ "SSAnne2FRoomsGrampsText": [
+ 24,
+ 23593
+ ],
+ "SSAnne2FRoomsLittleBoyText": [
+ 24,
+ 23620
+ ],
+ "SSAnne2FRooms_h": [
+ 24,
+ 23400
+ ],
+ "SSAnne2FWaiterText": [
+ 24,
+ 21775
+ ],
+ "SSAnne2F_h": [
+ 24,
+ 21470
+ ],
+ "SSAnne3FSailorText": [
+ 17,
+ 18896
+ ],
+ "SSAnne3F_h": [
+ 17,
+ 18879
+ ],
+ "SSAnneB1FRoomsFisherText": [
+ 24,
+ 24086
+ ],
+ "SSAnneB1FRoomsMachokeText": [
+ 24,
+ 24096
+ ],
+ "SSAnneB1FRoomsSailor1Text": [
+ 24,
+ 24036
+ ],
+ "SSAnneB1FRoomsSailor2Text": [
+ 24,
+ 24046
+ ],
+ "SSAnneB1FRoomsSailor3Text": [
+ 24,
+ 24056
+ ],
+ "SSAnneB1FRoomsSailor4Text": [
+ 24,
+ 24066
+ ],
+ "SSAnneB1FRoomsSailor5Text": [
+ 24,
+ 24076
+ ],
+ "SSAnneB1FRoomsSuperNerdText": [
+ 24,
+ 24199
+ ],
+ "SSAnneB1FRooms_h": [
+ 24,
+ 23904
+ ],
+ "SSAnneB1F_h": [
+ 24,
+ 22096
+ ],
+ "SSAnneBowCooltrainerMText": [
+ 24,
+ 22306
+ ],
+ "SSAnneBowSailor1Text": [
+ 24,
+ 22301
+ ],
+ "SSAnneBowSailor2Text": [
+ 24,
+ 22311
+ ],
+ "SSAnneBowSailor3Text": [
+ 24,
+ 22336
+ ],
+ "SSAnneBowSuperNerdText": [
+ 24,
+ 22296
+ ],
+ "SSAnneBow_h": [
+ 24,
+ 22224
+ ],
+ "SSAnneCaptainsRoomCaptainText": [
+ 24,
+ 22747
+ ],
+ "SSAnneCaptainsRoomSeasickBookText": [
+ 24,
+ 22890
+ ],
+ "SSAnneCaptainsRoomTrashText": [
+ 24,
+ 22885
+ ],
+ "SSAnneCaptainsRoom_h": [
+ 24,
+ 22711
+ ],
+ "SSAnneKitchenCook1Text": [
+ 24,
+ 22515
+ ],
+ "SSAnneKitchenCook2Text": [
+ 24,
+ 22520
+ ],
+ "SSAnneKitchenCook3Text": [
+ 24,
+ 22525
+ ],
+ "SSAnneKitchenCook4Text": [
+ 24,
+ 22530
+ ],
+ "SSAnneKitchenCook5Text": [
+ 24,
+ 22535
+ ],
+ "SSAnneKitchenCook6Text": [
+ 24,
+ 22540
+ ],
+ "SSAnneKitchenCook7Text": [
+ 24,
+ 22545
+ ],
+ "SSAnneKitchen_h": [
+ 24,
+ 22485
+ ],
+ "SSAnneSmokePuffTile": [
+ 30,
+ 24970
+ ],
+ "SabrinaPic": [
+ 19,
+ 29245
+ ],
+ "SafariZoneCenterRestHouseGirlText": [
+ 17,
+ 24392
+ ],
+ "SafariZoneCenterRestHouseScientistText": [
+ 17,
+ 24397
+ ],
+ "SafariZoneCenterRestHouseSignText": [
+ 17,
+ 24079
+ ],
+ "SafariZoneCenterRestHouse_h": [
+ 17,
+ 24373
+ ],
+ "SafariZoneCenterTrainerTipsSignText": [
+ 17,
+ 24084
+ ],
+ "SafariZoneCenter_h": [
+ 17,
+ 24058
+ ],
+ "SafariZoneEastRestHouseRockerText": [
+ 17,
+ 24536
+ ],
+ "SafariZoneEastRestHouseScientistText": [
+ 17,
+ 24531
+ ],
+ "SafariZoneEastRestHouseSignText": [
+ 17,
+ 23248
+ ],
+ "SafariZoneEastRestHouseSilphWorkerMText": [
+ 17,
+ 24541
+ ],
+ "SafariZoneEastRestHouse_h": [
+ 17,
+ 24509
+ ],
+ "SafariZoneEastSignText": [
+ 17,
+ 23258
+ ],
+ "SafariZoneEastTrainerTipsText": [
+ 17,
+ 23253
+ ],
+ "SafariZoneEast_h": [
+ 17,
+ 23219
+ ],
+ "SafariZoneGateSafariZoneWorker1GoodHaulComeAgainText": [
+ 29,
+ 19400
+ ],
+ "SafariZoneGateSafariZoneWorker1LeavingEarlyText": [
+ 29,
+ 19314
+ ],
+ "SafariZoneGateSafariZoneWorker1Text": [
+ 29,
+ 19297
+ ],
+ "SafariZoneGateSafariZoneWorker1WouldYouLikeToJoinText": [
+ 29,
+ 19302
+ ],
+ "SafariZoneGateSafariZoneWorker2Text": [
+ 29,
+ 19405
+ ],
+ "SafariZoneGate_h": [
+ 29,
+ 18970
+ ],
+ "SafariZoneNorthRestHouseGentlemanText": [
+ 17,
+ 24616
+ ],
+ "SafariZoneNorthRestHouseSafariZoneWorkerText": [
+ 17,
+ 24611
+ ],
+ "SafariZoneNorthRestHouseScientistText": [
+ 17,
+ 24606
+ ],
+ "SafariZoneNorthRestHouseSignText": [
+ 17,
+ 23568
+ ],
+ "SafariZoneNorthRestHouse_h": [
+ 17,
+ 24584
+ ],
+ "SafariZoneNorthSignText": [
+ 17,
+ 23578
+ ],
+ "SafariZoneNorthTrainerTips1Text": [
+ 17,
+ 23573
+ ],
+ "SafariZoneNorthTrainerTips2Text": [
+ 17,
+ 23583
+ ],
+ "SafariZoneNorthTrainerTips3Text": [
+ 17,
+ 23588
+ ],
+ "SafariZoneNorth_h": [
+ 17,
+ 23539
+ ],
+ "SafariZoneSecretHouseFishingGuruText": [
+ 18,
+ 25805
+ ],
+ "SafariZoneSecretHouse_h": [
+ 18,
+ 25788
+ ],
+ "SafariZoneWestFindWardensTeethSignText": [
+ 18,
+ 25470
+ ],
+ "SafariZoneWestRestHouseCooltrainerMText": [
+ 17,
+ 24461
+ ],
+ "SafariZoneWestRestHouseScientistText": [
+ 17,
+ 24456
+ ],
+ "SafariZoneWestRestHouseSignText": [
+ 18,
+ 25465
+ ],
+ "SafariZoneWestRestHouseSilphWorkerFText": [
+ 17,
+ 24466
+ ],
+ "SafariZoneWestRestHouse_h": [
+ 17,
+ 24434
+ ],
+ "SafariZoneWestSignText": [
+ 18,
+ 25480
+ ],
+ "SafariZoneWestTrainerTipsText": [
+ 18,
+ 25475
+ ],
+ "SafariZoneWest_h": [
+ 18,
+ 25434
+ ],
+ "SaffronCityFightingDojoSignText": [
+ 20,
+ 19590
+ ],
+ "SaffronCityGentlemanText": [
+ 20,
+ 19559
+ ],
+ "SaffronCityGymSignText": [
+ 20,
+ 19595
+ ],
+ "SaffronCityMrPsychicsHouseSignText": [
+ 20,
+ 19615
+ ],
+ "SaffronCityPidgeotText": [
+ 20,
+ 19564
+ ],
+ "SaffronCityRockerText": [
+ 20,
+ 19570
+ ],
+ "SaffronCityRocket1Text": [
+ 20,
+ 19509
+ ],
+ "SaffronCityRocket2Text": [
+ 20,
+ 19514
+ ],
+ "SaffronCityRocket3Text": [
+ 20,
+ 19519
+ ],
+ "SaffronCityRocket4Text": [
+ 20,
+ 19524
+ ],
+ "SaffronCityRocket5Text": [
+ 20,
+ 19529
+ ],
+ "SaffronCityRocket6Text": [
+ 20,
+ 19534
+ ],
+ "SaffronCityRocket7Text": [
+ 20,
+ 19539
+ ],
+ "SaffronCityRocket8Text": [
+ 20,
+ 19575
+ ],
+ "SaffronCityRocket9Text": [
+ 20,
+ 19580
+ ],
+ "SaffronCityScientistText": [
+ 20,
+ 19544
+ ],
+ "SaffronCitySignText": [
+ 20,
+ 19585
+ ],
+ "SaffronCitySilphCoLatestProductSignText": [
+ 20,
+ 19620
+ ],
+ "SaffronCitySilphCoSignText": [
+ 20,
+ 19610
+ ],
+ "SaffronCitySilphWorkerFText": [
+ 20,
+ 19554
+ ],
+ "SaffronCitySilphWorkerMText": [
+ 20,
+ 19549
+ ],
+ "SaffronCityTrainerTips1Text": [
+ 20,
+ 19600
+ ],
+ "SaffronCityTrainerTips2Text": [
+ 20,
+ 19605
+ ],
+ "SaffronCity_h": [
+ 20,
+ 18858
+ ],
+ "SaffronGateGuardGeeImThirstyText": [
+ 7,
+ 22769
+ ],
+ "SaffronGateGuardGiveDrinkText": [
+ 7,
+ 22774
+ ],
+ "SaffronGateGuardText": [
+ 7,
+ 22708
+ ],
+ "SaffronGymChanneler1Text": [
+ 23,
+ 20605
+ ],
+ "SaffronGymChanneler2Text": [
+ 23,
+ 20625
+ ],
+ "SaffronGymChanneler3Text": [
+ 23,
+ 20645
+ ],
+ "SaffronGymGymGuideText": [
+ 23,
+ 20675
+ ],
+ "SaffronGymSabrinaMarshBadgeInfoText": [
+ 23,
+ 20585
+ ],
+ "SaffronGymSabrinaReceivedTM46Text": [
+ 23,
+ 20590
+ ],
+ "SaffronGymSabrinaTM46NoRoomText": [
+ 23,
+ 20600
+ ],
+ "SaffronGymSabrinaText": [
+ 23,
+ 20494
+ ],
+ "SaffronGymYoungster1Text": [
+ 23,
+ 20615
+ ],
+ "SaffronGymYoungster2Text": [
+ 23,
+ 20635
+ ],
+ "SaffronGymYoungster3Text": [
+ 23,
+ 20655
+ ],
+ "SaffronGymYoungster4Text": [
+ 23,
+ 20665
+ ],
+ "SaffronGym_h": [
+ 23,
+ 20215
+ ],
+ "SaffronMartClerkText": [
+ 0,
+ 9150
+ ],
+ "SaffronMartCooltrainerFText": [
+ 23,
+ 21261
+ ],
+ "SaffronMartSuperNerdText": [
+ 23,
+ 21256
+ ],
+ "SaffronMart_h": [
+ 23,
+ 21235
+ ],
+ "SaffronPidgeyHouseBrunetteGirlText": [
+ 7,
+ 22258
+ ],
+ "SaffronPidgeyHousePaperText": [
+ 7,
+ 22281
+ ],
+ "SaffronPidgeyHousePidgeyText": [
+ 7,
+ 22263
+ ],
+ "SaffronPidgeyHouseYoungsterText": [
+ 7,
+ 22276
+ ],
+ "SaffronPidgeyHouse_h": [
+ 7,
+ 22235
+ ],
+ "SaffronPokecenterBeautyText": [
+ 23,
+ 21564
+ ],
+ "SaffronPokecenterChanseyText": [
+ 23,
+ 21575
+ ],
+ "SaffronPokecenterGentlemanText": [
+ 23,
+ 21569
+ ],
+ "SaffronPokecenterLinkReceptionistText": [
+ 23,
+ 21574
+ ],
+ "SaffronPokecenterNurseText": [
+ 23,
+ 21563
+ ],
+ "SaffronPokecenter_h": [
+ 23,
+ 21535
+ ],
+ "SailorPic": [
+ 19,
+ 17115
+ ],
+ "SandshrewPicBack": [
+ 11,
+ 23594
+ ],
+ "SandshrewPicFront": [
+ 11,
+ 23301
+ ],
+ "SandslashPicBack": [
+ 11,
+ 24141
+ ],
+ "SandslashPicFront": [
+ 11,
+ 23726
+ ],
+ "ScientistPic": [
+ 19,
+ 25176
+ ],
+ "ScytherPicBack": [
+ 9,
+ 29717
+ ],
+ "ScytherPicFront": [
+ 9,
+ 29195
+ ],
+ "SeadraPicBack": [
+ 11,
+ 23143
+ ],
+ "SeadraPicFront": [
+ 11,
+ 22761
+ ],
+ "SeafoamIslands1F_h": [
+ 17,
+ 18558
+ ],
+ "SeafoamIslandsB1F_h": [
+ 17,
+ 25976
+ ],
+ "SeafoamIslandsB2F_h": [
+ 17,
+ 26292
+ ],
+ "SeafoamIslandsB3F_h": [
+ 17,
+ 26608
+ ],
+ "SeafoamIslandsB4FArticunoText": [
+ 17,
+ 27397
+ ],
+ "SeafoamIslandsB4FBouldersSignText": [
+ 17,
+ 27428
+ ],
+ "SeafoamIslandsB4FDangerSignText": [
+ 17,
+ 27433
+ ],
+ "SeafoamIslandsB4F_h": [
+ 17,
+ 27132
+ ],
+ "SeakingPicBack": [
+ 13,
+ 19054
+ ],
+ "SeakingPicFront": [
+ 13,
+ 18541
+ ],
+ "SeelPicBack": [
+ 10,
+ 27633
+ ],
+ "SeelPicFront": [
+ 10,
+ 27298
+ ],
+ "ShellderPicBack": [
+ 9,
+ 28385
+ ],
+ "ShellderPicFront": [
+ 9,
+ 28179
+ ],
+ "ShockEmote": [
+ 16,
+ 20965
+ ],
+ "ShrinkPic1": [
+ 4,
+ 23446
+ ],
+ "ShrinkPic2": [
+ 4,
+ 23536
+ ],
+ "SilphCo10FRocketText": [
+ 22,
+ 24902
+ ],
+ "SilphCo10FScientistText": [
+ 22,
+ 24912
+ ],
+ "SilphCo10FSilphWorkerFText": [
+ 22,
+ 24922
+ ],
+ "SilphCo10F_h": [
+ 22,
+ 24776
+ ],
+ "SilphCo11FBeautyText": [
+ 24,
+ 25886
+ ],
+ "SilphCo11FGiovanniText": [
+ 24,
+ 25891
+ ],
+ "SilphCo11FGiovanniYouRuinedOurPlansText": [
+ 24,
+ 25901
+ ],
+ "SilphCo11FJessieJamesText": [
+ 24,
+ 25751
+ ],
+ "SilphCo11FRocketText": [
+ 24,
+ 25906
+ ],
+ "SilphCo11FSilphPresidentText": [
+ 24,
+ 25812
+ ],
+ "SilphCo11FText10": [
+ 24,
+ 25799
+ ],
+ "SilphCo11FText9": [
+ 24,
+ 25789
+ ],
+ "SilphCo11F_h": [
+ 24,
+ 24837
+ ],
+ "SilphCo1FLinkReceptionistText": [
+ 23,
+ 21345
+ ],
+ "SilphCo1F_h": [
+ 23,
+ 21304
+ ],
+ "SilphCo2FRocket1Text": [
+ 22,
+ 23985
+ ],
+ "SilphCo2FRocket2Text": [
+ 22,
+ 23995
+ ],
+ "SilphCo2FScientist1Text": [
+ 22,
+ 23965
+ ],
+ "SilphCo2FScientist2Text": [
+ 22,
+ 23975
+ ],
+ "SilphCo2FSilphWorkerFPleaseTakeThisText": [
+ 38,
+ 25914
+ ],
+ "SilphCo2FSilphWorkerFText": [
+ 22,
+ 23900
+ ],
+ "SilphCo2F_h": [
+ 22,
+ 23680
+ ],
+ "SilphCo3FRocketText": [
+ 22,
+ 24478
+ ],
+ "SilphCo3FScientistText": [
+ 22,
+ 24503
+ ],
+ "SilphCo3FSilphWorkerMText": [
+ 22,
+ 24448
+ ],
+ "SilphCo3F_h": [
+ 22,
+ 24298
+ ],
+ "SilphCo4FRocket1Text": [
+ 6,
+ 24308
+ ],
+ "SilphCo4FRocket2Text": [
+ 6,
+ 24358
+ ],
+ "SilphCo4FScientistText": [
+ 6,
+ 24333
+ ],
+ "SilphCo4FSilphWorkerMText": [
+ 6,
+ 24285
+ ],
+ "SilphCo4F_h": [
+ 6,
+ 24073
+ ],
+ "SilphCo5FPokemonReport1Text": [
+ 6,
+ 24968
+ ],
+ "SilphCo5FPokemonReport2Text": [
+ 6,
+ 24973
+ ],
+ "SilphCo5FPokemonReport3Text": [
+ 6,
+ 24978
+ ],
+ "SilphCo5FRockerText": [
+ 6,
+ 24918
+ ],
+ "SilphCo5FRocket1Text": [
+ 6,
+ 24868
+ ],
+ "SilphCo5FRocket2Text": [
+ 6,
+ 24943
+ ],
+ "SilphCo5FScientistText": [
+ 6,
+ 24893
+ ],
+ "SilphCo5FSilphWorkerMText": [
+ 6,
+ 24845
+ ],
+ "SilphCo5F_h": [
+ 6,
+ 24629
+ ],
+ "SilphCo6FRocket1Text": [
+ 6,
+ 25530
+ ],
+ "SilphCo6FRocket2Text": [
+ 6,
+ 25580
+ ],
+ "SilphCo6FScientistText": [
+ 6,
+ 25555
+ ],
+ "SilphCo6FSilphWorkerF1Text": [
+ 6,
+ 25461
+ ],
+ "SilphCo6FSilphWorkerF2Text": [
+ 6,
+ 25484
+ ],
+ "SilphCo6FSilphWorkerM1Text": [
+ 6,
+ 25415
+ ],
+ "SilphCo6FSilphWorkerM2Text": [
+ 6,
+ 25438
+ ],
+ "SilphCo6FSilphWorkerM3Text": [
+ 6,
+ 25507
+ ],
+ "SilphCo6F_h": [
+ 6,
+ 25255
+ ],
+ "SilphCo7FRivalDefeatedText": [
+ 20,
+ 24305
+ ],
+ "SilphCo7FRivalGoodLuckToYouText": [
+ 20,
+ 24315
+ ],
+ "SilphCo7FRivalText": [
+ 20,
+ 24285
+ ],
+ "SilphCo7FRivalWaitedHereText": [
+ 20,
+ 24300
+ ],
+ "SilphCo7FRocket1Text": [
+ 20,
+ 24185
+ ],
+ "SilphCo7FRocket2Text": [
+ 20,
+ 24235
+ ],
+ "SilphCo7FRocket3Text": [
+ 20,
+ 24260
+ ],
+ "SilphCo7FScientistText": [
+ 20,
+ 24210
+ ],
+ "SilphCo7FSilphWorkerM1Text": [
+ 20,
+ 23991
+ ],
+ "SilphCo7FSilphWorkerM2Text": [
+ 20,
+ 24080
+ ],
+ "SilphCo7FSilphWorkerM3Text": [
+ 20,
+ 24115
+ ],
+ "SilphCo7FSilphWorkerM4Text": [
+ 20,
+ 24150
+ ],
+ "SilphCo7F_h": [
+ 20,
+ 23447
+ ],
+ "SilphCo8FRocket1Text": [
+ 21,
+ 26106
+ ],
+ "SilphCo8FRocket2Text": [
+ 21,
+ 26126
+ ],
+ "SilphCo8FScientistText": [
+ 21,
+ 26116
+ ],
+ "SilphCo8FSilphWorkerMText": [
+ 21,
+ 26076
+ ],
+ "SilphCo8F_h": [
+ 21,
+ 25898
+ ],
+ "SilphCo9FNurseText": [
+ 23,
+ 22467
+ ],
+ "SilphCo9FNurseYouLookTiredText": [
+ 38,
+ 30622
+ ],
+ "SilphCo9FRocket1Text": [
+ 23,
+ 22527
+ ],
+ "SilphCo9FRocket2Text": [
+ 23,
+ 22547
+ ],
+ "SilphCo9FScientistText": [
+ 23,
+ 22537
+ ],
+ "SilphCo9F_h": [
+ 23,
+ 22202
+ ],
+ "SilphCoElevatorElevatorText": [
+ 17,
+ 23177
+ ],
+ "SilphCoElevator_h": [
+ 17,
+ 23048
+ ],
+ "SkullEmote": [
+ 16,
+ 21157
+ ],
+ "SlotMachineTiles1": [
+ 13,
+ 31873
+ ],
+ "SlotMachineTiles2": [
+ 30,
+ 19479
+ ],
+ "SlowbroPicBack": [
+ 9,
+ 20293
+ ],
+ "SlowbroPicFront": [
+ 9,
+ 19784
+ ],
+ "SlowpokePicBack": [
+ 10,
+ 18414
+ ],
+ "SlowpokePicFront": [
+ 10,
+ 18219
+ ],
+ "SnakeIconFrame1": [
+ 28,
+ 23174
+ ],
+ "SnakeIconFrame2": [
+ 28,
+ 23238
+ ],
+ "SnorlaxPicBack": [
+ 12,
+ 23866
+ ],
+ "SnorlaxPicFront": [
+ 12,
+ 23470
+ ],
+ "SpearowPicBack": [
+ 9,
+ 18704
+ ],
+ "SpearowPicFront": [
+ 9,
+ 18497
+ ],
+ "SpinnerArrowAnimTiles": [
+ 17,
+ 20775
+ ],
+ "SpriteSheetPointerTable": [
+ 5,
+ 17065
+ ],
+ "SquirtlePicBack": [
+ 13,
+ 24651
+ ],
+ "SquirtlePicFront": [
+ 13,
+ 24408
+ ],
+ "StarmiePicBack": [
+ 12,
+ 31991
+ ],
+ "StarmiePicFront": [
+ 12,
+ 31604
+ ],
+ "StaryuPicBack": [
+ 9,
+ 30127
+ ],
+ "StaryuPicFront": [
+ 9,
+ 29881
+ ],
+ "SubanimationPointers": [
+ 30,
+ 26901
+ ],
+ "SummerBeachHousePikachuText": [
+ 60,
+ 25224
+ ],
+ "SummerBeachHousePoster1Text": [
+ 60,
+ 25247
+ ],
+ "SummerBeachHousePoster2Text": [
+ 60,
+ 25277
+ ],
+ "SummerBeachHousePoster3Text": [
+ 60,
+ 25307
+ ],
+ "SummerBeachHousePrinterText": [
+ 60,
+ 25337
+ ],
+ "SummerBeachHouseSurfinDudeText": [
+ 60,
+ 25130
+ ],
+ "SummerBeachHouse_h": [
+ 60,
+ 25102
+ ],
+ "SuperNerdPic": [
+ 19,
+ 18417
+ ],
+ "SuperPalettes": [
+ 28,
+ 27065
+ ],
+ "SurfingPikachu1Graphics1": [
+ 32,
+ 20244
+ ],
+ "SurfingPikachu1Graphics2": [
+ 32,
+ 21284
+ ],
+ "SurfingPikachu1Graphics3": [
+ 32,
+ 25380
+ ],
+ "SwimmerPic": [
+ 19,
+ 20787
+ ],
+ "TamerPic": [
+ 19,
+ 23374
+ ],
+ "TangelaPicBack": [
+ 9,
+ 31900
+ ],
+ "TangelaPicFront": [
+ 9,
+ 31550
+ ],
+ "TaurosPicBack": [
+ 10,
+ 28420
+ ],
+ "TaurosPicFront": [
+ 10,
+ 27976
+ ],
+ "TeachingHMsText": [
+ 43,
+ 24088
+ ],
+ "TechnicalMachinePrices": [
+ 61,
+ 26101
+ ],
+ "TentacoolPicBack": [
+ 9,
+ 28761
+ ],
+ "TentacoolPicFront": [
+ 9,
+ 28488
+ ],
+ "TentacruelPicBack": [
+ 13,
+ 17913
+ ],
+ "TentacruelPicFront": [
+ 13,
+ 17471
+ ],
+ "TextBoxGraphics": [
+ 4,
+ 19992
+ ],
+ "TheEndGfx": [
+ 60,
+ 22555
+ ],
+ "Tilesets": [
+ 3,
+ 17752
+ ],
+ "TitlePikachuBGGraphics": [
+ 61,
+ 20059
+ ],
+ "TitlePikachuOBGraphics": [
+ 61,
+ 21083
+ ],
+ "TitleScreenPikaBubbleTilemap": [
+ 61,
+ 18035
+ ],
+ "TitleScreenPikachuTilemap": [
+ 61,
+ 18063
+ ],
+ "TitleScreenPokemonLogoTilemap": [
+ 61,
+ 17913
+ ],
+ "TownMapCursor": [
+ 28,
+ 20420
+ ],
+ "TradeCenterOpponentText": [
+ 19,
+ 32451
+ ],
+ "TradeCenter_h": [
+ 19,
+ 32377
+ ],
+ "TrainerAI": [
+ 14,
+ 26034
+ ],
+ "TrainerClassMoveChoiceModifications": [
+ 14,
+ 22558
+ ],
+ "TrainerDataPointers": [
+ 14,
+ 24017
+ ],
+ "TrainerInfoTextBoxTileGraphics": [
+ 61,
+ 23588
+ ],
+ "TrainerNames": [
+ 14,
+ 22910
+ ],
+ "TrainerPicAndMoneyPointers": [
+ 14,
+ 22675
+ ],
+ "TypeEffects": [
+ 15,
+ 26106
+ ],
+ "TypeNames.Bird": [
+ 9,
+ 32233
+ ],
+ "TypeNames.Bug": [
+ 9,
+ 32238
+ ],
+ "TypeNames.Dragon": [
+ 9,
+ 32248
+ ],
+ "TypeNames.Electric": [
+ 9,
+ 32200
+ ],
+ "TypeNames.Fighting": [
+ 9,
+ 32160
+ ],
+ "TypeNames.Fire": [
+ 9,
+ 32183
+ ],
+ "TypeNames.Flying": [
+ 9,
+ 32169
+ ],
+ "TypeNames.Ghost": [
+ 9,
+ 32242
+ ],
+ "TypeNames.Grass": [
+ 9,
+ 32194
+ ],
+ "TypeNames.Ground": [
+ 9,
+ 32221
+ ],
+ "TypeNames.Ice": [
+ 9,
+ 32217
+ ],
+ "TypeNames.Normal": [
+ 9,
+ 32153
+ ],
+ "TypeNames.Poison": [
+ 9,
+ 32176
+ ],
+ "TypeNames.Psychic": [
+ 9,
+ 32209
+ ],
+ "TypeNames.Rock": [
+ 9,
+ 32228
+ ],
+ "TypeNames.Water": [
+ 9,
+ 32188
+ ],
+ "UndergroundPathNorthSouth_h": [
+ 24,
+ 24369
+ ],
+ "UndergroundPathRoute5LittleGirlText": [
+ 23,
+ 21949
+ ],
+ "UndergroundPathRoute5_h": [
+ 23,
+ 21928
+ ],
+ "UndergroundPathRoute6GirlText": [
+ 23,
+ 22020
+ ],
+ "UndergroundPathRoute6_h": [
+ 23,
+ 21998
+ ],
+ "UndergroundPathRoute7CopyUnusedGirlText": [
+ 23,
+ 22142
+ ],
+ "UndergroundPathRoute7CopyUnusedMiddleAgedManText": [
+ 23,
+ 22152
+ ],
+ "UndergroundPathRoute7MiddleAgedManText": [
+ 23,
+ 22081
+ ],
+ "UndergroundPathRoute7_h": [
+ 23,
+ 22059
+ ],
+ "UndergroundPathRoute8GirlText": [
+ 7,
+ 23453
+ ],
+ "UndergroundPathRoute8_h": [
+ 7,
+ 23431
+ ],
+ "UndergroundPathWestEast_h": [
+ 24,
+ 24405
+ ],
+ "VaporeonPicBack": [
+ 11,
+ 27876
+ ],
+ "VaporeonPicFront": [
+ 11,
+ 27464
+ ],
+ "VenomothPicBack": [
+ 12,
+ 18575
+ ],
+ "VenomothPicFront": [
+ 12,
+ 18089
+ ],
+ "VenonatPicBack": [
+ 10,
+ 29370
+ ],
+ "VenonatPicFront": [
+ 10,
+ 29121
+ ],
+ "VenusaurPicBack": [
+ 13,
+ 17281
+ ],
+ "VenusaurPicFront": [
+ 13,
+ 16737
+ ],
+ "VermilionCityBeautyText": [
+ 6,
+ 22855
+ ],
+ "VermilionCityGambler1Text": [
+ 6,
+ 22860
+ ],
+ "VermilionCityGambler2Text": [
+ 6,
+ 23003
+ ],
+ "VermilionCityGymSignText": [
+ 6,
+ 23071
+ ],
+ "VermilionCityHarborSignText": [
+ 6,
+ 23083
+ ],
+ "VermilionCityMachopText": [
+ 6,
+ 23008
+ ],
+ "VermilionCityNoticeSignText": [
+ 6,
+ 23047
+ ],
+ "VermilionCityOfficerJennyText": [
+ 6,
+ 23095
+ ],
+ "VermilionCityPokemonFanClubSignText": [
+ 6,
+ 23059
+ ],
+ "VermilionCitySailor1Text": [
+ 6,
+ 22895
+ ],
+ "VermilionCitySailor2Text": [
+ 6,
+ 23030
+ ],
+ "VermilionCitySignText": [
+ 6,
+ 23035
+ ],
+ "VermilionCity_h": [
+ 6,
+ 18846
+ ],
+ "VermilionDockUnusedText": [
+ 7,
+ 21961
+ ],
+ "VermilionDock_h": [
+ 7,
+ 21582
+ ],
+ "VermilionGymGentlemanText": [
+ 23,
+ 19078
+ ],
+ "VermilionGymGymGuideText": [
+ 23,
+ 19153
+ ],
+ "VermilionGymLTSurgeReceivedTM24Text": [
+ 23,
+ 19058
+ ],
+ "VermilionGymLTSurgeTM24NoRoomText": [
+ 23,
+ 19068
+ ],
+ "VermilionGymLTSurgeText": [
+ 23,
+ 18963
+ ],
+ "VermilionGymLTSurgeThunderBadgeInfoText": [
+ 23,
+ 19053
+ ],
+ "VermilionGymSailorText": [
+ 23,
+ 19128
+ ],
+ "VermilionGymSuperNerdText": [
+ 23,
+ 19103
+ ],
+ "VermilionGym_h": [
+ 23,
+ 18704
+ ],
+ "VermilionMartClerkText": [
+ 0,
+ 9052
+ ],
+ "VermilionMartCooltrainerFText": [
+ 23,
+ 18661
+ ],
+ "VermilionMartCooltrainerMText": [
+ 23,
+ 18656
+ ],
+ "VermilionMart_h": [
+ 23,
+ 18635
+ ],
+ "VermilionOldRodHouseFishingGuruText": [
+ 21,
+ 24677
+ ],
+ "VermilionOldRodHouse_h": [
+ 21,
+ 24660
+ ],
+ "VermilionPidgeyHouseLetterText": [
+ 7,
+ 21539
+ ],
+ "VermilionPidgeyHousePidgeyText": [
+ 7,
+ 21523
+ ],
+ "VermilionPidgeyHouseYoungsterText": [
+ 7,
+ 21518
+ ],
+ "VermilionPidgeyHouse_h": [
+ 7,
+ 21496
+ ],
+ "VermilionPokecenterChanseyText": [
+ 23,
+ 18573
+ ],
+ "VermilionPokecenterFishingGuruText": [
+ 23,
+ 18562
+ ],
+ "VermilionPokecenterLinkReceptionistText": [
+ 23,
+ 18572
+ ],
+ "VermilionPokecenterNurseText": [
+ 23,
+ 18561
+ ],
+ "VermilionPokecenterSailorText": [
+ 23,
+ 18567
+ ],
+ "VermilionPokecenter_h": [
+ 23,
+ 18533
+ ],
+ "VermilionTradeHouseGentlemanText": [
+ 6,
+ 23830
+ ],
+ "VermilionTradeHouse_h": [
+ 6,
+ 23813
+ ],
+ "Version_GFX": [
+ 26,
+ 16384
+ ],
+ "VictoryRoad1FCooltrainerFText": [
+ 23,
+ 22936
+ ],
+ "VictoryRoad1FCooltrainerMText": [
+ 23,
+ 22946
+ ],
+ "VictoryRoad1F_h": [
+ 23,
+ 22793
+ ],
+ "VictoryRoad2FCooltrainerMText": [
+ 20,
+ 22740
+ ],
+ "VictoryRoad2FHikerText": [
+ 20,
+ 22720
+ ],
+ "VictoryRoad2FMoltresText": [
+ 20,
+ 22770
+ ],
+ "VictoryRoad2FSuperNerd1Text": [
+ 20,
+ 22730
+ ],
+ "VictoryRoad2FSuperNerd2Text": [
+ 20,
+ 22750
+ ],
+ "VictoryRoad2FSuperNerd3Text": [
+ 20,
+ 22760
+ ],
+ "VictoryRoad2F_h": [
+ 20,
+ 22476
+ ],
+ "VictoryRoad3FCooltrainerF1Text": [
+ 17,
+ 19219
+ ],
+ "VictoryRoad3FCooltrainerF2Text": [
+ 17,
+ 19239
+ ],
+ "VictoryRoad3FCooltrainerM1Text": [
+ 17,
+ 19209
+ ],
+ "VictoryRoad3FCooltrainerM2Text": [
+ 17,
+ 19229
+ ],
+ "VictoryRoad3F_h": [
+ 17,
+ 18957
+ ],
+ "VictreebelPicBack": [
+ 13,
+ 29708
+ ],
+ "VictreebelPicFront": [
+ 13,
+ 29237
+ ],
+ "VileplumePicBack": [
+ 13,
+ 28384
+ ],
+ "VileplumePicFront": [
+ 13,
+ 28089
+ ],
+ "ViridianCityFisherText": [
+ 6,
+ 21103
+ ],
+ "ViridianCityGambler1Text": [
+ 6,
+ 21055
+ ],
+ "ViridianCityGirlText": [
+ 6,
+ 21079
+ ],
+ "ViridianCityGymLockedText": [
+ 6,
+ 21225
+ ],
+ "ViridianCityGymSignText": [
+ 6,
+ 21213
+ ],
+ "ViridianCityOldMan2Text": [
+ 6,
+ 21132
+ ],
+ "ViridianCityOldManSleepyText": [
+ 6,
+ 21091
+ ],
+ "ViridianCityOldManText": [
+ 6,
+ 21115
+ ],
+ "ViridianCityOldManYouNeedToWeakenTheTargetText": [
+ 6,
+ 21127
+ ],
+ "ViridianCitySignText": [
+ 6,
+ 21177
+ ],
+ "ViridianCityTrainerTips1Text": [
+ 6,
+ 21189
+ ],
+ "ViridianCityTrainerTips2Text": [
+ 6,
+ 21201
+ ],
+ "ViridianCityYoungster1Text": [
+ 6,
+ 21043
+ ],
+ "ViridianCityYoungster2Text": [
+ 6,
+ 21067
+ ],
+ "ViridianCity_h": [
+ 6,
+ 17239
+ ],
+ "ViridianForestCooltrainerFText": [
+ 24,
+ 20870
+ ],
+ "ViridianForestLeavingSignText": [
+ 24,
+ 21001
+ ],
+ "ViridianForestNorthGateGrampsText": [
+ 23,
+ 21661
+ ],
+ "ViridianForestNorthGateSuperNerdText": [
+ 23,
+ 21656
+ ],
+ "ViridianForestNorthGate_h": [
+ 23,
+ 21637
+ ],
+ "ViridianForestSouthGateGirlText": [
+ 23,
+ 21870
+ ],
+ "ViridianForestSouthGateLittleGirlText": [
+ 23,
+ 21875
+ ],
+ "ViridianForestSouthGate_h": [
+ 23,
+ 21850
+ ],
+ "ViridianForestTrainerTips1Text": [
+ 24,
+ 20966
+ ],
+ "ViridianForestTrainerTips2Text": [
+ 24,
+ 20980
+ ],
+ "ViridianForestTrainerTips3Text": [
+ 24,
+ 20987
+ ],
+ "ViridianForestTrainerTips4Text": [
+ 24,
+ 20994
+ ],
+ "ViridianForestUseAntidoteSignText": [
+ 24,
+ 20973
+ ],
+ "ViridianForestYoungster1Text": [
+ 24,
+ 20847
+ ],
+ "ViridianForestYoungster2Text": [
+ 24,
+ 20852
+ ],
+ "ViridianForestYoungster3Text": [
+ 24,
+ 20858
+ ],
+ "ViridianForestYoungster4Text": [
+ 24,
+ 20864
+ ],
+ "ViridianForestYoungster5Text": [
+ 24,
+ 20876
+ ],
+ "ViridianForestYoungster6Text": [
+ 24,
+ 20961
+ ],
+ "ViridianForest_h": [
+ 24,
+ 20717
+ ],
+ "ViridianGymCooltrainerM1Text": [
+ 29,
+ 17200
+ ],
+ "ViridianGymCooltrainerM2Text": [
+ 29,
+ 17300
+ ],
+ "ViridianGymCooltrainerM3Text": [
+ 29,
+ 17375
+ ],
+ "ViridianGymGiovanniEarthBadgeInfoText": [
+ 29,
+ 17180
+ ],
+ "ViridianGymGiovanniReceivedTM27Text": [
+ 29,
+ 17185
+ ],
+ "ViridianGymGiovanniTM27NoRoomText": [
+ 29,
+ 17195
+ ],
+ "ViridianGymGiovanniText": [
+ 29,
+ 17062
+ ],
+ "ViridianGymGymGuideText": [
+ 29,
+ 17400
+ ],
+ "ViridianGymHiker1Text": [
+ 29,
+ 17225
+ ],
+ "ViridianGymHiker2Text": [
+ 29,
+ 17275
+ ],
+ "ViridianGymHiker3Text": [
+ 29,
+ 17325
+ ],
+ "ViridianGymRocker1Text": [
+ 29,
+ 17250
+ ],
+ "ViridianGymRocker2Text": [
+ 29,
+ 17350
+ ],
+ "ViridianGym_h": [
+ 29,
+ 16596
+ ],
+ "ViridianMartClerkParcelQuestText": [
+ 7,
+ 19751
+ ],
+ "ViridianMartClerkText": [
+ 0,
+ 9019
+ ],
+ "ViridianMartClerkYouCameFromPalletTownText": [
+ 7,
+ 19746
+ ],
+ "ViridianMartCooltrainerMText": [
+ 7,
+ 19762
+ ],
+ "ViridianMartYoungsterText": [
+ 7,
+ 19757
+ ],
+ "ViridianMart_h": [
+ 7,
+ 19566
+ ],
+ "ViridianNicknameHouseBaldingGuyText": [
+ 7,
+ 19934
+ ],
+ "ViridianNicknameHouseLittleGirlText": [
+ 7,
+ 19939
+ ],
+ "ViridianNicknameHouseSpearowText": [
+ 7,
+ 19944
+ ],
+ "ViridianNicknameHouseSpearySignText": [
+ 7,
+ 19967
+ ],
+ "ViridianNicknameHouse_h": [
+ 7,
+ 19910
+ ],
+ "ViridianPokeCenterChanseyText": [
+ 17,
+ 17017
+ ],
+ "ViridianPokecenterCooltrainerMText": [
+ 17,
+ 17011
+ ],
+ "ViridianPokecenterGentlemanText": [
+ 17,
+ 17006
+ ],
+ "ViridianPokecenterLinkReceptionistText": [
+ 17,
+ 17016
+ ],
+ "ViridianPokecenterNurseText": [
+ 17,
+ 17005
+ ],
+ "ViridianPokecenter_h": [
+ 17,
+ 16977
+ ],
+ "ViridianSchoolHouseBrunetteGirlText": [
+ 7,
+ 19843
+ ],
+ "ViridianSchoolHouseCooltrainerFText": [
+ 7,
+ 19848
+ ],
+ "ViridianSchoolHouseLittleGirlText": [
+ 7,
+ 19860
+ ],
+ "ViridianSchoolHouse_h": [
+ 7,
+ 19821
+ ],
+ "VoltorbPicBack": [
+ 9,
+ 18960
+ ],
+ "VoltorbPicFront": [
+ 9,
+ 18783
+ ],
+ "VulpixPicBack": [
+ 11,
+ 19025
+ ],
+ "VulpixPicFront": [
+ 11,
+ 18673
+ ],
+ "WardensHouseDisplayText": [
+ 29,
+ 18876
+ ],
+ "WardensHouseWardenText": [
+ 29,
+ 18715
+ ],
+ "WardensHouse_h": [
+ 29,
+ 18690
+ ],
+ "WarpTileIDPointers": [
+ 3,
+ 16917
+ ],
+ "WartortlePicBack": [
+ 13,
+ 25620
+ ],
+ "WartortlePicFront": [
+ 13,
+ 25230
+ ],
+ "WeedlePicBack": [
+ 11,
+ 30644
+ ],
+ "WeedlePicFront": [
+ 11,
+ 30466
+ ],
+ "WeepinbellPicBack": [
+ 13,
+ 29114
+ ],
+ "WeepinbellPicFront": [
+ 13,
+ 28843
+ ],
+ "WeezingPicBack": [
+ 12,
+ 27584
+ ],
+ "WeezingPicFront": [
+ 12,
+ 27230
+ ],
+ "WigglytuffPicBack": [
+ 11,
+ 25852
+ ],
+ "WigglytuffPicFront": [
+ 11,
+ 25467
+ ],
+ "WildDataPointers": [
+ 3,
+ 19349
+ ],
+ "WorldMapTileGraphics": [
+ 4,
+ 20792
+ ],
+ "YellowIntroCloudGFX": [
+ 62,
+ 23596
+ ],
+ "YellowIntroGraphics1": [
+ 62,
+ 25434
+ ],
+ "YellowIntroGraphics2": [
+ 62,
+ 27482
+ ],
+ "YoungsterPic": [
+ 19,
+ 16384
+ ],
+ "ZapdosPicBack": [
+ 11,
+ 17549
+ ],
+ "ZapdosPicFront": [
+ 11,
+ 17061
+ ],
+ "ZubatPicBack": [
+ 11,
+ 28646
+ ],
+ "ZubatPicFront": [
+ 11,
+ 28422
+ ],
+ "ZzzEmote": [
+ 16,
+ 21349
+ ],
+ "_AIBattleUseItemText": [
+ 39,
+ 24178
+ ],
+ "_AIBattleWithdrawText": [
+ 39,
+ 24155
+ ],
+ "_AbandonLearningText": [
+ 44,
+ 30326
+ ],
+ "_AbraDexEntry": [
+ 46,
+ 22427
+ ],
+ "_AccessedBillsPCText": [
+ 40,
+ 17025
+ ],
+ "_AccessedHoFPCText": [
+ 40,
+ 17506
+ ],
+ "_AccessedMyPCText": [
+ 40,
+ 17128
+ ],
+ "_AccessedOaksPCText": [
+ 40,
+ 18241
+ ],
+ "_AccessedSomeonesPCText": [
+ 40,
+ 17075
+ ],
+ "_ActorNameText": [
+ 39,
+ 31018
+ ],
+ "_AerodactylDexEntry": [
+ 46,
+ 30190
+ ],
+ "_AerodactylFossilText": [
+ 39,
+ 28248
+ ],
+ "_AfterTrade1Text": [
+ 45,
+ 28624
+ ],
+ "_AfterTrade2Text": [
+ 45,
+ 28800
+ ],
+ "_AfterTrade3Text": [
+ 45,
+ 28983
+ ],
+ "_AgathaAfterBattleText": [
+ 39,
+ 23188
+ ],
+ "_AgathaBeforeBattleText": [
+ 39,
+ 22885
+ ],
+ "_AgathaEndBattleText": [
+ 39,
+ 23146
+ ],
+ "_AgathasRoomAgathaDontRunAwayText": [
+ 39,
+ 23289
+ ],
+ "_AlakazamDexEntry": [
+ 46,
+ 22619
+ ],
+ "_AlreadyAsleepText": [
+ 42,
+ 16426
+ ],
+ "_AlreadyKnowsText": [
+ 45,
+ 28406
+ ],
+ "_AlreadyOutText": [
+ 39,
+ 30517
+ ],
+ "_AntidoteText": [
+ 40,
+ 16825
+ ],
+ "_ArbokDexEntry": [
+ 46,
+ 18583
+ ],
+ "_ArcanineDexEntry": [
+ 46,
+ 22047
+ ],
+ "_ArticunoDexEntry": [
+ 46,
+ 30383
+ ],
+ "_AttackContinuesText": [
+ 39,
+ 30959
+ ],
+ "_AttackMissedText": [
+ 39,
+ 31072
+ ],
+ "_AwakeningText": [
+ 40,
+ 16918
+ ],
+ "_BadlyPoisonedText": [
+ 42,
+ 16463
+ ],
+ "_BecameConfusedText": [
+ 42,
+ 16765
+ ],
+ "_BeedrillDexEntry": [
+ 46,
+ 17713
+ ],
+ "_BeganToNapText": [
+ 39,
+ 31207
+ ],
+ "_BellsproutDexEntry": [
+ 46,
+ 23012
+ ],
+ "_BetHowManySlotMachineText": [
+ 39,
+ 24464
+ ],
+ "_BikeShopBagFullText": [
+ 42,
+ 30631
+ ],
+ "_BikeShopCantAffordText": [
+ 42,
+ 30402
+ ],
+ "_BikeShopClerkDoYouLikeItText": [
+ 42,
+ 30368
+ ],
+ "_BikeShopClerkHowDoYouLikeYourBicycleText": [
+ 42,
+ 30550
+ ],
+ "_BikeShopClerkOhThatsAVoucherText": [
+ 42,
+ 30430
+ ],
+ "_BikeShopClerkWelcomeText": [
+ 42,
+ 30302
+ ],
+ "_BikeShopComeAgainText": [
+ 42,
+ 30523
+ ],
+ "_BikeShopExchangedVoucherText": [
+ 42,
+ 30477
+ ],
+ "_BikeShopMiddleAgedWomanText": [
+ 42,
+ 30663
+ ],
+ "_BikeShopYoungsterCoolBikeText": [
+ 42,
+ 30796
+ ],
+ "_BikeShopYoungsterTheseBikesAreExpensiveText": [
+ 42,
+ 30747
+ ],
+ "_BillsHouseBillCheckOutMyRarePokemonText": [
+ 40,
+ 27537
+ ],
+ "_BillsHouseBillDontLeaveText": [
+ 40,
+ 26714
+ ],
+ "_BillsHouseBillImNotAPokemonText": [
+ 40,
+ 26745
+ ],
+ "_BillsHouseBillNoYouGottaHelpText": [
+ 40,
+ 27043
+ ],
+ "_BillsHouseBillThankYouText": [
+ 40,
+ 27143
+ ],
+ "_BillsHouseBillUseSeparationSystemText": [
+ 40,
+ 26967
+ ],
+ "_BillsHouseBillWhyDontYouGoInsteadOfMeText": [
+ 40,
+ 27362
+ ],
+ "_BillsHouseInitiatedText": [
+ 39,
+ 26796
+ ],
+ "_BillsHouseMonitorText": [
+ 39,
+ 26752
+ ],
+ "_BillsHousePokemonListText1": [
+ 39,
+ 26838
+ ],
+ "_BillsHousePokemonListText2": [
+ 39,
+ 26865
+ ],
+ "_BlastoiseDexEntry": [
+ 46,
+ 17142
+ ],
+ "_BluesHouseDaisyBagFullText": [
+ 42,
+ 17888
+ ],
+ "_BluesHouseDaisyOfferMapText": [
+ 42,
+ 17808
+ ],
+ "_BluesHouseDaisyRivalAtLabText": [
+ 42,
+ 17775
+ ],
+ "_BluesHouseDaisyUseMapText": [
+ 42,
+ 17923
+ ],
+ "_BluesHouseDaisyWalkingText": [
+ 42,
+ 17968
+ ],
+ "_BluesHouseTownMapText": [
+ 42,
+ 18031
+ ],
+ "_BookcaseText": [
+ 39,
+ 25746
+ ],
+ "_BoostedText": [
+ 39,
+ 31435
+ ],
+ "_BootedUpHMText": [
+ 45,
+ 27890
+ ],
+ "_BootedUpTMText": [
+ 45,
+ 27873
+ ],
+ "_BoulderText": [
+ 38,
+ 16561
+ ],
+ "_BoxFullCannotThrowBallText": [
+ 45,
+ 28203
+ ],
+ "_BoxFullDebugText": [
+ 39,
+ 24204
+ ],
+ "_BoxFullText": [
+ 40,
+ 17698
+ ],
+ "_BoxIsFullText": [
+ 45,
+ 16961
+ ],
+ "_BoxWillBeClearedText": [
+ 39,
+ 24222
+ ],
+ "_BrunoAfterBattleText": [
+ 39,
+ 22807
+ ],
+ "_BrunoBeforeBattleText": [
+ 39,
+ 22595
+ ],
+ "_BrunoEndBattleText": [
+ 39,
+ 22783
+ ],
+ "_BrunosRoomBrunoDontRunAwayText": [
+ 39,
+ 22853
+ ],
+ "_BuildingRageText": [
+ 39,
+ 31338
+ ],
+ "_BulbasaurDexEntry": [
+ 46,
+ 16384
+ ],
+ "_BurnHealText": [
+ 40,
+ 16875
+ ],
+ "_BurnedText": [
+ 42,
+ 16483
+ ],
+ "_ButItFailedText": [
+ 42,
+ 16858
+ ],
+ "_ButterfreeDexEntry": [
+ 46,
+ 17431
+ ],
+ "_CableClubNPCAreaReservedFor2FriendsLinkedByCableText": [
+ 44,
+ 30799
+ ],
+ "_CableClubNPCLinkClosedBecauseOfInactivityText": [
+ 45,
+ 16399
+ ],
+ "_CableClubNPCMakingPreparationsText": [
+ 45,
+ 16511
+ ],
+ "_CableClubNPCPleaseApplyHereHaveToSaveText": [
+ 44,
+ 30889
+ ],
+ "_CableClubNPCPleaseComeAgainText": [
+ 45,
+ 16491
+ ],
+ "_CableClubNPCPleaseWaitText": [
+ 45,
+ 16384
+ ],
+ "_CableClubNPCWelcomeText": [
+ 44,
+ 30861
+ ],
+ "_CanMoveBouldersText": [
+ 45,
+ 16787
+ ],
+ "_CannotFlyHereText": [
+ 45,
+ 16645
+ ],
+ "_CannotGetOffHereText": [
+ 45,
+ 16742
+ ],
+ "_CannotUseItemsHereText": [
+ 45,
+ 16716
+ ],
+ "_CannotUseTeleportNowText": [
+ 45,
+ 16617
+ ],
+ "_CantCarryMoreText": [
+ 40,
+ 17431
+ ],
+ "_CantDepositLastMonText": [
+ 40,
+ 17665
+ ],
+ "_CantEscapeText": [
+ 39,
+ 30395
+ ],
+ "_CantMoveText": [
+ 39,
+ 30981
+ ],
+ "_CantTakeMonText": [
+ 40,
+ 17792
+ ],
+ "_CardKeyFailText": [
+ 38,
+ 16425
+ ],
+ "_CardKeySuccessText1": [
+ 38,
+ 16384
+ ],
+ "_CardKeySuccessText2": [
+ 38,
+ 16393
+ ],
+ "_CaterpieDexEntry": [
+ 46,
+ 17234
+ ],
+ "_CeladonChiefHouseChiefText": [
+ 44,
+ 17139
+ ],
+ "_CeladonChiefHouseRocketText": [
+ 44,
+ 17192
+ ],
+ "_CeladonChiefHouseSailorText": [
+ 44,
+ 17242
+ ],
+ "_CeladonCityDeptStoreSignText": [
+ 45,
+ 24493
+ ],
+ "_CeladonCityFisherText": [
+ 45,
+ 24201
+ ],
+ "_CeladonCityGameCornerSignText": [
+ 45,
+ 24708
+ ],
+ "_CeladonCityGirlText": [
+ 45,
+ 23849
+ ],
+ "_CeladonCityGramps1Text": [
+ 45,
+ 23803
+ ],
+ "_CeladonCityGramps2Text": [
+ 45,
+ 23894
+ ],
+ "_CeladonCityGramps3ReceivedTM41Text": [
+ 45,
+ 24074
+ ],
+ "_CeladonCityGramps3TM41ExplanationText": [
+ 45,
+ 24094
+ ],
+ "_CeladonCityGramps3TM41NoRoomText": [
+ 45,
+ 24168
+ ],
+ "_CeladonCityGramps3Text": [
+ 45,
+ 23981
+ ],
+ "_CeladonCityGymSignText": [
+ 45,
+ 24411
+ ],
+ "_CeladonCityHotelText": [
+ 39,
+ 25709
+ ],
+ "_CeladonCityLittleGirlText": [
+ 45,
+ 23720
+ ],
+ "_CeladonCityMansionSignText": [
+ 45,
+ 24476
+ ],
+ "_CeladonCityPokecenterGuyText": [
+ 39,
+ 25338
+ ],
+ "_CeladonCityPoliwrathText": [
+ 45,
+ 24288
+ ],
+ "_CeladonCityPrizeExchangeSignText": [
+ 45,
+ 24664
+ ],
+ "_CeladonCityRocket1Text": [
+ 45,
+ 24313
+ ],
+ "_CeladonCityRocket2Text": [
+ 45,
+ 24339
+ ],
+ "_CeladonCitySignText": [
+ 45,
+ 24370
+ ],
+ "_CeladonCityTrainerTips1Text": [
+ 45,
+ 24757
+ ],
+ "_CeladonCityTrainerTips2Text": [
+ 45,
+ 24537
+ ],
+ "_CeladonDinerCookText": [
+ 44,
+ 16733
+ ],
+ "_CeladonDinerFisherText": [
+ 44,
+ 16871
+ ],
+ "_CeladonDinerGymGuideCoinCaseNoRoomText": [
+ 44,
+ 17070
+ ],
+ "_CeladonDinerGymGuideImFlatOutBustedText": [
+ 44,
+ 16929
+ ],
+ "_CeladonDinerGymGuideReceivedCoinCaseText": [
+ 44,
+ 17048
+ ],
+ "_CeladonDinerGymGuideWinItBackText": [
+ 44,
+ 17091
+ ],
+ "_CeladonDinerMiddleAgedManText": [
+ 44,
+ 16823
+ ],
+ "_CeladonDinerMiddleAgedWomanText": [
+ 44,
+ 16763
+ ],
+ "_CeladonGymAfterBattleText2": [
+ 43,
+ 29163
+ ],
+ "_CeladonGymAfterBattleText3": [
+ 43,
+ 29234
+ ],
+ "_CeladonGymAfterBattleText4": [
+ 43,
+ 29375
+ ],
+ "_CeladonGymAfterBattleText5": [
+ 43,
+ 29479
+ ],
+ "_CeladonGymAfterBattleText6": [
+ 43,
+ 29623
+ ],
+ "_CeladonGymAfterBattleText7": [
+ 43,
+ 29751
+ ],
+ "_CeladonGymAfterBattleText8": [
+ 43,
+ 29892
+ ],
+ "_CeladonGymBattleText2": [
+ 43,
+ 29110
+ ],
+ "_CeladonGymBattleText3": [
+ 43,
+ 29200
+ ],
+ "_CeladonGymBattleText4": [
+ 43,
+ 29333
+ ],
+ "_CeladonGymBattleText5": [
+ 43,
+ 29425
+ ],
+ "_CeladonGymBattleText6": [
+ 43,
+ 29570
+ ],
+ "_CeladonGymBattleText7": [
+ 43,
+ 29687
+ ],
+ "_CeladonGymBattleText8": [
+ 43,
+ 29813
+ ],
+ "_CeladonGymEndBattleText2": [
+ 43,
+ 29145
+ ],
+ "_CeladonGymEndBattleText3": [
+ 43,
+ 29222
+ ],
+ "_CeladonGymEndBattleText4": [
+ 43,
+ 29361
+ ],
+ "_CeladonGymEndBattleText5": [
+ 43,
+ 29474
+ ],
+ "_CeladonGymEndBattleText6": [
+ 43,
+ 29613
+ ],
+ "_CeladonGymEndBattleText7": [
+ 43,
+ 29736
+ ],
+ "_CeladonGymEndBattleText8": [
+ 43,
+ 29879
+ ],
+ "_CeladonGymErikaPostBattleAdviceText": [
+ 43,
+ 28728
+ ],
+ "_CeladonGymErikaPreBattleText": [
+ 43,
+ 28335
+ ],
+ "_CeladonGymErikaReceivedRainbowBadgeText": [
+ 43,
+ 28642
+ ],
+ "_CeladonGymRainbowBadgeInfoText": [
+ 43,
+ 28833
+ ],
+ "_CeladonGymReceivedTM21Text": [
+ 43,
+ 28972
+ ],
+ "_CeladonGymTM21NoRoomText": [
+ 43,
+ 29078
+ ],
+ "_CeladonHotelBeautyText": [
+ 44,
+ 17373
+ ],
+ "_CeladonHotelGrannyText": [
+ 44,
+ 17320
+ ],
+ "_CeladonHotelSuperNerdText": [
+ 44,
+ 17452
+ ],
+ "_CeladonMansion1FClefairyText": [
+ 43,
+ 26755
+ ],
+ "_CeladonMansion1FManagersSuiteSignText": [
+ 43,
+ 26802
+ ],
+ "_CeladonMansion1FMeowthText": [
+ 43,
+ 26739
+ ],
+ "_CeladonMansion1FNidoranFText": [
+ 43,
+ 26780
+ ],
+ "_CeladonMansion1Text10": [
+ 43,
+ 27072
+ ],
+ "_CeladonMansion1Text11": [
+ 43,
+ 27099
+ ],
+ "_CeladonMansion1Text12": [
+ 43,
+ 27135
+ ],
+ "_CeladonMansion1Text2": [
+ 43,
+ 26834
+ ],
+ "_CeladonMansion1Text6": [
+ 43,
+ 26896
+ ],
+ "_CeladonMansion1Text7": [
+ 43,
+ 26941
+ ],
+ "_CeladonMansion1Text8": [
+ 43,
+ 26984
+ ],
+ "_CeladonMansion1Text9": [
+ 43,
+ 27027
+ ],
+ "_CeladonMansion2FMeetingRoomSignText": [
+ 43,
+ 27192
+ ],
+ "_CeladonMansion3FDevRoomSignText": [
+ 43,
+ 28073
+ ],
+ "_CeladonMansion3FGameDesignerCompletedDexText": [
+ 43,
+ 27802
+ ],
+ "_CeladonMansion3FGameDesignerCompletedDexText2": [
+ 43,
+ 27866
+ ],
+ "_CeladonMansion3FGameDesignerText": [
+ 43,
+ 27687
+ ],
+ "_CeladonMansion3FGameProgramPCText": [
+ 43,
+ 27917
+ ],
+ "_CeladonMansion3FGameScriptPCText": [
+ 43,
+ 28025
+ ],
+ "_CeladonMansion3FGraphicArtistText": [
+ 43,
+ 27322
+ ],
+ "_CeladonMansion3FGraphicArtistText2": [
+ 43,
+ 27358
+ ],
+ "_CeladonMansion3FGraphicArtistText3": [
+ 43,
+ 27452
+ ],
+ "_CeladonMansion3FGraphicArtistText4": [
+ 43,
+ 27502
+ ],
+ "_CeladonMansion3FGraphicArtistText5": [
+ 43,
+ 27513
+ ],
+ "_CeladonMansion3FPlayingGamePCText": [
+ 43,
+ 27980
+ ],
+ "_CeladonMansion3FProgrammerText": [
+ 43,
+ 27217
+ ],
+ "_CeladonMansion3FProgrammerText2": [
+ 43,
+ 27241
+ ],
+ "_CeladonMansion3FWriterText": [
+ 43,
+ 27534
+ ],
+ "_CeladonMansion3FWriterText2": [
+ 43,
+ 27624
+ ],
+ "_CeladonMansionRoofHouseHikerText": [
+ 43,
+ 28122
+ ],
+ "_CeladonMansionRoofHouseSignText": [
+ 43,
+ 28102
+ ],
+ "_CeladonMart1FCurrentFloorSignText": [
+ 43,
+ 24777
+ ],
+ "_CeladonMart1FDirectorySignText": [
+ 43,
+ 24644
+ ],
+ "_CeladonMart1FReceptionistText": [
+ 43,
+ 24553
+ ],
+ "_CeladonMart2FCurrentFloorSignText": [
+ 43,
+ 24915
+ ],
+ "_CeladonMart2FGirlText": [
+ 43,
+ 24873
+ ],
+ "_CeladonMart2FMiddleAgedManText": [
+ 43,
+ 24802
+ ],
+ "_CeladonMart3FClerkReceivedTM18Text": [
+ 43,
+ 25566
+ ],
+ "_CeladonMart3FClerkTM18ExplanationText": [
+ 43,
+ 25586
+ ],
+ "_CeladonMart3FClerkTM18NoRoomText": [
+ 43,
+ 25646
+ ],
+ "_CeladonMart3FClerkTM18PreReceiveText": [
+ 43,
+ 25496
+ ],
+ "_CeladonMart3FCurrentFloorSignText": [
+ 43,
+ 25448
+ ],
+ "_CeladonMart3FFightingGameText": [
+ 43,
+ 25417
+ ],
+ "_CeladonMart3FGameBoyKid1Text": [
+ 43,
+ 24971
+ ],
+ "_CeladonMart3FGameBoyKid2Text": [
+ 43,
+ 25073
+ ],
+ "_CeladonMart3FGameBoyKid3Text": [
+ 43,
+ 25145
+ ],
+ "_CeladonMart3FLittleBoyText": [
+ 43,
+ 25241
+ ],
+ "_CeladonMart3FPokemonPosterText": [
+ 43,
+ 25466
+ ],
+ "_CeladonMart3FPuzzleGameText": [
+ 43,
+ 25384
+ ],
+ "_CeladonMart3FRPGText": [
+ 43,
+ 25317
+ ],
+ "_CeladonMart3FSNESText": [
+ 43,
+ 25303
+ ],
+ "_CeladonMart3FSportsGameText": [
+ 43,
+ 25351
+ ],
+ "_CeladonMart4FCurrentFloorSignText": [
+ 43,
+ 25854
+ ],
+ "_CeladonMart4FSuperNerdText": [
+ 43,
+ 25675
+ ],
+ "_CeladonMart4FYoungsterText": [
+ 43,
+ 25765
+ ],
+ "_CeladonMart5FCurrentFloorSignText": [
+ 44,
+ 16628
+ ],
+ "_CeladonMart5FGentlemanText": [
+ 44,
+ 16413
+ ],
+ "_CeladonMart5FSailorText": [
+ 44,
+ 16535
+ ],
+ "_CeladonMartRoofCurrentFloorSignText": [
+ 43,
+ 26581
+ ],
+ "_CeladonMartRoofLittleGirlGiveHerADrinkText": [
+ 43,
+ 26523
+ ],
+ "_CeladonMartRoofLittleGirlGiveHerWhichDrinkText": [
+ 43,
+ 25949
+ ],
+ "_CeladonMartRoofLittleGirlImNotThirstyText": [
+ 43,
+ 26354
+ ],
+ "_CeladonMartRoofLittleGirlImThirstyText": [
+ 43,
+ 26483
+ ],
+ "_CeladonMartRoofLittleGirlNoRoomText": [
+ 43,
+ 26322
+ ],
+ "_CeladonMartRoofLittleGirlReceivedTM13Text": [
+ 43,
+ 26030
+ ],
+ "_CeladonMartRoofLittleGirlReceivedTM48Text": [
+ 43,
+ 26169
+ ],
+ "_CeladonMartRoofLittleGirlReceivedTM49Text": [
+ 43,
+ 26274
+ ],
+ "_CeladonMartRoofLittleGirlTM13ExplanationText": [
+ 43,
+ 26050
+ ],
+ "_CeladonMartRoofLittleGirlTM48ExplanationText": [
+ 43,
+ 26189
+ ],
+ "_CeladonMartRoofLittleGirlTM49ExplanationText": [
+ 43,
+ 26293
+ ],
+ "_CeladonMartRoofLittleGirlYayFreshWaterText": [
+ 43,
+ 25972
+ ],
+ "_CeladonMartRoofLittleGirlYayLemonadeText": [
+ 43,
+ 26219
+ ],
+ "_CeladonMartRoofLittleGirlYaySodaPopText": [
+ 43,
+ 26114
+ ],
+ "_CeladonMartRoofSuperNerdText": [
+ 43,
+ 26396
+ ],
+ "_CeladonPokecenterBeautyText": [
+ 43,
+ 28290
+ ],
+ "_CeladonPokecenterGentlemanText": [
+ 43,
+ 28230
+ ],
+ "_CeruleanBadgeHouseBoulderBadgeText": [
+ 42,
+ 31213
+ ],
+ "_CeruleanBadgeHouseCascadeBadgeText": [
+ 42,
+ 31310
+ ],
+ "_CeruleanBadgeHouseEarthBadgeText": [
+ 43,
+ 16587
+ ],
+ "_CeruleanBadgeHouseMarshBadgeText": [
+ 43,
+ 16478
+ ],
+ "_CeruleanBadgeHouseMiddleAgedManText": [
+ 42,
+ 31011
+ ],
+ "_CeruleanBadgeHouseMiddleAgedManVisitAnyTimeText": [
+ 42,
+ 31178
+ ],
+ "_CeruleanBadgeHouseMiddleAgedManWhichBadgeText": [
+ 42,
+ 31124
+ ],
+ "_CeruleanBadgeHouseRainbowBadgeText": [
+ 42,
+ 31508
+ ],
+ "_CeruleanBadgeHouseSoulBadgeText": [
+ 43,
+ 16384
+ ],
+ "_CeruleanBadgeHouseThunderBadgeText": [
+ 42,
+ 31417
+ ],
+ "_CeruleanBadgeHouseVolcanoBadgeText": [
+ 43,
+ 16541
+ ],
+ "_CeruleanCityBikeShopSign": [
+ 45,
+ 21858
+ ],
+ "_CeruleanCityCooltrainerF1ElectrodePunchText": [
+ 45,
+ 21251
+ ],
+ "_CeruleanCityCooltrainerF1ElectrodeUseSonicboomText": [
+ 45,
+ 21187
+ ],
+ "_CeruleanCityCooltrainerF1ElectrodeWithdrawText": [
+ 45,
+ 21294
+ ],
+ "_CeruleanCityCooltrainerF2Text": [
+ 45,
+ 21534
+ ],
+ "_CeruleanCityCooltrainerMText": [
+ 45,
+ 20839
+ ],
+ "_CeruleanCityElectrodeIgnoredOrdersText": [
+ 45,
+ 21505
+ ],
+ "_CeruleanCityElectrodeIsLoafingAroundText": [
+ 45,
+ 21447
+ ],
+ "_CeruleanCityElectrodeTookASnoozeText": [
+ 45,
+ 21419
+ ],
+ "_CeruleanCityElectrodeTurnedAwayText": [
+ 45,
+ 21479
+ ],
+ "_CeruleanCityGuardText": [
+ 45,
+ 21037
+ ],
+ "_CeruleanCityGymSign": [
+ 45,
+ 21901
+ ],
+ "_CeruleanCityRivalDefeatedText": [
+ 45,
+ 20213
+ ],
+ "_CeruleanCityRivalIWentToBillsText": [
+ 45,
+ 20286
+ ],
+ "_CeruleanCityRivalPreBattleText": [
+ 45,
+ 20066
+ ],
+ "_CeruleanCityRivalVictoryText": [
+ 45,
+ 20250
+ ],
+ "_CeruleanCityRocketIBetterGetMovingText": [
+ 45,
+ 20685
+ ],
+ "_CeruleanCityRocketIGiveUpText": [
+ 45,
+ 20770
+ ],
+ "_CeruleanCityRocketIllReturnTheTMText": [
+ 45,
+ 20807
+ ],
+ "_CeruleanCityRocketReceivedTM28Text": [
+ 45,
+ 20665
+ ],
+ "_CeruleanCityRocketTM28NoRoomText": [
+ 45,
+ 20714
+ ],
+ "_CeruleanCityRocketText": [
+ 45,
+ 20574
+ ],
+ "_CeruleanCitySignText": [
+ 45,
+ 21730
+ ],
+ "_CeruleanCitySuperNerd1Text": [
+ 45,
+ 20901
+ ],
+ "_CeruleanCitySuperNerd2Text": [
+ 45,
+ 20977
+ ],
+ "_CeruleanCitySuperNerd3Text": [
+ 45,
+ 21607
+ ],
+ "_CeruleanCityTrainerTipsText": [
+ 45,
+ 21782
+ ],
+ "_CeruleanGymAfterBattleText1": [
+ 42,
+ 29863
+ ],
+ "_CeruleanGymAfterBattleText2": [
+ 42,
+ 29982
+ ],
+ "_CeruleanGymBattleText1": [
+ 42,
+ 29791
+ ],
+ "_CeruleanGymBattleText2": [
+ 42,
+ 29933
+ ],
+ "_CeruleanGymEndBattleText1": [
+ 42,
+ 29842
+ ],
+ "_CeruleanGymEndBattleText2": [
+ 42,
+ 29967
+ ],
+ "_CeruleanGymGymGuideBeatMistyText": [
+ 42,
+ 30218
+ ],
+ "_CeruleanGymGymGuideChampInMakingText": [
+ 42,
+ 30052
+ ],
+ "_CeruleanGymMistyCascadeBadgeInfoText": [
+ 42,
+ 29450
+ ],
+ "_CeruleanGymMistyPreBattleText": [
+ 42,
+ 29197
+ ],
+ "_CeruleanGymMistyReceivedCascadeBadgeText": [
+ 42,
+ 29705
+ ],
+ "_CeruleanGymMistyReceivedTM11Text": [
+ 42,
+ 29654
+ ],
+ "_CeruleanGymMistyTM11ExplanationText": [
+ 42,
+ 29397
+ ],
+ "_CeruleanGymMistyTM11NoRoomText": [
+ 42,
+ 29673
+ ],
+ "_CeruleanMartCooltrainerFText": [
+ 42,
+ 30937
+ ],
+ "_CeruleanMartCooltrainerMText": [
+ 42,
+ 30828
+ ],
+ "_CeruleanPokecenterGentlemanText": [
+ 42,
+ 29046
+ ],
+ "_CeruleanPokecenterGuyText": [
+ 39,
+ 24860
+ ],
+ "_CeruleanPokecenterSuperNerdText": [
+ 42,
+ 28977
+ ],
+ "_CeruleanTrashedHouseFishingGuruTheyStoleATMText": [
+ 42,
+ 28355
+ ],
+ "_CeruleanTrashedHouseFishingGuruWhatsLostIsLostText": [
+ 42,
+ 28489
+ ],
+ "_CeruleanTrashedHouseGirlText": [
+ 42,
+ 28571
+ ],
+ "_CeruleanTrashedHouseWallHoleText": [
+ 42,
+ 28630
+ ],
+ "_ChampionsRoomOakComeWithMeText": [
+ 39,
+ 22113
+ ],
+ "_ChampionsRoomOakCongratulatesPlayerText": [
+ 39,
+ 21700
+ ],
+ "_ChampionsRoomOakDisappointedWithRivalText": [
+ 39,
+ 21853
+ ],
+ "_ChampionsRoomOakText": [
+ 39,
+ 21691
+ ],
+ "_ChampionsRoomRivalAfterBattleText": [
+ 39,
+ 21545
+ ],
+ "_ChampionsRoomRivalIntroText": [
+ 39,
+ 20955
+ ],
+ "_ChanseyDexEntry": [
+ 46,
+ 27318
+ ],
+ "_ChargeMoveEffectText": [
+ 42,
+ 16657
+ ],
+ "_CharizardDexEntry": [
+ 46,
+ 16862
+ ],
+ "_CharmanderDexEntry": [
+ 46,
+ 16673
+ ],
+ "_CharmeleonDexEntry": [
+ 46,
+ 16772
+ ],
+ "_ChooseABoxText": [
+ 41,
+ 30429
+ ],
+ "_CinnabarGymBlainePostBattleAdviceText": [
+ 44,
+ 22241
+ ],
+ "_CinnabarGymBlainePreBattleText": [
+ 44,
+ 22056
+ ],
+ "_CinnabarGymBlaineReceivedTM38Text": [
+ 44,
+ 22412
+ ],
+ "_CinnabarGymBlaineReceivedVolcanoBadgeText": [
+ 44,
+ 22187
+ ],
+ "_CinnabarGymBlaineTM38ExplanationText": [
+ 44,
+ 22432
+ ],
+ "_CinnabarGymBlaineTM38NoRoomText": [
+ 44,
+ 22530
+ ],
+ "_CinnabarGymBlaineVolcanoBadgeInfoText": [
+ 44,
+ 22314
+ ],
+ "_CinnabarGymGymGuideBeatBlaineText": [
+ 44,
+ 23485
+ ],
+ "_CinnabarGymGymGuideChampInMakingText": [
+ 44,
+ 23358
+ ],
+ "_CinnabarGymQuizCorrectText": [
+ 39,
+ 26645
+ ],
+ "_CinnabarGymQuizDummyIntroText": [
+ 39,
+ 25984
+ ],
+ "_CinnabarGymQuizIncorrectText": [
+ 39,
+ 26688
+ ],
+ "_CinnabarGymQuizIntroText": [
+ 39,
+ 26166
+ ],
+ "_CinnabarGymQuizShortIntroText": [
+ 39,
+ 26368
+ ],
+ "_CinnabarGymSuperNerd1AfterBattleText": [
+ 44,
+ 22622
+ ],
+ "_CinnabarGymSuperNerd1BattleText": [
+ 44,
+ 22554
+ ],
+ "_CinnabarGymSuperNerd1EndBattleText": [
+ 44,
+ 22601
+ ],
+ "_CinnabarGymSuperNerd2AfterBattleText": [
+ 44,
+ 22758
+ ],
+ "_CinnabarGymSuperNerd2BattleText": [
+ 44,
+ 22692
+ ],
+ "_CinnabarGymSuperNerd2EndBattleText": [
+ 44,
+ 22744
+ ],
+ "_CinnabarGymSuperNerd3AfterBattleText": [
+ 44,
+ 22863
+ ],
+ "_CinnabarGymSuperNerd3BattleText": [
+ 44,
+ 22800
+ ],
+ "_CinnabarGymSuperNerd3EndBattleText": [
+ 44,
+ 22844
+ ],
+ "_CinnabarGymSuperNerd4AfterBattleText": [
+ 44,
+ 22955
+ ],
+ "_CinnabarGymSuperNerd4BattleText": [
+ 44,
+ 22905
+ ],
+ "_CinnabarGymSuperNerd4EndBattleText": [
+ 44,
+ 22935
+ ],
+ "_CinnabarGymSuperNerd5AfterBattleText": [
+ 44,
+ 23042
+ ],
+ "_CinnabarGymSuperNerd5BattleText": [
+ 44,
+ 23000
+ ],
+ "_CinnabarGymSuperNerd5EndBattleText": [
+ 44,
+ 23037
+ ],
+ "_CinnabarGymSuperNerd6AfterBattleText": [
+ 44,
+ 23222
+ ],
+ "_CinnabarGymSuperNerd6BattleText": [
+ 44,
+ 23156
+ ],
+ "_CinnabarGymSuperNerd6EndBattleText": [
+ 44,
+ 23205
+ ],
+ "_CinnabarGymSuperNerd7AfterBattleText": [
+ 44,
+ 23313
+ ],
+ "_CinnabarGymSuperNerd7BattleText": [
+ 44,
+ 23268
+ ],
+ "_CinnabarGymSuperNerd7EndBattleText": [
+ 44,
+ 23295
+ ],
+ "_CinnabarGymText_1": [
+ 44,
+ 23515
+ ],
+ "_CinnabarGymText_2": [
+ 44,
+ 23654
+ ],
+ "_CinnabarGymText_3": [
+ 44,
+ 23676
+ ],
+ "_CinnabarGymText_4": [
+ 44,
+ 23695
+ ],
+ "_CinnabarGymText_5": [
+ 44,
+ 23720
+ ],
+ "_CinnabarGymText_6": [
+ 44,
+ 23749
+ ],
+ "_CinnabarGymText_7": [
+ 44,
+ 23777
+ ],
+ "_CinnabarIslandDoorIsLockedText": [
+ 45,
+ 25727
+ ],
+ "_CinnabarIslandGamblerText": [
+ 45,
+ 25818
+ ],
+ "_CinnabarIslandGirlText": [
+ 45,
+ 25750
+ ],
+ "_CinnabarIslandGymSignText": [
+ 45,
+ 25938
+ ],
+ "_CinnabarIslandPokemonLabSignText": [
+ 45,
+ 25928
+ ],
+ "_CinnabarIslandSignText": [
+ 45,
+ 25878
+ ],
+ "_CinnabarLabFishingGuruText": [
+ 44,
+ 23808
+ ],
+ "_CinnabarLabFossilRoomScientist1ComeAgainText": [
+ 44,
+ 25039
+ ],
+ "_CinnabarLabFossilRoomScientist1FossilIsBackToLifeText": [
+ 44,
+ 24726
+ ],
+ "_CinnabarLabFossilRoomScientist1GoForAWalkText": [
+ 44,
+ 24671
+ ],
+ "_CinnabarLabFossilRoomScientist1GoForAWalkText2": [
+ 44,
+ 24984
+ ],
+ "_CinnabarLabFossilRoomScientist1NoFossilsText": [
+ 44,
+ 24654
+ ],
+ "_CinnabarLabFossilRoomScientist1SeesFossilText": [
+ 44,
+ 24799
+ ],
+ "_CinnabarLabFossilRoomScientist1TakesFossilText": [
+ 44,
+ 24930
+ ],
+ "_CinnabarLabFossilRoomScientist1Text": [
+ 44,
+ 24561
+ ],
+ "_CinnabarLabMeetingRoomSignText": [
+ 44,
+ 23929
+ ],
+ "_CinnabarLabMetronomeRoomAmberPipeText": [
+ 44,
+ 24545
+ ],
+ "_CinnabarLabMetronomeRoomPCText": [
+ 44,
+ 24345
+ ],
+ "_CinnabarLabMetronomeRoomScientist1ReceivedTM35Text": [
+ 44,
+ 24145
+ ],
+ "_CinnabarLabMetronomeRoomScientist1TM35ExplanationText": [
+ 44,
+ 24166
+ ],
+ "_CinnabarLabMetronomeRoomScientist1TM35NoRoomText": [
+ 44,
+ 24272
+ ],
+ "_CinnabarLabMetronomeRoomScientist1Text": [
+ 44,
+ 24082
+ ],
+ "_CinnabarLabMetronomeRoomScientist2Text": [
+ 44,
+ 24300
+ ],
+ "_CinnabarLabPhotoText": [
+ 44,
+ 23890
+ ],
+ "_CinnabarLabRAndDSignText": [
+ 44,
+ 23952
+ ],
+ "_CinnabarLabTestingRoomSignText": [
+ 44,
+ 23975
+ ],
+ "_CinnabarLabTradeRoomSuperNerdText": [
+ 44,
+ 23998
+ ],
+ "_CinnabarMartScientistText": [
+ 44,
+ 25300
+ ],
+ "_CinnabarMartSilphWorkerFText": [
+ 44,
+ 25252
+ ],
+ "_CinnabarPokecenterCooltrainerFText": [
+ 44,
+ 25063
+ ],
+ "_CinnabarPokecenterGentlemanText": [
+ 44,
+ 25159
+ ],
+ "_CinnabarPokecenterGuyText": [
+ 39,
+ 25464
+ ],
+ "_CinnabarQuizQuestionsText1": [
+ 39,
+ 26398
+ ],
+ "_CinnabarQuizQuestionsText2": [
+ 39,
+ 26433
+ ],
+ "_CinnabarQuizQuestionsText3": [
+ 39,
+ 26476
+ ],
+ "_CinnabarQuizQuestionsText4": [
+ 39,
+ 26502
+ ],
+ "_CinnabarQuizQuestionsText5": [
+ 39,
+ 26566
+ ],
+ "_CinnabarQuizQuestionsText6": [
+ 39,
+ 26618
+ ],
+ "_ClearSaveDataText": [
+ 40,
+ 16617
+ ],
+ "_ClefableDexEntry": [
+ 46,
+ 19745
+ ],
+ "_ClefairyDexEntry": [
+ 46,
+ 19641
+ ],
+ "_ClosedOaksPCText": [
+ 40,
+ 18210
+ ],
+ "_CloysterDexEntry": [
+ 46,
+ 25148
+ ],
+ "_CoinCaseNumCoinsText": [
+ 45,
+ 27650
+ ],
+ "_CoinsScatteredText": [
+ 42,
+ 17341
+ ],
+ "_Colosseum3MonsText": [
+ 40,
+ 18987
+ ],
+ "_ColosseumCanceledText": [
+ 40,
+ 19503
+ ],
+ "_ColosseumDifferentMonsText": [
+ 40,
+ 19039
+ ],
+ "_ColosseumEvolvedText": [
+ 40,
+ 19387
+ ],
+ "_ColosseumHeightText": [
+ 40,
+ 19335
+ ],
+ "_ColosseumIneligibleText": [
+ 40,
+ 19412
+ ],
+ "_ColosseumMaxL20Text": [
+ 40,
+ 19248
+ ],
+ "_ColosseumMaxL30Text": [
+ 40,
+ 19161
+ ],
+ "_ColosseumMaxL55Text": [
+ 40,
+ 19073
+ ],
+ "_ColosseumMewText": [
+ 40,
+ 19014
+ ],
+ "_ColosseumMinL15Text": [
+ 40,
+ 19273
+ ],
+ "_ColosseumMinL25Text": [
+ 40,
+ 19186
+ ],
+ "_ColosseumMinL50Text": [
+ 40,
+ 19098
+ ],
+ "_ColosseumOpponentText": [
+ 42,
+ 17417
+ ],
+ "_ColosseumPleaseWaitText": [
+ 40,
+ 19471
+ ],
+ "_ColosseumTotalL155Text": [
+ 40,
+ 19130
+ ],
+ "_ColosseumTotalL50Text": [
+ 40,
+ 19305
+ ],
+ "_ColosseumTotalL80Text": [
+ 40,
+ 19218
+ ],
+ "_ColosseumVersionText": [
+ 40,
+ 19527
+ ],
+ "_ColosseumWeightText": [
+ 40,
+ 19359
+ ],
+ "_ColosseumWhereToText": [
+ 40,
+ 19442
+ ],
+ "_ComeBackText": [
+ 40,
+ 16582
+ ],
+ "_ConfusedNoMoreText": [
+ 39,
+ 30874
+ ],
+ "_ConnectCableText": [
+ 45,
+ 28424
+ ],
+ "_ContCharText": [
+ 40,
+ 19571
+ ],
+ "_ConvertedTypeText": [
+ 42,
+ 17081
+ ],
+ "_CopycatsHouse1FChanseyText": [
+ 44,
+ 25759
+ ],
+ "_CopycatsHouse1FMiddleAgedManText": [
+ 44,
+ 25662
+ ],
+ "_CopycatsHouse1FMiddleAgedWomanText": [
+ 44,
+ 25600
+ ],
+ "_CopycatsHouse2FCopycatDoYouLikePokemonText": [
+ 44,
+ 25782
+ ],
+ "_CopycatsHouse2FCopycatReceivedTM31Text": [
+ 44,
+ 25982
+ ],
+ "_CopycatsHouse2FCopycatTM31Explanation1Text": [
+ 44,
+ 26002
+ ],
+ "_CopycatsHouse2FCopycatTM31Explanation2Text": [
+ 44,
+ 26062
+ ],
+ "_CopycatsHouse2FCopycatTM31NoRoomText": [
+ 44,
+ 26172
+ ],
+ "_CopycatsHouse2FCopycatTM31PreReceiveText": [
+ 44,
+ 25919
+ ],
+ "_CopycatsHouse2FDoduoText": [
+ 44,
+ 26194
+ ],
+ "_CopycatsHouse2FPCCantSeeText": [
+ 44,
+ 26443
+ ],
+ "_CopycatsHouse2FPCMySecretsText": [
+ 44,
+ 26360
+ ],
+ "_CopycatsHouse2FRareDollText": [
+ 44,
+ 26267
+ ],
+ "_CopycatsHouse2FSNESText": [
+ 44,
+ 26311
+ ],
+ "_CriticalHitText": [
+ 39,
+ 31155
+ ],
+ "_CuboneDexEntry": [
+ 46,
+ 26409
+ ],
+ "_CurrentTooFastText": [
+ 45,
+ 16811
+ ],
+ "_CyclingIsFunText": [
+ 45,
+ 16842
+ ],
+ "_DaycareGentlemanAllRightThenText": [
+ 40,
+ 21253
+ ],
+ "_DaycareGentlemanCantAcceptMonWithHMText": [
+ 40,
+ 21352
+ ],
+ "_DaycareGentlemanComeAgainText": [
+ 40,
+ 21272
+ ],
+ "_DaycareGentlemanComeSeeMeInAWhileText": [
+ 40,
+ 21029
+ ],
+ "_DaycareGentlemanGotMonBackText": [
+ 40,
+ 21178
+ ],
+ "_DaycareGentlemanHeresYourMonText": [
+ 40,
+ 21397
+ ],
+ "_DaycareGentlemanIntroText": [
+ 40,
+ 20897
+ ],
+ "_DaycareGentlemanMonHasGrownText": [
+ 40,
+ 21054
+ ],
+ "_DaycareGentlemanMonNeedsMoreTimeText": [
+ 40,
+ 21197
+ ],
+ "_DaycareGentlemanNoRoomForMonText": [
+ 40,
+ 21285
+ ],
+ "_DaycareGentlemanNotEnoughMoneyText": [
+ 40,
+ 21426
+ ],
+ "_DaycareGentlemanOnlyHaveOneMonText": [
+ 40,
+ 21318
+ ],
+ "_DaycareGentlemanOweMoneyText": [
+ 40,
+ 21129
+ ],
+ "_DaycareGentlemanWhichMonText": [
+ 40,
+ 20960
+ ],
+ "_DaycareGentlemanWillLookAfterMonText": [
+ 40,
+ 20988
+ ],
+ "_DepositHowManyText": [
+ 40,
+ 17251
+ ],
+ "_DepositWhichMonText": [
+ 40,
+ 17614
+ ],
+ "_DewgongDexEntry": [
+ 46,
+ 24774
+ ],
+ "_DexCompletionText": [
+ 42,
+ 21268
+ ],
+ "_DexRatingText": [
+ 39,
+ 24624
+ ],
+ "_DexRatingText_Own0To9": [
+ 42,
+ 21344
+ ],
+ "_DexRatingText_Own100To109": [
+ 42,
+ 21867
+ ],
+ "_DexRatingText_Own10To19": [
+ 42,
+ 21403
+ ],
+ "_DexRatingText_Own110To119": [
+ 42,
+ 21939
+ ],
+ "_DexRatingText_Own120To129": [
+ 42,
+ 21988
+ ],
+ "_DexRatingText_Own130To139": [
+ 42,
+ 22037
+ ],
+ "_DexRatingText_Own140To149": [
+ 42,
+ 22084
+ ],
+ "_DexRatingText_Own150To151": [
+ 42,
+ 22138
+ ],
+ "_DexRatingText_Own20To29": [
+ 42,
+ 21460
+ ],
+ "_DexRatingText_Own30To39": [
+ 42,
+ 21515
+ ],
+ "_DexRatingText_Own40To49": [
+ 42,
+ 21573
+ ],
+ "_DexRatingText_Own50To59": [
+ 42,
+ 21621
+ ],
+ "_DexRatingText_Own60To69": [
+ 42,
+ 21696
+ ],
+ "_DexRatingText_Own70To79": [
+ 42,
+ 21732
+ ],
+ "_DexRatingText_Own80To89": [
+ 42,
+ 21774
+ ],
+ "_DexRatingText_Own90To99": [
+ 42,
+ 21817
+ ],
+ "_DexSeenOwnedText": [
+ 39,
+ 24583
+ ],
+ "_DidNotLearnText": [
+ 44,
+ 30351
+ ],
+ "_DidntAffectText": [
+ 42,
+ 16876
+ ],
+ "_DiglettDexEntry": [
+ 46,
+ 21159
+ ],
+ "_DiglettSculptureText": [
+ 39,
+ 29878
+ ],
+ "_DiglettsCaveRoute11GamblerText": [
+ 40,
+ 23294
+ ],
+ "_DiglettsCaveRoute2FishingGuruText": [
+ 40,
+ 19600
+ ],
+ "_DisabledNoMoreText": [
+ 39,
+ 30802
+ ],
+ "_DittoDexEntry": [
+ 46,
+ 29199
+ ],
+ "_DoItText": [
+ 40,
+ 16500
+ ],
+ "_DoYouWantToNicknameText": [
+ 40,
+ 18842
+ ],
+ "_DodrioDexEntry": [
+ 46,
+ 24585
+ ],
+ "_DoduoDexEntry": [
+ 46,
+ 24486
+ ],
+ "_DoesntAffectMonText": [
+ 39,
+ 31134
+ ],
+ "_DontHavePokemonText": [
+ 45,
+ 28246
+ ],
+ "_DragonairDexEntry": [
+ 46,
+ 30756
+ ],
+ "_DragoniteDexEntry": [
+ 46,
+ 30853
+ ],
+ "_DratiniDexEntry": [
+ 46,
+ 30660
+ ],
+ "_DreamWasEatenText": [
+ 42,
+ 17393
+ ],
+ "_DroppedHiddenCoinsText": [
+ 39,
+ 29715
+ ],
+ "_DrowzeeDexEntry": [
+ 46,
+ 25632
+ ],
+ "_DugAHoleText": [
+ 42,
+ 16751
+ ],
+ "_DugtrioDexEntry": [
+ 46,
+ 21255
+ ],
+ "_EeveeDexEntry": [
+ 46,
+ 29293
+ ],
+ "_EkansDexEntry": [
+ 46,
+ 18479
+ ],
+ "_ElectabuzzDexEntry": [
+ 46,
+ 28499
+ ],
+ "_ElectrodeDexEntry": [
+ 46,
+ 26117
+ ],
+ "_ElevatorText": [
+ 39,
+ 29907
+ ],
+ "_EndUsedMove1Text": [
+ 39,
+ 31057
+ ],
+ "_EndUsedMove2Text": [
+ 39,
+ 31060
+ ],
+ "_EndUsedMove3Text": [
+ 39,
+ 31063
+ ],
+ "_EndUsedMove4Text": [
+ 39,
+ 31066
+ ],
+ "_EndUsedMove5Text": [
+ 39,
+ 31069
+ ],
+ "_EnemiesOnEverySideText": [
+ 39,
+ 28018
+ ],
+ "_EnemyAppearedText": [
+ 40,
+ 16384
+ ],
+ "_EnemyMonFaintedText": [
+ 39,
+ 30111
+ ],
+ "_EnemyRanText": [
+ 39,
+ 30031
+ ],
+ "_EnemysWeakText": [
+ 40,
+ 16519
+ ],
+ "_EnoughText": [
+ 40,
+ 16558
+ ],
+ "_EvadedAttackText": [
+ 42,
+ 17042
+ ],
+ "_EvolvedText": [
+ 41,
+ 30447
+ ],
+ "_ExchangeCoinsForPrizesText": [
+ 40,
+ 18000
+ ],
+ "_ExclamationText": [
+ 38,
+ 16531
+ ],
+ "_ExeggcuteDexEntry": [
+ 46,
+ 26217
+ ],
+ "_ExeggutorDexEntry": [
+ 46,
+ 26314
+ ],
+ "_ExpPointsText": [
+ 39,
+ 31448
+ ],
+ "_ExpressionText": [
+ 40,
+ 18295
+ ],
+ "_FanClubPicture1Text": [
+ 39,
+ 28338
+ ],
+ "_FanClubPicture2Text": [
+ 39,
+ 28357
+ ],
+ "_FarfetchdDexEntry": [
+ 46,
+ 24387
+ ],
+ "_FastAsleepText": [
+ 39,
+ 30699
+ ],
+ "_FearowDexEntry": [
+ 46,
+ 18387
+ ],
+ "_FellAsleepBecameHealthyText": [
+ 42,
+ 17181
+ ],
+ "_FellAsleepText": [
+ 42,
+ 16410
+ ],
+ "_FellText": [
+ 42,
+ 16590
+ ],
+ "_FightingDojoBetterNotGetGreedyText": [
+ 44,
+ 27299
+ ],
+ "_FightingDojoBlackbelt1AfterBattleText": [
+ 44,
+ 26828
+ ],
+ "_FightingDojoBlackbelt1BattleText": [
+ 44,
+ 26786
+ ],
+ "_FightingDojoBlackbelt1EndBattleText": [
+ 44,
+ 26816
+ ],
+ "_FightingDojoBlackbelt2AfterBattleText": [
+ 44,
+ 26940
+ ],
+ "_FightingDojoBlackbelt2BattleText": [
+ 44,
+ 26894
+ ],
+ "_FightingDojoBlackbelt2EndBattleText": [
+ 44,
+ 26923
+ ],
+ "_FightingDojoBlackbelt3AfterBattleText": [
+ 44,
+ 27053
+ ],
+ "_FightingDojoBlackbelt3BattleText": [
+ 44,
+ 26970
+ ],
+ "_FightingDojoBlackbelt3EndBattleText": [
+ 44,
+ 27030
+ ],
+ "_FightingDojoBlackbelt4AfterBattleText": [
+ 44,
+ 27171
+ ],
+ "_FightingDojoBlackbelt4BattleText": [
+ 44,
+ 27105
+ ],
+ "_FightingDojoBlackbelt4EndBattleText": [
+ 44,
+ 27154
+ ],
+ "_FightingDojoHitmonchanPokeBallText": [
+ 44,
+ 27257
+ ],
+ "_FightingDojoHitmonleePokeBallText": [
+ 44,
+ 27219
+ ],
+ "_FightingDojoKarateMasterDefeatedText": [
+ 44,
+ 26563
+ ],
+ "_FightingDojoKarateMasterIWillGiveYouAPokemonText": [
+ 44,
+ 26584
+ ],
+ "_FightingDojoKarateMasterStayAndTrainWithUsText": [
+ 44,
+ 26747
+ ],
+ "_FightingDojoKarateMasterText": [
+ 44,
+ 26459
+ ],
+ "_FightingDojoText": [
+ 39,
+ 28074
+ ],
+ "_FileDataDestroyedText": [
+ 41,
+ 30227
+ ],
+ "_FireDefrostedText": [
+ 42,
+ 16519
+ ],
+ "_FlareonDexEntry": [
+ 46,
+ 29596
+ ],
+ "_FlashLightsAreaText": [
+ 45,
+ 16551
+ ],
+ "_FlewUpHighText": [
+ 42,
+ 16735
+ ],
+ "_FlinchedText": [
+ 39,
+ 30771
+ ],
+ "_FluteWokeUpText": [
+ 45,
+ 27598
+ ],
+ "_ForgotAndText": [
+ 44,
+ 30517
+ ],
+ "_FoundHiddenCoins2Text": [
+ 39,
+ 29691
+ ],
+ "_FoundHiddenCoinsText": [
+ 39,
+ 29667
+ ],
+ "_FoundHiddenItemText": [
+ 39,
+ 29608
+ ],
+ "_FoundItemText": [
+ 38,
+ 16665
+ ],
+ "_FrozenText": [
+ 42,
+ 16498
+ ],
+ "_FuchsiaBillsGrandpasHouseBillsGrandpaText": [
+ 44,
+ 17681
+ ],
+ "_FuchsiaBillsGrandpasHouseMiddleAgedWomanText": [
+ 44,
+ 17601
+ ],
+ "_FuchsiaBillsGrandpasHouseYoungsterText": [
+ 44,
+ 17771
+ ],
+ "_FuchsiaCityChanseySignText": [
+ 45,
+ 25344
+ ],
+ "_FuchsiaCityErikText": [
+ 45,
+ 25069
+ ],
+ "_FuchsiaCityFossilSignKabutoText": [
+ 45,
+ 25665
+ ],
+ "_FuchsiaCityFossilSignOmanyteText": [
+ 45,
+ 25607
+ ],
+ "_FuchsiaCityFossilSignUndeterminedText": [
+ 45,
+ 25722
+ ],
+ "_FuchsiaCityGamblerText": [
+ 45,
+ 24973
+ ],
+ "_FuchsiaCityGymSignText": [
+ 45,
+ 25280
+ ],
+ "_FuchsiaCityKangaskhanSignText": [
+ 45,
+ 25436
+ ],
+ "_FuchsiaCityLaprasSignText": [
+ 45,
+ 25564
+ ],
+ "_FuchsiaCityPokecenterGuyText": [
+ 39,
+ 25384
+ ],
+ "_FuchsiaCityPokemonText": [
+ 45,
+ 25157
+ ],
+ "_FuchsiaCitySafariGameSignText": [
+ 45,
+ 25200
+ ],
+ "_FuchsiaCitySafariZoneSignText": [
+ 45,
+ 25253
+ ],
+ "_FuchsiaCitySignText": [
+ 45,
+ 25160
+ ],
+ "_FuchsiaCitySlowpokeSignText": [
+ 45,
+ 25517
+ ],
+ "_FuchsiaCityVoltorbSignText": [
+ 45,
+ 25393
+ ],
+ "_FuchsiaCityWardensHomeSignText": [
+ 45,
+ 25227
+ ],
+ "_FuchsiaCityYoungster1Text": [
+ 45,
+ 24907
+ ],
+ "_FuchsiaCityYoungster2Text": [
+ 45,
+ 25114
+ ],
+ "_FuchsiaGoodRodHouseFishingGuruHowAreTheFishText": [
+ 44,
+ 21820
+ ],
+ "_FuchsiaGoodRodHouseFishingGuruNoRoomText": [
+ 44,
+ 21862
+ ],
+ "_FuchsiaGoodRodHouseFishingGuruReceivedGoodRodText": [
+ 44,
+ 21708
+ ],
+ "_FuchsiaGoodRodHouseFishingGuruText": [
+ 44,
+ 21625
+ ],
+ "_FuchsiaGoodRodHouseFishingGuruThatsSoDisappointingText": [
+ 44,
+ 21787
+ ],
+ "_FuchsiaGymGymGuideBeatKogaText": [
+ 44,
+ 21336
+ ],
+ "_FuchsiaGymGymGuideChampInMakingText": [
+ 44,
+ 21174
+ ],
+ "_FuchsiaGymKogaBeforeBattleText": [
+ 44,
+ 19697
+ ],
+ "_FuchsiaGymKogaPostBattleAdviceText": [
+ 44,
+ 19940
+ ],
+ "_FuchsiaGymKogaReceivedSoulBadgeText": [
+ 44,
+ 19878
+ ],
+ "_FuchsiaGymKogaReceivedTM06Text": [
+ 44,
+ 20175
+ ],
+ "_FuchsiaGymKogaSoulBadgeInfoText": [
+ 44,
+ 20045
+ ],
+ "_FuchsiaGymKogaTM06ExplanationText": [
+ 44,
+ 20195
+ ],
+ "_FuchsiaGymKogaTM06NoRoomText": [
+ 44,
+ 20263
+ ],
+ "_FuchsiaGymRocker1AfterBattleText": [
+ 44,
+ 20412
+ ],
+ "_FuchsiaGymRocker1BattleText": [
+ 44,
+ 20292
+ ],
+ "_FuchsiaGymRocker1EndBattleText": [
+ 44,
+ 20390
+ ],
+ "_FuchsiaGymRocker2AfterBattleText": [
+ 44,
+ 20524
+ ],
+ "_FuchsiaGymRocker2BattleText": [
+ 44,
+ 20459
+ ],
+ "_FuchsiaGymRocker2EndBattleText": [
+ 44,
+ 20510
+ ],
+ "_FuchsiaGymRocker3AfterBattleText": [
+ 44,
+ 20640
+ ],
+ "_FuchsiaGymRocker3BattleText": [
+ 44,
+ 20578
+ ],
+ "_FuchsiaGymRocker3EndBattleText": [
+ 44,
+ 20620
+ ],
+ "_FuchsiaGymRocker4AfterBattleText": [
+ 44,
+ 20785
+ ],
+ "_FuchsiaGymRocker4BattleText": [
+ 44,
+ 20706
+ ],
+ "_FuchsiaGymRocker4EndBattleText": [
+ 44,
+ 20766
+ ],
+ "_FuchsiaGymRocker5AfterBattleText": [
+ 44,
+ 20973
+ ],
+ "_FuchsiaGymRocker5BattleText": [
+ 44,
+ 20869
+ ],
+ "_FuchsiaGymRocker5EndBattleText": [
+ 44,
+ 20966
+ ],
+ "_FuchsiaGymRocker6AfterBattleText": [
+ 44,
+ 21095
+ ],
+ "_FuchsiaGymRocker6BattleText": [
+ 44,
+ 21002
+ ],
+ "_FuchsiaGymRocker6EndBattleText": [
+ 44,
+ 21076
+ ],
+ "_FuchsiaMartCooltrainerFText": [
+ 44,
+ 17548
+ ],
+ "_FuchsiaMartMiddleAgedManText": [
+ 44,
+ 17484
+ ],
+ "_FuchsiaMeetingRoomSafariZoneWorker1": [
+ 44,
+ 21381
+ ],
+ "_FuchsiaMeetingRoomSafariZoneWorker2": [
+ 44,
+ 21450
+ ],
+ "_FuchsiaMeetingRoomSafariZoneWorker3": [
+ 44,
+ 21542
+ ],
+ "_FuchsiaPokecenterCooltrainerFText": [
+ 44,
+ 17916
+ ],
+ "_FuchsiaPokecenterRockerText": [
+ 44,
+ 17829
+ ],
+ "_FullHealText": [
+ 40,
+ 16932
+ ],
+ "_FullyParalyzedText": [
+ 39,
+ 30750
+ ],
+ "_GainedText": [
+ 39,
+ 31404
+ ],
+ "_GameCornerBeauty1Text": [
+ 43,
+ 29941
+ ],
+ "_GameCornerBeauty2Text": [
+ 43,
+ 30337
+ ],
+ "_GameCornerClerkCantAffordTheCoinsText": [
+ 43,
+ 30181
+ ],
+ "_GameCornerClerkCoinCaseIsFullText": [
+ 43,
+ 30209
+ ],
+ "_GameCornerClerkDoYouNeedSomeGameCoinsText": [
+ 43,
+ 30010
+ ],
+ "_GameCornerClerkDontHaveCoinCaseText": [
+ 43,
+ 30240
+ ],
+ "_GameCornerClerkPleaseComePlaySometimeText": [
+ 43,
+ 30149
+ ],
+ "_GameCornerClerkThanksHereAre50CoinsText": [
+ 43,
+ 30116
+ ],
+ "_GameCornerCoinCaseText": [
+ 39,
+ 27148
+ ],
+ "_GameCornerFishingGuru1DontNeedMyCoinsText": [
+ 43,
+ 30432
+ ],
+ "_GameCornerFishingGuru1Received10CoinsText": [
+ 43,
+ 30409
+ ],
+ "_GameCornerFishingGuru1WantToPlayText": [
+ 43,
+ 30382
+ ],
+ "_GameCornerFishingGuru1WinsComeAndGoText": [
+ 43,
+ 30457
+ ],
+ "_GameCornerFishingGuru2CloselyWatchTheReelsText": [
+ 43,
+ 31037
+ ],
+ "_GameCornerFishingGuru2Received20CoinsText": [
+ 43,
+ 30987
+ ],
+ "_GameCornerFishingGuru2ThrowingMeOffText": [
+ 43,
+ 30925
+ ],
+ "_GameCornerFishingGuru2YouGotYourOwnCoinsText": [
+ 43,
+ 31010
+ ],
+ "_GameCornerGamblerText": [
+ 43,
+ 30758
+ ],
+ "_GameCornerGymGuideChampInMakingText": [
+ 43,
+ 30513
+ ],
+ "_GameCornerGymGuideTheyOfferRarePokemonText": [
+ 43,
+ 30668
+ ],
+ "_GameCornerMiddleAgedMan1Text": [
+ 43,
+ 30268
+ ],
+ "_GameCornerMiddleAgedMan2INeedMoreCoinsText": [
+ 43,
+ 30879
+ ],
+ "_GameCornerMiddleAgedMan2Received20CoinsText": [
+ 43,
+ 30831
+ ],
+ "_GameCornerMiddleAgedMan2WantSomeCoinsText": [
+ 43,
+ 30803
+ ],
+ "_GameCornerMiddleAgedMan2YouHaveLotsOfCoinsText": [
+ 43,
+ 30854
+ ],
+ "_GameCornerMiddleAgedWomanText": [
+ 43,
+ 30484
+ ],
+ "_GameCornerNoCoinsText": [
+ 39,
+ 27174
+ ],
+ "_GameCornerOopsForgotCoinCaseText": [
+ 44,
+ 16384
+ ],
+ "_GameCornerOutOfOrderText": [
+ 39,
+ 27200
+ ],
+ "_GameCornerOutToLunchText": [
+ 39,
+ 27230
+ ],
+ "_GameCornerPosterSwitchBehindPosterText": [
+ 43,
+ 31184
+ ],
+ "_GameCornerPrizeRoomBaldingGuyText": [
+ 44,
+ 16644
+ ],
+ "_GameCornerPrizeRoomGamblerText": [
+ 44,
+ 16706
+ ],
+ "_GameCornerRocketAfterBattleText": [
+ 43,
+ 31130
+ ],
+ "_GameCornerRocketBattleEndText": [
+ 43,
+ 31123
+ ],
+ "_GameCornerRocketImGuardingThisPosterText": [
+ 43,
+ 31079
+ ],
+ "_GameCornerSomeonesKeysText": [
+ 39,
+ 27262
+ ],
+ "_GameOverText": [
+ 39,
+ 25953
+ ],
+ "_GameSavedText": [
+ 41,
+ 30301
+ ],
+ "_GastlyDexEntry": [
+ 46,
+ 25244
+ ],
+ "_GengarDexEntry": [
+ 46,
+ 25447
+ ],
+ "_GeodudeDexEntry": [
+ 46,
+ 23507
+ ],
+ "_GetDexRatedText": [
+ 40,
+ 18180
+ ],
+ "_GetOutText": [
+ 39,
+ 30669
+ ],
+ "_GetmText": [
+ 40,
+ 16510
+ ],
+ "_GettingPumpedText": [
+ 42,
+ 17140
+ ],
+ "_GhostCantBeIDdText": [
+ 40,
+ 16463
+ ],
+ "_GloomDexEntry": [
+ 46,
+ 20544
+ ],
+ "_GoText": [
+ 40,
+ 16493
+ ],
+ "_GolbatDexEntry": [
+ 46,
+ 20340
+ ],
+ "_GoldeenDexEntry": [
+ 46,
+ 27802
+ ],
+ "_GolduckDexEntry": [
+ 46,
+ 21661
+ ],
+ "_GolemDexEntry": [
+ 46,
+ 23699
+ ],
+ "_GoodText": [
+ 40,
+ 16574
+ ],
+ "_GotAwayText": [
+ 39,
+ 30455
+ ],
+ "_GotMapText": [
+ 42,
+ 17871
+ ],
+ "_GotMonText": [
+ 45,
+ 16875
+ ],
+ "_GotOffBicycleText1": [
+ 45,
+ 28306
+ ],
+ "_GotOffBicycleText2": [
+ 45,
+ 28318
+ ],
+ "_GotOnBicycleText1": [
+ 45,
+ 28285
+ ],
+ "_GotOnBicycleText2": [
+ 45,
+ 28300
+ ],
+ "_GravelerDexEntry": [
+ 46,
+ 23597
+ ],
+ "_GreatlyFellText": [
+ 42,
+ 16579
+ ],
+ "_GreatlyRoseText": [
+ 42,
+ 16549
+ ],
+ "_GrewLevelText": [
+ 39,
+ 31467
+ ],
+ "_GrimerDexEntry": [
+ 46,
+ 24875
+ ],
+ "_GroundRoseText": [
+ 38,
+ 16534
+ ],
+ "_GrowlitheDexEntry": [
+ 46,
+ 21948
+ ],
+ "_GyaradosDexEntry": [
+ 46,
+ 29001
+ ],
+ "_GymStatueText1": [
+ 39,
+ 24638
+ ],
+ "_GymStatueText2": [
+ 39,
+ 24686
+ ],
+ "_HMCantDeleteText": [
+ 44,
+ 30546
+ ],
+ "_HallOfFameOakText": [
+ 39,
+ 20654
+ ],
+ "_HasSubstituteText": [
+ 42,
+ 16974
+ ],
+ "_HaunterDexEntry": [
+ 46,
+ 25349
+ ],
+ "_HereYouGoText": [
+ 40,
+ 18062
+ ],
+ "_HiddenItemBagFullText": [
+ 39,
+ 29625
+ ],
+ "_HisNameIsText": [
+ 40,
+ 18911
+ ],
+ "_HitWithRecoilText": [
+ 42,
+ 17060
+ ],
+ "_HitXTimesText": [
+ 39,
+ 31385
+ ],
+ "_HitmonchanDexEntry": [
+ 46,
+ 26708
+ ],
+ "_HitmonleeDexEntry": [
+ 46,
+ 26609
+ ],
+ "_HookedMonAttackedText": [
+ 39,
+ 31611
+ ],
+ "_HorseaDexEntry": [
+ 46,
+ 27602
+ ],
+ "_HurtByBurnText": [
+ 39,
+ 30069
+ ],
+ "_HurtByLeechSeedText": [
+ 39,
+ 30091
+ ],
+ "_HurtByPoisonText": [
+ 39,
+ 30049
+ ],
+ "_HurtItselfText": [
+ 39,
+ 30840
+ ],
+ "_HypnoDexEntry": [
+ 46,
+ 25726
+ ],
+ "_IceHealText": [
+ 40,
+ 16898
+ ],
+ "_IgnoredOrdersText": [
+ 39,
+ 31260
+ ],
+ "_IndigoPlateauHQText": [
+ 39,
+ 28089
+ ],
+ "_IndigoPlateauLobbyCooltrainerFText": [
+ 44,
+ 25492
+ ],
+ "_IndigoPlateauLobbyGymGuideText": [
+ 44,
+ 25337
+ ],
+ "_IndigoPlateauStatuesText1": [
+ 39,
+ 29743
+ ],
+ "_IndigoPlateauStatuesText2": [
+ 39,
+ 29759
+ ],
+ "_IndigoPlateauStatuesText3": [
+ 39,
+ 29806
+ ],
+ "_IntoText": [
+ 41,
+ 30460
+ ],
+ "_IntroducePlayerText": [
+ 40,
+ 18606
+ ],
+ "_IntroduceRivalText": [
+ 40,
+ 18633
+ ],
+ "_IsConfusedText": [
+ 39,
+ 30824
+ ],
+ "_IsEvolvingText": [
+ 42,
+ 16384
+ ],
+ "_IsFrozenText": [
+ 39,
+ 30730
+ ],
+ "_IsItOKToTossItemText": [
+ 45,
+ 28349
+ ],
+ "_IsUnaffectedText": [
+ 42,
+ 16896
+ ],
+ "_ItemUseBallText00": [
+ 45,
+ 27097
+ ],
+ "_ItemUseBallText01": [
+ 45,
+ 27151
+ ],
+ "_ItemUseBallText02": [
+ 45,
+ 27173
+ ],
+ "_ItemUseBallText03": [
+ 45,
+ 27201
+ ],
+ "_ItemUseBallText04": [
+ 45,
+ 27234
+ ],
+ "_ItemUseBallText05": [
+ 45,
+ 27263
+ ],
+ "_ItemUseBallText06": [
+ 45,
+ 27365
+ ],
+ "_ItemUseBallText07": [
+ 45,
+ 27294
+ ],
+ "_ItemUseBallText08": [
+ 45,
+ 27328
+ ],
+ "_ItemUseNoEffectText": [
+ 45,
+ 28075
+ ],
+ "_ItemUseNotTimeText": [
+ 45,
+ 28008
+ ],
+ "_ItemUseNotYoursToUseText": [
+ 45,
+ 28050
+ ],
+ "_ItemUseText001": [
+ 45,
+ 28270
+ ],
+ "_ItemUseText002": [
+ 45,
+ 28279
+ ],
+ "_ItemWasStoredText": [
+ 40,
+ 17262
+ ],
+ "_ItemfinderFoundItemText": [
+ 45,
+ 27665
+ ],
+ "_ItemfinderFoundNothingText": [
+ 45,
+ 27715
+ ],
+ "_ItemsCantBeUsedHereText": [
+ 39,
+ 30491
+ ],
+ "_ItsABiteText": [
+ 38,
+ 16514
+ ],
+ "_IvysaurDexEntry": [
+ 46,
+ 16479
+ ],
+ "_JigglypuffDexEntry": [
+ 46,
+ 20031
+ ],
+ "_JolteonDexEntry": [
+ 46,
+ 29495
+ ],
+ "_JustAMomentText": [
+ 39,
+ 27294
+ ],
+ "_JynxDexEntry": [
+ 46,
+ 28402
+ ],
+ "_KabutoDexEntry": [
+ 46,
+ 29992
+ ],
+ "_KabutopsDexEntry": [
+ 46,
+ 30094
+ ],
+ "_KabutopsFossilText": [
+ 39,
+ 28294
+ ],
+ "_KadabraDexEntry": [
+ 46,
+ 22525
+ ],
+ "_KakunaDexEntry": [
+ 46,
+ 17616
+ ],
+ "_KangaskhanDexEntry": [
+ 46,
+ 27511
+ ],
+ "_KeptGoingAndCrashedText": [
+ 39,
+ 31091
+ ],
+ "_KinglerDexEntry": [
+ 46,
+ 25922
+ ],
+ "_KoffingDexEntry": [
+ 46,
+ 26918
+ ],
+ "_KrabbyDexEntry": [
+ 46,
+ 25824
+ ],
+ "_LancesRoomLanceAfterBattleText": [
+ 39,
+ 20375
+ ],
+ "_LancesRoomLanceBeforeBattleText": [
+ 39,
+ 20020
+ ],
+ "_LancesRoomLanceEndBattleText": [
+ 39,
+ 20317
+ ],
+ "_LaprasDexEntry": [
+ 46,
+ 29101
+ ],
+ "_LavenderCuboneHouseBrunetteGirlGhostIsGoneText": [
+ 43,
+ 20222
+ ],
+ "_LavenderCuboneHouseBrunetteGirlPoorCubonesMotherText": [
+ 43,
+ 20113
+ ],
+ "_LavenderCuboneHouseCuboneText": [
+ 43,
+ 20093
+ ],
+ "_LavenderMartBaldingGuyText": [
+ 43,
+ 19785
+ ],
+ "_LavenderMartCooltrainerMNuggetText": [
+ 43,
+ 20008
+ ],
+ "_LavenderMartCooltrainerMReviveText": [
+ 43,
+ 19961
+ ],
+ "_LavenderPokecenterGentlemanText": [
+ 43,
+ 16612
+ ],
+ "_LavenderPokecenterGuyText": [
+ 39,
+ 24911
+ ],
+ "_LavenderPokecenterLittleGirlText": [
+ 43,
+ 16664
+ ],
+ "_LavenderTownCooltrainerMText": [
+ 45,
+ 22094
+ ],
+ "_LavenderTownLittleGirlDoYouBelieveInGhostsText": [
+ 45,
+ 21962
+ ],
+ "_LavenderTownLittleGirlHaHaGuessNotText": [
+ 45,
+ 22024
+ ],
+ "_LavenderTownLittleGirlSoThereAreBelieversText": [
+ 45,
+ 21989
+ ],
+ "_LavenderTownPokemonHouseSignText": [
+ 45,
+ 22373
+ ],
+ "_LavenderTownPokemonTowerSignText": [
+ 45,
+ 22404
+ ],
+ "_LavenderTownSignText": [
+ 45,
+ 22275
+ ],
+ "_LavenderTownSilphScopeSignText": [
+ 45,
+ 22312
+ ],
+ "_LavenderTownSuperNerdText": [
+ 45,
+ 22183
+ ],
+ "_LearnedMove1Text": [
+ 44,
+ 30272
+ ],
+ "_LickitungDexEntry": [
+ 46,
+ 26814
+ ],
+ "_LightScreenProtectedText": [
+ 42,
+ 17263
+ ],
+ "_LinedUpText": [
+ 39,
+ 24527
+ ],
+ "_LinkBattleLostText": [
+ 39,
+ 30282
+ ],
+ "_LinkCableHelpText1": [
+ 39,
+ 28377
+ ],
+ "_LinkCableHelpText2": [
+ 39,
+ 28415
+ ],
+ "_LinkCableInfoText1": [
+ 39,
+ 28451
+ ],
+ "_LinkCableInfoText2": [
+ 39,
+ 28565
+ ],
+ "_LinkCableInfoText3": [
+ 39,
+ 28608
+ ],
+ "_LoafingAroundText": [
+ 39,
+ 31183
+ ],
+ "_LooksContentText": [
+ 44,
+ 30768
+ ],
+ "_LoreleisRoomLoreleiAfterBattleText": [
+ 39,
+ 22477
+ ],
+ "_LoreleisRoomLoreleiBeforeBattleText": [
+ 39,
+ 22249
+ ],
+ "_LoreleisRoomLoreleiDontRunAwayText": [
+ 39,
+ 22563
+ ],
+ "_LoreleisRoomLoreleiEndBattleText": [
+ 39,
+ 22462
+ ],
+ "_LoweredItsHeadText": [
+ 42,
+ 16701
+ ],
+ "_MachampDexEntry": [
+ 46,
+ 22919
+ ],
+ "_MachokeDexEntry": [
+ 46,
+ 22825
+ ],
+ "_MachopDexEntry": [
+ 46,
+ 22719
+ ],
+ "_MadeWhirlwindText": [
+ 42,
+ 16661
+ ],
+ "_MagazinesText": [
+ 39,
+ 26706
+ ],
+ "_MagikarpDexEntry": [
+ 46,
+ 28897
+ ],
+ "_MagmarDexEntry": [
+ 46,
+ 28601
+ ],
+ "_MagnemiteDexEntry": [
+ 46,
+ 24190
+ ],
+ "_MagnetonDexEntry": [
+ 46,
+ 24290
+ ],
+ "_MankeyDexEntry": [
+ 46,
+ 21759
+ ],
+ "_MarowakDexEntry": [
+ 46,
+ 26512
+ ],
+ "_MartSignText": [
+ 38,
+ 16594
+ ],
+ "_MeowthDexEntry": [
+ 46,
+ 21354
+ ],
+ "_MetapodDexEntry": [
+ 46,
+ 17331
+ ],
+ "_MewDexEntry": [
+ 46,
+ 31050
+ ],
+ "_MewtwoBattleText": [
+ 39,
+ 19818
+ ],
+ "_MewtwoDexEntry": [
+ 46,
+ 30955
+ ],
+ "_MimicLearnedMoveText": [
+ 42,
+ 16785
+ ],
+ "_MirrorMoveFailedText": [
+ 39,
+ 31360
+ ],
+ "_MoltresDexEntry": [
+ 46,
+ 30571
+ ],
+ "_MonCannotLearnMachineMoveText": [
+ 45,
+ 27952
+ ],
+ "_MonIsTakenOutText": [
+ 40,
+ 17731
+ ],
+ "_MonWasReleasedText": [
+ 40,
+ 17935
+ ],
+ "_MonWasStoredText": [
+ 40,
+ 17635
+ ],
+ "_MoneyForWinningText": [
+ 39,
+ 30133
+ ],
+ "_MonsStatsFellText": [
+ 42,
+ 16568
+ ],
+ "_MonsStatsRoseText": [
+ 42,
+ 16538
+ ],
+ "_MoveDisabledText": [
+ 39,
+ 30565
+ ],
+ "_MoveIsDisabledText": [
+ 39,
+ 30995
+ ],
+ "_MoveNameText": [
+ 39,
+ 31052
+ ],
+ "_MoveNoPPText": [
+ 39,
+ 30538
+ ],
+ "_MoveWasDisabledText": [
+ 42,
+ 16803
+ ],
+ "_MrFujisHouseLittleGirlPokemonAreNiceToHugText": [
+ 43,
+ 19344
+ ],
+ "_MrFujisHouseLittleGirlThisIsMrFujisHouseText": [
+ 43,
+ 19251
+ ],
+ "_MrFujisHouseMrFujiHasMyFluteHelpedYouText": [
+ 43,
+ 19660
+ ],
+ "_MrFujisHouseMrFujiIThinkThisMayHelpYourQuestText": [
+ 43,
+ 19420
+ ],
+ "_MrFujisHouseMrFujiPokeFluteExplanationText": [
+ 43,
+ 19542
+ ],
+ "_MrFujisHouseMrFujiPokeFluteNoRoomText": [
+ 43,
+ 19630
+ ],
+ "_MrFujisHouseMrFujiPokedexText": [
+ 43,
+ 19695
+ ],
+ "_MrFujisHouseMrFujiReceivedPokeFluteText": [
+ 43,
+ 19520
+ ],
+ "_MrFujisHouseNidorinoText": [
+ 43,
+ 19402
+ ],
+ "_MrFujisHousePsyduckText": [
+ 43,
+ 19383
+ ],
+ "_MrFujisHouseSuperNerdMrFujiHadBeenPrayingText": [
+ 43,
+ 19199
+ ],
+ "_MrFujisHouseSuperNerdMrFujiIsntHereText": [
+ 43,
+ 19154
+ ],
+ "_MrMimeDexEntry": [
+ 46,
+ 28201
+ ],
+ "_MrPsychicsHouseMrPsychicReceivedTM29Text": [
+ 44,
+ 29736
+ ],
+ "_MrPsychicsHouseMrPsychicTM29ExplanationText": [
+ 44,
+ 29756
+ ],
+ "_MrPsychicsHouseMrPsychicTM29NoRoomText": [
+ 44,
+ 29818
+ ],
+ "_MrPsychicsHouseMrPsychicYouWantedThisText": [
+ 44,
+ 29692
+ ],
+ "_MtMoon1FBewareZubatSign": [
+ 38,
+ 18986
+ ],
+ "_MtMoon1FCooltrainerF1AfterBattleText": [
+ 38,
+ 18552
+ ],
+ "_MtMoon1FCooltrainerF1BattleText": [
+ 38,
+ 18491
+ ],
+ "_MtMoon1FCooltrainerF1EndBattleText": [
+ 38,
+ 18536
+ ],
+ "_MtMoon1FCooltrainerF2AfterBattleText": [
+ 38,
+ 18717
+ ],
+ "_MtMoon1FCooltrainerF2BattleText": [
+ 38,
+ 18658
+ ],
+ "_MtMoon1FCooltrainerF2EndBattleText": [
+ 38,
+ 18708
+ ],
+ "_MtMoon1FHikerAfterBattleText": [
+ 38,
+ 18372
+ ],
+ "_MtMoon1FHikerBattleText": [
+ 38,
+ 18306
+ ],
+ "_MtMoon1FHikerEndBattleText": [
+ 38,
+ 18351
+ ],
+ "_MtMoon1FSuperNerdAfterBattleText": [
+ 38,
+ 18627
+ ],
+ "_MtMoon1FSuperNerdBattleText": [
+ 38,
+ 18581
+ ],
+ "_MtMoon1FSuperNerdEndBattleText": [
+ 38,
+ 18609
+ ],
+ "_MtMoon1FYoungster1AfterBattleText": [
+ 38,
+ 18451
+ ],
+ "_MtMoon1FYoungster1BattleText": [
+ 38,
+ 18405
+ ],
+ "_MtMoon1FYoungster1EndBattleText": [
+ 38,
+ 18435
+ ],
+ "_MtMoon1FYoungster2AfterBattleText": [
+ 38,
+ 18827
+ ],
+ "_MtMoon1FYoungster2BattleText": [
+ 38,
+ 18765
+ ],
+ "_MtMoon1FYoungster2EndBattleText": [
+ 38,
+ 18814
+ ],
+ "_MtMoon1FYoungster3AfterBattleText": [
+ 38,
+ 18929
+ ],
+ "_MtMoon1FYoungster3BattleText": [
+ 38,
+ 18873
+ ],
+ "_MtMoon1FYoungster3EndBattleText": [
+ 38,
+ 18920
+ ],
+ "_MtMoonB1FUnusedText": [
+ 38,
+ 19019
+ ],
+ "_MtMoonB2FDomeFossilYouWantText": [
+ 38,
+ 19173
+ ],
+ "_MtMoonB2FHelixFossilYouWantText": [
+ 38,
+ 19200
+ ],
+ "_MtMoonB2FReceivedFossilText": [
+ 38,
+ 19228
+ ],
+ "_MtMoonB2FRocket2AfterBattleText": [
+ 38,
+ 19564
+ ],
+ "_MtMoonB2FRocket2BattleText": [
+ 38,
+ 19514
+ ],
+ "_MtMoonB2FRocket2EndBattleText": [
+ 38,
+ 19552
+ ],
+ "_MtMoonB2FRocket3AfterBattleText": [
+ 38,
+ 19677
+ ],
+ "_MtMoonB2FRocket3BattleText": [
+ 38,
+ 19613
+ ],
+ "_MtMoonB2FRocket3EndBattleText": [
+ 38,
+ 19658
+ ],
+ "_MtMoonB2FRocket4AfterBattleText": [
+ 38,
+ 19781
+ ],
+ "_MtMoonB2FRocket4BattleText": [
+ 38,
+ 19725
+ ],
+ "_MtMoonB2FRocket4EndBattleText": [
+ 38,
+ 19768
+ ],
+ "_MtMoonB2FSuperNerdOkIllShareText": [
+ 38,
+ 19336
+ ],
+ "_MtMoonB2FSuperNerdThenThisIsMineText": [
+ 38,
+ 19482
+ ],
+ "_MtMoonB2FSuperNerdTheresAPokemonLabText": [
+ 38,
+ 19390
+ ],
+ "_MtMoonB2FSuperNerdTheyreBothMineText": [
+ 38,
+ 19283
+ ],
+ "_MtMoonB2FYouHaveNoRoomText": [
+ 38,
+ 19247
+ ],
+ "_MtMoonB2fSuperNerdEachTakeOneText": [
+ 38,
+ 19352
+ ],
+ "_MtMoonJessieJamesText1": [
+ 38,
+ 19021
+ ],
+ "_MtMoonJessieJamesText2": [
+ 38,
+ 19041
+ ],
+ "_MtMoonJessieJamesText3": [
+ 38,
+ 19108
+ ],
+ "_MtMoonJessieJamesText4": [
+ 38,
+ 19125
+ ],
+ "_MtMoonPokecenterBenchGuyText": [
+ 39,
+ 24971
+ ],
+ "_MtMoonPokecenterClipboardText": [
+ 40,
+ 20352
+ ],
+ "_MtMoonPokecenterGentlemanText": [
+ 40,
+ 20275
+ ],
+ "_MtMoonPokecenterMagikarpSalesmanIGotADealText": [
+ 40,
+ 20354
+ ],
+ "_MtMoonPokecenterMagikarpSalesmanNoMoneyText": [
+ 40,
+ 20515
+ ],
+ "_MtMoonPokecenterMagikarpSalesmanNoRefundsText": [
+ 40,
+ 20549
+ ],
+ "_MtMoonPokecenterMagikarpSalesmanNoText": [
+ 40,
+ 20472
+ ],
+ "_MtMoonPokecenterYoungsterText": [
+ 40,
+ 20213
+ ],
+ "_MukDexEntry": [
+ 46,
+ 24966
+ ],
+ "_MultiHitText": [
+ 39,
+ 30612
+ ],
+ "_Museum1FGamblerText": [
+ 42,
+ 25066
+ ],
+ "_Museum1FOldAmberText": [
+ 42,
+ 25467
+ ],
+ "_Museum1FScientist1AmberIsFossilizedTreeSapText": [
+ 42,
+ 24973
+ ],
+ "_Museum1FScientist1ComeAgainText": [
+ 42,
+ 24707
+ ],
+ "_Museum1FScientist1DoYouKnowWhatAmberIsText": [
+ 42,
+ 24830
+ ],
+ "_Museum1FScientist1DontHaveEnoughMoneyText": [
+ 42,
+ 24801
+ ],
+ "_Museum1FScientist1GoToOtherSideText": [
+ 42,
+ 25006
+ ],
+ "_Museum1FScientist1TakePlentyOfTimeText": [
+ 42,
+ 25036
+ ],
+ "_Museum1FScientist1ThankYouText": [
+ 42,
+ 24777
+ ],
+ "_Museum1FScientist1TheresALabSomewhereText": [
+ 42,
+ 24904
+ ],
+ "_Museum1FScientist1WouldYouLikeToComeInText": [
+ 42,
+ 24720
+ ],
+ "_Museum1FScientist2GetTheOldAmberCheckText": [
+ 42,
+ 25344
+ ],
+ "_Museum1FScientist2ReceivedOldAmberText": [
+ 42,
+ 25320
+ ],
+ "_Museum1FScientist2TakeThisToAPokemonLabText": [
+ 42,
+ 25099
+ ],
+ "_Museum1FScientist2YouDontHaveSpaceText": [
+ 42,
+ 25377
+ ],
+ "_Museum1FScientist3Text": [
+ 42,
+ 25408
+ ],
+ "_Museum2FBrunetteGirlText": [
+ 42,
+ 25639
+ ],
+ "_Museum2FGrampsText": [
+ 42,
+ 25537
+ ],
+ "_Museum2FHikerText": [
+ 42,
+ 25705
+ ],
+ "_Museum2FMoonStoneSignText": [
+ 42,
+ 25890
+ ],
+ "_Museum2FPikachuText1": [
+ 42,
+ 25739
+ ],
+ "_Museum2FPikachuText2": [
+ 42,
+ 25799
+ ],
+ "_Museum2FScientistText": [
+ 42,
+ 25609
+ ],
+ "_Museum2FSpaceShuttleSignText": [
+ 42,
+ 25866
+ ],
+ "_Museum2FYoungsterText": [
+ 42,
+ 25497
+ ],
+ "_MustRechargeText": [
+ 39,
+ 30784
+ ],
+ "_NameRatersHouseNameRaterATrulyImpeccableNameText": [
+ 43,
+ 20657
+ ],
+ "_NameRatersHouseNameRaterComeAnyTimeYouLikeText": [
+ 43,
+ 20625
+ ],
+ "_NameRatersHouseNameRaterGiveItANiceNameText": [
+ 43,
+ 20420
+ ],
+ "_NameRatersHouseNameRaterPokemonHasBeenRenamedText": [
+ 43,
+ 20553
+ ],
+ "_NameRatersHouseNameRaterWantMeToRateText": [
+ 43,
+ 20301
+ ],
+ "_NameRatersHouseNameRaterWhatShouldWeNameItText": [
+ 43,
+ 20522
+ ],
+ "_NameRatersHouseNameRaterWhichPokemonText": [
+ 43,
+ 20390
+ ],
+ "_NeedYourPokemonText": [
+ 44,
+ 30675
+ ],
+ "_NewBadgeRequiredText": [
+ 45,
+ 16686
+ ],
+ "_NewBicycleText": [
+ 39,
+ 25775
+ ],
+ "_NidokingDexEntry": [
+ 46,
+ 19541
+ ],
+ "_NidoqueenDexEntry": [
+ 46,
+ 19248
+ ],
+ "_NidoranFDexEntry": [
+ 46,
+ 19063
+ ],
+ "_NidoranMDexEntry": [
+ 46,
+ 19341
+ ],
+ "_NidorinaDexEntry": [
+ 46,
+ 19153
+ ],
+ "_NidorinoDexEntry": [
+ 46,
+ 19442
+ ],
+ "_NinetalesDexEntry": [
+ 46,
+ 19939
+ ],
+ "_NoCyclingAllowedHereText": [
+ 45,
+ 28150
+ ],
+ "_NoEffectText": [
+ 42,
+ 16846
+ ],
+ "_NoMonText": [
+ 40,
+ 17761
+ ],
+ "_NoMoreRoomForItemText": [
+ 38,
+ 16682
+ ],
+ "_NoMovesLeftText": [
+ 39,
+ 30588
+ ],
+ "_NoNibbleText": [
+ 38,
+ 16461
+ ],
+ "_NoPokemonText": [
+ 40,
+ 19575
+ ],
+ "_NoRoomToStoreText": [
+ 40,
+ 17316
+ ],
+ "_NoRunningText": [
+ 39,
+ 30409
+ ],
+ "_NoSurfingHereText": [
+ 45,
+ 28176
+ ],
+ "_NoTrade1Text": [
+ 45,
+ 28537
+ ],
+ "_NoTrade2Text": [
+ 45,
+ 28707
+ ],
+ "_NoTrade3Text": [
+ 45,
+ 28897
+ ],
+ "_NoWillText": [
+ 39,
+ 30369
+ ],
+ "_NotEnoughCoinsSlotMachineText": [
+ 39,
+ 24493
+ ],
+ "_NotEnoughMemoryText": [
+ 40,
+ 18327
+ ],
+ "_NotHealthyEnoughText": [
+ 45,
+ 16665
+ ],
+ "_NotThisTimeText": [
+ 39,
+ 24559
+ ],
+ "_NotVeryEffectiveText": [
+ 39,
+ 31517
+ ],
+ "_NothingHappenedText": [
+ 42,
+ 16827
+ ],
+ "_NothingHereText": [
+ 38,
+ 16481
+ ],
+ "_NothingStoredText": [
+ 40,
+ 17405
+ ],
+ "_NothingToCutText": [
+ 45,
+ 29030
+ ],
+ "_NothingToDepositText": [
+ 40,
+ 17286
+ ],
+ "_NurseChanseyText": [
+ 38,
+ 17181
+ ],
+ "_OHKOText": [
+ 39,
+ 31170
+ ],
+ "_OKExclamationText": [
+ 40,
+ 16568
+ ],
+ "_OakLabEmailText": [
+ 39,
+ 26897
+ ],
+ "_OakSpeechText1": [
+ 40,
+ 18362
+ ],
+ "_OakSpeechText2A": [
+ 40,
+ 18452
+ ],
+ "_OakSpeechText2B": [
+ 40,
+ 18504
+ ],
+ "_OakSpeechText3": [
+ 40,
+ 18732
+ ],
+ "_OaksAideComeBackText": [
+ 38,
+ 16976
+ ],
+ "_OaksAideGotItemText": [
+ 38,
+ 17113
+ ],
+ "_OaksAideHereYouGoText": [
+ 38,
+ 17036
+ ],
+ "_OaksAideHiText": [
+ 38,
+ 16707
+ ],
+ "_OaksAideNoRoomText": [
+ 38,
+ 17132
+ ],
+ "_OaksAideUhOhText": [
+ 38,
+ 16868
+ ],
+ "_OaksLabGirlText": [
+ 42,
+ 19274
+ ],
+ "_OaksLabGivePokeballsExplanationText": [
+ 42,
+ 18878
+ ],
+ "_OaksLabOak1ComeSeeMeSometimesText": [
+ 42,
+ 19069
+ ],
+ "_OaksLabOak1DeliverParcelText": [
+ 42,
+ 18434
+ ],
+ "_OaksLabOak1GoAheadItsYours": [
+ 42,
+ 18260
+ ],
+ "_OaksLabOak1HowIsYourPokedexComingText": [
+ 42,
+ 19144
+ ],
+ "_OaksLabOak1ParcelThanksText": [
+ 42,
+ 18600
+ ],
+ "_OaksLabOak1PokemonAroundTheWorldText": [
+ 42,
+ 18705
+ ],
+ "_OaksLabOak1ReceivedPokeballsText": [
+ 42,
+ 18745
+ ],
+ "_OaksLabOak1YouShouldTalkToIt": [
+ 42,
+ 18384
+ ],
+ "_OaksLabOak1YourPokemonCanFightText": [
+ 42,
+ 18287
+ ],
+ "_OaksLabOak2Text": [
+ 42,
+ 19271
+ ],
+ "_OaksLabOakBePatientText": [
+ 42,
+ 19650
+ ],
+ "_OaksLabOakChooseMonText": [
+ 42,
+ 19390
+ ],
+ "_OaksLabOakDontGoAwayYetText": [
+ 42,
+ 20051
+ ],
+ "_OaksLabOakGivesText": [
+ 42,
+ 19922
+ ],
+ "_OaksLabOakGotPokedexText": [
+ 42,
+ 20786
+ ],
+ "_OaksLabOakIHaveARequestText": [
+ 42,
+ 20578
+ ],
+ "_OaksLabOakMyInventionPokedexText": [
+ 42,
+ 20656
+ ],
+ "_OaksLabOakThatWasMyDreamText": [
+ 42,
+ 20844
+ ],
+ "_OaksLabPikachuDislikesPokeballsText1": [
+ 42,
+ 20298
+ ],
+ "_OaksLabPikachuDislikesPokeballsText2": [
+ 42,
+ 20310
+ ],
+ "_OaksLabPokedexText": [
+ 42,
+ 19221
+ ],
+ "_OaksLabReceivedText": [
+ 42,
+ 20029
+ ],
+ "_OaksLabRivalAmIGreatOrWhatText": [
+ 42,
+ 20189
+ ],
+ "_OaksLabRivalFedUpWithWaitingText": [
+ 42,
+ 19354
+ ],
+ "_OaksLabRivalGrampsIsntAroundText": [
+ 42,
+ 18063
+ ],
+ "_OaksLabRivalGrampsText": [
+ 42,
+ 20512
+ ],
+ "_OaksLabRivalIPickedTheWrongPokemonText": [
+ 42,
+ 20143
+ ],
+ "_OaksLabRivalIllGetABetterPokemonThanYou": [
+ 42,
+ 18139
+ ],
+ "_OaksLabRivalIllTakeYouOnText": [
+ 42,
+ 20080
+ ],
+ "_OaksLabRivalLeaveItAllToMeText": [
+ 42,
+ 21065
+ ],
+ "_OaksLabRivalMyPokemonHasGrownStrongerText": [
+ 42,
+ 20524
+ ],
+ "_OaksLabRivalMyPokemonLooksStrongerText": [
+ 42,
+ 18182
+ ],
+ "_OaksLabRivalSmellYouLaterText": [
+ 42,
+ 20219
+ ],
+ "_OaksLabRivalTakesText1": [
+ 42,
+ 19695
+ ],
+ "_OaksLabRivalTakesText2": [
+ 42,
+ 19728
+ ],
+ "_OaksLabRivalTakesText3": [
+ 42,
+ 19751
+ ],
+ "_OaksLabRivalTakesText4": [
+ 42,
+ 19780
+ ],
+ "_OaksLabRivalTakesText5": [
+ 42,
+ 19809
+ ],
+ "_OaksLabRivalWhatAboutMeText": [
+ 42,
+ 19618
+ ],
+ "_OaksLabScientistText": [
+ 42,
+ 21235
+ ],
+ "_OaksLabThatsAPokeball": [
+ 42,
+ 18221
+ ],
+ "_OddishDexEntry": [
+ 46,
+ 20440
+ ],
+ "_OfficerJennyText1": [
+ 45,
+ 23075
+ ],
+ "_OfficerJennyText2": [
+ 45,
+ 23192
+ ],
+ "_OfficerJennyText3": [
+ 45,
+ 23345
+ ],
+ "_OfficerJennyText4": [
+ 45,
+ 23380
+ ],
+ "_OfficerJennyText5": [
+ 45,
+ 23408
+ ],
+ "_OhFineThenText": [
+ 40,
+ 18163
+ ],
+ "_OlderFileWillBeErasedText": [
+ 41,
+ 30320
+ ],
+ "_OmanyteDexEntry": [
+ 46,
+ 29791
+ ],
+ "_OmastarDexEntry": [
+ 46,
+ 29896
+ ],
+ "_OnceReleasedText": [
+ 40,
+ 17892
+ ],
+ "_OneMoreGoSlotMachineText": [
+ 39,
+ 24512
+ ],
+ "_OneTwoAndText": [
+ 44,
+ 30494
+ ],
+ "_OnixDexEntry": [
+ 46,
+ 25537
+ ],
+ "_OopsYouDontHaveEnoughRoomText": [
+ 40,
+ 18128
+ ],
+ "_OutOfCoinsSlotMachineText": [
+ 39,
+ 24439
+ ],
+ "_OutOfSafariBallsText": [
+ 39,
+ 29969
+ ],
+ "_PPIncreasedText": [
+ 45,
+ 27835
+ ],
+ "_PPMaxedOutText": [
+ 45,
+ 27812
+ ],
+ "_PPRestoredText": [
+ 45,
+ 27855
+ ],
+ "_PalletTownFisherText": [
+ 45,
+ 17353
+ ],
+ "_PalletTownGirlText": [
+ 45,
+ 17288
+ ],
+ "_PalletTownOakComeWithMe": [
+ 45,
+ 17169
+ ],
+ "_PalletTownOakHeyWaitDontGoOutText": [
+ 45,
+ 17072
+ ],
+ "_PalletTownOakThatWasCloseText": [
+ 45,
+ 17103
+ ],
+ "_PalletTownOakWhewText": [
+ 45,
+ 17155
+ ],
+ "_PalletTownOaksLabSignText": [
+ 45,
+ 17440
+ ],
+ "_PalletTownPlayersHouseSignText": [
+ 45,
+ 17506
+ ],
+ "_PalletTownRivalsHouseSignText": [
+ 45,
+ 17517
+ ],
+ "_PalletTownSignText": [
+ 45,
+ 17463
+ ],
+ "_ParalyzedMayNotAttackText": [
+ 42,
+ 16914
+ ],
+ "_ParasDexEntry": [
+ 46,
+ 20744
+ ],
+ "_ParasectDexEntry": [
+ 46,
+ 20849
+ ],
+ "_ParlyzHealText": [
+ 40,
+ 16851
+ ],
+ "_PartyMenuBattleText": [
+ 40,
+ 16736
+ ],
+ "_PartyMenuItemUseText": [
+ 40,
+ 16711
+ ],
+ "_PartyMenuNormalText": [
+ 40,
+ 16695
+ ],
+ "_PartyMenuSwapMonText": [
+ 40,
+ 16781
+ ],
+ "_PartyMenuUseTMText": [
+ 40,
+ 16759
+ ],
+ "_PersianDexEntry": [
+ 46,
+ 21459
+ ],
+ "_PewterCityCooltrainerFText": [
+ 45,
+ 19126
+ ],
+ "_PewterCityCooltrainerMText": [
+ 45,
+ 19223
+ ],
+ "_PewterCityGymSignText": [
+ 45,
+ 19970
+ ],
+ "_PewterCityMuseumSignText": [
+ 45,
+ 19944
+ ],
+ "_PewterCityPokecenterGuyText": [
+ 39,
+ 24789
+ ],
+ "_PewterCityPoliceNoticeSignText": [
+ 45,
+ 19841
+ ],
+ "_PewterCitySignText": [
+ 45,
+ 20035
+ ],
+ "_PewterCitySuperNerd1DidYouCheckOutMuseumText": [
+ 45,
+ 19341
+ ],
+ "_PewterCitySuperNerd1ItsRightHereText": [
+ 45,
+ 19453
+ ],
+ "_PewterCitySuperNerd1WerentThoseFossilsAmazingText": [
+ 45,
+ 19372
+ ],
+ "_PewterCitySuperNerd1YouHaveToGoText": [
+ 45,
+ 19417
+ ],
+ "_PewterCitySuperNerd2DoYouKnowWhatImDoingText": [
+ 45,
+ 19531
+ ],
+ "_PewterCitySuperNerd2ImSprayingRepelText": [
+ 45,
+ 19596
+ ],
+ "_PewterCitySuperNerd2ThatsRightText": [
+ 45,
+ 19567
+ ],
+ "_PewterCityTrainerTipsText": [
+ 45,
+ 19765
+ ],
+ "_PewterCityYoungsterGoTakeOnBrockText": [
+ 45,
+ 19717
+ ],
+ "_PewterCityYoungsterYoureATrainerFollowMeText": [
+ 45,
+ 19646
+ ],
+ "_PewterGymBrockBoulderBadgeInfoText": [
+ 42,
+ 26778
+ ],
+ "_PewterGymBrockPostBattleAdviceText": [
+ 42,
+ 26127
+ ],
+ "_PewterGymBrockPreBattleText": [
+ 42,
+ 25937
+ ],
+ "_PewterGymBrockReceivedBoulderBadgeText": [
+ 42,
+ 26673
+ ],
+ "_PewterGymBrockWaitTakeThisText": [
+ 42,
+ 26362
+ ],
+ "_PewterGymCooltrainerMAfterBattleText": [
+ 42,
+ 27020
+ ],
+ "_PewterGymCooltrainerMBattleText": [
+ 42,
+ 26901
+ ],
+ "_PewterGymCooltrainerMEndBattleText": [
+ 42,
+ 26968
+ ],
+ "_PewterGymGuideAdviceText": [
+ 42,
+ 27235
+ ],
+ "_PewterGymGuideBeginAdviceText": [
+ 42,
+ 27203
+ ],
+ "_PewterGymGuideFreeServiceText": [
+ 42,
+ 27357
+ ],
+ "_PewterGymGuidePostBattleText": [
+ 42,
+ 27398
+ ],
+ "_PewterGymGuidePreAdviceText": [
+ 42,
+ 27064
+ ],
+ "_PewterGymGuyText": [
+ 42,
+ 27445
+ ],
+ "_PewterGymReceivedTM34Text": [
+ 42,
+ 26389
+ ],
+ "_PewterGymTM34NoRoomText": [
+ 42,
+ 26643
+ ],
+ "_PewterMartSuperNerdText": [
+ 42,
+ 27900
+ ],
+ "_PewterMartYoungsterText": [
+ 42,
+ 27805
+ ],
+ "_PewterNidoranHouseLittleBoyText": [
+ 42,
+ 27602
+ ],
+ "_PewterNidoranHouseMiddleAgedManText": [
+ 42,
+ 27616
+ ],
+ "_PewterNidoranHouseNidoranText": [
+ 42,
+ 27583
+ ],
+ "_PewterPokecenterGentlemanText": [
+ 42,
+ 28148
+ ],
+ "_PewterPokecenterJigglypuffText": [
+ 42,
+ 28331
+ ],
+ "_PewterPokecenterText3": [
+ 42,
+ 28212
+ ],
+ "_PewterSpeechHouseGamblerText": [
+ 42,
+ 27974
+ ],
+ "_PewterSpeechHouseYoungsterText": [
+ 42,
+ 28062
+ ],
+ "_PickUpPayDayMoneyText": [
+ 40,
+ 16595
+ ],
+ "_PidgeotDexEntry": [
+ 46,
+ 18009
+ ],
+ "_PidgeottoDexEntry": [
+ 46,
+ 17911
+ ],
+ "_PidgeyDexEntry": [
+ 46,
+ 17815
+ ],
+ "_PikachuDexEntry": [
+ 46,
+ 18677
+ ],
+ "_PikachuUnhappyText": [
+ 40,
+ 17842
+ ],
+ "_PinsirDexEntry": [
+ 46,
+ 28704
+ ],
+ "_PlaySlotMachineText": [
+ 39,
+ 24408
+ ],
+ "_PlayedFluteHadEffectText": [
+ 45,
+ 27626
+ ],
+ "_PlayedFluteNoEffectText": [
+ 45,
+ 27551
+ ],
+ "_PlayerBlackedOutText": [
+ 44,
+ 29898
+ ],
+ "_PlayerBlackedOutText2": [
+ 39,
+ 30240
+ ],
+ "_PlayerMon1Text": [
+ 40,
+ 16545
+ ],
+ "_PlayerMon2Text": [
+ 40,
+ 16551
+ ],
+ "_PlayerMonFaintedText": [
+ 39,
+ 30180
+ ],
+ "_PoisonedText": [
+ 42,
+ 16446
+ ],
+ "_PokeCenterSignText": [
+ 38,
+ 16636
+ ],
+ "_PokemartAnythingElseText": [
+ 44,
+ 30238
+ ],
+ "_PokemartBoughtItemText": [
+ 44,
+ 30014
+ ],
+ "_PokemartBuyingGreetingText": [
+ 44,
+ 29965
+ ],
+ "_PokemartGreetingText": [
+ 44,
+ 29857
+ ],
+ "_PokemartItemBagEmptyText": [
+ 44,
+ 30164
+ ],
+ "_PokemartItemBagFullText": [
+ 44,
+ 30069
+ ],
+ "_PokemartNotEnoughMoneyText": [
+ 44,
+ 30040
+ ],
+ "_PokemartTellBuyPriceText": [
+ 44,
+ 29982
+ ],
+ "_PokemartTellSellPriceText": [
+ 44,
+ 30131
+ ],
+ "_PokemartThankYouText": [
+ 44,
+ 30226
+ ],
+ "_PokemartUnsellableItemText": [
+ 44,
+ 30197
+ ],
+ "_PokemonBooksText": [
+ 39,
+ 29849
+ ],
+ "_PokemonCenterFarewellText": [
+ 44,
+ 30741
+ ],
+ "_PokemonCenterWelcomeText": [
+ 44,
+ 30578
+ ],
+ "_PokemonFaintedText": [
+ 44,
+ 29884
+ ],
+ "_PokemonFanClubBagFullText": [
+ 43,
+ 22049
+ ],
+ "_PokemonFanClubChairFinalText": [
+ 43,
+ 21984
+ ],
+ "_PokemonFanClubChairmanIntroText": [
+ 43,
+ 21295
+ ],
+ "_PokemonFanClubChairmanStoryText": [
+ 43,
+ 21454
+ ],
+ "_PokemonFanClubClefairyFanBetterText": [
+ 43,
+ 20965
+ ],
+ "_PokemonFanClubClefairyFanNormalText": [
+ 43,
+ 20920
+ ],
+ "_PokemonFanClubClefairyFanText": [
+ 43,
+ 21015
+ ],
+ "_PokemonFanClubClefairyText": [
+ 43,
+ 21262
+ ],
+ "_PokemonFanClubExplainBikeVoucherText": [
+ 43,
+ 21810
+ ],
+ "_PokemonFanClubNoStoryText": [
+ 43,
+ 21937
+ ],
+ "_PokemonFanClubReceivedBikeVoucherText": [
+ 43,
+ 21788
+ ],
+ "_PokemonFanClubReceptionistText": [
+ 43,
+ 22288
+ ],
+ "_PokemonFanClubSeelFanBetterText": [
+ 43,
+ 21156
+ ],
+ "_PokemonFanClubSeelFanNormalText": [
+ 43,
+ 21108
+ ],
+ "_PokemonFanClubSeelFanText": [
+ 43,
+ 21198
+ ],
+ "_PokemonFanClubSeelText": [
+ 43,
+ 21281
+ ],
+ "_PokemonFightingFitText": [
+ 44,
+ 30701
+ ],
+ "_PokemonMansion1FScientistAfterBattleText": [
+ 44,
+ 21952
+ ],
+ "_PokemonMansion1FScientistBattleText": [
+ 44,
+ 21900
+ ],
+ "_PokemonMansion1FScientistEndBattleText": [
+ 44,
+ 21945
+ ],
+ "_PokemonMansion1FSwitchNotPressedText": [
+ 44,
+ 22040
+ ],
+ "_PokemonMansion1FSwitchPressedText": [
+ 44,
+ 22026
+ ],
+ "_PokemonMansion1FSwitchText": [
+ 44,
+ 21998
+ ],
+ "_PokemonMansion2FDiary1Text": [
+ 39,
+ 17454
+ ],
+ "_PokemonMansion2FDiary2Text": [
+ 39,
+ 17537
+ ],
+ "_PokemonMansion2FSuperNerdAfterBattleText": [
+ 39,
+ 17402
+ ],
+ "_PokemonMansion2FSuperNerdBattleText": [
+ 39,
+ 17327
+ ],
+ "_PokemonMansion2FSuperNerdEndBattleText": [
+ 39,
+ 17378
+ ],
+ "_PokemonMansion2FSwitchNotPressedText": [
+ 39,
+ 17641
+ ],
+ "_PokemonMansion2FSwitchPressedText": [
+ 39,
+ 17627
+ ],
+ "_PokemonMansion2FSwitchText": [
+ 39,
+ 17599
+ ],
+ "_PokemonMansion3FDiaryText": [
+ 39,
+ 17819
+ ],
+ "_PokemonMansion3FScientistAfterBattleText": [
+ 39,
+ 17773
+ ],
+ "_PokemonMansion3FScientistBattleText": [
+ 39,
+ 17724
+ ],
+ "_PokemonMansion3FScientistEndBattleText": [
+ 39,
+ 17752
+ ],
+ "_PokemonMansion3FSuperNerdAfterBattleText": [
+ 39,
+ 17691
+ ],
+ "_PokemonMansion3FSuperNerdBattleText": [
+ 39,
+ 17657
+ ],
+ "_PokemonMansion3FSuperNerdEndBattleText": [
+ 39,
+ 17684
+ ],
+ "_PokemonMansionB1FBurglarAfterBattleText": [
+ 39,
+ 17911
+ ],
+ "_PokemonMansionB1FBurglarBattleText": [
+ 39,
+ 17879
+ ],
+ "_PokemonMansionB1FBurglarEndBattleText": [
+ 39,
+ 17903
+ ],
+ "_PokemonMansionB1FDiaryText": [
+ 39,
+ 18043
+ ],
+ "_PokemonMansionB1FScientistAfterBattleText": [
+ 39,
+ 17997
+ ],
+ "_PokemonMansionB1FScientistBattleText": [
+ 39,
+ 17945
+ ],
+ "_PokemonMansionB1FScientistEndBattleText": [
+ 39,
+ 17977
+ ],
+ "_PokemonSellingGreetingText": [
+ 44,
+ 30101
+ ],
+ "_PokemonStuffText": [
+ 39,
+ 29943
+ ],
+ "_PokemonText": [
+ 44,
+ 29850
+ ],
+ "_PokemonTower1FBaldingGuyText": [
+ 43,
+ 16828
+ ],
+ "_PokemonTower1FChannelerText": [
+ 43,
+ 16924
+ ],
+ "_PokemonTower1FGirlText": [
+ 43,
+ 16890
+ ],
+ "_PokemonTower1FMiddleAgedWomanText": [
+ 43,
+ 16786
+ ],
+ "_PokemonTower1FReceptionistText": [
+ 43,
+ 16725
+ ],
+ "_PokemonTower2FChannelerText": [
+ 43,
+ 17392
+ ],
+ "_PokemonTower2FRivalDefeatedText": [
+ 43,
+ 17083
+ ],
+ "_PokemonTower2FRivalHowsYourDexText": [
+ 43,
+ 17197
+ ],
+ "_PokemonTower2FRivalVictoryText": [
+ 43,
+ 17130
+ ],
+ "_PokemonTower2FRivalWhatBringsYouHereText": [
+ 43,
+ 16977
+ ],
+ "_PokemonTower3FChanneler1AfterBattleText": [
+ 43,
+ 17530
+ ],
+ "_PokemonTower3FChanneler1BattleText": [
+ 43,
+ 17484
+ ],
+ "_PokemonTower3FChanneler1EndBattleText": [
+ 43,
+ 17514
+ ],
+ "_PokemonTower3FChanneler2AfterBattleText": [
+ 43,
+ 17623
+ ],
+ "_PokemonTower3FChanneler2BattleText": [
+ 43,
+ 17580
+ ],
+ "_PokemonTower3FChanneler2EndBattleText": [
+ 43,
+ 17600
+ ],
+ "_PokemonTower3FChanneler3AfterBattleText": [
+ 43,
+ 17695
+ ],
+ "_PokemonTower3FChanneler3BattleText": [
+ 43,
+ 17648
+ ],
+ "_PokemonTower3FChanneler3EndBattleText": [
+ 43,
+ 17671
+ ],
+ "_PokemonTower4FChanneler1AfterBattleText": [
+ 43,
+ 17768
+ ],
+ "_PokemonTower4FChanneler1BattleText": [
+ 43,
+ 17727
+ ],
+ "_PokemonTower4FChanneler1EndBattleText": [
+ 43,
+ 17747
+ ],
+ "_PokemonTower4FChanneler2AfterBattleText": [
+ 43,
+ 17833
+ ],
+ "_PokemonTower4FChanneler2BattleText": [
+ 43,
+ 17798
+ ],
+ "_PokemonTower4FChanneler2EndBattleText": [
+ 43,
+ 17826
+ ],
+ "_PokemonTower4FChanneler3AfterBattleText": [
+ 43,
+ 17917
+ ],
+ "_PokemonTower4FChanneler3BattleText": [
+ 43,
+ 17876
+ ],
+ "_PokemonTower4FChanneler3EndBattleText": [
+ 43,
+ 17900
+ ],
+ "_PokemonTower5FChanneler1Text": [
+ 43,
+ 17966
+ ],
+ "_PokemonTower5FChanneler2AfterBattleText": [
+ 43,
+ 18073
+ ],
+ "_PokemonTower5FChanneler2BattleText": [
+ 43,
+ 18037
+ ],
+ "_PokemonTower5FChanneler2EndBattleText": [
+ 43,
+ 18066
+ ],
+ "_PokemonTower5FChanneler3AfterBattleText": [
+ 43,
+ 18146
+ ],
+ "_PokemonTower5FChanneler3BattleText": [
+ 43,
+ 18098
+ ],
+ "_PokemonTower5FChanneler3EndBattleText": [
+ 43,
+ 18127
+ ],
+ "_PokemonTower5FChanneler4AfterBattleText": [
+ 43,
+ 18179
+ ],
+ "_PokemonTower5FChanneler4BattleText": [
+ 43,
+ 18164
+ ],
+ "_PokemonTower5FChanneler4EndBattleText": [
+ 43,
+ 18174
+ ],
+ "_PokemonTower5FChanneler5AfterBattleText": [
+ 43,
+ 18228
+ ],
+ "_PokemonTower5FChanneler5BattleText": [
+ 43,
+ 18202
+ ],
+ "_PokemonTower5FChanneler5EndBattleText": [
+ 43,
+ 18221
+ ],
+ "_PokemonTower5FPurifiedZoneText": [
+ 43,
+ 18273
+ ],
+ "_PokemonTower6FBeGoneText": [
+ 43,
+ 18647
+ ],
+ "_PokemonTower6FChanneler1AfterBattleText": [
+ 43,
+ 18477
+ ],
+ "_PokemonTower6FChanneler1BattleText": [
+ 43,
+ 18446
+ ],
+ "_PokemonTower6FChanneler1EndBattleText": [
+ 43,
+ 18469
+ ],
+ "_PokemonTower6FChanneler2AfterBattleText": [
+ 43,
+ 18543
+ ],
+ "_PokemonTower6FChanneler2BattleText": [
+ 43,
+ 18504
+ ],
+ "_PokemonTower6FChanneler2EndBattleText": [
+ 43,
+ 18520
+ ],
+ "_PokemonTower6FChanneler3AfterBattleText": [
+ 43,
+ 18625
+ ],
+ "_PokemonTower6FChanneler3BattleText": [
+ 43,
+ 18588
+ ],
+ "_PokemonTower6FChanneler3EndBattleText": [
+ 43,
+ 18618
+ ],
+ "_PokemonTower6FGhostWasCubonesMotherText": [
+ 43,
+ 18334
+ ],
+ "_PokemonTower6FSoulWasCalmedText": [
+ 43,
+ 18386
+ ],
+ "_PokemonTower7FMrFujiRescueText": [
+ 43,
+ 18875
+ ],
+ "_PokemonTowerJessieJamesText1": [
+ 43,
+ 18672
+ ],
+ "_PokemonTowerJessieJamesText2": [
+ 43,
+ 18692
+ ],
+ "_PokemonTowerJessieJamesText3": [
+ 43,
+ 18806
+ ],
+ "_PokemonTowerJessieJamesText4": [
+ 43,
+ 18829
+ ],
+ "_PoliwagDexEntry": [
+ 46,
+ 22140
+ ],
+ "_PoliwhirlDexEntry": [
+ 46,
+ 22242
+ ],
+ "_PoliwrathDexEntry": [
+ 46,
+ 22334
+ ],
+ "_PonytaDexEntry": [
+ 46,
+ 23801
+ ],
+ "_PoofText": [
+ 44,
+ 30508
+ ],
+ "_PorygonDexEntry": [
+ 46,
+ 29698
+ ],
+ "_PotionText": [
+ 40,
+ 16799
+ ],
+ "_PowerPlantVoltorbBattleText": [
+ 40,
+ 22759
+ ],
+ "_PowerPlantZapdosBattleText": [
+ 40,
+ 22767
+ ],
+ "_PrimeapeDexEntry": [
+ 46,
+ 21854
+ ],
+ "_PsyduckDexEntry": [
+ 46,
+ 21561
+ ],
+ "_PushStartText": [
+ 39,
+ 25797
+ ],
+ "_RaichuDexEntry": [
+ 46,
+ 18779
+ ],
+ "_RaisePPWhichTechniqueText": [
+ 45,
+ 27750
+ ],
+ "_RanAwayScaredText": [
+ 42,
+ 16618
+ ],
+ "_RanFromBattleText": [
+ 42,
+ 16598
+ ],
+ "_RapidashDexEntry": [
+ 46,
+ 23902
+ ],
+ "_RareCandyText": [
+ 40,
+ 16976
+ ],
+ "_RaticateDexEntry": [
+ 46,
+ 18206
+ ],
+ "_RattataDexEntry": [
+ 46,
+ 18104
+ ],
+ "_RedBedroomSNESText": [
+ 39,
+ 28120
+ ],
+ "_RedsHouse1FMomLookingGreatText": [
+ 42,
+ 17607
+ ],
+ "_RedsHouse1FMomWakeUpText": [
+ 42,
+ 17420
+ ],
+ "_RedsHouse1FMomYouShouldRestText": [
+ 42,
+ 17521
+ ],
+ "_RedsHouse1FTVStandByMeMovieText": [
+ 42,
+ 17674
+ ],
+ "_RedsHouse1FTVWrongSideText": [
+ 42,
+ 17756
+ ],
+ "_ReflectGainedArmorText": [
+ 42,
+ 17302
+ ],
+ "_RefusingText": [
+ 45,
+ 27452
+ ],
+ "_RegainedHealthText": [
+ 42,
+ 17216
+ ],
+ "_ReleaseWhichMonText": [
+ 40,
+ 17871
+ ],
+ "_RepelWoreOffText": [
+ 44,
+ 29940
+ ],
+ "_RequireCoinCaseText": [
+ 40,
+ 17973
+ ],
+ "_RestorePPWhichTechniqueText": [
+ 45,
+ 27780
+ ],
+ "_ReviveText": [
+ 40,
+ 16955
+ ],
+ "_RhydonDexEntry": [
+ 46,
+ 27219
+ ],
+ "_RhyhornDexEntry": [
+ 46,
+ 27126
+ ],
+ "_Rival1WinText": [
+ 39,
+ 30210
+ ],
+ "_RivalDefeatedText": [
+ 39,
+ 21301
+ ],
+ "_RivalVictoryText": [
+ 39,
+ 21422
+ ],
+ "_RockTunnel1FCooltrainerF1AfterBattleText": [
+ 40,
+ 22539
+ ],
+ "_RockTunnel1FCooltrainerF1BattleText": [
+ 40,
+ 22478
+ ],
+ "_RockTunnel1FCooltrainerF1EndBattleText": [
+ 40,
+ 22521
+ ],
+ "_RockTunnel1FCooltrainerF2AfterBattleText": [
+ 40,
+ 22615
+ ],
+ "_RockTunnel1FCooltrainerF2BattleText": [
+ 40,
+ 22571
+ ],
+ "_RockTunnel1FCooltrainerF2EndBattleText": [
+ 40,
+ 22598
+ ],
+ "_RockTunnel1FCooltrainerF3AfterBattleText": [
+ 40,
+ 22690
+ ],
+ "_RockTunnel1FCooltrainerF3BattleText": [
+ 40,
+ 22646
+ ],
+ "_RockTunnel1FCooltrainerF3EndBattleText": [
+ 40,
+ 22674
+ ],
+ "_RockTunnel1FHiker1AfterBattleText": [
+ 40,
+ 22129
+ ],
+ "_RockTunnel1FHiker1BattleText": [
+ 40,
+ 22079
+ ],
+ "_RockTunnel1FHiker1EndBattleText": [
+ 40,
+ 22114
+ ],
+ "_RockTunnel1FHiker2AfterBattleText": [
+ 40,
+ 22253
+ ],
+ "_RockTunnel1FHiker2BattleText": [
+ 40,
+ 22177
+ ],
+ "_RockTunnel1FHiker2EndBattleText": [
+ 40,
+ 22208
+ ],
+ "_RockTunnel1FHiker3AfterBattleText": [
+ 40,
+ 22375
+ ],
+ "_RockTunnel1FHiker3BattleText": [
+ 40,
+ 22316
+ ],
+ "_RockTunnel1FHiker3EndBattleText": [
+ 40,
+ 22366
+ ],
+ "_RockTunnel1FSignText": [
+ 40,
+ 22716
+ ],
+ "_RockTunnel1FSuperNerdAfterBattleText": [
+ 40,
+ 22443
+ ],
+ "_RockTunnel1FSuperNerdBattleText": [
+ 40,
+ 22407
+ ],
+ "_RockTunnel1FSuperNerdEndBattleText": [
+ 40,
+ 22431
+ ],
+ "_RockTunnelB1FCooltrainerF1AfterBattleText": [
+ 39,
+ 23381
+ ],
+ "_RockTunnelB1FCooltrainerF1BattleText": [
+ 39,
+ 23321
+ ],
+ "_RockTunnelB1FCooltrainerF1EndBattleText": [
+ 39,
+ 23359
+ ],
+ "_RockTunnelB1FCooltrainerF2AfterBattleText": [
+ 39,
+ 23880
+ ],
+ "_RockTunnelB1FCooltrainerF2BattleText": [
+ 39,
+ 23820
+ ],
+ "_RockTunnelB1FCooltrainerF2EndBattleText": [
+ 39,
+ 23867
+ ],
+ "_RockTunnelB1FHiker1AfterBattleText": [
+ 39,
+ 23454
+ ],
+ "_RockTunnelB1FHiker1BattleText": [
+ 39,
+ 23402
+ ],
+ "_RockTunnelB1FHiker1EndBattleText": [
+ 39,
+ 23434
+ ],
+ "_RockTunnelB1FHiker2AfterBattleText": [
+ 39,
+ 23772
+ ],
+ "_RockTunnelB1FHiker2BattleText": [
+ 39,
+ 23693
+ ],
+ "_RockTunnelB1FHiker2EndBattleText": [
+ 39,
+ 23736
+ ],
+ "_RockTunnelB1FHiker3AfterBattleText": [
+ 39,
+ 23965
+ ],
+ "_RockTunnelB1FHiker3BattleText": [
+ 39,
+ 23923
+ ],
+ "_RockTunnelB1FHiker3EndBattleText": [
+ 39,
+ 23952
+ ],
+ "_RockTunnelB1FSuperNerd1AfterBattleText": [
+ 39,
+ 23552
+ ],
+ "_RockTunnelB1FSuperNerd1BattleText": [
+ 39,
+ 23495
+ ],
+ "_RockTunnelB1FSuperNerd1EndBattleText": [
+ 39,
+ 23529
+ ],
+ "_RockTunnelB1FSuperNerd2AfterBattleText": [
+ 39,
+ 23650
+ ],
+ "_RockTunnelB1FSuperNerd2BattleText": [
+ 39,
+ 23595
+ ],
+ "_RockTunnelB1FSuperNerd2EndBattleText": [
+ 39,
+ 23631
+ ],
+ "_RockTunnelB1FSuperNerd3AfterBattleText": [
+ 39,
+ 24052
+ ],
+ "_RockTunnelB1FSuperNerd3BattleText": [
+ 39,
+ 24004
+ ],
+ "_RockTunnelB1FSuperNerd3EndBattleText": [
+ 39,
+ 24031
+ ],
+ "_RockTunnelPokecenterFisherText": [
+ 40,
+ 22043
+ ],
+ "_RockTunnelPokecenterGentlemanText": [
+ 40,
+ 21957
+ ],
+ "_RockTunnelPokecenterGuyText": [
+ 39,
+ 25029
+ ],
+ "_RocketHide3AfterBattleText3": [
+ 38,
+ 25339
+ ],
+ "_RocketHideout3BattleText": [
+ 38,
+ 25271
+ ],
+ "_RocketHideout3EndBattleText3": [
+ 38,
+ 25320
+ ],
+ "_RocketHideoutB1FRocket1AfterBattleText": [
+ 38,
+ 24677
+ ],
+ "_RocketHideoutB1FRocket1BattleText": [
+ 38,
+ 24627
+ ],
+ "_RocketHideoutB1FRocket1EndBattleText": [
+ 38,
+ 24663
+ ],
+ "_RocketHideoutB1FRocket2AfterBattleText": [
+ 38,
+ 24746
+ ],
+ "_RocketHideoutB1FRocket2BattleText": [
+ 38,
+ 24707
+ ],
+ "_RocketHideoutB1FRocket2EndBattleText": [
+ 38,
+ 24738
+ ],
+ "_RocketHideoutB1FRocket3AfterBattleText": [
+ 38,
+ 24824
+ ],
+ "_RocketHideoutB1FRocket3BattleText": [
+ 38,
+ 24792
+ ],
+ "_RocketHideoutB1FRocket3EndBattleText": [
+ 38,
+ 24809
+ ],
+ "_RocketHideoutB1FRocket4AfterBattleText": [
+ 38,
+ 24902
+ ],
+ "_RocketHideoutB1FRocket4BattleText": [
+ 38,
+ 24863
+ ],
+ "_RocketHideoutB1FRocket4EndBattleText": [
+ 38,
+ 24887
+ ],
+ "_RocketHideoutB1FRocket5AfterBattleText": [
+ 38,
+ 24982
+ ],
+ "_RocketHideoutB1FRocket5BattleText": [
+ 38,
+ 24951
+ ],
+ "_RocketHideoutB1FRocket5EndBattleText": [
+ 38,
+ 24617
+ ],
+ "_RocketHideoutB2FRocketAfterBattleText": [
+ 38,
+ 25084
+ ],
+ "_RocketHideoutB2FRocketBattleText": [
+ 38,
+ 25018
+ ],
+ "_RocketHideoutB2FRocketEndBattleText": [
+ 38,
+ 25070
+ ],
+ "_RocketHideoutB3FRocket1AfterBattleText": [
+ 38,
+ 25209
+ ],
+ "_RocketHideoutB3FRocket1BattleText": [
+ 38,
+ 25151
+ ],
+ "_RocketHideoutB3FRocket1EndBattleText": [
+ 38,
+ 25191
+ ],
+ "_RocketHideoutB4FGiovanniHopeWeMeetAgainText": [
+ 38,
+ 25637
+ ],
+ "_RocketHideoutB4FGiovanniImpressedYouGotHereText": [
+ 38,
+ 25568
+ ],
+ "_RocketHideoutB4FGiovanniWhatCannotBeText": [
+ 38,
+ 25614
+ ],
+ "_RocketHideoutB4FRocketAfterBattleText": [
+ 38,
+ 25854
+ ],
+ "_RocketHideoutB4FRocketBattleText": [
+ 38,
+ 25800
+ ],
+ "_RocketHideoutB4FRocketEndBattleText": [
+ 38,
+ 25849
+ ],
+ "_RocketHideoutElevatorAppearsToNeedKeyText": [
+ 38,
+ 25886
+ ],
+ "_RocketHideoutJessieJamesText1": [
+ 38,
+ 25405
+ ],
+ "_RocketHideoutJessieJamesText2": [
+ 38,
+ 25431
+ ],
+ "_RocketHideoutJessieJamesText3": [
+ 38,
+ 25498
+ ],
+ "_RocketHideoutJessieJamesText4": [
+ 38,
+ 25522
+ ],
+ "_RoseText": [
+ 42,
+ 16560
+ ],
+ "_Route10CooltrainerF1AfterBattleText": [
+ 41,
+ 16876
+ ],
+ "_Route10CooltrainerF1BattleText": [
+ 41,
+ 16795
+ ],
+ "_Route10CooltrainerF1EndBattleText": [
+ 41,
+ 16855
+ ],
+ "_Route10CooltrainerF2AfterBattleText": [
+ 41,
+ 17075
+ ],
+ "_Route10CooltrainerF2BattleText": [
+ 41,
+ 17011
+ ],
+ "_Route10CooltrainerF2EndBattleText": [
+ 41,
+ 17057
+ ],
+ "_Route10Hiker1AfterBattleText": [
+ 41,
+ 16675
+ ],
+ "_Route10Hiker1BattleText": [
+ 41,
+ 16606
+ ],
+ "_Route10Hiker1EndBattleText": [
+ 41,
+ 16623
+ ],
+ "_Route10Hiker2AfterBattleText": [
+ 41,
+ 16978
+ ],
+ "_Route10Hiker2BattleText": [
+ 41,
+ 16918
+ ],
+ "_Route10Hiker2EndBattleText": [
+ 41,
+ 16955
+ ],
+ "_Route10PowerPlantSignText": [
+ 41,
+ 17168
+ ],
+ "_Route10RockTunnelSignText": [
+ 41,
+ 17155
+ ],
+ "_Route10SuperNerd1AfterBattleText": [
+ 41,
+ 16574
+ ],
+ "_Route10SuperNerd1BattleText": [
+ 41,
+ 16496
+ ],
+ "_Route10SuperNerd1EndBattleText": [
+ 41,
+ 16552
+ ],
+ "_Route10SuperNerd2AfterBattleText": [
+ 41,
+ 16762
+ ],
+ "_Route10SuperNerd2BattleText": [
+ 41,
+ 16714
+ ],
+ "_Route10SuperNerd2EndBattleText": [
+ 41,
+ 16745
+ ],
+ "_Route11DiglettsCaveSignText": [
+ 41,
+ 18119
+ ],
+ "_Route11Gambler1AfterBattleText": [
+ 41,
+ 17226
+ ],
+ "_Route11Gambler1BattleText": [
+ 41,
+ 17181
+ ],
+ "_Route11Gambler1EndBattleText": [
+ 41,
+ 17201
+ ],
+ "_Route11Gambler2AfterBattleText": [
+ 41,
+ 17317
+ ],
+ "_Route11Gambler2BattleText": [
+ 41,
+ 17267
+ ],
+ "_Route11Gambler2EndBattleText": [
+ 41,
+ 17300
+ ],
+ "_Route11Gambler3AfterBattleText": [
+ 41,
+ 17684
+ ],
+ "_Route11Gambler3BattleText": [
+ 41,
+ 17639
+ ],
+ "_Route11Gambler3EndBattleText": [
+ 41,
+ 17668
+ ],
+ "_Route11Gambler4AfterBattleText": [
+ 41,
+ 17764
+ ],
+ "_Route11Gambler4BattleText": [
+ 41,
+ 17714
+ ],
+ "_Route11Gambler4EndBattleText": [
+ 41,
+ 17742
+ ],
+ "_Route11Gate1FGuardText": [
+ 40,
+ 22776
+ ],
+ "_Route11Gate2FLeftBinocularsNoSnorlaxText": [
+ 40,
+ 23133
+ ],
+ "_Route11Gate2FLeftBinocularsSnorlaxText": [
+ 40,
+ 23072
+ ],
+ "_Route11Gate2FOaksAideItemfinderDescriptionText": [
+ 40,
+ 22926
+ ],
+ "_Route11Gate2FRightBinocularsText": [
+ 40,
+ 23184
+ ],
+ "_Route11SuperNerd1AfterBattleText": [
+ 41,
+ 17503
+ ],
+ "_Route11SuperNerd1BattleText": [
+ 41,
+ 17445
+ ],
+ "_Route11SuperNerd1EndBattleText": [
+ 41,
+ 17483
+ ],
+ "_Route11SuperNerd2AfterBattleText": [
+ 41,
+ 17999
+ ],
+ "_Route11SuperNerd2BattleText": [
+ 41,
+ 17949
+ ],
+ "_Route11SuperNerd2EndBattleText": [
+ 41,
+ 17976
+ ],
+ "_Route11Youngster1AfterBattleText": [
+ 41,
+ 17410
+ ],
+ "_Route11Youngster1BattleText": [
+ 41,
+ 17361
+ ],
+ "_Route11Youngster1EndBattleText": [
+ 41,
+ 17387
+ ],
+ "_Route11Youngster2AfterBattleText5": [
+ 41,
+ 17604
+ ],
+ "_Route11Youngster2BattleText": [
+ 41,
+ 17536
+ ],
+ "_Route11Youngster2EndBattleText": [
+ 41,
+ 17586
+ ],
+ "_Route11Youngster3AfterBattleText": [
+ 41,
+ 17864
+ ],
+ "_Route11Youngster3BattleText": [
+ 41,
+ 17798
+ ],
+ "_Route11Youngster3EndBattleText": [
+ 41,
+ 17824
+ ],
+ "_Route11Youngster4AfterBattleText": [
+ 41,
+ 18086
+ ],
+ "_Route11Youngster4BattleText": [
+ 41,
+ 18031
+ ],
+ "_Route11Youngster4EndBattleText": [
+ 41,
+ 18064
+ ],
+ "_Route12CooltrainerMAfterBattleText": [
+ 41,
+ 18506
+ ],
+ "_Route12CooltrainerMBattleText": [
+ 41,
+ 18470
+ ],
+ "_Route12CooltrainerMEndBattleText": [
+ 41,
+ 18500
+ ],
+ "_Route12Fisher1AfterBattleText": [
+ 41,
+ 18335
+ ],
+ "_Route12Fisher1BattleText": [
+ 41,
+ 18284
+ ],
+ "_Route12Fisher1EndBattleText": [
+ 41,
+ 18311
+ ],
+ "_Route12Fisher2AfterBattleText": [
+ 41,
+ 18423
+ ],
+ "_Route12Fisher2BattleText": [
+ 41,
+ 18363
+ ],
+ "_Route12Fisher2EndBattleText": [
+ 41,
+ 18403
+ ],
+ "_Route12Fisher3AfterBattleText": [
+ 41,
+ 18699
+ ],
+ "_Route12Fisher3BattleText": [
+ 41,
+ 18656
+ ],
+ "_Route12Fisher3EndBattleText": [
+ 41,
+ 18688
+ ],
+ "_Route12Fisher4AfterBattleText": [
+ 41,
+ 18785
+ ],
+ "_Route12Fisher4BattleText": [
+ 41,
+ 18745
+ ],
+ "_Route12Fisher4EndBattleText": [
+ 41,
+ 18768
+ ],
+ "_Route12Fisher5AfterBattleText": [
+ 41,
+ 18879
+ ],
+ "_Route12Fisher5BattleText": [
+ 41,
+ 18831
+ ],
+ "_Route12Fisher5EndBattleText": [
+ 41,
+ 18869
+ ],
+ "_Route12Gate1FGuardText": [
+ 40,
+ 23375
+ ],
+ "_Route12Gate2FBrunetteGirlReceivedTM39Text": [
+ 40,
+ 23498
+ ],
+ "_Route12Gate2FBrunetteGirlTM39ExplanationText": [
+ 40,
+ 23517
+ ],
+ "_Route12Gate2FBrunetteGirlTM39NoRoomText": [
+ 40,
+ 23616
+ ],
+ "_Route12Gate2FBrunetteGirlYouCanHaveThisText": [
+ 40,
+ 23408
+ ],
+ "_Route12Gate2FLeftBinocularsText": [
+ 40,
+ 23646
+ ],
+ "_Route12Gate2FRightBinocularsText": [
+ 40,
+ 23690
+ ],
+ "_Route12SignText": [
+ 41,
+ 18931
+ ],
+ "_Route12SnorlaxCalmedDownText": [
+ 41,
+ 18215
+ ],
+ "_Route12SnorlaxText": [
+ 41,
+ 18134
+ ],
+ "_Route12SnorlaxWokeUpText": [
+ 41,
+ 18167
+ ],
+ "_Route12SportFishingSignText": [
+ 41,
+ 18960
+ ],
+ "_Route12SuperNerdAfterBattleText": [
+ 41,
+ 18599
+ ],
+ "_Route12SuperNerdBattleText": [
+ 41,
+ 18557
+ ],
+ "_Route12SuperNerdEndBattleText": [
+ 41,
+ 18587
+ ],
+ "_Route12SuperRodHouseFishingGuruDoYouLikeToFishText": [
+ 40,
+ 23735
+ ],
+ "_Route12SuperRodHouseFishingGuruFishingWayOfLifeText": [
+ 40,
+ 23891
+ ],
+ "_Route12SuperRodHouseFishingGuruNoRoomText": [
+ 40,
+ 24124
+ ],
+ "_Route12SuperRodHouseFishingGuruReceivedSuperRodText": [
+ 40,
+ 23812
+ ],
+ "_Route12SuperRodHouseFishingGuruThatsDisappointingText": [
+ 40,
+ 23973
+ ],
+ "_Route12SuperRodHouseFishingGuruTryFishingText": [
+ 40,
+ 24006
+ ],
+ "_Route13Beauty1AfterBattleText": [
+ 41,
+ 19589
+ ],
+ "_Route13Beauty1BattleText": [
+ 41,
+ 19540
+ ],
+ "_Route13Beauty1EndBattleText": [
+ 41,
+ 19566
+ ],
+ "_Route13Beauty2AfterBattleText": [
+ 41,
+ 19688
+ ],
+ "_Route13Beauty2BattleText": [
+ 41,
+ 19639
+ ],
+ "_Route13Beauty2EndBattleText": [
+ 41,
+ 19669
+ ],
+ "_Route13BikerAfterBattleText": [
+ 41,
+ 19792
+ ],
+ "_Route13BikerBattleText": [
+ 41,
+ 19745
+ ],
+ "_Route13BikerEndBattleText": [
+ 41,
+ 19769
+ ],
+ "_Route13CooltrainerF1AfterBattleText": [
+ 41,
+ 19115
+ ],
+ "_Route13CooltrainerF1BattleText": [
+ 41,
+ 19073
+ ],
+ "_Route13CooltrainerF1EndBattleText": [
+ 41,
+ 19101
+ ],
+ "_Route13CooltrainerF2AfterBattleText": [
+ 41,
+ 19210
+ ],
+ "_Route13CooltrainerF2BattleText": [
+ 41,
+ 19165
+ ],
+ "_Route13CooltrainerF2EndBattleText": [
+ 41,
+ 19197
+ ],
+ "_Route13CooltrainerF3AfterBattleText": [
+ 41,
+ 19327
+ ],
+ "_Route13CooltrainerF3BattleText": [
+ 41,
+ 19258
+ ],
+ "_Route13CooltrainerF3EndBattleText": [
+ 41,
+ 19304
+ ],
+ "_Route13CooltrainerF4AfterBattleText": [
+ 41,
+ 19425
+ ],
+ "_Route13CooltrainerF4BattleText": [
+ 41,
+ 19376
+ ],
+ "_Route13CooltrainerF4EndBattleText": [
+ 41,
+ 19408
+ ],
+ "_Route13CooltrainerM1AfterBattleText": [
+ 41,
+ 19030
+ ],
+ "_Route13CooltrainerM1BattleText": [
+ 41,
+ 18980
+ ],
+ "_Route13CooltrainerM1EndBattleText": [
+ 41,
+ 19009
+ ],
+ "_Route13CooltrainerM2AfterBattleText": [
+ 41,
+ 19508
+ ],
+ "_Route13CooltrainerM2BattleText": [
+ 41,
+ 19463
+ ],
+ "_Route13CooltrainerM2EndBattleText": [
+ 41,
+ 19490
+ ],
+ "_Route13CooltrainerM3AfterBattleText": [
+ 41,
+ 19847
+ ],
+ "_Route13CooltrainerM3BattleText": [
+ 41,
+ 19803
+ ],
+ "_Route13CooltrainerM3EndBattleText": [
+ 41,
+ 19832
+ ],
+ "_Route13SignText": [
+ 41,
+ 20002
+ ],
+ "_Route13TrainerTips1Text": [
+ 41,
+ 19896
+ ],
+ "_Route13TrainerTips2Text": [
+ 41,
+ 19941
+ ],
+ "_Route14Biker1AfterBattleText": [
+ 41,
+ 20752
+ ],
+ "_Route14Biker1BattleText": [
+ 41,
+ 20689
+ ],
+ "_Route14Biker1EndBattleText": [
+ 41,
+ 20729
+ ],
+ "_Route14Biker2AfterBattleText": [
+ 41,
+ 20838
+ ],
+ "_Route14Biker2BattleText": [
+ 41,
+ 20789
+ ],
+ "_Route14Biker2EndBattleText": [
+ 41,
+ 20825
+ ],
+ "_Route14Biker3AfterBattleText": [
+ 41,
+ 20923
+ ],
+ "_Route14Biker3BattleText": [
+ 41,
+ 20868
+ ],
+ "_Route14Biker3EndBattleText": [
+ 41,
+ 20912
+ ],
+ "_Route14Biker4AfterBattleText": [
+ 41,
+ 21036
+ ],
+ "_Route14Biker4BattleText": [
+ 41,
+ 20996
+ ],
+ "_Route14Biker4EndBattleText": [
+ 41,
+ 21023
+ ],
+ "_Route14CooltrainerM1AfterBattleText": [
+ 41,
+ 20104
+ ],
+ "_Route14CooltrainerM1BattleText": [
+ 41,
+ 20036
+ ],
+ "_Route14CooltrainerM1EndBattleText": [
+ 41,
+ 20086
+ ],
+ "_Route14CooltrainerM2AfterBattleText": [
+ 41,
+ 20224
+ ],
+ "_Route14CooltrainerM2BattleText": [
+ 41,
+ 20166
+ ],
+ "_Route14CooltrainerM2EndBattleText": [
+ 41,
+ 20208
+ ],
+ "_Route14CooltrainerM3AfterBattleText": [
+ 41,
+ 20334
+ ],
+ "_Route14CooltrainerM3BattleText": [
+ 41,
+ 20258
+ ],
+ "_Route14CooltrainerM3EndBattleText": [
+ 41,
+ 20320
+ ],
+ "_Route14CooltrainerM4AfterBattleText": [
+ 41,
+ 20459
+ ],
+ "_Route14CooltrainerM4BattleText": [
+ 41,
+ 20393
+ ],
+ "_Route14CooltrainerM4EndBattleText": [
+ 41,
+ 20437
+ ],
+ "_Route14CooltrainerM5AfterBattleText": [
+ 41,
+ 20546
+ ],
+ "_Route14CooltrainerM5BattleText": [
+ 41,
+ 20488
+ ],
+ "_Route14CooltrainerM5EndBattleText": [
+ 41,
+ 20527
+ ],
+ "_Route14CooltrainerM6AfterBattleText": [
+ 41,
+ 20637
+ ],
+ "_Route14CooltrainerM6BattleText": [
+ 41,
+ 20591
+ ],
+ "_Route14CooltrainerM6EndBattleText": [
+ 41,
+ 20625
+ ],
+ "_Route14SignText": [
+ 41,
+ 21079
+ ],
+ "_Route15Beauty1AfterBattleText": [
+ 41,
+ 21663
+ ],
+ "_Route15Beauty1BattleText": [
+ 41,
+ 21611
+ ],
+ "_Route15Beauty1EndBattleText": [
+ 41,
+ 21638
+ ],
+ "_Route15Beauty2AfterBattleText": [
+ 41,
+ 21753
+ ],
+ "_Route15Beauty2BattleText": [
+ 41,
+ 21694
+ ],
+ "_Route15Beauty2EndBattleText": [
+ 41,
+ 21730
+ ],
+ "_Route15Biker1AfterBattleText": [
+ 41,
+ 21841
+ ],
+ "_Route15Biker1BattleText": [
+ 41,
+ 21797
+ ],
+ "_Route15Biker1EndBattleText": [
+ 41,
+ 21831
+ ],
+ "_Route15Biker2AfterBattleText": [
+ 41,
+ 21976
+ ],
+ "_Route15Biker2BattleText": [
+ 41,
+ 21905
+ ],
+ "_Route15Biker2EndBattleText": [
+ 41,
+ 21956
+ ],
+ "_Route15CooltrainerF1AfterBattleText": [
+ 41,
+ 21176
+ ],
+ "_Route15CooltrainerF1BattleText": [
+ 41,
+ 21110
+ ],
+ "_Route15CooltrainerF1EndBattleText": [
+ 41,
+ 21158
+ ],
+ "_Route15CooltrainerF2AfterBattleText": [
+ 41,
+ 21326
+ ],
+ "_Route15CooltrainerF2BattleText": [
+ 41,
+ 21269
+ ],
+ "_Route15CooltrainerF2EndBattleText": [
+ 41,
+ 21314
+ ],
+ "_Route15CooltrainerF3AfterBattleText": [
+ 41,
+ 22054
+ ],
+ "_Route15CooltrainerF3BattleText": [
+ 41,
+ 22012
+ ],
+ "_Route15CooltrainerF3EndBattleText": [
+ 41,
+ 22039
+ ],
+ "_Route15CooltrainerF4AfterBattleText": [
+ 41,
+ 22135
+ ],
+ "_Route15CooltrainerF4BattleText": [
+ 41,
+ 22085
+ ],
+ "_Route15CooltrainerF4EndBattleText": [
+ 41,
+ 22113
+ ],
+ "_Route15CooltrainerM1AfterBattleText": [
+ 41,
+ 21436
+ ],
+ "_Route15CooltrainerM1BattleText": [
+ 41,
+ 21376
+ ],
+ "_Route15CooltrainerM1EndBattleText": [
+ 41,
+ 21417
+ ],
+ "_Route15CooltrainerM2AfterBattleText": [
+ 41,
+ 21544
+ ],
+ "_Route15CooltrainerM2BattleText": [
+ 41,
+ 21471
+ ],
+ "_Route15CooltrainerM2EndBattleText": [
+ 41,
+ 21524
+ ],
+ "_Route15Gate1FGuardText": [
+ 40,
+ 24183
+ ],
+ "_Route15Gate2FBinocularsText": [
+ 40,
+ 24425
+ ],
+ "_Route15Gate2FOaksAideExpAllText": [
+ 40,
+ 24240
+ ],
+ "_Route15SignText": [
+ 41,
+ 22170
+ ],
+ "_Route15UpstairsBinocularsText": [
+ 39,
+ 28169
+ ],
+ "_Route16Biker1AfterBattleText": [
+ 41,
+ 22242
+ ],
+ "_Route16Biker1BattleText": [
+ 41,
+ 22201
+ ],
+ "_Route16Biker1EndBattleText": [
+ 41,
+ 22220
+ ],
+ "_Route16Biker2AfterBattleText": [
+ 41,
+ 22326
+ ],
+ "_Route16Biker2BattleText": [
+ 41,
+ 22287
+ ],
+ "_Route16Biker2EndBattleText": [
+ 41,
+ 22313
+ ],
+ "_Route16Biker3AfterBattleText": [
+ 41,
+ 22410
+ ],
+ "_Route16Biker3BattleText": [
+ 41,
+ 22359
+ ],
+ "_Route16Biker3EndBattleText": [
+ 41,
+ 22393
+ ],
+ "_Route16Biker4AfterBattleText": [
+ 41,
+ 22479
+ ],
+ "_Route16Biker4EndBattleText": [
+ 41,
+ 22470
+ ],
+ "_Route16Biker5AfterBattleText": [
+ 41,
+ 22590
+ ],
+ "_Route16Biker5BattleText": [
+ 41,
+ 22545
+ ],
+ "_Route16Biker5EndBattleText": [
+ 41,
+ 22574
+ ],
+ "_Route16Biker6AfterBattleText": [
+ 41,
+ 22673
+ ],
+ "_Route16Biker6BattleText": [
+ 41,
+ 22639
+ ],
+ "_Route16Biker6EndBattleText": [
+ 41,
+ 22654
+ ],
+ "_Route16CyclingRoadSignText": [
+ 41,
+ 22854
+ ],
+ "_Route16FlyHouseBrunetteGirlHM02ExplanationText": [
+ 40,
+ 24957
+ ],
+ "_Route16FlyHouseBrunetteGirlHM02NoRoomText": [
+ 40,
+ 25026
+ ],
+ "_Route16FlyHouseBrunetteGirlReceivedHM02Text": [
+ 40,
+ 24938
+ ],
+ "_Route16FlyHouseBrunetteGirlText": [
+ 40,
+ 24838
+ ],
+ "_Route16FlyHouseFearowText": [
+ 40,
+ 25060
+ ],
+ "_Route16Gate1FGamblerText": [
+ 40,
+ 24622
+ ],
+ "_Route16Gate1FGuardCyclingRoadExplanationText": [
+ 40,
+ 24529
+ ],
+ "_Route16Gate1FGuardNoPedestriansAllowedText": [
+ 40,
+ 24484
+ ],
+ "_Route16Gate1FGuardWaitUpText": [
+ 40,
+ 24594
+ ],
+ "_Route16Gate2FLeftBinocularsText": [
+ 40,
+ 24724
+ ],
+ "_Route16Gate2FLittleBoyText": [
+ 40,
+ 24653
+ ],
+ "_Route16Gate2FLittleGirlText": [
+ 40,
+ 24695
+ ],
+ "_Route16Gate2FRightBinocularsText": [
+ 40,
+ 24778
+ ],
+ "_Route16SignText": [
+ 41,
+ 22885
+ ],
+ "_Route16SnorlaxReturnedToMountainsText": [
+ 41,
+ 22801
+ ],
+ "_Route16SnorlaxWokeUpText": [
+ 41,
+ 22753
+ ],
+ "_Route16Text7": [
+ 41,
+ 22720
+ ],
+ "_Route16biker4BattleText": [
+ 41,
+ 22444
+ ],
+ "_Route17Biker10AfterBattleText": [
+ 41,
+ 23656
+ ],
+ "_Route17Biker10BattleText": [
+ 41,
+ 23609
+ ],
+ "_Route17Biker10EndBattleText": [
+ 41,
+ 23636
+ ],
+ "_Route17Biker1AfterBattleText": [
+ 41,
+ 22971
+ ],
+ "_Route17Biker1BattleText": [
+ 41,
+ 22923
+ ],
+ "_Route17Biker1EndBattleText": [
+ 41,
+ 22958
+ ],
+ "_Route17Biker2AfterBattleText": [
+ 41,
+ 23049
+ ],
+ "_Route17Biker2BattleText": [
+ 41,
+ 23016
+ ],
+ "_Route17Biker2EndBattleText": [
+ 41,
+ 23042
+ ],
+ "_Route17Biker3AfterBattleText": [
+ 41,
+ 23128
+ ],
+ "_Route17Biker3BattleText": [
+ 41,
+ 23086
+ ],
+ "_Route17Biker3EndBattleText": [
+ 41,
+ 23111
+ ],
+ "_Route17Biker4AfterBattleText": [
+ 41,
+ 23191
+ ],
+ "_Route17Biker4BattleText": [
+ 41,
+ 23153
+ ],
+ "_Route17Biker4EndBattleText": [
+ 41,
+ 23182
+ ],
+ "_Route17Biker5AfterBattleText": [
+ 41,
+ 23266
+ ],
+ "_Route17Biker5BattleText": [
+ 41,
+ 23223
+ ],
+ "_Route17Biker5EndBattleText": [
+ 41,
+ 23251
+ ],
+ "_Route17Biker6AfterBattleText": [
+ 41,
+ 23352
+ ],
+ "_Route17Biker6BattleText": [
+ 41,
+ 23314
+ ],
+ "_Route17Biker6EndBattleText": [
+ 41,
+ 23341
+ ],
+ "_Route17Biker7AfterBattleText": [
+ 41,
+ 23448
+ ],
+ "_Route17Biker7BattleText": [
+ 41,
+ 23400
+ ],
+ "_Route17Biker7EndBattleText": [
+ 41,
+ 23427
+ ],
+ "_Route17Biker8AfterBattleText": [
+ 41,
+ 23501
+ ],
+ "_Route17Biker8BattleText": [
+ 41,
+ 23478
+ ],
+ "_Route17Biker8EndBattleText": [
+ 41,
+ 23491
+ ],
+ "_Route17Biker9AfterBattleText": [
+ 41,
+ 23574
+ ],
+ "_Route17Biker9BattleText": [
+ 41,
+ 23538
+ ],
+ "_Route17Biker9EndBattleText": [
+ 41,
+ 23566
+ ],
+ "_Route17CyclingRoadEndsSignText": [
+ 41,
+ 23996
+ ],
+ "_Route17NoticeSign1Text": [
+ 41,
+ 23683
+ ],
+ "_Route17NoticeSign2Text": [
+ 41,
+ 23937
+ ],
+ "_Route17SignText": [
+ 41,
+ 23899
+ ],
+ "_Route17TrainerTips1Text": [
+ 41,
+ 23729
+ ],
+ "_Route17TrainerTips2Text": [
+ 41,
+ 23826
+ ],
+ "_Route18CooltrainerM1AfterBattleText": [
+ 41,
+ 24081
+ ],
+ "_Route18CooltrainerM1BattleText": [
+ 41,
+ 24027
+ ],
+ "_Route18CooltrainerM1EndBattleText": [
+ 41,
+ 24075
+ ],
+ "_Route18CooltrainerM2AfterBattleText": [
+ 41,
+ 24163
+ ],
+ "_Route18CooltrainerM2BattleText": [
+ 41,
+ 24103
+ ],
+ "_Route18CooltrainerM2EndBattleText": [
+ 41,
+ 24144
+ ],
+ "_Route18CooltrainerM3AfterBattleText": [
+ 41,
+ 24243
+ ],
+ "_Route18CooltrainerM3BattleText": [
+ 41,
+ 24201
+ ],
+ "_Route18CooltrainerM3EndBattleText": [
+ 41,
+ 24236
+ ],
+ "_Route18CyclingRoadSignText": [
+ 41,
+ 24317
+ ],
+ "_Route18Gate1FGuardCyclingRoadUphillText": [
+ 40,
+ 25115
+ ],
+ "_Route18Gate1FGuardExcuseMeText": [
+ 40,
+ 25154
+ ],
+ "_Route18Gate1FGuardYouNeedABicycleText": [
+ 40,
+ 25077
+ ],
+ "_Route18Gate2FLeftBinocularsText": [
+ 40,
+ 25166
+ ],
+ "_Route18Gate2FRightBinocularsText": [
+ 40,
+ 25223
+ ],
+ "_Route18SignText": [
+ 41,
+ 24279
+ ],
+ "_Route19CooltrainerM1AfterBattleText": [
+ 41,
+ 24406
+ ],
+ "_Route19CooltrainerM1BattleText": [
+ 41,
+ 24357
+ ],
+ "_Route19CooltrainerM1EndBattleText": [
+ 41,
+ 24390
+ ],
+ "_Route19CooltrainerM2AfterBattleText": [
+ 41,
+ 24495
+ ],
+ "_Route19CooltrainerM2BattleText": [
+ 41,
+ 24441
+ ],
+ "_Route19CooltrainerM2EndBattleText": [
+ 41,
+ 24475
+ ],
+ "_Route19SignText": [
+ 41,
+ 25206
+ ],
+ "_Route19Swimmer1AfterBattleText": [
+ 41,
+ 24568
+ ],
+ "_Route19Swimmer1BattleText": [
+ 41,
+ 24521
+ ],
+ "_Route19Swimmer1EndBattleText": [
+ 41,
+ 24555
+ ],
+ "_Route19Swimmer2AfterBattleText": [
+ 41,
+ 24632
+ ],
+ "_Route19Swimmer2BattleText": [
+ 41,
+ 24598
+ ],
+ "_Route19Swimmer2EndBattleText": [
+ 41,
+ 24625
+ ],
+ "_Route19Swimmer3AfterBattleText": [
+ 41,
+ 24713
+ ],
+ "_Route19Swimmer3BattleText": [
+ 41,
+ 24660
+ ],
+ "_Route19Swimmer3EndBattleText": [
+ 41,
+ 24706
+ ],
+ "_Route19Swimmer4AfterBattleText": [
+ 41,
+ 24792
+ ],
+ "_Route19Swimmer4BattleText": [
+ 41,
+ 24745
+ ],
+ "_Route19Swimmer4EndBattleText": [
+ 41,
+ 24775
+ ],
+ "_Route19Swimmer5AfterBattleText": [
+ 41,
+ 24891
+ ],
+ "_Route19Swimmer5BattleText": [
+ 41,
+ 24826
+ ],
+ "_Route19Swimmer5EndBattleText": [
+ 41,
+ 24878
+ ],
+ "_Route19Swimmer6AfterBattleText": [
+ 41,
+ 24983
+ ],
+ "_Route19Swimmer6BattleText": [
+ 41,
+ 24939
+ ],
+ "_Route19Swimmer6EndBattleText": [
+ 41,
+ 24973
+ ],
+ "_Route19Swimmer7AfterBattleText": [
+ 41,
+ 25081
+ ],
+ "_Route19Swimmer7BattleText": [
+ 41,
+ 25033
+ ],
+ "_Route19Swimmer7EndBattleText": [
+ 41,
+ 25064
+ ],
+ "_Route19Swimmer8AfterBattleText": [
+ 41,
+ 25156
+ ],
+ "_Route19Swimmer8BattleText": [
+ 41,
+ 25111
+ ],
+ "_Route19Swimmer8EndBattleText": [
+ 41,
+ 25139
+ ],
+ "_Route1SignText": [
+ 40,
+ 27954
+ ],
+ "_Route1Youngster1AlsoGotPokeballsText": [
+ 40,
+ 27748
+ ],
+ "_Route1Youngster1GotPotionText": [
+ 40,
+ 27733
+ ],
+ "_Route1Youngster1MartSampleText": [
+ 40,
+ 27601
+ ],
+ "_Route1Youngster1NoRoomText": [
+ 40,
+ 27790
+ ],
+ "_Route1Youngster2Text": [
+ 40,
+ 27825
+ ],
+ "_Route20CooltrainerMAfterBattleText": [
+ 41,
+ 25754
+ ],
+ "_Route20CooltrainerMBattleText": [
+ 41,
+ 25719
+ ],
+ "_Route20CooltrainerMEndBattleText": [
+ 41,
+ 25746
+ ],
+ "_Route20SeafoamIslandsSignText": [
+ 41,
+ 26081
+ ],
+ "_Route20Swimmer1AfterBattleText": [
+ 41,
+ 25288
+ ],
+ "_Route20Swimmer1BattleText": [
+ 41,
+ 25251
+ ],
+ "_Route20Swimmer1EndBattleText": [
+ 41,
+ 25279
+ ],
+ "_Route20Swimmer2AfterBattleText": [
+ 41,
+ 25357
+ ],
+ "_Route20Swimmer2BattleText": [
+ 41,
+ 25318
+ ],
+ "_Route20Swimmer2EndBattleText": [
+ 41,
+ 25347
+ ],
+ "_Route20Swimmer3AfterBattleText": [
+ 41,
+ 25445
+ ],
+ "_Route20Swimmer3BattleText": [
+ 41,
+ 25403
+ ],
+ "_Route20Swimmer3EndBattleText": [
+ 41,
+ 25437
+ ],
+ "_Route20Swimmer4AfterBattleText": [
+ 41,
+ 25513
+ ],
+ "_Route20Swimmer4BattleText": [
+ 41,
+ 25469
+ ],
+ "_Route20Swimmer4EndBattleText": [
+ 41,
+ 25495
+ ],
+ "_Route20Swimmer5AfterBattleText": [
+ 41,
+ 25582
+ ],
+ "_Route20Swimmer5BattleText": [
+ 41,
+ 25545
+ ],
+ "_Route20Swimmer5EndBattleText": [
+ 41,
+ 25574
+ ],
+ "_Route20Swimmer6AfterBattleText": [
+ 41,
+ 25688
+ ],
+ "_Route20Swimmer6BattleText": [
+ 41,
+ 25627
+ ],
+ "_Route20Swimmer6EndBattleText": [
+ 41,
+ 25670
+ ],
+ "_Route20Swimmer7AfterBattleText": [
+ 41,
+ 25840
+ ],
+ "_Route20Swimmer7BattleText": [
+ 41,
+ 25782
+ ],
+ "_Route20Swimmer7EndBattleText": [
+ 41,
+ 25817
+ ],
+ "_Route20Swimmer8AfterBattleText": [
+ 41,
+ 25941
+ ],
+ "_Route20Swimmer8BattleText": [
+ 41,
+ 25885
+ ],
+ "_Route20Swimmer8EndBattleText": [
+ 41,
+ 25920
+ ],
+ "_Route20Swimmer9AfterBattleText": [
+ 41,
+ 26048
+ ],
+ "_Route20Swimmer9BattleText": [
+ 41,
+ 25997
+ ],
+ "_Route20Swimmer9EndBattleText": [
+ 41,
+ 26041
+ ],
+ "_Route21Fisher1AfterBattleText": [
+ 41,
+ 26147
+ ],
+ "_Route21Fisher1BattleText": [
+ 41,
+ 26098
+ ],
+ "_Route21Fisher1EndBattleText": [
+ 41,
+ 26140
+ ],
+ "_Route21Fisher2AfterBattleText": [
+ 41,
+ 26228
+ ],
+ "_Route21Fisher2BattleText": [
+ 41,
+ 26176
+ ],
+ "_Route21Fisher2EndBattleText": [
+ 41,
+ 26212
+ ],
+ "_Route21Fisher3AfterBattleText": [
+ 41,
+ 26750
+ ],
+ "_Route21Fisher3BattleText": [
+ 41,
+ 26693
+ ],
+ "_Route21Fisher3EndBattleText": [
+ 41,
+ 26725
+ ],
+ "_Route21Fisher4AfterBattleText": [
+ 41,
+ 26857
+ ],
+ "_Route21Fisher4BattleText": [
+ 41,
+ 26799
+ ],
+ "_Route21Fisher4EndBattleText": [
+ 41,
+ 26833
+ ],
+ "_Route21Swimmer1AfterBattleText": [
+ 41,
+ 26303
+ ],
+ "_Route21Swimmer1BattleText": [
+ 41,
+ 26260
+ ],
+ "_Route21Swimmer1EndBattleText": [
+ 41,
+ 26296
+ ],
+ "_Route21Swimmer2AfterBattleText": [
+ 41,
+ 26374
+ ],
+ "_Route21Swimmer2BattleText": [
+ 41,
+ 26330
+ ],
+ "_Route21Swimmer2EndBattleText": [
+ 41,
+ 26361
+ ],
+ "_Route21Swimmer3AfterBattleText": [
+ 41,
+ 26471
+ ],
+ "_Route21Swimmer3BattleText": [
+ 41,
+ 26425
+ ],
+ "_Route21Swimmer3EndBattleText": [
+ 41,
+ 26455
+ ],
+ "_Route21Swimmer4AfterBattleText": [
+ 41,
+ 26560
+ ],
+ "_Route21Swimmer4BattleText": [
+ 41,
+ 26500
+ ],
+ "_Route21Swimmer4EndBattleText": [
+ 41,
+ 26536
+ ],
+ "_Route21Swimmer5AfterBattleText": [
+ 41,
+ 26668
+ ],
+ "_Route21Swimmer5BattleText": [
+ 41,
+ 26621
+ ],
+ "_Route21Swimmer5EndBattleText": [
+ 41,
+ 26654
+ ],
+ "_Route22GateGuardGoRightAheadText": [
+ 40,
+ 26161
+ ],
+ "_Route22GateGuardICantLetYouPassText": [
+ 40,
+ 26117
+ ],
+ "_Route22GateGuardNoBoulderbadgeText": [
+ 40,
+ 26030
+ ],
+ "_Route22PokemonLeagueSignText": [
+ 41,
+ 27713
+ ],
+ "_Route22Rival1DefeatedText": [
+ 41,
+ 26887
+ ],
+ "_Route22Rival1VictoryText": [
+ 41,
+ 26915
+ ],
+ "_Route22Rival2DefeatedText": [
+ 41,
+ 26979
+ ],
+ "_Route22Rival2VictoryText": [
+ 41,
+ 27008
+ ],
+ "_Route22RivalAfterBattleText1": [
+ 41,
+ 27272
+ ],
+ "_Route22RivalAfterBattleText2": [
+ 41,
+ 27588
+ ],
+ "_Route22RivalBeforeBattleText1": [
+ 41,
+ 27110
+ ],
+ "_Route22RivalBeforeBattleText2": [
+ 41,
+ 27405
+ ],
+ "_Route23GoRightAheadText": [
+ 41,
+ 27928
+ ],
+ "_Route23OhThatIsTheBadgeText": [
+ 41,
+ 27857
+ ],
+ "_Route23VictoryRoadGateSignText": [
+ 41,
+ 27963
+ ],
+ "_Route23YouDontHaveTheBadgeYetText": [
+ 41,
+ 27737
+ ],
+ "_Route24CooltrainerF1AfterBattleText": [
+ 41,
+ 28666
+ ],
+ "_Route24CooltrainerF1BattleText": [
+ 41,
+ 28627
+ ],
+ "_Route24CooltrainerF1EndBattleText": [
+ 41,
+ 28653
+ ],
+ "_Route24CooltrainerF2AfterBattleText": [
+ 41,
+ 28833
+ ],
+ "_Route24CooltrainerF2BattleText": [
+ 41,
+ 28785
+ ],
+ "_Route24CooltrainerF2EndBattleText": [
+ 41,
+ 28814
+ ],
+ "_Route24CooltrainerM1DefeatedText": [
+ 41,
+ 28357
+ ],
+ "_Route24CooltrainerM1JoinTeamRocketText": [
+ 41,
+ 28131
+ ],
+ "_Route24CooltrainerM1NoRoomText": [
+ 41,
+ 28106
+ ],
+ "_Route24CooltrainerM1ReceivedNuggetText": [
+ 41,
+ 28084
+ ],
+ "_Route24CooltrainerM1YouBeatOurContestText": [
+ 41,
+ 27996
+ ],
+ "_Route24CooltrainerM1YouCouldBecomeATopLeaderText": [
+ 41,
+ 28379
+ ],
+ "_Route24CooltrainerM1YouJustEarnedAPrizeText": [
+ 41,
+ 28048
+ ],
+ "_Route24CooltrainerM2AfterBattleText": [
+ 41,
+ 28494
+ ],
+ "_Route24CooltrainerM2BattleText": [
+ 41,
+ 28445
+ ],
+ "_Route24CooltrainerM2EndBattleText": [
+ 41,
+ 28478
+ ],
+ "_Route24CooltrainerM3AfterBattleText": [
+ 41,
+ 28592
+ ],
+ "_Route24CooltrainerM3BattleText": [
+ 41,
+ 28545
+ ],
+ "_Route24CooltrainerM3EndBattleText": [
+ 41,
+ 28575
+ ],
+ "_Route24DamianText1": [
+ 41,
+ 29020
+ ],
+ "_Route24DamianText2": [
+ 41,
+ 29164
+ ],
+ "_Route24DamianText3": [
+ 41,
+ 29199
+ ],
+ "_Route24DamianText4": [
+ 41,
+ 29233
+ ],
+ "_Route24Youngster1AfterBattleText": [
+ 41,
+ 28750
+ ],
+ "_Route24Youngster1BattleText": [
+ 41,
+ 28701
+ ],
+ "_Route24Youngster1EndBattleText": [
+ 41,
+ 28731
+ ],
+ "_Route24Youngster2AfterBattleText": [
+ 41,
+ 28985
+ ],
+ "_Route24Youngster2BattleText": [
+ 41,
+ 28868
+ ],
+ "_Route24Youngster2EndBattleText": [
+ 41,
+ 28966
+ ],
+ "_Route25BillSignText": [
+ 41,
+ 30197
+ ],
+ "_Route25CooltrainerF1AfterBattleText": [
+ 41,
+ 29632
+ ],
+ "_Route25CooltrainerF1BattleText": [
+ 41,
+ 29588
+ ],
+ "_Route25CooltrainerF1EndBattleText": [
+ 41,
+ 29616
+ ],
+ "_Route25CooltrainerF2AfterBattleText": [
+ 41,
+ 29835
+ ],
+ "_Route25CooltrainerF2BattleText": [
+ 41,
+ 29772
+ ],
+ "_Route25CooltrainerF2EndBattleText": [
+ 41,
+ 29815
+ ],
+ "_Route25CooltrainerMAfterBattleText": [
+ 41,
+ 29552
+ ],
+ "_Route25CooltrainerMBattleText": [
+ 41,
+ 29499
+ ],
+ "_Route25CooltrainerMEndBattleText": [
+ 41,
+ 29538
+ ],
+ "_Route25Hiker1AfterBattleText": [
+ 41,
+ 29946
+ ],
+ "_Route25Hiker1BattleText": [
+ 41,
+ 29883
+ ],
+ "_Route25Hiker1EndBattleText": [
+ 41,
+ 29928
+ ],
+ "_Route25Hiker2AfterBattleText": [
+ 41,
+ 30041
+ ],
+ "_Route25Hiker2BattleText": [
+ 41,
+ 29983
+ ],
+ "_Route25Hiker2EndBattleText": [
+ 41,
+ 30028
+ ],
+ "_Route25Hiker3AfterBattleText": [
+ 41,
+ 30148
+ ],
+ "_Route25Hiker3BattleText": [
+ 41,
+ 30085
+ ],
+ "_Route25Hiker3EndBattleText": [
+ 41,
+ 30130
+ ],
+ "_Route25Youngster1AfterBattleText": [
+ 41,
+ 29311
+ ],
+ "_Route25Youngster1BattleText": [
+ 41,
+ 29257
+ ],
+ "_Route25Youngster1EndBattleText": [
+ 41,
+ 29296
+ ],
+ "_Route25Youngster2AfterBattleText": [
+ 41,
+ 29447
+ ],
+ "_Route25Youngster2BattleText": [
+ 41,
+ 29373
+ ],
+ "_Route25Youngster2EndBattleText": [
+ 41,
+ 29434
+ ],
+ "_Route25Youngster3AfterBattleText": [
+ 41,
+ 29716
+ ],
+ "_Route25Youngster3BattleText": [
+ 41,
+ 29667
+ ],
+ "_Route25Youngster3EndBattleText": [
+ 41,
+ 29695
+ ],
+ "_Route2DiglettsCaveSignText": [
+ 40,
+ 28028
+ ],
+ "_Route2GateOaksAideFlashExplanationText": [
+ 40,
+ 19941
+ ],
+ "_Route2GateYoungsterText": [
+ 40,
+ 19989
+ ],
+ "_Route2SignText": [
+ 40,
+ 27991
+ ],
+ "_Route2TradeHouseScientistText": [
+ 40,
+ 19873
+ ],
+ "_Route3CooltrainerF1AfterBattleText": [
+ 40,
+ 28429
+ ],
+ "_Route3CooltrainerF1BattleText": [
+ 40,
+ 28386
+ ],
+ "_Route3CooltrainerF1EndBattleText": [
+ 40,
+ 28416
+ ],
+ "_Route3CooltrainerF2AfterBattleText": [
+ 40,
+ 28654
+ ],
+ "_Route3CooltrainerF2BattleText": [
+ 40,
+ 28601
+ ],
+ "_Route3CooltrainerF2EndBattleText": [
+ 40,
+ 28644
+ ],
+ "_Route3CooltrainerF3AfterBattleText": [
+ 40,
+ 28918
+ ],
+ "_Route3CooltrainerF3BattleText": [
+ 40,
+ 28883
+ ],
+ "_Route3CooltrainerF3EndBattleText": [
+ 40,
+ 28907
+ ],
+ "_Route3SignText": [
+ 40,
+ 28954
+ ],
+ "_Route3Text1": [
+ 40,
+ 28043
+ ],
+ "_Route3Youngster1AfterBattleText": [
+ 40,
+ 28191
+ ],
+ "_Route3Youngster1BattleText": [
+ 40,
+ 28135
+ ],
+ "_Route3Youngster1EndBattleText": [
+ 40,
+ 28171
+ ],
+ "_Route3Youngster2AfterBattleText": [
+ 40,
+ 28325
+ ],
+ "_Route3Youngster2BattleText": [
+ 40,
+ 28254
+ ],
+ "_Route3Youngster2EndBattleText": [
+ 40,
+ 28305
+ ],
+ "_Route3Youngster3AfterBattleText": [
+ 40,
+ 28537
+ ],
+ "_Route3Youngster3BattleText": [
+ 40,
+ 28470
+ ],
+ "_Route3Youngster3EndBattleText": [
+ 40,
+ 28502
+ ],
+ "_Route3Youngster4AfterBattleText": [
+ 40,
+ 28750
+ ],
+ "_Route3Youngster4BattleText": [
+ 40,
+ 28699
+ ],
+ "_Route3Youngster4EndBattleText": [
+ 40,
+ 28731
+ ],
+ "_Route3Youngster5AfterBattleText": [
+ 40,
+ 28836
+ ],
+ "_Route3Youngster5BattleText": [
+ 40,
+ 28789
+ ],
+ "_Route3Youngster5EndBattleText": [
+ 40,
+ 28817
+ ],
+ "_Route4CooltrainerF1Text": [
+ 40,
+ 28977
+ ],
+ "_Route4CooltrainerF2AfterBattleText": [
+ 40,
+ 29083
+ ],
+ "_Route4CooltrainerF2BattleText": [
+ 40,
+ 29022
+ ],
+ "_Route4CooltrainerF2EndBattleText": [
+ 40,
+ 29055
+ ],
+ "_Route4MtMoonSignText": [
+ 40,
+ 29152
+ ],
+ "_Route4SignText": [
+ 40,
+ 29177
+ ],
+ "_Route5UndergroundPathSignText": [
+ 40,
+ 29210
+ ],
+ "_Route6CooltrainerF1AfterBattleText": [
+ 40,
+ 29423
+ ],
+ "_Route6CooltrainerF1BattleText": [
+ 40,
+ 29359
+ ],
+ "_Route6CooltrainerF1EndBattleText": [
+ 40,
+ 29401
+ ],
+ "_Route6CooltrainerF2AfterBattleText": [
+ 40,
+ 29720
+ ],
+ "_Route6CooltrainerF2BattleText": [
+ 40,
+ 29677
+ ],
+ "_Route6CooltrainerF2EndBattleText": [
+ 40,
+ 29702
+ ],
+ "_Route6CooltrainerM1AfterBattleText": [
+ 40,
+ 29324
+ ],
+ "_Route6CooltrainerM1BattleText": [
+ 40,
+ 29259
+ ],
+ "_Route6CooltrainerM1EndBattleText": [
+ 40,
+ 29303
+ ],
+ "_Route6CooltrainerM2AfterBattleText": [
+ 40,
+ 29631
+ ],
+ "_Route6CooltrainerM2BattleText": [
+ 40,
+ 29582
+ ],
+ "_Route6CooltrainerM2EndBattleText": [
+ 40,
+ 29612
+ ],
+ "_Route6UndergroundPathSignText": [
+ 40,
+ 29863
+ ],
+ "_Route6Youngster1AfterBattleText": [
+ 40,
+ 29531
+ ],
+ "_Route6Youngster1BattleText": [
+ 40,
+ 29478
+ ],
+ "_Route6Youngster1EndBattleText": [
+ 40,
+ 29511
+ ],
+ "_Route6Youngster2AfterBattleText": [
+ 40,
+ 29825
+ ],
+ "_Route6Youngster2BattleText": [
+ 40,
+ 29764
+ ],
+ "_Route6Youngster2EndBattleText": [
+ 40,
+ 29806
+ ],
+ "_Route7UndergroundPathSignText": [
+ 40,
+ 29912
+ ],
+ "_Route8CooltrainerF1AfterBattleText": [
+ 40,
+ 30286
+ ],
+ "_Route8CooltrainerF1BattleText": [
+ 40,
+ 30238
+ ],
+ "_Route8CooltrainerF1EndBattleText": [
+ 40,
+ 30274
+ ],
+ "_Route8CooltrainerF2AfterBattleText": [
+ 40,
+ 30493
+ ],
+ "_Route8CooltrainerF2BattleText": [
+ 40,
+ 30448
+ ],
+ "_Route8CooltrainerF2EndBattleText": [
+ 40,
+ 30486
+ ],
+ "_Route8CooltrainerF3AfterBattleText": [
+ 40,
+ 30600
+ ],
+ "_Route8CooltrainerF3BattleText": [
+ 40,
+ 30535
+ ],
+ "_Route8CooltrainerF3EndBattleText": [
+ 40,
+ 30580
+ ],
+ "_Route8CooltrainerF4AfterBattleText": [
+ 40,
+ 30848
+ ],
+ "_Route8CooltrainerF4BattleText": [
+ 40,
+ 30771
+ ],
+ "_Route8CooltrainerF4EndBattleText": [
+ 40,
+ 30809
+ ],
+ "_Route8Gambler1AfterBattleText": [
+ 40,
+ 30106
+ ],
+ "_Route8Gambler1BattleText": [
+ 40,
+ 30052
+ ],
+ "_Route8Gambler1EndBattleText": [
+ 40,
+ 30084
+ ],
+ "_Route8Gambler2AfterBattleText": [
+ 40,
+ 30711
+ ],
+ "_Route8Gambler2BattleText": [
+ 40,
+ 30657
+ ],
+ "_Route8Gambler2EndBattleText": [
+ 40,
+ 30688
+ ],
+ "_Route8SuperNerd1AfterBattleText": [
+ 40,
+ 30018
+ ],
+ "_Route8SuperNerd1BattleText": [
+ 40,
+ 29959
+ ],
+ "_Route8SuperNerd1EndBattleText": [
+ 40,
+ 30003
+ ],
+ "_Route8SuperNerd2AfterBattleText": [
+ 40,
+ 30190
+ ],
+ "_Route8SuperNerd2BattleText": [
+ 40,
+ 30137
+ ],
+ "_Route8SuperNerd2EndBattleText": [
+ 40,
+ 30172
+ ],
+ "_Route8SuperNerd3AfterBattleText": [
+ 40,
+ 30398
+ ],
+ "_Route8SuperNerd3BattleText": [
+ 40,
+ 30342
+ ],
+ "_Route8SuperNerd3EndBattleText": [
+ 40,
+ 30375
+ ],
+ "_Route8UndergroundSignText": [
+ 40,
+ 30913
+ ],
+ "_Route9AJAfterBattleText": [
+ 40,
+ 31125
+ ],
+ "_Route9AJBattleText": [
+ 40,
+ 31070
+ ],
+ "_Route9AJEndBattleText": [
+ 40,
+ 31105
+ ],
+ "_Route9CooltrainerF1AfterBattleText": [
+ 40,
+ 31015
+ ],
+ "_Route9CooltrainerF1BattleText": [
+ 40,
+ 30960
+ ],
+ "_Route9CooltrainerF1EndBattleText": [
+ 40,
+ 30997
+ ],
+ "_Route9CooltrainerF2AfterBattleText": [
+ 40,
+ 31318
+ ],
+ "_Route9CooltrainerF2BattleText": [
+ 40,
+ 31267
+ ],
+ "_Route9CooltrainerF2EndBattleText": [
+ 40,
+ 31297
+ ],
+ "_Route9CooltrainerM2AfterBattleText": [
+ 40,
+ 31234
+ ],
+ "_Route9CooltrainerM2BattleText": [
+ 40,
+ 31172
+ ],
+ "_Route9CooltrainerM2EndBattleText": [
+ 40,
+ 31216
+ ],
+ "_Route9Hiker1AfterBattleText": [
+ 40,
+ 31443
+ ],
+ "_Route9Hiker1BattleText": [
+ 40,
+ 31363
+ ],
+ "_Route9Hiker1EndBattleText": [
+ 40,
+ 31397
+ ],
+ "_Route9Hiker2AfterBattleText": [
+ 40,
+ 31541
+ ],
+ "_Route9Hiker2BattleText": [
+ 40,
+ 31491
+ ],
+ "_Route9Hiker2EndBattleText": [
+ 40,
+ 31528
+ ],
+ "_Route9Hiker3AfterBattleText": [
+ 40,
+ 31772
+ ],
+ "_Route9Hiker3BattleText": [
+ 40,
+ 31717
+ ],
+ "_Route9Hiker3EndBattleText": [
+ 40,
+ 31743
+ ],
+ "_Route9SignText": [
+ 41,
+ 16460
+ ],
+ "_Route9Youngster1AfterBattleText": [
+ 40,
+ 31664
+ ],
+ "_Route9Youngster1BattleText": [
+ 40,
+ 31572
+ ],
+ "_Route9Youngster1EndBattleText": [
+ 40,
+ 31629
+ ],
+ "_Route9Youngster2AfterBattleText": [
+ 41,
+ 16420
+ ],
+ "_Route9Youngster2BattleText": [
+ 41,
+ 16384
+ ],
+ "_Route9Youngster2EndBattleText": [
+ 41,
+ 16408
+ ],
+ "_RunAwayText": [
+ 39,
+ 30473
+ ],
+ "_SSAnne1FRoomsCooltrainerFAfterBattleText": [
+ 38,
+ 22391
+ ],
+ "_SSAnne1FRoomsCooltrainerFBattleText": [
+ 38,
+ 22297
+ ],
+ "_SSAnne1FRoomsCooltrainerFEndBattleText": [
+ 38,
+ 22348
+ ],
+ "_SSAnne1FRoomsGentleman1AfterBattleText": [
+ 38,
+ 22079
+ ],
+ "_SSAnne1FRoomsGentleman1BattleText": [
+ 38,
+ 21999
+ ],
+ "_SSAnne1FRoomsGentleman1EndBattleText": [
+ 38,
+ 22060
+ ],
+ "_SSAnne1FRoomsGentleman2AfterBattleText": [
+ 38,
+ 22168
+ ],
+ "_SSAnne1FRoomsGentleman2BattleText": [
+ 38,
+ 22111
+ ],
+ "_SSAnne1FRoomsGentleman2EndBattleText": [
+ 38,
+ 22144
+ ],
+ "_SSAnne1FRoomsGentleman3Text": [
+ 38,
+ 22615
+ ],
+ "_SSAnne1FRoomsGirl1Text": [
+ 38,
+ 22469
+ ],
+ "_SSAnne1FRoomsGirl2Text": [
+ 38,
+ 22580
+ ],
+ "_SSAnne1FRoomsLittleGirlText": [
+ 38,
+ 22546
+ ],
+ "_SSAnne1FRoomsMiddleAgedManText": [
+ 38,
+ 22512
+ ],
+ "_SSAnne1FRoomsWigglytuffText": [
+ 38,
+ 21973
+ ],
+ "_SSAnne1FRoomsYoungsterAfterBattleText": [
+ 38,
+ 22245
+ ],
+ "_SSAnne1FRoomsYoungsterBattleText": [
+ 38,
+ 22203
+ ],
+ "_SSAnne1FRoomsYoungsterEndBattleText": [
+ 38,
+ 22225
+ ],
+ "_SSAnne1FSailorText": [
+ 38,
+ 19941
+ ],
+ "_SSAnne1FWaiterText": [
+ 38,
+ 19823
+ ],
+ "_SSAnne2FRivalCutMasterText": [
+ 38,
+ 20405
+ ],
+ "_SSAnne2FRivalDefeatedText": [
+ 38,
+ 20310
+ ],
+ "_SSAnne2FRivalText": [
+ 38,
+ 20121
+ ],
+ "_SSAnne2FRivalVictoryText": [
+ 38,
+ 20352
+ ],
+ "_SSAnne2FRoomsBeautyText": [
+ 38,
+ 23432
+ ],
+ "_SSAnne2FRoomsBrunetteGirlText": [
+ 38,
+ 23390
+ ],
+ "_SSAnne2FRoomsCooltrainerFAfterBattleText": [
+ 38,
+ 23224
+ ],
+ "_SSAnne2FRoomsCooltrainerFBattleText": [
+ 38,
+ 23178
+ ],
+ "_SSAnne2FRoomsCooltrainerFEndBattleText": [
+ 38,
+ 23209
+ ],
+ "_SSAnne2FRoomsFisherAfterBattleText": [
+ 38,
+ 23027
+ ],
+ "_SSAnne2FRoomsFisherBattleText": [
+ 38,
+ 22985
+ ],
+ "_SSAnne2FRoomsFisherEndBattleText": [
+ 38,
+ 23014
+ ],
+ "_SSAnne2FRoomsGentleman1AfterBattleText": [
+ 38,
+ 22952
+ ],
+ "_SSAnne2FRoomsGentleman1BattleText": [
+ 38,
+ 22867
+ ],
+ "_SSAnne2FRoomsGentleman1EndBattleText": [
+ 38,
+ 22915
+ ],
+ "_SSAnne2FRoomsGentleman2AfterBattleText": [
+ 38,
+ 23146
+ ],
+ "_SSAnne2FRoomsGentleman2BattleText": [
+ 38,
+ 23081
+ ],
+ "_SSAnne2FRoomsGentleman2EndBattleText": [
+ 38,
+ 23126
+ ],
+ "_SSAnne2FRoomsGentleman3Text": [
+ 38,
+ 22679
+ ],
+ "_SSAnne2FRoomsGentleman4Text": [
+ 38,
+ 22772
+ ],
+ "_SSAnne2FRoomsGentleman5Text": [
+ 38,
+ 23255
+ ],
+ "_SSAnne2FRoomsGrampsText": [
+ 38,
+ 22834
+ ],
+ "_SSAnne2FRoomsLittleBoyText": [
+ 38,
+ 23339
+ ],
+ "_SSAnne2FWaiterText": [
+ 38,
+ 20019
+ ],
+ "_SSAnne3FSailorText": [
+ 38,
+ 20554
+ ],
+ "_SSAnneB1FRoomsFisherAfterBattleText": [
+ 38,
+ 24096
+ ],
+ "_SSAnneB1FRoomsFisherBattleText": [
+ 38,
+ 24002
+ ],
+ "_SSAnneB1FRoomsFisherEndBattleText": [
+ 38,
+ 24064
+ ],
+ "_SSAnneB1FRoomsMachokeText": [
+ 38,
+ 23465
+ ],
+ "_SSAnneB1FRoomsSailor1AfterBattleText": [
+ 38,
+ 23568
+ ],
+ "_SSAnneB1FRoomsSailor1BattleText": [
+ 38,
+ 23490
+ ],
+ "_SSAnneB1FRoomsSailor1EndBattleText": [
+ 38,
+ 23542
+ ],
+ "_SSAnneB1FRoomsSailor2AfterBattleText": [
+ 38,
+ 23655
+ ],
+ "_SSAnneB1FRoomsSailor2BattleText": [
+ 38,
+ 23602
+ ],
+ "_SSAnneB1FRoomsSailor2EndBattleText": [
+ 38,
+ 23633
+ ],
+ "_SSAnneB1FRoomsSailor3AfterBattleText": [
+ 38,
+ 23752
+ ],
+ "_SSAnneB1FRoomsSailor3BattleText": [
+ 38,
+ 23704
+ ],
+ "_SSAnneB1FRoomsSailor3EndBattleText": [
+ 38,
+ 23731
+ ],
+ "_SSAnneB1FRoomsSailor4AfterBattleText": [
+ 38,
+ 23841
+ ],
+ "_SSAnneB1FRoomsSailor4BattleText": [
+ 38,
+ 23794
+ ],
+ "_SSAnneB1FRoomsSailor4EndBattleText": [
+ 38,
+ 23825
+ ],
+ "_SSAnneB1FRoomsSailor5AfterBattleText": [
+ 38,
+ 23958
+ ],
+ "_SSAnneB1FRoomsSailor5BattleText": [
+ 38,
+ 23889
+ ],
+ "_SSAnneB1FRoomsSailor5EndBattleText": [
+ 38,
+ 23934
+ ],
+ "_SSAnneB1FRoomsSuperNerdText": [
+ 38,
+ 24139
+ ],
+ "_SSAnneBowCooltrainerMText": [
+ 38,
+ 20697
+ ],
+ "_SSAnneBowSailor1Text": [
+ 38,
+ 20666
+ ],
+ "_SSAnneBowSailor2AfterBattleText": [
+ 38,
+ 20799
+ ],
+ "_SSAnneBowSailor2BattleText": [
+ 38,
+ 20746
+ ],
+ "_SSAnneBowSailor2EndBattleText": [
+ 38,
+ 20780
+ ],
+ "_SSAnneBowSailor3AfterBattleText": [
+ 38,
+ 20899
+ ],
+ "_SSAnneBowSailor3BattleText": [
+ 38,
+ 20847
+ ],
+ "_SSAnneBowSailor3EndBattleText": [
+ 38,
+ 20877
+ ],
+ "_SSAnneBowSuperNerdText": [
+ 38,
+ 20615
+ ],
+ "_SSAnneCaptainsRoomCaptainHM01NoRoomText": [
+ 38,
+ 21851
+ ],
+ "_SSAnneCaptainsRoomCaptainIFeelMuchBetterText": [
+ 38,
+ 21575
+ ],
+ "_SSAnneCaptainsRoomCaptainNotSickAnymoreText": [
+ 38,
+ 21787
+ ],
+ "_SSAnneCaptainsRoomCaptainReceivedHM01Text": [
+ 38,
+ 21772
+ ],
+ "_SSAnneCaptainsRoomRubCaptainsBackText": [
+ 38,
+ 21469
+ ],
+ "_SSAnneCaptainsRoomSeasickBookText": [
+ 38,
+ 21915
+ ],
+ "_SSAnneCaptainsRoomTrashText": [
+ 38,
+ 21886
+ ],
+ "_SSAnneKitchenCook1Text": [
+ 38,
+ 20964
+ ],
+ "_SSAnneKitchenCook2Text": [
+ 38,
+ 21013
+ ],
+ "_SSAnneKitchenCook3Text": [
+ 38,
+ 21046
+ ],
+ "_SSAnneKitchenCook4Text": [
+ 38,
+ 21076
+ ],
+ "_SSAnneKitchenCook5Text": [
+ 38,
+ 21133
+ ],
+ "_SSAnneKitchenCook6Text": [
+ 38,
+ 21192
+ ],
+ "_SSAnneKitchenCook7MainCourseIsText": [
+ 38,
+ 21250
+ ],
+ "_SSTicketNoRoomText": [
+ 40,
+ 27330
+ ],
+ "_SSTicketReceivedText": [
+ 40,
+ 27307
+ ],
+ "_SafariZoneAngryText": [
+ 39,
+ 31567
+ ],
+ "_SafariZoneCenterRestHouseGirlText": [
+ 39,
+ 18761
+ ],
+ "_SafariZoneCenterRestHouseScientistText": [
+ 39,
+ 18803
+ ],
+ "_SafariZoneCenterRestHouseSignText": [
+ 39,
+ 18687
+ ],
+ "_SafariZoneCenterTrainerTipsSignText": [
+ 39,
+ 18699
+ ],
+ "_SafariZoneEastRestHouseRockerText": [
+ 39,
+ 19459
+ ],
+ "_SafariZoneEastRestHouseScientistText": [
+ 39,
+ 19409
+ ],
+ "_SafariZoneEastRestHouseSignText": [
+ 39,
+ 18136
+ ],
+ "_SafariZoneEastRestHouseSilphWorkerMText": [
+ 39,
+ 19512
+ ],
+ "_SafariZoneEastSignText": [
+ 39,
+ 18211
+ ],
+ "_SafariZoneEastTrainerTipsText": [
+ 39,
+ 18148
+ ],
+ "_SafariZoneEatingText": [
+ 39,
+ 31544
+ ],
+ "_SafariZoneGateSafariZoneWorker1CallYouOnThePAText": [
+ 44,
+ 18995
+ ],
+ "_SafariZoneGateSafariZoneWorker1GoodHaulComeAgainText": [
+ 44,
+ 18766
+ ],
+ "_SafariZoneGateSafariZoneWorker1GoodLuckText": [
+ 44,
+ 18754
+ ],
+ "_SafariZoneGateSafariZoneWorker1LeavingEarlyText": [
+ 44,
+ 18690
+ ],
+ "_SafariZoneGateSafariZoneWorker1NotEnoughMoneyText": [
+ 44,
+ 19087
+ ],
+ "_SafariZoneGateSafariZoneWorker1PleaseComeAgainText": [
+ 44,
+ 19063
+ ],
+ "_SafariZoneGateSafariZoneWorker1ReturnSafariBallsText": [
+ 44,
+ 18707
+ ],
+ "_SafariZoneGateSafariZoneWorker1Text": [
+ 44,
+ 18661
+ ],
+ "_SafariZoneGateSafariZoneWorker1ThatllBe500PleaseText": [
+ 44,
+ 18903
+ ],
+ "_SafariZoneGateSafariZoneWorker1WouldYouLikeToJoinText": [
+ 44,
+ 18804
+ ],
+ "_SafariZoneGateSafariZoneWorker2FirstTimeHereText": [
+ 44,
+ 19112
+ ],
+ "_SafariZoneGateSafariZoneWorker2SafariZoneExplanationText": [
+ 44,
+ 19145
+ ],
+ "_SafariZoneGateSafariZoneWorker2YoureARegularHereText": [
+ 44,
+ 19381
+ ],
+ "_SafariZoneLowCostText1": [
+ 44,
+ 19411
+ ],
+ "_SafariZoneLowCostText2": [
+ 44,
+ 19450
+ ],
+ "_SafariZoneLowCostText3": [
+ 44,
+ 19486
+ ],
+ "_SafariZoneLowCostText4": [
+ 44,
+ 19566
+ ],
+ "_SafariZoneLowCostText5": [
+ 44,
+ 19568
+ ],
+ "_SafariZoneLowCostText6": [
+ 44,
+ 19609
+ ],
+ "_SafariZoneLowCostText7": [
+ 44,
+ 19641
+ ],
+ "_SafariZoneLowCostText8": [
+ 44,
+ 19670
+ ],
+ "_SafariZoneNorthRestHouseGentlemanText": [
+ 39,
+ 19727
+ ],
+ "_SafariZoneNorthRestHouseSafariZoneWorkerText": [
+ 39,
+ 19661
+ ],
+ "_SafariZoneNorthRestHouseScientistText": [
+ 39,
+ 19546
+ ],
+ "_SafariZoneNorthRestHouseSignText": [
+ 39,
+ 18238
+ ],
+ "_SafariZoneNorthSignText": [
+ 39,
+ 18297
+ ],
+ "_SafariZoneNorthTrainerTips1Text": [
+ 39,
+ 18250
+ ],
+ "_SafariZoneNorthTrainerTips2Text": [
+ 39,
+ 18305
+ ],
+ "_SafariZoneNorthTrainerTips3Text": [
+ 39,
+ 18391
+ ],
+ "_SafariZoneSecretHouseFishingGuruHM03ExplanationText": [
+ 39,
+ 19023
+ ],
+ "_SafariZoneSecretHouseFishingGuruHM03NoRoomText": [
+ 39,
+ 19194
+ ],
+ "_SafariZoneSecretHouseFishingGuruReceivedHM03Text": [
+ 39,
+ 19003
+ ],
+ "_SafariZoneSecretHouseFishingGuruYouHaveWonText": [
+ 39,
+ 18844
+ ],
+ "_SafariZoneWestFindWardensTeethSignText": [
+ 39,
+ 18461
+ ],
+ "_SafariZoneWestRestHouseCooltrainerMText": [
+ 39,
+ 19314
+ ],
+ "_SafariZoneWestRestHouseScientistText": [
+ 39,
+ 19239
+ ],
+ "_SafariZoneWestRestHouseSignText": [
+ 39,
+ 18449
+ ],
+ "_SafariZoneWestRestHouseSilphWorkerFText": [
+ 39,
+ 19358
+ ],
+ "_SafariZoneWestSignText": [
+ 39,
+ 18661
+ ],
+ "_SafariZoneWestTrainerTipsText": [
+ 39,
+ 18587
+ ],
+ "_SaffronCityFightingDojoSignText": [
+ 45,
+ 26710
+ ],
+ "_SaffronCityGentlemanText": [
+ 45,
+ 26405
+ ],
+ "_SaffronCityGymSignText": [
+ 45,
+ 26725
+ ],
+ "_SaffronCityMrPsychicsHouseSignText": [
+ 45,
+ 27026
+ ],
+ "_SaffronCityPidgeotText": [
+ 45,
+ 26502
+ ],
+ "_SaffronCityPokecenterGuyText1": [
+ 39,
+ 25578
+ ],
+ "_SaffronCityPokecenterGuyText2": [
+ 39,
+ 25645
+ ],
+ "_SaffronCityRockerText": [
+ 45,
+ 26523
+ ],
+ "_SaffronCityRocket1Text": [
+ 45,
+ 26007
+ ],
+ "_SaffronCityRocket2Text": [
+ 45,
+ 26036
+ ],
+ "_SaffronCityRocket3Text": [
+ 45,
+ 26068
+ ],
+ "_SaffronCityRocket4Text": [
+ 45,
+ 26089
+ ],
+ "_SaffronCityRocket5Text": [
+ 45,
+ 26122
+ ],
+ "_SaffronCityRocket6Text": [
+ 45,
+ 26158
+ ],
+ "_SaffronCityRocket7Text": [
+ 45,
+ 26190
+ ],
+ "_SaffronCityRocket8Text": [
+ 45,
+ 26568
+ ],
+ "_SaffronCityRocket9Text": [
+ 45,
+ 26623
+ ],
+ "_SaffronCityScientistText": [
+ 45,
+ 26255
+ ],
+ "_SaffronCitySignText": [
+ 45,
+ 26663
+ ],
+ "_SaffronCitySilphCoLatestProductSignText": [
+ 45,
+ 27045
+ ],
+ "_SaffronCitySilphCoSignText": [
+ 45,
+ 26999
+ ],
+ "_SaffronCitySilphWorkerFText": [
+ 45,
+ 26357
+ ],
+ "_SaffronCitySilphWorkerMText": [
+ 45,
+ 26303
+ ],
+ "_SaffronCityTrainerTips1Text": [
+ 45,
+ 26792
+ ],
+ "_SaffronCityTrainerTips2Text": [
+ 45,
+ 26903
+ ],
+ "_SaffronGateGuardGeeImThirstyText": [
+ 40,
+ 20582
+ ],
+ "_SaffronGateGuardImParchedText": [
+ 40,
+ 20660
+ ],
+ "_SaffronGateGuardThanksForTheDrinkText": [
+ 40,
+ 20864
+ ],
+ "_SaffronGateGuardYouCanGoOnThroughText": [
+ 40,
+ 20730
+ ],
+ "_SaffronGymChanneler1AfterBattleText": [
+ 44,
+ 28285
+ ],
+ "_SaffronGymChanneler1BattleText": [
+ 44,
+ 28220
+ ],
+ "_SaffronGymChanneler1EndBattleText": [
+ 44,
+ 28267
+ ],
+ "_SaffronGymChanneler2AfterBattleText": [
+ 44,
+ 28571
+ ],
+ "_SaffronGymChanneler2BattleText": [
+ 44,
+ 28480
+ ],
+ "_SaffronGymChanneler2EndBattleText": [
+ 44,
+ 28559
+ ],
+ "_SaffronGymChanneler3AfterBattleText": [
+ 44,
+ 28783
+ ],
+ "_SaffronGymChanneler3BattleText": [
+ 44,
+ 28730
+ ],
+ "_SaffronGymChanneler3EndBattleText": [
+ 44,
+ 28764
+ ],
+ "_SaffronGymGuideBeatSabrinaText": [
+ 44,
+ 28153
+ ],
+ "_SaffronGymGuideChampInMakingText": [
+ 44,
+ 27985
+ ],
+ "_SaffronGymSabrinaMarshBadgeInfoText": [
+ 44,
+ 27679
+ ],
+ "_SaffronGymSabrinaPostBattleAdviceText": [
+ 44,
+ 27621
+ ],
+ "_SaffronGymSabrinaReceivedMarshBadgeText": [
+ 44,
+ 27516
+ ],
+ "_SaffronGymSabrinaReceivedTM46Text": [
+ 44,
+ 27862
+ ],
+ "_SaffronGymSabrinaTM46NoRoomText": [
+ 44,
+ 27950
+ ],
+ "_SaffronGymSabrinaText": [
+ 44,
+ 27325
+ ],
+ "_SaffronGymYoungster1AfterBattleText": [
+ 44,
+ 28450
+ ],
+ "_SaffronGymYoungster1BattleText": [
+ 44,
+ 28393
+ ],
+ "_SaffronGymYoungster1EndBattleText": [
+ 44,
+ 28427
+ ],
+ "_SaffronGymYoungster2AfterBattleText": [
+ 44,
+ 28677
+ ],
+ "_SaffronGymYoungster2BattleText": [
+ 44,
+ 28615
+ ],
+ "_SaffronGymYoungster2EndBattleText": [
+ 44,
+ 28655
+ ],
+ "_SaffronGymYoungster3AfterBattleText": [
+ 44,
+ 28924
+ ],
+ "_SaffronGymYoungster3BattleText": [
+ 44,
+ 28826
+ ],
+ "_SaffronGymYoungster3EndBattleText": [
+ 44,
+ 28898
+ ],
+ "_SaffronGymYoungster4AfterBattleText": [
+ 44,
+ 29137
+ ],
+ "_SaffronGymYoungster4BattleText": [
+ 44,
+ 29045
+ ],
+ "_SaffronGymYoungster4EndBattleText": [
+ 44,
+ 29128
+ ],
+ "_SaffronMartCooltrainerFText": [
+ 44,
+ 29480
+ ],
+ "_SaffronMartSuperNerdText": [
+ 44,
+ 29409
+ ],
+ "_SaffronPidgeyHouseBrunetteGirlText": [
+ 44,
+ 29187
+ ],
+ "_SaffronPidgeyHousePaperText": [
+ 44,
+ 29331
+ ],
+ "_SaffronPidgeyHousePidgeyText": [
+ 44,
+ 29264
+ ],
+ "_SaffronPidgeyHouseYoungsterText": [
+ 44,
+ 29284
+ ],
+ "_SaffronPokecenterBeautyText": [
+ 44,
+ 29580
+ ],
+ "_SaffronPokecenterGentlemanText": [
+ 44,
+ 29629
+ ],
+ "_SandshrewDexEntry": [
+ 46,
+ 18870
+ ],
+ "_SandslashDexEntry": [
+ 46,
+ 18967
+ ],
+ "_SaveOptionText": [
+ 39,
+ 25827
+ ],
+ "_SavingEnergyText": [
+ 39,
+ 30896
+ ],
+ "_SavingText": [
+ 41,
+ 30290
+ ],
+ "_ScaredText": [
+ 39,
+ 30641
+ ],
+ "_ScytherDexEntry": [
+ 46,
+ 28300
+ ],
+ "_SeadraDexEntry": [
+ 46,
+ 27700
+ ],
+ "_SeafoamIslandsB4FArticunoBattleText": [
+ 39,
+ 24082
+ ],
+ "_SeafoamIslandsB4FBouldersSignText": [
+ 39,
+ 24091
+ ],
+ "_SeafoamIslandsB4FDangerSignText": [
+ 39,
+ 24133
+ ],
+ "_SeakingDexEntry": [
+ 46,
+ 27904
+ ],
+ "_SeelDexEntry": [
+ 46,
+ 24678
+ ],
+ "_SentToBoxText": [
+ 45,
+ 16890
+ ],
+ "_ShallWeHealYourPokemonText": [
+ 44,
+ 30649
+ ],
+ "_ShellderDexEntry": [
+ 46,
+ 25057
+ ],
+ "_ShroudedInMistText": [
+ 42,
+ 17319
+ ],
+ "_SilphCo10FGiovanniILostAgainText": [
+ 39,
+ 17023
+ ],
+ "_SilphCo10FRocketAfterBattleText": [
+ 38,
+ 31125
+ ],
+ "_SilphCo10FRocketBattleText": [
+ 38,
+ 31064
+ ],
+ "_SilphCo10FRocketEndBattleText": [
+ 38,
+ 31112
+ ],
+ "_SilphCo10FScientistAfterBattleText": [
+ 38,
+ 31225
+ ],
+ "_SilphCo10FScientistBattleText": [
+ 38,
+ 31176
+ ],
+ "_SilphCo10FScientistEndBattleText": [
+ 38,
+ 31205
+ ],
+ "_SilphCo10FSilphWorkerFImScaredText": [
+ 38,
+ 31008
+ ],
+ "_SilphCo10FSilphWorkerFQuietAboutMyCryingText": [
+ 38,
+ 31028
+ ],
+ "_SilphCo11FBeautyText": [
+ 39,
+ 16788
+ ],
+ "_SilphCo11FGiovanniText": [
+ 39,
+ 16858
+ ],
+ "_SilphCo11FGiovanniYouRuinedOurPlansText": [
+ 39,
+ 17047
+ ],
+ "_SilphCo11FRocket2AfterBattleText": [
+ 39,
+ 17279
+ ],
+ "_SilphCo11FRocket2BattleText": [
+ 39,
+ 17212
+ ],
+ "_SilphCo11FRocket2EndBattleText": [
+ 39,
+ 17260
+ ],
+ "_SilphCo11FSilphPresidentMasterBallDescriptionText": [
+ 39,
+ 16601
+ ],
+ "_SilphCo11FSilphPresidentNoRoomText": [
+ 39,
+ 16760
+ ],
+ "_SilphCo11FSilphPresidentReceivedMasterBallText": [
+ 39,
+ 16584
+ ],
+ "_SilphCo11FSilphPresidentText": [
+ 39,
+ 16384
+ ],
+ "_SilphCo1FLinkReceptionistText": [
+ 44,
+ 29528
+ ],
+ "_SilphCo2FRocket1AfterBattleText": [
+ 38,
+ 26365
+ ],
+ "_SilphCo2FRocket1BattleText": [
+ 38,
+ 26327
+ ],
+ "_SilphCo2FRocket1EndBattleText": [
+ 38,
+ 26357
+ ],
+ "_SilphCo2FRocket2AfterBattleText": [
+ 38,
+ 26483
+ ],
+ "_SilphCo2FRocket2BattleText": [
+ 38,
+ 26437
+ ],
+ "_SilphCo2FRocket2EndBattleText": [
+ 38,
+ 26472
+ ],
+ "_SilphCo2FScientist1AfterBattleText": [
+ 38,
+ 26210
+ ],
+ "_SilphCo2FScientist1BattleText": [
+ 38,
+ 26148
+ ],
+ "_SilphCo2FScientist1EndBattleText": [
+ 38,
+ 26176
+ ],
+ "_SilphCo2FScientist2AfterBattleText": [
+ 38,
+ 26294
+ ],
+ "_SilphCo2FScientist2BattleText": [
+ 38,
+ 26250
+ ],
+ "_SilphCo2FScientist2EndBattleText": [
+ 38,
+ 26281
+ ],
+ "_SilphCo2FSilphWorkerFReceivedTM36Text": [
+ 38,
+ 26016
+ ],
+ "_SilphCo2FSilphWorkerFTM36ExplanationText": [
+ 38,
+ 26031
+ ],
+ "_SilphCo2FSilphWorkerFTM36NoRoomText": [
+ 38,
+ 26114
+ ],
+ "_SilphCo3FRocketAfterBattleText": [
+ 38,
+ 26636
+ ],
+ "_SilphCo3FRocketBattleText": [
+ 38,
+ 26596
+ ],
+ "_SilphCo3FRocketEndBattleText": [
+ 38,
+ 26624
+ ],
+ "_SilphCo3FScientistAfterBattleText": [
+ 38,
+ 26751
+ ],
+ "_SilphCo3FScientistBattleText": [
+ 38,
+ 26681
+ ],
+ "_SilphCo3FScientistEndBattleText": [
+ 38,
+ 26731
+ ],
+ "_SilphCo3FSilphWorkerMWhatShouldIDoText": [
+ 38,
+ 26527
+ ],
+ "_SilphCo3FSilphWorkerMYouSavedUsText": [
+ 38,
+ 26564
+ ],
+ "_SilphCo4FRocket1AfterBattleText": [
+ 38,
+ 26937
+ ],
+ "_SilphCo4FRocket1BattleText": [
+ 38,
+ 26884
+ ],
+ "_SilphCo4FRocket1EndBattleText": [
+ 38,
+ 26929
+ ],
+ "_SilphCo4FRocket2AfterBattleText": [
+ 38,
+ 27132
+ ],
+ "_SilphCo4FRocket2BattleText": [
+ 38,
+ 27099
+ ],
+ "_SilphCo4FRocket2EndBattleText": [
+ 38,
+ 27118
+ ],
+ "_SilphCo4FScientistAfterBattleText": [
+ 38,
+ 27038
+ ],
+ "_SilphCo4FScientistBattleText": [
+ 38,
+ 26984
+ ],
+ "_SilphCo4FScientistEndBattleText": [
+ 38,
+ 27016
+ ],
+ "_SilphCo4FSilphWorkerMImHidingText": [
+ 38,
+ 26826
+ ],
+ "_SilphCo4FSilphWorkerMTeamRocketIsGoneText": [
+ 38,
+ 26857
+ ],
+ "_SilphCo5FPokemonReport1Text": [
+ 38,
+ 27705
+ ],
+ "_SilphCo5FPokemonReport2Text": [
+ 38,
+ 27783
+ ],
+ "_SilphCo5FPokemonReport3Text": [
+ 38,
+ 27849
+ ],
+ "_SilphCo5FRockerAfterBattleText": [
+ 38,
+ 27555
+ ],
+ "_SilphCo5FRockerBattleText": [
+ 38,
+ 27495
+ ],
+ "_SilphCo5FRockerEndBattleText": [
+ 38,
+ 27541
+ ],
+ "_SilphCo5FRocket1AfterBattleText": [
+ 38,
+ 27324
+ ],
+ "_SilphCo5FRocket1BattleText": [
+ 38,
+ 27280
+ ],
+ "_SilphCo5FRocket1EndBattleText": [
+ 38,
+ 27317
+ ],
+ "_SilphCo5FRocket2AfterBattleText": [
+ 38,
+ 27656
+ ],
+ "_SilphCo5FRocket2BattleText": [
+ 38,
+ 27601
+ ],
+ "_SilphCo5FRocket2EndBattleText": [
+ 38,
+ 27637
+ ],
+ "_SilphCo5FScientistAfterBattleText": [
+ 38,
+ 27433
+ ],
+ "_SilphCo5FScientistBattleText": [
+ 38,
+ 27373
+ ],
+ "_SilphCo5FScientistEndBattleText": [
+ 38,
+ 27416
+ ],
+ "_SilphCo5FSilphWorkerMThatsYouRightText": [
+ 38,
+ 27164
+ ],
+ "_SilphCo5FSilphWorkerMYoureOurHeroText": [
+ 38,
+ 27230
+ ],
+ "_SilphCo6FRocket1AfterBattleText": [
+ 38,
+ 28363
+ ],
+ "_SilphCo6FRocket1BattleText": [
+ 38,
+ 28315
+ ],
+ "_SilphCo6FRocket1EndBattleText": [
+ 38,
+ 28351
+ ],
+ "_SilphCo6FRocket2AfterBattleText": [
+ 38,
+ 28569
+ ],
+ "_SilphCo6FRocket2BattleText": [
+ 38,
+ 28525
+ ],
+ "_SilphCo6FRocket2EndBattleText": [
+ 38,
+ 28555
+ ],
+ "_SilphCo6FScientistAfterBattleText": [
+ 38,
+ 28481
+ ],
+ "_SilphCo6FScientistBattleText": [
+ 38,
+ 28403
+ ],
+ "_SilphCo6FScientistEndBattleText": [
+ 38,
+ 28473
+ ],
+ "_SilphCo6FSilphWorkerF1HaveToMarryHimText": [
+ 38,
+ 28085
+ ],
+ "_SilphCo6FSilphWorkerF1SuchACowardText": [
+ 38,
+ 28052
+ ],
+ "_SilphCo6FSilphWorkerF2TeamRocketConquerWorldText": [
+ 38,
+ 28132
+ ],
+ "_SilphCo6FSilphWorkerF2TeamRocketRanText": [
+ 38,
+ 28187
+ ],
+ "_SilphCo6FSilphWorkerM1BackToWorkText": [
+ 38,
+ 27961
+ ],
+ "_SilphCo6FSilphWorkerM1TookOverTheBuildingText": [
+ 38,
+ 27915
+ ],
+ "_SilphCo6FSilphWorkerM3TargetedSilphText": [
+ 38,
+ 28220
+ ],
+ "_SilphCo6FSilphWorkerM3WorkForSilphText": [
+ 38,
+ 28274
+ ],
+ "_SilphCo6FSilphWorkerMHelpMePleaseText": [
+ 38,
+ 27993
+ ],
+ "_SilphCo6FSilphWorkerMWeGotEngagedText": [
+ 38,
+ 28028
+ ],
+ "_SilphCo7FRivalDefeatedText": [
+ 38,
+ 29917
+ ],
+ "_SilphCo7FRivalGoodLuckToYouText": [
+ 38,
+ 30032
+ ],
+ "_SilphCo7FRivalText": [
+ 38,
+ 29728
+ ],
+ "_SilphCo7FRivalVictoryText": [
+ 38,
+ 29960
+ ],
+ "_SilphCo7FRivalWaitedHereText": [
+ 38,
+ 29749
+ ],
+ "_SilphCo7FRocket1AfterBattleText": [
+ 38,
+ 29373
+ ],
+ "_SilphCo7FRocket1BattleText": [
+ 38,
+ 29332
+ ],
+ "_SilphCo7FRocket1EndBattleText": [
+ 38,
+ 29360
+ ],
+ "_SilphCo7FRocket2AfterBattleText": [
+ 38,
+ 29582
+ ],
+ "_SilphCo7FRocket2BattleText": [
+ 38,
+ 29521
+ ],
+ "_SilphCo7FRocket2EndBattleText": [
+ 38,
+ 29557
+ ],
+ "_SilphCo7FRocket3AfterBattleText": [
+ 38,
+ 29684
+ ],
+ "_SilphCo7FRocket3BattleText": [
+ 38,
+ 29632
+ ],
+ "_SilphCo7FRocket3EndBattleText": [
+ 38,
+ 29669
+ ],
+ "_SilphCo7FScientistAfterBattleText": [
+ 38,
+ 29475
+ ],
+ "_SilphCo7FScientistBattleText": [
+ 38,
+ 29422
+ ],
+ "_SilphCo7FScientistEndBattleText": [
+ 38,
+ 29465
+ ],
+ "_SilphCo7FSilphWorkerM1HaveThisPokemonText": [
+ 38,
+ 28613
+ ],
+ "_SilphCo7FSilphWorkerM1IsOurPresidentOkText": [
+ 38,
+ 28911
+ ],
+ "_SilphCo7FSilphWorkerM1LaprasDescriptionText": [
+ 38,
+ 28723
+ ],
+ "_SilphCo7FSilphWorkerM1SavedText": [
+ 38,
+ 28974
+ ],
+ "_SilphCo7FSilphWorkerM2AfterTheMasterBallText": [
+ 38,
+ 29001
+ ],
+ "_SilphCo7FSilphWorkerM2CancelledMasterBallText": [
+ 38,
+ 29067
+ ],
+ "_SilphCo7FSilphWorkerM3ItWouldBeBadText": [
+ 38,
+ 29128
+ ],
+ "_SilphCo7FSilphWorkerM3YouChasedOffTeamRocketText": [
+ 38,
+ 29189
+ ],
+ "_SilphCo7FSilphWorkerM4ItsReallyDangerousHereText": [
+ 38,
+ 29239
+ ],
+ "_SilphCo7FSilphWorkerM4SafeAtLastText": [
+ 38,
+ 29303
+ ],
+ "_SilphCo8FRocket1AfterBattleText": [
+ 38,
+ 30397
+ ],
+ "_SilphCo8FRocket1BattleText": [
+ 38,
+ 30352
+ ],
+ "_SilphCo8FRocket1EndBattleText": [
+ 38,
+ 30379
+ ],
+ "_SilphCo8FRocket2AfterBattleText": [
+ 38,
+ 30588
+ ],
+ "_SilphCo8FRocket2BattleText": [
+ 38,
+ 30532
+ ],
+ "_SilphCo8FRocket2EndBattleText": [
+ 38,
+ 30568
+ ],
+ "_SilphCo8FScientistAfterBattleText": [
+ 38,
+ 30484
+ ],
+ "_SilphCo8FScientistBattleText": [
+ 38,
+ 30442
+ ],
+ "_SilphCo8FScientistEndBattleText": [
+ 38,
+ 30470
+ ],
+ "_SilphCo8FSilphWorkerMSilphIsFinishedText": [
+ 38,
+ 30295
+ ],
+ "_SilphCo8FSilphWorkerMThanksForSavingUsText": [
+ 38,
+ 30329
+ ],
+ "_SilphCo9FRocket1AfterBattleText": [
+ 38,
+ 30747
+ ],
+ "_SilphCo9FRocket1BattleText": [
+ 38,
+ 30703
+ ],
+ "_SilphCo9FRocket1EndBattleText": [
+ 38,
+ 30738
+ ],
+ "_SilphCo9FRocket2AfterBattleText": [
+ 38,
+ 30979
+ ],
+ "_SilphCo9FRocket2BattleText": [
+ 38,
+ 30918
+ ],
+ "_SilphCo9FRocket2EndBattleText": [
+ 38,
+ 30954
+ ],
+ "_SilphCo9FScientistAfterBattleText": [
+ 38,
+ 30857
+ ],
+ "_SilphCo9FScientistBattleText": [
+ 38,
+ 30793
+ ],
+ "_SilphCo9FScientistEndBattleText": [
+ 38,
+ 30839
+ ],
+ "_SilphCoJessieJamesText1": [
+ 38,
+ 31278
+ ],
+ "_SilphCoJessieJamesText2": [
+ 38,
+ 31307
+ ],
+ "_SilphCoJessieJamesText3": [
+ 38,
+ 31362
+ ],
+ "_SilphCoJessieJamesText4": [
+ 38,
+ 31378
+ ],
+ "_SkyAttackGlowingText": [
+ 42,
+ 16721
+ ],
+ "_SleepingPikachuText1": [
+ 40,
+ 16667
+ ],
+ "_SleepingPikachuText2": [
+ 40,
+ 17567
+ ],
+ "_SlowbroDexEntry": [
+ 46,
+ 24096
+ ],
+ "_SlowpokeDexEntry": [
+ 46,
+ 23998
+ ],
+ "_SnorlaxDexEntry": [
+ 46,
+ 30284
+ ],
+ "_SoYouWantPrizeText": [
+ 40,
+ 18077
+ ],
+ "_SorryNeedMoreCoinsText": [
+ 40,
+ 18098
+ ],
+ "_SpearowDexEntry": [
+ 46,
+ 18299
+ ],
+ "_SquirtleDexEntry": [
+ 46,
+ 16964
+ ],
+ "_StarmieDexEntry": [
+ 46,
+ 28102
+ ],
+ "_StartSlotMachineText": [
+ 39,
+ 24485
+ ],
+ "_StartedSleepingEffect": [
+ 42,
+ 17160
+ ],
+ "_StaryuDexEntry": [
+ 46,
+ 28004
+ ],
+ "_StatusChangesEliminatedText": [
+ 42,
+ 17104
+ ],
+ "_StoppedEvolvingText": [
+ 41,
+ 30474
+ ],
+ "_StrengthsAndWeaknessesText": [
+ 39,
+ 25867
+ ],
+ "_SubstituteBrokeText": [
+ 39,
+ 31316
+ ],
+ "_SubstituteText": [
+ 42,
+ 16948
+ ],
+ "_SubstituteTookDamageText": [
+ 39,
+ 31281
+ ],
+ "_SuckedHealthText": [
+ 42,
+ 17370
+ ],
+ "_SummerBeachHousePikachuText": [
+ 40,
+ 25486
+ ],
+ "_SummerBeachHousePoster1Text1": [
+ 40,
+ 25502
+ ],
+ "_SummerBeachHousePoster1Text2": [
+ 40,
+ 25579
+ ],
+ "_SummerBeachHousePoster2Text1": [
+ 40,
+ 25612
+ ],
+ "_SummerBeachHousePoster2Text2": [
+ 40,
+ 25690
+ ],
+ "_SummerBeachHousePoster3Text1": [
+ 40,
+ 25724
+ ],
+ "_SummerBeachHousePoster3Text2": [
+ 40,
+ 25780
+ ],
+ "_SummerBeachHousePrinterText1": [
+ 40,
+ 25812
+ ],
+ "_SummerBeachHousePrinterText2": [
+ 40,
+ 25844
+ ],
+ "_SummerBeachHousePrinterText3": [
+ 40,
+ 25883
+ ],
+ "_SummerBeachHousePrinterText4": [
+ 40,
+ 25921
+ ],
+ "_SummerBeachHousePrinterText5": [
+ 40,
+ 25996
+ ],
+ "_SummerBeachHousePrinterText6": [
+ 40,
+ 26015
+ ],
+ "_SummerBeachHouseSurfinDudeText1": [
+ 40,
+ 25279
+ ],
+ "_SummerBeachHouseSurfinDudeText2": [
+ 40,
+ 25403
+ ],
+ "_SummerBeachHouseSurfinDudeText3": [
+ 40,
+ 25434
+ ],
+ "_SummerBeachHouseSurfinDudeText4": [
+ 40,
+ 25450
+ ],
+ "_SuperEffectiveText": [
+ 39,
+ 31495
+ ],
+ "_SurfingGotOnText": [
+ 45,
+ 27406
+ ],
+ "_SurfingNoPlaceToGetOffText": [
+ 45,
+ 27423
+ ],
+ "_SwitchOnText": [
+ 40,
+ 17595
+ ],
+ "_TM21ExplanationText": [
+ 43,
+ 28992
+ ],
+ "_TM24ExplanationText": [
+ 43,
+ 23037
+ ],
+ "_TM34ExplanationText": [
+ 42,
+ 26408
+ ],
+ "_TM46ExplanationText": [
+ 44,
+ 27881
+ ],
+ "_TangelaDexEntry": [
+ 46,
+ 27411
+ ],
+ "_TaurosDexEntry": [
+ 46,
+ 28808
+ ],
+ "_TeachMachineMoveText": [
+ 45,
+ 27908
+ ],
+ "_TentacoolDexEntry": [
+ 46,
+ 23303
+ ],
+ "_TentacruelDexEntry": [
+ 46,
+ 23407
+ ],
+ "_TextIDErrorText": [
+ 40,
+ 19558
+ ],
+ "_Thanks1Text": [
+ 45,
+ 28611
+ ],
+ "_Thanks2Text": [
+ 45,
+ 28791
+ ],
+ "_Thanks3Text": [
+ 45,
+ 28969
+ ],
+ "_ThrashingAboutText": [
+ 39,
+ 30938
+ ],
+ "_ThrewAwayItemText": [
+ 45,
+ 28330
+ ],
+ "_ThrewBaitText": [
+ 45,
+ 27514
+ ],
+ "_ThrewRockText": [
+ 45,
+ 27534
+ ],
+ "_ThrowBallAtTrainerMonText1": [
+ 45,
+ 28101
+ ],
+ "_ThrowBallAtTrainerMonText2": [
+ 45,
+ 28132
+ ],
+ "_TimesUpText": [
+ 39,
+ 25927
+ ],
+ "_TooImportantToTossText": [
+ 45,
+ 28374
+ ],
+ "_TooWeakSubstituteText": [
+ 42,
+ 16995
+ ],
+ "_TookInSunlightText": [
+ 42,
+ 16681
+ ],
+ "_TossHowManyText": [
+ 40,
+ 17495
+ ],
+ "_TownMapText": [
+ 39,
+ 29929
+ ],
+ "_TradeCenterOpponentText": [
+ 42,
+ 17414
+ ],
+ "_TradeForText": [
+ 39,
+ 24268
+ ],
+ "_TradeSendsText": [
+ 39,
+ 24283
+ ],
+ "_TradeTakeCareText": [
+ 39,
+ 24345
+ ],
+ "_TradeTransferredText": [
+ 39,
+ 24324
+ ],
+ "_TradeWavesFarewellText": [
+ 39,
+ 24301
+ ],
+ "_TradeWentToText": [
+ 39,
+ 24248
+ ],
+ "_TradeWillTradeText": [
+ 39,
+ 24371
+ ],
+ "_TradedForText": [
+ 45,
+ 28458
+ ],
+ "_TradeforText": [
+ 39,
+ 24393
+ ],
+ "_TrainerAboutToUseText": [
+ 39,
+ 30300
+ ],
+ "_TrainerDefeatedText": [
+ 39,
+ 30161
+ ],
+ "_TrainerNameText": [
+ 38,
+ 16453
+ ],
+ "_TrainerSentOutText": [
+ 39,
+ 30348
+ ],
+ "_TrainerWantsToFightText": [
+ 40,
+ 16399
+ ],
+ "_TransformedText": [
+ 42,
+ 17236
+ ],
+ "_TryingToLearnText": [
+ 44,
+ 30377
+ ],
+ "_TurnPageText": [
+ 39,
+ 27424
+ ],
+ "_TurnedAwayText": [
+ 39,
+ 31242
+ ],
+ "_TurnedOnPC1Text": [
+ 40,
+ 17004
+ ],
+ "_TurnedOnPC2Text": [
+ 40,
+ 17175
+ ],
+ "_UnaffectedText": [
+ 39,
+ 31118
+ ],
+ "_UndergroundPathRoute6GirlText": [
+ 40,
+ 21456
+ ],
+ "_UndergroundPathRoute7CopyUnusedGirlText": [
+ 40,
+ 21559
+ ],
+ "_UndergroundPathRoute7CopyUnusedGoesUnderSaffronText": [
+ 40,
+ 21774
+ ],
+ "_UndergroundPathRoute7CopyUnusedMiddleAgedManText": [
+ 40,
+ 21709
+ ],
+ "_UndergroundPathRoute7CopyUnusedTeamRocketHadAHideoutText": [
+ 40,
+ 21658
+ ],
+ "_UndergroundPathRoute7MiddleAgedManText": [
+ 40,
+ 21508
+ ],
+ "_UndergroundPathRoute8GirlText": [
+ 40,
+ 21906
+ ],
+ "_UnleashedEnergyText": [
+ 39,
+ 30917
+ ],
+ "_UnusedBenchGuyText1": [
+ 39,
+ 25071
+ ],
+ "_UnusedBenchGuyText2": [
+ 39,
+ 25099
+ ],
+ "_UnusedBenchGuyText3": [
+ 39,
+ 25129
+ ],
+ "_UnveiledGhostText": [
+ 40,
+ 16420
+ ],
+ "_UseNextMonText": [
+ 39,
+ 30194
+ ],
+ "_UsedCutText": [
+ 45,
+ 29059
+ ],
+ "_UsedInsteadText": [
+ 39,
+ 31040
+ ],
+ "_UsedMove1Text": [
+ 39,
+ 31022
+ ],
+ "_UsedMove2Text": [
+ 39,
+ 31031
+ ],
+ "_UsedStrengthText": [
+ 45,
+ 16766
+ ],
+ "_VaporeonDexEntry": [
+ 46,
+ 29393
+ ],
+ "_VendingMachineText1": [
+ 43,
+ 26615
+ ],
+ "_VendingMachineText4": [
+ 43,
+ 26651
+ ],
+ "_VendingMachineText5": [
+ 43,
+ 26676
+ ],
+ "_VendingMachineText6": [
+ 43,
+ 26693
+ ],
+ "_VendingMachineText7": [
+ 43,
+ 26725
+ ],
+ "_VenomothDexEntry": [
+ 46,
+ 21054
+ ],
+ "_VenonatDexEntry": [
+ 46,
+ 20950
+ ],
+ "_VenusaurDexEntry": [
+ 46,
+ 16575
+ ],
+ "_VermilionCityBeautyText": [
+ 45,
+ 22448
+ ],
+ "_VermilionCityGambler1DidYouSeeText": [
+ 45,
+ 22525
+ ],
+ "_VermilionCityGambler1SSAnneDepartedText": [
+ 45,
+ 22570
+ ],
+ "_VermilionCityGambler2Text": [
+ 45,
+ 22861
+ ],
+ "_VermilionCityGymSignText": [
+ 45,
+ 23635
+ ],
+ "_VermilionCityHarborSignText": [
+ 45,
+ 23702
+ ],
+ "_VermilionCityMachopStompingTheLandFlatText": [
+ 45,
+ 22963
+ ],
+ "_VermilionCityMachopText": [
+ 45,
+ 22938
+ ],
+ "_VermilionCityNoticeSignText": [
+ 45,
+ 23478
+ ],
+ "_VermilionCityPokemonFanClubSignText": [
+ 45,
+ 23597
+ ],
+ "_VermilionCitySailor1DoYouHaveATicketText": [
+ 45,
+ 22652
+ ],
+ "_VermilionCitySailor1FlashedTicketText": [
+ 45,
+ 22708
+ ],
+ "_VermilionCitySailor1ShipSetSailText": [
+ 45,
+ 22841
+ ],
+ "_VermilionCitySailor1WelcomeToSSAnneText": [
+ 45,
+ 22629
+ ],
+ "_VermilionCitySailor1YouNeedATicketText": [
+ 45,
+ 22763
+ ],
+ "_VermilionCitySailor2Text": [
+ 45,
+ 23001
+ ],
+ "_VermilionCitySignText": [
+ 45,
+ 23432
+ ],
+ "_VermilionDockUnusedText": [
+ 43,
+ 24086
+ ],
+ "_VermilionGymGentlemanAfterBattleText": [
+ 43,
+ 23272
+ ],
+ "_VermilionGymGentlemanBattleText": [
+ 43,
+ 23196
+ ],
+ "_VermilionGymGentlemanEndBattleText": [
+ 43,
+ 23248
+ ],
+ "_VermilionGymGymGuideBeatLTSurgeText": [
+ 43,
+ 23857
+ ],
+ "_VermilionGymGymGuideChampInMakingText": [
+ 43,
+ 23603
+ ],
+ "_VermilionGymLTSurgePostBattleAdviceText": [
+ 43,
+ 22791
+ ],
+ "_VermilionGymLTSurgePreBattleText": [
+ 43,
+ 22556
+ ],
+ "_VermilionGymLTSurgeReceivedTM24Text": [
+ 43,
+ 23016
+ ],
+ "_VermilionGymLTSurgeReceivedThunderBadgeText": [
+ 43,
+ 23129
+ ],
+ "_VermilionGymLTSurgeTM24NoRoomText": [
+ 43,
+ 23096
+ ],
+ "_VermilionGymLTSurgeThunderBadgeInfoText": [
+ 43,
+ 22896
+ ],
+ "_VermilionGymSailorAfterBattleText": [
+ 43,
+ 23496
+ ],
+ "_VermilionGymSailorBattleText": [
+ 43,
+ 23448
+ ],
+ "_VermilionGymSailorEndBattleText": [
+ 43,
+ 23476
+ ],
+ "_VermilionGymSuperNerdAfterBattleText": [
+ 43,
+ 23380
+ ],
+ "_VermilionGymSuperNerdBattleText": [
+ 43,
+ 23323
+ ],
+ "_VermilionGymSuperNerdEndBattleText": [
+ 43,
+ 23372
+ ],
+ "_VermilionGymTrashFailText": [
+ 39,
+ 29540
+ ],
+ "_VermilionGymTrashSuccessText1": [
+ 39,
+ 29342
+ ],
+ "_VermilionGymTrashSuccessText2": [
+ 39,
+ 29424
+ ],
+ "_VermilionGymTrashSuccessText3": [
+ 39,
+ 29481
+ ],
+ "_VermilionGymTrashText": [
+ 39,
+ 29311
+ ],
+ "_VermilionMartCooltrainerFText": [
+ 43,
+ 22494
+ ],
+ "_VermilionMartCooltrainerMText": [
+ 43,
+ 22328
+ ],
+ "_VermilionOldRodHouseFishingGuruDoYouLikeToFishText": [
+ 43,
+ 24199
+ ],
+ "_VermilionOldRodHouseFishingGuruFishingIsAWayOfLifeText": [
+ 43,
+ 24347
+ ],
+ "_VermilionOldRodHouseFishingGuruHowAreTheFishBitingText": [
+ 43,
+ 24473
+ ],
+ "_VermilionOldRodHouseFishingGuruNoRoomText": [
+ 43,
+ 24515
+ ],
+ "_VermilionOldRodHouseFishingGuruTakeThisText": [
+ 43,
+ 24267
+ ],
+ "_VermilionOldRodHouseFishingGuruThatsSoDisappointingText": [
+ 43,
+ 24440
+ ],
+ "_VermilionPidgeyHouseLetterText": [
+ 43,
+ 23972
+ ],
+ "_VermilionPidgeyHousePidgeyText": [
+ 43,
+ 23952
+ ],
+ "_VermilionPidgeyHouseYoungsterText": [
+ 43,
+ 23889
+ ],
+ "_VermilionPokecenterFishingGuruText": [
+ 43,
+ 20728
+ ],
+ "_VermilionPokecenterGuyText": [
+ 39,
+ 25175
+ ],
+ "_VermilionPokecenterSailorText": [
+ 43,
+ 20863
+ ],
+ "_VictoryRoad1FCooltrainerFAfterBattleText": [
+ 39,
+ 19879
+ ],
+ "_VictoryRoad1FCooltrainerFBattleText": [
+ 39,
+ 19825
+ ],
+ "_VictoryRoad1FCooltrainerFEndBattleText": [
+ 39,
+ 19866
+ ],
+ "_VictoryRoad1FCooltrainerMAfterBattleText": [
+ 39,
+ 19986
+ ],
+ "_VictoryRoad1FCooltrainerMBattleText": [
+ 39,
+ 19915
+ ],
+ "_VictoryRoad1FCooltrainerMEndBattleText": [
+ 39,
+ 19967
+ ],
+ "_VictoryRoad2FCooltrainerMAfterBattleText": [
+ 40,
+ 26450
+ ],
+ "_VictoryRoad2FCooltrainerMBattleText": [
+ 40,
+ 26410
+ ],
+ "_VictoryRoad2FCooltrainerMEndBattleText": [
+ 40,
+ 26434
+ ],
+ "_VictoryRoad2FHikerAfterBattleText": [
+ 40,
+ 26272
+ ],
+ "_VictoryRoad2FHikerBattleText": [
+ 40,
+ 26218
+ ],
+ "_VictoryRoad2FHikerEndBattleText": [
+ 40,
+ 26264
+ ],
+ "_VictoryRoad2FMoltresBattleText": [
+ 40,
+ 26209
+ ],
+ "_VictoryRoad2FSuperNerd1AfterBattleText": [
+ 40,
+ 26383
+ ],
+ "_VictoryRoad2FSuperNerd1BattleText": [
+ 40,
+ 26324
+ ],
+ "_VictoryRoad2FSuperNerd1EndBattleText": [
+ 40,
+ 26370
+ ],
+ "_VictoryRoad2FSuperNerd2AfterBattleText": [
+ 40,
+ 26576
+ ],
+ "_VictoryRoad2FSuperNerd2BattleText": [
+ 40,
+ 26495
+ ],
+ "_VictoryRoad2FSuperNerd2EndBattleText": [
+ 40,
+ 26557
+ ],
+ "_VictoryRoad2FSuperNerd3AfterBattleText": [
+ 40,
+ 26671
+ ],
+ "_VictoryRoad2FSuperNerd3BattleText": [
+ 40,
+ 26631
+ ],
+ "_VictoryRoad2FSuperNerd3EndBattleText": [
+ 40,
+ 26659
+ ],
+ "_VictoryRoad3FCooltrainerF1AfterBattleText": [
+ 38,
+ 24362
+ ],
+ "_VictoryRoad3FCooltrainerF1BattleText": [
+ 38,
+ 24312
+ ],
+ "_VictoryRoad3FCooltrainerF1EndBattleText": [
+ 38,
+ 24349
+ ],
+ "_VictoryRoad3FCooltrainerF2AfterBattleText": [
+ 38,
+ 24571
+ ],
+ "_VictoryRoad3FCooltrainerF2BattleText": [
+ 38,
+ 24512
+ ],
+ "_VictoryRoad3FCooltrainerF2EndBattleText": [
+ 38,
+ 24555
+ ],
+ "_VictoryRoad3FCooltrainerM1AfterBattleText": [
+ 38,
+ 24277
+ ],
+ "_VictoryRoad3FCooltrainerM1BattleText": [
+ 38,
+ 24218
+ ],
+ "_VictoryRoad3FCooltrainerM1EndBattleText": [
+ 38,
+ 24254
+ ],
+ "_VictoryRoad3FCooltrainerM2AfterBattleText": [
+ 38,
+ 24450
+ ],
+ "_VictoryRoad3FCooltrainerM2BattleText": [
+ 38,
+ 24398
+ ],
+ "_VictoryRoad3FCooltrainerM2EndBattleText": [
+ 38,
+ 24430
+ ],
+ "_VictreebelDexEntry": [
+ 46,
+ 23199
+ ],
+ "_VileplumeDexEntry": [
+ 46,
+ 20647
+ ],
+ "_ViridianBlackboardBurnText": [
+ 39,
+ 29069
+ ],
+ "_ViridianBlackboardFrozenText": [
+ 39,
+ 29191
+ ],
+ "_ViridianBlackboardPoisonText": [
+ 39,
+ 28854
+ ],
+ "_ViridianBlackboardPrlzText": [
+ 39,
+ 28963
+ ],
+ "_ViridianBlackboardSleepText": [
+ 39,
+ 28746
+ ],
+ "_ViridianCityFisherReceivedTM42Text": [
+ 45,
+ 18572
+ ],
+ "_ViridianCityFisherTM42ExplanationText": [
+ 45,
+ 18591
+ ],
+ "_ViridianCityFisherTM42NoRoomText": [
+ 45,
+ 18633
+ ],
+ "_ViridianCityGambler1GymAlwaysClosedText": [
+ 45,
+ 17961
+ ],
+ "_ViridianCityGambler1GymLeaderReturnedText": [
+ 45,
+ 18022
+ ],
+ "_ViridianCityGirlHasntHadHisCoffeeYetText": [
+ 45,
+ 18199
+ ],
+ "_ViridianCityGirlWhenIGoShopText": [
+ 45,
+ 18258
+ ],
+ "_ViridianCityGymLockedText": [
+ 45,
+ 19096
+ ],
+ "_ViridianCityGymSignText": [
+ 45,
+ 19072
+ ],
+ "_ViridianCityOldManHadMyCoffeeNowText": [
+ 45,
+ 17572
+ ],
+ "_ViridianCityOldManLosingMyTouchText": [
+ 45,
+ 17747
+ ],
+ "_ViridianCityOldManNotGoodEnoughForYouText": [
+ 45,
+ 18759
+ ],
+ "_ViridianCityOldManSleepyPrivatePropertyText": [
+ 45,
+ 18343
+ ],
+ "_ViridianCityOldManWantMeToShowYouAgainText": [
+ 45,
+ 18667
+ ],
+ "_ViridianCityOldManWatchCloselyText": [
+ 45,
+ 18722
+ ],
+ "_ViridianCityOldManYouNeedToWeakenTheTargetText": [
+ 45,
+ 17528
+ ],
+ "_ViridianCityPokecenterGuyText": [
+ 39,
+ 24736
+ ],
+ "_ViridianCitySignText": [
+ 45,
+ 18794
+ ],
+ "_ViridianCityTrainerTips1Text": [
+ 45,
+ 18839
+ ],
+ "_ViridianCityTrainerTips2Text": [
+ 45,
+ 18938
+ ],
+ "_ViridianCityYoungster1Text": [
+ 45,
+ 17853
+ ],
+ "_ViridianCityYoungster2YouWantToKnowAboutText": [
+ 45,
+ 18054
+ ],
+ "_ViridianForestCooltrainerFAfterBattleText": [
+ 38,
+ 17674
+ ],
+ "_ViridianForestCooltrainerFBattleText": [
+ 38,
+ 17630
+ ],
+ "_ViridianForestCooltrainerFEndBattleText": [
+ 38,
+ 17658
+ ],
+ "_ViridianForestLeavingSignText": [
+ 38,
+ 18263
+ ],
+ "_ViridianForestNorthGateGrampsText": [
+ 40,
+ 19782
+ ],
+ "_ViridianForestNorthGateSuperNerdText": [
+ 40,
+ 19686
+ ],
+ "_ViridianForestSouthGateGirlText": [
+ 40,
+ 20049
+ ],
+ "_ViridianForestSouthGateLittleGirlText": [
+ 40,
+ 20116
+ ],
+ "_ViridianForestTrainerTips1Text": [
+ 38,
+ 17914
+ ],
+ "_ViridianForestTrainerTips2Text": [
+ 38,
+ 18036
+ ],
+ "_ViridianForestTrainerTips3Text": [
+ 38,
+ 18102
+ ],
+ "_ViridianForestTrainerTips4Text": [
+ 38,
+ 18179
+ ],
+ "_ViridianForestUseAntidoteSignText": [
+ 38,
+ 17987
+ ],
+ "_ViridianForestYoungster1Text": [
+ 38,
+ 17203
+ ],
+ "_ViridianForestYoungster2AfterBattleText": [
+ 38,
+ 17337
+ ],
+ "_ViridianForestYoungster2BattleText": [
+ 38,
+ 17263
+ ],
+ "_ViridianForestYoungster2EndBattleText": [
+ 38,
+ 17310
+ ],
+ "_ViridianForestYoungster3AfterBattleText": [
+ 38,
+ 17442
+ ],
+ "_ViridianForestYoungster3BattleText": [
+ 38,
+ 17370
+ ],
+ "_ViridianForestYoungster3EndBattleText": [
+ 38,
+ 17417
+ ],
+ "_ViridianForestYoungster4AfterBattleText": [
+ 38,
+ 17548
+ ],
+ "_ViridianForestYoungster4BattleText": [
+ 38,
+ 17487
+ ],
+ "_ViridianForestYoungster4EndBattleText": [
+ 38,
+ 17519
+ ],
+ "_ViridianForestYoungster5AfterBattleText": [
+ 38,
+ 17793
+ ],
+ "_ViridianForestYoungster5BattleText": [
+ 38,
+ 17727
+ ],
+ "_ViridianForestYoungster5EndBattleText": [
+ 38,
+ 17773
+ ],
+ "_ViridianForestYoungster6Text": [
+ 38,
+ 17847
+ ],
+ "_ViridianGymCooltrainerM1AfterBattleText": [
+ 42,
+ 23741
+ ],
+ "_ViridianGymCooltrainerM1BattleText": [
+ 42,
+ 23675
+ ],
+ "_ViridianGymCooltrainerM1EndBattleText": [
+ 42,
+ 23722
+ ],
+ "_ViridianGymCooltrainerM2AfterBattleText": [
+ 42,
+ 24131
+ ],
+ "_ViridianGymCooltrainerM2BattleText": [
+ 42,
+ 24078
+ ],
+ "_ViridianGymCooltrainerM2EndBattleText": [
+ 42,
+ 24114
+ ],
+ "_ViridianGymCooltrainerM3AfterBattleText": [
+ 42,
+ 24424
+ ],
+ "_ViridianGymCooltrainerM3BattleText": [
+ 42,
+ 24339
+ ],
+ "_ViridianGymCooltrainerM3EndBattleText": [
+ 42,
+ 24409
+ ],
+ "_ViridianGymGiovanniEarthBadgeInfoText": [
+ 42,
+ 23330
+ ],
+ "_ViridianGymGiovanniPostBattleAdviceText": [
+ 42,
+ 23170
+ ],
+ "_ViridianGymGiovanniPreBattleText": [
+ 42,
+ 22880
+ ],
+ "_ViridianGymGiovanniReceivedEarthBadgeText": [
+ 42,
+ 23084
+ ],
+ "_ViridianGymGiovanniReceivedTM27Text": [
+ 42,
+ 23512
+ ],
+ "_ViridianGymGiovanniTM27ExplanationText": [
+ 42,
+ 23531
+ ],
+ "_ViridianGymGiovanniTM27NoRoomText": [
+ 42,
+ 23642
+ ],
+ "_ViridianGymGuidePostBattleText": [
+ 42,
+ 24658
+ ],
+ "_ViridianGymGuidePreBattleText": [
+ 42,
+ 24488
+ ],
+ "_ViridianGymHiker1AfterBattleText": [
+ 42,
+ 23838
+ ],
+ "_ViridianGymHiker1BattleText": [
+ 42,
+ 23789
+ ],
+ "_ViridianGymHiker1EndBattleText": [
+ 42,
+ 23830
+ ],
+ "_ViridianGymHiker2AfterBattleText": [
+ 42,
+ 24035
+ ],
+ "_ViridianGymHiker2BattleText": [
+ 42,
+ 23981
+ ],
+ "_ViridianGymHiker2EndBattleText": [
+ 42,
+ 24027
+ ],
+ "_ViridianGymHiker3AfterBattleText": [
+ 42,
+ 24211
+ ],
+ "_ViridianGymHiker3BattleText": [
+ 42,
+ 24158
+ ],
+ "_ViridianGymHiker3EndBattleText": [
+ 42,
+ 24204
+ ],
+ "_ViridianGymRocker1AfterBattleText": [
+ 42,
+ 23936
+ ],
+ "_ViridianGymRocker1BattleText": [
+ 42,
+ 23860
+ ],
+ "_ViridianGymRocker1EndBattleText": [
+ 42,
+ 23907
+ ],
+ "_ViridianGymRocker2AfterBattleText": [
+ 42,
+ 24311
+ ],
+ "_ViridianGymRocker2BattleText": [
+ 42,
+ 24246
+ ],
+ "_ViridianGymRocker2EndBattleText": [
+ 42,
+ 24293
+ ],
+ "_ViridianMartClerkParcelQuestText": [
+ 42,
+ 22401
+ ],
+ "_ViridianMartClerkSayHiToOakText": [
+ 42,
+ 22334
+ ],
+ "_ViridianMartClerkYouCameFromPalletTownText": [
+ 42,
+ 22368
+ ],
+ "_ViridianMartCooltrainerMText": [
+ 42,
+ 22533
+ ],
+ "_ViridianMartYoungsterText": [
+ 42,
+ 22493
+ ],
+ "_ViridianNicknameHouseBaldingGuyText": [
+ 42,
+ 22728
+ ],
+ "_ViridianNicknameHouseLittleGirlText": [
+ 42,
+ 22814
+ ],
+ "_ViridianNicknameHouseSpearowText": [
+ 42,
+ 22840
+ ],
+ "_ViridianNicknameHouseSpearySignText": [
+ 42,
+ 22858
+ ],
+ "_ViridianPokecenterCooltrainerMText": [
+ 42,
+ 22256
+ ],
+ "_ViridianPokecenterGentlemanText": [
+ 42,
+ 22185
+ ],
+ "_ViridianSchoolBlackboardText1": [
+ 39,
+ 28648
+ ],
+ "_ViridianSchoolBlackboardText2": [
+ 39,
+ 28710
+ ],
+ "_ViridianSchoolHouseBrunetteGirlText": [
+ 42,
+ 22578
+ ],
+ "_ViridianSchoolHouseCooltrainerFText": [
+ 42,
+ 22679
+ ],
+ "_ViridianSchoolHouseLittleGirlText": [
+ 42,
+ 22621
+ ],
+ "_ViridianSchoolNotebookText1": [
+ 39,
+ 27476
+ ],
+ "_ViridianSchoolNotebookText2": [
+ 39,
+ 27639
+ ],
+ "_ViridianSchoolNotebookText3": [
+ 39,
+ 27758
+ ],
+ "_ViridianSchoolNotebookText4": [
+ 39,
+ 27869
+ ],
+ "_ViridianSchoolNotebookText5": [
+ 39,
+ 27440
+ ],
+ "_VitaminNoEffectText": [
+ 45,
+ 27488
+ ],
+ "_VitaminStatRoseText": [
+ 45,
+ 27470
+ ],
+ "_VoltorbDexEntry": [
+ 46,
+ 26022
+ ],
+ "_VulpixDexEntry": [
+ 46,
+ 19846
+ ],
+ "_WannaTrade1Text": [
+ 45,
+ 28486
+ ],
+ "_WannaTrade2Text": [
+ 45,
+ 28650
+ ],
+ "_WannaTrade3Text": [
+ 45,
+ 28845
+ ],
+ "_WardensHouseDisplayMerchandiseText": [
+ 44,
+ 18638
+ ],
+ "_WardensHouseDisplayPhotosAndFossilsText": [
+ 44,
+ 18612
+ ],
+ "_WardensHouseWardenGaveTheGoldTeethText": [
+ 44,
+ 18160
+ ],
+ "_WardensHouseWardenGibberish1Text": [
+ 44,
+ 18018
+ ],
+ "_WardensHouseWardenGibberish2Text": [
+ 44,
+ 18089
+ ],
+ "_WardensHouseWardenGibberish3Text": [
+ 44,
+ 18126
+ ],
+ "_WardensHouseWardenHM04ExplanationText": [
+ 44,
+ 18388
+ ],
+ "_WardensHouseWardenHM04NoRoomText": [
+ 44,
+ 18584
+ ],
+ "_WardensHouseWardenReceivedHM04Text": [
+ 44,
+ 18368
+ ],
+ "_WardensHouseWardenTeethPoppedInHisTeethText": [
+ 44,
+ 18199
+ ],
+ "_WardensHouseWardenThanksText": [
+ 44,
+ 18233
+ ],
+ "_WarpToLastPokemonCenterText": [
+ 45,
+ 16586
+ ],
+ "_WartortleDexEntry": [
+ 46,
+ 17047
+ ],
+ "_WasBlownAwayText": [
+ 42,
+ 16638
+ ],
+ "_WasSeededText": [
+ 42,
+ 17027
+ ],
+ "_WeedleDexEntry": [
+ 46,
+ 17523
+ ],
+ "_WeepinbellDexEntry": [
+ 46,
+ 23101
+ ],
+ "_WeezingDexEntry": [
+ 46,
+ 27017
+ ],
+ "_WhatDoYouWantText": [
+ 40,
+ 17196
+ ],
+ "_WhatGoesAroundComesAroundText": [
+ 39,
+ 28042
+ ],
+ "_WhatText": [
+ 40,
+ 17607
+ ],
+ "_WhatToDepositText": [
+ 40,
+ 17221
+ ],
+ "_WhatToTossText": [
+ 40,
+ 17463
+ ],
+ "_WhatToWithdrawText": [
+ 40,
+ 17346
+ ],
+ "_WhenYouChangeBoxText": [
+ 41,
+ 30366
+ ],
+ "_WhichFloorText": [
+ 40,
+ 16640
+ ],
+ "_WhichMoveToForgetText": [
+ 44,
+ 30293
+ ],
+ "_WhichPrizeText": [
+ 40,
+ 18036
+ ],
+ "_WigglytuffDexEntry": [
+ 46,
+ 20138
+ ],
+ "_WildMonAppearedText": [
+ 39,
+ 31589
+ ],
+ "_WildRanText": [
+ 39,
+ 30014
+ ],
+ "_WillBeTradedText": [
+ 40,
+ 18956
+ ],
+ "_WithExpAllText": [
+ 39,
+ 31418
+ ],
+ "_WithdrawHowManyText": [
+ 40,
+ 17377
+ ],
+ "_WithdrewItemText": [
+ 40,
+ 17388
+ ],
+ "_WokeUpText": [
+ 39,
+ 30718
+ ],
+ "_WontObeyText": [
+ 39,
+ 31226
+ ],
+ "_WouldYouLikeToSaveText": [
+ 41,
+ 30256
+ ],
+ "_WrongMon1Text": [
+ 45,
+ 28555
+ ],
+ "_WrongMon2Text": [
+ 45,
+ 28737
+ ],
+ "_WrongMon3Text": [
+ 45,
+ 28913
+ ],
+ "_YeahText": [
+ 39,
+ 24575
+ ],
+ "_YourNameIsText": [
+ 40,
+ 18884
+ ],
+ "_ZapdosDexEntry": [
+ 46,
+ 30475
+ ],
+ "_ZubatDexEntry": [
+ 46,
+ 20240
+ ]
+ },
+ "text": {
+ "dynamic": {
+ "_AIBattleUseItemText": [
+ [
+ 1,
+ "{RAM:wTrainerName}"
+ ],
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_AIBattleWithdrawText": [
+ [
+ 1,
+ "{RAM:wTrainerName}"
+ ],
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_AbandonLearningText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_AfterTrade1Text": [
+ [
+ 1,
+ "{RAM:wInGameTradeReceiveMonName}"
+ ]
+ ],
+ "_AfterTrade2Text": [
+ [
+ 1,
+ "{RAM:wInGameTradeGiveMonName}"
+ ]
+ ],
+ "_AfterTrade3Text": [
+ [
+ 1,
+ "{RAM:wInGameTradeReceiveMonName}"
+ ],
+ [
+ 1,
+ "{RAM:wInGameTradeGiveMonName}"
+ ]
+ ],
+ "_AlreadyKnowsText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_AlreadyOutText": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_AntidoteText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_AwakeningText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_BeganToNapText": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_BurnHealText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_CanMoveBouldersText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_CannotFlyHereText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_CannotUseTeleportNowText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_CeladonCityGramps3ReceivedTM41Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CeladonDinerGymGuideReceivedCoinCaseText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CeladonGymReceivedTM21Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CeladonMart3FClerkReceivedTM18Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CeladonMartRoofLittleGirlReceivedTM13Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CeladonMartRoofLittleGirlReceivedTM48Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CeladonMartRoofLittleGirlTM13ExplanationText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CeladonMartRoofLittleGirlTM48ExplanationText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_ChampionsRoomOakCongratulatesPlayerText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_CinnabarGymBlaineReceivedTM38Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CinnabarLabFossilRoomScientist1FossilIsBackToLifeText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CinnabarLabFossilRoomScientist1SeesFossilText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CinnabarLabFossilRoomScientist1TakesFossilText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_CinnabarLabMetronomeRoomScientist1ReceivedTM35Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_CoinCaseNumCoinsText": [
+ [
+ 2,
+ "{NUM:wPlayerCoins, 2 | LEADING_ZEROES | LEFT_ALIGN}"
+ ]
+ ],
+ "_ColosseumEvolvedText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_ColosseumHeightText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_ColosseumWeightText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_CopycatsHouse2FCopycatReceivedTM31Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_DaycareGentlemanGotMonBackText": [
+ [
+ 1,
+ "{RAM:wDayCareMonName}"
+ ]
+ ],
+ "_DaycareGentlemanMonHasGrownText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 9,
+ "{NUM:wDayCareNumLevelsGrown, 1, 3}"
+ ]
+ ],
+ "_DaycareGentlemanMonNeedsMoreTimeText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_DaycareGentlemanOweMoneyText": [
+ [
+ 2,
+ "{NUM:wDayCareTotalCost, 2 | LEADING_ZEROES | LEFT_ALIGN}"
+ ]
+ ],
+ "_DaycareGentlemanWillLookAfterMonText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_DexCompletionText": [
+ [
+ 9,
+ "{NUM:hDexRatingNumMonsSeen, 1, 3}"
+ ],
+ [
+ 9,
+ "{NUM:hDexRatingNumMonsOwned, 1, 3}"
+ ]
+ ],
+ "_DexSeenOwnedText": [
+ [
+ 9,
+ "{NUM:wDexRatingNumMonsSeen, 1, 3}"
+ ],
+ [
+ 9,
+ "{NUM:wDexRatingNumMonsOwned, 1, 3}"
+ ]
+ ],
+ "_DidNotLearnText": [
+ [
+ 1,
+ "{RAM:wLearnMoveMonName}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_DoYouWantToNicknameText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_EnemyAppearedText": [
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_EnemyMonFaintedText": [
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_EnemyRanText": [
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_EvolvedText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_ExpPointsText": [
+ [
+ 9,
+ "{NUM:wExpAmountGained, 2, 4}"
+ ]
+ ],
+ "_ExpressionText": [
+ [
+ 9,
+ "{NUM:wExpressionNumber, 1, 2}"
+ ]
+ ],
+ "_ForgotAndText": [
+ [
+ 1,
+ "{RAM:wLearnMoveMonName}"
+ ],
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_FoundHiddenCoins2Text": [
+ [
+ 2,
+ "{NUM:hCoins, 2 | LEADING_ZEROES | LEFT_ALIGN}"
+ ]
+ ],
+ "_FoundHiddenCoinsText": [
+ [
+ 2,
+ "{NUM:hCoins, 2 | LEADING_ZEROES | LEFT_ALIGN}"
+ ]
+ ],
+ "_FoundHiddenItemText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_FoundItemText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_FuchsiaGoodRodHouseFishingGuruReceivedGoodRodText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_FuchsiaGymKogaReceivedTM06Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_FullHealText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_GainedText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_GotMapText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_GotMonText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_GotOffBicycleText2": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_GotOnBicycleText2": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_GrewLevelText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 9,
+ "{NUM:wCurEnemyLevel, 1, 3}"
+ ]
+ ],
+ "_GymStatueText1": [
+ [
+ 1,
+ "{RAM:wGymCityName}"
+ ],
+ [
+ 1,
+ "{RAM:wGymLeaderName}"
+ ]
+ ],
+ "_GymStatueText2": [
+ [
+ 1,
+ "{RAM:wGymCityName}"
+ ],
+ [
+ 1,
+ "{RAM:wGymLeaderName}"
+ ]
+ ],
+ "_HitXTimesText": [
+ [
+ 9,
+ "{NUM:wEnemyNumHits, 1, 1}"
+ ]
+ ],
+ "_HookedMonAttackedText": [
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_IceHealText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_IgnoredOrdersText": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_IntoText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_IsEvolvingText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_IsItOKToTossItemText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_ItemUseBallText05": [
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_ItemUseBallText06": [
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_ItemUseBallText07": [
+ [
+ 1,
+ "{RAM:wBoxMonNicks}"
+ ]
+ ],
+ "_ItemUseBallText08": [
+ [
+ 1,
+ "{RAM:wBoxMonNicks}"
+ ]
+ ],
+ "_ItemUseText002": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_ItemWasStoredText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_LearnedMove1Text": [
+ [
+ 1,
+ "{RAM:wLearnMoveMonName}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_LinedUpText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_LinkBattleLostText": [
+ [
+ 1,
+ "{RAM:wTrainerName}"
+ ]
+ ],
+ "_LoafingAroundText": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_MimicLearnedMoveText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_MonCannotLearnMachineMoveText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_MonIsTakenOutText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_MonWasReleasedText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_MonWasStoredText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wBoxNumString}"
+ ]
+ ],
+ "_MoneyForWinningText": [
+ [
+ 2,
+ "{NUM:wAmountMoneyWon, 3 | LEADING_ZEROES | LEFT_ALIGN}"
+ ]
+ ],
+ "_MonsStatsFellText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_MonsStatsRoseText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_MoveIsDisabledText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_MoveNameText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_MoveWasDisabledText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_MrFujisHouseMrFujiReceivedPokeFluteText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_MrPsychicsHouseMrPsychicReceivedTM29Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_MtMoonB2FReceivedFossilText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_MultiHitText": [
+ [
+ 9,
+ "{NUM:wPlayerNumHits, 1, 1}"
+ ]
+ ],
+ "_NameRatersHouseNameRaterATrulyImpeccableNameText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_NameRatersHouseNameRaterGiveItANiceNameText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_NameRatersHouseNameRaterPokemonHasBeenRenamedText": [
+ [
+ 1,
+ "{RAM:wBuffer}"
+ ]
+ ],
+ "_NoMovesLeftText": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_NoSurfingHereText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_OaksAideComeBackText": [
+ [
+ 9,
+ "{NUM:hOaksAideRequirement, 1, 3}"
+ ],
+ [
+ 1,
+ "{RAM:wOaksAideRewardItemName}"
+ ]
+ ],
+ "_OaksAideGotItemText": [
+ [
+ 1,
+ "{RAM:wOaksAideRewardItemName}"
+ ]
+ ],
+ "_OaksAideHereYouGoText": [
+ [
+ 9,
+ "{NUM:hOaksAideNumMonsOwned, 1, 3}"
+ ]
+ ],
+ "_OaksAideHiText": [
+ [
+ 9,
+ "{NUM:hOaksAideRequirement, 1, 3}"
+ ],
+ [
+ 1,
+ "{RAM:wOaksAideRewardItemName}"
+ ],
+ [
+ 9,
+ "{NUM:hOaksAideRequirement, 1, 3}"
+ ]
+ ],
+ "_OaksAideNoRoomText": [
+ [
+ 1,
+ "{RAM:wOaksAideRewardItemName}"
+ ]
+ ],
+ "_OaksAideUhOhText": [
+ [
+ 9,
+ "{NUM:hOaksAideNumMonsOwned, 1, 3}"
+ ],
+ [
+ 9,
+ "{NUM:hOaksAideRequirement, 1, 3}"
+ ],
+ [
+ 1,
+ "{RAM:wOaksAideRewardItemName}"
+ ]
+ ],
+ "_OaksLabReceivedText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_OnceReleasedText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_PPIncreasedText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_PPMaxedOutText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_ParlyzHealText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_PickUpPayDayMoneyText": [
+ [
+ 2,
+ "{NUM:wTotalPayDayMoney, 3 | LEADING_ZEROES | LEFT_ALIGN}"
+ ]
+ ],
+ "_PikachuUnhappyText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_PlayerMon1Text": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_PlayerMon2Text": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_PlayerMonFaintedText": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_PokemartTellBuyPriceText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ],
+ [
+ 2,
+ "{NUM:hMoney, 3 | LEADING_ZEROES | LEFT_ALIGN}"
+ ]
+ ],
+ "_PokemartTellSellPriceText": [
+ [
+ 2,
+ "{NUM:hMoney, 3 | LEADING_ZEROES | LEFT_ALIGN}"
+ ]
+ ],
+ "_PokemonFaintedText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_PokemonFanClubReceivedBikeVoucherText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_PotionText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 9,
+ "{NUM:wHPBarHPDifference, 2, 3}"
+ ]
+ ],
+ "_RareCandyText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 9,
+ "{NUM:wCurEnemyLevel, 1, 3}"
+ ]
+ ],
+ "_RefusingText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_ReviveText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_Route12SuperRodHouseFishingGuruReceivedSuperRodText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_Route1Youngster1GotPotionText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_Route23OhThatIsTheBadgeText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_Route23YouDontHaveTheBadgeYetText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_Route24CooltrainerM1ReceivedNuggetText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_SSAnneCaptainsRoomCaptainReceivedHM01Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_SSTicketReceivedText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_SafariZoneAngryText": [
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_SafariZoneEatingText": [
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_SafariZoneGateSafariZoneWorker1ThatllBe500PleaseText": [
+ [
+ 2,
+ "{NUM:wPriceTemp, $c3}"
+ ]
+ ],
+ "_SafariZoneSecretHouseFishingGuruReceivedHM03Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_ScaredText": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_SentToBoxText": [
+ [
+ 1,
+ "{RAM:wBoxMonNicks}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_SilphCo11FSilphPresidentReceivedMasterBallText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_SilphCo2FSilphWorkerFReceivedTM36Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_SoYouWantPrizeText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_StoppedEvolvingText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_SurfingGotOnText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_TeachMachineMoveText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_TextIDErrorText": [
+ [
+ 9,
+ "{NUM:hTextID, 1, 2}"
+ ]
+ ],
+ "_ThrewAwayItemText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_TradeForText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_TradeSendsText": [
+ [
+ 1,
+ "{RAM:wLinkEnemyTrainerName}"
+ ],
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_TradeTakeCareText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_TradeTransferredText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_TradeWavesFarewellText": [
+ [
+ 1,
+ "{RAM:wLinkEnemyTrainerName}"
+ ]
+ ],
+ "_TradeWentToText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wLinkEnemyTrainerName}"
+ ]
+ ],
+ "_TradeWillTradeText": [
+ [
+ 1,
+ "{RAM:wLinkEnemyTrainerName}"
+ ],
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_TradedForText": [
+ [
+ 1,
+ "{RAM:wInGameTradeGiveMonName}"
+ ],
+ [
+ 1,
+ "{RAM:wInGameTradeReceiveMonName}"
+ ]
+ ],
+ "_TradeforText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_TrainerAboutToUseText": [
+ [
+ 1,
+ "{RAM:wTrainerName}"
+ ],
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_TrainerDefeatedText": [
+ [
+ 1,
+ "{RAM:wTrainerName}"
+ ]
+ ],
+ "_TrainerNameText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_TrainerSentOutText": [
+ [
+ 1,
+ "{RAM:wTrainerName}"
+ ],
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_TrainerWantsToFightText": [
+ [
+ 1,
+ "{RAM:wTrainerName}"
+ ]
+ ],
+ "_TransformedText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_TryingToLearnText": [
+ [
+ 1,
+ "{RAM:wLearnMoveMonName}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wLearnMoveMonName}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_TurnedAwayText": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_UsedCutText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_UsedStrengthText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_VendingMachineText5": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_VermilionGymLTSurgeReceivedTM24Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_VermilionOldRodHouseFishingGuruTakeThisText": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_VitaminStatRoseText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ],
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_WannaTrade1Text": [
+ [
+ 1,
+ "{RAM:wInGameTradeGiveMonName}"
+ ],
+ [
+ 1,
+ "{RAM:wInGameTradeReceiveMonName}"
+ ]
+ ],
+ "_WannaTrade2Text": [
+ [
+ 1,
+ "{RAM:wInGameTradeGiveMonName}"
+ ],
+ [
+ 1,
+ "{RAM:wInGameTradeReceiveMonName}"
+ ]
+ ],
+ "_WannaTrade3Text": [
+ [
+ 1,
+ "{RAM:wInGameTradeGiveMonName}"
+ ],
+ [
+ 1,
+ "{RAM:wInGameTradeReceiveMonName}"
+ ]
+ ],
+ "_WardensHouseWardenReceivedHM04Text": [
+ [
+ 1,
+ "{RAM:wStringBuffer}"
+ ]
+ ],
+ "_WildMonAppearedText": [
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_WildRanText": [
+ [
+ 1,
+ "{RAM:wEnemyMonNick}"
+ ]
+ ],
+ "_WillBeTradedText": [
+ [
+ 1,
+ "{RAM:wNameOfPlayerMonToBeTraded}"
+ ],
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_WithdrewItemText": [
+ [
+ 1,
+ "{RAM:wNameBuffer}"
+ ]
+ ],
+ "_WontObeyText": [
+ [
+ 1,
+ "{RAM:wBattleMonNick}"
+ ]
+ ],
+ "_WrongMon1Text": [
+ [
+ 1,
+ "{RAM:wInGameTradeGiveMonName}"
+ ]
+ ],
+ "_WrongMon2Text": [
+ [
+ 1,
+ "{RAM:wInGameTradeGiveMonName}"
+ ]
+ ],
+ "_WrongMon3Text": [
+ [
+ 1,
+ "{RAM:wInGameTradeGiveMonName}"
+ ]
+ ]
+ },
+ "labels": [
+ "_AIBattleUseItemText",
+ "_AIBattleWithdrawText",
+ "_AbandonLearningText",
+ "_AbraDexEntry",
+ "_AccessedBillsPCText",
+ "_AccessedHoFPCText",
+ "_AccessedMyPCText",
+ "_AccessedOaksPCText",
+ "_AccessedSomeonesPCText",
+ "_ActorNameText",
+ "_AerodactylDexEntry",
+ "_AerodactylFossilText",
+ "_AfterTrade1Text",
+ "_AfterTrade2Text",
+ "_AfterTrade3Text",
+ "_AgathaAfterBattleText",
+ "_AgathaBeforeBattleText",
+ "_AgathaEndBattleText",
+ "_AgathasRoomAgathaDontRunAwayText",
+ "_AlakazamDexEntry",
+ "_AlreadyAsleepText",
+ "_AlreadyKnowsText",
+ "_AlreadyOutText",
+ "_AntidoteText",
+ "_ArbokDexEntry",
+ "_ArcanineDexEntry",
+ "_ArticunoDexEntry",
+ "_AttackContinuesText",
+ "_AttackMissedText",
+ "_AwakeningText",
+ "_BadlyPoisonedText",
+ "_BecameConfusedText",
+ "_BeedrillDexEntry",
+ "_BeganToNapText",
+ "_BellsproutDexEntry",
+ "_BetHowManySlotMachineText",
+ "_BikeShopBagFullText",
+ "_BikeShopCantAffordText",
+ "_BikeShopClerkDoYouLikeItText",
+ "_BikeShopClerkHowDoYouLikeYourBicycleText",
+ "_BikeShopClerkOhThatsAVoucherText",
+ "_BikeShopClerkWelcomeText",
+ "_BikeShopComeAgainText",
+ "_BikeShopExchangedVoucherText",
+ "_BikeShopMiddleAgedWomanText",
+ "_BikeShopYoungsterCoolBikeText",
+ "_BikeShopYoungsterTheseBikesAreExpensiveText",
+ "_BillsHouseBillCheckOutMyRarePokemonText",
+ "_BillsHouseBillDontLeaveText",
+ "_BillsHouseBillImNotAPokemonText",
+ "_BillsHouseBillNoYouGottaHelpText",
+ "_BillsHouseBillThankYouText",
+ "_BillsHouseBillUseSeparationSystemText",
+ "_BillsHouseBillWhyDontYouGoInsteadOfMeText",
+ "_BillsHouseInitiatedText",
+ "_BillsHouseMonitorText",
+ "_BillsHousePokemonListText1",
+ "_BillsHousePokemonListText2",
+ "_BlastoiseDexEntry",
+ "_BluesHouseDaisyBagFullText",
+ "_BluesHouseDaisyOfferMapText",
+ "_BluesHouseDaisyRivalAtLabText",
+ "_BluesHouseDaisyUseMapText",
+ "_BluesHouseDaisyWalkingText",
+ "_BluesHouseTownMapText",
+ "_BookcaseText",
+ "_BoostedText",
+ "_BootedUpHMText",
+ "_BootedUpTMText",
+ "_BoulderText",
+ "_BoxFullCannotThrowBallText",
+ "_BoxFullDebugText",
+ "_BoxFullText",
+ "_BoxIsFullText",
+ "_BoxWillBeClearedText",
+ "_BrunoAfterBattleText",
+ "_BrunoBeforeBattleText",
+ "_BrunoEndBattleText",
+ "_BrunosRoomBrunoDontRunAwayText",
+ "_BuildingRageText",
+ "_BulbasaurDexEntry",
+ "_BurnHealText",
+ "_BurnedText",
+ "_ButItFailedText",
+ "_ButterfreeDexEntry",
+ "_CableClubNPCAreaReservedFor2FriendsLinkedByCableText",
+ "_CableClubNPCLinkClosedBecauseOfInactivityText",
+ "_CableClubNPCMakingPreparationsText",
+ "_CableClubNPCPleaseApplyHereHaveToSaveText",
+ "_CableClubNPCPleaseComeAgainText",
+ "_CableClubNPCPleaseWaitText",
+ "_CableClubNPCWelcomeText",
+ "_CanMoveBouldersText",
+ "_CannotFlyHereText",
+ "_CannotGetOffHereText",
+ "_CannotUseItemsHereText",
+ "_CannotUseTeleportNowText",
+ "_CantCarryMoreText",
+ "_CantDepositLastMonText",
+ "_CantEscapeText",
+ "_CantMoveText",
+ "_CantTakeMonText",
+ "_CardKeyFailText",
+ "_CardKeySuccessText1",
+ "_CardKeySuccessText2",
+ "_CaterpieDexEntry",
+ "_CeladonChiefHouseChiefText",
+ "_CeladonChiefHouseRocketText",
+ "_CeladonChiefHouseSailorText",
+ "_CeladonCityDeptStoreSignText",
+ "_CeladonCityFisherText",
+ "_CeladonCityGameCornerSignText",
+ "_CeladonCityGirlText",
+ "_CeladonCityGramps1Text",
+ "_CeladonCityGramps2Text",
+ "_CeladonCityGramps3ReceivedTM41Text",
+ "_CeladonCityGramps3TM41ExplanationText",
+ "_CeladonCityGramps3TM41NoRoomText",
+ "_CeladonCityGramps3Text",
+ "_CeladonCityGymSignText",
+ "_CeladonCityHotelText",
+ "_CeladonCityLittleGirlText",
+ "_CeladonCityMansionSignText",
+ "_CeladonCityPokecenterGuyText",
+ "_CeladonCityPoliwrathText",
+ "_CeladonCityPrizeExchangeSignText",
+ "_CeladonCityRocket1Text",
+ "_CeladonCityRocket2Text",
+ "_CeladonCitySignText",
+ "_CeladonCityTrainerTips1Text",
+ "_CeladonCityTrainerTips2Text",
+ "_CeladonDinerCookText",
+ "_CeladonDinerFisherText",
+ "_CeladonDinerGymGuideCoinCaseNoRoomText",
+ "_CeladonDinerGymGuideImFlatOutBustedText",
+ "_CeladonDinerGymGuideReceivedCoinCaseText",
+ "_CeladonDinerGymGuideWinItBackText",
+ "_CeladonDinerMiddleAgedManText",
+ "_CeladonDinerMiddleAgedWomanText",
+ "_CeladonGymAfterBattleText2",
+ "_CeladonGymAfterBattleText3",
+ "_CeladonGymAfterBattleText4",
+ "_CeladonGymAfterBattleText5",
+ "_CeladonGymAfterBattleText6",
+ "_CeladonGymAfterBattleText7",
+ "_CeladonGymAfterBattleText8",
+ "_CeladonGymBattleText2",
+ "_CeladonGymBattleText3",
+ "_CeladonGymBattleText4",
+ "_CeladonGymBattleText5",
+ "_CeladonGymBattleText6",
+ "_CeladonGymBattleText7",
+ "_CeladonGymBattleText8",
+ "_CeladonGymEndBattleText2",
+ "_CeladonGymEndBattleText3",
+ "_CeladonGymEndBattleText4",
+ "_CeladonGymEndBattleText5",
+ "_CeladonGymEndBattleText6",
+ "_CeladonGymEndBattleText7",
+ "_CeladonGymEndBattleText8",
+ "_CeladonGymErikaPostBattleAdviceText",
+ "_CeladonGymErikaPreBattleText",
+ "_CeladonGymErikaReceivedRainbowBadgeText",
+ "_CeladonGymRainbowBadgeInfoText",
+ "_CeladonGymReceivedTM21Text",
+ "_CeladonGymTM21NoRoomText",
+ "_CeladonHotelBeautyText",
+ "_CeladonHotelGrannyText",
+ "_CeladonHotelSuperNerdText",
+ "_CeladonMansion1FClefairyText",
+ "_CeladonMansion1FManagersSuiteSignText",
+ "_CeladonMansion1FMeowthText",
+ "_CeladonMansion1FNidoranFText",
+ "_CeladonMansion1Text10",
+ "_CeladonMansion1Text11",
+ "_CeladonMansion1Text12",
+ "_CeladonMansion1Text2",
+ "_CeladonMansion1Text6",
+ "_CeladonMansion1Text7",
+ "_CeladonMansion1Text8",
+ "_CeladonMansion1Text9",
+ "_CeladonMansion2FMeetingRoomSignText",
+ "_CeladonMansion3FDevRoomSignText",
+ "_CeladonMansion3FGameDesignerCompletedDexText",
+ "_CeladonMansion3FGameDesignerCompletedDexText2",
+ "_CeladonMansion3FGameDesignerText",
+ "_CeladonMansion3FGameProgramPCText",
+ "_CeladonMansion3FGameScriptPCText",
+ "_CeladonMansion3FGraphicArtistText",
+ "_CeladonMansion3FGraphicArtistText2",
+ "_CeladonMansion3FGraphicArtistText3",
+ "_CeladonMansion3FGraphicArtistText4",
+ "_CeladonMansion3FGraphicArtistText5",
+ "_CeladonMansion3FPlayingGamePCText",
+ "_CeladonMansion3FProgrammerText",
+ "_CeladonMansion3FProgrammerText2",
+ "_CeladonMansion3FWriterText",
+ "_CeladonMansion3FWriterText2",
+ "_CeladonMansionRoofHouseHikerText",
+ "_CeladonMansionRoofHouseSignText",
+ "_CeladonMart1FCurrentFloorSignText",
+ "_CeladonMart1FDirectorySignText",
+ "_CeladonMart1FReceptionistText",
+ "_CeladonMart2FCurrentFloorSignText",
+ "_CeladonMart2FGirlText",
+ "_CeladonMart2FMiddleAgedManText",
+ "_CeladonMart3FClerkReceivedTM18Text",
+ "_CeladonMart3FClerkTM18ExplanationText",
+ "_CeladonMart3FClerkTM18NoRoomText",
+ "_CeladonMart3FClerkTM18PreReceiveText",
+ "_CeladonMart3FCurrentFloorSignText",
+ "_CeladonMart3FFightingGameText",
+ "_CeladonMart3FGameBoyKid1Text",
+ "_CeladonMart3FGameBoyKid2Text",
+ "_CeladonMart3FGameBoyKid3Text",
+ "_CeladonMart3FLittleBoyText",
+ "_CeladonMart3FPokemonPosterText",
+ "_CeladonMart3FPuzzleGameText",
+ "_CeladonMart3FRPGText",
+ "_CeladonMart3FSNESText",
+ "_CeladonMart3FSportsGameText",
+ "_CeladonMart4FCurrentFloorSignText",
+ "_CeladonMart4FSuperNerdText",
+ "_CeladonMart4FYoungsterText",
+ "_CeladonMart5FCurrentFloorSignText",
+ "_CeladonMart5FGentlemanText",
+ "_CeladonMart5FSailorText",
+ "_CeladonMartRoofCurrentFloorSignText",
+ "_CeladonMartRoofLittleGirlGiveHerADrinkText",
+ "_CeladonMartRoofLittleGirlGiveHerWhichDrinkText",
+ "_CeladonMartRoofLittleGirlImNotThirstyText",
+ "_CeladonMartRoofLittleGirlImThirstyText",
+ "_CeladonMartRoofLittleGirlNoRoomText",
+ "_CeladonMartRoofLittleGirlReceivedTM13Text",
+ "_CeladonMartRoofLittleGirlReceivedTM48Text",
+ "_CeladonMartRoofLittleGirlReceivedTM49Text",
+ "_CeladonMartRoofLittleGirlTM13ExplanationText",
+ "_CeladonMartRoofLittleGirlTM48ExplanationText",
+ "_CeladonMartRoofLittleGirlTM49ExplanationText",
+ "_CeladonMartRoofLittleGirlYayFreshWaterText",
+ "_CeladonMartRoofLittleGirlYayLemonadeText",
+ "_CeladonMartRoofLittleGirlYaySodaPopText",
+ "_CeladonMartRoofSuperNerdText",
+ "_CeladonPokecenterBeautyText",
+ "_CeladonPokecenterGentlemanText",
+ "_CeruleanBadgeHouseBoulderBadgeText",
+ "_CeruleanBadgeHouseCascadeBadgeText",
+ "_CeruleanBadgeHouseEarthBadgeText",
+ "_CeruleanBadgeHouseMarshBadgeText",
+ "_CeruleanBadgeHouseMiddleAgedManText",
+ "_CeruleanBadgeHouseMiddleAgedManVisitAnyTimeText",
+ "_CeruleanBadgeHouseMiddleAgedManWhichBadgeText",
+ "_CeruleanBadgeHouseRainbowBadgeText",
+ "_CeruleanBadgeHouseSoulBadgeText",
+ "_CeruleanBadgeHouseThunderBadgeText",
+ "_CeruleanBadgeHouseVolcanoBadgeText",
+ "_CeruleanCityBikeShopSign",
+ "_CeruleanCityCooltrainerF1ElectrodePunchText",
+ "_CeruleanCityCooltrainerF1ElectrodeUseSonicboomText",
+ "_CeruleanCityCooltrainerF1ElectrodeWithdrawText",
+ "_CeruleanCityCooltrainerF2Text",
+ "_CeruleanCityCooltrainerMText",
+ "_CeruleanCityElectrodeIgnoredOrdersText",
+ "_CeruleanCityElectrodeIsLoafingAroundText",
+ "_CeruleanCityElectrodeTookASnoozeText",
+ "_CeruleanCityElectrodeTurnedAwayText",
+ "_CeruleanCityGuardText",
+ "_CeruleanCityGymSign",
+ "_CeruleanCityRivalDefeatedText",
+ "_CeruleanCityRivalIWentToBillsText",
+ "_CeruleanCityRivalPreBattleText",
+ "_CeruleanCityRivalVictoryText",
+ "_CeruleanCityRocketIBetterGetMovingText",
+ "_CeruleanCityRocketIGiveUpText",
+ "_CeruleanCityRocketIllReturnTheTMText",
+ "_CeruleanCityRocketReceivedTM28Text",
+ "_CeruleanCityRocketTM28NoRoomText",
+ "_CeruleanCityRocketText",
+ "_CeruleanCitySignText",
+ "_CeruleanCitySuperNerd1Text",
+ "_CeruleanCitySuperNerd2Text",
+ "_CeruleanCitySuperNerd3Text",
+ "_CeruleanCityTrainerTipsText",
+ "_CeruleanGymAfterBattleText1",
+ "_CeruleanGymAfterBattleText2",
+ "_CeruleanGymBattleText1",
+ "_CeruleanGymBattleText2",
+ "_CeruleanGymEndBattleText1",
+ "_CeruleanGymEndBattleText2",
+ "_CeruleanGymGymGuideBeatMistyText",
+ "_CeruleanGymGymGuideChampInMakingText",
+ "_CeruleanGymMistyCascadeBadgeInfoText",
+ "_CeruleanGymMistyPreBattleText",
+ "_CeruleanGymMistyReceivedCascadeBadgeText",
+ "_CeruleanGymMistyReceivedTM11Text",
+ "_CeruleanGymMistyTM11ExplanationText",
+ "_CeruleanGymMistyTM11NoRoomText",
+ "_CeruleanMartCooltrainerFText",
+ "_CeruleanMartCooltrainerMText",
+ "_CeruleanPokecenterGentlemanText",
+ "_CeruleanPokecenterGuyText",
+ "_CeruleanPokecenterSuperNerdText",
+ "_CeruleanTrashedHouseFishingGuruTheyStoleATMText",
+ "_CeruleanTrashedHouseFishingGuruWhatsLostIsLostText",
+ "_CeruleanTrashedHouseGirlText",
+ "_CeruleanTrashedHouseWallHoleText",
+ "_ChampionsRoomOakComeWithMeText",
+ "_ChampionsRoomOakCongratulatesPlayerText",
+ "_ChampionsRoomOakDisappointedWithRivalText",
+ "_ChampionsRoomOakText",
+ "_ChampionsRoomRivalAfterBattleText",
+ "_ChampionsRoomRivalIntroText",
+ "_ChanseyDexEntry",
+ "_ChargeMoveEffectText",
+ "_CharizardDexEntry",
+ "_CharmanderDexEntry",
+ "_CharmeleonDexEntry",
+ "_ChooseABoxText",
+ "_CinnabarGymBlainePostBattleAdviceText",
+ "_CinnabarGymBlainePreBattleText",
+ "_CinnabarGymBlaineReceivedTM38Text",
+ "_CinnabarGymBlaineReceivedVolcanoBadgeText",
+ "_CinnabarGymBlaineTM38ExplanationText",
+ "_CinnabarGymBlaineTM38NoRoomText",
+ "_CinnabarGymBlaineVolcanoBadgeInfoText",
+ "_CinnabarGymGymGuideBeatBlaineText",
+ "_CinnabarGymGymGuideChampInMakingText",
+ "_CinnabarGymQuizCorrectText",
+ "_CinnabarGymQuizDummyIntroText",
+ "_CinnabarGymQuizIncorrectText",
+ "_CinnabarGymQuizIntroText",
+ "_CinnabarGymQuizShortIntroText",
+ "_CinnabarGymSuperNerd1AfterBattleText",
+ "_CinnabarGymSuperNerd1BattleText",
+ "_CinnabarGymSuperNerd1EndBattleText",
+ "_CinnabarGymSuperNerd2AfterBattleText",
+ "_CinnabarGymSuperNerd2BattleText",
+ "_CinnabarGymSuperNerd2EndBattleText",
+ "_CinnabarGymSuperNerd3AfterBattleText",
+ "_CinnabarGymSuperNerd3BattleText",
+ "_CinnabarGymSuperNerd3EndBattleText",
+ "_CinnabarGymSuperNerd4AfterBattleText",
+ "_CinnabarGymSuperNerd4BattleText",
+ "_CinnabarGymSuperNerd4EndBattleText",
+ "_CinnabarGymSuperNerd5AfterBattleText",
+ "_CinnabarGymSuperNerd5BattleText",
+ "_CinnabarGymSuperNerd5EndBattleText",
+ "_CinnabarGymSuperNerd6AfterBattleText",
+ "_CinnabarGymSuperNerd6BattleText",
+ "_CinnabarGymSuperNerd6EndBattleText",
+ "_CinnabarGymSuperNerd7AfterBattleText",
+ "_CinnabarGymSuperNerd7BattleText",
+ "_CinnabarGymSuperNerd7EndBattleText",
+ "_CinnabarGymText_1",
+ "_CinnabarGymText_2",
+ "_CinnabarGymText_3",
+ "_CinnabarGymText_4",
+ "_CinnabarGymText_5",
+ "_CinnabarGymText_6",
+ "_CinnabarGymText_7",
+ "_CinnabarIslandDoorIsLockedText",
+ "_CinnabarIslandGamblerText",
+ "_CinnabarIslandGirlText",
+ "_CinnabarIslandGymSignText",
+ "_CinnabarIslandPokemonLabSignText",
+ "_CinnabarIslandSignText",
+ "_CinnabarLabFishingGuruText",
+ "_CinnabarLabFossilRoomScientist1ComeAgainText",
+ "_CinnabarLabFossilRoomScientist1FossilIsBackToLifeText",
+ "_CinnabarLabFossilRoomScientist1GoForAWalkText",
+ "_CinnabarLabFossilRoomScientist1GoForAWalkText2",
+ "_CinnabarLabFossilRoomScientist1NoFossilsText",
+ "_CinnabarLabFossilRoomScientist1SeesFossilText",
+ "_CinnabarLabFossilRoomScientist1TakesFossilText",
+ "_CinnabarLabFossilRoomScientist1Text",
+ "_CinnabarLabMeetingRoomSignText",
+ "_CinnabarLabMetronomeRoomAmberPipeText",
+ "_CinnabarLabMetronomeRoomPCText",
+ "_CinnabarLabMetronomeRoomScientist1ReceivedTM35Text",
+ "_CinnabarLabMetronomeRoomScientist1TM35ExplanationText",
+ "_CinnabarLabMetronomeRoomScientist1TM35NoRoomText",
+ "_CinnabarLabMetronomeRoomScientist1Text",
+ "_CinnabarLabMetronomeRoomScientist2Text",
+ "_CinnabarLabPhotoText",
+ "_CinnabarLabRAndDSignText",
+ "_CinnabarLabTestingRoomSignText",
+ "_CinnabarLabTradeRoomSuperNerdText",
+ "_CinnabarMartScientistText",
+ "_CinnabarMartSilphWorkerFText",
+ "_CinnabarPokecenterCooltrainerFText",
+ "_CinnabarPokecenterGentlemanText",
+ "_CinnabarPokecenterGuyText",
+ "_CinnabarQuizQuestionsText1",
+ "_CinnabarQuizQuestionsText2",
+ "_CinnabarQuizQuestionsText3",
+ "_CinnabarQuizQuestionsText4",
+ "_CinnabarQuizQuestionsText5",
+ "_CinnabarQuizQuestionsText6",
+ "_ClearSaveDataText",
+ "_ClefableDexEntry",
+ "_ClefairyDexEntry",
+ "_ClosedOaksPCText",
+ "_CloysterDexEntry",
+ "_CoinCaseNumCoinsText",
+ "_CoinsScatteredText",
+ "_Colosseum3MonsText",
+ "_ColosseumCanceledText",
+ "_ColosseumDifferentMonsText",
+ "_ColosseumEvolvedText",
+ "_ColosseumHeightText",
+ "_ColosseumIneligibleText",
+ "_ColosseumMaxL20Text",
+ "_ColosseumMaxL30Text",
+ "_ColosseumMaxL55Text",
+ "_ColosseumMewText",
+ "_ColosseumMinL15Text",
+ "_ColosseumMinL25Text",
+ "_ColosseumMinL50Text",
+ "_ColosseumOpponentText",
+ "_ColosseumPleaseWaitText",
+ "_ColosseumTotalL155Text",
+ "_ColosseumTotalL50Text",
+ "_ColosseumTotalL80Text",
+ "_ColosseumVersionText",
+ "_ColosseumWeightText",
+ "_ColosseumWhereToText",
+ "_ComeBackText",
+ "_ConfusedNoMoreText",
+ "_ConnectCableText",
+ "_ContCharText",
+ "_ConvertedTypeText",
+ "_CopycatsHouse1FChanseyText",
+ "_CopycatsHouse1FMiddleAgedManText",
+ "_CopycatsHouse1FMiddleAgedWomanText",
+ "_CopycatsHouse2FCopycatDoYouLikePokemonText",
+ "_CopycatsHouse2FCopycatReceivedTM31Text",
+ "_CopycatsHouse2FCopycatTM31Explanation1Text",
+ "_CopycatsHouse2FCopycatTM31Explanation2Text",
+ "_CopycatsHouse2FCopycatTM31NoRoomText",
+ "_CopycatsHouse2FCopycatTM31PreReceiveText",
+ "_CopycatsHouse2FDoduoText",
+ "_CopycatsHouse2FPCCantSeeText",
+ "_CopycatsHouse2FPCMySecretsText",
+ "_CopycatsHouse2FRareDollText",
+ "_CopycatsHouse2FSNESText",
+ "_CriticalHitText",
+ "_CuboneDexEntry",
+ "_CurrentTooFastText",
+ "_CyclingIsFunText",
+ "_DaycareGentlemanAllRightThenText",
+ "_DaycareGentlemanCantAcceptMonWithHMText",
+ "_DaycareGentlemanComeAgainText",
+ "_DaycareGentlemanComeSeeMeInAWhileText",
+ "_DaycareGentlemanGotMonBackText",
+ "_DaycareGentlemanHeresYourMonText",
+ "_DaycareGentlemanIntroText",
+ "_DaycareGentlemanMonHasGrownText",
+ "_DaycareGentlemanMonNeedsMoreTimeText",
+ "_DaycareGentlemanNoRoomForMonText",
+ "_DaycareGentlemanNotEnoughMoneyText",
+ "_DaycareGentlemanOnlyHaveOneMonText",
+ "_DaycareGentlemanOweMoneyText",
+ "_DaycareGentlemanWhichMonText",
+ "_DaycareGentlemanWillLookAfterMonText",
+ "_DepositHowManyText",
+ "_DepositWhichMonText",
+ "_DewgongDexEntry",
+ "_DexCompletionText",
+ "_DexRatingText",
+ "_DexRatingText_Own0To9",
+ "_DexRatingText_Own100To109",
+ "_DexRatingText_Own10To19",
+ "_DexRatingText_Own110To119",
+ "_DexRatingText_Own120To129",
+ "_DexRatingText_Own130To139",
+ "_DexRatingText_Own140To149",
+ "_DexRatingText_Own150To151",
+ "_DexRatingText_Own20To29",
+ "_DexRatingText_Own30To39",
+ "_DexRatingText_Own40To49",
+ "_DexRatingText_Own50To59",
+ "_DexRatingText_Own60To69",
+ "_DexRatingText_Own70To79",
+ "_DexRatingText_Own80To89",
+ "_DexRatingText_Own90To99",
+ "_DexSeenOwnedText",
+ "_DidNotLearnText",
+ "_DidntAffectText",
+ "_DiglettDexEntry",
+ "_DiglettSculptureText",
+ "_DiglettsCaveRoute11GamblerText",
+ "_DiglettsCaveRoute2FishingGuruText",
+ "_DisabledNoMoreText",
+ "_DittoDexEntry",
+ "_DoItText",
+ "_DoYouWantToNicknameText",
+ "_DodrioDexEntry",
+ "_DoduoDexEntry",
+ "_DoesntAffectMonText",
+ "_DontHavePokemonText",
+ "_DragonairDexEntry",
+ "_DragoniteDexEntry",
+ "_DratiniDexEntry",
+ "_DreamWasEatenText",
+ "_DroppedHiddenCoinsText",
+ "_DrowzeeDexEntry",
+ "_DugAHoleText",
+ "_DugtrioDexEntry",
+ "_EeveeDexEntry",
+ "_EkansDexEntry",
+ "_ElectabuzzDexEntry",
+ "_ElectrodeDexEntry",
+ "_ElevatorText",
+ "_EndUsedMove1Text",
+ "_EndUsedMove2Text",
+ "_EndUsedMove3Text",
+ "_EndUsedMove4Text",
+ "_EndUsedMove5Text",
+ "_EnemiesOnEverySideText",
+ "_EnemyAppearedText",
+ "_EnemyMonFaintedText",
+ "_EnemyRanText",
+ "_EnemysWeakText",
+ "_EnoughText",
+ "_EvadedAttackText",
+ "_EvolvedText",
+ "_ExchangeCoinsForPrizesText",
+ "_ExclamationText",
+ "_ExeggcuteDexEntry",
+ "_ExeggutorDexEntry",
+ "_ExpPointsText",
+ "_ExpressionText",
+ "_FanClubPicture1Text",
+ "_FanClubPicture2Text",
+ "_FarfetchdDexEntry",
+ "_FastAsleepText",
+ "_FearowDexEntry",
+ "_FellAsleepBecameHealthyText",
+ "_FellAsleepText",
+ "_FellText",
+ "_FightingDojoBetterNotGetGreedyText",
+ "_FightingDojoBlackbelt1AfterBattleText",
+ "_FightingDojoBlackbelt1BattleText",
+ "_FightingDojoBlackbelt1EndBattleText",
+ "_FightingDojoBlackbelt2AfterBattleText",
+ "_FightingDojoBlackbelt2BattleText",
+ "_FightingDojoBlackbelt2EndBattleText",
+ "_FightingDojoBlackbelt3AfterBattleText",
+ "_FightingDojoBlackbelt3BattleText",
+ "_FightingDojoBlackbelt3EndBattleText",
+ "_FightingDojoBlackbelt4AfterBattleText",
+ "_FightingDojoBlackbelt4BattleText",
+ "_FightingDojoBlackbelt4EndBattleText",
+ "_FightingDojoHitmonchanPokeBallText",
+ "_FightingDojoHitmonleePokeBallText",
+ "_FightingDojoKarateMasterDefeatedText",
+ "_FightingDojoKarateMasterIWillGiveYouAPokemonText",
+ "_FightingDojoKarateMasterStayAndTrainWithUsText",
+ "_FightingDojoKarateMasterText",
+ "_FightingDojoText",
+ "_FileDataDestroyedText",
+ "_FireDefrostedText",
+ "_FlareonDexEntry",
+ "_FlashLightsAreaText",
+ "_FlewUpHighText",
+ "_FlinchedText",
+ "_FluteWokeUpText",
+ "_ForgotAndText",
+ "_FoundHiddenCoins2Text",
+ "_FoundHiddenCoinsText",
+ "_FoundHiddenItemText",
+ "_FoundItemText",
+ "_FrozenText",
+ "_FuchsiaBillsGrandpasHouseBillsGrandpaText",
+ "_FuchsiaBillsGrandpasHouseMiddleAgedWomanText",
+ "_FuchsiaBillsGrandpasHouseYoungsterText",
+ "_FuchsiaCityChanseySignText",
+ "_FuchsiaCityErikText",
+ "_FuchsiaCityFossilSignKabutoText",
+ "_FuchsiaCityFossilSignOmanyteText",
+ "_FuchsiaCityFossilSignUndeterminedText",
+ "_FuchsiaCityGamblerText",
+ "_FuchsiaCityGymSignText",
+ "_FuchsiaCityKangaskhanSignText",
+ "_FuchsiaCityLaprasSignText",
+ "_FuchsiaCityPokecenterGuyText",
+ "_FuchsiaCityPokemonText",
+ "_FuchsiaCitySafariGameSignText",
+ "_FuchsiaCitySafariZoneSignText",
+ "_FuchsiaCitySignText",
+ "_FuchsiaCitySlowpokeSignText",
+ "_FuchsiaCityVoltorbSignText",
+ "_FuchsiaCityWardensHomeSignText",
+ "_FuchsiaCityYoungster1Text",
+ "_FuchsiaCityYoungster2Text",
+ "_FuchsiaGoodRodHouseFishingGuruHowAreTheFishText",
+ "_FuchsiaGoodRodHouseFishingGuruNoRoomText",
+ "_FuchsiaGoodRodHouseFishingGuruReceivedGoodRodText",
+ "_FuchsiaGoodRodHouseFishingGuruText",
+ "_FuchsiaGoodRodHouseFishingGuruThatsSoDisappointingText",
+ "_FuchsiaGymGymGuideBeatKogaText",
+ "_FuchsiaGymGymGuideChampInMakingText",
+ "_FuchsiaGymKogaBeforeBattleText",
+ "_FuchsiaGymKogaPostBattleAdviceText",
+ "_FuchsiaGymKogaReceivedSoulBadgeText",
+ "_FuchsiaGymKogaReceivedTM06Text",
+ "_FuchsiaGymKogaSoulBadgeInfoText",
+ "_FuchsiaGymKogaTM06ExplanationText",
+ "_FuchsiaGymKogaTM06NoRoomText",
+ "_FuchsiaGymRocker1AfterBattleText",
+ "_FuchsiaGymRocker1BattleText",
+ "_FuchsiaGymRocker1EndBattleText",
+ "_FuchsiaGymRocker2AfterBattleText",
+ "_FuchsiaGymRocker2BattleText",
+ "_FuchsiaGymRocker2EndBattleText",
+ "_FuchsiaGymRocker3AfterBattleText",
+ "_FuchsiaGymRocker3BattleText",
+ "_FuchsiaGymRocker3EndBattleText",
+ "_FuchsiaGymRocker4AfterBattleText",
+ "_FuchsiaGymRocker4BattleText",
+ "_FuchsiaGymRocker4EndBattleText",
+ "_FuchsiaGymRocker5AfterBattleText",
+ "_FuchsiaGymRocker5BattleText",
+ "_FuchsiaGymRocker5EndBattleText",
+ "_FuchsiaGymRocker6AfterBattleText",
+ "_FuchsiaGymRocker6BattleText",
+ "_FuchsiaGymRocker6EndBattleText",
+ "_FuchsiaMartCooltrainerFText",
+ "_FuchsiaMartMiddleAgedManText",
+ "_FuchsiaMeetingRoomSafariZoneWorker1",
+ "_FuchsiaMeetingRoomSafariZoneWorker2",
+ "_FuchsiaMeetingRoomSafariZoneWorker3",
+ "_FuchsiaPokecenterCooltrainerFText",
+ "_FuchsiaPokecenterRockerText",
+ "_FullHealText",
+ "_FullyParalyzedText",
+ "_GainedText",
+ "_GameCornerBeauty1Text",
+ "_GameCornerBeauty2Text",
+ "_GameCornerClerkCantAffordTheCoinsText",
+ "_GameCornerClerkCoinCaseIsFullText",
+ "_GameCornerClerkDoYouNeedSomeGameCoinsText",
+ "_GameCornerClerkDontHaveCoinCaseText",
+ "_GameCornerClerkPleaseComePlaySometimeText",
+ "_GameCornerClerkThanksHereAre50CoinsText",
+ "_GameCornerCoinCaseText",
+ "_GameCornerFishingGuru1DontNeedMyCoinsText",
+ "_GameCornerFishingGuru1Received10CoinsText",
+ "_GameCornerFishingGuru1WantToPlayText",
+ "_GameCornerFishingGuru1WinsComeAndGoText",
+ "_GameCornerFishingGuru2CloselyWatchTheReelsText",
+ "_GameCornerFishingGuru2Received20CoinsText",
+ "_GameCornerFishingGuru2ThrowingMeOffText",
+ "_GameCornerFishingGuru2YouGotYourOwnCoinsText",
+ "_GameCornerGamblerText",
+ "_GameCornerGymGuideChampInMakingText",
+ "_GameCornerGymGuideTheyOfferRarePokemonText",
+ "_GameCornerMiddleAgedMan1Text",
+ "_GameCornerMiddleAgedMan2INeedMoreCoinsText",
+ "_GameCornerMiddleAgedMan2Received20CoinsText",
+ "_GameCornerMiddleAgedMan2WantSomeCoinsText",
+ "_GameCornerMiddleAgedMan2YouHaveLotsOfCoinsText",
+ "_GameCornerMiddleAgedWomanText",
+ "_GameCornerNoCoinsText",
+ "_GameCornerOopsForgotCoinCaseText",
+ "_GameCornerOutOfOrderText",
+ "_GameCornerOutToLunchText",
+ "_GameCornerPosterSwitchBehindPosterText",
+ "_GameCornerPrizeRoomBaldingGuyText",
+ "_GameCornerPrizeRoomGamblerText",
+ "_GameCornerRocketAfterBattleText",
+ "_GameCornerRocketBattleEndText",
+ "_GameCornerRocketImGuardingThisPosterText",
+ "_GameCornerSomeonesKeysText",
+ "_GameOverText",
+ "_GameSavedText",
+ "_GastlyDexEntry",
+ "_GengarDexEntry",
+ "_GeodudeDexEntry",
+ "_GetDexRatedText",
+ "_GetOutText",
+ "_GetmText",
+ "_GettingPumpedText",
+ "_GhostCantBeIDdText",
+ "_GloomDexEntry",
+ "_GoText",
+ "_GolbatDexEntry",
+ "_GoldeenDexEntry",
+ "_GolduckDexEntry",
+ "_GolemDexEntry",
+ "_GoodText",
+ "_GotAwayText",
+ "_GotMapText",
+ "_GotMonText",
+ "_GotOffBicycleText1",
+ "_GotOffBicycleText2",
+ "_GotOnBicycleText1",
+ "_GotOnBicycleText2",
+ "_GravelerDexEntry",
+ "_GreatlyFellText",
+ "_GreatlyRoseText",
+ "_GrewLevelText",
+ "_GrimerDexEntry",
+ "_GroundRoseText",
+ "_GrowlitheDexEntry",
+ "_GyaradosDexEntry",
+ "_GymStatueText1",
+ "_GymStatueText2",
+ "_HMCantDeleteText",
+ "_HallOfFameOakText",
+ "_HasSubstituteText",
+ "_HaunterDexEntry",
+ "_HereYouGoText",
+ "_HiddenItemBagFullText",
+ "_HisNameIsText",
+ "_HitWithRecoilText",
+ "_HitXTimesText",
+ "_HitmonchanDexEntry",
+ "_HitmonleeDexEntry",
+ "_HookedMonAttackedText",
+ "_HorseaDexEntry",
+ "_HurtByBurnText",
+ "_HurtByLeechSeedText",
+ "_HurtByPoisonText",
+ "_HurtItselfText",
+ "_HypnoDexEntry",
+ "_IceHealText",
+ "_IgnoredOrdersText",
+ "_IndigoPlateauHQText",
+ "_IndigoPlateauLobbyCooltrainerFText",
+ "_IndigoPlateauLobbyGymGuideText",
+ "_IndigoPlateauStatuesText1",
+ "_IndigoPlateauStatuesText2",
+ "_IndigoPlateauStatuesText3",
+ "_IntoText",
+ "_IntroducePlayerText",
+ "_IntroduceRivalText",
+ "_IsConfusedText",
+ "_IsEvolvingText",
+ "_IsFrozenText",
+ "_IsItOKToTossItemText",
+ "_IsUnaffectedText",
+ "_ItemUseBallText00",
+ "_ItemUseBallText01",
+ "_ItemUseBallText02",
+ "_ItemUseBallText03",
+ "_ItemUseBallText04",
+ "_ItemUseBallText05",
+ "_ItemUseBallText06",
+ "_ItemUseBallText07",
+ "_ItemUseBallText08",
+ "_ItemUseNoEffectText",
+ "_ItemUseNotTimeText",
+ "_ItemUseNotYoursToUseText",
+ "_ItemUseText001",
+ "_ItemUseText002",
+ "_ItemWasStoredText",
+ "_ItemfinderFoundItemText",
+ "_ItemfinderFoundNothingText",
+ "_ItemsCantBeUsedHereText",
+ "_ItsABiteText",
+ "_IvysaurDexEntry",
+ "_JigglypuffDexEntry",
+ "_JolteonDexEntry",
+ "_JustAMomentText",
+ "_JynxDexEntry",
+ "_KabutoDexEntry",
+ "_KabutopsDexEntry",
+ "_KabutopsFossilText",
+ "_KadabraDexEntry",
+ "_KakunaDexEntry",
+ "_KangaskhanDexEntry",
+ "_KeptGoingAndCrashedText",
+ "_KinglerDexEntry",
+ "_KoffingDexEntry",
+ "_KrabbyDexEntry",
+ "_LancesRoomLanceAfterBattleText",
+ "_LancesRoomLanceBeforeBattleText",
+ "_LancesRoomLanceEndBattleText",
+ "_LaprasDexEntry",
+ "_LavenderCuboneHouseBrunetteGirlGhostIsGoneText",
+ "_LavenderCuboneHouseBrunetteGirlPoorCubonesMotherText",
+ "_LavenderCuboneHouseCuboneText",
+ "_LavenderMartBaldingGuyText",
+ "_LavenderMartCooltrainerMNuggetText",
+ "_LavenderMartCooltrainerMReviveText",
+ "_LavenderPokecenterGentlemanText",
+ "_LavenderPokecenterGuyText",
+ "_LavenderPokecenterLittleGirlText",
+ "_LavenderTownCooltrainerMText",
+ "_LavenderTownLittleGirlDoYouBelieveInGhostsText",
+ "_LavenderTownLittleGirlHaHaGuessNotText",
+ "_LavenderTownLittleGirlSoThereAreBelieversText",
+ "_LavenderTownPokemonHouseSignText",
+ "_LavenderTownPokemonTowerSignText",
+ "_LavenderTownSignText",
+ "_LavenderTownSilphScopeSignText",
+ "_LavenderTownSuperNerdText",
+ "_LearnedMove1Text",
+ "_LickitungDexEntry",
+ "_LightScreenProtectedText",
+ "_LinedUpText",
+ "_LinkBattleLostText",
+ "_LinkCableHelpText1",
+ "_LinkCableHelpText2",
+ "_LinkCableInfoText1",
+ "_LinkCableInfoText2",
+ "_LinkCableInfoText3",
+ "_LoafingAroundText",
+ "_LooksContentText",
+ "_LoreleisRoomLoreleiAfterBattleText",
+ "_LoreleisRoomLoreleiBeforeBattleText",
+ "_LoreleisRoomLoreleiDontRunAwayText",
+ "_LoreleisRoomLoreleiEndBattleText",
+ "_LoweredItsHeadText",
+ "_MachampDexEntry",
+ "_MachokeDexEntry",
+ "_MachopDexEntry",
+ "_MadeWhirlwindText",
+ "_MagazinesText",
+ "_MagikarpDexEntry",
+ "_MagmarDexEntry",
+ "_MagnemiteDexEntry",
+ "_MagnetonDexEntry",
+ "_MankeyDexEntry",
+ "_MarowakDexEntry",
+ "_MartSignText",
+ "_MeowthDexEntry",
+ "_MetapodDexEntry",
+ "_MewDexEntry",
+ "_MewtwoBattleText",
+ "_MewtwoDexEntry",
+ "_MimicLearnedMoveText",
+ "_MirrorMoveFailedText",
+ "_MoltresDexEntry",
+ "_MonCannotLearnMachineMoveText",
+ "_MonIsTakenOutText",
+ "_MonWasReleasedText",
+ "_MonWasStoredText",
+ "_MoneyForWinningText",
+ "_MonsStatsFellText",
+ "_MonsStatsRoseText",
+ "_MoveDisabledText",
+ "_MoveIsDisabledText",
+ "_MoveNameText",
+ "_MoveNoPPText",
+ "_MoveWasDisabledText",
+ "_MrFujisHouseLittleGirlPokemonAreNiceToHugText",
+ "_MrFujisHouseLittleGirlThisIsMrFujisHouseText",
+ "_MrFujisHouseMrFujiHasMyFluteHelpedYouText",
+ "_MrFujisHouseMrFujiIThinkThisMayHelpYourQuestText",
+ "_MrFujisHouseMrFujiPokeFluteExplanationText",
+ "_MrFujisHouseMrFujiPokeFluteNoRoomText",
+ "_MrFujisHouseMrFujiPokedexText",
+ "_MrFujisHouseMrFujiReceivedPokeFluteText",
+ "_MrFujisHouseNidorinoText",
+ "_MrFujisHousePsyduckText",
+ "_MrFujisHouseSuperNerdMrFujiHadBeenPrayingText",
+ "_MrFujisHouseSuperNerdMrFujiIsntHereText",
+ "_MrMimeDexEntry",
+ "_MrPsychicsHouseMrPsychicReceivedTM29Text",
+ "_MrPsychicsHouseMrPsychicTM29ExplanationText",
+ "_MrPsychicsHouseMrPsychicTM29NoRoomText",
+ "_MrPsychicsHouseMrPsychicYouWantedThisText",
+ "_MtMoon1FBewareZubatSign",
+ "_MtMoon1FCooltrainerF1AfterBattleText",
+ "_MtMoon1FCooltrainerF1BattleText",
+ "_MtMoon1FCooltrainerF1EndBattleText",
+ "_MtMoon1FCooltrainerF2AfterBattleText",
+ "_MtMoon1FCooltrainerF2BattleText",
+ "_MtMoon1FCooltrainerF2EndBattleText",
+ "_MtMoon1FHikerAfterBattleText",
+ "_MtMoon1FHikerBattleText",
+ "_MtMoon1FHikerEndBattleText",
+ "_MtMoon1FSuperNerdAfterBattleText",
+ "_MtMoon1FSuperNerdBattleText",
+ "_MtMoon1FSuperNerdEndBattleText",
+ "_MtMoon1FYoungster1AfterBattleText",
+ "_MtMoon1FYoungster1BattleText",
+ "_MtMoon1FYoungster1EndBattleText",
+ "_MtMoon1FYoungster2AfterBattleText",
+ "_MtMoon1FYoungster2BattleText",
+ "_MtMoon1FYoungster2EndBattleText",
+ "_MtMoon1FYoungster3AfterBattleText",
+ "_MtMoon1FYoungster3BattleText",
+ "_MtMoon1FYoungster3EndBattleText",
+ "_MtMoonB1FUnusedText",
+ "_MtMoonB2FDomeFossilYouWantText",
+ "_MtMoonB2FHelixFossilYouWantText",
+ "_MtMoonB2FReceivedFossilText",
+ "_MtMoonB2FRocket2AfterBattleText",
+ "_MtMoonB2FRocket2BattleText",
+ "_MtMoonB2FRocket2EndBattleText",
+ "_MtMoonB2FRocket3AfterBattleText",
+ "_MtMoonB2FRocket3BattleText",
+ "_MtMoonB2FRocket3EndBattleText",
+ "_MtMoonB2FRocket4AfterBattleText",
+ "_MtMoonB2FRocket4BattleText",
+ "_MtMoonB2FRocket4EndBattleText",
+ "_MtMoonB2FSuperNerdOkIllShareText",
+ "_MtMoonB2FSuperNerdThenThisIsMineText",
+ "_MtMoonB2FSuperNerdTheresAPokemonLabText",
+ "_MtMoonB2FSuperNerdTheyreBothMineText",
+ "_MtMoonB2FYouHaveNoRoomText",
+ "_MtMoonB2fSuperNerdEachTakeOneText",
+ "_MtMoonJessieJamesText1",
+ "_MtMoonJessieJamesText2",
+ "_MtMoonJessieJamesText3",
+ "_MtMoonJessieJamesText4",
+ "_MtMoonPokecenterBenchGuyText",
+ "_MtMoonPokecenterClipboardText",
+ "_MtMoonPokecenterGentlemanText",
+ "_MtMoonPokecenterMagikarpSalesmanIGotADealText",
+ "_MtMoonPokecenterMagikarpSalesmanNoMoneyText",
+ "_MtMoonPokecenterMagikarpSalesmanNoRefundsText",
+ "_MtMoonPokecenterMagikarpSalesmanNoText",
+ "_MtMoonPokecenterYoungsterText",
+ "_MukDexEntry",
+ "_MultiHitText",
+ "_Museum1FGamblerText",
+ "_Museum1FOldAmberText",
+ "_Museum1FScientist1AmberIsFossilizedTreeSapText",
+ "_Museum1FScientist1ComeAgainText",
+ "_Museum1FScientist1DoYouKnowWhatAmberIsText",
+ "_Museum1FScientist1DontHaveEnoughMoneyText",
+ "_Museum1FScientist1GoToOtherSideText",
+ "_Museum1FScientist1TakePlentyOfTimeText",
+ "_Museum1FScientist1ThankYouText",
+ "_Museum1FScientist1TheresALabSomewhereText",
+ "_Museum1FScientist1WouldYouLikeToComeInText",
+ "_Museum1FScientist2GetTheOldAmberCheckText",
+ "_Museum1FScientist2ReceivedOldAmberText",
+ "_Museum1FScientist2TakeThisToAPokemonLabText",
+ "_Museum1FScientist2YouDontHaveSpaceText",
+ "_Museum1FScientist3Text",
+ "_Museum2FBrunetteGirlText",
+ "_Museum2FGrampsText",
+ "_Museum2FHikerText",
+ "_Museum2FMoonStoneSignText",
+ "_Museum2FPikachuText1",
+ "_Museum2FPikachuText2",
+ "_Museum2FScientistText",
+ "_Museum2FSpaceShuttleSignText",
+ "_Museum2FYoungsterText",
+ "_MustRechargeText",
+ "_NameRatersHouseNameRaterATrulyImpeccableNameText",
+ "_NameRatersHouseNameRaterComeAnyTimeYouLikeText",
+ "_NameRatersHouseNameRaterGiveItANiceNameText",
+ "_NameRatersHouseNameRaterPokemonHasBeenRenamedText",
+ "_NameRatersHouseNameRaterWantMeToRateText",
+ "_NameRatersHouseNameRaterWhatShouldWeNameItText",
+ "_NameRatersHouseNameRaterWhichPokemonText",
+ "_NeedYourPokemonText",
+ "_NewBadgeRequiredText",
+ "_NewBicycleText",
+ "_NidokingDexEntry",
+ "_NidoqueenDexEntry",
+ "_NidoranFDexEntry",
+ "_NidoranMDexEntry",
+ "_NidorinaDexEntry",
+ "_NidorinoDexEntry",
+ "_NinetalesDexEntry",
+ "_NoCyclingAllowedHereText",
+ "_NoEffectText",
+ "_NoMonText",
+ "_NoMoreRoomForItemText",
+ "_NoMovesLeftText",
+ "_NoNibbleText",
+ "_NoPokemonText",
+ "_NoRoomToStoreText",
+ "_NoRunningText",
+ "_NoSurfingHereText",
+ "_NoTrade1Text",
+ "_NoTrade2Text",
+ "_NoTrade3Text",
+ "_NoWillText",
+ "_NotEnoughCoinsSlotMachineText",
+ "_NotEnoughMemoryText",
+ "_NotHealthyEnoughText",
+ "_NotThisTimeText",
+ "_NotVeryEffectiveText",
+ "_NothingHappenedText",
+ "_NothingHereText",
+ "_NothingStoredText",
+ "_NothingToCutText",
+ "_NothingToDepositText",
+ "_NurseChanseyText",
+ "_OHKOText",
+ "_OKExclamationText",
+ "_OakLabEmailText",
+ "_OakSpeechText1",
+ "_OakSpeechText2A",
+ "_OakSpeechText2B",
+ "_OakSpeechText3",
+ "_OaksAideComeBackText",
+ "_OaksAideGotItemText",
+ "_OaksAideHereYouGoText",
+ "_OaksAideHiText",
+ "_OaksAideNoRoomText",
+ "_OaksAideUhOhText",
+ "_OaksLabGirlText",
+ "_OaksLabGivePokeballsExplanationText",
+ "_OaksLabOak1ComeSeeMeSometimesText",
+ "_OaksLabOak1DeliverParcelText",
+ "_OaksLabOak1GoAheadItsYours",
+ "_OaksLabOak1HowIsYourPokedexComingText",
+ "_OaksLabOak1ParcelThanksText",
+ "_OaksLabOak1PokemonAroundTheWorldText",
+ "_OaksLabOak1ReceivedPokeballsText",
+ "_OaksLabOak1YouShouldTalkToIt",
+ "_OaksLabOak1YourPokemonCanFightText",
+ "_OaksLabOak2Text",
+ "_OaksLabOakBePatientText",
+ "_OaksLabOakChooseMonText",
+ "_OaksLabOakDontGoAwayYetText",
+ "_OaksLabOakGivesText",
+ "_OaksLabOakGotPokedexText",
+ "_OaksLabOakIHaveARequestText",
+ "_OaksLabOakMyInventionPokedexText",
+ "_OaksLabOakThatWasMyDreamText",
+ "_OaksLabPikachuDislikesPokeballsText1",
+ "_OaksLabPikachuDislikesPokeballsText2",
+ "_OaksLabPokedexText",
+ "_OaksLabReceivedText",
+ "_OaksLabRivalAmIGreatOrWhatText",
+ "_OaksLabRivalFedUpWithWaitingText",
+ "_OaksLabRivalGrampsIsntAroundText",
+ "_OaksLabRivalGrampsText",
+ "_OaksLabRivalIPickedTheWrongPokemonText",
+ "_OaksLabRivalIllGetABetterPokemonThanYou",
+ "_OaksLabRivalIllTakeYouOnText",
+ "_OaksLabRivalLeaveItAllToMeText",
+ "_OaksLabRivalMyPokemonHasGrownStrongerText",
+ "_OaksLabRivalMyPokemonLooksStrongerText",
+ "_OaksLabRivalSmellYouLaterText",
+ "_OaksLabRivalTakesText1",
+ "_OaksLabRivalTakesText2",
+ "_OaksLabRivalTakesText3",
+ "_OaksLabRivalTakesText4",
+ "_OaksLabRivalTakesText5",
+ "_OaksLabRivalWhatAboutMeText",
+ "_OaksLabScientistText",
+ "_OaksLabThatsAPokeball",
+ "_OddishDexEntry",
+ "_OfficerJennyText1",
+ "_OfficerJennyText2",
+ "_OfficerJennyText3",
+ "_OfficerJennyText4",
+ "_OfficerJennyText5",
+ "_OhFineThenText",
+ "_OlderFileWillBeErasedText",
+ "_OmanyteDexEntry",
+ "_OmastarDexEntry",
+ "_OnceReleasedText",
+ "_OneMoreGoSlotMachineText",
+ "_OneTwoAndText",
+ "_OnixDexEntry",
+ "_OopsYouDontHaveEnoughRoomText",
+ "_OutOfCoinsSlotMachineText",
+ "_OutOfSafariBallsText",
+ "_PPIncreasedText",
+ "_PPMaxedOutText",
+ "_PPRestoredText",
+ "_PalletTownFisherText",
+ "_PalletTownGirlText",
+ "_PalletTownOakComeWithMe",
+ "_PalletTownOakHeyWaitDontGoOutText",
+ "_PalletTownOakThatWasCloseText",
+ "_PalletTownOakWhewText",
+ "_PalletTownOaksLabSignText",
+ "_PalletTownPlayersHouseSignText",
+ "_PalletTownRivalsHouseSignText",
+ "_PalletTownSignText",
+ "_ParalyzedMayNotAttackText",
+ "_ParasDexEntry",
+ "_ParasectDexEntry",
+ "_ParlyzHealText",
+ "_PartyMenuBattleText",
+ "_PartyMenuItemUseText",
+ "_PartyMenuNormalText",
+ "_PartyMenuSwapMonText",
+ "_PartyMenuUseTMText",
+ "_PersianDexEntry",
+ "_PewterCityCooltrainerFText",
+ "_PewterCityCooltrainerMText",
+ "_PewterCityGymSignText",
+ "_PewterCityMuseumSignText",
+ "_PewterCityPokecenterGuyText",
+ "_PewterCityPoliceNoticeSignText",
+ "_PewterCitySignText",
+ "_PewterCitySuperNerd1DidYouCheckOutMuseumText",
+ "_PewterCitySuperNerd1ItsRightHereText",
+ "_PewterCitySuperNerd1WerentThoseFossilsAmazingText",
+ "_PewterCitySuperNerd1YouHaveToGoText",
+ "_PewterCitySuperNerd2DoYouKnowWhatImDoingText",
+ "_PewterCitySuperNerd2ImSprayingRepelText",
+ "_PewterCitySuperNerd2ThatsRightText",
+ "_PewterCityTrainerTipsText",
+ "_PewterCityYoungsterGoTakeOnBrockText",
+ "_PewterCityYoungsterYoureATrainerFollowMeText",
+ "_PewterGymBrockBoulderBadgeInfoText",
+ "_PewterGymBrockPostBattleAdviceText",
+ "_PewterGymBrockPreBattleText",
+ "_PewterGymBrockReceivedBoulderBadgeText",
+ "_PewterGymBrockWaitTakeThisText",
+ "_PewterGymCooltrainerMAfterBattleText",
+ "_PewterGymCooltrainerMBattleText",
+ "_PewterGymCooltrainerMEndBattleText",
+ "_PewterGymGuideAdviceText",
+ "_PewterGymGuideBeginAdviceText",
+ "_PewterGymGuideFreeServiceText",
+ "_PewterGymGuidePostBattleText",
+ "_PewterGymGuidePreAdviceText",
+ "_PewterGymGuyText",
+ "_PewterGymReceivedTM34Text",
+ "_PewterGymTM34NoRoomText",
+ "_PewterMartSuperNerdText",
+ "_PewterMartYoungsterText",
+ "_PewterNidoranHouseLittleBoyText",
+ "_PewterNidoranHouseMiddleAgedManText",
+ "_PewterNidoranHouseNidoranText",
+ "_PewterPokecenterGentlemanText",
+ "_PewterPokecenterJigglypuffText",
+ "_PewterPokecenterText3",
+ "_PewterSpeechHouseGamblerText",
+ "_PewterSpeechHouseYoungsterText",
+ "_PickUpPayDayMoneyText",
+ "_PidgeotDexEntry",
+ "_PidgeottoDexEntry",
+ "_PidgeyDexEntry",
+ "_PikachuDexEntry",
+ "_PikachuUnhappyText",
+ "_PinsirDexEntry",
+ "_PlaySlotMachineText",
+ "_PlayedFluteHadEffectText",
+ "_PlayedFluteNoEffectText",
+ "_PlayerBlackedOutText",
+ "_PlayerBlackedOutText2",
+ "_PlayerMon1Text",
+ "_PlayerMon2Text",
+ "_PlayerMonFaintedText",
+ "_PoisonedText",
+ "_PokeCenterSignText",
+ "_PokemartAnythingElseText",
+ "_PokemartBoughtItemText",
+ "_PokemartBuyingGreetingText",
+ "_PokemartGreetingText",
+ "_PokemartItemBagEmptyText",
+ "_PokemartItemBagFullText",
+ "_PokemartNotEnoughMoneyText",
+ "_PokemartTellBuyPriceText",
+ "_PokemartTellSellPriceText",
+ "_PokemartThankYouText",
+ "_PokemartUnsellableItemText",
+ "_PokemonBooksText",
+ "_PokemonCenterFarewellText",
+ "_PokemonCenterWelcomeText",
+ "_PokemonFaintedText",
+ "_PokemonFanClubBagFullText",
+ "_PokemonFanClubChairFinalText",
+ "_PokemonFanClubChairmanIntroText",
+ "_PokemonFanClubChairmanStoryText",
+ "_PokemonFanClubClefairyFanBetterText",
+ "_PokemonFanClubClefairyFanNormalText",
+ "_PokemonFanClubClefairyFanText",
+ "_PokemonFanClubClefairyText",
+ "_PokemonFanClubExplainBikeVoucherText",
+ "_PokemonFanClubNoStoryText",
+ "_PokemonFanClubReceivedBikeVoucherText",
+ "_PokemonFanClubReceptionistText",
+ "_PokemonFanClubSeelFanBetterText",
+ "_PokemonFanClubSeelFanNormalText",
+ "_PokemonFanClubSeelFanText",
+ "_PokemonFanClubSeelText",
+ "_PokemonFightingFitText",
+ "_PokemonMansion1FScientistAfterBattleText",
+ "_PokemonMansion1FScientistBattleText",
+ "_PokemonMansion1FScientistEndBattleText",
+ "_PokemonMansion1FSwitchNotPressedText",
+ "_PokemonMansion1FSwitchPressedText",
+ "_PokemonMansion1FSwitchText",
+ "_PokemonMansion2FDiary1Text",
+ "_PokemonMansion2FDiary2Text",
+ "_PokemonMansion2FSuperNerdAfterBattleText",
+ "_PokemonMansion2FSuperNerdBattleText",
+ "_PokemonMansion2FSuperNerdEndBattleText",
+ "_PokemonMansion2FSwitchNotPressedText",
+ "_PokemonMansion2FSwitchPressedText",
+ "_PokemonMansion2FSwitchText",
+ "_PokemonMansion3FDiaryText",
+ "_PokemonMansion3FScientistAfterBattleText",
+ "_PokemonMansion3FScientistBattleText",
+ "_PokemonMansion3FScientistEndBattleText",
+ "_PokemonMansion3FSuperNerdAfterBattleText",
+ "_PokemonMansion3FSuperNerdBattleText",
+ "_PokemonMansion3FSuperNerdEndBattleText",
+ "_PokemonMansionB1FBurglarAfterBattleText",
+ "_PokemonMansionB1FBurglarBattleText",
+ "_PokemonMansionB1FBurglarEndBattleText",
+ "_PokemonMansionB1FDiaryText",
+ "_PokemonMansionB1FScientistAfterBattleText",
+ "_PokemonMansionB1FScientistBattleText",
+ "_PokemonMansionB1FScientistEndBattleText",
+ "_PokemonSellingGreetingText",
+ "_PokemonStuffText",
+ "_PokemonText",
+ "_PokemonTower1FBaldingGuyText",
+ "_PokemonTower1FChannelerText",
+ "_PokemonTower1FGirlText",
+ "_PokemonTower1FMiddleAgedWomanText",
+ "_PokemonTower1FReceptionistText",
+ "_PokemonTower2FChannelerText",
+ "_PokemonTower2FRivalDefeatedText",
+ "_PokemonTower2FRivalHowsYourDexText",
+ "_PokemonTower2FRivalVictoryText",
+ "_PokemonTower2FRivalWhatBringsYouHereText",
+ "_PokemonTower3FChanneler1AfterBattleText",
+ "_PokemonTower3FChanneler1BattleText",
+ "_PokemonTower3FChanneler1EndBattleText",
+ "_PokemonTower3FChanneler2AfterBattleText",
+ "_PokemonTower3FChanneler2BattleText",
+ "_PokemonTower3FChanneler2EndBattleText",
+ "_PokemonTower3FChanneler3AfterBattleText",
+ "_PokemonTower3FChanneler3BattleText",
+ "_PokemonTower3FChanneler3EndBattleText",
+ "_PokemonTower4FChanneler1AfterBattleText",
+ "_PokemonTower4FChanneler1BattleText",
+ "_PokemonTower4FChanneler1EndBattleText",
+ "_PokemonTower4FChanneler2AfterBattleText",
+ "_PokemonTower4FChanneler2BattleText",
+ "_PokemonTower4FChanneler2EndBattleText",
+ "_PokemonTower4FChanneler3AfterBattleText",
+ "_PokemonTower4FChanneler3BattleText",
+ "_PokemonTower4FChanneler3EndBattleText",
+ "_PokemonTower5FChanneler1Text",
+ "_PokemonTower5FChanneler2AfterBattleText",
+ "_PokemonTower5FChanneler2BattleText",
+ "_PokemonTower5FChanneler2EndBattleText",
+ "_PokemonTower5FChanneler3AfterBattleText",
+ "_PokemonTower5FChanneler3BattleText",
+ "_PokemonTower5FChanneler3EndBattleText",
+ "_PokemonTower5FChanneler4AfterBattleText",
+ "_PokemonTower5FChanneler4BattleText",
+ "_PokemonTower5FChanneler4EndBattleText",
+ "_PokemonTower5FChanneler5AfterBattleText",
+ "_PokemonTower5FChanneler5BattleText",
+ "_PokemonTower5FChanneler5EndBattleText",
+ "_PokemonTower5FPurifiedZoneText",
+ "_PokemonTower6FBeGoneText",
+ "_PokemonTower6FChanneler1AfterBattleText",
+ "_PokemonTower6FChanneler1BattleText",
+ "_PokemonTower6FChanneler1EndBattleText",
+ "_PokemonTower6FChanneler2AfterBattleText",
+ "_PokemonTower6FChanneler2BattleText",
+ "_PokemonTower6FChanneler2EndBattleText",
+ "_PokemonTower6FChanneler3AfterBattleText",
+ "_PokemonTower6FChanneler3BattleText",
+ "_PokemonTower6FChanneler3EndBattleText",
+ "_PokemonTower6FGhostWasCubonesMotherText",
+ "_PokemonTower6FSoulWasCalmedText",
+ "_PokemonTower7FMrFujiRescueText",
+ "_PokemonTowerJessieJamesText1",
+ "_PokemonTowerJessieJamesText2",
+ "_PokemonTowerJessieJamesText3",
+ "_PokemonTowerJessieJamesText4",
+ "_PoliwagDexEntry",
+ "_PoliwhirlDexEntry",
+ "_PoliwrathDexEntry",
+ "_PonytaDexEntry",
+ "_PoofText",
+ "_PorygonDexEntry",
+ "_PotionText",
+ "_PowerPlantVoltorbBattleText",
+ "_PowerPlantZapdosBattleText",
+ "_PrimeapeDexEntry",
+ "_PsyduckDexEntry",
+ "_PushStartText",
+ "_RaichuDexEntry",
+ "_RaisePPWhichTechniqueText",
+ "_RanAwayScaredText",
+ "_RanFromBattleText",
+ "_RapidashDexEntry",
+ "_RareCandyText",
+ "_RaticateDexEntry",
+ "_RattataDexEntry",
+ "_RedBedroomSNESText",
+ "_RedsHouse1FMomLookingGreatText",
+ "_RedsHouse1FMomWakeUpText",
+ "_RedsHouse1FMomYouShouldRestText",
+ "_RedsHouse1FTVStandByMeMovieText",
+ "_RedsHouse1FTVWrongSideText",
+ "_ReflectGainedArmorText",
+ "_RefusingText",
+ "_RegainedHealthText",
+ "_ReleaseWhichMonText",
+ "_RepelWoreOffText",
+ "_RequireCoinCaseText",
+ "_RestorePPWhichTechniqueText",
+ "_ReviveText",
+ "_RhydonDexEntry",
+ "_RhyhornDexEntry",
+ "_Rival1WinText",
+ "_RivalDefeatedText",
+ "_RivalVictoryText",
+ "_RockTunnel1FCooltrainerF1AfterBattleText",
+ "_RockTunnel1FCooltrainerF1BattleText",
+ "_RockTunnel1FCooltrainerF1EndBattleText",
+ "_RockTunnel1FCooltrainerF2AfterBattleText",
+ "_RockTunnel1FCooltrainerF2BattleText",
+ "_RockTunnel1FCooltrainerF2EndBattleText",
+ "_RockTunnel1FCooltrainerF3AfterBattleText",
+ "_RockTunnel1FCooltrainerF3BattleText",
+ "_RockTunnel1FCooltrainerF3EndBattleText",
+ "_RockTunnel1FHiker1AfterBattleText",
+ "_RockTunnel1FHiker1BattleText",
+ "_RockTunnel1FHiker1EndBattleText",
+ "_RockTunnel1FHiker2AfterBattleText",
+ "_RockTunnel1FHiker2BattleText",
+ "_RockTunnel1FHiker2EndBattleText",
+ "_RockTunnel1FHiker3AfterBattleText",
+ "_RockTunnel1FHiker3BattleText",
+ "_RockTunnel1FHiker3EndBattleText",
+ "_RockTunnel1FSignText",
+ "_RockTunnel1FSuperNerdAfterBattleText",
+ "_RockTunnel1FSuperNerdBattleText",
+ "_RockTunnel1FSuperNerdEndBattleText",
+ "_RockTunnelB1FCooltrainerF1AfterBattleText",
+ "_RockTunnelB1FCooltrainerF1BattleText",
+ "_RockTunnelB1FCooltrainerF1EndBattleText",
+ "_RockTunnelB1FCooltrainerF2AfterBattleText",
+ "_RockTunnelB1FCooltrainerF2BattleText",
+ "_RockTunnelB1FCooltrainerF2EndBattleText",
+ "_RockTunnelB1FHiker1AfterBattleText",
+ "_RockTunnelB1FHiker1BattleText",
+ "_RockTunnelB1FHiker1EndBattleText",
+ "_RockTunnelB1FHiker2AfterBattleText",
+ "_RockTunnelB1FHiker2BattleText",
+ "_RockTunnelB1FHiker2EndBattleText",
+ "_RockTunnelB1FHiker3AfterBattleText",
+ "_RockTunnelB1FHiker3BattleText",
+ "_RockTunnelB1FHiker3EndBattleText",
+ "_RockTunnelB1FSuperNerd1AfterBattleText",
+ "_RockTunnelB1FSuperNerd1BattleText",
+ "_RockTunnelB1FSuperNerd1EndBattleText",
+ "_RockTunnelB1FSuperNerd2AfterBattleText",
+ "_RockTunnelB1FSuperNerd2BattleText",
+ "_RockTunnelB1FSuperNerd2EndBattleText",
+ "_RockTunnelB1FSuperNerd3AfterBattleText",
+ "_RockTunnelB1FSuperNerd3BattleText",
+ "_RockTunnelB1FSuperNerd3EndBattleText",
+ "_RockTunnelPokecenterFisherText",
+ "_RockTunnelPokecenterGentlemanText",
+ "_RockTunnelPokecenterGuyText",
+ "_RocketHide3AfterBattleText3",
+ "_RocketHideout3BattleText",
+ "_RocketHideout3EndBattleText3",
+ "_RocketHideoutB1FRocket1AfterBattleText",
+ "_RocketHideoutB1FRocket1BattleText",
+ "_RocketHideoutB1FRocket1EndBattleText",
+ "_RocketHideoutB1FRocket2AfterBattleText",
+ "_RocketHideoutB1FRocket2BattleText",
+ "_RocketHideoutB1FRocket2EndBattleText",
+ "_RocketHideoutB1FRocket3AfterBattleText",
+ "_RocketHideoutB1FRocket3BattleText",
+ "_RocketHideoutB1FRocket3EndBattleText",
+ "_RocketHideoutB1FRocket4AfterBattleText",
+ "_RocketHideoutB1FRocket4BattleText",
+ "_RocketHideoutB1FRocket4EndBattleText",
+ "_RocketHideoutB1FRocket5AfterBattleText",
+ "_RocketHideoutB1FRocket5BattleText",
+ "_RocketHideoutB1FRocket5EndBattleText",
+ "_RocketHideoutB2FRocketAfterBattleText",
+ "_RocketHideoutB2FRocketBattleText",
+ "_RocketHideoutB2FRocketEndBattleText",
+ "_RocketHideoutB3FRocket1AfterBattleText",
+ "_RocketHideoutB3FRocket1BattleText",
+ "_RocketHideoutB3FRocket1EndBattleText",
+ "_RocketHideoutB4FGiovanniHopeWeMeetAgainText",
+ "_RocketHideoutB4FGiovanniImpressedYouGotHereText",
+ "_RocketHideoutB4FGiovanniWhatCannotBeText",
+ "_RocketHideoutB4FRocketAfterBattleText",
+ "_RocketHideoutB4FRocketBattleText",
+ "_RocketHideoutB4FRocketEndBattleText",
+ "_RocketHideoutElevatorAppearsToNeedKeyText",
+ "_RocketHideoutJessieJamesText1",
+ "_RocketHideoutJessieJamesText2",
+ "_RocketHideoutJessieJamesText3",
+ "_RocketHideoutJessieJamesText4",
+ "_RoseText",
+ "_Route10CooltrainerF1AfterBattleText",
+ "_Route10CooltrainerF1BattleText",
+ "_Route10CooltrainerF1EndBattleText",
+ "_Route10CooltrainerF2AfterBattleText",
+ "_Route10CooltrainerF2BattleText",
+ "_Route10CooltrainerF2EndBattleText",
+ "_Route10Hiker1AfterBattleText",
+ "_Route10Hiker1BattleText",
+ "_Route10Hiker1EndBattleText",
+ "_Route10Hiker2AfterBattleText",
+ "_Route10Hiker2BattleText",
+ "_Route10Hiker2EndBattleText",
+ "_Route10PowerPlantSignText",
+ "_Route10RockTunnelSignText",
+ "_Route10SuperNerd1AfterBattleText",
+ "_Route10SuperNerd1BattleText",
+ "_Route10SuperNerd1EndBattleText",
+ "_Route10SuperNerd2AfterBattleText",
+ "_Route10SuperNerd2BattleText",
+ "_Route10SuperNerd2EndBattleText",
+ "_Route11DiglettsCaveSignText",
+ "_Route11Gambler1AfterBattleText",
+ "_Route11Gambler1BattleText",
+ "_Route11Gambler1EndBattleText",
+ "_Route11Gambler2AfterBattleText",
+ "_Route11Gambler2BattleText",
+ "_Route11Gambler2EndBattleText",
+ "_Route11Gambler3AfterBattleText",
+ "_Route11Gambler3BattleText",
+ "_Route11Gambler3EndBattleText",
+ "_Route11Gambler4AfterBattleText",
+ "_Route11Gambler4BattleText",
+ "_Route11Gambler4EndBattleText",
+ "_Route11Gate1FGuardText",
+ "_Route11Gate2FLeftBinocularsNoSnorlaxText",
+ "_Route11Gate2FLeftBinocularsSnorlaxText",
+ "_Route11Gate2FOaksAideItemfinderDescriptionText",
+ "_Route11Gate2FRightBinocularsText",
+ "_Route11SuperNerd1AfterBattleText",
+ "_Route11SuperNerd1BattleText",
+ "_Route11SuperNerd1EndBattleText",
+ "_Route11SuperNerd2AfterBattleText",
+ "_Route11SuperNerd2BattleText",
+ "_Route11SuperNerd2EndBattleText",
+ "_Route11Youngster1AfterBattleText",
+ "_Route11Youngster1BattleText",
+ "_Route11Youngster1EndBattleText",
+ "_Route11Youngster2AfterBattleText5",
+ "_Route11Youngster2BattleText",
+ "_Route11Youngster2EndBattleText",
+ "_Route11Youngster3AfterBattleText",
+ "_Route11Youngster3BattleText",
+ "_Route11Youngster3EndBattleText",
+ "_Route11Youngster4AfterBattleText",
+ "_Route11Youngster4BattleText",
+ "_Route11Youngster4EndBattleText",
+ "_Route12CooltrainerMAfterBattleText",
+ "_Route12CooltrainerMBattleText",
+ "_Route12CooltrainerMEndBattleText",
+ "_Route12Fisher1AfterBattleText",
+ "_Route12Fisher1BattleText",
+ "_Route12Fisher1EndBattleText",
+ "_Route12Fisher2AfterBattleText",
+ "_Route12Fisher2BattleText",
+ "_Route12Fisher2EndBattleText",
+ "_Route12Fisher3AfterBattleText",
+ "_Route12Fisher3BattleText",
+ "_Route12Fisher3EndBattleText",
+ "_Route12Fisher4AfterBattleText",
+ "_Route12Fisher4BattleText",
+ "_Route12Fisher4EndBattleText",
+ "_Route12Fisher5AfterBattleText",
+ "_Route12Fisher5BattleText",
+ "_Route12Fisher5EndBattleText",
+ "_Route12Gate1FGuardText",
+ "_Route12Gate2FBrunetteGirlReceivedTM39Text",
+ "_Route12Gate2FBrunetteGirlTM39ExplanationText",
+ "_Route12Gate2FBrunetteGirlTM39NoRoomText",
+ "_Route12Gate2FBrunetteGirlYouCanHaveThisText",
+ "_Route12Gate2FLeftBinocularsText",
+ "_Route12Gate2FRightBinocularsText",
+ "_Route12SignText",
+ "_Route12SnorlaxCalmedDownText",
+ "_Route12SnorlaxText",
+ "_Route12SnorlaxWokeUpText",
+ "_Route12SportFishingSignText",
+ "_Route12SuperNerdAfterBattleText",
+ "_Route12SuperNerdBattleText",
+ "_Route12SuperNerdEndBattleText",
+ "_Route12SuperRodHouseFishingGuruDoYouLikeToFishText",
+ "_Route12SuperRodHouseFishingGuruFishingWayOfLifeText",
+ "_Route12SuperRodHouseFishingGuruNoRoomText",
+ "_Route12SuperRodHouseFishingGuruReceivedSuperRodText",
+ "_Route12SuperRodHouseFishingGuruThatsDisappointingText",
+ "_Route12SuperRodHouseFishingGuruTryFishingText",
+ "_Route13Beauty1AfterBattleText",
+ "_Route13Beauty1BattleText",
+ "_Route13Beauty1EndBattleText",
+ "_Route13Beauty2AfterBattleText",
+ "_Route13Beauty2BattleText",
+ "_Route13Beauty2EndBattleText",
+ "_Route13BikerAfterBattleText",
+ "_Route13BikerBattleText",
+ "_Route13BikerEndBattleText",
+ "_Route13CooltrainerF1AfterBattleText",
+ "_Route13CooltrainerF1BattleText",
+ "_Route13CooltrainerF1EndBattleText",
+ "_Route13CooltrainerF2AfterBattleText",
+ "_Route13CooltrainerF2BattleText",
+ "_Route13CooltrainerF2EndBattleText",
+ "_Route13CooltrainerF3AfterBattleText",
+ "_Route13CooltrainerF3BattleText",
+ "_Route13CooltrainerF3EndBattleText",
+ "_Route13CooltrainerF4AfterBattleText",
+ "_Route13CooltrainerF4BattleText",
+ "_Route13CooltrainerF4EndBattleText",
+ "_Route13CooltrainerM1AfterBattleText",
+ "_Route13CooltrainerM1BattleText",
+ "_Route13CooltrainerM1EndBattleText",
+ "_Route13CooltrainerM2AfterBattleText",
+ "_Route13CooltrainerM2BattleText",
+ "_Route13CooltrainerM2EndBattleText",
+ "_Route13CooltrainerM3AfterBattleText",
+ "_Route13CooltrainerM3BattleText",
+ "_Route13CooltrainerM3EndBattleText",
+ "_Route13SignText",
+ "_Route13TrainerTips1Text",
+ "_Route13TrainerTips2Text",
+ "_Route14Biker1AfterBattleText",
+ "_Route14Biker1BattleText",
+ "_Route14Biker1EndBattleText",
+ "_Route14Biker2AfterBattleText",
+ "_Route14Biker2BattleText",
+ "_Route14Biker2EndBattleText",
+ "_Route14Biker3AfterBattleText",
+ "_Route14Biker3BattleText",
+ "_Route14Biker3EndBattleText",
+ "_Route14Biker4AfterBattleText",
+ "_Route14Biker4BattleText",
+ "_Route14Biker4EndBattleText",
+ "_Route14CooltrainerM1AfterBattleText",
+ "_Route14CooltrainerM1BattleText",
+ "_Route14CooltrainerM1EndBattleText",
+ "_Route14CooltrainerM2AfterBattleText",
+ "_Route14CooltrainerM2BattleText",
+ "_Route14CooltrainerM2EndBattleText",
+ "_Route14CooltrainerM3AfterBattleText",
+ "_Route14CooltrainerM3BattleText",
+ "_Route14CooltrainerM3EndBattleText",
+ "_Route14CooltrainerM4AfterBattleText",
+ "_Route14CooltrainerM4BattleText",
+ "_Route14CooltrainerM4EndBattleText",
+ "_Route14CooltrainerM5AfterBattleText",
+ "_Route14CooltrainerM5BattleText",
+ "_Route14CooltrainerM5EndBattleText",
+ "_Route14CooltrainerM6AfterBattleText",
+ "_Route14CooltrainerM6BattleText",
+ "_Route14CooltrainerM6EndBattleText",
+ "_Route14SignText",
+ "_Route15Beauty1AfterBattleText",
+ "_Route15Beauty1BattleText",
+ "_Route15Beauty1EndBattleText",
+ "_Route15Beauty2AfterBattleText",
+ "_Route15Beauty2BattleText",
+ "_Route15Beauty2EndBattleText",
+ "_Route15Biker1AfterBattleText",
+ "_Route15Biker1BattleText",
+ "_Route15Biker1EndBattleText",
+ "_Route15Biker2AfterBattleText",
+ "_Route15Biker2BattleText",
+ "_Route15Biker2EndBattleText",
+ "_Route15CooltrainerF1AfterBattleText",
+ "_Route15CooltrainerF1BattleText",
+ "_Route15CooltrainerF1EndBattleText",
+ "_Route15CooltrainerF2AfterBattleText",
+ "_Route15CooltrainerF2BattleText",
+ "_Route15CooltrainerF2EndBattleText",
+ "_Route15CooltrainerF3AfterBattleText",
+ "_Route15CooltrainerF3BattleText",
+ "_Route15CooltrainerF3EndBattleText",
+ "_Route15CooltrainerF4AfterBattleText",
+ "_Route15CooltrainerF4BattleText",
+ "_Route15CooltrainerF4EndBattleText",
+ "_Route15CooltrainerM1AfterBattleText",
+ "_Route15CooltrainerM1BattleText",
+ "_Route15CooltrainerM1EndBattleText",
+ "_Route15CooltrainerM2AfterBattleText",
+ "_Route15CooltrainerM2BattleText",
+ "_Route15CooltrainerM2EndBattleText",
+ "_Route15Gate1FGuardText",
+ "_Route15Gate2FBinocularsText",
+ "_Route15Gate2FOaksAideExpAllText",
+ "_Route15SignText",
+ "_Route15UpstairsBinocularsText",
+ "_Route16Biker1AfterBattleText",
+ "_Route16Biker1BattleText",
+ "_Route16Biker1EndBattleText",
+ "_Route16Biker2AfterBattleText",
+ "_Route16Biker2BattleText",
+ "_Route16Biker2EndBattleText",
+ "_Route16Biker3AfterBattleText",
+ "_Route16Biker3BattleText",
+ "_Route16Biker3EndBattleText",
+ "_Route16Biker4AfterBattleText",
+ "_Route16Biker4EndBattleText",
+ "_Route16Biker5AfterBattleText",
+ "_Route16Biker5BattleText",
+ "_Route16Biker5EndBattleText",
+ "_Route16Biker6AfterBattleText",
+ "_Route16Biker6BattleText",
+ "_Route16Biker6EndBattleText",
+ "_Route16CyclingRoadSignText",
+ "_Route16FlyHouseBrunetteGirlHM02ExplanationText",
+ "_Route16FlyHouseBrunetteGirlHM02NoRoomText",
+ "_Route16FlyHouseBrunetteGirlReceivedHM02Text",
+ "_Route16FlyHouseBrunetteGirlText",
+ "_Route16FlyHouseFearowText",
+ "_Route16Gate1FGamblerText",
+ "_Route16Gate1FGuardCyclingRoadExplanationText",
+ "_Route16Gate1FGuardNoPedestriansAllowedText",
+ "_Route16Gate1FGuardWaitUpText",
+ "_Route16Gate2FLeftBinocularsText",
+ "_Route16Gate2FLittleBoyText",
+ "_Route16Gate2FLittleGirlText",
+ "_Route16Gate2FRightBinocularsText",
+ "_Route16SignText",
+ "_Route16SnorlaxReturnedToMountainsText",
+ "_Route16SnorlaxWokeUpText",
+ "_Route16Text7",
+ "_Route16biker4BattleText",
+ "_Route17Biker10AfterBattleText",
+ "_Route17Biker10BattleText",
+ "_Route17Biker10EndBattleText",
+ "_Route17Biker1AfterBattleText",
+ "_Route17Biker1BattleText",
+ "_Route17Biker1EndBattleText",
+ "_Route17Biker2AfterBattleText",
+ "_Route17Biker2BattleText",
+ "_Route17Biker2EndBattleText",
+ "_Route17Biker3AfterBattleText",
+ "_Route17Biker3BattleText",
+ "_Route17Biker3EndBattleText",
+ "_Route17Biker4AfterBattleText",
+ "_Route17Biker4BattleText",
+ "_Route17Biker4EndBattleText",
+ "_Route17Biker5AfterBattleText",
+ "_Route17Biker5BattleText",
+ "_Route17Biker5EndBattleText",
+ "_Route17Biker6AfterBattleText",
+ "_Route17Biker6BattleText",
+ "_Route17Biker6EndBattleText",
+ "_Route17Biker7AfterBattleText",
+ "_Route17Biker7BattleText",
+ "_Route17Biker7EndBattleText",
+ "_Route17Biker8AfterBattleText",
+ "_Route17Biker8BattleText",
+ "_Route17Biker8EndBattleText",
+ "_Route17Biker9AfterBattleText",
+ "_Route17Biker9BattleText",
+ "_Route17Biker9EndBattleText",
+ "_Route17CyclingRoadEndsSignText",
+ "_Route17NoticeSign1Text",
+ "_Route17NoticeSign2Text",
+ "_Route17SignText",
+ "_Route17TrainerTips1Text",
+ "_Route17TrainerTips2Text",
+ "_Route18CooltrainerM1AfterBattleText",
+ "_Route18CooltrainerM1BattleText",
+ "_Route18CooltrainerM1EndBattleText",
+ "_Route18CooltrainerM2AfterBattleText",
+ "_Route18CooltrainerM2BattleText",
+ "_Route18CooltrainerM2EndBattleText",
+ "_Route18CooltrainerM3AfterBattleText",
+ "_Route18CooltrainerM3BattleText",
+ "_Route18CooltrainerM3EndBattleText",
+ "_Route18CyclingRoadSignText",
+ "_Route18Gate1FGuardCyclingRoadUphillText",
+ "_Route18Gate1FGuardExcuseMeText",
+ "_Route18Gate1FGuardYouNeedABicycleText",
+ "_Route18Gate2FLeftBinocularsText",
+ "_Route18Gate2FRightBinocularsText",
+ "_Route18SignText",
+ "_Route19CooltrainerM1AfterBattleText",
+ "_Route19CooltrainerM1BattleText",
+ "_Route19CooltrainerM1EndBattleText",
+ "_Route19CooltrainerM2AfterBattleText",
+ "_Route19CooltrainerM2BattleText",
+ "_Route19CooltrainerM2EndBattleText",
+ "_Route19SignText",
+ "_Route19Swimmer1AfterBattleText",
+ "_Route19Swimmer1BattleText",
+ "_Route19Swimmer1EndBattleText",
+ "_Route19Swimmer2AfterBattleText",
+ "_Route19Swimmer2BattleText",
+ "_Route19Swimmer2EndBattleText",
+ "_Route19Swimmer3AfterBattleText",
+ "_Route19Swimmer3BattleText",
+ "_Route19Swimmer3EndBattleText",
+ "_Route19Swimmer4AfterBattleText",
+ "_Route19Swimmer4BattleText",
+ "_Route19Swimmer4EndBattleText",
+ "_Route19Swimmer5AfterBattleText",
+ "_Route19Swimmer5BattleText",
+ "_Route19Swimmer5EndBattleText",
+ "_Route19Swimmer6AfterBattleText",
+ "_Route19Swimmer6BattleText",
+ "_Route19Swimmer6EndBattleText",
+ "_Route19Swimmer7AfterBattleText",
+ "_Route19Swimmer7BattleText",
+ "_Route19Swimmer7EndBattleText",
+ "_Route19Swimmer8AfterBattleText",
+ "_Route19Swimmer8BattleText",
+ "_Route19Swimmer8EndBattleText",
+ "_Route1SignText",
+ "_Route1Youngster1AlsoGotPokeballsText",
+ "_Route1Youngster1GotPotionText",
+ "_Route1Youngster1MartSampleText",
+ "_Route1Youngster1NoRoomText",
+ "_Route1Youngster2Text",
+ "_Route20CooltrainerMAfterBattleText",
+ "_Route20CooltrainerMBattleText",
+ "_Route20CooltrainerMEndBattleText",
+ "_Route20SeafoamIslandsSignText",
+ "_Route20Swimmer1AfterBattleText",
+ "_Route20Swimmer1BattleText",
+ "_Route20Swimmer1EndBattleText",
+ "_Route20Swimmer2AfterBattleText",
+ "_Route20Swimmer2BattleText",
+ "_Route20Swimmer2EndBattleText",
+ "_Route20Swimmer3AfterBattleText",
+ "_Route20Swimmer3BattleText",
+ "_Route20Swimmer3EndBattleText",
+ "_Route20Swimmer4AfterBattleText",
+ "_Route20Swimmer4BattleText",
+ "_Route20Swimmer4EndBattleText",
+ "_Route20Swimmer5AfterBattleText",
+ "_Route20Swimmer5BattleText",
+ "_Route20Swimmer5EndBattleText",
+ "_Route20Swimmer6AfterBattleText",
+ "_Route20Swimmer6BattleText",
+ "_Route20Swimmer6EndBattleText",
+ "_Route20Swimmer7AfterBattleText",
+ "_Route20Swimmer7BattleText",
+ "_Route20Swimmer7EndBattleText",
+ "_Route20Swimmer8AfterBattleText",
+ "_Route20Swimmer8BattleText",
+ "_Route20Swimmer8EndBattleText",
+ "_Route20Swimmer9AfterBattleText",
+ "_Route20Swimmer9BattleText",
+ "_Route20Swimmer9EndBattleText",
+ "_Route21Fisher1AfterBattleText",
+ "_Route21Fisher1BattleText",
+ "_Route21Fisher1EndBattleText",
+ "_Route21Fisher2AfterBattleText",
+ "_Route21Fisher2BattleText",
+ "_Route21Fisher2EndBattleText",
+ "_Route21Fisher3AfterBattleText",
+ "_Route21Fisher3BattleText",
+ "_Route21Fisher3EndBattleText",
+ "_Route21Fisher4AfterBattleText",
+ "_Route21Fisher4BattleText",
+ "_Route21Fisher4EndBattleText",
+ "_Route21Swimmer1AfterBattleText",
+ "_Route21Swimmer1BattleText",
+ "_Route21Swimmer1EndBattleText",
+ "_Route21Swimmer2AfterBattleText",
+ "_Route21Swimmer2BattleText",
+ "_Route21Swimmer2EndBattleText",
+ "_Route21Swimmer3AfterBattleText",
+ "_Route21Swimmer3BattleText",
+ "_Route21Swimmer3EndBattleText",
+ "_Route21Swimmer4AfterBattleText",
+ "_Route21Swimmer4BattleText",
+ "_Route21Swimmer4EndBattleText",
+ "_Route21Swimmer5AfterBattleText",
+ "_Route21Swimmer5BattleText",
+ "_Route21Swimmer5EndBattleText",
+ "_Route22GateGuardGoRightAheadText",
+ "_Route22GateGuardICantLetYouPassText",
+ "_Route22GateGuardNoBoulderbadgeText",
+ "_Route22PokemonLeagueSignText",
+ "_Route22Rival1DefeatedText",
+ "_Route22Rival1VictoryText",
+ "_Route22Rival2DefeatedText",
+ "_Route22Rival2VictoryText",
+ "_Route22RivalAfterBattleText1",
+ "_Route22RivalAfterBattleText2",
+ "_Route22RivalBeforeBattleText1",
+ "_Route22RivalBeforeBattleText2",
+ "_Route23GoRightAheadText",
+ "_Route23OhThatIsTheBadgeText",
+ "_Route23VictoryRoadGateSignText",
+ "_Route23YouDontHaveTheBadgeYetText",
+ "_Route24CooltrainerF1AfterBattleText",
+ "_Route24CooltrainerF1BattleText",
+ "_Route24CooltrainerF1EndBattleText",
+ "_Route24CooltrainerF2AfterBattleText",
+ "_Route24CooltrainerF2BattleText",
+ "_Route24CooltrainerF2EndBattleText",
+ "_Route24CooltrainerM1DefeatedText",
+ "_Route24CooltrainerM1JoinTeamRocketText",
+ "_Route24CooltrainerM1NoRoomText",
+ "_Route24CooltrainerM1ReceivedNuggetText",
+ "_Route24CooltrainerM1YouBeatOurContestText",
+ "_Route24CooltrainerM1YouCouldBecomeATopLeaderText",
+ "_Route24CooltrainerM1YouJustEarnedAPrizeText",
+ "_Route24CooltrainerM2AfterBattleText",
+ "_Route24CooltrainerM2BattleText",
+ "_Route24CooltrainerM2EndBattleText",
+ "_Route24CooltrainerM3AfterBattleText",
+ "_Route24CooltrainerM3BattleText",
+ "_Route24CooltrainerM3EndBattleText",
+ "_Route24DamianText1",
+ "_Route24DamianText2",
+ "_Route24DamianText3",
+ "_Route24DamianText4",
+ "_Route24Youngster1AfterBattleText",
+ "_Route24Youngster1BattleText",
+ "_Route24Youngster1EndBattleText",
+ "_Route24Youngster2AfterBattleText",
+ "_Route24Youngster2BattleText",
+ "_Route24Youngster2EndBattleText",
+ "_Route25BillSignText",
+ "_Route25CooltrainerF1AfterBattleText",
+ "_Route25CooltrainerF1BattleText",
+ "_Route25CooltrainerF1EndBattleText",
+ "_Route25CooltrainerF2AfterBattleText",
+ "_Route25CooltrainerF2BattleText",
+ "_Route25CooltrainerF2EndBattleText",
+ "_Route25CooltrainerMAfterBattleText",
+ "_Route25CooltrainerMBattleText",
+ "_Route25CooltrainerMEndBattleText",
+ "_Route25Hiker1AfterBattleText",
+ "_Route25Hiker1BattleText",
+ "_Route25Hiker1EndBattleText",
+ "_Route25Hiker2AfterBattleText",
+ "_Route25Hiker2BattleText",
+ "_Route25Hiker2EndBattleText",
+ "_Route25Hiker3AfterBattleText",
+ "_Route25Hiker3BattleText",
+ "_Route25Hiker3EndBattleText",
+ "_Route25Youngster1AfterBattleText",
+ "_Route25Youngster1BattleText",
+ "_Route25Youngster1EndBattleText",
+ "_Route25Youngster2AfterBattleText",
+ "_Route25Youngster2BattleText",
+ "_Route25Youngster2EndBattleText",
+ "_Route25Youngster3AfterBattleText",
+ "_Route25Youngster3BattleText",
+ "_Route25Youngster3EndBattleText",
+ "_Route2DiglettsCaveSignText",
+ "_Route2GateOaksAideFlashExplanationText",
+ "_Route2GateYoungsterText",
+ "_Route2SignText",
+ "_Route2TradeHouseScientistText",
+ "_Route3CooltrainerF1AfterBattleText",
+ "_Route3CooltrainerF1BattleText",
+ "_Route3CooltrainerF1EndBattleText",
+ "_Route3CooltrainerF2AfterBattleText",
+ "_Route3CooltrainerF2BattleText",
+ "_Route3CooltrainerF2EndBattleText",
+ "_Route3CooltrainerF3AfterBattleText",
+ "_Route3CooltrainerF3BattleText",
+ "_Route3CooltrainerF3EndBattleText",
+ "_Route3SignText",
+ "_Route3Text1",
+ "_Route3Youngster1AfterBattleText",
+ "_Route3Youngster1BattleText",
+ "_Route3Youngster1EndBattleText",
+ "_Route3Youngster2AfterBattleText",
+ "_Route3Youngster2BattleText",
+ "_Route3Youngster2EndBattleText",
+ "_Route3Youngster3AfterBattleText",
+ "_Route3Youngster3BattleText",
+ "_Route3Youngster3EndBattleText",
+ "_Route3Youngster4AfterBattleText",
+ "_Route3Youngster4BattleText",
+ "_Route3Youngster4EndBattleText",
+ "_Route3Youngster5AfterBattleText",
+ "_Route3Youngster5BattleText",
+ "_Route3Youngster5EndBattleText",
+ "_Route4CooltrainerF1Text",
+ "_Route4CooltrainerF2AfterBattleText",
+ "_Route4CooltrainerF2BattleText",
+ "_Route4CooltrainerF2EndBattleText",
+ "_Route4MtMoonSignText",
+ "_Route4SignText",
+ "_Route5UndergroundPathSignText",
+ "_Route6CooltrainerF1AfterBattleText",
+ "_Route6CooltrainerF1BattleText",
+ "_Route6CooltrainerF1EndBattleText",
+ "_Route6CooltrainerF2AfterBattleText",
+ "_Route6CooltrainerF2BattleText",
+ "_Route6CooltrainerF2EndBattleText",
+ "_Route6CooltrainerM1AfterBattleText",
+ "_Route6CooltrainerM1BattleText",
+ "_Route6CooltrainerM1EndBattleText",
+ "_Route6CooltrainerM2AfterBattleText",
+ "_Route6CooltrainerM2BattleText",
+ "_Route6CooltrainerM2EndBattleText",
+ "_Route6UndergroundPathSignText",
+ "_Route6Youngster1AfterBattleText",
+ "_Route6Youngster1BattleText",
+ "_Route6Youngster1EndBattleText",
+ "_Route6Youngster2AfterBattleText",
+ "_Route6Youngster2BattleText",
+ "_Route6Youngster2EndBattleText",
+ "_Route7UndergroundPathSignText",
+ "_Route8CooltrainerF1AfterBattleText",
+ "_Route8CooltrainerF1BattleText",
+ "_Route8CooltrainerF1EndBattleText",
+ "_Route8CooltrainerF2AfterBattleText",
+ "_Route8CooltrainerF2BattleText",
+ "_Route8CooltrainerF2EndBattleText",
+ "_Route8CooltrainerF3AfterBattleText",
+ "_Route8CooltrainerF3BattleText",
+ "_Route8CooltrainerF3EndBattleText",
+ "_Route8CooltrainerF4AfterBattleText",
+ "_Route8CooltrainerF4BattleText",
+ "_Route8CooltrainerF4EndBattleText",
+ "_Route8Gambler1AfterBattleText",
+ "_Route8Gambler1BattleText",
+ "_Route8Gambler1EndBattleText",
+ "_Route8Gambler2AfterBattleText",
+ "_Route8Gambler2BattleText",
+ "_Route8Gambler2EndBattleText",
+ "_Route8SuperNerd1AfterBattleText",
+ "_Route8SuperNerd1BattleText",
+ "_Route8SuperNerd1EndBattleText",
+ "_Route8SuperNerd2AfterBattleText",
+ "_Route8SuperNerd2BattleText",
+ "_Route8SuperNerd2EndBattleText",
+ "_Route8SuperNerd3AfterBattleText",
+ "_Route8SuperNerd3BattleText",
+ "_Route8SuperNerd3EndBattleText",
+ "_Route8UndergroundSignText",
+ "_Route9AJAfterBattleText",
+ "_Route9AJBattleText",
+ "_Route9AJEndBattleText",
+ "_Route9CooltrainerF1AfterBattleText",
+ "_Route9CooltrainerF1BattleText",
+ "_Route9CooltrainerF1EndBattleText",
+ "_Route9CooltrainerF2AfterBattleText",
+ "_Route9CooltrainerF2BattleText",
+ "_Route9CooltrainerF2EndBattleText",
+ "_Route9CooltrainerM2AfterBattleText",
+ "_Route9CooltrainerM2BattleText",
+ "_Route9CooltrainerM2EndBattleText",
+ "_Route9Hiker1AfterBattleText",
+ "_Route9Hiker1BattleText",
+ "_Route9Hiker1EndBattleText",
+ "_Route9Hiker2AfterBattleText",
+ "_Route9Hiker2BattleText",
+ "_Route9Hiker2EndBattleText",
+ "_Route9Hiker3AfterBattleText",
+ "_Route9Hiker3BattleText",
+ "_Route9Hiker3EndBattleText",
+ "_Route9SignText",
+ "_Route9Youngster1AfterBattleText",
+ "_Route9Youngster1BattleText",
+ "_Route9Youngster1EndBattleText",
+ "_Route9Youngster2AfterBattleText",
+ "_Route9Youngster2BattleText",
+ "_Route9Youngster2EndBattleText",
+ "_RunAwayText",
+ "_SSAnne1FRoomsCooltrainerFAfterBattleText",
+ "_SSAnne1FRoomsCooltrainerFBattleText",
+ "_SSAnne1FRoomsCooltrainerFEndBattleText",
+ "_SSAnne1FRoomsGentleman1AfterBattleText",
+ "_SSAnne1FRoomsGentleman1BattleText",
+ "_SSAnne1FRoomsGentleman1EndBattleText",
+ "_SSAnne1FRoomsGentleman2AfterBattleText",
+ "_SSAnne1FRoomsGentleman2BattleText",
+ "_SSAnne1FRoomsGentleman2EndBattleText",
+ "_SSAnne1FRoomsGentleman3Text",
+ "_SSAnne1FRoomsGirl1Text",
+ "_SSAnne1FRoomsGirl2Text",
+ "_SSAnne1FRoomsLittleGirlText",
+ "_SSAnne1FRoomsMiddleAgedManText",
+ "_SSAnne1FRoomsWigglytuffText",
+ "_SSAnne1FRoomsYoungsterAfterBattleText",
+ "_SSAnne1FRoomsYoungsterBattleText",
+ "_SSAnne1FRoomsYoungsterEndBattleText",
+ "_SSAnne1FSailorText",
+ "_SSAnne1FWaiterText",
+ "_SSAnne2FRivalCutMasterText",
+ "_SSAnne2FRivalDefeatedText",
+ "_SSAnne2FRivalText",
+ "_SSAnne2FRivalVictoryText",
+ "_SSAnne2FRoomsBeautyText",
+ "_SSAnne2FRoomsBrunetteGirlText",
+ "_SSAnne2FRoomsCooltrainerFAfterBattleText",
+ "_SSAnne2FRoomsCooltrainerFBattleText",
+ "_SSAnne2FRoomsCooltrainerFEndBattleText",
+ "_SSAnne2FRoomsFisherAfterBattleText",
+ "_SSAnne2FRoomsFisherBattleText",
+ "_SSAnne2FRoomsFisherEndBattleText",
+ "_SSAnne2FRoomsGentleman1AfterBattleText",
+ "_SSAnne2FRoomsGentleman1BattleText",
+ "_SSAnne2FRoomsGentleman1EndBattleText",
+ "_SSAnne2FRoomsGentleman2AfterBattleText",
+ "_SSAnne2FRoomsGentleman2BattleText",
+ "_SSAnne2FRoomsGentleman2EndBattleText",
+ "_SSAnne2FRoomsGentleman3Text",
+ "_SSAnne2FRoomsGentleman4Text",
+ "_SSAnne2FRoomsGentleman5Text",
+ "_SSAnne2FRoomsGrampsText",
+ "_SSAnne2FRoomsLittleBoyText",
+ "_SSAnne2FWaiterText",
+ "_SSAnne3FSailorText",
+ "_SSAnneB1FRoomsFisherAfterBattleText",
+ "_SSAnneB1FRoomsFisherBattleText",
+ "_SSAnneB1FRoomsFisherEndBattleText",
+ "_SSAnneB1FRoomsMachokeText",
+ "_SSAnneB1FRoomsSailor1AfterBattleText",
+ "_SSAnneB1FRoomsSailor1BattleText",
+ "_SSAnneB1FRoomsSailor1EndBattleText",
+ "_SSAnneB1FRoomsSailor2AfterBattleText",
+ "_SSAnneB1FRoomsSailor2BattleText",
+ "_SSAnneB1FRoomsSailor2EndBattleText",
+ "_SSAnneB1FRoomsSailor3AfterBattleText",
+ "_SSAnneB1FRoomsSailor3BattleText",
+ "_SSAnneB1FRoomsSailor3EndBattleText",
+ "_SSAnneB1FRoomsSailor4AfterBattleText",
+ "_SSAnneB1FRoomsSailor4BattleText",
+ "_SSAnneB1FRoomsSailor4EndBattleText",
+ "_SSAnneB1FRoomsSailor5AfterBattleText",
+ "_SSAnneB1FRoomsSailor5BattleText",
+ "_SSAnneB1FRoomsSailor5EndBattleText",
+ "_SSAnneB1FRoomsSuperNerdText",
+ "_SSAnneBowCooltrainerMText",
+ "_SSAnneBowSailor1Text",
+ "_SSAnneBowSailor2AfterBattleText",
+ "_SSAnneBowSailor2BattleText",
+ "_SSAnneBowSailor2EndBattleText",
+ "_SSAnneBowSailor3AfterBattleText",
+ "_SSAnneBowSailor3BattleText",
+ "_SSAnneBowSailor3EndBattleText",
+ "_SSAnneBowSuperNerdText",
+ "_SSAnneCaptainsRoomCaptainHM01NoRoomText",
+ "_SSAnneCaptainsRoomCaptainIFeelMuchBetterText",
+ "_SSAnneCaptainsRoomCaptainNotSickAnymoreText",
+ "_SSAnneCaptainsRoomCaptainReceivedHM01Text",
+ "_SSAnneCaptainsRoomRubCaptainsBackText",
+ "_SSAnneCaptainsRoomSeasickBookText",
+ "_SSAnneCaptainsRoomTrashText",
+ "_SSAnneKitchenCook1Text",
+ "_SSAnneKitchenCook2Text",
+ "_SSAnneKitchenCook3Text",
+ "_SSAnneKitchenCook4Text",
+ "_SSAnneKitchenCook5Text",
+ "_SSAnneKitchenCook6Text",
+ "_SSAnneKitchenCook7MainCourseIsText",
+ "_SSTicketNoRoomText",
+ "_SSTicketReceivedText",
+ "_SafariZoneAngryText",
+ "_SafariZoneCenterRestHouseGirlText",
+ "_SafariZoneCenterRestHouseScientistText",
+ "_SafariZoneCenterRestHouseSignText",
+ "_SafariZoneCenterTrainerTipsSignText",
+ "_SafariZoneEastRestHouseRockerText",
+ "_SafariZoneEastRestHouseScientistText",
+ "_SafariZoneEastRestHouseSignText",
+ "_SafariZoneEastRestHouseSilphWorkerMText",
+ "_SafariZoneEastSignText",
+ "_SafariZoneEastTrainerTipsText",
+ "_SafariZoneEatingText",
+ "_SafariZoneGateSafariZoneWorker1CallYouOnThePAText",
+ "_SafariZoneGateSafariZoneWorker1GoodHaulComeAgainText",
+ "_SafariZoneGateSafariZoneWorker1GoodLuckText",
+ "_SafariZoneGateSafariZoneWorker1LeavingEarlyText",
+ "_SafariZoneGateSafariZoneWorker1NotEnoughMoneyText",
+ "_SafariZoneGateSafariZoneWorker1PleaseComeAgainText",
+ "_SafariZoneGateSafariZoneWorker1ReturnSafariBallsText",
+ "_SafariZoneGateSafariZoneWorker1Text",
+ "_SafariZoneGateSafariZoneWorker1ThatllBe500PleaseText",
+ "_SafariZoneGateSafariZoneWorker1WouldYouLikeToJoinText",
+ "_SafariZoneGateSafariZoneWorker2FirstTimeHereText",
+ "_SafariZoneGateSafariZoneWorker2SafariZoneExplanationText",
+ "_SafariZoneGateSafariZoneWorker2YoureARegularHereText",
+ "_SafariZoneLowCostText1",
+ "_SafariZoneLowCostText2",
+ "_SafariZoneLowCostText3",
+ "_SafariZoneLowCostText4",
+ "_SafariZoneLowCostText5",
+ "_SafariZoneLowCostText6",
+ "_SafariZoneLowCostText7",
+ "_SafariZoneLowCostText8",
+ "_SafariZoneNorthRestHouseGentlemanText",
+ "_SafariZoneNorthRestHouseSafariZoneWorkerText",
+ "_SafariZoneNorthRestHouseScientistText",
+ "_SafariZoneNorthRestHouseSignText",
+ "_SafariZoneNorthSignText",
+ "_SafariZoneNorthTrainerTips1Text",
+ "_SafariZoneNorthTrainerTips2Text",
+ "_SafariZoneNorthTrainerTips3Text",
+ "_SafariZoneSecretHouseFishingGuruHM03ExplanationText",
+ "_SafariZoneSecretHouseFishingGuruHM03NoRoomText",
+ "_SafariZoneSecretHouseFishingGuruReceivedHM03Text",
+ "_SafariZoneSecretHouseFishingGuruYouHaveWonText",
+ "_SafariZoneWestFindWardensTeethSignText",
+ "_SafariZoneWestRestHouseCooltrainerMText",
+ "_SafariZoneWestRestHouseScientistText",
+ "_SafariZoneWestRestHouseSignText",
+ "_SafariZoneWestRestHouseSilphWorkerFText",
+ "_SafariZoneWestSignText",
+ "_SafariZoneWestTrainerTipsText",
+ "_SaffronCityFightingDojoSignText",
+ "_SaffronCityGentlemanText",
+ "_SaffronCityGymSignText",
+ "_SaffronCityMrPsychicsHouseSignText",
+ "_SaffronCityPidgeotText",
+ "_SaffronCityPokecenterGuyText1",
+ "_SaffronCityPokecenterGuyText2",
+ "_SaffronCityRockerText",
+ "_SaffronCityRocket1Text",
+ "_SaffronCityRocket2Text",
+ "_SaffronCityRocket3Text",
+ "_SaffronCityRocket4Text",
+ "_SaffronCityRocket5Text",
+ "_SaffronCityRocket6Text",
+ "_SaffronCityRocket7Text",
+ "_SaffronCityRocket8Text",
+ "_SaffronCityRocket9Text",
+ "_SaffronCityScientistText",
+ "_SaffronCitySignText",
+ "_SaffronCitySilphCoLatestProductSignText",
+ "_SaffronCitySilphCoSignText",
+ "_SaffronCitySilphWorkerFText",
+ "_SaffronCitySilphWorkerMText",
+ "_SaffronCityTrainerTips1Text",
+ "_SaffronCityTrainerTips2Text",
+ "_SaffronGateGuardGeeImThirstyText",
+ "_SaffronGateGuardImParchedText",
+ "_SaffronGateGuardThanksForTheDrinkText",
+ "_SaffronGateGuardYouCanGoOnThroughText",
+ "_SaffronGymChanneler1AfterBattleText",
+ "_SaffronGymChanneler1BattleText",
+ "_SaffronGymChanneler1EndBattleText",
+ "_SaffronGymChanneler2AfterBattleText",
+ "_SaffronGymChanneler2BattleText",
+ "_SaffronGymChanneler2EndBattleText",
+ "_SaffronGymChanneler3AfterBattleText",
+ "_SaffronGymChanneler3BattleText",
+ "_SaffronGymChanneler3EndBattleText",
+ "_SaffronGymGuideBeatSabrinaText",
+ "_SaffronGymGuideChampInMakingText",
+ "_SaffronGymSabrinaMarshBadgeInfoText",
+ "_SaffronGymSabrinaPostBattleAdviceText",
+ "_SaffronGymSabrinaReceivedMarshBadgeText",
+ "_SaffronGymSabrinaReceivedTM46Text",
+ "_SaffronGymSabrinaTM46NoRoomText",
+ "_SaffronGymSabrinaText",
+ "_SaffronGymYoungster1AfterBattleText",
+ "_SaffronGymYoungster1BattleText",
+ "_SaffronGymYoungster1EndBattleText",
+ "_SaffronGymYoungster2AfterBattleText",
+ "_SaffronGymYoungster2BattleText",
+ "_SaffronGymYoungster2EndBattleText",
+ "_SaffronGymYoungster3AfterBattleText",
+ "_SaffronGymYoungster3BattleText",
+ "_SaffronGymYoungster3EndBattleText",
+ "_SaffronGymYoungster4AfterBattleText",
+ "_SaffronGymYoungster4BattleText",
+ "_SaffronGymYoungster4EndBattleText",
+ "_SaffronMartCooltrainerFText",
+ "_SaffronMartSuperNerdText",
+ "_SaffronPidgeyHouseBrunetteGirlText",
+ "_SaffronPidgeyHousePaperText",
+ "_SaffronPidgeyHousePidgeyText",
+ "_SaffronPidgeyHouseYoungsterText",
+ "_SaffronPokecenterBeautyText",
+ "_SaffronPokecenterGentlemanText",
+ "_SandshrewDexEntry",
+ "_SandslashDexEntry",
+ "_SaveOptionText",
+ "_SavingEnergyText",
+ "_SavingText",
+ "_ScaredText",
+ "_ScytherDexEntry",
+ "_SeadraDexEntry",
+ "_SeafoamIslandsB4FArticunoBattleText",
+ "_SeafoamIslandsB4FBouldersSignText",
+ "_SeafoamIslandsB4FDangerSignText",
+ "_SeakingDexEntry",
+ "_SeelDexEntry",
+ "_SentToBoxText",
+ "_ShallWeHealYourPokemonText",
+ "_ShellderDexEntry",
+ "_ShroudedInMistText",
+ "_SilphCo10FGiovanniILostAgainText",
+ "_SilphCo10FRocketAfterBattleText",
+ "_SilphCo10FRocketBattleText",
+ "_SilphCo10FRocketEndBattleText",
+ "_SilphCo10FScientistAfterBattleText",
+ "_SilphCo10FScientistBattleText",
+ "_SilphCo10FScientistEndBattleText",
+ "_SilphCo10FSilphWorkerFImScaredText",
+ "_SilphCo10FSilphWorkerFQuietAboutMyCryingText",
+ "_SilphCo11FBeautyText",
+ "_SilphCo11FGiovanniText",
+ "_SilphCo11FGiovanniYouRuinedOurPlansText",
+ "_SilphCo11FRocket2AfterBattleText",
+ "_SilphCo11FRocket2BattleText",
+ "_SilphCo11FRocket2EndBattleText",
+ "_SilphCo11FSilphPresidentMasterBallDescriptionText",
+ "_SilphCo11FSilphPresidentNoRoomText",
+ "_SilphCo11FSilphPresidentReceivedMasterBallText",
+ "_SilphCo11FSilphPresidentText",
+ "_SilphCo1FLinkReceptionistText",
+ "_SilphCo2FRocket1AfterBattleText",
+ "_SilphCo2FRocket1BattleText",
+ "_SilphCo2FRocket1EndBattleText",
+ "_SilphCo2FRocket2AfterBattleText",
+ "_SilphCo2FRocket2BattleText",
+ "_SilphCo2FRocket2EndBattleText",
+ "_SilphCo2FScientist1AfterBattleText",
+ "_SilphCo2FScientist1BattleText",
+ "_SilphCo2FScientist1EndBattleText",
+ "_SilphCo2FScientist2AfterBattleText",
+ "_SilphCo2FScientist2BattleText",
+ "_SilphCo2FScientist2EndBattleText",
+ "_SilphCo2FSilphWorkerFReceivedTM36Text",
+ "_SilphCo2FSilphWorkerFTM36ExplanationText",
+ "_SilphCo2FSilphWorkerFTM36NoRoomText",
+ "_SilphCo3FRocketAfterBattleText",
+ "_SilphCo3FRocketBattleText",
+ "_SilphCo3FRocketEndBattleText",
+ "_SilphCo3FScientistAfterBattleText",
+ "_SilphCo3FScientistBattleText",
+ "_SilphCo3FScientistEndBattleText",
+ "_SilphCo3FSilphWorkerMWhatShouldIDoText",
+ "_SilphCo3FSilphWorkerMYouSavedUsText",
+ "_SilphCo4FRocket1AfterBattleText",
+ "_SilphCo4FRocket1BattleText",
+ "_SilphCo4FRocket1EndBattleText",
+ "_SilphCo4FRocket2AfterBattleText",
+ "_SilphCo4FRocket2BattleText",
+ "_SilphCo4FRocket2EndBattleText",
+ "_SilphCo4FScientistAfterBattleText",
+ "_SilphCo4FScientistBattleText",
+ "_SilphCo4FScientistEndBattleText",
+ "_SilphCo4FSilphWorkerMImHidingText",
+ "_SilphCo4FSilphWorkerMTeamRocketIsGoneText",
+ "_SilphCo5FPokemonReport1Text",
+ "_SilphCo5FPokemonReport2Text",
+ "_SilphCo5FPokemonReport3Text",
+ "_SilphCo5FRockerAfterBattleText",
+ "_SilphCo5FRockerBattleText",
+ "_SilphCo5FRockerEndBattleText",
+ "_SilphCo5FRocket1AfterBattleText",
+ "_SilphCo5FRocket1BattleText",
+ "_SilphCo5FRocket1EndBattleText",
+ "_SilphCo5FRocket2AfterBattleText",
+ "_SilphCo5FRocket2BattleText",
+ "_SilphCo5FRocket2EndBattleText",
+ "_SilphCo5FScientistAfterBattleText",
+ "_SilphCo5FScientistBattleText",
+ "_SilphCo5FScientistEndBattleText",
+ "_SilphCo5FSilphWorkerMThatsYouRightText",
+ "_SilphCo5FSilphWorkerMYoureOurHeroText",
+ "_SilphCo6FRocket1AfterBattleText",
+ "_SilphCo6FRocket1BattleText",
+ "_SilphCo6FRocket1EndBattleText",
+ "_SilphCo6FRocket2AfterBattleText",
+ "_SilphCo6FRocket2BattleText",
+ "_SilphCo6FRocket2EndBattleText",
+ "_SilphCo6FScientistAfterBattleText",
+ "_SilphCo6FScientistBattleText",
+ "_SilphCo6FScientistEndBattleText",
+ "_SilphCo6FSilphWorkerF1HaveToMarryHimText",
+ "_SilphCo6FSilphWorkerF1SuchACowardText",
+ "_SilphCo6FSilphWorkerF2TeamRocketConquerWorldText",
+ "_SilphCo6FSilphWorkerF2TeamRocketRanText",
+ "_SilphCo6FSilphWorkerM1BackToWorkText",
+ "_SilphCo6FSilphWorkerM1TookOverTheBuildingText",
+ "_SilphCo6FSilphWorkerM3TargetedSilphText",
+ "_SilphCo6FSilphWorkerM3WorkForSilphText",
+ "_SilphCo6FSilphWorkerMHelpMePleaseText",
+ "_SilphCo6FSilphWorkerMWeGotEngagedText",
+ "_SilphCo7FRivalDefeatedText",
+ "_SilphCo7FRivalGoodLuckToYouText",
+ "_SilphCo7FRivalText",
+ "_SilphCo7FRivalVictoryText",
+ "_SilphCo7FRivalWaitedHereText",
+ "_SilphCo7FRocket1AfterBattleText",
+ "_SilphCo7FRocket1BattleText",
+ "_SilphCo7FRocket1EndBattleText",
+ "_SilphCo7FRocket2AfterBattleText",
+ "_SilphCo7FRocket2BattleText",
+ "_SilphCo7FRocket2EndBattleText",
+ "_SilphCo7FRocket3AfterBattleText",
+ "_SilphCo7FRocket3BattleText",
+ "_SilphCo7FRocket3EndBattleText",
+ "_SilphCo7FScientistAfterBattleText",
+ "_SilphCo7FScientistBattleText",
+ "_SilphCo7FScientistEndBattleText",
+ "_SilphCo7FSilphWorkerM1HaveThisPokemonText",
+ "_SilphCo7FSilphWorkerM1IsOurPresidentOkText",
+ "_SilphCo7FSilphWorkerM1LaprasDescriptionText",
+ "_SilphCo7FSilphWorkerM1SavedText",
+ "_SilphCo7FSilphWorkerM2AfterTheMasterBallText",
+ "_SilphCo7FSilphWorkerM2CancelledMasterBallText",
+ "_SilphCo7FSilphWorkerM3ItWouldBeBadText",
+ "_SilphCo7FSilphWorkerM3YouChasedOffTeamRocketText",
+ "_SilphCo7FSilphWorkerM4ItsReallyDangerousHereText",
+ "_SilphCo7FSilphWorkerM4SafeAtLastText",
+ "_SilphCo8FRocket1AfterBattleText",
+ "_SilphCo8FRocket1BattleText",
+ "_SilphCo8FRocket1EndBattleText",
+ "_SilphCo8FRocket2AfterBattleText",
+ "_SilphCo8FRocket2BattleText",
+ "_SilphCo8FRocket2EndBattleText",
+ "_SilphCo8FScientistAfterBattleText",
+ "_SilphCo8FScientistBattleText",
+ "_SilphCo8FScientistEndBattleText",
+ "_SilphCo8FSilphWorkerMSilphIsFinishedText",
+ "_SilphCo8FSilphWorkerMThanksForSavingUsText",
+ "_SilphCo9FRocket1AfterBattleText",
+ "_SilphCo9FRocket1BattleText",
+ "_SilphCo9FRocket1EndBattleText",
+ "_SilphCo9FRocket2AfterBattleText",
+ "_SilphCo9FRocket2BattleText",
+ "_SilphCo9FRocket2EndBattleText",
+ "_SilphCo9FScientistAfterBattleText",
+ "_SilphCo9FScientistBattleText",
+ "_SilphCo9FScientistEndBattleText",
+ "_SilphCoJessieJamesText1",
+ "_SilphCoJessieJamesText2",
+ "_SilphCoJessieJamesText3",
+ "_SilphCoJessieJamesText4",
+ "_SkyAttackGlowingText",
+ "_SleepingPikachuText1",
+ "_SleepingPikachuText2",
+ "_SlowbroDexEntry",
+ "_SlowpokeDexEntry",
+ "_SnorlaxDexEntry",
+ "_SoYouWantPrizeText",
+ "_SorryNeedMoreCoinsText",
+ "_SpearowDexEntry",
+ "_SquirtleDexEntry",
+ "_StarmieDexEntry",
+ "_StartSlotMachineText",
+ "_StartedSleepingEffect",
+ "_StaryuDexEntry",
+ "_StatusChangesEliminatedText",
+ "_StoppedEvolvingText",
+ "_StrengthsAndWeaknessesText",
+ "_SubstituteBrokeText",
+ "_SubstituteText",
+ "_SubstituteTookDamageText",
+ "_SuckedHealthText",
+ "_SummerBeachHousePikachuText",
+ "_SummerBeachHousePoster1Text1",
+ "_SummerBeachHousePoster1Text2",
+ "_SummerBeachHousePoster2Text1",
+ "_SummerBeachHousePoster2Text2",
+ "_SummerBeachHousePoster3Text1",
+ "_SummerBeachHousePoster3Text2",
+ "_SummerBeachHousePrinterText1",
+ "_SummerBeachHousePrinterText2",
+ "_SummerBeachHousePrinterText3",
+ "_SummerBeachHousePrinterText4",
+ "_SummerBeachHousePrinterText5",
+ "_SummerBeachHousePrinterText6",
+ "_SummerBeachHouseSurfinDudeText1",
+ "_SummerBeachHouseSurfinDudeText2",
+ "_SummerBeachHouseSurfinDudeText3",
+ "_SummerBeachHouseSurfinDudeText4",
+ "_SuperEffectiveText",
+ "_SurfingGotOnText",
+ "_SurfingNoPlaceToGetOffText",
+ "_SwitchOnText",
+ "_TM21ExplanationText",
+ "_TM24ExplanationText",
+ "_TM34ExplanationText",
+ "_TM46ExplanationText",
+ "_TangelaDexEntry",
+ "_TaurosDexEntry",
+ "_TeachMachineMoveText",
+ "_TentacoolDexEntry",
+ "_TentacruelDexEntry",
+ "_TextIDErrorText",
+ "_Thanks1Text",
+ "_Thanks2Text",
+ "_Thanks3Text",
+ "_ThrashingAboutText",
+ "_ThrewAwayItemText",
+ "_ThrewBaitText",
+ "_ThrewRockText",
+ "_ThrowBallAtTrainerMonText1",
+ "_ThrowBallAtTrainerMonText2",
+ "_TimesUpText",
+ "_TooImportantToTossText",
+ "_TooWeakSubstituteText",
+ "_TookInSunlightText",
+ "_TossHowManyText",
+ "_TownMapText",
+ "_TradeCenterOpponentText",
+ "_TradeForText",
+ "_TradeSendsText",
+ "_TradeTakeCareText",
+ "_TradeTransferredText",
+ "_TradeWavesFarewellText",
+ "_TradeWentToText",
+ "_TradeWillTradeText",
+ "_TradedForText",
+ "_TradeforText",
+ "_TrainerAboutToUseText",
+ "_TrainerDefeatedText",
+ "_TrainerNameText",
+ "_TrainerSentOutText",
+ "_TrainerWantsToFightText",
+ "_TransformedText",
+ "_TryingToLearnText",
+ "_TurnPageText",
+ "_TurnedAwayText",
+ "_TurnedOnPC1Text",
+ "_TurnedOnPC2Text",
+ "_UnaffectedText",
+ "_UndergroundPathRoute6GirlText",
+ "_UndergroundPathRoute7CopyUnusedGirlText",
+ "_UndergroundPathRoute7CopyUnusedGoesUnderSaffronText",
+ "_UndergroundPathRoute7CopyUnusedMiddleAgedManText",
+ "_UndergroundPathRoute7CopyUnusedTeamRocketHadAHideoutText",
+ "_UndergroundPathRoute7MiddleAgedManText",
+ "_UndergroundPathRoute8GirlText",
+ "_UnleashedEnergyText",
+ "_UnusedBenchGuyText1",
+ "_UnusedBenchGuyText2",
+ "_UnusedBenchGuyText3",
+ "_UnveiledGhostText",
+ "_UseNextMonText",
+ "_UsedCutText",
+ "_UsedInsteadText",
+ "_UsedMove1Text",
+ "_UsedMove2Text",
+ "_UsedStrengthText",
+ "_VaporeonDexEntry",
+ "_VendingMachineText1",
+ "_VendingMachineText4",
+ "_VendingMachineText5",
+ "_VendingMachineText6",
+ "_VendingMachineText7",
+ "_VenomothDexEntry",
+ "_VenonatDexEntry",
+ "_VenusaurDexEntry",
+ "_VermilionCityBeautyText",
+ "_VermilionCityGambler1DidYouSeeText",
+ "_VermilionCityGambler1SSAnneDepartedText",
+ "_VermilionCityGambler2Text",
+ "_VermilionCityGymSignText",
+ "_VermilionCityHarborSignText",
+ "_VermilionCityMachopStompingTheLandFlatText",
+ "_VermilionCityMachopText",
+ "_VermilionCityNoticeSignText",
+ "_VermilionCityPokemonFanClubSignText",
+ "_VermilionCitySailor1DoYouHaveATicketText",
+ "_VermilionCitySailor1FlashedTicketText",
+ "_VermilionCitySailor1ShipSetSailText",
+ "_VermilionCitySailor1WelcomeToSSAnneText",
+ "_VermilionCitySailor1YouNeedATicketText",
+ "_VermilionCitySailor2Text",
+ "_VermilionCitySignText",
+ "_VermilionDockUnusedText",
+ "_VermilionGymGentlemanAfterBattleText",
+ "_VermilionGymGentlemanBattleText",
+ "_VermilionGymGentlemanEndBattleText",
+ "_VermilionGymGymGuideBeatLTSurgeText",
+ "_VermilionGymGymGuideChampInMakingText",
+ "_VermilionGymLTSurgePostBattleAdviceText",
+ "_VermilionGymLTSurgePreBattleText",
+ "_VermilionGymLTSurgeReceivedTM24Text",
+ "_VermilionGymLTSurgeReceivedThunderBadgeText",
+ "_VermilionGymLTSurgeTM24NoRoomText",
+ "_VermilionGymLTSurgeThunderBadgeInfoText",
+ "_VermilionGymSailorAfterBattleText",
+ "_VermilionGymSailorBattleText",
+ "_VermilionGymSailorEndBattleText",
+ "_VermilionGymSuperNerdAfterBattleText",
+ "_VermilionGymSuperNerdBattleText",
+ "_VermilionGymSuperNerdEndBattleText",
+ "_VermilionGymTrashFailText",
+ "_VermilionGymTrashSuccessText1",
+ "_VermilionGymTrashSuccessText2",
+ "_VermilionGymTrashSuccessText3",
+ "_VermilionGymTrashText",
+ "_VermilionMartCooltrainerFText",
+ "_VermilionMartCooltrainerMText",
+ "_VermilionOldRodHouseFishingGuruDoYouLikeToFishText",
+ "_VermilionOldRodHouseFishingGuruFishingIsAWayOfLifeText",
+ "_VermilionOldRodHouseFishingGuruHowAreTheFishBitingText",
+ "_VermilionOldRodHouseFishingGuruNoRoomText",
+ "_VermilionOldRodHouseFishingGuruTakeThisText",
+ "_VermilionOldRodHouseFishingGuruThatsSoDisappointingText",
+ "_VermilionPidgeyHouseLetterText",
+ "_VermilionPidgeyHousePidgeyText",
+ "_VermilionPidgeyHouseYoungsterText",
+ "_VermilionPokecenterFishingGuruText",
+ "_VermilionPokecenterGuyText",
+ "_VermilionPokecenterSailorText",
+ "_VictoryRoad1FCooltrainerFAfterBattleText",
+ "_VictoryRoad1FCooltrainerFBattleText",
+ "_VictoryRoad1FCooltrainerFEndBattleText",
+ "_VictoryRoad1FCooltrainerMAfterBattleText",
+ "_VictoryRoad1FCooltrainerMBattleText",
+ "_VictoryRoad1FCooltrainerMEndBattleText",
+ "_VictoryRoad2FCooltrainerMAfterBattleText",
+ "_VictoryRoad2FCooltrainerMBattleText",
+ "_VictoryRoad2FCooltrainerMEndBattleText",
+ "_VictoryRoad2FHikerAfterBattleText",
+ "_VictoryRoad2FHikerBattleText",
+ "_VictoryRoad2FHikerEndBattleText",
+ "_VictoryRoad2FMoltresBattleText",
+ "_VictoryRoad2FSuperNerd1AfterBattleText",
+ "_VictoryRoad2FSuperNerd1BattleText",
+ "_VictoryRoad2FSuperNerd1EndBattleText",
+ "_VictoryRoad2FSuperNerd2AfterBattleText",
+ "_VictoryRoad2FSuperNerd2BattleText",
+ "_VictoryRoad2FSuperNerd2EndBattleText",
+ "_VictoryRoad2FSuperNerd3AfterBattleText",
+ "_VictoryRoad2FSuperNerd3BattleText",
+ "_VictoryRoad2FSuperNerd3EndBattleText",
+ "_VictoryRoad3FCooltrainerF1AfterBattleText",
+ "_VictoryRoad3FCooltrainerF1BattleText",
+ "_VictoryRoad3FCooltrainerF1EndBattleText",
+ "_VictoryRoad3FCooltrainerF2AfterBattleText",
+ "_VictoryRoad3FCooltrainerF2BattleText",
+ "_VictoryRoad3FCooltrainerF2EndBattleText",
+ "_VictoryRoad3FCooltrainerM1AfterBattleText",
+ "_VictoryRoad3FCooltrainerM1BattleText",
+ "_VictoryRoad3FCooltrainerM1EndBattleText",
+ "_VictoryRoad3FCooltrainerM2AfterBattleText",
+ "_VictoryRoad3FCooltrainerM2BattleText",
+ "_VictoryRoad3FCooltrainerM2EndBattleText",
+ "_VictreebelDexEntry",
+ "_VileplumeDexEntry",
+ "_ViridianBlackboardBurnText",
+ "_ViridianBlackboardFrozenText",
+ "_ViridianBlackboardPoisonText",
+ "_ViridianBlackboardPrlzText",
+ "_ViridianBlackboardSleepText",
+ "_ViridianCityFisherReceivedTM42Text",
+ "_ViridianCityFisherTM42ExplanationText",
+ "_ViridianCityFisherTM42NoRoomText",
+ "_ViridianCityGambler1GymAlwaysClosedText",
+ "_ViridianCityGambler1GymLeaderReturnedText",
+ "_ViridianCityGirlHasntHadHisCoffeeYetText",
+ "_ViridianCityGirlWhenIGoShopText",
+ "_ViridianCityGymLockedText",
+ "_ViridianCityGymSignText",
+ "_ViridianCityOldManHadMyCoffeeNowText",
+ "_ViridianCityOldManLosingMyTouchText",
+ "_ViridianCityOldManNotGoodEnoughForYouText",
+ "_ViridianCityOldManSleepyPrivatePropertyText",
+ "_ViridianCityOldManWantMeToShowYouAgainText",
+ "_ViridianCityOldManWatchCloselyText",
+ "_ViridianCityOldManYouNeedToWeakenTheTargetText",
+ "_ViridianCityPokecenterGuyText",
+ "_ViridianCitySignText",
+ "_ViridianCityTrainerTips1Text",
+ "_ViridianCityTrainerTips2Text",
+ "_ViridianCityYoungster1Text",
+ "_ViridianCityYoungster2YouWantToKnowAboutText",
+ "_ViridianForestCooltrainerFAfterBattleText",
+ "_ViridianForestCooltrainerFBattleText",
+ "_ViridianForestCooltrainerFEndBattleText",
+ "_ViridianForestLeavingSignText",
+ "_ViridianForestNorthGateGrampsText",
+ "_ViridianForestNorthGateSuperNerdText",
+ "_ViridianForestSouthGateGirlText",
+ "_ViridianForestSouthGateLittleGirlText",
+ "_ViridianForestTrainerTips1Text",
+ "_ViridianForestTrainerTips2Text",
+ "_ViridianForestTrainerTips3Text",
+ "_ViridianForestTrainerTips4Text",
+ "_ViridianForestUseAntidoteSignText",
+ "_ViridianForestYoungster1Text",
+ "_ViridianForestYoungster2AfterBattleText",
+ "_ViridianForestYoungster2BattleText",
+ "_ViridianForestYoungster2EndBattleText",
+ "_ViridianForestYoungster3AfterBattleText",
+ "_ViridianForestYoungster3BattleText",
+ "_ViridianForestYoungster3EndBattleText",
+ "_ViridianForestYoungster4AfterBattleText",
+ "_ViridianForestYoungster4BattleText",
+ "_ViridianForestYoungster4EndBattleText",
+ "_ViridianForestYoungster5AfterBattleText",
+ "_ViridianForestYoungster5BattleText",
+ "_ViridianForestYoungster5EndBattleText",
+ "_ViridianForestYoungster6Text",
+ "_ViridianGymCooltrainerM1AfterBattleText",
+ "_ViridianGymCooltrainerM1BattleText",
+ "_ViridianGymCooltrainerM1EndBattleText",
+ "_ViridianGymCooltrainerM2AfterBattleText",
+ "_ViridianGymCooltrainerM2BattleText",
+ "_ViridianGymCooltrainerM2EndBattleText",
+ "_ViridianGymCooltrainerM3AfterBattleText",
+ "_ViridianGymCooltrainerM3BattleText",
+ "_ViridianGymCooltrainerM3EndBattleText",
+ "_ViridianGymGiovanniEarthBadgeInfoText",
+ "_ViridianGymGiovanniPostBattleAdviceText",
+ "_ViridianGymGiovanniPreBattleText",
+ "_ViridianGymGiovanniReceivedEarthBadgeText",
+ "_ViridianGymGiovanniReceivedTM27Text",
+ "_ViridianGymGiovanniTM27ExplanationText",
+ "_ViridianGymGiovanniTM27NoRoomText",
+ "_ViridianGymGuidePostBattleText",
+ "_ViridianGymGuidePreBattleText",
+ "_ViridianGymHiker1AfterBattleText",
+ "_ViridianGymHiker1BattleText",
+ "_ViridianGymHiker1EndBattleText",
+ "_ViridianGymHiker2AfterBattleText",
+ "_ViridianGymHiker2BattleText",
+ "_ViridianGymHiker2EndBattleText",
+ "_ViridianGymHiker3AfterBattleText",
+ "_ViridianGymHiker3BattleText",
+ "_ViridianGymHiker3EndBattleText",
+ "_ViridianGymRocker1AfterBattleText",
+ "_ViridianGymRocker1BattleText",
+ "_ViridianGymRocker1EndBattleText",
+ "_ViridianGymRocker2AfterBattleText",
+ "_ViridianGymRocker2BattleText",
+ "_ViridianGymRocker2EndBattleText",
+ "_ViridianMartClerkParcelQuestText",
+ "_ViridianMartClerkSayHiToOakText",
+ "_ViridianMartClerkYouCameFromPalletTownText",
+ "_ViridianMartCooltrainerMText",
+ "_ViridianMartYoungsterText",
+ "_ViridianNicknameHouseBaldingGuyText",
+ "_ViridianNicknameHouseLittleGirlText",
+ "_ViridianNicknameHouseSpearowText",
+ "_ViridianNicknameHouseSpearySignText",
+ "_ViridianPokecenterCooltrainerMText",
+ "_ViridianPokecenterGentlemanText",
+ "_ViridianSchoolBlackboardText1",
+ "_ViridianSchoolBlackboardText2",
+ "_ViridianSchoolHouseBrunetteGirlText",
+ "_ViridianSchoolHouseCooltrainerFText",
+ "_ViridianSchoolHouseLittleGirlText",
+ "_ViridianSchoolNotebookText1",
+ "_ViridianSchoolNotebookText2",
+ "_ViridianSchoolNotebookText3",
+ "_ViridianSchoolNotebookText4",
+ "_ViridianSchoolNotebookText5",
+ "_VitaminNoEffectText",
+ "_VitaminStatRoseText",
+ "_VoltorbDexEntry",
+ "_VulpixDexEntry",
+ "_WannaTrade1Text",
+ "_WannaTrade2Text",
+ "_WannaTrade3Text",
+ "_WardensHouseDisplayMerchandiseText",
+ "_WardensHouseDisplayPhotosAndFossilsText",
+ "_WardensHouseWardenGaveTheGoldTeethText",
+ "_WardensHouseWardenGibberish1Text",
+ "_WardensHouseWardenGibberish2Text",
+ "_WardensHouseWardenGibberish3Text",
+ "_WardensHouseWardenHM04ExplanationText",
+ "_WardensHouseWardenHM04NoRoomText",
+ "_WardensHouseWardenReceivedHM04Text",
+ "_WardensHouseWardenTeethPoppedInHisTeethText",
+ "_WardensHouseWardenThanksText",
+ "_WarpToLastPokemonCenterText",
+ "_WartortleDexEntry",
+ "_WasBlownAwayText",
+ "_WasSeededText",
+ "_WeedleDexEntry",
+ "_WeepinbellDexEntry",
+ "_WeezingDexEntry",
+ "_WhatDoYouWantText",
+ "_WhatGoesAroundComesAroundText",
+ "_WhatText",
+ "_WhatToDepositText",
+ "_WhatToTossText",
+ "_WhatToWithdrawText",
+ "_WhenYouChangeBoxText",
+ "_WhichFloorText",
+ "_WhichMoveToForgetText",
+ "_WhichPrizeText",
+ "_WigglytuffDexEntry",
+ "_WildMonAppearedText",
+ "_WildRanText",
+ "_WillBeTradedText",
+ "_WithExpAllText",
+ "_WithdrawHowManyText",
+ "_WithdrewItemText",
+ "_WokeUpText",
+ "_WontObeyText",
+ "_WouldYouLikeToSaveText",
+ "_WrongMon1Text",
+ "_WrongMon2Text",
+ "_WrongMon3Text",
+ "_YeahText",
+ "_YourNameIsText",
+ "_ZapdosDexEntry",
+ "_ZubatDexEntry",
+ "MelanieText1",
+ "MelanieText2",
+ "MelanieText3",
+ "MelanieText4",
+ "MelanieText5",
+ "MelanieBulbasaurText",
+ "MelanieOddishText",
+ "MelanieSandshrewText"
+ ],
+ "pointers": {
+ "AgathasRoom": {
+ "TEXT_AGATHASROOM_AGATHA": {
+ "asm": true,
+ "label": "AgathasRoomAgathaText"
+ },
+ "TEXT_AGATHASROOM_AGATHA_DONT_RUN_AWAY": {
+ "label": "AgathasRoomAgathaDontRunAwayText",
+ "text": "_AgathasRoomAgathaDontRunAwayText"
+ }
+ },
+ "BikeShop": {
+ "TEXT_BIKESHOP_CLERK": {
+ "asm": true,
+ "label": "BikeShopClerkText"
+ },
+ "TEXT_BIKESHOP_MIDDLE_AGED_WOMAN": {
+ "asm": true,
+ "label": "BikeShopMiddleAgedWomanText",
+ "text": "_BikeShopMiddleAgedWomanText"
+ },
+ "TEXT_BIKESHOP_YOUNGSTER": {
+ "asm": true,
+ "label": "BikeShopYoungsterText",
+ "text": "_BikeShopYoungsterTheseBikesAreExpensiveText"
+ }
+ },
+ "BillsHouse": {
+ "TEXT_BILLSHOUSE_BILL_CHECK_OUT_MY_RARE_POKEMON": {
+ "asm": true,
+ "label": "BillsHouseBillCheckOutMyRarePokemonText"
+ },
+ "TEXT_BILLSHOUSE_BILL_DONT_LEAVE": {
+ "label": "BillsHouseBillDontLeaveText",
+ "text": "_BillsHouseBillDontLeaveText"
+ },
+ "TEXT_BILLSHOUSE_BILL_POKEMON": {
+ "asm": true,
+ "label": "BillsHouseBillPokemonText"
+ },
+ "TEXT_BILLSHOUSE_BILL_SS_TICKET": {
+ "asm": true,
+ "label": "BillsHouseBillSSTicketText"
+ }
+ },
+ "BluesHouse": {
+ "TEXT_BLUESHOUSE_DAISY_SITTING": {
+ "asm": true,
+ "label": "BluesHouseDaisySittingText"
+ },
+ "TEXT_BLUESHOUSE_DAISY_WALKING": {
+ "label": "BluesHouseDaisyWalkingText",
+ "text": "_BluesHouseDaisyWalkingText"
+ },
+ "TEXT_BLUESHOUSE_TOWN_MAP": {
+ "label": "BluesHouseTownMapText",
+ "text": "_BluesHouseTownMapText"
+ }
+ },
+ "BrunosRoom": {
+ "TEXT_BRUNOSROOM_BRUNO": {
+ "asm": true,
+ "label": "BrunosRoomBrunoText"
+ },
+ "TEXT_BRUNOSROOM_BRUNO_DONT_RUN_AWAY": {
+ "label": "BrunosRoomBrunoDontRunAwayText",
+ "text": "_BrunosRoomBrunoDontRunAwayText"
+ }
+ },
+ "CeladonChiefHouse": {
+ "TEXT_CELADONCHIEFHOUSE_CHIEF": {
+ "label": "CeladonChiefHouseChiefText",
+ "text": "_CeladonChiefHouseChiefText"
+ },
+ "TEXT_CELADONCHIEFHOUSE_ROCKET": {
+ "label": "CeladonChiefHouseRocketText",
+ "text": "_CeladonChiefHouseRocketText"
+ },
+ "TEXT_CELADONCHIEFHOUSE_SAILOR": {
+ "label": "CeladonChiefHouseSailorText",
+ "text": "_CeladonChiefHouseSailorText"
+ }
+ },
+ "CeladonCity": {
+ "TEXT_CELADONCITY_DEPTSTORE_SIGN": {
+ "label": "CeladonCityDeptStoreSignText",
+ "text": "_CeladonCityDeptStoreSignText"
+ },
+ "TEXT_CELADONCITY_FISHER": {
+ "label": "CeladonCityFisherText",
+ "text": "_CeladonCityFisherText"
+ },
+ "TEXT_CELADONCITY_GAMECORNER_SIGN": {
+ "label": "CeladonCityGameCornerSignText",
+ "text": "_CeladonCityGameCornerSignText"
+ },
+ "TEXT_CELADONCITY_GIRL": {
+ "label": "CeladonCityGirlText",
+ "text": "_CeladonCityGirlText"
+ },
+ "TEXT_CELADONCITY_GRAMPS1": {
+ "label": "CeladonCityGramps1Text",
+ "text": "_CeladonCityGramps1Text"
+ },
+ "TEXT_CELADONCITY_GRAMPS2": {
+ "label": "CeladonCityGramps2Text",
+ "text": "_CeladonCityGramps2Text"
+ },
+ "TEXT_CELADONCITY_GRAMPS3": {
+ "asm": true,
+ "label": "CeladonCityGramps3Text",
+ "text": "_CeladonCityGramps3Text"
+ },
+ "TEXT_CELADONCITY_GYM_SIGN": {
+ "label": "CeladonCityGymSignText",
+ "text": "_CeladonCityGymSignText"
+ },
+ "TEXT_CELADONCITY_LITTLE_GIRL": {
+ "label": "CeladonCityLittleGirlText",
+ "text": "_CeladonCityLittleGirlText"
+ },
+ "TEXT_CELADONCITY_MANSION_SIGN": {
+ "label": "CeladonCityMansionSignText",
+ "text": "_CeladonCityMansionSignText"
+ },
+ "TEXT_CELADONCITY_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_CELADONCITY_POLIWRATH": {
+ "asm": true,
+ "label": "CeladonCityPoliwrathText",
+ "text": "_CeladonCityPoliwrathText"
+ },
+ "TEXT_CELADONCITY_PRIZEEXCHANGE_SIGN": {
+ "label": "CeladonCityPrizeExchangeSignText",
+ "text": "_CeladonCityPrizeExchangeSignText"
+ },
+ "TEXT_CELADONCITY_ROCKET1": {
+ "label": "CeladonCityRocket1Text",
+ "text": "_CeladonCityRocket1Text"
+ },
+ "TEXT_CELADONCITY_ROCKET2": {
+ "label": "CeladonCityRocket2Text",
+ "text": "_CeladonCityRocket2Text"
+ },
+ "TEXT_CELADONCITY_SIGN": {
+ "label": "CeladonCitySignText",
+ "text": "_CeladonCitySignText"
+ },
+ "TEXT_CELADONCITY_TRAINER_TIPS1": {
+ "asm": true,
+ "label": "CeladonCityTrainerTips1Text"
+ },
+ "TEXT_CELADONCITY_TRAINER_TIPS2": {
+ "label": "CeladonCityTrainerTips2Text",
+ "text": "_CeladonCityTrainerTips2Text"
+ }
+ },
+ "CeladonDiner": {
+ "TEXT_CELADONDINER_COOK": {
+ "label": "CeladonDinerCookText",
+ "text": "_CeladonDinerCookText"
+ },
+ "TEXT_CELADONDINER_FISHER": {
+ "label": "CeladonDinerFisherText",
+ "text": "_CeladonDinerFisherText"
+ },
+ "TEXT_CELADONDINER_GYM_GUIDE": {
+ "asm": true,
+ "label": "CeladonDinerGymGuideText"
+ },
+ "TEXT_CELADONDINER_MIDDLE_AGED_MAN": {
+ "label": "CeladonDinerMiddleAgedManText",
+ "text": "_CeladonDinerMiddleAgedManText"
+ },
+ "TEXT_CELADONDINER_MIDDLE_AGED_WOMAN": {
+ "label": "CeladonDinerMiddleAgedWomanText",
+ "text": "_CeladonDinerMiddleAgedWomanText"
+ }
+ },
+ "CeladonGym": {
+ "TEXT_CELADONGYM_BEAUTY1": {
+ "asm": true,
+ "label": "CeladonGymBeauty1Text"
+ },
+ "TEXT_CELADONGYM_BEAUTY2": {
+ "asm": true,
+ "label": "CeladonGymBeauty2Text"
+ },
+ "TEXT_CELADONGYM_BEAUTY3": {
+ "asm": true,
+ "label": "CeladonGymBeauty3Text"
+ },
+ "TEXT_CELADONGYM_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "CeladonGymCooltrainerF1Text"
+ },
+ "TEXT_CELADONGYM_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "CeladonGymCooltrainerF2Text"
+ },
+ "TEXT_CELADONGYM_COOLTRAINER_F3": {
+ "asm": true,
+ "label": "CeladonGymCooltrainerF3Text"
+ },
+ "TEXT_CELADONGYM_COOLTRAINER_F4": {
+ "asm": true,
+ "label": "CeladonGymCooltrainerF4Text"
+ },
+ "TEXT_CELADONGYM_ERIKA": {
+ "asm": true,
+ "label": "CeladonGymErikaText",
+ "text": "_CeladonGymErikaPreBattleText"
+ },
+ "TEXT_CELADONGYM_RAINBOWBADGE_INFO": {
+ "label": "CeladonGymRainbowBadgeInfoText",
+ "text": "_CeladonGymRainbowBadgeInfoText"
+ },
+ "TEXT_CELADONGYM_RECEIVED_TM21": {
+ "label": "CeladonGymReceivedTM21Text",
+ "text": "_CeladonGymReceivedTM21Text"
+ },
+ "TEXT_CELADONGYM_TM21_NO_ROOM": {
+ "label": "CeladonGymTM21NoRoomText",
+ "text": "_CeladonGymTM21NoRoomText"
+ }
+ },
+ "CeladonHotel": {
+ "TEXT_CELADONHOTEL_BEAUTY": {
+ "label": "CeladonHotelBeautyText",
+ "text": "_CeladonHotelBeautyText"
+ },
+ "TEXT_CELADONHOTEL_GRANNY": {
+ "label": "CeladonHotelGrannyText",
+ "text": "_CeladonHotelGrannyText"
+ },
+ "TEXT_CELADONHOTEL_SUPER_NERD": {
+ "label": "CeladonHotelSuperNerdText",
+ "text": "_CeladonHotelSuperNerdText"
+ }
+ },
+ "CeladonMansion1F": {
+ "TEXT_CELADONMANSION1F_CLEFAIRY": {
+ "asm": true,
+ "label": "CeladonMansion1FClefairyText",
+ "text": "_CeladonMansion1FClefairyText"
+ },
+ "TEXT_CELADONMANSION1F_GRANNY": {
+ "asm": true,
+ "label": "CeladonMansion1FGrannyText"
+ },
+ "TEXT_CELADONMANSION1F_MANAGERS_SUITE_SIGN": {
+ "label": "CeladonMansion1FManagersSuiteSignText",
+ "text": "_CeladonMansion1FManagersSuiteSignText"
+ },
+ "TEXT_CELADONMANSION1F_MEOWTH": {
+ "asm": true,
+ "label": "CeladonMansion1FMeowthText",
+ "text": "_CeladonMansion1FMeowthText"
+ },
+ "TEXT_CELADONMANSION1F_NIDORANF": {
+ "asm": true,
+ "label": "CeladonMansion1FNidoranFText",
+ "text": "_CeladonMansion1FNidoranFText"
+ }
+ },
+ "CeladonMansion2F": {
+ "TEXT_CELADONMANSION2F_MEETING_ROOM_SIGN": {
+ "label": "CeladonMansion2FMeetingRoomSignText",
+ "text": "_CeladonMansion2FMeetingRoomSignText"
+ }
+ },
+ "CeladonMansion3F": {
+ "TEXT_CELADONMANSION3F_DEV_ROOM_SIGN": {
+ "asm": true,
+ "label": "CeladonMansion3FDevRoomSignText"
+ },
+ "TEXT_CELADONMANSION3F_GAME_DESIGNER": {
+ "asm": true,
+ "label": "CeladonMansion3FGameDesignerText",
+ "text": "_CeladonMansion3FGameDesignerText"
+ },
+ "TEXT_CELADONMANSION3F_GAME_PROGRAM_PC": {
+ "asm": true,
+ "label": "CeladonMansion3FGameProgramPCText"
+ },
+ "TEXT_CELADONMANSION3F_GAME_SCRIPT_PC": {
+ "asm": true,
+ "label": "CeladonMansion3FGameScriptPCText"
+ },
+ "TEXT_CELADONMANSION3F_GRAPHIC_ARTIST": {
+ "asm": true,
+ "label": "CeladonMansion3FGraphicArtistText",
+ "text": "_CeladonMansion3FGraphicArtistText"
+ },
+ "TEXT_CELADONMANSION3F_PLAYING_GAME_PC": {
+ "asm": true,
+ "label": "CeladonMansion3FPlayingGamePCText"
+ },
+ "TEXT_CELADONMANSION3F_PROGRAMMER": {
+ "asm": true,
+ "label": "CeladonMansion3FProgrammerText"
+ },
+ "TEXT_CELADONMANSION3F_WRITER": {
+ "asm": true,
+ "label": "CeladonMansion3FWriterText",
+ "text": "_CeladonMansion3FWriterText"
+ }
+ },
+ "CeladonMansionRoof": {
+ "TEXT_CELADONMANSIONROOF_HOUSE_SIGN": {
+ "label": "CeladonMansionRoofHouseSignText",
+ "text": "_CeladonMansionRoofHouseSignText"
+ }
+ },
+ "CeladonMansionRoofHouse": {
+ "TEXT_CELADONMANSION_ROOF_HOUSE_EEVEE_POKEBALL": {
+ "asm": true,
+ "label": "CeladonMansionRoofHouseEeveePokeballText"
+ },
+ "TEXT_CELADONMANSION_ROOF_HOUSE_HIKER": {
+ "label": "CeladonMansionRoofHouseHikerText",
+ "text": "_CeladonMansionRoofHouseHikerText"
+ }
+ },
+ "CeladonMart1F": {
+ "TEXT_CELADONMART1F_CURRENT_FLOOR_SIGN": {
+ "label": "CeladonMart1FCurrentFloorSignText",
+ "text": "_CeladonMart1FCurrentFloorSignText"
+ },
+ "TEXT_CELADONMART1F_DIRECTORY_SIGN": {
+ "label": "CeladonMart1FDirectorySignText",
+ "text": "_CeladonMart1FDirectorySignText"
+ },
+ "TEXT_CELADONMART1F_RECEPTIONIST": {
+ "label": "CeladonMart1FReceptionistText",
+ "text": "_CeladonMart1FReceptionistText"
+ }
+ },
+ "CeladonMart2F": {
+ "TEXT_CELADONMART2F_CLERK1": {
+ "label": "CeladonMart2FClerk1Text",
+ "mart": [
+ "GREAT_BALL",
+ "SUPER_POTION",
+ "REVIVE",
+ "SUPER_REPEL",
+ "ANTIDOTE",
+ "BURN_HEAL",
+ "ICE_HEAL",
+ "AWAKENING",
+ "PARLYZ_HEAL"
+ ]
+ },
+ "TEXT_CELADONMART2F_CLERK2": {
+ "label": "CeladonMart2FClerk2Text",
+ "mart": [
+ "TM_DOUBLE_TEAM",
+ "TM_REFLECT",
+ "TM_RAZOR_WIND",
+ "TM_HORN_DRILL",
+ "TM_EGG_BOMB",
+ "TM_MEGA_PUNCH",
+ "TM_MEGA_KICK",
+ "TM_TAKE_DOWN",
+ "TM_SUBMISSION"
+ ]
+ },
+ "TEXT_CELADONMART2F_CURRENT_FLOOR_SIGN": {
+ "label": "CeladonMart2FCurrentFloorSignText",
+ "text": "_CeladonMart2FCurrentFloorSignText"
+ },
+ "TEXT_CELADONMART2F_GIRL": {
+ "label": "CeladonMart2FGirlText",
+ "text": "_CeladonMart2FGirlText"
+ },
+ "TEXT_CELADONMART2F_MIDDLE_AGED_MAN": {
+ "label": "CeladonMart2FMiddleAgedManText",
+ "text": "_CeladonMart2FMiddleAgedManText"
+ }
+ },
+ "CeladonMart3F": {
+ "TEXT_CELADONMART3F_CLERK": {
+ "asm": true,
+ "label": "CeladonMart3FClerkText"
+ },
+ "TEXT_CELADONMART3F_CURRENT_FLOOR_SIGN": {
+ "label": "CeladonMart3FCurrentFloorSignText",
+ "text": "_CeladonMart3FCurrentFloorSignText"
+ },
+ "TEXT_CELADONMART3F_FIGHTING_GAME": {
+ "label": "CeladonMart3FFightingGameText",
+ "text": "_CeladonMart3FFightingGameText"
+ },
+ "TEXT_CELADONMART3F_GAMEBOY_KID1": {
+ "label": "CeladonMart3FGameBoyKid1Text",
+ "text": "_CeladonMart3FGameBoyKid1Text"
+ },
+ "TEXT_CELADONMART3F_GAMEBOY_KID2": {
+ "label": "CeladonMart3FGameBoyKid2Text",
+ "text": "_CeladonMart3FGameBoyKid2Text"
+ },
+ "TEXT_CELADONMART3F_GAMEBOY_KID3": {
+ "label": "CeladonMart3FGameBoyKid3Text",
+ "text": "_CeladonMart3FGameBoyKid3Text"
+ },
+ "TEXT_CELADONMART3F_LITTLE_BOY": {
+ "label": "CeladonMart3FLittleBoyText",
+ "text": "_CeladonMart3FLittleBoyText"
+ },
+ "TEXT_CELADONMART3F_POKEMON_POSTER1": {
+ "label": "CeladonMart3FPokemonPosterText",
+ "text": "_CeladonMart3FPokemonPosterText"
+ },
+ "TEXT_CELADONMART3F_POKEMON_POSTER2": {
+ "label": "CeladonMart3FPokemonPosterText",
+ "text": "_CeladonMart3FPokemonPosterText"
+ },
+ "TEXT_CELADONMART3F_POKEMON_POSTER3": {
+ "label": "CeladonMart3FPokemonPosterText",
+ "text": "_CeladonMart3FPokemonPosterText"
+ },
+ "TEXT_CELADONMART3F_PUZZLE_GAME": {
+ "label": "CeladonMart3FPuzzleGameText",
+ "text": "_CeladonMart3FPuzzleGameText"
+ },
+ "TEXT_CELADONMART3F_RPG": {
+ "label": "CeladonMart3FRPGText",
+ "text": "_CeladonMart3FRPGText"
+ },
+ "TEXT_CELADONMART3F_SNES1": {
+ "label": "CeladonMart3FSNESText",
+ "text": "_CeladonMart3FSNESText"
+ },
+ "TEXT_CELADONMART3F_SNES2": {
+ "label": "CeladonMart3FSNESText",
+ "text": "_CeladonMart3FSNESText"
+ },
+ "TEXT_CELADONMART3F_SNES3": {
+ "label": "CeladonMart3FSNESText",
+ "text": "_CeladonMart3FSNESText"
+ },
+ "TEXT_CELADONMART3F_SNES4": {
+ "label": "CeladonMart3FSNESText",
+ "text": "_CeladonMart3FSNESText"
+ },
+ "TEXT_CELADONMART3F_SPORTS_GAME": {
+ "label": "CeladonMart3FSportsGameText",
+ "text": "_CeladonMart3FSportsGameText"
+ }
+ },
+ "CeladonMart4F": {
+ "TEXT_CELADONMART4F_CLERK": {
+ "label": "CeladonMart4FClerkText",
+ "mart": [
+ "POKE_DOLL",
+ "FIRE_STONE",
+ "THUNDER_STONE",
+ "WATER_STONE",
+ "LEAF_STONE"
+ ]
+ },
+ "TEXT_CELADONMART4F_CURRENT_FLOOR_SIGN": {
+ "label": "CeladonMart4FCurrentFloorSignText",
+ "text": "_CeladonMart4FCurrentFloorSignText"
+ },
+ "TEXT_CELADONMART4F_SUPER_NERD": {
+ "label": "CeladonMart4FSuperNerdText",
+ "text": "_CeladonMart4FSuperNerdText"
+ },
+ "TEXT_CELADONMART4F_YOUNGSTER": {
+ "label": "CeladonMart4FYoungsterText",
+ "text": "_CeladonMart4FYoungsterText"
+ }
+ },
+ "CeladonMart5F": {
+ "TEXT_CELADONMART5F_CLERK1": {
+ "label": "CeladonMart5FClerk1Text",
+ "mart": [
+ "X_ACCURACY",
+ "GUARD_SPEC",
+ "DIRE_HIT",
+ "X_ATTACK",
+ "X_DEFEND",
+ "X_SPEED",
+ "X_SPECIAL"
+ ]
+ },
+ "TEXT_CELADONMART5F_CLERK2": {
+ "label": "CeladonMart5FClerk2Text",
+ "mart": [
+ "HP_UP",
+ "PROTEIN",
+ "IRON",
+ "CARBOS",
+ "CALCIUM"
+ ]
+ },
+ "TEXT_CELADONMART5F_CURRENT_FLOOR_SIGN": {
+ "label": "CeladonMart5FCurrentFloorSignText",
+ "text": "_CeladonMart5FCurrentFloorSignText"
+ },
+ "TEXT_CELADONMART5F_GENTLEMAN": {
+ "label": "CeladonMart5FGentlemanText",
+ "text": "_CeladonMart5FGentlemanText"
+ },
+ "TEXT_CELADONMART5F_SAILOR": {
+ "label": "CeladonMart5FSailorText",
+ "text": "_CeladonMart5FSailorText"
+ }
+ },
+ "CeladonMartElevator": {
+ "TEXT_CELADONMARTELEVATOR": {
+ "asm": true,
+ "label": "CeladonMartElevatorText"
+ }
+ },
+ "CeladonMartRoof": {
+ "TEXT_CELADONMARTROOF_CURRENT_FLOOR_SIGN": {
+ "label": "CeladonMartRoofCurrentFloorSignText",
+ "text": "_CeladonMartRoofCurrentFloorSignText"
+ },
+ "TEXT_CELADONMARTROOF_LITTLE_GIRL": {
+ "asm": true,
+ "label": "CeladonMartRoofLittleGirlText",
+ "text": "_CeladonMartRoofLittleGirlImThirstyText"
+ },
+ "TEXT_CELADONMARTROOF_SUPER_NERD": {
+ "label": "CeladonMartRoofSuperNerdText",
+ "text": "_CeladonMartRoofSuperNerdText"
+ },
+ "TEXT_CELADONMARTROOF_VENDING_MACHINE1": {
+ "label": "CeladonMartRoofVendingMachineText"
+ },
+ "TEXT_CELADONMARTROOF_VENDING_MACHINE2": {
+ "label": "CeladonMartRoofVendingMachineText"
+ },
+ "TEXT_CELADONMARTROOF_VENDING_MACHINE3": {
+ "label": "CeladonMartRoofVendingMachineText"
+ }
+ },
+ "CeladonPokecenter": {
+ "TEXT_CELADONPOKECENTER_BEAUTY": {
+ "label": "CeladonPokecenterBeautyText",
+ "text": "_CeladonPokecenterBeautyText"
+ },
+ "TEXT_CELADONPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "CeladonPokecenterChanseyText"
+ },
+ "TEXT_CELADONPOKECENTER_GENTLEMAN": {
+ "label": "CeladonPokecenterGentlemanText",
+ "text": "_CeladonPokecenterGentlemanText"
+ },
+ "TEXT_CELADONPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "CeladonPokecenterLinkReceptionistText"
+ },
+ "TEXT_CELADONPOKECENTER_NURSE": {
+ "label": "CeladonPokecenterNurseText",
+ "nurse": true
+ }
+ },
+ "CeruleanBadgeHouse": {
+ "TEXT_CERULEANBADGEHOUSE_MIDDLE_AGED_MAN": {
+ "asm": true,
+ "label": "CeruleanBadgeHouseMiddleAgedManText",
+ "text": "_CeruleanBadgeHouseMiddleAgedManText"
+ }
+ },
+ "CeruleanCave1F": {
+ "TEXT_CERULEANCAVE1F_MAX_ELIXER": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_CERULEANCAVE1F_MAX_REVIVE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_CERULEANCAVE1F_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_CERULEANCAVE1F_ULTRA_BALL": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "CeruleanCave2F": {
+ "TEXT_CERULEANCAVE2F_FULL_RESTORE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_CERULEANCAVE2F_MAX_REVIVE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_CERULEANCAVE2F_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_CERULEANCAVE2F_ULTRA_BALL": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "CeruleanCaveB1F": {
+ "TEXT_CERULEANCAVEB1F_MAX_ELIXER": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_CERULEANCAVEB1F_MAX_REVIVE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_CERULEANCAVEB1F_MEWTWO": {
+ "asm": true,
+ "label": "CeruleanCaveB1FMewtwoText"
+ },
+ "TEXT_CERULEANCAVEB1F_ULTRA_BALL1": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_CERULEANCAVEB1F_ULTRA_BALL2": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "CeruleanCity": {
+ "TEXT_CERULEANCITY_BIKESHOP_SIGN": {
+ "label": "CeruleanCityBikeShopSign",
+ "text": "_CeruleanCityBikeShopSign"
+ },
+ "TEXT_CERULEANCITY_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "CeruleanCityCooltrainerF1Text",
+ "text": "_CeruleanCityCooltrainerF1ElectrodeUseSonicboomText"
+ },
+ "TEXT_CERULEANCITY_COOLTRAINER_F2": {
+ "label": "CeruleanCityCooltrainerF2Text",
+ "text": "_CeruleanCityCooltrainerF2Text"
+ },
+ "TEXT_CERULEANCITY_COOLTRAINER_M": {
+ "label": "CeruleanCityCooltrainerMText",
+ "text": "_CeruleanCityCooltrainerMText"
+ },
+ "TEXT_CERULEANCITY_ELECTRODE": {
+ "asm": true,
+ "label": "CeruleanCityElectrodeText",
+ "text": "_CeruleanCityElectrodeTookASnoozeText"
+ },
+ "TEXT_CERULEANCITY_GUARD1": {
+ "label": "CeruleanCityGuardText",
+ "text": "_CeruleanCityGuardText"
+ },
+ "TEXT_CERULEANCITY_GUARD2": {
+ "label": "CeruleanCityGuardText",
+ "text": "_CeruleanCityGuardText"
+ },
+ "TEXT_CERULEANCITY_GYM_SIGN": {
+ "label": "CeruleanCityGymSign",
+ "text": "_CeruleanCityGymSign"
+ },
+ "TEXT_CERULEANCITY_MART_SIGN": {
+ "asm": true,
+ "label": "MartSignText"
+ },
+ "TEXT_CERULEANCITY_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_CERULEANCITY_RIVAL": {
+ "asm": true,
+ "label": "CeruleanCityRivalText",
+ "text": "_CeruleanCityRivalPreBattleText"
+ },
+ "TEXT_CERULEANCITY_ROCKET": {
+ "asm": true,
+ "label": "CeruleanCityRocketText",
+ "text": "_CeruleanCityRocketText"
+ },
+ "TEXT_CERULEANCITY_SIGN": {
+ "label": "CeruleanCitySignText",
+ "text": "_CeruleanCitySignText"
+ },
+ "TEXT_CERULEANCITY_SUPER_NERD1": {
+ "label": "CeruleanCitySuperNerd1Text",
+ "text": "_CeruleanCitySuperNerd1Text"
+ },
+ "TEXT_CERULEANCITY_SUPER_NERD2": {
+ "label": "CeruleanCitySuperNerd2Text",
+ "text": "_CeruleanCitySuperNerd2Text"
+ },
+ "TEXT_CERULEANCITY_SUPER_NERD3": {
+ "label": "CeruleanCitySuperNerd3Text",
+ "text": "_CeruleanCitySuperNerd3Text"
+ },
+ "TEXT_CERULEANCITY_TRAINER_TIPS": {
+ "label": "CeruleanCityTrainerTipsText",
+ "text": "_CeruleanCityTrainerTipsText"
+ }
+ },
+ "CeruleanGym": {
+ "TEXT_CERULEANGYM_COOLTRAINER_F": {
+ "asm": true,
+ "label": "CeruleanGymCooltrainerFText"
+ },
+ "TEXT_CERULEANGYM_GYM_GUIDE": {
+ "asm": true,
+ "label": "CeruleanGymGymGuideText",
+ "text": "_CeruleanGymGymGuideChampInMakingText"
+ },
+ "TEXT_CERULEANGYM_MISTY": {
+ "asm": true,
+ "label": "CeruleanGymMistyText",
+ "text": "_CeruleanGymMistyPreBattleText"
+ },
+ "TEXT_CERULEANGYM_MISTY_CASCADE_BADGE_INFO": {
+ "label": "CeruleanGymMistyCascadeBadgeInfoText",
+ "text": "_CeruleanGymMistyCascadeBadgeInfoText"
+ },
+ "TEXT_CERULEANGYM_MISTY_RECEIVED_TM11": {
+ "label": "CeruleanGymMistyReceivedTM11Text",
+ "text": "_CeruleanGymMistyReceivedTM11Text"
+ },
+ "TEXT_CERULEANGYM_MISTY_TM11_NO_ROOM": {
+ "label": "CeruleanGymMistyTM11NoRoomText",
+ "text": "_CeruleanGymMistyTM11NoRoomText"
+ },
+ "TEXT_CERULEANGYM_SWIMMER": {
+ "asm": true,
+ "label": "CeruleanGymSwimmerText"
+ }
+ },
+ "CeruleanMart": {
+ "TEXT_CERULEANMART_CLERK": {
+ "label": "CeruleanMartClerkText",
+ "mart": [
+ "POKE_BALL",
+ "POTION",
+ "ESCAPE_ROPE",
+ "REPEL",
+ "ANTIDOTE",
+ "BURN_HEAL",
+ "AWAKENING",
+ "PARLYZ_HEAL"
+ ]
+ },
+ "TEXT_CERULEANMART_COOLTRAINER_F": {
+ "label": "CeruleanMartCooltrainerFText",
+ "text": "_CeruleanMartCooltrainerFText"
+ },
+ "TEXT_CERULEANMART_COOLTRAINER_M": {
+ "label": "CeruleanMartCooltrainerMText",
+ "text": "_CeruleanMartCooltrainerMText"
+ }
+ },
+ "CeruleanMelaniesHouse": {
+ "TEXT_CERULEANMELANIESHOUSE_BULBASAUR": {
+ "asm": true,
+ "label": "CeruleanMelanieHouseBulbasaurText",
+ "text": "MelanieBulbasaurText"
+ },
+ "TEXT_CERULEANMELANIESHOUSE_MELANIE": {
+ "asm": true,
+ "label": "CeruleanMelanieHouseMelanieText"
+ },
+ "TEXT_CERULEANMELANIESHOUSE_ODDISH": {
+ "asm": true,
+ "label": "CeruleanMelanieHouseOddishText",
+ "text": "MelanieOddishText"
+ },
+ "TEXT_CERULEANMELANIESHOUSE_SANDSHREW": {
+ "asm": true,
+ "label": "CeruleanMelanieHouseSandshrewText",
+ "text": "MelanieSandshrewText"
+ }
+ },
+ "CeruleanPokecenter": {
+ "TEXT_CERULEANPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "CeruleanPokecenterChanseyText"
+ },
+ "TEXT_CERULEANPOKECENTER_GENTLEMAN": {
+ "label": "CeruleanPokecenterGentlemanText",
+ "text": "_CeruleanPokecenterGentlemanText"
+ },
+ "TEXT_CERULEANPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "CeruleanPokecenterLinkReceptionistText"
+ },
+ "TEXT_CERULEANPOKECENTER_NURSE": {
+ "label": "CeruleanPokecenterNurseText",
+ "nurse": true
+ },
+ "TEXT_CERULEANPOKECENTER_SUPER_NERD": {
+ "label": "CeruleanPokecenterSuperNerdText",
+ "text": "_CeruleanPokecenterSuperNerdText"
+ }
+ },
+ "CeruleanTrashedHouse": {
+ "TEXT_CERULEANTRASHEDHOUSE_FISHING_GURU": {
+ "asm": true,
+ "label": "CeruleanTrashedHouseFishingGuruText",
+ "text": "_CeruleanTrashedHouseFishingGuruTheyStoleATMText"
+ },
+ "TEXT_CERULEANTRASHEDHOUSE_GIRL": {
+ "label": "CeruleanTrashedHouseGirlText",
+ "text": "_CeruleanTrashedHouseGirlText"
+ },
+ "TEXT_CERULEANTRASHEDHOUSE_WALL_HOLE": {
+ "label": "CeruleanTrashedHouseWallHoleText",
+ "text": "_CeruleanTrashedHouseWallHoleText"
+ }
+ },
+ "ChampionsRoom": {
+ "TEXT_CHAMPIONSROOM_OAK": {
+ "label": "ChampionsRoomOakText",
+ "text": "_ChampionsRoomOakText"
+ },
+ "TEXT_CHAMPIONSROOM_OAK_COME_WITH_ME": {
+ "label": "ChampionsRoomOakComeWithMeText",
+ "text": "_ChampionsRoomOakComeWithMeText"
+ },
+ "TEXT_CHAMPIONSROOM_OAK_CONGRATULATES_PLAYER": {
+ "asm": true,
+ "label": "ChampionsRoomOakCongratulatesPlayerText",
+ "text": "_ChampionsRoomOakCongratulatesPlayerText"
+ },
+ "TEXT_CHAMPIONSROOM_OAK_DISAPPOINTED_WITH_RIVAL": {
+ "label": "ChampionsRoomOakDisappointedWithRivalText",
+ "text": "_ChampionsRoomOakDisappointedWithRivalText"
+ },
+ "TEXT_CHAMPIONSROOM_RIVAL": {
+ "asm": true,
+ "label": "ChampionsRoomRivalText",
+ "text": "_ChampionsRoomRivalIntroText"
+ }
+ },
+ "CinnabarGym": {
+ "TEXT_CINNABARGYM_BLAINE": {
+ "asm": true,
+ "label": "CinnabarGymBlaineText",
+ "text": "_CinnabarGymBlainePreBattleText"
+ },
+ "TEXT_CINNABARGYM_BLAINE_RECEIVED_TM38": {
+ "label": "CinnabarGymBlaineReceivedTM38Text",
+ "text": "_CinnabarGymBlaineReceivedTM38Text"
+ },
+ "TEXT_CINNABARGYM_BLAINE_TM38_NO_ROOM": {
+ "label": "CinnabarGymBlaineTM38NoRoomText",
+ "text": "_CinnabarGymBlaineTM38NoRoomText"
+ },
+ "TEXT_CINNABARGYM_BLAINE_VOLCANO_BADGE_INFO": {
+ "label": "CinnabarGymBlaineVolcanoBadgeInfoText",
+ "text": "_CinnabarGymBlaineVolcanoBadgeInfoText"
+ },
+ "TEXT_CINNABARGYM_GYM_GUIDE": {
+ "asm": true,
+ "label": "CinnabarGymGymGuideText"
+ },
+ "TEXT_CINNABARGYM_SUPER_NERD1": {
+ "asm": true,
+ "label": "CinnabarGymSuperNerd1",
+ "text": "_CinnabarGymSuperNerd1BattleText"
+ },
+ "TEXT_CINNABARGYM_SUPER_NERD2": {
+ "asm": true,
+ "label": "CinnabarGymSuperNerd2",
+ "text": "_CinnabarGymSuperNerd2BattleText"
+ },
+ "TEXT_CINNABARGYM_SUPER_NERD3": {
+ "asm": true,
+ "label": "CinnabarGymSuperNerd3",
+ "text": "_CinnabarGymSuperNerd3BattleText"
+ },
+ "TEXT_CINNABARGYM_SUPER_NERD4": {
+ "asm": true,
+ "label": "CinnabarGymSuperNerd4",
+ "text": "_CinnabarGymSuperNerd4BattleText"
+ },
+ "TEXT_CINNABARGYM_SUPER_NERD5": {
+ "asm": true,
+ "label": "CinnabarGymSuperNerd5",
+ "text": "_CinnabarGymSuperNerd5BattleText"
+ },
+ "TEXT_CINNABARGYM_SUPER_NERD6": {
+ "asm": true,
+ "label": "CinnabarGymSuperNerd6",
+ "text": "_CinnabarGymSuperNerd6BattleText"
+ },
+ "TEXT_CINNABARGYM_SUPER_NERD7": {
+ "asm": true,
+ "label": "CinnabarGymSuperNerd7",
+ "text": "_CinnabarGymSuperNerd7BattleText"
+ }
+ },
+ "CinnabarIsland": {
+ "TEXT_CINNABARISLAND_DOOR_IS_LOCKED": {
+ "label": "CinnabarIslandDoorIsLockedText",
+ "text": "_CinnabarIslandDoorIsLockedText"
+ },
+ "TEXT_CINNABARISLAND_GAMBLER": {
+ "label": "CinnabarIslandGamblerText",
+ "text": "_CinnabarIslandGamblerText"
+ },
+ "TEXT_CINNABARISLAND_GIRL": {
+ "label": "CinnabarIslandGirlText",
+ "text": "_CinnabarIslandGirlText"
+ },
+ "TEXT_CINNABARISLAND_GYM_SIGN": {
+ "label": "CinnabarIslandGymSignText",
+ "text": "_CinnabarIslandGymSignText"
+ },
+ "TEXT_CINNABARISLAND_MART_SIGN": {
+ "asm": true,
+ "label": "MartSignText"
+ },
+ "TEXT_CINNABARISLAND_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_CINNABARISLAND_POKEMONLAB_SIGN": {
+ "label": "CinnabarIslandPokemonLabSignText",
+ "text": "_CinnabarIslandPokemonLabSignText"
+ },
+ "TEXT_CINNABARISLAND_SIGN": {
+ "label": "CinnabarIslandSignText",
+ "text": "_CinnabarIslandSignText"
+ }
+ },
+ "CinnabarLab": {
+ "TEXT_CINNABARLAB_FISHING_GURU": {
+ "label": "CinnabarLabFishingGuruText",
+ "text": "_CinnabarLabFishingGuruText"
+ },
+ "TEXT_CINNABARLAB_MEETING_ROOM_SIGN": {
+ "label": "CinnabarLabMeetingRoomSignText",
+ "text": "_CinnabarLabMeetingRoomSignText"
+ },
+ "TEXT_CINNABARLAB_PHOTO": {
+ "label": "CinnabarLabPhotoText",
+ "text": "_CinnabarLabPhotoText"
+ },
+ "TEXT_CINNABARLAB_R_AND_D_SIGN": {
+ "label": "CinnabarLabRAndDSignText",
+ "text": "_CinnabarLabRAndDSignText"
+ },
+ "TEXT_CINNABARLAB_TESTING_ROOM_SIGN": {
+ "label": "CinnabarLabTestingRoomSignText",
+ "text": "_CinnabarLabTestingRoomSignText"
+ }
+ },
+ "CinnabarLabFossilRoom": {
+ "TEXT_CINNABARLABFOSSILROOM_SCIENTIST1": {
+ "asm": true,
+ "label": "CinnabarLabFossilRoomScientist1Text",
+ "text": "_CinnabarLabFossilRoomScientist1Text"
+ },
+ "TEXT_CINNABARLABFOSSILROOM_SCIENTIST2": {
+ "asm": true,
+ "label": "CinnabarLabFossilRoomScientist2Text"
+ }
+ },
+ "CinnabarLabMetronomeRoom": {
+ "TEXT_CINNABARLABMETRONOMEROOM_AMBER_PIPE": {
+ "label": "CinnabarLabMetronomeRoomAmberPipeText",
+ "text": "_CinnabarLabMetronomeRoomAmberPipeText"
+ },
+ "TEXT_CINNABARLABMETRONOMEROOM_PC_KEYBOARD": {
+ "label": "CinnabarLabMetronomeRoomPCText",
+ "text": "_CinnabarLabMetronomeRoomPCText"
+ },
+ "TEXT_CINNABARLABMETRONOMEROOM_PC_MONITOR": {
+ "label": "CinnabarLabMetronomeRoomPCText",
+ "text": "_CinnabarLabMetronomeRoomPCText"
+ },
+ "TEXT_CINNABARLABMETRONOMEROOM_SCIENTIST1": {
+ "asm": true,
+ "label": "CinnabarLabMetronomeRoomScientist1Text",
+ "text": "_CinnabarLabMetronomeRoomScientist1Text"
+ },
+ "TEXT_CINNABARLABMETRONOMEROOM_SCIENTIST2": {
+ "label": "CinnabarLabMetronomeRoomScientist2Text",
+ "text": "_CinnabarLabMetronomeRoomScientist2Text"
+ }
+ },
+ "CinnabarLabTradeRoom": {
+ "TEXT_CINNABARLABTRADEROOM_BEAUTY": {
+ "asm": true,
+ "label": "CinnabarLabTradeRoomBeautyText"
+ },
+ "TEXT_CINNABARLABTRADEROOM_GRAMPS": {
+ "asm": true,
+ "label": "CinnabarLabTradeRoomGrampsText"
+ },
+ "TEXT_CINNABARLABTRADEROOM_SUPER_NERD": {
+ "label": "CinnabarLabTradeRoomSuperNerdText",
+ "text": "_CinnabarLabTradeRoomSuperNerdText"
+ }
+ },
+ "CinnabarMart": {
+ "TEXT_CINNABARMART_CLERK": {
+ "label": "CinnabarMartClerkText",
+ "mart": [
+ "ULTRA_BALL",
+ "GREAT_BALL",
+ "HYPER_POTION",
+ "MAX_REPEL",
+ "ESCAPE_ROPE",
+ "FULL_HEAL",
+ "REVIVE"
+ ]
+ },
+ "TEXT_CINNABARMART_SCIENTIST": {
+ "label": "CinnabarMartScientistText",
+ "text": "_CinnabarMartScientistText"
+ },
+ "TEXT_CINNABARMART_SILPH_WORKER_F": {
+ "label": "CinnabarMartSilphWorkerFText",
+ "text": "_CinnabarMartSilphWorkerFText"
+ }
+ },
+ "CinnabarPokecenter": {
+ "TEXT_CINNABARPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "CinnabarPokecenterChanseyText"
+ },
+ "TEXT_CINNABARPOKECENTER_COOLTRAINER_F": {
+ "label": "CinnabarPokecenterCooltrainerFText",
+ "text": "_CinnabarPokecenterCooltrainerFText"
+ },
+ "TEXT_CINNABARPOKECENTER_GENTLEMAN": {
+ "label": "CinnabarPokecenterGentlemanText",
+ "text": "_CinnabarPokecenterGentlemanText"
+ },
+ "TEXT_CINNABARPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "CinnabarPokecenterLinkReceptionistText"
+ },
+ "TEXT_CINNABARPOKECENTER_NURSE": {
+ "label": "CinnabarPokecenterNurseText",
+ "nurse": true
+ }
+ },
+ "Colosseum": {
+ "TEXT_COLOSSEUM_OPPONENT": {
+ "label": "ColosseumOpponentText",
+ "text": "_ColosseumOpponentText"
+ }
+ },
+ "CopycatsHouse1F": {
+ "TEXT_COPYCATSHOUSE1F_CHANSEY": {
+ "asm": true,
+ "label": "CopycatsHouse1FChanseyText",
+ "text": "_CopycatsHouse1FChanseyText"
+ },
+ "TEXT_COPYCATSHOUSE1F_MIDDLE_AGED_MAN": {
+ "label": "CopycatsHouse1FMiddleAgedManText",
+ "text": "_CopycatsHouse1FMiddleAgedManText"
+ },
+ "TEXT_COPYCATSHOUSE1F_MIDDLE_AGED_WOMAN": {
+ "label": "CopycatsHouse1FMiddleAgedWomanText",
+ "text": "_CopycatsHouse1FMiddleAgedWomanText"
+ }
+ },
+ "CopycatsHouse2F": {
+ "TEXT_COPYCATSHOUSE2F_BIRD": {
+ "label": "CopycatsHouse2FRareDollText",
+ "text": "_CopycatsHouse2FRareDollText"
+ },
+ "TEXT_COPYCATSHOUSE2F_COPYCAT": {
+ "asm": true,
+ "label": "CopycatsHouse2FCopycatText",
+ "text": "_CopycatsHouse2FCopycatDoYouLikePokemonText"
+ },
+ "TEXT_COPYCATSHOUSE2F_DODUO": {
+ "label": "CopycatsHouse2FDoduoText",
+ "text": "_CopycatsHouse2FDoduoText"
+ },
+ "TEXT_COPYCATSHOUSE2F_FAIRY": {
+ "label": "CopycatsHouse2FRareDollText",
+ "text": "_CopycatsHouse2FRareDollText"
+ },
+ "TEXT_COPYCATSHOUSE2F_MONSTER": {
+ "label": "CopycatsHouse2FRareDollText",
+ "text": "_CopycatsHouse2FRareDollText"
+ },
+ "TEXT_COPYCATSHOUSE2F_PC": {
+ "asm": true,
+ "label": "CopycatsHouse2FPCText",
+ "text": "_CopycatsHouse2FPCMySecretsText"
+ },
+ "TEXT_COPYCATSHOUSE2F_SNES": {
+ "label": "CopycatsHouse2FSNESText",
+ "text": "_CopycatsHouse2FSNESText"
+ }
+ },
+ "Daycare": {
+ "TEXT_DAYCARE_GENTLEMAN": {
+ "asm": true,
+ "label": "DaycareGentlemanText",
+ "text": "_DaycareGentlemanIntroText"
+ }
+ },
+ "DiglettsCaveRoute11": {
+ "TEXT_DIGLETTSCAVEROUTE11_GAMBLER": {
+ "label": "DiglettsCaveRoute11GamblerText",
+ "text": "_DiglettsCaveRoute11GamblerText"
+ }
+ },
+ "DiglettsCaveRoute2": {
+ "TEXT_DIGLETTSCAVEROUTE2_FISHING_GURU": {
+ "label": "DiglettsCaveRoute2FishingGuruText",
+ "text": "_DiglettsCaveRoute2FishingGuruText"
+ }
+ },
+ "FightingDojo": {
+ "TEXT_FIGHTINGDOJO_BLACKBELT1": {
+ "asm": true,
+ "label": "FightingDojoBlackbelt1Text"
+ },
+ "TEXT_FIGHTINGDOJO_BLACKBELT2": {
+ "asm": true,
+ "label": "FightingDojoBlackbelt2Text"
+ },
+ "TEXT_FIGHTINGDOJO_BLACKBELT3": {
+ "asm": true,
+ "label": "FightingDojoBlackbelt3Text"
+ },
+ "TEXT_FIGHTINGDOJO_BLACKBELT4": {
+ "asm": true,
+ "label": "FightingDojoBlackbelt4Text"
+ },
+ "TEXT_FIGHTINGDOJO_HITMONCHAN_POKE_BALL": {
+ "asm": true,
+ "label": "FightingDojoHitmonchanPokeBallText",
+ "text": "_FightingDojoHitmonchanPokeBallText"
+ },
+ "TEXT_FIGHTINGDOJO_HITMONLEE_POKE_BALL": {
+ "asm": true,
+ "label": "FightingDojoHitmonleePokeBallText",
+ "text": "_FightingDojoHitmonleePokeBallText"
+ },
+ "TEXT_FIGHTINGDOJO_KARATE_MASTER": {
+ "asm": true,
+ "label": "FightingDojoKarateMasterText",
+ "text": "_FightingDojoKarateMasterText"
+ }
+ },
+ "FuchsiaBillsGrandpasHouse": {
+ "TEXT_FUCHSIABILLSGRANDPASHOUSE_BILLS_GRANDPA": {
+ "label": "FuchsiaBillsGrandpasHouseBillsGrandpaText",
+ "text": "_FuchsiaBillsGrandpasHouseBillsGrandpaText"
+ },
+ "TEXT_FUCHSIABILLSGRANDPASHOUSE_MIDDLE_AGED_WOMAN": {
+ "label": "FuchsiaBillsGrandpasHouseMiddleAgedWomanText",
+ "text": "_FuchsiaBillsGrandpasHouseMiddleAgedWomanText"
+ },
+ "TEXT_FUCHSIABILLSGRANDPASHOUSE_YOUNGSTER": {
+ "label": "FuchsiaBillsGrandpasHouseYoungsterText",
+ "text": "_FuchsiaBillsGrandpasHouseYoungsterText"
+ }
+ },
+ "FuchsiaCity": {
+ "TEXT_FUCHSIACITY_CHANSEY": {
+ "label": "FuchsiaCityPokemonText",
+ "text": "_FuchsiaCityPokemonText"
+ },
+ "TEXT_FUCHSIACITY_CHANSEY_SIGN": {
+ "asm": true,
+ "label": "FuchsiaCityChanseySignText",
+ "text": "_FuchsiaCityChanseySignText"
+ },
+ "TEXT_FUCHSIACITY_ERIK": {
+ "label": "FuchsiaCityErikText",
+ "text": "_FuchsiaCityErikText"
+ },
+ "TEXT_FUCHSIACITY_FOSSIL": {
+ "label": "FuchsiaCityPokemonText",
+ "text": "_FuchsiaCityPokemonText"
+ },
+ "TEXT_FUCHSIACITY_FOSSIL_SIGN": {
+ "asm": true,
+ "label": "FuchsiaCityFossilSignText",
+ "text": "_FuchsiaCityFossilSignOmanyteText"
+ },
+ "TEXT_FUCHSIACITY_GAMBLER": {
+ "label": "FuchsiaCityGamblerText",
+ "text": "_FuchsiaCityGamblerText"
+ },
+ "TEXT_FUCHSIACITY_GYM_SIGN": {
+ "label": "FuchsiaCityGymSignText",
+ "text": "_FuchsiaCityGymSignText"
+ },
+ "TEXT_FUCHSIACITY_KANGASKHAN": {
+ "label": "FuchsiaCityPokemonText",
+ "text": "_FuchsiaCityPokemonText"
+ },
+ "TEXT_FUCHSIACITY_KANGASKHAN_SIGN": {
+ "asm": true,
+ "label": "FuchsiaCityKangaskhanSignText",
+ "text": "_FuchsiaCityKangaskhanSignText"
+ },
+ "TEXT_FUCHSIACITY_LAPRAS": {
+ "label": "FuchsiaCityPokemonText",
+ "text": "_FuchsiaCityPokemonText"
+ },
+ "TEXT_FUCHSIACITY_LAPRAS_SIGN": {
+ "asm": true,
+ "label": "FuchsiaCityLaprasSignText",
+ "text": "_FuchsiaCityLaprasSignText"
+ },
+ "TEXT_FUCHSIACITY_MART_SIGN": {
+ "asm": true,
+ "label": "MartSignText"
+ },
+ "TEXT_FUCHSIACITY_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_FUCHSIACITY_SAFARI_GAME_SIGN": {
+ "label": "FuchsiaCitySafariGameSignText",
+ "text": "_FuchsiaCitySafariGameSignText"
+ },
+ "TEXT_FUCHSIACITY_SAFARI_ZONE_SIGN": {
+ "label": "FuchsiaCitySafariZoneSignText",
+ "text": "_FuchsiaCitySafariZoneSignText"
+ },
+ "TEXT_FUCHSIACITY_SIGN1": {
+ "label": "FuchsiaCitySignText",
+ "text": "_FuchsiaCitySignText"
+ },
+ "TEXT_FUCHSIACITY_SIGN2": {
+ "label": "FuchsiaCitySignText",
+ "text": "_FuchsiaCitySignText"
+ },
+ "TEXT_FUCHSIACITY_SLOWPOKE": {
+ "label": "FuchsiaCityPokemonText",
+ "text": "_FuchsiaCityPokemonText"
+ },
+ "TEXT_FUCHSIACITY_SLOWPOKE_SIGN": {
+ "asm": true,
+ "label": "FuchsiaCitySlowpokeSignText",
+ "text": "_FuchsiaCitySlowpokeSignText"
+ },
+ "TEXT_FUCHSIACITY_VOLTORB": {
+ "label": "FuchsiaCityPokemonText",
+ "text": "_FuchsiaCityPokemonText"
+ },
+ "TEXT_FUCHSIACITY_VOLTORB_SIGN": {
+ "asm": true,
+ "label": "FuchsiaCityVoltorbSignText",
+ "text": "_FuchsiaCityVoltorbSignText"
+ },
+ "TEXT_FUCHSIACITY_WARDENS_HOME_SIGN": {
+ "label": "FuchsiaCityWardensHomeSignText",
+ "text": "_FuchsiaCityWardensHomeSignText"
+ },
+ "TEXT_FUCHSIACITY_YOUNGSTER1": {
+ "label": "FuchsiaCityYoungster1Text",
+ "text": "_FuchsiaCityYoungster1Text"
+ },
+ "TEXT_FUCHSIACITY_YOUNGSTER2": {
+ "label": "FuchsiaCityYoungster2Text",
+ "text": "_FuchsiaCityYoungster2Text"
+ }
+ },
+ "FuchsiaGoodRodHouse": {
+ "TEXT_FUCHSIAGOODRODHOUSE_FISHING_GURU": {
+ "asm": true,
+ "label": "FuchsiaGoodRodHouseFishingGuruText",
+ "text": "_FuchsiaGoodRodHouseFishingGuruText"
+ }
+ },
+ "FuchsiaGym": {
+ "TEXT_FUCHSIAGYM_GYM_GUIDE": {
+ "asm": true,
+ "label": "FuchsiaGymGymGuideText",
+ "text": "_FuchsiaGymGymGuideChampInMakingText"
+ },
+ "TEXT_FUCHSIAGYM_KOGA": {
+ "asm": true,
+ "label": "FuchsiaGymKogaText",
+ "text": "_FuchsiaGymKogaBeforeBattleText"
+ },
+ "TEXT_FUCHSIAGYM_KOGA_RECEIVED_TM06": {
+ "label": "FuchsiaGymKogaReceivedTM06Text",
+ "text": "_FuchsiaGymKogaReceivedTM06Text"
+ },
+ "TEXT_FUCHSIAGYM_KOGA_SOUL_BADGE_INFO": {
+ "label": "FuchsiaGymKogaSoulBadgeInfoText",
+ "text": "_FuchsiaGymKogaSoulBadgeInfoText"
+ },
+ "TEXT_FUCHSIAGYM_KOGA_TM06_NO_ROOM": {
+ "label": "FuchsiaGymKogaTM06NoRoomText",
+ "text": "_FuchsiaGymKogaTM06NoRoomText"
+ },
+ "TEXT_FUCHSIAGYM_ROCKER1": {
+ "asm": true,
+ "label": "FuchsiaGymRocker1Text"
+ },
+ "TEXT_FUCHSIAGYM_ROCKER2": {
+ "asm": true,
+ "label": "FuchsiaGymRocker2Text"
+ },
+ "TEXT_FUCHSIAGYM_ROCKER3": {
+ "asm": true,
+ "label": "FuchsiaGymRocker3Text"
+ },
+ "TEXT_FUCHSIAGYM_ROCKER4": {
+ "asm": true,
+ "label": "FuchsiaGymRocker4Text"
+ },
+ "TEXT_FUCHSIAGYM_ROCKER5": {
+ "asm": true,
+ "label": "FuchsiaGymRocker5Text"
+ },
+ "TEXT_FUCHSIAGYM_ROCKER6": {
+ "asm": true,
+ "label": "FuchsiaGymRocker6Text"
+ }
+ },
+ "FuchsiaMart": {
+ "TEXT_FUCHSIAMART_CLERK": {
+ "label": "FuchsiaMartClerkText",
+ "mart": [
+ "ULTRA_BALL",
+ "GREAT_BALL",
+ "HYPER_POTION",
+ "REVIVE",
+ "FULL_HEAL",
+ "SUPER_REPEL"
+ ]
+ },
+ "TEXT_FUCHSIAMART_COOLTRAINER_F": {
+ "label": "FuchsiaMartCooltrainerFText",
+ "text": "_FuchsiaMartCooltrainerFText"
+ },
+ "TEXT_FUCHSIAMART_MIDDLE_AGED_MAN": {
+ "label": "FuchsiaMartMiddleAgedManText",
+ "text": "_FuchsiaMartMiddleAgedManText"
+ }
+ },
+ "FuchsiaMeetingRoom": {
+ "TEXT_FUCHSIAMEETINGROOM_SAFARI_ZONE_WORKER1": {
+ "label": "FuchsiaMeetingRoomSafariZoneWorker1",
+ "text": "_FuchsiaMeetingRoomSafariZoneWorker1"
+ },
+ "TEXT_FUCHSIAMEETINGROOM_SAFARI_ZONE_WORKER2": {
+ "label": "FuchsiaMeetingRoomSafariZoneWorker2",
+ "text": "_FuchsiaMeetingRoomSafariZoneWorker2"
+ },
+ "TEXT_FUCHSIAMEETINGROOM_SAFARI_ZONE_WORKER3": {
+ "label": "FuchsiaMeetingRoomSafariZoneWorker3",
+ "text": "_FuchsiaMeetingRoomSafariZoneWorker3"
+ }
+ },
+ "FuchsiaPokecenter": {
+ "TEXT_FUCHSIAPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "FuchsiaPokecenterChanseyText"
+ },
+ "TEXT_FUCHSIAPOKECENTER_COOLTRAINER_F": {
+ "label": "FuchsiaPokecenterCooltrainerFText",
+ "text": "_FuchsiaPokecenterCooltrainerFText"
+ },
+ "TEXT_FUCHSIAPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "FuchsiaPokecenterLinkReceptionistText"
+ },
+ "TEXT_FUCHSIAPOKECENTER_NURSE": {
+ "label": "FuchsiaPokecenterNurseText",
+ "nurse": true
+ },
+ "TEXT_FUCHSIAPOKECENTER_ROCKER": {
+ "label": "FuchsiaPokecenterRockerText",
+ "text": "_FuchsiaPokecenterRockerText"
+ }
+ },
+ "GameCorner": {
+ "TEXT_GAMECORNER_BEAUTY1": {
+ "label": "GameCornerBeauty1Text",
+ "text": "_GameCornerBeauty1Text"
+ },
+ "TEXT_GAMECORNER_BEAUTY2": {
+ "label": "GameCornerBeauty2Text",
+ "text": "_GameCornerBeauty2Text"
+ },
+ "TEXT_GAMECORNER_CLERK": {
+ "asm": true,
+ "label": "GameCornerClerkText",
+ "text": "_GameCornerClerkDoYouNeedSomeGameCoinsText"
+ },
+ "TEXT_GAMECORNER_FISHING_GURU1": {
+ "asm": true,
+ "label": "GameCornerFishingGuru1Text",
+ "text": "_GameCornerFishingGuru1WantToPlayText"
+ },
+ "TEXT_GAMECORNER_FISHING_GURU2": {
+ "asm": true,
+ "label": "GameCornerFishingGuru2Text",
+ "text": "_GameCornerFishingGuru2ThrowingMeOffText"
+ },
+ "TEXT_GAMECORNER_GAMBLER": {
+ "label": "GameCornerGamblerText",
+ "text": "_GameCornerGamblerText"
+ },
+ "TEXT_GAMECORNER_GYM_GUIDE": {
+ "asm": true,
+ "label": "GameCornerGymGuideText"
+ },
+ "TEXT_GAMECORNER_MIDDLE_AGED_MAN1": {
+ "label": "GameCornerMiddleAgedMan1Text",
+ "text": "_GameCornerMiddleAgedMan1Text"
+ },
+ "TEXT_GAMECORNER_MIDDLE_AGED_MAN2": {
+ "asm": true,
+ "label": "GameCornerMiddleAgedMan2Text",
+ "text": "_GameCornerMiddleAgedMan2WantSomeCoinsText"
+ },
+ "TEXT_GAMECORNER_MIDDLE_AGED_WOMAN": {
+ "label": "GameCornerMiddleAgedWomanText",
+ "text": "_GameCornerMiddleAgedWomanText"
+ },
+ "TEXT_GAMECORNER_POSTER": {
+ "asm": true,
+ "label": "GameCornerPosterText",
+ "text": "_GameCornerPosterSwitchBehindPosterText"
+ },
+ "TEXT_GAMECORNER_ROCKET": {
+ "asm": true,
+ "label": "GameCornerRocketText",
+ "text": "_GameCornerRocketImGuardingThisPosterText"
+ },
+ "TEXT_GAMECORNER_ROCKET_AFTER_BATTLE": {
+ "label": "GameCornerRocketAfterBattleText",
+ "text": "_GameCornerRocketAfterBattleText"
+ }
+ },
+ "GameCornerPrizeRoom": {
+ "TEXT_GAMECORNERPRIZEROOM_BALDING_GUY": {
+ "label": "GameCornerPrizeRoomBaldingGuyText",
+ "text": "_GameCornerPrizeRoomBaldingGuyText"
+ },
+ "TEXT_GAMECORNERPRIZEROOM_GAMBLER": {
+ "label": "GameCornerPrizeRoomGamblerText",
+ "text": "_GameCornerPrizeRoomGamblerText"
+ },
+ "TEXT_GAMECORNERPRIZEROOM_PRIZE_VENDOR_1": {
+ "label": "GameCornerPRizeRoomPrizeVendorText"
+ },
+ "TEXT_GAMECORNERPRIZEROOM_PRIZE_VENDOR_2": {
+ "label": "GameCornerPRizeRoomPrizeVendorText"
+ },
+ "TEXT_GAMECORNERPRIZEROOM_PRIZE_VENDOR_3": {
+ "label": "GameCornerPRizeRoomPrizeVendorText"
+ }
+ },
+ "HallOfFame": {
+ "TEXT_HALLOFFAME_OAK": {
+ "label": "HallOfFameOakText",
+ "text": "_HallOfFameOakText"
+ }
+ },
+ "IndigoPlateauLobby": {
+ "TEXT_INDIGOPLATEAULOBBY_CHANSEY": {
+ "asm": true,
+ "label": "IndigoPlateauLobbyChanseyText"
+ },
+ "TEXT_INDIGOPLATEAULOBBY_CLERK": {
+ "label": "IndigoPlateauLobbyClerkText",
+ "mart": [
+ "ULTRA_BALL",
+ "GREAT_BALL",
+ "FULL_RESTORE",
+ "MAX_POTION",
+ "FULL_HEAL",
+ "REVIVE",
+ "MAX_REPEL"
+ ]
+ },
+ "TEXT_INDIGOPLATEAULOBBY_COOLTRAINER_F": {
+ "label": "IndigoPlateauLobbyCooltrainerFText",
+ "text": "_IndigoPlateauLobbyCooltrainerFText"
+ },
+ "TEXT_INDIGOPLATEAULOBBY_GYM_GUIDE": {
+ "label": "IndigoPlateauLobbyGymGuideText",
+ "text": "_IndigoPlateauLobbyGymGuideText"
+ },
+ "TEXT_INDIGOPLATEAULOBBY_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "IndigoPlateauLobbyLinkReceptionistText"
+ },
+ "TEXT_INDIGOPLATEAULOBBY_NURSE": {
+ "label": "IndigoPlateauLobbyNurseText",
+ "nurse": true
+ }
+ },
+ "LancesRoom": {
+ "TEXT_LANCESROOM_LANCE": {
+ "asm": true,
+ "label": "LancesRoomLanceText"
+ }
+ },
+ "LavenderCuboneHouse": {
+ "TEXT_LAVENDERCUBONEHOUSE_BRUNETTE_GIRL": {
+ "asm": true,
+ "label": "LavenderCuboneHouseBrunetteGirlText",
+ "text": "_LavenderCuboneHouseBrunetteGirlPoorCubonesMotherText"
+ },
+ "TEXT_LAVENDERCUBONEHOUSE_CUBONE": {
+ "asm": true,
+ "label": "LavenderCuboneHouseCuboneText",
+ "text": "_LavenderCuboneHouseCuboneText"
+ }
+ },
+ "LavenderMart": {
+ "TEXT_LAVENDERMART_BALDING_GUY": {
+ "label": "LavenderMartBaldingGuyText",
+ "text": "_LavenderMartBaldingGuyText"
+ },
+ "TEXT_LAVENDERMART_CLERK": {
+ "label": "LavenderMartClerkText",
+ "mart": [
+ "GREAT_BALL",
+ "SUPER_POTION",
+ "REVIVE",
+ "ESCAPE_ROPE",
+ "SUPER_REPEL",
+ "ANTIDOTE",
+ "BURN_HEAL",
+ "ICE_HEAL",
+ "PARLYZ_HEAL"
+ ]
+ },
+ "TEXT_LAVENDERMART_COOLTRAINER_M": {
+ "asm": true,
+ "label": "LavenderMartCooltrainerMText",
+ "text": "_LavenderMartCooltrainerMReviveText"
+ }
+ },
+ "LavenderPokecenter": {
+ "TEXT_LAVENDERPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "LavenderPokecenterChanseyText"
+ },
+ "TEXT_LAVENDERPOKECENTER_GENTLEMAN": {
+ "label": "LavenderPokecenterGentlemanText",
+ "text": "_LavenderPokecenterGentlemanText"
+ },
+ "TEXT_LAVENDERPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "LavenderPokecenterLinkReceptionistText"
+ },
+ "TEXT_LAVENDERPOKECENTER_LITTLE_GIRL": {
+ "label": "LavenderPokecenterLittleGirlText",
+ "text": "_LavenderPokecenterLittleGirlText"
+ },
+ "TEXT_LAVENDERPOKECENTER_NURSE": {
+ "label": "LavenderPokecenterNurseText",
+ "nurse": true
+ }
+ },
+ "LavenderTown": {
+ "TEXT_LAVENDERTOWN_COOLTRAINER_M": {
+ "label": "LavenderTownCooltrainerMText",
+ "text": "_LavenderTownCooltrainerMText"
+ },
+ "TEXT_LAVENDERTOWN_LITTLE_GIRL": {
+ "asm": true,
+ "label": "LavenderTownLittleGirlText",
+ "text": "_LavenderTownLittleGirlDoYouBelieveInGhostsText"
+ },
+ "TEXT_LAVENDERTOWN_MART_SIGN": {
+ "asm": true,
+ "label": "MartSignText"
+ },
+ "TEXT_LAVENDERTOWN_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_LAVENDERTOWN_POKEMON_HOUSE_SIGN": {
+ "label": "LavenderTownPokemonHouseSignText",
+ "text": "_LavenderTownPokemonHouseSignText"
+ },
+ "TEXT_LAVENDERTOWN_POKEMON_TOWER_SIGN": {
+ "label": "LavenderTownPokemonTowerSignText",
+ "text": "_LavenderTownPokemonTowerSignText"
+ },
+ "TEXT_LAVENDERTOWN_SIGN": {
+ "label": "LavenderTownSignText",
+ "text": "_LavenderTownSignText"
+ },
+ "TEXT_LAVENDERTOWN_SILPH_SCOPE_SIGN": {
+ "label": "LavenderTownSilphScopeSignText",
+ "text": "_LavenderTownSilphScopeSignText"
+ },
+ "TEXT_LAVENDERTOWN_SUPER_NERD": {
+ "label": "LavenderTownSuperNerdText",
+ "text": "_LavenderTownSuperNerdText"
+ }
+ },
+ "LoreleisRoom": {
+ "TEXT_LORELEISROOM_DONT_RUN_AWAY": {
+ "label": "LoreleisRoomLoreleiDontRunAwayText",
+ "text": "_LoreleisRoomLoreleiDontRunAwayText"
+ },
+ "TEXT_LORELEISROOM_LORELEI": {
+ "asm": true,
+ "label": "LoreleisRoomLoreleiText"
+ }
+ },
+ "MrFujisHouse": {
+ "TEXT_MRFUJISHOUSE_LITTLE_GIRL": {
+ "asm": true,
+ "label": "MrFujisHouseLittleGirlText",
+ "text": "_MrFujisHouseLittleGirlThisIsMrFujisHouseText"
+ },
+ "TEXT_MRFUJISHOUSE_MR_FUJI": {
+ "asm": true,
+ "label": "MrFujisHouseMrFujiText",
+ "text": "_MrFujisHouseMrFujiIThinkThisMayHelpYourQuestText"
+ },
+ "TEXT_MRFUJISHOUSE_NIDORINO": {
+ "asm": true,
+ "label": "MrFujisHouseNidorinoText",
+ "text": "_MrFujisHouseNidorinoText"
+ },
+ "TEXT_MRFUJISHOUSE_POKEDEX": {
+ "label": "MrFujisHouseMrFujiPokedexText",
+ "text": "_MrFujisHouseMrFujiPokedexText"
+ },
+ "TEXT_MRFUJISHOUSE_PSYDUCK": {
+ "asm": true,
+ "label": "MrFujisHousePsyduckText",
+ "text": "_MrFujisHousePsyduckText"
+ },
+ "TEXT_MRFUJISHOUSE_SUPER_NERD": {
+ "asm": true,
+ "label": "MrFujisHouseSuperNerdText",
+ "text": "_MrFujisHouseSuperNerdMrFujiIsntHereText"
+ }
+ },
+ "MrPsychicsHouse": {
+ "TEXT_MRPSYCHICSHOUSE_MR_PSYCHIC": {
+ "asm": true,
+ "label": "MrPsychicsHouseMrPsychicText",
+ "text": "_MrPsychicsHouseMrPsychicYouWantedThisText"
+ }
+ },
+ "MtMoon1F": {
+ "TEXT_MTMOON1F_BEWARE_ZUBAT_SIGN": {
+ "label": "MtMoon1FBewareZubatSign",
+ "text": "_MtMoon1FBewareZubatSign"
+ },
+ "TEXT_MTMOON1F_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "MtMoon1FCooltrainerF1Text"
+ },
+ "TEXT_MTMOON1F_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "MtMoon1FCooltrainerF2Text"
+ },
+ "TEXT_MTMOON1F_ESCAPE_ROPE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_MTMOON1F_HIKER": {
+ "asm": true,
+ "label": "MtMoon1FHikerText"
+ },
+ "TEXT_MTMOON1F_MOON_STONE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_MTMOON1F_POTION1": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_MTMOON1F_POTION2": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_MTMOON1F_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_MTMOON1F_SUPER_NERD": {
+ "asm": true,
+ "label": "MtMoon1FSuperNerdText"
+ },
+ "TEXT_MTMOON1F_TM_WATER_GUN": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_MTMOON1F_YOUNGSTER1": {
+ "asm": true,
+ "label": "MtMoon1FYoungster1Text"
+ },
+ "TEXT_MTMOON1F_YOUNGSTER2": {
+ "asm": true,
+ "label": "MtMoon1FYoungster2Text"
+ },
+ "TEXT_MTMOON1F_YOUNGSTER3": {
+ "asm": true,
+ "label": "MtMoon1FYoungster3Text"
+ }
+ },
+ "MtMoonB1F": {
+ "TEXT_MTMOONB1F_UNUSED": {
+ "label": "MtMoonB1FUnusedText",
+ "text": "_MtMoonB1FUnusedText"
+ }
+ },
+ "MtMoonB2F": {
+ "TEXT_MTMOONB2F_DOME_FOSSIL": {
+ "asm": true,
+ "label": "MtMoonB2FDomeFossilText",
+ "text": "_MtMoonB2FDomeFossilYouWantText"
+ },
+ "TEXT_MTMOONB2F_HELIX_FOSSIL": {
+ "asm": true,
+ "label": "MtMoonB2FHelixFossilText",
+ "text": "_MtMoonB2FHelixFossilYouWantText"
+ },
+ "TEXT_MTMOONB2F_HP_UP": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_MTMOONB2F_JAMES": {
+ "label": "MtMoonB2FJessieJamesText"
+ },
+ "TEXT_MTMOONB2F_JESSIE": {
+ "label": "MtMoonB2FJessieJamesText"
+ },
+ "TEXT_MTMOONB2F_ROCKET1": {
+ "asm": true,
+ "label": "MtMoonB2FRocket1Text"
+ },
+ "TEXT_MTMOONB2F_ROCKET2": {
+ "asm": true,
+ "label": "MtMoonB2FRocket2Text"
+ },
+ "TEXT_MTMOONB2F_ROCKET3": {
+ "asm": true,
+ "label": "MtMoonB2FRocket3Text"
+ },
+ "TEXT_MTMOONB2F_SUPER_NERD": {
+ "asm": true,
+ "label": "MtMoonB2FSuperNerdText"
+ },
+ "TEXT_MTMOONB2F_SUPER_NERD_THEN_THIS_IS_MINE": {
+ "label": "MtMoonB2FSuperNerdThenThisIsMineText",
+ "text": "_MtMoonB2FSuperNerdThenThisIsMineText"
+ },
+ "TEXT_MTMOONB2F_TEXT12": {
+ "asm": true,
+ "label": "MtMoonB2FText12",
+ "text": "_MtMoonJessieJamesText1"
+ },
+ "TEXT_MTMOONB2F_TEXT13": {
+ "label": "MtMoonB2FText13",
+ "text": "_MtMoonJessieJamesText2"
+ },
+ "TEXT_MTMOONB2F_TEXT14": {
+ "asm": true,
+ "label": "MtMoonB2FText14",
+ "text": "_MtMoonJessieJamesText4"
+ },
+ "TEXT_MTMOONB2F_TM_MEGA_PUNCH": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "MtMoonPokecenter": {
+ "TEXT_MTMOONPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "MtMoonPokecenterChanseyText"
+ },
+ "TEXT_MTMOONPOKECENTER_CLIPBOARD": {
+ "label": "MtMoonPokecenterClipboardText",
+ "text": "_MtMoonPokecenterClipboardText"
+ },
+ "TEXT_MTMOONPOKECENTER_GENTLEMAN": {
+ "label": "MtMoonPokecenterGentlemanText",
+ "text": "_MtMoonPokecenterGentlemanText"
+ },
+ "TEXT_MTMOONPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "MtMoonPokecenterLinkReceptionistText"
+ },
+ "TEXT_MTMOONPOKECENTER_MAGIKARP_SALESMAN": {
+ "asm": true,
+ "label": "MtMoonPokecenterMagikarpSalesmanText"
+ },
+ "TEXT_MTMOONPOKECENTER_NURSE": {
+ "label": "MtMoonPokecenterNurseText",
+ "nurse": true
+ },
+ "TEXT_MTMOONPOKECENTER_YOUNGSTER": {
+ "label": "MtMoonPokecenterYoungsterText",
+ "text": "_MtMoonPokecenterYoungsterText"
+ }
+ },
+ "Museum1F": {
+ "TEXT_MUSEUM1F_GAMBLER": {
+ "asm": true,
+ "label": "Museum1FGamblerText"
+ },
+ "TEXT_MUSEUM1F_OLD_AMBER": {
+ "asm": true,
+ "label": "Museum1FOldAmberText"
+ },
+ "TEXT_MUSEUM1F_SCIENTIST1": {
+ "asm": true,
+ "label": "Museum1FScientist1Text"
+ },
+ "TEXT_MUSEUM1F_SCIENTIST2": {
+ "asm": true,
+ "label": "Museum1FScientist2Text"
+ },
+ "TEXT_MUSEUM1F_SCIENTIST3": {
+ "asm": true,
+ "label": "Museum1FScientist3Text"
+ }
+ },
+ "Museum2F": {
+ "TEXT_MUSEUM2F_BRUNETTE_GIRL": {
+ "label": "Museum2FBrunetteGirlText",
+ "text": "_Museum2FBrunetteGirlText"
+ },
+ "TEXT_MUSEUM2F_GRAMPS": {
+ "label": "Museum2FGrampsText",
+ "text": "_Museum2FGrampsText"
+ },
+ "TEXT_MUSEUM2F_HIKER": {
+ "asm": true,
+ "label": "Museum2FHikerText"
+ },
+ "TEXT_MUSEUM2F_MOON_STONE_SIGN": {
+ "label": "Museum2FMoonStoneSignText",
+ "text": "_Museum2FMoonStoneSignText"
+ },
+ "TEXT_MUSEUM2F_SCIENTIST": {
+ "label": "Museum2FScientistText",
+ "text": "_Museum2FScientistText"
+ },
+ "TEXT_MUSEUM2F_SPACE_SHUTTLE_SIGN": {
+ "label": "Museum2FSpaceShuttleSignText",
+ "text": "_Museum2FSpaceShuttleSignText"
+ },
+ "TEXT_MUSEUM2F_YOUNGSTER": {
+ "label": "Museum2FYoungsterText",
+ "text": "_Museum2FYoungsterText"
+ }
+ },
+ "NameRatersHouse": {
+ "TEXT_NAMERATERSHOUSE_NAME_RATER": {
+ "asm": true,
+ "label": "NameRatersHouseNameRaterText",
+ "text": "_NameRatersHouseNameRaterWantMeToRateText"
+ }
+ },
+ "OaksLab": {
+ "TEXT_OAKSLAB_EEVEE_POKE_BALL": {
+ "asm": true,
+ "label": "OaksLabEeveePokeBallText",
+ "text": "_OaksLabThatsAPokeball"
+ },
+ "TEXT_OAKSLAB_GIRL": {
+ "asm": true,
+ "label": "OaksLabGirlText",
+ "text": "_OaksLabGirlText"
+ },
+ "TEXT_OAKSLAB_OAK1": {
+ "asm": true,
+ "label": "OaksLabOak1Text",
+ "text": "_OaksLabOak1GoAheadItsYours"
+ },
+ "TEXT_OAKSLAB_OAK2": {
+ "label": "OaksLabOak2Text",
+ "text": "_OaksLabOak2Text"
+ },
+ "TEXT_OAKSLAB_OAK_BE_PATIENT": {
+ "asm": true,
+ "label": "OaksLabOakBePatientText",
+ "text": "_OaksLabOakBePatientText"
+ },
+ "TEXT_OAKSLAB_OAK_CHOOSE_MON": {
+ "asm": true,
+ "label": "OaksLabOakChooseMonText",
+ "text": "_OaksLabOakChooseMonText"
+ },
+ "TEXT_OAKSLAB_OAK_DONT_GO_AWAY_YET": {
+ "asm": true,
+ "label": "OaksLabOakDontGoAwayYetText",
+ "text": "_OaksLabOakDontGoAwayYetText"
+ },
+ "TEXT_OAKSLAB_OAK_GOT_POKEDEX": {
+ "label": "OaksLabOakGotPokedexText",
+ "text": "_OaksLabOakGotPokedexText"
+ },
+ "TEXT_OAKSLAB_OAK_I_HAVE_A_REQUEST": {
+ "label": "OaksLabOakIHaveARequestText",
+ "text": "_OaksLabOakIHaveARequestText"
+ },
+ "TEXT_OAKSLAB_OAK_MY_INVENTION_POKEDEX": {
+ "label": "OaksLabOakMyInventionPokedexText",
+ "text": "_OaksLabOakMyInventionPokedexText"
+ },
+ "TEXT_OAKSLAB_OAK_THAT_WAS_MY_DREAM": {
+ "label": "OaksLabOakThatWasMyDreamText",
+ "text": "_OaksLabOakThatWasMyDreamText"
+ },
+ "TEXT_OAKSLAB_PIKACHU_DISLIKES_POKEBALLS1": {
+ "asm": true,
+ "label": "OaksLabPikachuDislikesPokeballsText1",
+ "text": "_OaksLabPikachuDislikesPokeballsText1"
+ },
+ "TEXT_OAKSLAB_PIKACHU_DISLIKES_POKEBALLS2": {
+ "asm": true,
+ "label": "OaksLabPikachuDislikesPokeballsText2",
+ "text": "_OaksLabPikachuDislikesPokeballsText2"
+ },
+ "TEXT_OAKSLAB_PLAYER_RECEIVED_MON": {
+ "asm": true,
+ "label": "OaksLabPlayerReceivedMonText"
+ },
+ "TEXT_OAKSLAB_POKEDEX1": {
+ "asm": true,
+ "label": "OaksLabPokedexText",
+ "text": "_OaksLabPokedexText"
+ },
+ "TEXT_OAKSLAB_POKEDEX2": {
+ "asm": true,
+ "label": "OaksLabPokedexText",
+ "text": "_OaksLabPokedexText"
+ },
+ "TEXT_OAKSLAB_RIVAL": {
+ "asm": true,
+ "label": "OaksLabRivalText",
+ "text": "_OaksLabRivalGrampsIsntAroundText"
+ },
+ "TEXT_OAKSLAB_RIVAL_FED_UP_WITH_WAITING": {
+ "asm": true,
+ "label": "OaksLabRivalFedUpWithWaitingText",
+ "text": "_OaksLabRivalFedUpWithWaitingText"
+ },
+ "TEXT_OAKSLAB_RIVAL_GRAMPS": {
+ "label": "OaksLabRivalGrampsText",
+ "text": "_OaksLabRivalGrampsText"
+ },
+ "TEXT_OAKSLAB_RIVAL_ILL_TAKE_YOU_ON": {
+ "asm": true,
+ "label": "OaksLabRivalIllTakeYouOnText",
+ "text": "_OaksLabRivalIllTakeYouOnText"
+ },
+ "TEXT_OAKSLAB_RIVAL_LEAVE_IT_ALL_TO_ME": {
+ "label": "OaksLabRivalLeaveItAllToMeText",
+ "text": "_OaksLabRivalLeaveItAllToMeText"
+ },
+ "TEXT_OAKSLAB_RIVAL_MY_POKEMON_HAS_GROWN_STRONGER": {
+ "label": "OaksLabRivalMyPokemonHasGrownStrongerText",
+ "text": "_OaksLabRivalMyPokemonHasGrownStrongerText"
+ },
+ "TEXT_OAKSLAB_RIVAL_RECEIVED_MON": {
+ "asm": true,
+ "label": "OaksLabRivalReceivedMonText"
+ },
+ "TEXT_OAKSLAB_RIVAL_SMELL_YOU_LATER": {
+ "asm": true,
+ "label": "OaksLabRivalSmellYouLaterText",
+ "text": "_OaksLabRivalSmellYouLaterText"
+ },
+ "TEXT_OAKSLAB_RIVAL_WHAT_ABOUT_ME": {
+ "asm": true,
+ "label": "OaksLabRivalWhatAboutMeText",
+ "text": "_OaksLabRivalWhatAboutMeText"
+ },
+ "TEXT_OAKSLAB_SCIENTIST1": {
+ "asm": true,
+ "label": "OaksLabScientistText",
+ "text": "_OaksLabScientistText"
+ },
+ "TEXT_OAKSLAB_SCIENTIST2": {
+ "asm": true,
+ "label": "OaksLabScientistText",
+ "text": "_OaksLabScientistText"
+ }
+ },
+ "PalletTown": {
+ "TEXT_PALLETTOWN_FISHER": {
+ "label": "PalletTownFisherText",
+ "text": "_PalletTownFisherText"
+ },
+ "TEXT_PALLETTOWN_GIRL": {
+ "label": "PalletTownGirlText",
+ "text": "_PalletTownGirlText"
+ },
+ "TEXT_PALLETTOWN_OAK": {
+ "asm": true,
+ "label": "PalletTownOakText",
+ "text": "_PalletTownOakHeyWaitDontGoOutText"
+ },
+ "TEXT_PALLETTOWN_OAKSLAB_SIGN": {
+ "label": "PalletTownOaksLabSignText",
+ "text": "_PalletTownOaksLabSignText"
+ },
+ "TEXT_PALLETTOWN_OAK_COME_WITH_ME": {
+ "label": "PalletTownOakComeWithMe",
+ "text": "_PalletTownOakComeWithMe"
+ },
+ "TEXT_PALLETTOWN_PLAYERSHOUSE_SIGN": {
+ "label": "PalletTownPlayersHouseSignText",
+ "text": "_PalletTownPlayersHouseSignText"
+ },
+ "TEXT_PALLETTOWN_RIVALSHOUSE_SIGN": {
+ "label": "PalletTownRivalsHouseSignText",
+ "text": "_PalletTownRivalsHouseSignText"
+ },
+ "TEXT_PALLETTOWN_SIGN": {
+ "label": "PalletTownSignText",
+ "text": "_PalletTownSignText"
+ }
+ },
+ "PewterCity": {
+ "TEXT_PEWTERCITY_COOLTRAINER_F": {
+ "label": "PewterCityCooltrainerFText",
+ "text": "_PewterCityCooltrainerFText"
+ },
+ "TEXT_PEWTERCITY_COOLTRAINER_M": {
+ "label": "PewterCityCooltrainerMText",
+ "text": "_PewterCityCooltrainerMText"
+ },
+ "TEXT_PEWTERCITY_GYM_SIGN": {
+ "label": "PewterCityGymSignText",
+ "text": "_PewterCityGymSignText"
+ },
+ "TEXT_PEWTERCITY_MART_SIGN": {
+ "asm": true,
+ "label": "MartSignText"
+ },
+ "TEXT_PEWTERCITY_MUSEUM_SIGN": {
+ "label": "PewterCityMuseumSignText",
+ "text": "_PewterCityMuseumSignText"
+ },
+ "TEXT_PEWTERCITY_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_PEWTERCITY_POLICE_NOTICE_SIGN": {
+ "label": "PewterCityPoliceNoticeSignText",
+ "text": "_PewterCityPoliceNoticeSignText"
+ },
+ "TEXT_PEWTERCITY_SIGN": {
+ "label": "PewterCitySignText",
+ "text": "_PewterCitySignText"
+ },
+ "TEXT_PEWTERCITY_SUPER_NERD1": {
+ "asm": true,
+ "label": "PewterCitySuperNerd1Text",
+ "text": "_PewterCitySuperNerd1DidYouCheckOutMuseumText"
+ },
+ "TEXT_PEWTERCITY_SUPER_NERD1_ITS_RIGHT_HERE": {
+ "label": "PewterCitySuperNerd1ItsRightHereText",
+ "text": "_PewterCitySuperNerd1ItsRightHereText"
+ },
+ "TEXT_PEWTERCITY_SUPER_NERD2": {
+ "asm": true,
+ "label": "PewterCitySuperNerd2Text",
+ "text": "_PewterCitySuperNerd2DoYouKnowWhatImDoingText"
+ },
+ "TEXT_PEWTERCITY_TRAINER_TIPS": {
+ "label": "PewterCityTrainerTipsText",
+ "text": "_PewterCityTrainerTipsText"
+ },
+ "TEXT_PEWTERCITY_YOUNGSTER": {
+ "asm": true,
+ "label": "PewterCityYoungsterText",
+ "text": "_PewterCityYoungsterYoureATrainerFollowMeText"
+ },
+ "TEXT_PEWTERCITY_YOUNGSTER_GO_TAKE_ON_BROCK": {
+ "label": "PewterCityYoungsterGoTakeOnBrockText",
+ "text": "_PewterCityYoungsterGoTakeOnBrockText"
+ }
+ },
+ "PewterGym": {
+ "TEXT_PEWTERGYM_BROCK": {
+ "asm": true,
+ "label": "PewterGymBrockText",
+ "text": "_PewterGymBrockPreBattleText"
+ },
+ "TEXT_PEWTERGYM_BROCK_WAIT_TAKE_THIS": {
+ "label": "PewterGymBrockWaitTakeThisText",
+ "text": "_PewterGymBrockWaitTakeThisText"
+ },
+ "TEXT_PEWTERGYM_COOLTRAINER_M": {
+ "asm": true,
+ "label": "PewterGymCooltrainerMText"
+ },
+ "TEXT_PEWTERGYM_GYM_GUIDE": {
+ "asm": true,
+ "label": "PewterGymGuideText"
+ },
+ "TEXT_PEWTERGYM_RECEIVED_TM34": {
+ "label": "PewterGymReceivedTM34Text",
+ "text": "_PewterGymReceivedTM34Text"
+ },
+ "TEXT_PEWTERGYM_TM34_NO_ROOM": {
+ "label": "PewterGymTM34NoRoomText",
+ "text": "_PewterGymTM34NoRoomText"
+ }
+ },
+ "PewterMart": {
+ "TEXT_PEWTERMART_CLERK": {
+ "label": "PewterMartClerkText",
+ "mart": [
+ "POKE_BALL",
+ "POTION",
+ "ESCAPE_ROPE",
+ "ANTIDOTE",
+ "BURN_HEAL",
+ "AWAKENING",
+ "PARLYZ_HEAL"
+ ]
+ },
+ "TEXT_PEWTERMART_SUPER_NERD": {
+ "asm": true,
+ "label": "PewterMartSuperNerdText",
+ "text": "_PewterMartSuperNerdText"
+ },
+ "TEXT_PEWTERMART_YOUNGSTER": {
+ "asm": true,
+ "label": "PewterMartYoungsterText",
+ "text": "_PewterMartYoungsterText"
+ }
+ },
+ "PewterNidoranHouse": {
+ "TEXT_PEWTERNIDORANHOUSE_LITTLE_BOY": {
+ "label": "PewterNidoranHouseLittleBoyText",
+ "text": "_PewterNidoranHouseLittleBoyText"
+ },
+ "TEXT_PEWTERNIDORANHOUSE_MIDDLE_AGED_MAN": {
+ "label": "PewterNidoranHouseMiddleAgedManText",
+ "text": "_PewterNidoranHouseMiddleAgedManText"
+ },
+ "TEXT_PEWTERNIDORANHOUSE_NIDORAN": {
+ "asm": true,
+ "label": "PewterNidoranHouseNidoranText",
+ "text": "_PewterNidoranHouseNidoranText"
+ }
+ },
+ "PewterPokecenter": {
+ "TEXT_PEWTERPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "PewterPokecenterChanseyText"
+ },
+ "TEXT_PEWTERPOKECENTER_COOLTRAINER_F": {
+ "asm": true,
+ "label": "PewterPokecenterCooltrainerFText"
+ },
+ "TEXT_PEWTERPOKECENTER_GENTLEMAN": {
+ "label": "PewterPokecenterGentlemanText",
+ "text": "_PewterPokecenterGentlemanText"
+ },
+ "TEXT_PEWTERPOKECENTER_JIGGLYPUFF": {
+ "asm": true,
+ "label": "PewterPokecenterJigglypuffText"
+ },
+ "TEXT_PEWTERPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "PewterPokecenterLinkReceptionistText"
+ },
+ "TEXT_PEWTERPOKECENTER_NURSE": {
+ "label": "PewterPokecenterNurseText",
+ "nurse": true
+ }
+ },
+ "PewterSpeechHouse": {
+ "TEXT_PEWTERSPEECHHOUSE_GAMBLER": {
+ "label": "PewterSpeechHouseGamblerText",
+ "text": "_PewterSpeechHouseGamblerText"
+ },
+ "TEXT_PEWTERSPEECHHOUSE_YOUNGSTER": {
+ "label": "PewterSpeechHouseYoungsterText",
+ "text": "_PewterSpeechHouseYoungsterText"
+ }
+ },
+ "PokemonFanClub": {
+ "TEXT_POKEMONFANCLUB_CHAIRMAN": {
+ "asm": true,
+ "label": "PokemonFanClubChairmanText",
+ "text": "_PokemonFanClubChairmanIntroText"
+ },
+ "TEXT_POKEMONFANCLUB_CLEFAIRY": {
+ "asm": true,
+ "label": "PokemonFanClubClefairyText",
+ "text": "_PokemonFanClubClefairyText"
+ },
+ "TEXT_POKEMONFANCLUB_CLEFAIRY_FAN": {
+ "asm": true,
+ "label": "PokemonFanClubClefairyFanText",
+ "text": "_PokemonFanClubClefairyFanNormalText"
+ },
+ "TEXT_POKEMONFANCLUB_RECEPTIONIST": {
+ "label": "PokemonFanClubReceptionistText",
+ "text": "_PokemonFanClubReceptionistText"
+ },
+ "TEXT_POKEMONFANCLUB_SEEL": {
+ "asm": true,
+ "label": "PokemonFanClubSeelText",
+ "text": "_PokemonFanClubSeelText"
+ },
+ "TEXT_POKEMONFANCLUB_SEEL_FAN": {
+ "asm": true,
+ "label": "PokemonFanClubSeelFanText",
+ "text": "_PokemonFanClubSeelFanNormalText"
+ }
+ },
+ "PokemonMansion1F": {
+ "TEXT_POKEMONMANSION1F_CARBOS": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONMANSION1F_ESCAPE_ROPE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONMANSION1F_SCIENTIST": {
+ "asm": true,
+ "label": "PokemonMansion1FScientistText"
+ },
+ "TEXT_POKEMONMANSION1F_SWITCH": {
+ "asm": true,
+ "label": "PokemonMansion1FSwitchText",
+ "text": "_PokemonMansion1FSwitchText"
+ }
+ },
+ "PokemonMansion2F": {
+ "TEXT_POKEMONMANSION2F_CALCIUM": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONMANSION2F_DIARY1": {
+ "label": "PokemonMansion2FDiary1Text",
+ "text": "_PokemonMansion2FDiary1Text"
+ },
+ "TEXT_POKEMONMANSION2F_DIARY2": {
+ "label": "PokemonMansion2FDiary2Text",
+ "text": "_PokemonMansion2FDiary2Text"
+ },
+ "TEXT_POKEMONMANSION2F_SUPER_NERD": {
+ "asm": true,
+ "label": "PokemonMansion2FSuperNerdText"
+ },
+ "TEXT_POKEMONMANSION2F_SWITCH": {
+ "asm": true,
+ "label": "PokemonMansion2FSwitchText",
+ "text": "_PokemonMansion2FSwitchText"
+ }
+ },
+ "PokemonMansion3F": {
+ "TEXT_POKEMONMANSION3F_DIARY": {
+ "label": "PokemonMansion3FDiaryText",
+ "text": "_PokemonMansion3FDiaryText"
+ },
+ "TEXT_POKEMONMANSION3F_IRON": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONMANSION3F_MAX_POTION": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONMANSION3F_SCIENTIST": {
+ "asm": true,
+ "label": "PokemonMansion3FScientistText"
+ },
+ "TEXT_POKEMONMANSION3F_SUPER_NERD": {
+ "asm": true,
+ "label": "PokemonMansion3FSuperNerdText"
+ },
+ "TEXT_POKEMONMANSION3F_SWITCH": {
+ "asm": true,
+ "label": "PokemonMansion2FSwitchText"
+ }
+ },
+ "PokemonMansionB1F": {
+ "TEXT_POKEMONMANSIONB1F_BURGLAR": {
+ "asm": true,
+ "label": "PokemonMansionB1FBurglarText"
+ },
+ "TEXT_POKEMONMANSIONB1F_DIARY": {
+ "label": "PokemonMansionB1FDiaryText",
+ "text": "_PokemonMansionB1FDiaryText"
+ },
+ "TEXT_POKEMONMANSIONB1F_FULL_RESTORE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONMANSIONB1F_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONMANSIONB1F_SCIENTIST": {
+ "asm": true,
+ "label": "PokemonMansionB1FScientistText"
+ },
+ "TEXT_POKEMONMANSIONB1F_SECRET_KEY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONMANSIONB1F_SWITCH": {
+ "asm": true,
+ "label": "PokemonMansion2FSwitchText"
+ },
+ "TEXT_POKEMONMANSIONB1F_TM_BLIZZARD": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONMANSIONB1F_TM_SOLARBEAM": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "PokemonTower1F": {
+ "TEXT_POKEMONTOWER1F_BALDING_GUY": {
+ "label": "PokemonTower1FBaldingGuyText",
+ "text": "_PokemonTower1FBaldingGuyText"
+ },
+ "TEXT_POKEMONTOWER1F_CHANNELER": {
+ "label": "PokemonTower1FChannelerText",
+ "text": "_PokemonTower1FChannelerText"
+ },
+ "TEXT_POKEMONTOWER1F_GIRL": {
+ "label": "PokemonTower1FGirlText",
+ "text": "_PokemonTower1FGirlText"
+ },
+ "TEXT_POKEMONTOWER1F_MIDDLE_AGED_WOMAN": {
+ "label": "PokemonTower1FMiddleAgedWomanText",
+ "text": "_PokemonTower1FMiddleAgedWomanText"
+ },
+ "TEXT_POKEMONTOWER1F_RECEPTIONIST": {
+ "label": "PokemonTower1FReceptionistText",
+ "text": "_PokemonTower1FReceptionistText"
+ }
+ },
+ "PokemonTower2F": {
+ "TEXT_POKEMONTOWER2F_CHANNELER": {
+ "label": "PokemonTower2FChannelerText",
+ "text": "_PokemonTower2FChannelerText"
+ },
+ "TEXT_POKEMONTOWER2F_RIVAL": {
+ "asm": true,
+ "label": "PokemonTower2FRivalText",
+ "text": "_PokemonTower2FRivalWhatBringsYouHereText"
+ }
+ },
+ "PokemonTower3F": {
+ "TEXT_POKEMONTOWER3F_CHANNELER1": {
+ "asm": true,
+ "label": "PokemonTower3FChanneler1Text"
+ },
+ "TEXT_POKEMONTOWER3F_CHANNELER2": {
+ "asm": true,
+ "label": "PokemonTower3FChanneler2Text"
+ },
+ "TEXT_POKEMONTOWER3F_CHANNELER3": {
+ "asm": true,
+ "label": "PokemonTower3FChanneler3Text"
+ },
+ "TEXT_POKEMONTOWER3F_ESCAPE_ROPE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "PokemonTower4F": {
+ "TEXT_POKEMONTOWER4F_AWAKENING": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONTOWER4F_CHANNELER1": {
+ "asm": true,
+ "label": "PokemonTower4FChanneler1Text"
+ },
+ "TEXT_POKEMONTOWER4F_CHANNELER2": {
+ "asm": true,
+ "label": "PokemonTower4FChanneler2Text"
+ },
+ "TEXT_POKEMONTOWER4F_CHANNELER3": {
+ "asm": true,
+ "label": "PokemonTower4FChanneler3Text"
+ },
+ "TEXT_POKEMONTOWER4F_ELIXER": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONTOWER4F_HP_UP": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "PokemonTower5F": {
+ "TEXT_POKEMONTOWER5F_CHANNELER1": {
+ "label": "PokemonTower5FChanneler1Text",
+ "text": "_PokemonTower5FChanneler1Text"
+ },
+ "TEXT_POKEMONTOWER5F_CHANNELER2": {
+ "asm": true,
+ "label": "PokemonTower5FChanneler2Text"
+ },
+ "TEXT_POKEMONTOWER5F_CHANNELER3": {
+ "asm": true,
+ "label": "PokemonTower5FChanneler3Text"
+ },
+ "TEXT_POKEMONTOWER5F_CHANNELER4": {
+ "asm": true,
+ "label": "PokemonTower5FChanneler4Text"
+ },
+ "TEXT_POKEMONTOWER5F_CHANNELER5": {
+ "asm": true,
+ "label": "PokemonTower5FChanneler5Text"
+ },
+ "TEXT_POKEMONTOWER5F_NUGGET": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONTOWER5F_PURIFIEDZONE": {
+ "label": "PokemonTower5FPurifiedZoneText",
+ "text": "_PokemonTower5FPurifiedZoneText"
+ }
+ },
+ "PokemonTower6F": {
+ "TEXT_POKEMONTOWER6F_BEGONE": {
+ "label": "PokemonTower6FBeGoneText",
+ "text": "_PokemonTower6FBeGoneText"
+ },
+ "TEXT_POKEMONTOWER6F_CHANNELER1": {
+ "asm": true,
+ "label": "PokemonTower6FChanneler1Text"
+ },
+ "TEXT_POKEMONTOWER6F_CHANNELER2": {
+ "asm": true,
+ "label": "PokemonTower6FChanneler2Text"
+ },
+ "TEXT_POKEMONTOWER6F_CHANNELER3": {
+ "asm": true,
+ "label": "PokemonTower6FChanneler3Text"
+ },
+ "TEXT_POKEMONTOWER6F_MAROWAK_DEPARTED": {
+ "asm": true,
+ "label": "PokemonTower6FMarowakDepartedText"
+ },
+ "TEXT_POKEMONTOWER6F_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POKEMONTOWER6F_X_ACCURACY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "PokemonTower7F": {
+ "TEXT_POKEMONTOWER7F_JAMES": {
+ "label": "PokemonTower7FJessieJamesText"
+ },
+ "TEXT_POKEMONTOWER7F_JESSIE": {
+ "label": "PokemonTower7FJessieJamesText"
+ },
+ "TEXT_POKEMONTOWER7F_MR_FUJI": {
+ "asm": true,
+ "label": "PokemonTower7FMrFujiText",
+ "text": "_PokemonTower7FMrFujiRescueText"
+ },
+ "TEXT_POKEMONTOWER7F_TEXT4": {
+ "asm": true,
+ "label": "PokemonTower7FText4",
+ "text": "_PokemonTowerJessieJamesText1"
+ },
+ "TEXT_POKEMONTOWER7F_TEXT5": {
+ "label": "PokemonTower7FText5",
+ "text": "_PokemonTowerJessieJamesText2"
+ },
+ "TEXT_POKEMONTOWER7F_TEXT6": {
+ "asm": true,
+ "label": "PokemonTower7FText6",
+ "text": "_PokemonTowerJessieJamesText4"
+ }
+ },
+ "PowerPlant": {
+ "TEXT_POWERPLANT_CARBOS": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POWERPLANT_ELECTRODE1": {
+ "asm": true,
+ "label": "PowerPlantElectrode1Text"
+ },
+ "TEXT_POWERPLANT_ELECTRODE2": {
+ "asm": true,
+ "label": "PowerPlantElectrode2Text"
+ },
+ "TEXT_POWERPLANT_HP_UP": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POWERPLANT_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POWERPLANT_TM_REFLECT": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POWERPLANT_TM_THUNDER": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_POWERPLANT_VOLTORB1": {
+ "asm": true,
+ "label": "PowerPlantVoltorb1Text"
+ },
+ "TEXT_POWERPLANT_VOLTORB2": {
+ "asm": true,
+ "label": "PowerPlantVoltorb2Text"
+ },
+ "TEXT_POWERPLANT_VOLTORB3": {
+ "asm": true,
+ "label": "PowerPlantVoltorb3Text"
+ },
+ "TEXT_POWERPLANT_VOLTORB4": {
+ "asm": true,
+ "label": "PowerPlantVoltorb4Text"
+ },
+ "TEXT_POWERPLANT_VOLTORB5": {
+ "asm": true,
+ "label": "PowerPlantVoltorb5Text"
+ },
+ "TEXT_POWERPLANT_VOLTORB6": {
+ "asm": true,
+ "label": "PowerPlantVoltorb6Text"
+ },
+ "TEXT_POWERPLANT_ZAPDOS": {
+ "asm": true,
+ "label": "PowerPlantZapdosText"
+ }
+ },
+ "RedsHouse1F": {
+ "TEXT_REDSHOUSE1F_MOM": {
+ "asm": true,
+ "label": "RedsHouse1FMomText"
+ },
+ "TEXT_REDSHOUSE1F_TV": {
+ "asm": true,
+ "label": "RedsHouse1FTVText"
+ }
+ },
+ "RockTunnel1F": {
+ "TEXT_ROCKTUNNEL1F_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "RockTunnel1FCooltrainerF1Text"
+ },
+ "TEXT_ROCKTUNNEL1F_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "RockTunnel1FCooltrainerF2Text"
+ },
+ "TEXT_ROCKTUNNEL1F_COOLTRAINER_F3": {
+ "asm": true,
+ "label": "RockTunnel1FCooltrainerF3Text"
+ },
+ "TEXT_ROCKTUNNEL1F_HIKER1": {
+ "asm": true,
+ "label": "RockTunnel1FHiker1Text"
+ },
+ "TEXT_ROCKTUNNEL1F_HIKER2": {
+ "asm": true,
+ "label": "RockTunnel1FHiker2Text"
+ },
+ "TEXT_ROCKTUNNEL1F_HIKER3": {
+ "asm": true,
+ "label": "RockTunnel1FHiker3Text"
+ },
+ "TEXT_ROCKTUNNEL1F_SIGN": {
+ "label": "RockTunnel1FSignText",
+ "text": "_RockTunnel1FSignText"
+ },
+ "TEXT_ROCKTUNNEL1F_SUPER_NERD": {
+ "asm": true,
+ "label": "RockTunnel1FSuperNerdText"
+ }
+ },
+ "RockTunnelB1F": {
+ "TEXT_ROCKTUNNELB1F_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "RockTunnelB1FCooltrainerF1Text"
+ },
+ "TEXT_ROCKTUNNELB1F_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "RockTunnelB1FCooltrainerF2Text"
+ },
+ "TEXT_ROCKTUNNELB1F_HIKER1": {
+ "asm": true,
+ "label": "RockTunnelB1FHiker1Text"
+ },
+ "TEXT_ROCKTUNNELB1F_HIKER2": {
+ "asm": true,
+ "label": "RockTunnelB1FHiker2Text"
+ },
+ "TEXT_ROCKTUNNELB1F_HIKER3": {
+ "asm": true,
+ "label": "RockTunnelB1FHiker3Text"
+ },
+ "TEXT_ROCKTUNNELB1F_SUPER_NERD1": {
+ "asm": true,
+ "label": "RockTunnelB1FSuperNerd1Text"
+ },
+ "TEXT_ROCKTUNNELB1F_SUPER_NERD2": {
+ "asm": true,
+ "label": "RockTunnelB1FSuperNerd2Text"
+ },
+ "TEXT_ROCKTUNNELB1F_SUPER_NERD3": {
+ "asm": true,
+ "label": "RockTunnelB1FSuperNerd3Text"
+ }
+ },
+ "RockTunnelPokecenter": {
+ "TEXT_ROCKTUNNELPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "RockTunnelPokecenterChanseyText"
+ },
+ "TEXT_ROCKTUNNELPOKECENTER_FISHER": {
+ "label": "RockTunnelPokecenterFisherText",
+ "text": "_RockTunnelPokecenterFisherText"
+ },
+ "TEXT_ROCKTUNNELPOKECENTER_GENTLEMAN": {
+ "label": "RockTunnelPokecenterGentlemanText",
+ "text": "_RockTunnelPokecenterGentlemanText"
+ },
+ "TEXT_ROCKTUNNELPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "RockTunnelPokecenterLinkReceptionistText"
+ },
+ "TEXT_ROCKTUNNELPOKECENTER_NURSE": {
+ "label": "RockTunnelPokecenterNurseText",
+ "nurse": true
+ }
+ },
+ "RocketHideoutB1F": {
+ "TEXT_ROCKETHIDEOUTB1F_ESCAPE_ROPE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROCKETHIDEOUTB1F_HYPER_POTION": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROCKETHIDEOUTB1F_ROCKET1": {
+ "asm": true,
+ "label": "RocketHideoutB1FRocket1Text"
+ },
+ "TEXT_ROCKETHIDEOUTB1F_ROCKET2": {
+ "asm": true,
+ "label": "RocketHideoutB1FRocket2Text"
+ },
+ "TEXT_ROCKETHIDEOUTB1F_ROCKET3": {
+ "asm": true,
+ "label": "RocketHideoutB1FRocket3Text"
+ },
+ "TEXT_ROCKETHIDEOUTB1F_ROCKET4": {
+ "asm": true,
+ "label": "RocketHideoutB1FRocket4Text"
+ },
+ "TEXT_ROCKETHIDEOUTB1F_ROCKET5": {
+ "asm": true,
+ "label": "RocketHideoutB1FRocket5Text"
+ }
+ },
+ "RocketHideoutB2F": {
+ "TEXT_ROCKETHIDEOUTB2F_MOON_STONE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROCKETHIDEOUTB2F_NUGGET": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROCKETHIDEOUTB2F_ROCKET": {
+ "asm": true,
+ "label": "RocketHideoutB2FRocketText"
+ },
+ "TEXT_ROCKETHIDEOUTB2F_SUPER_POTION": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROCKETHIDEOUTB2F_TM_HORN_DRILL": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "RocketHideoutB3F": {
+ "TEXT_ROCKETHIDEOUTB3F_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROCKETHIDEOUTB3F_ROCKET1": {
+ "asm": true,
+ "label": "RocketHideoutB3FRocket1Text"
+ },
+ "TEXT_ROCKETHIDEOUTB3F_ROCKET2": {
+ "asm": true,
+ "label": "RocketHideoutB3FRocket2Text"
+ },
+ "TEXT_ROCKETHIDEOUTB3F_TM_DOUBLE_EDGE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "RocketHideoutB4F": {
+ "TEXT_ROCKETHIDEOUTB4F_GIOVANNI": {
+ "asm": true,
+ "label": "RocketHideoutB4FGiovanniText",
+ "text": "_RocketHideoutB4FGiovanniImpressedYouGotHereText"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_GIOVANNI_HOPE_WE_MEET_AGAIN": {
+ "label": "RocketHideoutB4FGiovanniHopeWeMeetAgainText",
+ "text": "_RocketHideoutB4FGiovanniHopeWeMeetAgainText"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_HP_UP": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_IRON": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_JAMES": {
+ "label": "RocketHideoutB4FJessieJamesText"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_JESSIE": {
+ "label": "RocketHideoutB4FJessieJamesText"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_LIFT_KEY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_ROCKET": {
+ "asm": true,
+ "label": "RocketHideoutB4FRocketText"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_SILPH_SCOPE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_TEXT11": {
+ "asm": true,
+ "label": "RocketHideoutB4FText11",
+ "text": "_RocketHideoutJessieJamesText1"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_TEXT12": {
+ "label": "RocketHideoutB4FText12",
+ "text": "_RocketHideoutJessieJamesText2"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_TEXT13": {
+ "asm": true,
+ "label": "RocketHideoutB4FText13",
+ "text": "_RocketHideoutJessieJamesText4"
+ },
+ "TEXT_ROCKETHIDEOUTB4F_TM_RAZOR_WIND": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "RocketHideoutElevator": {
+ "TEXT_ROCKETHIDEOUTELEVATOR": {
+ "asm": true,
+ "label": "RocketHideoutElevatorText",
+ "text": "_RocketHideoutElevatorAppearsToNeedKeyText"
+ }
+ },
+ "Route1": {
+ "TEXT_ROUTE1_SIGN": {
+ "asm": true,
+ "label": "Route1SignText"
+ },
+ "TEXT_ROUTE1_YOUNGSTER1": {
+ "asm": true,
+ "label": "Route1Youngster1Text"
+ },
+ "TEXT_ROUTE1_YOUNGSTER2": {
+ "asm": true,
+ "label": "Route1Youngster2Text"
+ }
+ },
+ "Route10": {
+ "TEXT_ROUTE10_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "Route10CooltrainerF1Text"
+ },
+ "TEXT_ROUTE10_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "Route10CooltrainerF2Text"
+ },
+ "TEXT_ROUTE10_HIKER1": {
+ "asm": true,
+ "label": "Route10Hiker1Text"
+ },
+ "TEXT_ROUTE10_HIKER2": {
+ "asm": true,
+ "label": "Route10Hiker2Text"
+ },
+ "TEXT_ROUTE10_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_ROUTE10_POWERPLANT_SIGN": {
+ "label": "Route10PowerPlantSignText",
+ "text": "_Route10PowerPlantSignText"
+ },
+ "TEXT_ROUTE10_ROCKTUNNEL_NORTH_SIGN": {
+ "label": "Route10RockTunnelSignText",
+ "text": "_Route10RockTunnelSignText"
+ },
+ "TEXT_ROUTE10_ROCKTUNNEL_SOUTH_SIGN": {
+ "label": "Route10RockTunnelSignText",
+ "text": "_Route10RockTunnelSignText"
+ },
+ "TEXT_ROUTE10_SUPER_NERD1": {
+ "asm": true,
+ "label": "Route10SuperNerd1Text"
+ },
+ "TEXT_ROUTE10_SUPER_NERD2": {
+ "asm": true,
+ "label": "Route10SuperNerd2Text"
+ }
+ },
+ "Route11": {
+ "TEXT_ROUTE11_DIGLETTSCAVE_SIGN": {
+ "label": "Route11DiglettsCaveSignText",
+ "text": "_Route11DiglettsCaveSignText"
+ },
+ "TEXT_ROUTE11_GAMBLER1": {
+ "asm": true,
+ "label": "Route11Gambler1Text"
+ },
+ "TEXT_ROUTE11_GAMBLER2": {
+ "asm": true,
+ "label": "Route11Gambler2Text"
+ },
+ "TEXT_ROUTE11_GAMBLER3": {
+ "asm": true,
+ "label": "Route11Gambler3Text"
+ },
+ "TEXT_ROUTE11_GAMBLER4": {
+ "asm": true,
+ "label": "Route11Gambler4Text"
+ },
+ "TEXT_ROUTE11_SUPER_NERD1": {
+ "asm": true,
+ "label": "Route11SuperNerd1Text"
+ },
+ "TEXT_ROUTE11_SUPER_NERD2": {
+ "asm": true,
+ "label": "Route11SuperNerd2Text"
+ },
+ "TEXT_ROUTE11_YOUNGSTER1": {
+ "asm": true,
+ "label": "Route11Youngster1Text"
+ },
+ "TEXT_ROUTE11_YOUNGSTER2": {
+ "asm": true,
+ "label": "Route11Youngster2Text"
+ },
+ "TEXT_ROUTE11_YOUNGSTER3": {
+ "asm": true,
+ "label": "Route11Youngster3Text"
+ },
+ "TEXT_ROUTE11_YOUNGSTER4": {
+ "asm": true,
+ "label": "Route11Youngster4Text"
+ }
+ },
+ "Route11Gate1F": {
+ "TEXT_ROUTE11GATE1F_GUARD": {
+ "label": "Route11Gate1FGuardText",
+ "text": "_Route11Gate1FGuardText"
+ }
+ },
+ "Route11Gate2F": {
+ "TEXT_ROUTE11GATE2F_LEFT_BINOCULARS": {
+ "asm": true,
+ "label": "Route11Gate2FLeftBinocularsText",
+ "text": "_Route11Gate2FLeftBinocularsSnorlaxText"
+ },
+ "TEXT_ROUTE11GATE2F_OAKS_AIDE": {
+ "asm": true,
+ "label": "Route11Gate2FOaksAideText",
+ "text": "_Route11Gate2FOaksAideItemfinderDescriptionText"
+ },
+ "TEXT_ROUTE11GATE2F_RIGHT_BINOCULARS": {
+ "asm": true,
+ "label": "Route11Gate2FRightBinocularsText",
+ "text": "_Route11Gate2FRightBinocularsText"
+ },
+ "TEXT_ROUTE11GATE2F_YOUNGSTER": {
+ "asm": true,
+ "label": "Route11Gate2FYoungsterText"
+ }
+ },
+ "Route12": {
+ "TEXT_ROUTE12_COOLTRAINER_M": {
+ "asm": true,
+ "label": "Route12CooltrainerMText"
+ },
+ "TEXT_ROUTE12_FISHER1": {
+ "asm": true,
+ "label": "Route12Fisher1Text"
+ },
+ "TEXT_ROUTE12_FISHER2": {
+ "asm": true,
+ "label": "Route12Fisher2Text"
+ },
+ "TEXT_ROUTE12_FISHER3": {
+ "asm": true,
+ "label": "Route12Fisher3Text"
+ },
+ "TEXT_ROUTE12_FISHER4": {
+ "asm": true,
+ "label": "Route12Fisher4Text"
+ },
+ "TEXT_ROUTE12_FISHER5": {
+ "asm": true,
+ "label": "Route12Fisher5Text"
+ },
+ "TEXT_ROUTE12_IRON": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROUTE12_SIGN": {
+ "label": "Route12SignText",
+ "text": "_Route12SignText"
+ },
+ "TEXT_ROUTE12_SNORLAX": {
+ "label": "Route12SnorlaxText",
+ "text": "_Route12SnorlaxText"
+ },
+ "TEXT_ROUTE12_SNORLAX_CALMED_DOWN": {
+ "label": "Route12SnorlaxCalmedDownText",
+ "text": "_Route12SnorlaxCalmedDownText"
+ },
+ "TEXT_ROUTE12_SNORLAX_WOKE_UP": {
+ "label": "Route12SnorlaxWokeUpText",
+ "text": "_Route12SnorlaxWokeUpText"
+ },
+ "TEXT_ROUTE12_SPORT_FISHING_SIGN": {
+ "label": "Route12SportFishingSignText",
+ "text": "_Route12SportFishingSignText"
+ },
+ "TEXT_ROUTE12_SUPER_NERD": {
+ "asm": true,
+ "label": "Route12SuperNerdText"
+ },
+ "TEXT_ROUTE12_TM_PAY_DAY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "Route12Gate1F": {
+ "TEXT_ROUTE12GATE1F_GUARD": {
+ "label": "Route12Gate1FGuardText",
+ "text": "_Route12Gate1FGuardText"
+ }
+ },
+ "Route12Gate2F": {
+ "TEXT_ROUTE12GATE2F_BRUNETTE_GIRL": {
+ "asm": true,
+ "label": "Route12Gate2FBrunetteGirlText",
+ "text": "_Route12Gate2FBrunetteGirlYouCanHaveThisText"
+ },
+ "TEXT_ROUTE12GATE2F_LEFT_BINOCULARS": {
+ "asm": true,
+ "label": "Route12Gate2FLeftBinocularsText",
+ "text": "_Route12Gate2FLeftBinocularsText"
+ },
+ "TEXT_ROUTE12GATE2F_RIGHT_BINOCULARS": {
+ "asm": true,
+ "label": "Route12Gate2FRightBinocularsText",
+ "text": "_Route12Gate2FRightBinocularsText"
+ }
+ },
+ "Route12SuperRodHouse": {
+ "TEXT_ROUTE12SUPERRODHOUSE_FISHING_GURU": {
+ "asm": true,
+ "label": "Route12SuperRodHouseFishingGuruText",
+ "text": "_Route12SuperRodHouseFishingGuruDoYouLikeToFishText"
+ }
+ },
+ "Route13": {
+ "TEXT_ROUTE13_BEAUTY1": {
+ "asm": true,
+ "label": "Route13Beauty1Text"
+ },
+ "TEXT_ROUTE13_BEAUTY2": {
+ "asm": true,
+ "label": "Route13Beauty2Text"
+ },
+ "TEXT_ROUTE13_BIKER": {
+ "asm": true,
+ "label": "Route13BikerText"
+ },
+ "TEXT_ROUTE13_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "Route13CooltrainerF1Text"
+ },
+ "TEXT_ROUTE13_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "Route13CooltrainerF2Text"
+ },
+ "TEXT_ROUTE13_COOLTRAINER_F3": {
+ "asm": true,
+ "label": "Route13CooltrainerF3Text"
+ },
+ "TEXT_ROUTE13_COOLTRAINER_F4": {
+ "asm": true,
+ "label": "Route13CooltrainerF4Text"
+ },
+ "TEXT_ROUTE13_COOLTRAINER_M1": {
+ "asm": true,
+ "label": "Route13CooltrainerM1Text"
+ },
+ "TEXT_ROUTE13_COOLTRAINER_M2": {
+ "asm": true,
+ "label": "Route13CooltrainerM2Text"
+ },
+ "TEXT_ROUTE13_COOLTRAINER_M3": {
+ "asm": true,
+ "label": "Route13CooltrainerM3Text"
+ },
+ "TEXT_ROUTE13_SIGN": {
+ "label": "Route13SignText",
+ "text": "_Route13SignText"
+ },
+ "TEXT_ROUTE13_TRAINER_TIPS1": {
+ "label": "Route13TrainerTips1Text",
+ "text": "_Route13TrainerTips1Text"
+ },
+ "TEXT_ROUTE13_TRAINER_TIPS2": {
+ "label": "Route13TrainerTips2Text",
+ "text": "_Route13TrainerTips2Text"
+ }
+ },
+ "Route14": {
+ "TEXT_ROUTE14_BIKER1": {
+ "asm": true,
+ "label": "Route14Biker1Text"
+ },
+ "TEXT_ROUTE14_BIKER2": {
+ "asm": true,
+ "label": "Route14Biker2Text"
+ },
+ "TEXT_ROUTE14_BIKER3": {
+ "asm": true,
+ "label": "Route14Biker3Text"
+ },
+ "TEXT_ROUTE14_BIKER4": {
+ "asm": true,
+ "label": "Route14Biker4Text"
+ },
+ "TEXT_ROUTE14_COOLTRAINER_M1": {
+ "asm": true,
+ "label": "Route14CooltrainerM1Text"
+ },
+ "TEXT_ROUTE14_COOLTRAINER_M2": {
+ "asm": true,
+ "label": "Route14CooltrainerM2Text"
+ },
+ "TEXT_ROUTE14_COOLTRAINER_M3": {
+ "asm": true,
+ "label": "Route14CooltrainerM3Text"
+ },
+ "TEXT_ROUTE14_COOLTRAINER_M4": {
+ "asm": true,
+ "label": "Route14CooltrainerM4Text"
+ },
+ "TEXT_ROUTE14_COOLTRAINER_M5": {
+ "asm": true,
+ "label": "Route14CooltrainerM5Text"
+ },
+ "TEXT_ROUTE14_COOLTRAINER_M6": {
+ "asm": true,
+ "label": "Route14CooltrainerM6Text"
+ },
+ "TEXT_ROUTE14_SIGN": {
+ "label": "Route14SignText",
+ "text": "_Route14SignText"
+ }
+ },
+ "Route15": {
+ "TEXT_ROUTE15_BEAUTY1": {
+ "asm": true,
+ "label": "Route15Beauty1Text"
+ },
+ "TEXT_ROUTE15_BEAUTY2": {
+ "asm": true,
+ "label": "Route15Beauty2Text"
+ },
+ "TEXT_ROUTE15_BIKER1": {
+ "asm": true,
+ "label": "Route15Biker1Text"
+ },
+ "TEXT_ROUTE15_BIKER2": {
+ "asm": true,
+ "label": "Route15Biker2Text"
+ },
+ "TEXT_ROUTE15_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "Route15CooltrainerF1Text"
+ },
+ "TEXT_ROUTE15_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "Route15CooltrainerF2Text"
+ },
+ "TEXT_ROUTE15_COOLTRAINER_F3": {
+ "asm": true,
+ "label": "Route15CooltrainerF3Text"
+ },
+ "TEXT_ROUTE15_COOLTRAINER_F4": {
+ "asm": true,
+ "label": "Route15CooltrainerF4Text"
+ },
+ "TEXT_ROUTE15_COOLTRAINER_M1": {
+ "asm": true,
+ "label": "Route15CooltrainerM1Text"
+ },
+ "TEXT_ROUTE15_COOLTRAINER_M2": {
+ "asm": true,
+ "label": "Route15CooltrainerM2Text"
+ },
+ "TEXT_ROUTE15_SIGN": {
+ "label": "Route15SignText",
+ "text": "_Route15SignText"
+ },
+ "TEXT_ROUTE15_TM_RAGE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "Route15Gate1F": {
+ "TEXT_ROUTE15GATE1F_GUARD": {
+ "label": "Route15Gate1FGuardText",
+ "text": "_Route15Gate1FGuardText"
+ }
+ },
+ "Route15Gate2F": {
+ "TEXT_ROUTE15GATE2F_BINOCULARS": {
+ "asm": true,
+ "label": "Route15Gate2FBinocularsText",
+ "text": "_Route15Gate2FBinocularsText"
+ },
+ "TEXT_ROUTE15GATE2F_OAKS_AIDE": {
+ "asm": true,
+ "label": "Route15Gate2FOaksAideText",
+ "text": "_Route15Gate2FOaksAideExpAllText"
+ }
+ },
+ "Route16": {
+ "TEXT_ROUTE16_BIKER1": {
+ "asm": true,
+ "label": "Route16Biker1Text"
+ },
+ "TEXT_ROUTE16_BIKER2": {
+ "asm": true,
+ "label": "Route16Biker2Text"
+ },
+ "TEXT_ROUTE16_BIKER3": {
+ "asm": true,
+ "label": "Route16Biker3Text"
+ },
+ "TEXT_ROUTE16_BIKER4": {
+ "asm": true,
+ "label": "Route16Biker4Text"
+ },
+ "TEXT_ROUTE16_BIKER5": {
+ "asm": true,
+ "label": "Route16Biker5Text"
+ },
+ "TEXT_ROUTE16_BIKER6": {
+ "asm": true,
+ "label": "Route16Biker6Text"
+ },
+ "TEXT_ROUTE16_CYCLING_ROAD_SIGN": {
+ "label": "Route16CyclingRoadSignText",
+ "text": "_Route16CyclingRoadSignText"
+ },
+ "TEXT_ROUTE16_SIGN": {
+ "label": "Route16SignText",
+ "text": "_Route16SignText"
+ },
+ "TEXT_ROUTE16_SNORLAX": {
+ "label": "Route16SnorlaxText",
+ "text": "_Route16Text7"
+ },
+ "TEXT_ROUTE16_SNORLAX_RETURNED_TO_MOUNTAINS": {
+ "label": "Route16SnorlaxReturnedToMountainsText",
+ "text": "_Route16SnorlaxReturnedToMountainsText"
+ },
+ "TEXT_ROUTE16_SNORLAX_WOKE_UP": {
+ "label": "Route16SnorlaxWokeUpText",
+ "text": "_Route16SnorlaxWokeUpText"
+ }
+ },
+ "Route16FlyHouse": {
+ "TEXT_ROUTE16FLYHOUSE_BRUNETTE_GIRL": {
+ "asm": true,
+ "label": "Route16FlyHouseBrunetteGirlText",
+ "text": "_Route16FlyHouseBrunetteGirlText"
+ },
+ "TEXT_ROUTE16FLYHOUSE_FEAROW": {
+ "asm": true,
+ "label": "Route16FlyHouseFearowText",
+ "text": "_Route16FlyHouseFearowText"
+ }
+ },
+ "Route16Gate1F": {
+ "TEXT_ROUTE16GATE1F_GAMBLER": {
+ "label": "Route16Gate1FGamblerText",
+ "text": "_Route16Gate1FGamblerText"
+ },
+ "TEXT_ROUTE16GATE1F_GUARD": {
+ "asm": true,
+ "label": "Route16Gate1FGuardText",
+ "text": "_Route16Gate1FGuardNoPedestriansAllowedText"
+ },
+ "TEXT_ROUTE16GATE1F_GUARD_WAIT_UP": {
+ "label": "Route16Gate1FGuardWaitUpText",
+ "text": "_Route16Gate1FGuardWaitUpText"
+ }
+ },
+ "Route16Gate2F": {
+ "TEXT_ROUTE16GATE2F_LEFT_BINOCULARS": {
+ "asm": true,
+ "label": "Route16Gate2FLeftBinocularsText",
+ "text": "_Route16Gate2FLeftBinocularsText"
+ },
+ "TEXT_ROUTE16GATE2F_LITTLE_BOY": {
+ "asm": true,
+ "label": "Route16Gate2FLittleBoyText",
+ "text": "_Route16Gate2FLittleBoyText"
+ },
+ "TEXT_ROUTE16GATE2F_LITTLE_GIRL": {
+ "asm": true,
+ "label": "Route16Gate2FLittleGirlText",
+ "text": "_Route16Gate2FLittleGirlText"
+ },
+ "TEXT_ROUTE16GATE2F_RIGHT_BINOCULARS": {
+ "asm": true,
+ "label": "Route16Gate2FRightBinocularsText",
+ "text": "_Route16Gate2FRightBinocularsText"
+ }
+ },
+ "Route17": {
+ "TEXT_ROUTE17_BIKER1": {
+ "asm": true,
+ "label": "Route17Biker1Text"
+ },
+ "TEXT_ROUTE17_BIKER10": {
+ "asm": true,
+ "label": "Route17Biker10Text"
+ },
+ "TEXT_ROUTE17_BIKER2": {
+ "asm": true,
+ "label": "Route17Biker2Text"
+ },
+ "TEXT_ROUTE17_BIKER3": {
+ "asm": true,
+ "label": "Route17Biker3Text"
+ },
+ "TEXT_ROUTE17_BIKER4": {
+ "asm": true,
+ "label": "Route17Biker4Text"
+ },
+ "TEXT_ROUTE17_BIKER5": {
+ "asm": true,
+ "label": "Route17Biker5Text"
+ },
+ "TEXT_ROUTE17_BIKER6": {
+ "asm": true,
+ "label": "Route17Biker6Text"
+ },
+ "TEXT_ROUTE17_BIKER7": {
+ "asm": true,
+ "label": "Route17Biker7Text"
+ },
+ "TEXT_ROUTE17_BIKER8": {
+ "asm": true,
+ "label": "Route17Biker8Text"
+ },
+ "TEXT_ROUTE17_BIKER9": {
+ "asm": true,
+ "label": "Route17Biker9Text"
+ },
+ "TEXT_ROUTE17_CYCLING_ROAD_ENDS_SIGN": {
+ "label": "Route17CyclingRoadEndsSignText",
+ "text": "_Route17CyclingRoadEndsSignText"
+ },
+ "TEXT_ROUTE17_NOTICE_SIGN1": {
+ "label": "Route17NoticeSign1Text",
+ "text": "_Route17NoticeSign1Text"
+ },
+ "TEXT_ROUTE17_NOTICE_SIGN2": {
+ "label": "Route17NoticeSign2Text",
+ "text": "_Route17NoticeSign2Text"
+ },
+ "TEXT_ROUTE17_SIGN": {
+ "label": "Route17SignText",
+ "text": "_Route17SignText"
+ },
+ "TEXT_ROUTE17_TRAINER_TIPS1": {
+ "label": "Route17TrainerTips1Text",
+ "text": "_Route17TrainerTips1Text"
+ },
+ "TEXT_ROUTE17_TRAINER_TIPS2": {
+ "label": "Route17TrainerTips2Text",
+ "text": "_Route17TrainerTips2Text"
+ }
+ },
+ "Route18": {
+ "TEXT_ROUTE18_COOLTRAINER_M1": {
+ "asm": true,
+ "label": "Route18CooltrainerM1Text"
+ },
+ "TEXT_ROUTE18_COOLTRAINER_M2": {
+ "asm": true,
+ "label": "Route18CooltrainerM2Text"
+ },
+ "TEXT_ROUTE18_COOLTRAINER_M3": {
+ "asm": true,
+ "label": "Route18CooltrainerM3Text"
+ },
+ "TEXT_ROUTE18_CYCLING_ROAD_SIGN": {
+ "label": "Route18CyclingRoadSignText",
+ "text": "_Route18CyclingRoadSignText"
+ },
+ "TEXT_ROUTE18_SIGN": {
+ "label": "Route18SignText",
+ "text": "_Route18SignText"
+ }
+ },
+ "Route18Gate1F": {
+ "TEXT_ROUTE18GATE1F_GUARD": {
+ "asm": true,
+ "label": "Route18Gate1FGuardText",
+ "text": "_Route18Gate1FGuardYouNeedABicycleText"
+ },
+ "TEXT_ROUTE18GATE1F_GUARD_EXCUSE_ME": {
+ "label": "Route18Gate1FGuardExcuseMeText",
+ "text": "_Route18Gate1FGuardExcuseMeText"
+ }
+ },
+ "Route18Gate2F": {
+ "TEXT_ROUTE18GATE2F_COOK": {
+ "asm": true,
+ "label": "Route18Gate2FCookText"
+ },
+ "TEXT_ROUTE18GATE2F_LEFT_BINOCULARS": {
+ "asm": true,
+ "label": "Route18Gate2FLeftBinocularsText",
+ "text": "_Route18Gate2FLeftBinocularsText"
+ },
+ "TEXT_ROUTE18GATE2F_RIGHT_BINOCULARS": {
+ "asm": true,
+ "label": "Route18Gate2FRightBinocularsText",
+ "text": "_Route18Gate2FRightBinocularsText"
+ }
+ },
+ "Route19": {
+ "TEXT_ROUTE19_COOLTRAINER_M1": {
+ "asm": true,
+ "label": "Route19CooltrainerM1Text"
+ },
+ "TEXT_ROUTE19_COOLTRAINER_M2": {
+ "asm": true,
+ "label": "Route19CooltrainerM2Text"
+ },
+ "TEXT_ROUTE19_SIGN": {
+ "label": "Route19SignText",
+ "text": "_Route19SignText"
+ },
+ "TEXT_ROUTE19_SWIMMER1": {
+ "asm": true,
+ "label": "Route19Swimmer1Text"
+ },
+ "TEXT_ROUTE19_SWIMMER2": {
+ "asm": true,
+ "label": "Route19Swimmer2Text"
+ },
+ "TEXT_ROUTE19_SWIMMER3": {
+ "asm": true,
+ "label": "Route19Swimmer3Text"
+ },
+ "TEXT_ROUTE19_SWIMMER4": {
+ "asm": true,
+ "label": "Route19Swimmer4Text"
+ },
+ "TEXT_ROUTE19_SWIMMER5": {
+ "asm": true,
+ "label": "Route19Swimmer5Text"
+ },
+ "TEXT_ROUTE19_SWIMMER6": {
+ "asm": true,
+ "label": "Route19Swimmer6Text"
+ },
+ "TEXT_ROUTE19_SWIMMER7": {
+ "asm": true,
+ "label": "Route19Swimmer7Text"
+ },
+ "TEXT_ROUTE19_SWIMMER8": {
+ "asm": true,
+ "label": "Route19Swimmer8Text"
+ }
+ },
+ "Route2": {
+ "TEXT_ROUTE2_DIGLETTS_CAVE_SIGN": {
+ "label": "Route2DiglettsCaveSignText",
+ "text": "_Route2DiglettsCaveSignText"
+ },
+ "TEXT_ROUTE2_HP_UP": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROUTE2_MOON_STONE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROUTE2_SIGN": {
+ "label": "Route2SignText",
+ "text": "_Route2SignText"
+ }
+ },
+ "Route20": {
+ "TEXT_ROUTE20_COOLTRAINER_M": {
+ "asm": true,
+ "label": "Route20CooltrainerMText"
+ },
+ "TEXT_ROUTE20_SEAFOAM_ISLANDS_EAST_SIGN": {
+ "label": "Route20SeafoamIslandsSignText",
+ "text": "_Route20SeafoamIslandsSignText"
+ },
+ "TEXT_ROUTE20_SEAFOAM_ISLANDS_WEST_SIGN": {
+ "label": "Route20SeafoamIslandsSignText",
+ "text": "_Route20SeafoamIslandsSignText"
+ },
+ "TEXT_ROUTE20_SWIMMER1": {
+ "asm": true,
+ "label": "Route20Swimmer1Text"
+ },
+ "TEXT_ROUTE20_SWIMMER2": {
+ "asm": true,
+ "label": "Route20Swimmer2Text"
+ },
+ "TEXT_ROUTE20_SWIMMER3": {
+ "asm": true,
+ "label": "Route20Swimmer3Text"
+ },
+ "TEXT_ROUTE20_SWIMMER4": {
+ "asm": true,
+ "label": "Route20Swimmer4Text"
+ },
+ "TEXT_ROUTE20_SWIMMER5": {
+ "asm": true,
+ "label": "Route20Swimmer5Text"
+ },
+ "TEXT_ROUTE20_SWIMMER6": {
+ "asm": true,
+ "label": "Route20Swimmer6Text"
+ },
+ "TEXT_ROUTE20_SWIMMER7": {
+ "asm": true,
+ "label": "Route20Swimmer7Text"
+ },
+ "TEXT_ROUTE20_SWIMMER8": {
+ "asm": true,
+ "label": "Route20Swimmer8Text"
+ },
+ "TEXT_ROUTE20_SWIMMER9": {
+ "asm": true,
+ "label": "Route20Swimmer9Text"
+ }
+ },
+ "Route21": {
+ "TEXT_ROUTE21_FISHER1": {
+ "asm": true,
+ "label": "Route21Fisher1Text"
+ },
+ "TEXT_ROUTE21_FISHER2": {
+ "asm": true,
+ "label": "Route21Fisher2Text"
+ },
+ "TEXT_ROUTE21_FISHER3": {
+ "asm": true,
+ "label": "Route21Fisher3Text"
+ },
+ "TEXT_ROUTE21_FISHER4": {
+ "asm": true,
+ "label": "Route21Fisher4Text"
+ },
+ "TEXT_ROUTE21_SWIMMER1": {
+ "asm": true,
+ "label": "Route21Swimmer1Text"
+ },
+ "TEXT_ROUTE21_SWIMMER2": {
+ "asm": true,
+ "label": "Route21Swimmer2Text"
+ },
+ "TEXT_ROUTE21_SWIMMER3": {
+ "asm": true,
+ "label": "Route21Swimmer3Text"
+ },
+ "TEXT_ROUTE21_SWIMMER4": {
+ "asm": true,
+ "label": "Route21Swimmer4Text"
+ },
+ "TEXT_ROUTE21_SWIMMER5": {
+ "asm": true,
+ "label": "Route21Swimmer5Text"
+ }
+ },
+ "Route22": {
+ "TEXT_ROUTE22_POKEMON_LEAGUE_SIGN": {
+ "asm": true,
+ "label": "Route22PokemonLeagueSignText"
+ },
+ "TEXT_ROUTE22_RIVAL1": {
+ "asm": true,
+ "label": "Route22Rival1Text"
+ },
+ "TEXT_ROUTE22_RIVAL2": {
+ "asm": true,
+ "label": "Route22Rival2Text"
+ }
+ },
+ "Route22Gate": {
+ "TEXT_ROUTE22GATE_GUARD": {
+ "asm": true,
+ "label": "Route22GateGuardText"
+ }
+ },
+ "Route23": {
+ "TEXT_ROUTE23_GUARD1": {
+ "asm": true,
+ "label": "Route23Guard1Text"
+ },
+ "TEXT_ROUTE23_GUARD2": {
+ "asm": true,
+ "label": "Route23Guard2Text"
+ },
+ "TEXT_ROUTE23_GUARD3": {
+ "asm": true,
+ "label": "Route23Guard3Text"
+ },
+ "TEXT_ROUTE23_GUARD4": {
+ "asm": true,
+ "label": "Route23Guard4Text"
+ },
+ "TEXT_ROUTE23_GUARD5": {
+ "asm": true,
+ "label": "Route23Guard5Text"
+ },
+ "TEXT_ROUTE23_SWIMMER1": {
+ "asm": true,
+ "label": "Route23Swimmer1Text"
+ },
+ "TEXT_ROUTE23_SWIMMER2": {
+ "asm": true,
+ "label": "Route23Swimmer2Text"
+ },
+ "TEXT_ROUTE23_VICTORY_ROAD_GATE_SIGN": {
+ "label": "Route23VictoryRoadGateSignText",
+ "text": "_Route23VictoryRoadGateSignText"
+ }
+ },
+ "Route24": {
+ "TEXT_ROUTE24_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "Route24CooltrainerF1Text"
+ },
+ "TEXT_ROUTE24_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "Route24CooltrainerF2Text"
+ },
+ "TEXT_ROUTE24_COOLTRAINER_M1": {
+ "asm": true,
+ "label": "Route24CooltrainerM1Text",
+ "text": "_Route24CooltrainerM1YouBeatOurContestText"
+ },
+ "TEXT_ROUTE24_COOLTRAINER_M2": {
+ "asm": true,
+ "label": "Route24CooltrainerM2Text"
+ },
+ "TEXT_ROUTE24_COOLTRAINER_M3": {
+ "asm": true,
+ "label": "Route24CooltrainerM3Text"
+ },
+ "TEXT_ROUTE24_COOLTRAINER_M4": {
+ "asm": true,
+ "label": "Route24CooltrainerM4Text"
+ },
+ "TEXT_ROUTE24_TM_THUNDER_WAVE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROUTE24_YOUNGSTER1": {
+ "asm": true,
+ "label": "Route24Youngster1Text"
+ },
+ "TEXT_ROUTE24_YOUNGSTER2": {
+ "asm": true,
+ "label": "Route24Youngster2Text"
+ }
+ },
+ "Route25": {
+ "TEXT_ROUTE25_BILL_SIGN": {
+ "label": "Route25BillSignText",
+ "text": "_Route25BillSignText"
+ },
+ "TEXT_ROUTE25_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "Route25CooltrainerF1Text"
+ },
+ "TEXT_ROUTE25_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "Route25CooltrainerF2Text"
+ },
+ "TEXT_ROUTE25_COOLTRAINER_M": {
+ "asm": true,
+ "label": "Route25CooltrainerMText"
+ },
+ "TEXT_ROUTE25_HIKER1": {
+ "asm": true,
+ "label": "Route25Hiker1Text"
+ },
+ "TEXT_ROUTE25_HIKER2": {
+ "asm": true,
+ "label": "Route25Hiker2Text"
+ },
+ "TEXT_ROUTE25_HIKER3": {
+ "asm": true,
+ "label": "Route25Hiker3Text"
+ },
+ "TEXT_ROUTE25_TM_SEISMIC_TOSS": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROUTE25_YOUNGSTER1": {
+ "asm": true,
+ "label": "Route25Youngster1Text"
+ },
+ "TEXT_ROUTE25_YOUNGSTER2": {
+ "asm": true,
+ "label": "Route25Youngster2Text"
+ },
+ "TEXT_ROUTE25_YOUNGSTER3": {
+ "asm": true,
+ "label": "Route25Youngster3Text"
+ }
+ },
+ "Route2Gate": {
+ "TEXT_ROUTE2GATE_OAKS_AIDE": {
+ "asm": true,
+ "label": "Route2GateOaksAideText",
+ "text": "_Route2GateOaksAideFlashExplanationText"
+ },
+ "TEXT_ROUTE2GATE_YOUNGSTER": {
+ "label": "Route2GateYoungsterText",
+ "text": "_Route2GateYoungsterText"
+ }
+ },
+ "Route2TradeHouse": {
+ "TEXT_ROUTE2TRADEHOUSE_GAMEBOY_KID": {
+ "asm": true,
+ "label": "Route2TradeHouseGameboyKidText"
+ },
+ "TEXT_ROUTE2TRADEHOUSE_SCIENTIST": {
+ "label": "Route2TradeHouseScientistText",
+ "text": "_Route2TradeHouseScientistText"
+ }
+ },
+ "Route3": {
+ "TEXT_ROUTE3_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "Route3CooltrainerF1Text"
+ },
+ "TEXT_ROUTE3_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "Route3CooltrainerF2Text"
+ },
+ "TEXT_ROUTE3_COOLTRAINER_F3": {
+ "asm": true,
+ "label": "Route3CooltrainerF3Text"
+ },
+ "TEXT_ROUTE3_SIGN": {
+ "label": "Route3SignText",
+ "text": "_Route3SignText"
+ },
+ "TEXT_ROUTE3_SUPER_NERD": {
+ "label": "Route3SuperNerdText",
+ "text": "_Route3Text1"
+ },
+ "TEXT_ROUTE3_YOUNGSTER1": {
+ "asm": true,
+ "label": "Route3Youngster1Text"
+ },
+ "TEXT_ROUTE3_YOUNGSTER2": {
+ "asm": true,
+ "label": "Route3Youngster2Text"
+ },
+ "TEXT_ROUTE3_YOUNGSTER3": {
+ "asm": true,
+ "label": "Route3Youngster3Text"
+ },
+ "TEXT_ROUTE3_YOUNGSTER4": {
+ "asm": true,
+ "label": "Route3Youngster4Text"
+ },
+ "TEXT_ROUTE3_YOUNGSTER5": {
+ "asm": true,
+ "label": "Route3Youngster5Text"
+ }
+ },
+ "Route4": {
+ "TEXT_ROUTE4_COOLTRAINER_F1": {
+ "label": "Route4CooltrainerF1Text",
+ "text": "_Route4CooltrainerF1Text"
+ },
+ "TEXT_ROUTE4_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "Route4CooltrainerF2Text"
+ },
+ "TEXT_ROUTE4_MT_MOON_SIGN": {
+ "label": "Route4MtMoonSignText",
+ "text": "_Route4MtMoonSignText"
+ },
+ "TEXT_ROUTE4_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_ROUTE4_SIGN": {
+ "label": "Route4SignText",
+ "text": "_Route4SignText"
+ },
+ "TEXT_ROUTE4_TM_WHIRLWIND": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "Route5": {
+ "TEXT_ROUTE5_UNDERGROUND_PATH_SIGN": {
+ "label": "Route5UndergroundPathSignText",
+ "text": "_Route5UndergroundPathSignText"
+ }
+ },
+ "Route5Gate": {
+ "TEXT_ROUTE5GATE_GUARD": {
+ "asm": true,
+ "label": "SaffronGateGuardText"
+ },
+ "TEXT_ROUTE5GATE_GUARD_GEE_IM_THIRSTY": {
+ "label": "SaffronGateGuardGeeImThirstyText",
+ "text": "_SaffronGateGuardGeeImThirstyText"
+ },
+ "TEXT_ROUTE5GATE_GUARD_GIVE_DRINK": {
+ "label": "SaffronGateGuardGiveDrinkText",
+ "text": "_SaffronGateGuardImParchedText"
+ }
+ },
+ "Route6": {
+ "TEXT_ROUTE6_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "Route6CooltrainerF1Text"
+ },
+ "TEXT_ROUTE6_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "Route6CooltrainerF2Text"
+ },
+ "TEXT_ROUTE6_COOLTRAINER_M1": {
+ "asm": true,
+ "label": "Route6CooltrainerM1Text"
+ },
+ "TEXT_ROUTE6_COOLTRAINER_M2": {
+ "asm": true,
+ "label": "Route6CooltrainerM2Text"
+ },
+ "TEXT_ROUTE6_UNDERGROUND_PATH_SIGN": {
+ "label": "Route6UndergroundPathSignText",
+ "text": "_Route6UndergroundPathSignText"
+ },
+ "TEXT_ROUTE6_YOUNGSTER1": {
+ "asm": true,
+ "label": "Route6Youngster1Text"
+ },
+ "TEXT_ROUTE6_YOUNGSTER2": {
+ "asm": true,
+ "label": "Route6Youngster2Text"
+ }
+ },
+ "Route6Gate": {
+ "TEXT_ROUTE6GATE_GUARD": {
+ "asm": true,
+ "label": "SaffronGateGuardText"
+ },
+ "TEXT_ROUTE6GATE_GUARD_GEE_IM_THIRSTY": {
+ "asm": true,
+ "label": "SaffronGateGuardGeeImThirstyText"
+ },
+ "TEXT_ROUTE6GATE_GUARD_GIVE_DRINK": {
+ "asm": true,
+ "label": "SaffronGateGuardGiveDrinkText"
+ }
+ },
+ "Route7": {
+ "TEXT_ROUTE7_UNDERGROUND_PATH_SIGN": {
+ "label": "Route7UndergroundPathSignText",
+ "text": "_Route7UndergroundPathSignText"
+ }
+ },
+ "Route7Gate": {
+ "TEXT_ROUTE7GATE_GUARD": {
+ "asm": true,
+ "label": "SaffronGateGuardText"
+ },
+ "TEXT_ROUTE7GATE_GUARD_GEE_IM_THIRSTY": {
+ "asm": true,
+ "label": "SaffronGateGuardGeeImThirstyText"
+ },
+ "TEXT_ROUTE7GATE_GUARD_GIVE_DRINK": {
+ "asm": true,
+ "label": "SaffronGateGuardGiveDrinkText"
+ }
+ },
+ "Route8": {
+ "TEXT_ROUTE8_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "Route8CooltrainerF1Text"
+ },
+ "TEXT_ROUTE8_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "Route8CooltrainerF2Text"
+ },
+ "TEXT_ROUTE8_COOLTRAINER_F3": {
+ "asm": true,
+ "label": "Route8CooltrainerF3Text"
+ },
+ "TEXT_ROUTE8_COOLTRAINER_F4": {
+ "asm": true,
+ "label": "Route8CooltrainerF4Text"
+ },
+ "TEXT_ROUTE8_GAMBLER1": {
+ "asm": true,
+ "label": "Route8Gambler1Text"
+ },
+ "TEXT_ROUTE8_GAMBLER2": {
+ "asm": true,
+ "label": "Route8Gambler2Text"
+ },
+ "TEXT_ROUTE8_SUPER_NERD1": {
+ "asm": true,
+ "label": "Route8SuperNerd1Text"
+ },
+ "TEXT_ROUTE8_SUPER_NERD2": {
+ "asm": true,
+ "label": "Route8SuperNerd2Text"
+ },
+ "TEXT_ROUTE8_SUPER_NERD3": {
+ "asm": true,
+ "label": "Route8SuperNerd3Text"
+ },
+ "TEXT_ROUTE8_UNDERGROUND_SIGN": {
+ "label": "Route8UndergroundSignText",
+ "text": "_Route8UndergroundSignText"
+ }
+ },
+ "Route8Gate": {
+ "TEXT_ROUTE8GATE_GUARD": {
+ "asm": true,
+ "label": "SaffronGateGuardText"
+ },
+ "TEXT_ROUTE8GATE_GUARD_GEE_IM_THIRSTY": {
+ "asm": true,
+ "label": "SaffronGateGuardGeeImThirstyText"
+ },
+ "TEXT_ROUTE8GATE_GUARD_GIVE_DRINK": {
+ "asm": true,
+ "label": "SaffronGateGuardGiveDrinkText"
+ }
+ },
+ "Route9": {
+ "TEXT_ROUTE9_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "Route9CooltrainerF1Text"
+ },
+ "TEXT_ROUTE9_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "Route9CooltrainerF2Text"
+ },
+ "TEXT_ROUTE9_COOLTRAINER_M1": {
+ "asm": true,
+ "label": "Route9AJText"
+ },
+ "TEXT_ROUTE9_COOLTRAINER_M2": {
+ "asm": true,
+ "label": "Route9CooltrainerM2Text"
+ },
+ "TEXT_ROUTE9_HIKER1": {
+ "asm": true,
+ "label": "Route9Hiker1Text"
+ },
+ "TEXT_ROUTE9_HIKER2": {
+ "asm": true,
+ "label": "Route9Hiker2Text"
+ },
+ "TEXT_ROUTE9_HIKER3": {
+ "asm": true,
+ "label": "Route9Hiker3Text"
+ },
+ "TEXT_ROUTE9_SIGN": {
+ "label": "Route9SignText",
+ "text": "_Route9SignText"
+ },
+ "TEXT_ROUTE9_TM_TELEPORT": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_ROUTE9_YOUNGSTER1": {
+ "asm": true,
+ "label": "Route9Youngster1Text"
+ },
+ "TEXT_ROUTE9_YOUNGSTER2": {
+ "asm": true,
+ "label": "Route9Youngster2Text"
+ }
+ },
+ "SSAnne1F": {
+ "TEXT_SSANNE1F_SAILOR": {
+ "label": "SSAnne1FSailorText",
+ "text": "_SSAnne1FSailorText"
+ },
+ "TEXT_SSANNE1F_WAITER": {
+ "label": "SSAnne1FWaiterText",
+ "text": "_SSAnne1FWaiterText"
+ }
+ },
+ "SSAnne1FRooms": {
+ "TEXT_SSANNE1FROOMS_COOLTRAINER_F": {
+ "asm": true,
+ "label": "SSAnne1FRoomsCooltrainerFText"
+ },
+ "TEXT_SSANNE1FROOMS_GENTLEMAN1": {
+ "asm": true,
+ "label": "SSAnne1FRoomsGentleman1Text"
+ },
+ "TEXT_SSANNE1FROOMS_GENTLEMAN2": {
+ "asm": true,
+ "label": "SSAnne1FRoomsGentleman2Text"
+ },
+ "TEXT_SSANNE1FROOMS_GENTLEMAN3": {
+ "label": "SSAnne1FRoomsGentleman3Text",
+ "text": "_SSAnne1FRoomsGentleman3Text"
+ },
+ "TEXT_SSANNE1FROOMS_GIRL1": {
+ "label": "SSAnne1FRoomsGirl1Text",
+ "text": "_SSAnne1FRoomsGirl1Text"
+ },
+ "TEXT_SSANNE1FROOMS_GIRL2": {
+ "label": "SSAnne1FRoomsGirl2Text",
+ "text": "_SSAnne1FRoomsGirl2Text"
+ },
+ "TEXT_SSANNE1FROOMS_LITTLE_GIRL": {
+ "label": "SSAnne1FRoomsLittleGirlText",
+ "text": "_SSAnne1FRoomsLittleGirlText"
+ },
+ "TEXT_SSANNE1FROOMS_MIDDLE_AGED_MAN": {
+ "label": "SSAnne1FRoomsMiddleAgedManText",
+ "text": "_SSAnne1FRoomsMiddleAgedManText"
+ },
+ "TEXT_SSANNE1FROOMS_TM_BODY_SLAM": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SSANNE1FROOMS_WIGGLYTUFF": {
+ "asm": true,
+ "label": "SSAnne1FRoomsWigglytuffText",
+ "text": "_SSAnne1FRoomsWigglytuffText"
+ },
+ "TEXT_SSANNE1FROOMS_YOUNGSTER": {
+ "asm": true,
+ "label": "SSAnne1FRoomsYoungsterText"
+ }
+ },
+ "SSAnne2F": {
+ "TEXT_SSANNE2F_RIVAL": {
+ "asm": true,
+ "label": "SSAnne2FRivalText",
+ "text": "_SSAnne2FRivalText"
+ },
+ "TEXT_SSANNE2F_RIVAL_CUT_MASTER": {
+ "label": "SSAnne2FRivalCutMasterText",
+ "text": "_SSAnne2FRivalCutMasterText"
+ },
+ "TEXT_SSANNE2F_WAITER": {
+ "label": "SSAnne2FWaiterText",
+ "text": "_SSAnne2FWaiterText"
+ }
+ },
+ "SSAnne2FRooms": {
+ "TEXT_SSANNE2FROOMS_BEAUTY": {
+ "asm": true,
+ "label": "SSAnne2FRoomsBeautyText"
+ },
+ "TEXT_SSANNE2FROOMS_BRUNETTE_GIRL": {
+ "asm": true,
+ "label": "SSAnne2FRoomsBrunetteGirlText"
+ },
+ "TEXT_SSANNE2FROOMS_COOLTRAINER_F": {
+ "asm": true,
+ "label": "SSAnne2FRoomsCooltrainerFText"
+ },
+ "TEXT_SSANNE2FROOMS_FISHER": {
+ "asm": true,
+ "label": "SSAnne2FRoomsFisherText"
+ },
+ "TEXT_SSANNE2FROOMS_GENTLEMAN1": {
+ "asm": true,
+ "label": "SSAnne2FRoomsGentleman1Text"
+ },
+ "TEXT_SSANNE2FROOMS_GENTLEMAN2": {
+ "asm": true,
+ "label": "SSAnne2FRoomsGentleman2Text"
+ },
+ "TEXT_SSANNE2FROOMS_GENTLEMAN3": {
+ "asm": true,
+ "label": "SSAnne2FRoomsGentleman3Text",
+ "text": "_SSAnne2FRoomsGentleman3Text"
+ },
+ "TEXT_SSANNE2FROOMS_GENTLEMAN4": {
+ "asm": true,
+ "label": "SSAnne2FRoomsGentleman4Text",
+ "text": "_SSAnne2FRoomsGentleman4Text"
+ },
+ "TEXT_SSANNE2FROOMS_GENTLEMAN5": {
+ "asm": true,
+ "label": "SSAnne2FRoomsGentleman5Text"
+ },
+ "TEXT_SSANNE2FROOMS_GRAMPS": {
+ "asm": true,
+ "label": "SSAnne2FRoomsGrampsText",
+ "text": "_SSAnne2FRoomsGrampsText"
+ },
+ "TEXT_SSANNE2FROOMS_LITTLE_BOY": {
+ "asm": true,
+ "label": "SSAnne2FRoomsLittleBoyText"
+ },
+ "TEXT_SSANNE2FROOMS_MAX_ETHER": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SSANNE2FROOMS_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "SSAnne3F": {
+ "TEXT_SSANNE3F_SAILOR": {
+ "label": "SSAnne3FSailorText",
+ "text": "_SSAnne3FSailorText"
+ }
+ },
+ "SSAnneB1FRooms": {
+ "TEXT_SSANNEB1FROOMS_ETHER": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SSANNEB1FROOMS_FISHER": {
+ "asm": true,
+ "label": "SSAnneB1FRoomsFisherText"
+ },
+ "TEXT_SSANNEB1FROOMS_MACHOKE": {
+ "asm": true,
+ "label": "SSAnneB1FRoomsMachokeText",
+ "text": "_SSAnneB1FRoomsMachokeText"
+ },
+ "TEXT_SSANNEB1FROOMS_MAX_POTION": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SSANNEB1FROOMS_SAILOR1": {
+ "asm": true,
+ "label": "SSAnneB1FRoomsSailor1Text"
+ },
+ "TEXT_SSANNEB1FROOMS_SAILOR2": {
+ "asm": true,
+ "label": "SSAnneB1FRoomsSailor2Text"
+ },
+ "TEXT_SSANNEB1FROOMS_SAILOR3": {
+ "asm": true,
+ "label": "SSAnneB1FRoomsSailor3Text"
+ },
+ "TEXT_SSANNEB1FROOMS_SAILOR4": {
+ "asm": true,
+ "label": "SSAnneB1FRoomsSailor4Text"
+ },
+ "TEXT_SSANNEB1FROOMS_SAILOR5": {
+ "asm": true,
+ "label": "SSAnneB1FRoomsSailor5Text"
+ },
+ "TEXT_SSANNEB1FROOMS_SUPER_NERD": {
+ "label": "SSAnneB1FRoomsSuperNerdText",
+ "text": "_SSAnneB1FRoomsSuperNerdText"
+ },
+ "TEXT_SSANNEB1FROOMS_TM_REST": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "SSAnneBow": {
+ "TEXT_SSANNEBOW_COOLTRAINER_M": {
+ "label": "SSAnneBowCooltrainerMText",
+ "text": "_SSAnneBowCooltrainerMText"
+ },
+ "TEXT_SSANNEBOW_SAILOR1": {
+ "label": "SSAnneBowSailor1Text",
+ "text": "_SSAnneBowSailor1Text"
+ },
+ "TEXT_SSANNEBOW_SAILOR2": {
+ "asm": true,
+ "label": "SSAnneBowSailor2Text"
+ },
+ "TEXT_SSANNEBOW_SAILOR3": {
+ "asm": true,
+ "label": "SSAnneBowSailor3Text"
+ },
+ "TEXT_SSANNEBOW_SUPER_NERD": {
+ "label": "SSAnneBowSuperNerdText",
+ "text": "_SSAnneBowSuperNerdText"
+ }
+ },
+ "SSAnneCaptainsRoom": {
+ "TEXT_SSANNECAPTAINSROOM_CAPTAIN": {
+ "asm": true,
+ "label": "SSAnneCaptainsRoomCaptainText"
+ },
+ "TEXT_SSANNECAPTAINSROOM_SEASICK_BOOK": {
+ "label": "SSAnneCaptainsRoomSeasickBookText",
+ "text": "_SSAnneCaptainsRoomSeasickBookText"
+ },
+ "TEXT_SSANNECAPTAINSROOM_TRASH": {
+ "label": "SSAnneCaptainsRoomTrashText",
+ "text": "_SSAnneCaptainsRoomTrashText"
+ }
+ },
+ "SSAnneKitchen": {
+ "TEXT_SSANNEKITCHEN_COOK1": {
+ "label": "SSAnneKitchenCook1Text",
+ "text": "_SSAnneKitchenCook1Text"
+ },
+ "TEXT_SSANNEKITCHEN_COOK2": {
+ "label": "SSAnneKitchenCook2Text",
+ "text": "_SSAnneKitchenCook2Text"
+ },
+ "TEXT_SSANNEKITCHEN_COOK3": {
+ "label": "SSAnneKitchenCook3Text",
+ "text": "_SSAnneKitchenCook3Text"
+ },
+ "TEXT_SSANNEKITCHEN_COOK4": {
+ "label": "SSAnneKitchenCook4Text",
+ "text": "_SSAnneKitchenCook4Text"
+ },
+ "TEXT_SSANNEKITCHEN_COOK5": {
+ "label": "SSAnneKitchenCook5Text",
+ "text": "_SSAnneKitchenCook5Text"
+ },
+ "TEXT_SSANNEKITCHEN_COOK6": {
+ "label": "SSAnneKitchenCook6Text",
+ "text": "_SSAnneKitchenCook6Text"
+ },
+ "TEXT_SSANNEKITCHEN_COOK7": {
+ "asm": true,
+ "label": "SSAnneKitchenCook7Text",
+ "text": "_SSAnneKitchenCook7MainCourseIsText"
+ }
+ },
+ "SafariZoneCenter": {
+ "TEXT_SAFARIZONECENTER_NUGGET": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONECENTER_REST_HOUSE_SIGN": {
+ "label": "SafariZoneCenterRestHouseSignText",
+ "text": "_SafariZoneCenterRestHouseSignText"
+ },
+ "TEXT_SAFARIZONECENTER_TRAINER_TIPS_SIGN": {
+ "label": "SafariZoneCenterTrainerTipsSignText",
+ "text": "_SafariZoneCenterTrainerTipsSignText"
+ }
+ },
+ "SafariZoneCenterRestHouse": {
+ "TEXT_SAFARIZONECENTERRESTHOUSE_GIRL": {
+ "label": "SafariZoneCenterRestHouseGirlText",
+ "text": "_SafariZoneCenterRestHouseGirlText"
+ },
+ "TEXT_SAFARIZONECENTERRESTHOUSE_SCIENTIST": {
+ "label": "SafariZoneCenterRestHouseScientistText",
+ "text": "_SafariZoneCenterRestHouseScientistText"
+ }
+ },
+ "SafariZoneEast": {
+ "TEXT_SAFARIZONEEAST_CARBOS": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONEEAST_FULL_RESTORE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONEEAST_MAX_RESTORE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONEEAST_REST_HOUSE_SIGN": {
+ "label": "SafariZoneEastRestHouseSignText",
+ "text": "_SafariZoneEastRestHouseSignText"
+ },
+ "TEXT_SAFARIZONEEAST_SIGN": {
+ "label": "SafariZoneEastSignText",
+ "text": "_SafariZoneEastSignText"
+ },
+ "TEXT_SAFARIZONEEAST_TM_EGG_BOMB": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONEEAST_TRAINER_TIPS": {
+ "label": "SafariZoneEastTrainerTipsText",
+ "text": "_SafariZoneEastTrainerTipsText"
+ }
+ },
+ "SafariZoneEastRestHouse": {
+ "TEXT_SAFARIZONEEASTRESTHOUSE_ROCKER": {
+ "label": "SafariZoneEastRestHouseRockerText",
+ "text": "_SafariZoneEastRestHouseRockerText"
+ },
+ "TEXT_SAFARIZONEEASTRESTHOUSE_SCIENTIST": {
+ "label": "SafariZoneEastRestHouseScientistText",
+ "text": "_SafariZoneEastRestHouseScientistText"
+ },
+ "TEXT_SAFARIZONEEASTRESTHOUSE_SILPH_WORKER_M": {
+ "label": "SafariZoneEastRestHouseSilphWorkerMText",
+ "text": "_SafariZoneEastRestHouseSilphWorkerMText"
+ }
+ },
+ "SafariZoneGate": {
+ "TEXT_SAFARIZONEGATE_SAFARI_ZONE_WORKER1": {
+ "label": "SafariZoneGateSafariZoneWorker1Text",
+ "text": "_SafariZoneGateSafariZoneWorker1Text"
+ },
+ "TEXT_SAFARIZONEGATE_SAFARI_ZONE_WORKER1_1": {
+ "label": "SafariZoneGateSafariZoneWorker1Text",
+ "text": "_SafariZoneGateSafariZoneWorker1Text"
+ },
+ "TEXT_SAFARIZONEGATE_SAFARI_ZONE_WORKER1_GOOD_HAUL_COME_AGAIN": {
+ "label": "SafariZoneGateSafariZoneWorker1GoodHaulComeAgainText",
+ "text": "_SafariZoneGateSafariZoneWorker1GoodHaulComeAgainText"
+ },
+ "TEXT_SAFARIZONEGATE_SAFARI_ZONE_WORKER1_LEAVING_EARLY": {
+ "asm": true,
+ "label": "SafariZoneGateSafariZoneWorker1LeavingEarlyText",
+ "text": "_SafariZoneGateSafariZoneWorker1LeavingEarlyText"
+ },
+ "TEXT_SAFARIZONEGATE_SAFARI_ZONE_WORKER1_WOULD_YOU_LIKE_TO_JOIN": {
+ "asm": true,
+ "label": "SafariZoneGateSafariZoneWorker1WouldYouLikeToJoinText"
+ },
+ "TEXT_SAFARIZONEGATE_SAFARI_ZONE_WORKER2": {
+ "asm": true,
+ "label": "SafariZoneGateSafariZoneWorker2Text"
+ }
+ },
+ "SafariZoneNorth": {
+ "TEXT_SAFARIZONENORTH_PROTEIN": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONENORTH_REST_HOUSE_SIGN": {
+ "label": "SafariZoneNorthRestHouseSignText",
+ "text": "_SafariZoneNorthRestHouseSignText"
+ },
+ "TEXT_SAFARIZONENORTH_SIGN": {
+ "label": "SafariZoneNorthSignText",
+ "text": "_SafariZoneNorthSignText"
+ },
+ "TEXT_SAFARIZONENORTH_TM_SKULL_BASH": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONENORTH_TRAINER_TIPS_1": {
+ "label": "SafariZoneNorthTrainerTips1Text",
+ "text": "_SafariZoneNorthTrainerTips1Text"
+ },
+ "TEXT_SAFARIZONENORTH_TRAINER_TIPS_2": {
+ "label": "SafariZoneNorthTrainerTips2Text",
+ "text": "_SafariZoneNorthTrainerTips2Text"
+ },
+ "TEXT_SAFARIZONENORTH_TRAINER_TIPS_3": {
+ "label": "SafariZoneNorthTrainerTips3Text",
+ "text": "_SafariZoneNorthTrainerTips3Text"
+ }
+ },
+ "SafariZoneNorthRestHouse": {
+ "TEXT_SAFARIZONENORTHRESTHOUSE_GENTLEMAN": {
+ "label": "SafariZoneNorthRestHouseGentlemanText",
+ "text": "_SafariZoneNorthRestHouseGentlemanText"
+ },
+ "TEXT_SAFARIZONENORTHRESTHOUSE_SAFARI_ZONE_WORKER": {
+ "label": "SafariZoneNorthRestHouseSafariZoneWorkerText",
+ "text": "_SafariZoneNorthRestHouseSafariZoneWorkerText"
+ },
+ "TEXT_SAFARIZONENORTHRESTHOUSE_SCIENTIST": {
+ "label": "SafariZoneNorthRestHouseScientistText",
+ "text": "_SafariZoneNorthRestHouseScientistText"
+ }
+ },
+ "SafariZoneSecretHouse": {
+ "TEXT_SAFARIZONESECRETHOUSE_FISHING_GURU": {
+ "asm": true,
+ "label": "SafariZoneSecretHouseFishingGuruText",
+ "text": "_SafariZoneSecretHouseFishingGuruYouHaveWonText"
+ }
+ },
+ "SafariZoneWest": {
+ "TEXT_SAFARIZONEWEST_FIND_WARDENS_TEETH_SIGN": {
+ "label": "SafariZoneWestFindWardensTeethSignText",
+ "text": "_SafariZoneWestFindWardensTeethSignText"
+ },
+ "TEXT_SAFARIZONEWEST_GOLD_TEETH": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONEWEST_MAX_POTION": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONEWEST_MAX_REVIVE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONEWEST_REST_HOUSE_SIGN": {
+ "label": "SafariZoneWestRestHouseSignText",
+ "text": "_SafariZoneWestRestHouseSignText"
+ },
+ "TEXT_SAFARIZONEWEST_SIGN": {
+ "label": "SafariZoneWestSignText",
+ "text": "_SafariZoneWestSignText"
+ },
+ "TEXT_SAFARIZONEWEST_TM_DOUBLE_TEAM": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SAFARIZONEWEST_TRAINER_TIPS": {
+ "label": "SafariZoneWestTrainerTipsText",
+ "text": "_SafariZoneWestTrainerTipsText"
+ }
+ },
+ "SafariZoneWestRestHouse": {
+ "TEXT_SAFARIZONEWESTRESTHOUSE_COOLTRAINER_M": {
+ "label": "SafariZoneWestRestHouseCooltrainerMText",
+ "text": "_SafariZoneWestRestHouseCooltrainerMText"
+ },
+ "TEXT_SAFARIZONEWESTRESTHOUSE_SCIENTIST": {
+ "label": "SafariZoneWestRestHouseScientistText",
+ "text": "_SafariZoneWestRestHouseScientistText"
+ },
+ "TEXT_SAFARIZONEWESTRESTHOUSE_SILPH_WORKER_F": {
+ "label": "SafariZoneWestRestHouseSilphWorkerFText",
+ "text": "_SafariZoneWestRestHouseSilphWorkerFText"
+ }
+ },
+ "SaffronCity": {
+ "TEXT_SAFFRONCITY_FIGHTING_DOJO_SIGN": {
+ "label": "SaffronCityFightingDojoSignText",
+ "text": "_SaffronCityFightingDojoSignText"
+ },
+ "TEXT_SAFFRONCITY_GENTLEMAN": {
+ "label": "SaffronCityGentlemanText",
+ "text": "_SaffronCityGentlemanText"
+ },
+ "TEXT_SAFFRONCITY_GYM_SIGN": {
+ "label": "SaffronCityGymSignText",
+ "text": "_SaffronCityGymSignText"
+ },
+ "TEXT_SAFFRONCITY_MART_SIGN": {
+ "asm": true,
+ "label": "MartSignText"
+ },
+ "TEXT_SAFFRONCITY_MR_PSYCHICS_HOUSE_SIGN": {
+ "label": "SaffronCityMrPsychicsHouseSignText",
+ "text": "_SaffronCityMrPsychicsHouseSignText"
+ },
+ "TEXT_SAFFRONCITY_PIDGEOT": {
+ "label": "SaffronCityPidgeotText",
+ "text": "_SaffronCityPidgeotText"
+ },
+ "TEXT_SAFFRONCITY_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_SAFFRONCITY_ROCKER": {
+ "label": "SaffronCityRockerText",
+ "text": "_SaffronCityRockerText"
+ },
+ "TEXT_SAFFRONCITY_ROCKET1": {
+ "label": "SaffronCityRocket1Text",
+ "text": "_SaffronCityRocket1Text"
+ },
+ "TEXT_SAFFRONCITY_ROCKET2": {
+ "label": "SaffronCityRocket2Text",
+ "text": "_SaffronCityRocket2Text"
+ },
+ "TEXT_SAFFRONCITY_ROCKET3": {
+ "label": "SaffronCityRocket3Text",
+ "text": "_SaffronCityRocket3Text"
+ },
+ "TEXT_SAFFRONCITY_ROCKET4": {
+ "label": "SaffronCityRocket4Text",
+ "text": "_SaffronCityRocket4Text"
+ },
+ "TEXT_SAFFRONCITY_ROCKET5": {
+ "label": "SaffronCityRocket5Text",
+ "text": "_SaffronCityRocket5Text"
+ },
+ "TEXT_SAFFRONCITY_ROCKET6": {
+ "label": "SaffronCityRocket6Text",
+ "text": "_SaffronCityRocket6Text"
+ },
+ "TEXT_SAFFRONCITY_ROCKET7": {
+ "label": "SaffronCityRocket7Text",
+ "text": "_SaffronCityRocket7Text"
+ },
+ "TEXT_SAFFRONCITY_ROCKET8": {
+ "label": "SaffronCityRocket8Text",
+ "text": "_SaffronCityRocket8Text"
+ },
+ "TEXT_SAFFRONCITY_ROCKET9": {
+ "label": "SaffronCityRocket9Text",
+ "text": "_SaffronCityRocket9Text"
+ },
+ "TEXT_SAFFRONCITY_SCIENTIST": {
+ "label": "SaffronCityScientistText",
+ "text": "_SaffronCityScientistText"
+ },
+ "TEXT_SAFFRONCITY_SIGN": {
+ "label": "SaffronCitySignText",
+ "text": "_SaffronCitySignText"
+ },
+ "TEXT_SAFFRONCITY_SILPH_CO_LATEST_PRODUCT_SIGN": {
+ "label": "SaffronCitySilphCoLatestProductSignText",
+ "text": "_SaffronCitySilphCoLatestProductSignText"
+ },
+ "TEXT_SAFFRONCITY_SILPH_CO_SIGN": {
+ "label": "SaffronCitySilphCoSignText",
+ "text": "_SaffronCitySilphCoSignText"
+ },
+ "TEXT_SAFFRONCITY_SILPH_WORKER_F": {
+ "label": "SaffronCitySilphWorkerFText",
+ "text": "_SaffronCitySilphWorkerFText"
+ },
+ "TEXT_SAFFRONCITY_SILPH_WORKER_M": {
+ "label": "SaffronCitySilphWorkerMText",
+ "text": "_SaffronCitySilphWorkerMText"
+ },
+ "TEXT_SAFFRONCITY_TRAINER_TIPS1": {
+ "label": "SaffronCityTrainerTips1Text",
+ "text": "_SaffronCityTrainerTips1Text"
+ },
+ "TEXT_SAFFRONCITY_TRAINER_TIPS2": {
+ "label": "SaffronCityTrainerTips2Text",
+ "text": "_SaffronCityTrainerTips2Text"
+ }
+ },
+ "SaffronGym": {
+ "TEXT_SAFFRONGYM_CHANNELER1": {
+ "asm": true,
+ "label": "SaffronGymChanneler1Text"
+ },
+ "TEXT_SAFFRONGYM_CHANNELER2": {
+ "asm": true,
+ "label": "SaffronGymChanneler2Text"
+ },
+ "TEXT_SAFFRONGYM_CHANNELER3": {
+ "asm": true,
+ "label": "SaffronGymChanneler3Text"
+ },
+ "TEXT_SAFFRONGYM_GYM_GUIDE": {
+ "asm": true,
+ "label": "SaffronGymGymGuideText",
+ "text": "_SaffronGymGuideChampInMakingText"
+ },
+ "TEXT_SAFFRONGYM_SABRINA": {
+ "asm": true,
+ "label": "SaffronGymSabrinaText",
+ "text": "_SaffronGymSabrinaText"
+ },
+ "TEXT_SAFFRONGYM_SABRINA_MARSH_BADGE_INFO": {
+ "label": "SaffronGymSabrinaMarshBadgeInfoText",
+ "text": "_SaffronGymSabrinaMarshBadgeInfoText"
+ },
+ "TEXT_SAFFRONGYM_SABRINA_RECEIVED_TM46": {
+ "label": "SaffronGymSabrinaReceivedTM46Text",
+ "text": "_SaffronGymSabrinaReceivedTM46Text"
+ },
+ "TEXT_SAFFRONGYM_SABRINA_TM46_NO_ROOM": {
+ "label": "SaffronGymSabrinaTM46NoRoomText",
+ "text": "_SaffronGymSabrinaTM46NoRoomText"
+ },
+ "TEXT_SAFFRONGYM_YOUNGSTER1": {
+ "asm": true,
+ "label": "SaffronGymYoungster1Text"
+ },
+ "TEXT_SAFFRONGYM_YOUNGSTER2": {
+ "asm": true,
+ "label": "SaffronGymYoungster2Text"
+ },
+ "TEXT_SAFFRONGYM_YOUNGSTER3": {
+ "asm": true,
+ "label": "SaffronGymYoungster3Text"
+ },
+ "TEXT_SAFFRONGYM_YOUNGSTER4": {
+ "asm": true,
+ "label": "SaffronGymYoungster4Text"
+ }
+ },
+ "SaffronMart": {
+ "TEXT_SAFFRONMART_CLERK": {
+ "label": "SaffronMartClerkText",
+ "mart": [
+ "GREAT_BALL",
+ "HYPER_POTION",
+ "MAX_REPEL",
+ "ESCAPE_ROPE",
+ "FULL_HEAL",
+ "REVIVE"
+ ]
+ },
+ "TEXT_SAFFRONMART_COOLTRAINER_F": {
+ "label": "SaffronMartCooltrainerFText",
+ "text": "_SaffronMartCooltrainerFText"
+ },
+ "TEXT_SAFFRONMART_SUPER_NERD": {
+ "label": "SaffronMartSuperNerdText",
+ "text": "_SaffronMartSuperNerdText"
+ }
+ },
+ "SaffronPidgeyHouse": {
+ "TEXT_SAFFRONPIDGEYHOUSE_BRUNETTE_GIRL": {
+ "label": "SaffronPidgeyHouseBrunetteGirlText",
+ "text": "_SaffronPidgeyHouseBrunetteGirlText"
+ },
+ "TEXT_SAFFRONPIDGEYHOUSE_PAPER": {
+ "label": "SaffronPidgeyHousePaperText",
+ "text": "_SaffronPidgeyHousePaperText"
+ },
+ "TEXT_SAFFRONPIDGEYHOUSE_PIDGEY": {
+ "asm": true,
+ "label": "SaffronPidgeyHousePidgeyText",
+ "text": "_SaffronPidgeyHousePidgeyText"
+ },
+ "TEXT_SAFFRONPIDGEYHOUSE_YOUNGSTER": {
+ "label": "SaffronPidgeyHouseYoungsterText",
+ "text": "_SaffronPidgeyHouseYoungsterText"
+ }
+ },
+ "SaffronPokecenter": {
+ "TEXT_SAFFRONPOKECENTER_BEAUTY": {
+ "label": "SaffronPokecenterBeautyText",
+ "text": "_SaffronPokecenterBeautyText"
+ },
+ "TEXT_SAFFRONPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "SaffronPokecenterChanseyText"
+ },
+ "TEXT_SAFFRONPOKECENTER_GENTLEMAN": {
+ "label": "SaffronPokecenterGentlemanText",
+ "text": "_SaffronPokecenterGentlemanText"
+ },
+ "TEXT_SAFFRONPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "SaffronPokecenterLinkReceptionistText"
+ },
+ "TEXT_SAFFRONPOKECENTER_NURSE": {
+ "label": "SaffronPokecenterNurseText",
+ "nurse": true
+ }
+ },
+ "SeafoamIslands1F": {
+ "TEXT_SEAFOAMISLANDS1F_BOULDER1": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_SEAFOAMISLANDS1F_BOULDER2": {
+ "asm": true,
+ "label": "BoulderText"
+ }
+ },
+ "SeafoamIslandsB1F": {
+ "TEXT_SEAFOAMISLANDSB1F_BOULDER1": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_SEAFOAMISLANDSB1F_BOULDER2": {
+ "asm": true,
+ "label": "BoulderText"
+ }
+ },
+ "SeafoamIslandsB2F": {
+ "TEXT_SEAFOAMISLANDSB2F_BOULDER1": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_SEAFOAMISLANDSB2F_BOULDER2": {
+ "asm": true,
+ "label": "BoulderText"
+ }
+ },
+ "SeafoamIslandsB3F": {
+ "TEXT_SEAFOAMISLANDSB3F_BOULDER1": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_SEAFOAMISLANDSB3F_BOULDER2": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_SEAFOAMISLANDSB3F_BOULDER3": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_SEAFOAMISLANDSB3F_BOULDER4": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_SEAFOAMISLANDSB3F_BOULDER5": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_SEAFOAMISLANDSB3F_BOULDER6": {
+ "asm": true,
+ "label": "BoulderText"
+ }
+ },
+ "SeafoamIslandsB4F": {
+ "TEXT_SEAFOAMISLANDSB4F_ARTICUNO": {
+ "asm": true,
+ "label": "SeafoamIslandsB4FArticunoText"
+ },
+ "TEXT_SEAFOAMISLANDSB4F_BOULDER1": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_SEAFOAMISLANDSB4F_BOULDER2": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_SEAFOAMISLANDSB4F_BOULDERS_SIGN": {
+ "label": "SeafoamIslandsB4FBouldersSignText",
+ "text": "_SeafoamIslandsB4FBouldersSignText"
+ },
+ "TEXT_SEAFOAMISLANDSB4F_DANGER_SIGN": {
+ "label": "SeafoamIslandsB4FDangerSignText",
+ "text": "_SeafoamIslandsB4FDangerSignText"
+ }
+ },
+ "SilphCo10F": {
+ "TEXT_SILPHCO10F_CARBOS": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO10F_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO10F_ROCKET": {
+ "asm": true,
+ "label": "SilphCo10FRocketText"
+ },
+ "TEXT_SILPHCO10F_SCIENTIST": {
+ "asm": true,
+ "label": "SilphCo10FScientistText"
+ },
+ "TEXT_SILPHCO10F_SILPH_WORKER_F": {
+ "asm": true,
+ "label": "SilphCo10FSilphWorkerFText",
+ "text": "_SilphCo10FSilphWorkerFImScaredText"
+ },
+ "TEXT_SILPHCO10F_TM_EARTHQUAKE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "SilphCo11F": {
+ "TEXT_SILPHCO11F_BEAUTY": {
+ "label": "SilphCo11FBeautyText",
+ "text": "_SilphCo11FBeautyText"
+ },
+ "TEXT_SILPHCO11F_GIOVANNI": {
+ "label": "SilphCo11FGiovanniText",
+ "text": "_SilphCo11FGiovanniText"
+ },
+ "TEXT_SILPHCO11F_GIOVANNI_YOU_RUINED_OUR_PLANS": {
+ "label": "SilphCo11FGiovanniYouRuinedOurPlansText",
+ "text": "_SilphCo11FGiovanniYouRuinedOurPlansText"
+ },
+ "TEXT_SILPHCO11F_JAMES": {
+ "asm": true,
+ "label": "SilphCo11FJessieJamesText",
+ "text": "_SilphCoJessieJamesText1"
+ },
+ "TEXT_SILPHCO11F_JESSIE": {
+ "asm": true,
+ "label": "SilphCo11FJessieJamesText",
+ "text": "_SilphCoJessieJamesText1"
+ },
+ "TEXT_SILPHCO11F_ROCKET": {
+ "asm": true,
+ "label": "SilphCo11FRocketText"
+ },
+ "TEXT_SILPHCO11F_SILPH_PRESIDENT": {
+ "asm": true,
+ "label": "SilphCo11FSilphPresidentText",
+ "text": "_SilphCo11FSilphPresidentText"
+ },
+ "TEXT_SILPHCO11F_TEXT10": {
+ "asm": true,
+ "label": "SilphCo11FText10",
+ "text": "_SilphCoJessieJamesText4"
+ },
+ "TEXT_SILPHCO11F_TEXT8": {
+ "asm": true,
+ "label": "SilphCo11FJessieJamesText",
+ "text": "_SilphCoJessieJamesText1"
+ },
+ "TEXT_SILPHCO11F_TEXT9": {
+ "label": "SilphCo11FText9",
+ "text": "_SilphCoJessieJamesText2"
+ }
+ },
+ "SilphCo1F": {
+ "TEXT_SILPHCO1F_LINK_RECEPTIONIST": {
+ "label": "SilphCo1FLinkReceptionistText",
+ "text": "_SilphCo1FLinkReceptionistText"
+ }
+ },
+ "SilphCo2F": {
+ "TEXT_SILPHCO2F_ROCKET1": {
+ "asm": true,
+ "label": "SilphCo2FRocket1Text"
+ },
+ "TEXT_SILPHCO2F_ROCKET2": {
+ "asm": true,
+ "label": "SilphCo2FRocket2Text"
+ },
+ "TEXT_SILPHCO2F_SCIENTIST1": {
+ "asm": true,
+ "label": "SilphCo2FScientist1Text"
+ },
+ "TEXT_SILPHCO2F_SCIENTIST2": {
+ "asm": true,
+ "label": "SilphCo2FScientist2Text"
+ },
+ "TEXT_SILPHCO2F_SILPH_WORKER_F": {
+ "asm": true,
+ "label": "SilphCo2FSilphWorkerFText",
+ "text": "SilphCo2FSilphWorkerFPleaseTakeThisText"
+ }
+ },
+ "SilphCo3F": {
+ "TEXT_SILPHCO3F_HYPER_POTION": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO3F_ROCKET": {
+ "asm": true,
+ "label": "SilphCo3FRocketText"
+ },
+ "TEXT_SILPHCO3F_SCIENTIST": {
+ "asm": true,
+ "label": "SilphCo3FScientistText"
+ },
+ "TEXT_SILPHCO3F_SILPH_WORKER_M": {
+ "asm": true,
+ "label": "SilphCo3FSilphWorkerMText",
+ "text": "_SilphCo3FSilphWorkerMWhatShouldIDoText"
+ }
+ },
+ "SilphCo4F": {
+ "TEXT_SILPHCO4F_ESCAPE_ROPE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO4F_FULL_HEAL": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO4F_MAX_REVIVE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO4F_ROCKET1": {
+ "asm": true,
+ "label": "SilphCo4FRocket1Text"
+ },
+ "TEXT_SILPHCO4F_ROCKET2": {
+ "asm": true,
+ "label": "SilphCo4FRocket2Text"
+ },
+ "TEXT_SILPHCO4F_SCIENTIST": {
+ "asm": true,
+ "label": "SilphCo4FScientistText"
+ },
+ "TEXT_SILPHCO4F_SILPH_WORKER_M": {
+ "asm": true,
+ "label": "SilphCo4FSilphWorkerMText",
+ "text": "_SilphCo4FSilphWorkerMImHidingText"
+ }
+ },
+ "SilphCo5F": {
+ "TEXT_SILPHCO5F_CARD_KEY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO5F_POKEMON_REPORT1": {
+ "label": "SilphCo5FPokemonReport1Text",
+ "text": "_SilphCo5FPokemonReport1Text"
+ },
+ "TEXT_SILPHCO5F_POKEMON_REPORT2": {
+ "label": "SilphCo5FPokemonReport2Text",
+ "text": "_SilphCo5FPokemonReport2Text"
+ },
+ "TEXT_SILPHCO5F_POKEMON_REPORT3": {
+ "label": "SilphCo5FPokemonReport3Text",
+ "text": "_SilphCo5FPokemonReport3Text"
+ },
+ "TEXT_SILPHCO5F_PROTEIN": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO5F_ROCKER": {
+ "asm": true,
+ "label": "SilphCo5FRockerText"
+ },
+ "TEXT_SILPHCO5F_ROCKET1": {
+ "asm": true,
+ "label": "SilphCo5FRocket1Text"
+ },
+ "TEXT_SILPHCO5F_ROCKET2": {
+ "asm": true,
+ "label": "SilphCo5FRocket2Text"
+ },
+ "TEXT_SILPHCO5F_SCIENTIST": {
+ "asm": true,
+ "label": "SilphCo5FScientistText"
+ },
+ "TEXT_SILPHCO5F_SILPH_WORKER_M": {
+ "asm": true,
+ "label": "SilphCo5FSilphWorkerMText",
+ "text": "_SilphCo5FSilphWorkerMThatsYouRightText"
+ },
+ "TEXT_SILPHCO5F_TM_TAKE_DOWN": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "SilphCo6F": {
+ "TEXT_SILPHCO6F_HP_UP": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO6F_ROCKET1": {
+ "asm": true,
+ "label": "SilphCo6FRocket1Text"
+ },
+ "TEXT_SILPHCO6F_ROCKET2": {
+ "asm": true,
+ "label": "SilphCo6FRocket2Text"
+ },
+ "TEXT_SILPHCO6F_SCIENTIST": {
+ "asm": true,
+ "label": "SilphCo6FScientistText"
+ },
+ "TEXT_SILPHCO6F_SILPH_WORKER_F1": {
+ "asm": true,
+ "label": "SilphCo6FSilphWorkerF1Text",
+ "text": "_SilphCo6FSilphWorkerF1SuchACowardText"
+ },
+ "TEXT_SILPHCO6F_SILPH_WORKER_F2": {
+ "asm": true,
+ "label": "SilphCo6FSilphWorkerF2Text",
+ "text": "_SilphCo6FSilphWorkerF2TeamRocketConquerWorldText"
+ },
+ "TEXT_SILPHCO6F_SILPH_WORKER_M1": {
+ "asm": true,
+ "label": "SilphCo6FSilphWorkerM1Text",
+ "text": "_SilphCo6FSilphWorkerM1TookOverTheBuildingText"
+ },
+ "TEXT_SILPHCO6F_SILPH_WORKER_M2": {
+ "asm": true,
+ "label": "SilphCo6FSilphWorkerM2Text",
+ "text": "_SilphCo6FSilphWorkerMHelpMePleaseText"
+ },
+ "TEXT_SILPHCO6F_SILPH_WORKER_M3": {
+ "asm": true,
+ "label": "SilphCo6FSilphWorkerM3Text",
+ "text": "_SilphCo6FSilphWorkerM3TargetedSilphText"
+ },
+ "TEXT_SILPHCO6F_X_ACCURACY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "SilphCo7F": {
+ "TEXT_SILPHCO7F_CALCIUM": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO7F_RIVAL": {
+ "asm": true,
+ "label": "SilphCo7FRivalText",
+ "text": "_SilphCo7FRivalText"
+ },
+ "TEXT_SILPHCO7F_RIVAL_DEFEATED": {
+ "label": "SilphCo7FRivalDefeatedText",
+ "text": "_SilphCo7FRivalDefeatedText"
+ },
+ "TEXT_SILPHCO7F_RIVAL_GOOD_LUCK_TO_YOU": {
+ "label": "SilphCo7FRivalGoodLuckToYouText",
+ "text": "_SilphCo7FRivalGoodLuckToYouText"
+ },
+ "TEXT_SILPHCO7F_RIVAL_WAITED_HERE": {
+ "label": "SilphCo7FRivalWaitedHereText",
+ "text": "_SilphCo7FRivalWaitedHereText"
+ },
+ "TEXT_SILPHCO7F_ROCKET1": {
+ "asm": true,
+ "label": "SilphCo7FRocket1Text"
+ },
+ "TEXT_SILPHCO7F_ROCKET2": {
+ "asm": true,
+ "label": "SilphCo7FRocket2Text"
+ },
+ "TEXT_SILPHCO7F_ROCKET3": {
+ "asm": true,
+ "label": "SilphCo7FRocket3Text"
+ },
+ "TEXT_SILPHCO7F_SCIENTIST": {
+ "asm": true,
+ "label": "SilphCo7FScientistText"
+ },
+ "TEXT_SILPHCO7F_SILPH_WORKER_M1": {
+ "asm": true,
+ "label": "SilphCo7FSilphWorkerM1Text",
+ "text": "_SilphCo7FSilphWorkerM1HaveThisPokemonText"
+ },
+ "TEXT_SILPHCO7F_SILPH_WORKER_M2": {
+ "asm": true,
+ "label": "SilphCo7FSilphWorkerM2Text",
+ "text": "_SilphCo7FSilphWorkerM2AfterTheMasterBallText"
+ },
+ "TEXT_SILPHCO7F_SILPH_WORKER_M3": {
+ "asm": true,
+ "label": "SilphCo7FSilphWorkerM3Text",
+ "text": "_SilphCo7FSilphWorkerM3ItWouldBeBadText"
+ },
+ "TEXT_SILPHCO7F_SILPH_WORKER_M4": {
+ "asm": true,
+ "label": "SilphCo7FSilphWorkerM4Text",
+ "text": "_SilphCo7FSilphWorkerM4ItsReallyDangerousHereText"
+ },
+ "TEXT_SILPHCO7F_TM_SWORDS_DANCE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_SILPHCO7F_UNREFERENCED_ITEM": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "SilphCo8F": {
+ "TEXT_SILPHCO8F_ROCKET1": {
+ "asm": true,
+ "label": "SilphCo8FRocket1Text"
+ },
+ "TEXT_SILPHCO8F_ROCKET2": {
+ "asm": true,
+ "label": "SilphCo8FRocket2Text"
+ },
+ "TEXT_SILPHCO8F_SCIENTIST": {
+ "asm": true,
+ "label": "SilphCo8FScientistText"
+ },
+ "TEXT_SILPHCO8F_SILPH_WORKER_M": {
+ "asm": true,
+ "label": "SilphCo8FSilphWorkerMText",
+ "text": "_SilphCo8FSilphWorkerMSilphIsFinishedText"
+ }
+ },
+ "SilphCo9F": {
+ "TEXT_SILPHCO9F_NURSE": {
+ "asm": true,
+ "label": "SilphCo9FNurseText",
+ "text": "SilphCo9FNurseYouLookTiredText"
+ },
+ "TEXT_SILPHCO9F_ROCKET1": {
+ "asm": true,
+ "label": "SilphCo9FRocket1Text"
+ },
+ "TEXT_SILPHCO9F_ROCKET2": {
+ "asm": true,
+ "label": "SilphCo9FRocket2Text"
+ },
+ "TEXT_SILPHCO9F_SCIENTIST": {
+ "asm": true,
+ "label": "SilphCo9FScientistText"
+ }
+ },
+ "SilphCoElevator": {
+ "TEXT_SILPHCOELEVATOR_ELEVATOR": {
+ "asm": true,
+ "label": "SilphCoElevatorElevatorText"
+ }
+ },
+ "SummerBeachHouse": {
+ "TEXT_SUMMERBEACHHOUSE_PIKACHU": {
+ "asm": true,
+ "label": "SummerBeachHousePikachuText",
+ "text": "_SummerBeachHousePikachuText"
+ },
+ "TEXT_SUMMERBEACHHOUSE_POSTER1": {
+ "asm": true,
+ "label": "SummerBeachHousePoster1Text",
+ "text": "_SummerBeachHousePoster1Text1"
+ },
+ "TEXT_SUMMERBEACHHOUSE_POSTER2": {
+ "asm": true,
+ "label": "SummerBeachHousePoster2Text",
+ "text": "_SummerBeachHousePoster2Text1"
+ },
+ "TEXT_SUMMERBEACHHOUSE_POSTER3": {
+ "asm": true,
+ "label": "SummerBeachHousePoster3Text",
+ "text": "_SummerBeachHousePoster3Text1"
+ },
+ "TEXT_SUMMERBEACHHOUSE_PRINTER": {
+ "asm": true,
+ "label": "SummerBeachHousePrinterText",
+ "text": "_SummerBeachHousePrinterText1"
+ },
+ "TEXT_SUMMERBEACHHOUSE_SURFINDUDE": {
+ "asm": true,
+ "label": "SummerBeachHouseSurfinDudeText",
+ "text": "_SummerBeachHouseSurfinDudeText1"
+ }
+ },
+ "TradeCenter": {
+ "TEXT_TRADECENTER_OPPONENT": {
+ "label": "TradeCenterOpponentText",
+ "text": "_TradeCenterOpponentText"
+ }
+ },
+ "UndergroundPathRoute5": {
+ "TEXT_UNDERGROUNDPATHROUTE5_LITTLE_GIRL": {
+ "asm": true,
+ "label": "UndergroundPathRoute5LittleGirlText"
+ }
+ },
+ "UndergroundPathRoute6": {
+ "TEXT_UNDERGROUNDPATHROUTE6_GIRL": {
+ "label": "UndergroundPathRoute6GirlText",
+ "text": "_UndergroundPathRoute6GirlText"
+ }
+ },
+ "UndergroundPathRoute7": {
+ "TEXT_UNDERGROUNDPATHROUTE7_MIDDLE_AGED_MAN": {
+ "label": "UndergroundPathRoute7MiddleAgedManText",
+ "text": "_UndergroundPathRoute7MiddleAgedManText"
+ }
+ },
+ "UndergroundPathRoute7Copy": {
+ "TEXT_UNDERGROUNDPATHROUTE7COPY_UNUSED_GIRL": {
+ "label": "UndergroundPathRoute7CopyUnusedGirlText",
+ "text": "_UndergroundPathRoute7CopyUnusedGirlText"
+ },
+ "TEXT_UNDERGROUNDPATHROUTE7COPY_UNUSED_MIDDLE_AGED_MAN": {
+ "label": "UndergroundPathRoute7CopyUnusedMiddleAgedManText",
+ "text": "_UndergroundPathRoute7CopyUnusedMiddleAgedManText"
+ }
+ },
+ "UndergroundPathRoute8": {
+ "TEXT_UNDERGROUNDPATHROUTE8_GIRL": {
+ "label": "UndergroundPathRoute8GirlText",
+ "text": "_UndergroundPathRoute8GirlText"
+ }
+ },
+ "VermilionCity": {
+ "TEXT_VERMILIONCITY_BEAUTY": {
+ "label": "VermilionCityBeautyText",
+ "text": "_VermilionCityBeautyText"
+ },
+ "TEXT_VERMILIONCITY_GAMBLER1": {
+ "asm": true,
+ "label": "VermilionCityGambler1Text",
+ "text": "_VermilionCityGambler1DidYouSeeText"
+ },
+ "TEXT_VERMILIONCITY_GAMBLER2": {
+ "label": "VermilionCityGambler2Text",
+ "text": "_VermilionCityGambler2Text"
+ },
+ "TEXT_VERMILIONCITY_GYM_SIGN": {
+ "asm": true,
+ "label": "VermilionCityGymSignText"
+ },
+ "TEXT_VERMILIONCITY_HARBOR_SIGN": {
+ "asm": true,
+ "label": "VermilionCityHarborSignText"
+ },
+ "TEXT_VERMILIONCITY_MACHOP": {
+ "asm": true,
+ "label": "VermilionCityMachopText",
+ "text": "_VermilionCityMachopText"
+ },
+ "TEXT_VERMILIONCITY_MART_SIGN": {
+ "asm": true,
+ "label": "MartSignText"
+ },
+ "TEXT_VERMILIONCITY_NOTICE_SIGN": {
+ "asm": true,
+ "label": "VermilionCityNoticeSignText"
+ },
+ "TEXT_VERMILIONCITY_OFFICER_JENNY": {
+ "asm": true,
+ "label": "VermilionCityOfficerJennyText"
+ },
+ "TEXT_VERMILIONCITY_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_VERMILIONCITY_POKEMON_FAN_CLUB_SIGN": {
+ "asm": true,
+ "label": "VermilionCityPokemonFanClubSignText"
+ },
+ "TEXT_VERMILIONCITY_SAILOR1": {
+ "asm": true,
+ "label": "VermilionCitySailor1Text",
+ "text": "_VermilionCitySailor1WelcomeToSSAnneText"
+ },
+ "TEXT_VERMILIONCITY_SAILOR2": {
+ "label": "VermilionCitySailor2Text",
+ "text": "_VermilionCitySailor2Text"
+ },
+ "TEXT_VERMILIONCITY_SIGN": {
+ "asm": true,
+ "label": "VermilionCitySignText"
+ }
+ },
+ "VermilionDock": {
+ "TEXT_VERMILIONDOCK_UNUSED": {
+ "label": "VermilionDockUnusedText",
+ "text": "_VermilionDockUnusedText"
+ }
+ },
+ "VermilionGym": {
+ "TEXT_VERMILIONGYM_GENTLEMAN": {
+ "asm": true,
+ "label": "VermilionGymGentlemanText"
+ },
+ "TEXT_VERMILIONGYM_GYM_GUIDE": {
+ "asm": true,
+ "label": "VermilionGymGymGuideText",
+ "text": "_VermilionGymGymGuideChampInMakingText"
+ },
+ "TEXT_VERMILIONGYM_LT_SURGE": {
+ "asm": true,
+ "label": "VermilionGymLTSurgeText",
+ "text": "_VermilionGymLTSurgePreBattleText"
+ },
+ "TEXT_VERMILIONGYM_LT_SURGE_RECEIVED_TM24": {
+ "label": "VermilionGymLTSurgeReceivedTM24Text",
+ "text": "_VermilionGymLTSurgeReceivedTM24Text"
+ },
+ "TEXT_VERMILIONGYM_LT_SURGE_THUNDER_BADGE_INFO": {
+ "label": "VermilionGymLTSurgeThunderBadgeInfoText",
+ "text": "_VermilionGymLTSurgeThunderBadgeInfoText"
+ },
+ "TEXT_VERMILIONGYM_LT_SURGE_TM24_NO_ROOM": {
+ "label": "VermilionGymLTSurgeTM24NoRoomText",
+ "text": "_VermilionGymLTSurgeTM24NoRoomText"
+ },
+ "TEXT_VERMILIONGYM_SAILOR": {
+ "asm": true,
+ "label": "VermilionGymSailorText"
+ },
+ "TEXT_VERMILIONGYM_SUPER_NERD": {
+ "asm": true,
+ "label": "VermilionGymSuperNerdText"
+ }
+ },
+ "VermilionMart": {
+ "TEXT_VERMILIONMART_CLERK": {
+ "label": "VermilionMartClerkText",
+ "mart": [
+ "POKE_BALL",
+ "SUPER_POTION",
+ "ICE_HEAL",
+ "AWAKENING",
+ "PARLYZ_HEAL",
+ "REPEL"
+ ]
+ },
+ "TEXT_VERMILIONMART_COOLTRAINER_F": {
+ "label": "VermilionMartCooltrainerFText",
+ "text": "_VermilionMartCooltrainerFText"
+ },
+ "TEXT_VERMILIONMART_COOLTRAINER_M": {
+ "label": "VermilionMartCooltrainerMText",
+ "text": "_VermilionMartCooltrainerMText"
+ }
+ },
+ "VermilionOldRodHouse": {
+ "TEXT_VERMILIONOLDRODHOUSE_FISHING_GURU": {
+ "asm": true,
+ "label": "VermilionOldRodHouseFishingGuruText",
+ "text": "_VermilionOldRodHouseFishingGuruDoYouLikeToFishText"
+ }
+ },
+ "VermilionPidgeyHouse": {
+ "TEXT_VERMILIONPIDGEYHOUSE_LETTER": {
+ "label": "VermilionPidgeyHouseLetterText",
+ "text": "_VermilionPidgeyHouseLetterText"
+ },
+ "TEXT_VERMILIONPIDGEYHOUSE_PIDGEY": {
+ "asm": true,
+ "label": "VermilionPidgeyHousePidgeyText",
+ "text": "_VermilionPidgeyHousePidgeyText"
+ },
+ "TEXT_VERMILIONPIDGEYHOUSE_YOUNGSTER": {
+ "label": "VermilionPidgeyHouseYoungsterText",
+ "text": "_VermilionPidgeyHouseYoungsterText"
+ }
+ },
+ "VermilionPokecenter": {
+ "TEXT_VERMILIONPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "VermilionPokecenterChanseyText"
+ },
+ "TEXT_VERMILIONPOKECENTER_FISHING_GURU": {
+ "label": "VermilionPokecenterFishingGuruText",
+ "text": "_VermilionPokecenterFishingGuruText"
+ },
+ "TEXT_VERMILIONPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "VermilionPokecenterLinkReceptionistText"
+ },
+ "TEXT_VERMILIONPOKECENTER_NURSE": {
+ "label": "VermilionPokecenterNurseText",
+ "nurse": true
+ },
+ "TEXT_VERMILIONPOKECENTER_SAILOR": {
+ "label": "VermilionPokecenterSailorText",
+ "text": "_VermilionPokecenterSailorText"
+ }
+ },
+ "VermilionTradeHouse": {
+ "TEXT_VERMILIONTRADEHOUSE_GENTLEMAN": {
+ "label": "VermilionTradeHouseGentlemanText",
+ "text": "TeachingHMsText"
+ }
+ },
+ "VictoryRoad1F": {
+ "TEXT_VICTORYROAD1F_BOULDER1": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_VICTORYROAD1F_BOULDER2": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_VICTORYROAD1F_BOULDER3": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_VICTORYROAD1F_COOLTRAINER_F": {
+ "asm": true,
+ "label": "VictoryRoad1FCooltrainerFText"
+ },
+ "TEXT_VICTORYROAD1F_COOLTRAINER_M": {
+ "asm": true,
+ "label": "VictoryRoad1FCooltrainerMText"
+ },
+ "TEXT_VICTORYROAD1F_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_VICTORYROAD1F_TM_SKY_ATTACK": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "VictoryRoad2F": {
+ "TEXT_VICTORYROAD2F_BOULDER1": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_VICTORYROAD2F_BOULDER2": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_VICTORYROAD2F_BOULDER3": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_VICTORYROAD2F_COOLTRAINER_M": {
+ "asm": true,
+ "label": "VictoryRoad2FCooltrainerMText"
+ },
+ "TEXT_VICTORYROAD2F_FULL_HEAL": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_VICTORYROAD2F_GUARD_SPEC": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_VICTORYROAD2F_HIKER": {
+ "asm": true,
+ "label": "VictoryRoad2FHikerText"
+ },
+ "TEXT_VICTORYROAD2F_MOLTRES": {
+ "asm": true,
+ "label": "VictoryRoad2FMoltresText"
+ },
+ "TEXT_VICTORYROAD2F_SUPER_NERD1": {
+ "asm": true,
+ "label": "VictoryRoad2FSuperNerd1Text"
+ },
+ "TEXT_VICTORYROAD2F_SUPER_NERD2": {
+ "asm": true,
+ "label": "VictoryRoad2FSuperNerd2Text"
+ },
+ "TEXT_VICTORYROAD2F_SUPER_NERD3": {
+ "asm": true,
+ "label": "VictoryRoad2FSuperNerd3Text"
+ },
+ "TEXT_VICTORYROAD2F_TM_MEGA_KICK": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_VICTORYROAD2F_TM_SUBMISSION": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "VictoryRoad3F": {
+ "TEXT_VICTORYROAD3F_BOULDER1": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_VICTORYROAD3F_BOULDER2": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_VICTORYROAD3F_BOULDER3": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_VICTORYROAD3F_BOULDER4": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_VICTORYROAD3F_COOLTRAINER_F1": {
+ "asm": true,
+ "label": "VictoryRoad3FCooltrainerF1Text"
+ },
+ "TEXT_VICTORYROAD3F_COOLTRAINER_F2": {
+ "asm": true,
+ "label": "VictoryRoad3FCooltrainerF2Text"
+ },
+ "TEXT_VICTORYROAD3F_COOLTRAINER_M1": {
+ "asm": true,
+ "label": "VictoryRoad3FCooltrainerM1Text"
+ },
+ "TEXT_VICTORYROAD3F_COOLTRAINER_M2": {
+ "asm": true,
+ "label": "VictoryRoad3FCooltrainerM2Text"
+ },
+ "TEXT_VICTORYROAD3F_MAX_REVIVE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_VICTORYROAD3F_TM_EXPLOSION": {
+ "asm": true,
+ "label": "PickUpItemText"
+ }
+ },
+ "ViridianCity": {
+ "TEXT_VIRIDIANCITY_FISHER": {
+ "asm": true,
+ "label": "ViridianCityFisherText"
+ },
+ "TEXT_VIRIDIANCITY_GAMBLER1": {
+ "asm": true,
+ "label": "ViridianCityGambler1Text"
+ },
+ "TEXT_VIRIDIANCITY_GIRL": {
+ "asm": true,
+ "label": "ViridianCityGirlText"
+ },
+ "TEXT_VIRIDIANCITY_GYM_LOCKED": {
+ "asm": true,
+ "label": "ViridianCityGymLockedText"
+ },
+ "TEXT_VIRIDIANCITY_GYM_SIGN": {
+ "asm": true,
+ "label": "ViridianCityGymSignText"
+ },
+ "TEXT_VIRIDIANCITY_MART_SIGN": {
+ "asm": true,
+ "label": "MartSignText"
+ },
+ "TEXT_VIRIDIANCITY_OLD_MAN": {
+ "asm": true,
+ "label": "ViridianCityOldManText"
+ },
+ "TEXT_VIRIDIANCITY_OLD_MAN2": {
+ "asm": true,
+ "label": "ViridianCityOldMan2Text",
+ "text": "_ViridianCityOldManHadMyCoffeeNowText"
+ },
+ "TEXT_VIRIDIANCITY_OLD_MAN_SLEEPY": {
+ "asm": true,
+ "label": "ViridianCityOldManSleepyText"
+ },
+ "TEXT_VIRIDIANCITY_OLD_MAN_YOU_NEED_TO_WEAKEN_THE_TARGET": {
+ "label": "ViridianCityOldManYouNeedToWeakenTheTargetText",
+ "text": "_ViridianCityOldManYouNeedToWeakenTheTargetText"
+ },
+ "TEXT_VIRIDIANCITY_POKECENTER_SIGN": {
+ "asm": true,
+ "label": "PokeCenterSignText"
+ },
+ "TEXT_VIRIDIANCITY_SIGN": {
+ "asm": true,
+ "label": "ViridianCitySignText"
+ },
+ "TEXT_VIRIDIANCITY_TRAINER_TIPS1": {
+ "asm": true,
+ "label": "ViridianCityTrainerTips1Text"
+ },
+ "TEXT_VIRIDIANCITY_TRAINER_TIPS2": {
+ "asm": true,
+ "label": "ViridianCityTrainerTips2Text"
+ },
+ "TEXT_VIRIDIANCITY_YOUNGSTER1": {
+ "asm": true,
+ "label": "ViridianCityYoungster1Text"
+ },
+ "TEXT_VIRIDIANCITY_YOUNGSTER2": {
+ "asm": true,
+ "label": "ViridianCityYoungster2Text"
+ }
+ },
+ "ViridianForest": {
+ "TEXT_VIRIDIANFOREST_COOLTRAINER_F": {
+ "asm": true,
+ "label": "ViridianForestCooltrainerFText"
+ },
+ "TEXT_VIRIDIANFOREST_LEAVING_SIGN": {
+ "asm": true,
+ "label": "ViridianForestLeavingSignText"
+ },
+ "TEXT_VIRIDIANFOREST_POKE_BALL": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_VIRIDIANFOREST_POTION1": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_VIRIDIANFOREST_POTION2": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_VIRIDIANFOREST_TRAINER_TIPS1": {
+ "asm": true,
+ "label": "ViridianForestTrainerTips1Text"
+ },
+ "TEXT_VIRIDIANFOREST_TRAINER_TIPS2": {
+ "asm": true,
+ "label": "ViridianForestTrainerTips2Text"
+ },
+ "TEXT_VIRIDIANFOREST_TRAINER_TIPS3": {
+ "asm": true,
+ "label": "ViridianForestTrainerTips3Text"
+ },
+ "TEXT_VIRIDIANFOREST_TRAINER_TIPS4": {
+ "asm": true,
+ "label": "ViridianForestTrainerTips4Text"
+ },
+ "TEXT_VIRIDIANFOREST_USE_ANTIDOTE_SIGN": {
+ "asm": true,
+ "label": "ViridianForestUseAntidoteSignText"
+ },
+ "TEXT_VIRIDIANFOREST_YOUNGSTER1": {
+ "label": "ViridianForestYoungster1Text",
+ "text": "_ViridianForestYoungster1Text"
+ },
+ "TEXT_VIRIDIANFOREST_YOUNGSTER2": {
+ "asm": true,
+ "label": "ViridianForestYoungster2Text"
+ },
+ "TEXT_VIRIDIANFOREST_YOUNGSTER3": {
+ "asm": true,
+ "label": "ViridianForestYoungster3Text"
+ },
+ "TEXT_VIRIDIANFOREST_YOUNGSTER4": {
+ "asm": true,
+ "label": "ViridianForestYoungster4Text"
+ },
+ "TEXT_VIRIDIANFOREST_YOUNGSTER5": {
+ "asm": true,
+ "label": "ViridianForestYoungster5Text"
+ },
+ "TEXT_VIRIDIANFOREST_YOUNGSTER6": {
+ "label": "ViridianForestYoungster6Text",
+ "text": "_ViridianForestYoungster6Text"
+ }
+ },
+ "ViridianForestNorthGate": {
+ "TEXT_VIRIDIANFORESTNORTHGATE_GRAMPS": {
+ "label": "ViridianForestNorthGateGrampsText",
+ "text": "_ViridianForestNorthGateGrampsText"
+ },
+ "TEXT_VIRIDIANFORESTNORTHGATE_SUPER_NERD": {
+ "label": "ViridianForestNorthGateSuperNerdText",
+ "text": "_ViridianForestNorthGateSuperNerdText"
+ }
+ },
+ "ViridianForestSouthGate": {
+ "TEXT_VIRIDIANFORESTSOUTHGATE_GIRL": {
+ "label": "ViridianForestSouthGateGirlText",
+ "text": "_ViridianForestSouthGateGirlText"
+ },
+ "TEXT_VIRIDIANFORESTSOUTHGATE_LITTLE_GIRL": {
+ "label": "ViridianForestSouthGateLittleGirlText",
+ "text": "_ViridianForestSouthGateLittleGirlText"
+ }
+ },
+ "ViridianGym": {
+ "TEXT_VIRIDIANGYM_COOLTRAINER_M1": {
+ "asm": true,
+ "label": "ViridianGymCooltrainerM1Text"
+ },
+ "TEXT_VIRIDIANGYM_COOLTRAINER_M2": {
+ "asm": true,
+ "label": "ViridianGymCooltrainerM2Text"
+ },
+ "TEXT_VIRIDIANGYM_COOLTRAINER_M3": {
+ "asm": true,
+ "label": "ViridianGymCooltrainerM3Text"
+ },
+ "TEXT_VIRIDIANGYM_GIOVANNI": {
+ "asm": true,
+ "label": "ViridianGymGiovanniText",
+ "text": "_ViridianGymGiovanniPreBattleText"
+ },
+ "TEXT_VIRIDIANGYM_GIOVANNI_EARTH_BADGE_INFO": {
+ "label": "ViridianGymGiovanniEarthBadgeInfoText",
+ "text": "_ViridianGymGiovanniEarthBadgeInfoText"
+ },
+ "TEXT_VIRIDIANGYM_GIOVANNI_RECEIVED_TM27": {
+ "label": "ViridianGymGiovanniReceivedTM27Text",
+ "text": "_ViridianGymGiovanniReceivedTM27Text"
+ },
+ "TEXT_VIRIDIANGYM_GIOVANNI_TM27_NO_ROOM": {
+ "label": "ViridianGymGiovanniTM27NoRoomText",
+ "text": "_ViridianGymGiovanniTM27NoRoomText"
+ },
+ "TEXT_VIRIDIANGYM_GYM_GUIDE": {
+ "asm": true,
+ "label": "ViridianGymGymGuideText"
+ },
+ "TEXT_VIRIDIANGYM_HIKER1": {
+ "asm": true,
+ "label": "ViridianGymHiker1Text"
+ },
+ "TEXT_VIRIDIANGYM_HIKER2": {
+ "asm": true,
+ "label": "ViridianGymHiker2Text"
+ },
+ "TEXT_VIRIDIANGYM_HIKER3": {
+ "asm": true,
+ "label": "ViridianGymHiker3Text"
+ },
+ "TEXT_VIRIDIANGYM_REVIVE": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_VIRIDIANGYM_ROCKER1": {
+ "asm": true,
+ "label": "ViridianGymRocker1Text"
+ },
+ "TEXT_VIRIDIANGYM_ROCKER2": {
+ "asm": true,
+ "label": "ViridianGymRocker2Text"
+ }
+ },
+ "ViridianMart": {
+ "TEXT_VIRIDIANMART_CLERK": {
+ "label": "ViridianMartClerkText",
+ "mart": [
+ "POKE_BALL",
+ "POTION",
+ "ANTIDOTE",
+ "PARLYZ_HEAL",
+ "BURN_HEAL"
+ ]
+ },
+ "TEXT_VIRIDIANMART_CLERK_PARCEL_QUEST": {
+ "label": "ViridianMartClerkParcelQuestText",
+ "text": "_ViridianMartClerkParcelQuestText"
+ },
+ "TEXT_VIRIDIANMART_CLERK_YOU_CAME_FROM_PALLET_TOWN": {
+ "label": "ViridianMartClerkYouCameFromPalletTownText",
+ "text": "_ViridianMartClerkYouCameFromPalletTownText"
+ },
+ "TEXT_VIRIDIANMART_COOLTRAINER_M": {
+ "label": "ViridianMartCooltrainerMText",
+ "text": "_ViridianMartCooltrainerMText"
+ },
+ "TEXT_VIRIDIANMART_YOUNGSTER": {
+ "label": "ViridianMartYoungsterText",
+ "text": "_ViridianMartYoungsterText"
+ }
+ },
+ "ViridianNicknameHouse": {
+ "TEXT_VIRIDIANNICKNAMEHOUSE_BALDING_GUY": {
+ "label": "ViridianNicknameHouseBaldingGuyText",
+ "text": "_ViridianNicknameHouseBaldingGuyText"
+ },
+ "TEXT_VIRIDIANNICKNAMEHOUSE_LITTLE_GIRL": {
+ "label": "ViridianNicknameHouseLittleGirlText",
+ "text": "_ViridianNicknameHouseLittleGirlText"
+ },
+ "TEXT_VIRIDIANNICKNAMEHOUSE_SPEAROW": {
+ "asm": true,
+ "label": "ViridianNicknameHouseSpearowText",
+ "text": "_ViridianNicknameHouseSpearowText"
+ },
+ "TEXT_VIRIDIANNICKNAMEHOUSE_SPEARY_SIGN": {
+ "label": "ViridianNicknameHouseSpearySignText",
+ "text": "_ViridianNicknameHouseSpearySignText"
+ }
+ },
+ "ViridianPokecenter": {
+ "TEXT_VIRIDIANPOKECENTER_CHANSEY": {
+ "asm": true,
+ "label": "ViridianPokeCenterChanseyText"
+ },
+ "TEXT_VIRIDIANPOKECENTER_COOLTRAINER_M": {
+ "label": "ViridianPokecenterCooltrainerMText",
+ "text": "_ViridianPokecenterCooltrainerMText"
+ },
+ "TEXT_VIRIDIANPOKECENTER_GENTLEMAN": {
+ "label": "ViridianPokecenterGentlemanText",
+ "text": "_ViridianPokecenterGentlemanText"
+ },
+ "TEXT_VIRIDIANPOKECENTER_LINK_RECEPTIONIST": {
+ "cableClub": true,
+ "label": "ViridianPokecenterLinkReceptionistText"
+ },
+ "TEXT_VIRIDIANPOKECENTER_NURSE": {
+ "label": "ViridianPokecenterNurseText",
+ "nurse": true
+ }
+ },
+ "ViridianSchoolHouse": {
+ "TEXT_VIRIDIANSCHOOLHOUSE_BRUNETTE_GIRL": {
+ "label": "ViridianSchoolHouseBrunetteGirlText",
+ "text": "_ViridianSchoolHouseBrunetteGirlText"
+ },
+ "TEXT_VIRIDIANSCHOOLHOUSE_COOLTRAINER_F": {
+ "asm": true,
+ "label": "ViridianSchoolHouseCooltrainerFText"
+ },
+ "TEXT_VIRIDIANSCHOOLHOUSE_LITTLE_GIRL": {
+ "asm": true,
+ "label": "ViridianSchoolHouseLittleGirlText"
+ }
+ },
+ "WardensHouse": {
+ "TEXT_WARDENSHOUSE_BOULDER": {
+ "asm": true,
+ "label": "BoulderText"
+ },
+ "TEXT_WARDENSHOUSE_DISPLAY_LEFT": {
+ "asm": true,
+ "label": "WardensHouseDisplayText",
+ "text": "_WardensHouseDisplayPhotosAndFossilsText"
+ },
+ "TEXT_WARDENSHOUSE_DISPLAY_RIGHT": {
+ "asm": true,
+ "label": "WardensHouseDisplayText",
+ "text": "_WardensHouseDisplayPhotosAndFossilsText"
+ },
+ "TEXT_WARDENSHOUSE_RARE_CANDY": {
+ "asm": true,
+ "label": "PickUpItemText"
+ },
+ "TEXT_WARDENSHOUSE_WARDEN": {
+ "asm": true,
+ "label": "WardensHouseWardenText",
+ "text": "_WardensHouseWardenGibberish1Text"
+ }
+ }
+ },
+ "trainerHeaders": {
+ "AgathasRoom": {
+ "1": {
+ "after": "_AgathaAfterBattleText",
+ "battle": "_AgathaBeforeBattleText",
+ "event": "EVENT_BEAT_AGATHAS_ROOM_TRAINER_0",
+ "range": 0,
+ "won": "_AgathaEndBattleText"
+ }
+ },
+ "BrunosRoom": {
+ "1": {
+ "after": "_BrunoAfterBattleText",
+ "battle": "_BrunoBeforeBattleText",
+ "event": "EVENT_BEAT_BRUNOS_ROOM_TRAINER_0",
+ "range": 0,
+ "won": "_BrunoEndBattleText"
+ }
+ },
+ "CeladonGym": {
+ "2": {
+ "after": "_CeladonGymAfterBattleText2",
+ "battle": "_CeladonGymBattleText2",
+ "event": "EVENT_BEAT_CELADON_GYM_TRAINER_0",
+ "range": 2,
+ "won": "_CeladonGymEndBattleText2"
+ },
+ "3": {
+ "after": "_CeladonGymAfterBattleText3",
+ "battle": "_CeladonGymBattleText3",
+ "event": "EVENT_BEAT_CELADON_GYM_TRAINER_1",
+ "range": 2,
+ "won": "_CeladonGymEndBattleText3"
+ },
+ "4": {
+ "after": "_CeladonGymAfterBattleText4",
+ "battle": "_CeladonGymBattleText4",
+ "event": "EVENT_BEAT_CELADON_GYM_TRAINER_2",
+ "range": 4,
+ "won": "_CeladonGymEndBattleText4"
+ },
+ "5": {
+ "after": "_CeladonGymAfterBattleText5",
+ "battle": "_CeladonGymBattleText5",
+ "event": "EVENT_BEAT_CELADON_GYM_TRAINER_3",
+ "range": 4,
+ "won": "_CeladonGymEndBattleText5"
+ },
+ "6": {
+ "after": "_CeladonGymAfterBattleText6",
+ "battle": "_CeladonGymBattleText6",
+ "event": "EVENT_BEAT_CELADON_GYM_TRAINER_4",
+ "range": 2,
+ "won": "_CeladonGymEndBattleText6"
+ },
+ "7": {
+ "after": "_CeladonGymAfterBattleText7",
+ "battle": "_CeladonGymBattleText7",
+ "event": "EVENT_BEAT_CELADON_GYM_TRAINER_5",
+ "range": 2,
+ "won": "_CeladonGymEndBattleText7"
+ },
+ "8": {
+ "after": "_CeladonGymAfterBattleText8",
+ "battle": "_CeladonGymBattleText8",
+ "event": "EVENT_BEAT_CELADON_GYM_TRAINER_6",
+ "range": 3,
+ "won": "_CeladonGymEndBattleText8"
+ }
+ },
+ "CeruleanCaveB1F": {
+ "1": {
+ "after": "_MewtwoBattleText",
+ "battle": "_MewtwoBattleText",
+ "event": "EVENT_BEAT_MEWTWO",
+ "range": 0,
+ "won": "_MewtwoBattleText"
+ }
+ },
+ "CeruleanGym": {
+ "2": {
+ "after": "_CeruleanGymAfterBattleText1",
+ "battle": "_CeruleanGymBattleText1",
+ "event": "EVENT_BEAT_CERULEAN_GYM_TRAINER_0",
+ "range": 3,
+ "won": "_CeruleanGymEndBattleText1"
+ },
+ "3": {
+ "after": "_CeruleanGymAfterBattleText2",
+ "battle": "_CeruleanGymBattleText2",
+ "event": "EVENT_BEAT_CERULEAN_GYM_TRAINER_1",
+ "range": 3,
+ "won": "_CeruleanGymEndBattleText2"
+ }
+ },
+ "FightingDojo": {
+ "2": {
+ "after": "_FightingDojoBlackbelt1AfterBattleText",
+ "battle": "_FightingDojoBlackbelt1BattleText",
+ "event": "EVENT_BEAT_FIGHTING_DOJO_TRAINER_0",
+ "range": 4,
+ "won": "_FightingDojoBlackbelt1EndBattleText"
+ },
+ "3": {
+ "after": "_FightingDojoBlackbelt2AfterBattleText",
+ "battle": "_FightingDojoBlackbelt2BattleText",
+ "event": "EVENT_BEAT_FIGHTING_DOJO_TRAINER_1",
+ "range": 4,
+ "won": "_FightingDojoBlackbelt2EndBattleText"
+ },
+ "4": {
+ "after": "_FightingDojoBlackbelt3AfterBattleText",
+ "battle": "_FightingDojoBlackbelt3BattleText",
+ "event": "EVENT_BEAT_FIGHTING_DOJO_TRAINER_2",
+ "range": 3,
+ "won": "_FightingDojoBlackbelt3EndBattleText"
+ },
+ "5": {
+ "after": "_FightingDojoBlackbelt4AfterBattleText",
+ "battle": "_FightingDojoBlackbelt4BattleText",
+ "event": "EVENT_BEAT_FIGHTING_DOJO_TRAINER_3",
+ "range": 3,
+ "won": "_FightingDojoBlackbelt4EndBattleText"
+ }
+ },
+ "FuchsiaGym": {
+ "2": {
+ "after": "_FuchsiaGymRocker1AfterBattleText",
+ "battle": "_FuchsiaGymRocker1BattleText",
+ "event": "EVENT_BEAT_FUCHSIA_GYM_TRAINER_0",
+ "range": 2,
+ "won": "_FuchsiaGymRocker1EndBattleText"
+ },
+ "3": {
+ "after": "_FuchsiaGymRocker2AfterBattleText",
+ "battle": "_FuchsiaGymRocker2BattleText",
+ "event": "EVENT_BEAT_FUCHSIA_GYM_TRAINER_1",
+ "range": 2,
+ "won": "_FuchsiaGymRocker2EndBattleText"
+ },
+ "4": {
+ "after": "_FuchsiaGymRocker3AfterBattleText",
+ "battle": "_FuchsiaGymRocker3BattleText",
+ "event": "EVENT_BEAT_FUCHSIA_GYM_TRAINER_2",
+ "range": 4,
+ "won": "_FuchsiaGymRocker3EndBattleText"
+ },
+ "5": {
+ "after": "_FuchsiaGymRocker4AfterBattleText",
+ "battle": "_FuchsiaGymRocker4BattleText",
+ "event": "EVENT_BEAT_FUCHSIA_GYM_TRAINER_3",
+ "range": 2,
+ "won": "_FuchsiaGymRocker4EndBattleText"
+ },
+ "6": {
+ "after": "_FuchsiaGymRocker5AfterBattleText",
+ "battle": "_FuchsiaGymRocker5BattleText",
+ "event": "EVENT_BEAT_FUCHSIA_GYM_TRAINER_4",
+ "range": 2,
+ "won": "_FuchsiaGymRocker5EndBattleText"
+ },
+ "7": {
+ "after": "_FuchsiaGymRocker6AfterBattleText",
+ "battle": "_FuchsiaGymRocker6BattleText",
+ "event": "EVENT_BEAT_FUCHSIA_GYM_TRAINER_5",
+ "range": 2,
+ "won": "_FuchsiaGymRocker6EndBattleText"
+ }
+ },
+ "LancesRoom": {
+ "1": {
+ "after": "_LancesRoomLanceAfterBattleText",
+ "battle": "_LancesRoomLanceBeforeBattleText",
+ "event": "EVENT_BEAT_LANCES_ROOM_TRAINER_0",
+ "range": 0,
+ "won": "_LancesRoomLanceEndBattleText"
+ }
+ },
+ "LoreleisRoom": {
+ "1": {
+ "after": "_LoreleisRoomLoreleiAfterBattleText",
+ "battle": "_LoreleisRoomLoreleiBeforeBattleText",
+ "event": "EVENT_BEAT_LORELEIS_ROOM_TRAINER_0",
+ "range": 0,
+ "won": "_LoreleisRoomLoreleiEndBattleText"
+ }
+ },
+ "MtMoon1F": {
+ "1": {
+ "after": "_MtMoon1FHikerAfterBattleText",
+ "battle": "_MtMoon1FHikerBattleText",
+ "event": "EVENT_BEAT_MT_MOON_1_TRAINER_0",
+ "range": 2,
+ "won": "_MtMoon1FHikerEndBattleText"
+ },
+ "2": {
+ "after": "_MtMoon1FYoungster1AfterBattleText",
+ "battle": "_MtMoon1FYoungster1BattleText",
+ "event": "EVENT_BEAT_MT_MOON_1_TRAINER_1",
+ "range": 3,
+ "won": "_MtMoon1FYoungster1EndBattleText"
+ },
+ "3": {
+ "after": "_MtMoon1FCooltrainerF1AfterBattleText",
+ "battle": "_MtMoon1FCooltrainerF1BattleText",
+ "event": "EVENT_BEAT_MT_MOON_1_TRAINER_2",
+ "range": 3,
+ "won": "_MtMoon1FCooltrainerF1EndBattleText"
+ },
+ "4": {
+ "after": "_MtMoon1FSuperNerdAfterBattleText",
+ "battle": "_MtMoon1FSuperNerdBattleText",
+ "event": "EVENT_BEAT_MT_MOON_1_TRAINER_3",
+ "range": 3,
+ "won": "_MtMoon1FSuperNerdEndBattleText"
+ },
+ "5": {
+ "after": "_MtMoon1FCooltrainerF2AfterBattleText",
+ "battle": "_MtMoon1FCooltrainerF2BattleText",
+ "event": "EVENT_BEAT_MT_MOON_1_TRAINER_4",
+ "range": 3,
+ "won": "_MtMoon1FCooltrainerF2EndBattleText"
+ },
+ "6": {
+ "after": "_MtMoon1FYoungster2AfterBattleText",
+ "battle": "_MtMoon1FYoungster2BattleText",
+ "event": "EVENT_BEAT_MT_MOON_1_TRAINER_5",
+ "range": 3,
+ "won": "_MtMoon1FYoungster2EndBattleText"
+ },
+ "7": {
+ "after": "_MtMoon1FYoungster3AfterBattleText",
+ "battle": "_MtMoon1FYoungster3BattleText",
+ "event": "EVENT_BEAT_MT_MOON_1_TRAINER_6",
+ "range": 3,
+ "won": "_MtMoon1FYoungster3EndBattleText"
+ }
+ },
+ "MtMoonB2F": {
+ "3": {
+ "after": "_MtMoonB2FRocket2AfterBattleText",
+ "battle": "_MtMoonB2FRocket2BattleText",
+ "event": "EVENT_BEAT_MT_MOON_3_TRAINER_0",
+ "range": 4,
+ "won": "_MtMoonB2FRocket2EndBattleText"
+ },
+ "4": {
+ "after": "_MtMoonB2FRocket3AfterBattleText",
+ "battle": "_MtMoonB2FRocket3BattleText",
+ "event": "EVENT_BEAT_MT_MOON_3_TRAINER_1",
+ "range": 4,
+ "won": "_MtMoonB2FRocket3EndBattleText"
+ },
+ "5": {
+ "after": "_MtMoonB2FRocket4AfterBattleText",
+ "battle": "_MtMoonB2FRocket4BattleText",
+ "event": "EVENT_BEAT_MT_MOON_3_TRAINER_2",
+ "range": 4,
+ "won": "_MtMoonB2FRocket4EndBattleText"
+ }
+ },
+ "PewterGym": {
+ "2": {
+ "after": "_PewterGymCooltrainerMAfterBattleText",
+ "battle": "_PewterGymCooltrainerMBattleText",
+ "event": "EVENT_BEAT_PEWTER_GYM_TRAINER_0",
+ "range": 5,
+ "won": "_PewterGymCooltrainerMEndBattleText"
+ }
+ },
+ "PokemonMansion1F": {
+ "1": {
+ "after": "_PokemonMansion1FScientistAfterBattleText",
+ "battle": "_PokemonMansion1FScientistBattleText",
+ "event": "EVENT_BEAT_MANSION_1_TRAINER_0",
+ "range": 3,
+ "won": "_PokemonMansion1FScientistEndBattleText"
+ }
+ },
+ "PokemonMansion2F": {
+ "1": {
+ "after": "_PokemonMansion2FSuperNerdAfterBattleText",
+ "battle": "_PokemonMansion2FSuperNerdBattleText",
+ "event": "EVENT_BEAT_MANSION_2_TRAINER_0",
+ "range": 0,
+ "won": "_PokemonMansion2FSuperNerdEndBattleText"
+ }
+ },
+ "PokemonMansion3F": {
+ "1": {
+ "after": "_PokemonMansion3FSuperNerdAfterBattleText",
+ "battle": "_PokemonMansion3FSuperNerdBattleText",
+ "event": "EVENT_BEAT_MANSION_3_TRAINER_0",
+ "range": 0,
+ "won": "_PokemonMansion3FSuperNerdEndBattleText"
+ },
+ "2": {
+ "after": "_PokemonMansion3FScientistAfterBattleText",
+ "battle": "_PokemonMansion3FScientistBattleText",
+ "event": "EVENT_BEAT_MANSION_3_TRAINER_1",
+ "range": 2,
+ "won": "_PokemonMansion3FScientistEndBattleText"
+ }
+ },
+ "PokemonMansionB1F": {
+ "1": {
+ "after": "_PokemonMansionB1FBurglarAfterBattleText",
+ "battle": "_PokemonMansionB1FBurglarBattleText",
+ "event": "EVENT_BEAT_MANSION_4_TRAINER_0",
+ "range": 0,
+ "won": "_PokemonMansionB1FBurglarEndBattleText"
+ },
+ "2": {
+ "after": "_PokemonMansionB1FScientistAfterBattleText",
+ "battle": "_PokemonMansionB1FScientistBattleText",
+ "event": "EVENT_BEAT_MANSION_4_TRAINER_1",
+ "range": 3,
+ "won": "_PokemonMansionB1FScientistEndBattleText"
+ }
+ },
+ "PokemonTower3F": {
+ "1": {
+ "after": "_PokemonTower3FChanneler1AfterBattleText",
+ "battle": "_PokemonTower3FChanneler1BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_3_TRAINER_0",
+ "range": 2,
+ "won": "_PokemonTower3FChanneler1EndBattleText"
+ },
+ "2": {
+ "after": "_PokemonTower3FChanneler2AfterBattleText",
+ "battle": "_PokemonTower3FChanneler2BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_3_TRAINER_1",
+ "range": 3,
+ "won": "_PokemonTower3FChanneler2EndBattleText"
+ },
+ "3": {
+ "after": "_PokemonTower3FChanneler3AfterBattleText",
+ "battle": "_PokemonTower3FChanneler3BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_3_TRAINER_2",
+ "range": 2,
+ "won": "_PokemonTower3FChanneler3EndBattleText"
+ }
+ },
+ "PokemonTower4F": {
+ "1": {
+ "after": "_PokemonTower4FChanneler1AfterBattleText",
+ "battle": "_PokemonTower4FChanneler1BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_4_TRAINER_0",
+ "range": 2,
+ "won": "_PokemonTower4FChanneler1EndBattleText"
+ },
+ "2": {
+ "after": "_PokemonTower4FChanneler2AfterBattleText",
+ "battle": "_PokemonTower4FChanneler2BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_4_TRAINER_1",
+ "range": 2,
+ "won": "_PokemonTower4FChanneler2EndBattleText"
+ },
+ "3": {
+ "after": "_PokemonTower4FChanneler3AfterBattleText",
+ "battle": "_PokemonTower4FChanneler3BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_4_TRAINER_2",
+ "range": 2,
+ "won": "_PokemonTower4FChanneler3EndBattleText"
+ }
+ },
+ "PokemonTower5F": {
+ "2": {
+ "after": "_PokemonTower5FChanneler2AfterBattleText",
+ "battle": "_PokemonTower5FChanneler2BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_5_TRAINER_0",
+ "range": 2,
+ "won": "_PokemonTower5FChanneler2EndBattleText"
+ },
+ "3": {
+ "after": "_PokemonTower5FChanneler3AfterBattleText",
+ "battle": "_PokemonTower5FChanneler3BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_5_TRAINER_1",
+ "range": 3,
+ "won": "_PokemonTower5FChanneler3EndBattleText"
+ },
+ "4": {
+ "after": "_PokemonTower5FChanneler4AfterBattleText",
+ "battle": "_PokemonTower5FChanneler4BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_5_TRAINER_2",
+ "range": 2,
+ "won": "_PokemonTower5FChanneler4EndBattleText"
+ },
+ "5": {
+ "after": "_PokemonTower5FChanneler5AfterBattleText",
+ "battle": "_PokemonTower5FChanneler5BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_5_TRAINER_3",
+ "range": 2,
+ "won": "_PokemonTower5FChanneler5EndBattleText"
+ }
+ },
+ "PokemonTower6F": {
+ "1": {
+ "after": "_PokemonTower6FChanneler1AfterBattleText",
+ "battle": "_PokemonTower6FChanneler1BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_6_TRAINER_0",
+ "range": 3,
+ "won": "_PokemonTower6FChanneler1EndBattleText"
+ },
+ "2": {
+ "after": "_PokemonTower6FChanneler2AfterBattleText",
+ "battle": "_PokemonTower6FChanneler2BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_6_TRAINER_1",
+ "range": 3,
+ "won": "_PokemonTower6FChanneler2EndBattleText"
+ },
+ "3": {
+ "after": "_PokemonTower6FChanneler3AfterBattleText",
+ "battle": "_PokemonTower6FChanneler3BattleText",
+ "event": "EVENT_BEAT_POKEMONTOWER_6_TRAINER_2",
+ "range": 2,
+ "won": "_PokemonTower6FChanneler3EndBattleText"
+ }
+ },
+ "PowerPlant": {
+ "1": {
+ "after": "_PowerPlantVoltorbBattleText",
+ "battle": "_PowerPlantVoltorbBattleText",
+ "event": "EVENT_BEAT_POWER_PLANT_VOLTORB_0",
+ "range": 0,
+ "won": "_PowerPlantVoltorbBattleText"
+ },
+ "2": {
+ "after": "_PowerPlantVoltorbBattleText",
+ "battle": "_PowerPlantVoltorbBattleText",
+ "event": "EVENT_BEAT_POWER_PLANT_VOLTORB_1",
+ "range": 0,
+ "won": "_PowerPlantVoltorbBattleText"
+ },
+ "3": {
+ "after": "_PowerPlantVoltorbBattleText",
+ "battle": "_PowerPlantVoltorbBattleText",
+ "event": "EVENT_BEAT_POWER_PLANT_VOLTORB_2",
+ "range": 0,
+ "won": "_PowerPlantVoltorbBattleText"
+ },
+ "4": {
+ "after": "_PowerPlantVoltorbBattleText",
+ "battle": "_PowerPlantVoltorbBattleText",
+ "event": "EVENT_BEAT_POWER_PLANT_VOLTORB_3",
+ "range": 0,
+ "won": "_PowerPlantVoltorbBattleText"
+ },
+ "5": {
+ "after": "_PowerPlantVoltorbBattleText",
+ "battle": "_PowerPlantVoltorbBattleText",
+ "event": "EVENT_BEAT_POWER_PLANT_VOLTORB_4",
+ "range": 0,
+ "won": "_PowerPlantVoltorbBattleText"
+ },
+ "6": {
+ "after": "_PowerPlantVoltorbBattleText",
+ "battle": "_PowerPlantVoltorbBattleText",
+ "event": "EVENT_BEAT_POWER_PLANT_VOLTORB_5",
+ "range": 0,
+ "won": "_PowerPlantVoltorbBattleText"
+ },
+ "7": {
+ "after": "_PowerPlantVoltorbBattleText",
+ "battle": "_PowerPlantVoltorbBattleText",
+ "event": "EVENT_BEAT_POWER_PLANT_VOLTORB_6",
+ "range": 0,
+ "won": "_PowerPlantVoltorbBattleText"
+ },
+ "8": {
+ "after": "_PowerPlantVoltorbBattleText",
+ "battle": "_PowerPlantVoltorbBattleText",
+ "event": "EVENT_BEAT_POWER_PLANT_VOLTORB_7",
+ "range": 0,
+ "won": "_PowerPlantVoltorbBattleText"
+ },
+ "9": {
+ "after": "_PowerPlantZapdosBattleText",
+ "battle": "_PowerPlantZapdosBattleText",
+ "event": "EVENT_BEAT_ZAPDOS",
+ "range": 0,
+ "won": "_PowerPlantZapdosBattleText"
+ }
+ },
+ "RockTunnel1F": {
+ "1": {
+ "after": "_RockTunnel1FHiker1AfterBattleText",
+ "battle": "_RockTunnel1FHiker1BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_0",
+ "range": 4,
+ "won": "_RockTunnel1FHiker1EndBattleText"
+ },
+ "2": {
+ "after": "_RockTunnel1FHiker2AfterBattleText",
+ "battle": "_RockTunnel1FHiker2BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_1",
+ "range": 4,
+ "won": "_RockTunnel1FHiker2EndBattleText"
+ },
+ "3": {
+ "after": "_RockTunnel1FHiker3AfterBattleText",
+ "battle": "_RockTunnel1FHiker3BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_2",
+ "range": 3,
+ "won": "_RockTunnel1FHiker3EndBattleText"
+ },
+ "4": {
+ "after": "_RockTunnel1FSuperNerdAfterBattleText",
+ "battle": "_RockTunnel1FSuperNerdBattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_3",
+ "range": 3,
+ "won": "_RockTunnel1FSuperNerdEndBattleText"
+ },
+ "5": {
+ "after": "_RockTunnel1FCooltrainerF1AfterBattleText",
+ "battle": "_RockTunnel1FCooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_4",
+ "range": 4,
+ "won": "_RockTunnel1FCooltrainerF1EndBattleText"
+ },
+ "6": {
+ "after": "_RockTunnel1FCooltrainerF2AfterBattleText",
+ "battle": "_RockTunnel1FCooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_5",
+ "range": 4,
+ "won": "_RockTunnel1FCooltrainerF2EndBattleText"
+ },
+ "7": {
+ "after": "_RockTunnel1FCooltrainerF3AfterBattleText",
+ "battle": "_RockTunnel1FCooltrainerF3BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_1_TRAINER_6",
+ "range": 4,
+ "won": "_RockTunnel1FCooltrainerF3EndBattleText"
+ }
+ },
+ "RockTunnelB1F": {
+ "1": {
+ "after": "_RockTunnelB1FCooltrainerF1AfterBattleText",
+ "battle": "_RockTunnelB1FCooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_0",
+ "range": 4,
+ "won": "_RockTunnelB1FCooltrainerF1EndBattleText"
+ },
+ "2": {
+ "after": "_RockTunnelB1FHiker1AfterBattleText",
+ "battle": "_RockTunnelB1FHiker1BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_1",
+ "range": 3,
+ "won": "_RockTunnelB1FHiker1EndBattleText"
+ },
+ "3": {
+ "after": "_RockTunnelB1FSuperNerd1AfterBattleText",
+ "battle": "_RockTunnelB1FSuperNerd1BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_2",
+ "range": 3,
+ "won": "_RockTunnelB1FSuperNerd1EndBattleText"
+ },
+ "4": {
+ "after": "_RockTunnelB1FSuperNerd2AfterBattleText",
+ "battle": "_RockTunnelB1FSuperNerd2BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_3",
+ "range": 4,
+ "won": "_RockTunnelB1FSuperNerd2EndBattleText"
+ },
+ "5": {
+ "after": "_RockTunnelB1FHiker2AfterBattleText",
+ "battle": "_RockTunnelB1FHiker2BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_4",
+ "range": 3,
+ "won": "_RockTunnelB1FHiker2EndBattleText"
+ },
+ "6": {
+ "after": "_RockTunnelB1FCooltrainerF2AfterBattleText",
+ "battle": "_RockTunnelB1FCooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_5",
+ "range": 4,
+ "won": "_RockTunnelB1FCooltrainerF2EndBattleText"
+ },
+ "7": {
+ "after": "_RockTunnelB1FHiker3AfterBattleText",
+ "battle": "_RockTunnelB1FHiker3BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_6",
+ "range": 3,
+ "won": "_RockTunnelB1FHiker3EndBattleText"
+ },
+ "8": {
+ "after": "_RockTunnelB1FSuperNerd3AfterBattleText",
+ "battle": "_RockTunnelB1FSuperNerd3BattleText",
+ "event": "EVENT_BEAT_ROCK_TUNNEL_2_TRAINER_7",
+ "range": 3,
+ "won": "_RockTunnelB1FSuperNerd3EndBattleText"
+ }
+ },
+ "RocketHideoutB1F": {
+ "1": {
+ "after": "_RocketHideoutB1FRocket1AfterBattleText",
+ "battle": "_RocketHideoutB1FRocket1BattleText",
+ "event": "EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_0",
+ "range": 3,
+ "won": "_RocketHideoutB1FRocket1EndBattleText"
+ },
+ "2": {
+ "after": "_RocketHideoutB1FRocket2AfterBattleText",
+ "battle": "_RocketHideoutB1FRocket2BattleText",
+ "event": "EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_1",
+ "range": 2,
+ "won": "_RocketHideoutB1FRocket2EndBattleText"
+ },
+ "3": {
+ "after": "_RocketHideoutB1FRocket3AfterBattleText",
+ "battle": "_RocketHideoutB1FRocket3BattleText",
+ "event": "EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_2",
+ "range": 2,
+ "won": "_RocketHideoutB1FRocket3EndBattleText"
+ },
+ "4": {
+ "after": "_RocketHideoutB1FRocket4AfterBattleText",
+ "battle": "_RocketHideoutB1FRocket4BattleText",
+ "event": "EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_3",
+ "range": 3,
+ "won": "_RocketHideoutB1FRocket4EndBattleText"
+ },
+ "5": {
+ "after": "_RocketHideoutB1FRocket5AfterBattleText",
+ "battle": "_RocketHideoutB1FRocket5BattleText",
+ "event": "EVENT_BEAT_ROCKET_HIDEOUT_1_TRAINER_4",
+ "range": 3,
+ "won": "_RocketHideoutB1FRocket5EndBattleText"
+ }
+ },
+ "RocketHideoutB2F": {
+ "1": {
+ "after": "_RocketHideoutB2FRocketAfterBattleText",
+ "battle": "_RocketHideoutB2FRocketBattleText",
+ "event": "EVENT_BEAT_ROCKET_HIDEOUT_2_TRAINER_0",
+ "range": 4,
+ "won": "_RocketHideoutB2FRocketEndBattleText"
+ }
+ },
+ "RocketHideoutB3F": {
+ "1": {
+ "after": "_RocketHideoutB3FRocket1AfterBattleText",
+ "battle": "_RocketHideoutB3FRocket1BattleText",
+ "event": "EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_0",
+ "range": 2,
+ "won": "_RocketHideoutB3FRocket1EndBattleText"
+ },
+ "2": {
+ "after": "_RocketHide3AfterBattleText3",
+ "battle": "_RocketHideout3BattleText",
+ "event": "EVENT_BEAT_ROCKET_HIDEOUT_3_TRAINER_1",
+ "range": 4,
+ "won": "_RocketHideout3EndBattleText3"
+ }
+ },
+ "RocketHideoutB4F": {
+ "4": {
+ "after": "_RocketHideoutB4FRocketAfterBattleText",
+ "battle": "_RocketHideoutB4FRocketBattleText",
+ "event": "EVENT_BEAT_ROCKET_HIDEOUT_4_TRAINER_2",
+ "range": 1,
+ "won": "_RocketHideoutB4FRocketEndBattleText"
+ }
+ },
+ "Route10": {
+ "1": {
+ "after": "_Route10SuperNerd1AfterBattleText",
+ "battle": "_Route10SuperNerd1BattleText",
+ "event": "EVENT_BEAT_ROUTE_10_TRAINER_0",
+ "range": 4,
+ "won": "_Route10SuperNerd1EndBattleText"
+ },
+ "2": {
+ "after": "_Route10Hiker1AfterBattleText",
+ "battle": "_Route10Hiker1BattleText",
+ "event": "EVENT_BEAT_ROUTE_10_TRAINER_1",
+ "range": 3,
+ "won": "_Route10Hiker1EndBattleText"
+ },
+ "3": {
+ "after": "_Route10SuperNerd2AfterBattleText",
+ "battle": "_Route10SuperNerd2BattleText",
+ "event": "EVENT_BEAT_ROUTE_10_TRAINER_2",
+ "range": 4,
+ "won": "_Route10SuperNerd2EndBattleText"
+ },
+ "4": {
+ "after": "_Route10CooltrainerF1AfterBattleText",
+ "battle": "_Route10CooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROUTE_10_TRAINER_3",
+ "range": 3,
+ "won": "_Route10CooltrainerF1EndBattleText"
+ },
+ "5": {
+ "after": "_Route10Hiker2AfterBattleText",
+ "battle": "_Route10Hiker2BattleText",
+ "event": "EVENT_BEAT_ROUTE_10_TRAINER_4",
+ "range": 2,
+ "won": "_Route10Hiker2EndBattleText"
+ },
+ "6": {
+ "after": "_Route10CooltrainerF2AfterBattleText",
+ "battle": "_Route10CooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROUTE_10_TRAINER_5",
+ "range": 2,
+ "won": "_Route10CooltrainerF2EndBattleText"
+ }
+ },
+ "Route11": {
+ "1": {
+ "after": "_Route11Gambler1AfterBattleText",
+ "battle": "_Route11Gambler1BattleText",
+ "event": "EVENT_BEAT_ROUTE_11_TRAINER_0",
+ "range": 3,
+ "won": "_Route11Gambler1EndBattleText"
+ },
+ "2": {
+ "after": "_Route11Gambler2AfterBattleText",
+ "battle": "_Route11Gambler2BattleText",
+ "event": "EVENT_BEAT_ROUTE_11_TRAINER_1",
+ "range": 2,
+ "won": "_Route11Gambler2EndBattleText"
+ },
+ "3": {
+ "after": "_Route11Youngster1AfterBattleText",
+ "battle": "_Route11Youngster1BattleText",
+ "event": "EVENT_BEAT_ROUTE_11_TRAINER_2",
+ "range": 3,
+ "won": "_Route11Youngster1EndBattleText"
+ },
+ "4": {
+ "after": "_Route11SuperNerd1AfterBattleText",
+ "battle": "_Route11SuperNerd1BattleText",
+ "event": "EVENT_BEAT_ROUTE_11_TRAINER_3",
+ "range": 3,
+ "won": "_Route11SuperNerd1EndBattleText"
+ },
+ "5": {
+ "after": "_Route11Youngster2AfterBattleText5",
+ "battle": "_Route11Youngster2BattleText",
+ "event": "EVENT_BEAT_ROUTE_11_TRAINER_4",
+ "range": 4,
+ "won": "_Route11Youngster2EndBattleText"
+ },
+ "6": {
+ "after": "_Route11Gambler3AfterBattleText",
+ "battle": "_Route11Gambler3BattleText",
+ "event": "EVENT_BEAT_ROUTE_11_TRAINER_5",
+ "range": 3,
+ "won": "_Route11Gambler3EndBattleText"
+ },
+ "7": {
+ "after": "_Route11Gambler4AfterBattleText",
+ "battle": "_Route11Gambler4BattleText",
+ "event": "EVENT_BEAT_ROUTE_11_TRAINER_6",
+ "range": 3,
+ "won": "_Route11Gambler4EndBattleText"
+ },
+ "8": {
+ "after": "_Route11Youngster3AfterBattleText",
+ "battle": "_Route11Youngster3BattleText",
+ "event": "EVENT_BEAT_ROUTE_11_TRAINER_7",
+ "range": 4,
+ "won": "_Route11Youngster3EndBattleText"
+ },
+ "9": {
+ "after": "_Route11SuperNerd2AfterBattleText",
+ "battle": "_Route11SuperNerd2BattleText",
+ "event": "EVENT_BEAT_ROUTE_11_TRAINER_8",
+ "range": 3,
+ "won": "_Route11SuperNerd2EndBattleText"
+ },
+ "10": {
+ "after": "_Route11Youngster4AfterBattleText",
+ "battle": "_Route11Youngster4BattleText",
+ "event": "EVENT_BEAT_ROUTE_11_TRAINER_9",
+ "range": 4,
+ "won": "_Route11Youngster4EndBattleText"
+ }
+ },
+ "Route12": {
+ "2": {
+ "after": "_Route12Fisher1AfterBattleText",
+ "battle": "_Route12Fisher1BattleText",
+ "event": "EVENT_BEAT_ROUTE_12_TRAINER_0",
+ "range": 4,
+ "won": "_Route12Fisher1EndBattleText"
+ },
+ "3": {
+ "after": "_Route12Fisher2AfterBattleText",
+ "battle": "_Route12Fisher2BattleText",
+ "event": "EVENT_BEAT_ROUTE_12_TRAINER_1",
+ "range": 4,
+ "won": "_Route12Fisher2EndBattleText"
+ },
+ "4": {
+ "after": "_Route12CooltrainerMAfterBattleText",
+ "battle": "_Route12CooltrainerMBattleText",
+ "event": "EVENT_BEAT_ROUTE_12_TRAINER_2",
+ "range": 4,
+ "won": "_Route12CooltrainerMEndBattleText"
+ },
+ "5": {
+ "after": "_Route12SuperNerdAfterBattleText",
+ "battle": "_Route12SuperNerdBattleText",
+ "event": "EVENT_BEAT_ROUTE_12_TRAINER_3",
+ "range": 4,
+ "won": "_Route12SuperNerdEndBattleText"
+ },
+ "6": {
+ "after": "_Route12Fisher3AfterBattleText",
+ "battle": "_Route12Fisher3BattleText",
+ "event": "EVENT_BEAT_ROUTE_12_TRAINER_4",
+ "range": 4,
+ "won": "_Route12Fisher3EndBattleText"
+ },
+ "7": {
+ "after": "_Route12Fisher4AfterBattleText",
+ "battle": "_Route12Fisher4BattleText",
+ "event": "EVENT_BEAT_ROUTE_12_TRAINER_5",
+ "range": 4,
+ "won": "_Route12Fisher4EndBattleText"
+ },
+ "8": {
+ "after": "_Route12Fisher5AfterBattleText",
+ "battle": "_Route12Fisher5BattleText",
+ "event": "EVENT_BEAT_ROUTE_12_TRAINER_6",
+ "range": 1,
+ "won": "_Route12Fisher5EndBattleText"
+ }
+ },
+ "Route13": {
+ "1": {
+ "after": "_Route13CooltrainerM1AfterBattleText",
+ "battle": "_Route13CooltrainerM1BattleText",
+ "event": "EVENT_BEAT_ROUTE_13_TRAINER_0",
+ "range": 2,
+ "won": "_Route13CooltrainerM1EndBattleText"
+ },
+ "2": {
+ "after": "_Route13CooltrainerF1AfterBattleText",
+ "battle": "_Route13CooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROUTE_13_TRAINER_1",
+ "range": 2,
+ "won": "_Route13CooltrainerF1EndBattleText"
+ },
+ "3": {
+ "after": "_Route13CooltrainerF2AfterBattleText",
+ "battle": "_Route13CooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROUTE_13_TRAINER_2",
+ "range": 2,
+ "won": "_Route13CooltrainerF2EndBattleText"
+ },
+ "4": {
+ "after": "_Route13CooltrainerF3AfterBattleText",
+ "battle": "_Route13CooltrainerF3BattleText",
+ "event": "EVENT_BEAT_ROUTE_13_TRAINER_3",
+ "range": 2,
+ "won": "_Route13CooltrainerF3EndBattleText"
+ },
+ "5": {
+ "after": "_Route13CooltrainerF4AfterBattleText",
+ "battle": "_Route13CooltrainerF4BattleText",
+ "event": "EVENT_BEAT_ROUTE_13_TRAINER_4",
+ "range": 4,
+ "won": "_Route13CooltrainerF4EndBattleText"
+ },
+ "6": {
+ "after": "_Route13CooltrainerM2AfterBattleText",
+ "battle": "_Route13CooltrainerM2BattleText",
+ "event": "EVENT_BEAT_ROUTE_13_TRAINER_5",
+ "range": 2,
+ "won": "_Route13CooltrainerM2EndBattleText"
+ },
+ "7": {
+ "after": "_Route13Beauty1AfterBattleText",
+ "battle": "_Route13Beauty1BattleText",
+ "event": "EVENT_BEAT_ROUTE_13_TRAINER_6",
+ "range": 4,
+ "won": "_Route13Beauty1EndBattleText"
+ },
+ "8": {
+ "after": "_Route13Beauty2AfterBattleText",
+ "battle": "_Route13Beauty2BattleText",
+ "event": "EVENT_BEAT_ROUTE_13_TRAINER_7",
+ "range": 2,
+ "won": "_Route13Beauty2EndBattleText"
+ },
+ "9": {
+ "after": "_Route13BikerAfterBattleText",
+ "battle": "_Route13BikerBattleText",
+ "event": "EVENT_BEAT_ROUTE_13_TRAINER_8",
+ "range": 2,
+ "won": "_Route13BikerEndBattleText"
+ },
+ "10": {
+ "after": "_Route13CooltrainerM3AfterBattleText",
+ "battle": "_Route13CooltrainerM3BattleText",
+ "event": "EVENT_BEAT_ROUTE_13_TRAINER_9",
+ "range": 4,
+ "won": "_Route13CooltrainerM3EndBattleText"
+ }
+ },
+ "Route14": {
+ "1": {
+ "after": "_Route14CooltrainerM1AfterBattleText",
+ "battle": "_Route14CooltrainerM1BattleText",
+ "event": "EVENT_BEAT_ROUTE_14_TRAINER_0",
+ "range": 2,
+ "won": "_Route14CooltrainerM1EndBattleText"
+ },
+ "2": {
+ "after": "_Route14CooltrainerM2AfterBattleText",
+ "battle": "_Route14CooltrainerM2BattleText",
+ "event": "EVENT_BEAT_ROUTE_14_TRAINER_1",
+ "range": 2,
+ "won": "_Route14CooltrainerM2EndBattleText"
+ },
+ "3": {
+ "after": "_Route14CooltrainerM3AfterBattleText",
+ "battle": "_Route14CooltrainerM3BattleText",
+ "event": "EVENT_BEAT_ROUTE_14_TRAINER_2",
+ "range": 4,
+ "won": "_Route14CooltrainerM3EndBattleText"
+ },
+ "4": {
+ "after": "_Route14CooltrainerM4AfterBattleText",
+ "battle": "_Route14CooltrainerM4BattleText",
+ "event": "EVENT_BEAT_ROUTE_14_TRAINER_3",
+ "range": 3,
+ "won": "_Route14CooltrainerM4EndBattleText"
+ },
+ "5": {
+ "after": "_Route14CooltrainerM5AfterBattleText",
+ "battle": "_Route14CooltrainerM5BattleText",
+ "event": "EVENT_BEAT_ROUTE_14_TRAINER_4",
+ "range": 3,
+ "won": "_Route14CooltrainerM5EndBattleText"
+ },
+ "6": {
+ "after": "_Route14CooltrainerM6AfterBattleText",
+ "battle": "_Route14CooltrainerM6BattleText",
+ "event": "EVENT_BEAT_ROUTE_14_TRAINER_5",
+ "range": 4,
+ "won": "_Route14CooltrainerM6EndBattleText"
+ },
+ "7": {
+ "after": "_Route14Biker1AfterBattleText",
+ "battle": "_Route14Biker1BattleText",
+ "event": "EVENT_BEAT_ROUTE_14_TRAINER_6",
+ "range": 4,
+ "won": "_Route14Biker1EndBattleText"
+ },
+ "8": {
+ "after": "_Route14Biker2AfterBattleText",
+ "battle": "_Route14Biker2BattleText",
+ "event": "EVENT_BEAT_ROUTE_14_TRAINER_7",
+ "range": 4,
+ "won": "_Route14Biker2EndBattleText"
+ },
+ "9": {
+ "after": "_Route14Biker3AfterBattleText",
+ "battle": "_Route14Biker3BattleText",
+ "event": "EVENT_BEAT_ROUTE_14_TRAINER_8",
+ "range": 3,
+ "won": "_Route14Biker3EndBattleText"
+ },
+ "10": {
+ "after": "_Route14Biker4AfterBattleText",
+ "battle": "_Route14Biker4BattleText",
+ "event": "EVENT_BEAT_ROUTE_14_TRAINER_9",
+ "range": 4,
+ "won": "_Route14Biker4EndBattleText"
+ }
+ },
+ "Route15": {
+ "1": {
+ "after": "_Route15CooltrainerF1AfterBattleText",
+ "battle": "_Route15CooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROUTE_15_TRAINER_0",
+ "range": 2,
+ "won": "_Route15CooltrainerF1EndBattleText"
+ },
+ "2": {
+ "after": "_Route15CooltrainerF2AfterBattleText",
+ "battle": "_Route15CooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROUTE_15_TRAINER_1",
+ "range": 3,
+ "won": "_Route15CooltrainerF2EndBattleText"
+ },
+ "3": {
+ "after": "_Route15CooltrainerM1AfterBattleText",
+ "battle": "_Route15CooltrainerM1BattleText",
+ "event": "EVENT_BEAT_ROUTE_15_TRAINER_2",
+ "range": 3,
+ "won": "_Route15CooltrainerM1EndBattleText"
+ },
+ "4": {
+ "after": "_Route15CooltrainerM2AfterBattleText",
+ "battle": "_Route15CooltrainerM2BattleText",
+ "event": "EVENT_BEAT_ROUTE_15_TRAINER_3",
+ "range": 3,
+ "won": "_Route15CooltrainerM2EndBattleText"
+ },
+ "5": {
+ "after": "_Route15Beauty1AfterBattleText",
+ "battle": "_Route15Beauty1BattleText",
+ "event": "EVENT_BEAT_ROUTE_15_TRAINER_4",
+ "range": 2,
+ "won": "_Route15Beauty1EndBattleText"
+ },
+ "6": {
+ "after": "_Route15Beauty2AfterBattleText",
+ "battle": "_Route15Beauty2BattleText",
+ "event": "EVENT_BEAT_ROUTE_15_TRAINER_5",
+ "range": 3,
+ "won": "_Route15Beauty2EndBattleText"
+ },
+ "7": {
+ "after": "_Route15Biker1AfterBattleText",
+ "battle": "_Route15Biker1BattleText",
+ "event": "EVENT_BEAT_ROUTE_15_TRAINER_6",
+ "range": 3,
+ "won": "_Route15Biker1EndBattleText"
+ },
+ "8": {
+ "after": "_Route15Biker2AfterBattleText",
+ "battle": "_Route15Biker2BattleText",
+ "event": "EVENT_BEAT_ROUTE_15_TRAINER_7",
+ "range": 3,
+ "won": "_Route15Biker2EndBattleText"
+ },
+ "9": {
+ "after": "_Route15CooltrainerF3AfterBattleText",
+ "battle": "_Route15CooltrainerF3BattleText",
+ "event": "EVENT_BEAT_ROUTE_15_TRAINER_8",
+ "range": 3,
+ "won": "_Route15CooltrainerF3EndBattleText"
+ },
+ "10": {
+ "after": "_Route15CooltrainerF4AfterBattleText",
+ "battle": "_Route15CooltrainerF4BattleText",
+ "event": "EVENT_BEAT_ROUTE_15_TRAINER_9",
+ "range": 3,
+ "won": "_Route15CooltrainerF4EndBattleText"
+ }
+ },
+ "Route16": {
+ "1": {
+ "after": "_Route16Biker1AfterBattleText",
+ "battle": "_Route16Biker1BattleText",
+ "event": "EVENT_BEAT_ROUTE_16_TRAINER_0",
+ "range": 3,
+ "won": "_Route16Biker1EndBattleText"
+ },
+ "2": {
+ "after": "_Route16Biker2AfterBattleText",
+ "battle": "_Route16Biker2BattleText",
+ "event": "EVENT_BEAT_ROUTE_16_TRAINER_1",
+ "range": 2,
+ "won": "_Route16Biker2EndBattleText"
+ },
+ "3": {
+ "after": "_Route16Biker3AfterBattleText",
+ "battle": "_Route16Biker3BattleText",
+ "event": "EVENT_BEAT_ROUTE_16_TRAINER_2",
+ "range": 2,
+ "won": "_Route16Biker3EndBattleText"
+ },
+ "4": {
+ "after": "_Route16Biker4AfterBattleText",
+ "battle": "_Route16biker4BattleText",
+ "event": "EVENT_BEAT_ROUTE_16_TRAINER_3",
+ "range": 2,
+ "won": "_Route16Biker4EndBattleText"
+ },
+ "5": {
+ "after": "_Route16Biker5AfterBattleText",
+ "battle": "_Route16Biker5BattleText",
+ "event": "EVENT_BEAT_ROUTE_16_TRAINER_4",
+ "range": 2,
+ "won": "_Route16Biker5EndBattleText"
+ },
+ "6": {
+ "after": "_Route16Biker6AfterBattleText",
+ "battle": "_Route16Biker6BattleText",
+ "event": "EVENT_BEAT_ROUTE_16_TRAINER_5",
+ "range": 4,
+ "won": "_Route16Biker6EndBattleText"
+ }
+ },
+ "Route17": {
+ "1": {
+ "after": "_Route17Biker1AfterBattleText",
+ "battle": "_Route17Biker1BattleText",
+ "event": "EVENT_BEAT_ROUTE_17_TRAINER_0",
+ "range": 3,
+ "won": "_Route17Biker1EndBattleText"
+ },
+ "2": {
+ "after": "_Route17Biker2AfterBattleText",
+ "battle": "_Route17Biker2BattleText",
+ "event": "EVENT_BEAT_ROUTE_17_TRAINER_1",
+ "range": 4,
+ "won": "_Route17Biker2EndBattleText"
+ },
+ "3": {
+ "after": "_Route17Biker3AfterBattleText",
+ "battle": "_Route17Biker3BattleText",
+ "event": "EVENT_BEAT_ROUTE_17_TRAINER_2",
+ "range": 4,
+ "won": "_Route17Biker3EndBattleText"
+ },
+ "4": {
+ "after": "_Route17Biker4AfterBattleText",
+ "battle": "_Route17Biker4BattleText",
+ "event": "EVENT_BEAT_ROUTE_17_TRAINER_3",
+ "range": 4,
+ "won": "_Route17Biker4EndBattleText"
+ },
+ "5": {
+ "after": "_Route17Biker5AfterBattleText",
+ "battle": "_Route17Biker5BattleText",
+ "event": "EVENT_BEAT_ROUTE_17_TRAINER_4",
+ "range": 3,
+ "won": "_Route17Biker5EndBattleText"
+ },
+ "6": {
+ "after": "_Route17Biker6AfterBattleText",
+ "battle": "_Route17Biker6BattleText",
+ "event": "EVENT_BEAT_ROUTE_17_TRAINER_5",
+ "range": 2,
+ "won": "_Route17Biker6EndBattleText"
+ },
+ "7": {
+ "after": "_Route17Biker7AfterBattleText",
+ "battle": "_Route17Biker7BattleText",
+ "event": "EVENT_BEAT_ROUTE_17_TRAINER_6",
+ "range": 4,
+ "won": "_Route17Biker7EndBattleText"
+ },
+ "8": {
+ "after": "_Route17Biker8AfterBattleText",
+ "battle": "_Route17Biker8BattleText",
+ "event": "EVENT_BEAT_ROUTE_17_TRAINER_7",
+ "range": 2,
+ "won": "_Route17Biker8EndBattleText"
+ },
+ "9": {
+ "after": "_Route17Biker9AfterBattleText",
+ "battle": "_Route17Biker9BattleText",
+ "event": "EVENT_BEAT_ROUTE_17_TRAINER_8",
+ "range": 3,
+ "won": "_Route17Biker9EndBattleText"
+ },
+ "10": {
+ "after": "_Route17Biker10AfterBattleText",
+ "battle": "_Route17Biker10BattleText",
+ "event": "EVENT_BEAT_ROUTE_17_TRAINER_9",
+ "range": 4,
+ "won": "_Route17Biker10EndBattleText"
+ }
+ },
+ "Route18": {
+ "1": {
+ "after": "_Route18CooltrainerM1AfterBattleText",
+ "battle": "_Route18CooltrainerM1BattleText",
+ "event": "EVENT_BEAT_ROUTE_18_TRAINER_0",
+ "range": 3,
+ "won": "_Route18CooltrainerM1EndBattleText"
+ },
+ "2": {
+ "after": "_Route18CooltrainerM2AfterBattleText",
+ "battle": "_Route18CooltrainerM2BattleText",
+ "event": "EVENT_BEAT_ROUTE_18_TRAINER_1",
+ "range": 3,
+ "won": "_Route18CooltrainerM2EndBattleText"
+ },
+ "3": {
+ "after": "_Route18CooltrainerM3AfterBattleText",
+ "battle": "_Route18CooltrainerM3BattleText",
+ "event": "EVENT_BEAT_ROUTE_18_TRAINER_2",
+ "range": 4,
+ "won": "_Route18CooltrainerM3EndBattleText"
+ }
+ },
+ "Route19": {
+ "1": {
+ "after": "_Route19CooltrainerM1AfterBattleText",
+ "battle": "_Route19CooltrainerM1BattleText",
+ "event": "EVENT_BEAT_ROUTE_19_TRAINER_0",
+ "range": 4,
+ "won": "_Route19CooltrainerM1EndBattleText"
+ },
+ "2": {
+ "after": "_Route19CooltrainerM2AfterBattleText",
+ "battle": "_Route19CooltrainerM2BattleText",
+ "event": "EVENT_BEAT_ROUTE_19_TRAINER_1",
+ "range": 4,
+ "won": "_Route19CooltrainerM2EndBattleText"
+ },
+ "3": {
+ "after": "_Route19Swimmer1AfterBattleText",
+ "battle": "_Route19Swimmer1BattleText",
+ "event": "EVENT_BEAT_ROUTE_19_TRAINER_2",
+ "range": 3,
+ "won": "_Route19Swimmer1EndBattleText"
+ },
+ "4": {
+ "after": "_Route19Swimmer2AfterBattleText",
+ "battle": "_Route19Swimmer2BattleText",
+ "event": "EVENT_BEAT_ROUTE_19_TRAINER_3",
+ "range": 4,
+ "won": "_Route19Swimmer2EndBattleText"
+ },
+ "5": {
+ "after": "_Route19Swimmer3AfterBattleText",
+ "battle": "_Route19Swimmer3BattleText",
+ "event": "EVENT_BEAT_ROUTE_19_TRAINER_4",
+ "range": 4,
+ "won": "_Route19Swimmer3EndBattleText"
+ },
+ "6": {
+ "after": "_Route19Swimmer4AfterBattleText",
+ "battle": "_Route19Swimmer4BattleText",
+ "event": "EVENT_BEAT_ROUTE_19_TRAINER_5",
+ "range": 4,
+ "won": "_Route19Swimmer4EndBattleText"
+ },
+ "7": {
+ "after": "_Route19Swimmer5AfterBattleText",
+ "battle": "_Route19Swimmer5BattleText",
+ "event": "EVENT_BEAT_ROUTE_19_TRAINER_6",
+ "range": 3,
+ "won": "_Route19Swimmer5EndBattleText"
+ },
+ "8": {
+ "after": "_Route19Swimmer6AfterBattleText",
+ "battle": "_Route19Swimmer6BattleText",
+ "event": "EVENT_BEAT_ROUTE_19_TRAINER_7",
+ "range": 4,
+ "won": "_Route19Swimmer6EndBattleText"
+ },
+ "9": {
+ "after": "_Route19Swimmer7AfterBattleText",
+ "battle": "_Route19Swimmer7BattleText",
+ "event": "EVENT_BEAT_ROUTE_19_TRAINER_8",
+ "range": 4,
+ "won": "_Route19Swimmer7EndBattleText"
+ },
+ "10": {
+ "after": "_Route19Swimmer8AfterBattleText",
+ "battle": "_Route19Swimmer8BattleText",
+ "event": "EVENT_BEAT_ROUTE_19_TRAINER_9",
+ "range": 4,
+ "won": "_Route19Swimmer8EndBattleText"
+ }
+ },
+ "Route20": {
+ "1": {
+ "after": "_Route20Swimmer1AfterBattleText",
+ "battle": "_Route20Swimmer1BattleText",
+ "event": "EVENT_BEAT_ROUTE_20_TRAINER_0",
+ "range": 4,
+ "won": "_Route20Swimmer1EndBattleText"
+ },
+ "2": {
+ "after": "_Route20Swimmer2AfterBattleText",
+ "battle": "_Route20Swimmer2BattleText",
+ "event": "EVENT_BEAT_ROUTE_20_TRAINER_1",
+ "range": 4,
+ "won": "_Route20Swimmer2EndBattleText"
+ },
+ "3": {
+ "after": "_Route20Swimmer3AfterBattleText",
+ "battle": "_Route20Swimmer3BattleText",
+ "event": "EVENT_BEAT_ROUTE_20_TRAINER_2",
+ "range": 2,
+ "won": "_Route20Swimmer3EndBattleText"
+ },
+ "4": {
+ "after": "_Route20Swimmer4AfterBattleText",
+ "battle": "_Route20Swimmer4BattleText",
+ "event": "EVENT_BEAT_ROUTE_20_TRAINER_3",
+ "range": 4,
+ "won": "_Route20Swimmer4EndBattleText"
+ },
+ "5": {
+ "after": "_Route20Swimmer5AfterBattleText",
+ "battle": "_Route20Swimmer5BattleText",
+ "event": "EVENT_BEAT_ROUTE_20_TRAINER_4",
+ "range": 3,
+ "won": "_Route20Swimmer5EndBattleText"
+ },
+ "6": {
+ "after": "_Route20Swimmer6AfterBattleText",
+ "battle": "_Route20Swimmer6BattleText",
+ "event": "EVENT_BEAT_ROUTE_20_TRAINER_5",
+ "range": 4,
+ "won": "_Route20Swimmer6EndBattleText"
+ },
+ "7": {
+ "after": "_Route20CooltrainerMAfterBattleText",
+ "battle": "_Route20CooltrainerMBattleText",
+ "event": "EVENT_BEAT_ROUTE_20_TRAINER_6",
+ "range": 2,
+ "won": "_Route20CooltrainerMEndBattleText"
+ },
+ "8": {
+ "after": "_Route20Swimmer7AfterBattleText",
+ "battle": "_Route20Swimmer7BattleText",
+ "event": "EVENT_BEAT_ROUTE_20_TRAINER_7",
+ "range": 4,
+ "won": "_Route20Swimmer7EndBattleText"
+ },
+ "9": {
+ "after": "_Route20Swimmer8AfterBattleText",
+ "battle": "_Route20Swimmer8BattleText",
+ "event": "EVENT_BEAT_ROUTE_20_TRAINER_8",
+ "range": 3,
+ "won": "_Route20Swimmer8EndBattleText"
+ },
+ "10": {
+ "after": "_Route20Swimmer9AfterBattleText",
+ "battle": "_Route20Swimmer9BattleText",
+ "event": "EVENT_BEAT_ROUTE_20_TRAINER_9",
+ "range": 4,
+ "won": "_Route20Swimmer9EndBattleText"
+ }
+ },
+ "Route21": {
+ "1": {
+ "after": "_Route21Fisher1AfterBattleText",
+ "battle": "_Route21Fisher1BattleText",
+ "event": "EVENT_BEAT_ROUTE_21_TRAINER_0",
+ "range": 0,
+ "won": "_Route21Fisher1EndBattleText"
+ },
+ "2": {
+ "after": "_Route21Fisher2AfterBattleText",
+ "battle": "_Route21Fisher2BattleText",
+ "event": "EVENT_BEAT_ROUTE_21_TRAINER_1",
+ "range": 0,
+ "won": "_Route21Fisher2EndBattleText"
+ },
+ "3": {
+ "after": "_Route21Swimmer1AfterBattleText",
+ "battle": "_Route21Swimmer1BattleText",
+ "event": "EVENT_BEAT_ROUTE_21_TRAINER_2",
+ "range": 4,
+ "won": "_Route21Swimmer1EndBattleText"
+ },
+ "4": {
+ "after": "_Route21Swimmer2AfterBattleText",
+ "battle": "_Route21Swimmer2BattleText",
+ "event": "EVENT_BEAT_ROUTE_21_TRAINER_3",
+ "range": 4,
+ "won": "_Route21Swimmer2EndBattleText"
+ },
+ "5": {
+ "after": "_Route21Swimmer3AfterBattleText",
+ "battle": "_Route21Swimmer3BattleText",
+ "event": "EVENT_BEAT_ROUTE_21_TRAINER_4",
+ "range": 4,
+ "won": "_Route21Swimmer3EndBattleText"
+ },
+ "6": {
+ "after": "_Route21Swimmer4AfterBattleText",
+ "battle": "_Route21Swimmer4BattleText",
+ "event": "EVENT_BEAT_ROUTE_21_TRAINER_5",
+ "range": 4,
+ "won": "_Route21Swimmer4EndBattleText"
+ },
+ "7": {
+ "after": "_Route21Swimmer5AfterBattleText",
+ "battle": "_Route21Swimmer5BattleText",
+ "event": "EVENT_BEAT_ROUTE_21_TRAINER_6",
+ "range": 3,
+ "won": "_Route21Swimmer5EndBattleText"
+ },
+ "8": {
+ "after": "_Route21Fisher3AfterBattleText",
+ "battle": "_Route21Fisher3BattleText",
+ "event": "EVENT_BEAT_ROUTE_21_TRAINER_7",
+ "range": 0,
+ "won": "_Route21Fisher3EndBattleText"
+ },
+ "9": {
+ "after": "_Route21Fisher4AfterBattleText",
+ "battle": "_Route21Fisher4BattleText",
+ "event": "EVENT_BEAT_ROUTE_21_TRAINER_8",
+ "range": 0,
+ "won": "_Route21Fisher4EndBattleText"
+ }
+ },
+ "Route24": {
+ "2": {
+ "after": "_Route24CooltrainerM2AfterBattleText",
+ "battle": "_Route24CooltrainerM2BattleText",
+ "event": "EVENT_BEAT_ROUTE_24_TRAINER_0",
+ "range": 4,
+ "won": "_Route24CooltrainerM2EndBattleText"
+ },
+ "3": {
+ "after": "_Route24CooltrainerM3AfterBattleText",
+ "battle": "_Route24CooltrainerM3BattleText",
+ "event": "EVENT_BEAT_ROUTE_24_TRAINER_1",
+ "range": 1,
+ "won": "_Route24CooltrainerM3EndBattleText"
+ },
+ "4": {
+ "after": "_Route24CooltrainerF1AfterBattleText",
+ "battle": "_Route24CooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROUTE_24_TRAINER_2",
+ "range": 1,
+ "won": "_Route24CooltrainerF1EndBattleText"
+ },
+ "5": {
+ "after": "_Route24Youngster1AfterBattleText",
+ "battle": "_Route24Youngster1BattleText",
+ "event": "EVENT_BEAT_ROUTE_24_TRAINER_3",
+ "range": 1,
+ "won": "_Route24Youngster1EndBattleText"
+ },
+ "6": {
+ "after": "_Route24CooltrainerF2AfterBattleText",
+ "battle": "_Route24CooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROUTE_24_TRAINER_4",
+ "range": 1,
+ "won": "_Route24CooltrainerF2EndBattleText"
+ },
+ "7": {
+ "after": "_Route24Youngster2AfterBattleText",
+ "battle": "_Route24Youngster2BattleText",
+ "event": "EVENT_BEAT_ROUTE_24_TRAINER_5",
+ "range": 1,
+ "won": "_Route24Youngster2EndBattleText"
+ }
+ },
+ "Route25": {
+ "1": {
+ "after": "_Route25Youngster1AfterBattleText",
+ "battle": "_Route25Youngster1BattleText",
+ "event": "EVENT_BEAT_ROUTE_25_TRAINER_0",
+ "range": 2,
+ "won": "_Route25Youngster1EndBattleText"
+ },
+ "2": {
+ "after": "_Route25Youngster2AfterBattleText",
+ "battle": "_Route25Youngster2BattleText",
+ "event": "EVENT_BEAT_ROUTE_25_TRAINER_1",
+ "range": 3,
+ "won": "_Route25Youngster2EndBattleText"
+ },
+ "3": {
+ "after": "_Route25CooltrainerMAfterBattleText",
+ "battle": "_Route25CooltrainerMBattleText",
+ "event": "EVENT_BEAT_ROUTE_25_TRAINER_2",
+ "range": 3,
+ "won": "_Route25CooltrainerMEndBattleText"
+ },
+ "4": {
+ "after": "_Route25CooltrainerF1AfterBattleText",
+ "battle": "_Route25CooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROUTE_25_TRAINER_3",
+ "range": 2,
+ "won": "_Route25CooltrainerF1EndBattleText"
+ },
+ "5": {
+ "after": "_Route25Youngster3AfterBattleText",
+ "battle": "_Route25Youngster3BattleText",
+ "event": "EVENT_BEAT_ROUTE_25_TRAINER_4",
+ "range": 4,
+ "won": "_Route25Youngster3EndBattleText"
+ },
+ "6": {
+ "after": "_Route25CooltrainerF2AfterBattleText",
+ "battle": "_Route25CooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROUTE_25_TRAINER_5",
+ "range": 4,
+ "won": "_Route25CooltrainerF2EndBattleText"
+ },
+ "7": {
+ "after": "_Route25Hiker1AfterBattleText",
+ "battle": "_Route25Hiker1BattleText",
+ "event": "EVENT_BEAT_ROUTE_25_TRAINER_6",
+ "range": 3,
+ "won": "_Route25Hiker1EndBattleText"
+ },
+ "8": {
+ "after": "_Route25Hiker2AfterBattleText",
+ "battle": "_Route25Hiker2BattleText",
+ "event": "EVENT_BEAT_ROUTE_25_TRAINER_7",
+ "range": 2,
+ "won": "_Route25Hiker2EndBattleText"
+ },
+ "9": {
+ "after": "_Route25Hiker3AfterBattleText",
+ "battle": "_Route25Hiker3BattleText",
+ "event": "EVENT_BEAT_ROUTE_25_TRAINER_8",
+ "range": 2,
+ "won": "_Route25Hiker3EndBattleText"
+ }
+ },
+ "Route3": {
+ "2": {
+ "after": "_Route3Youngster1AfterBattleText",
+ "battle": "_Route3Youngster1BattleText",
+ "event": "EVENT_BEAT_ROUTE_3_TRAINER_0",
+ "range": 2,
+ "won": "_Route3Youngster1EndBattleText"
+ },
+ "3": {
+ "after": "_Route3Youngster2AfterBattleText",
+ "battle": "_Route3Youngster2BattleText",
+ "event": "EVENT_BEAT_ROUTE_3_TRAINER_1",
+ "range": 3,
+ "won": "_Route3Youngster2EndBattleText"
+ },
+ "4": {
+ "after": "_Route3CooltrainerF1AfterBattleText",
+ "battle": "_Route3CooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROUTE_3_TRAINER_2",
+ "range": 2,
+ "won": "_Route3CooltrainerF1EndBattleText"
+ },
+ "5": {
+ "after": "_Route3Youngster3AfterBattleText",
+ "battle": "_Route3Youngster3BattleText",
+ "event": "EVENT_BEAT_ROUTE_3_TRAINER_3",
+ "range": 1,
+ "won": "_Route3Youngster3EndBattleText"
+ },
+ "6": {
+ "after": "_Route3CooltrainerF2AfterBattleText",
+ "battle": "_Route3CooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROUTE_3_TRAINER_4",
+ "range": 4,
+ "won": "_Route3CooltrainerF2EndBattleText"
+ },
+ "7": {
+ "after": "_Route3Youngster4AfterBattleText",
+ "battle": "_Route3Youngster4BattleText",
+ "event": "EVENT_BEAT_ROUTE_3_TRAINER_5",
+ "range": 3,
+ "won": "_Route3Youngster4EndBattleText"
+ },
+ "8": {
+ "after": "_Route3Youngster5AfterBattleText",
+ "battle": "_Route3Youngster5BattleText",
+ "event": "EVENT_BEAT_ROUTE_3_TRAINER_6",
+ "range": 3,
+ "won": "_Route3Youngster5EndBattleText"
+ },
+ "9": {
+ "after": "_Route3CooltrainerF3AfterBattleText",
+ "battle": "_Route3CooltrainerF3BattleText",
+ "event": "EVENT_BEAT_ROUTE_3_TRAINER_7",
+ "range": 2,
+ "won": "_Route3CooltrainerF3EndBattleText"
+ }
+ },
+ "Route4": {
+ "2": {
+ "after": "_Route4CooltrainerF2AfterBattleText",
+ "battle": "_Route4CooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROUTE_4_TRAINER_0",
+ "range": 3,
+ "won": "_Route4CooltrainerF2EndBattleText"
+ }
+ },
+ "Route6": {
+ "1": {
+ "after": "_Route6CooltrainerM1AfterBattleText",
+ "battle": "_Route6CooltrainerM1BattleText",
+ "event": "EVENT_BEAT_ROUTE_6_TRAINER_0",
+ "range": 0,
+ "won": "_Route6CooltrainerM1EndBattleText"
+ },
+ "2": {
+ "after": "_Route6CooltrainerF1AfterBattleText",
+ "battle": "_Route6CooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROUTE_6_TRAINER_1",
+ "range": 0,
+ "won": "_Route6CooltrainerF1EndBattleText"
+ },
+ "3": {
+ "after": "_Route6Youngster1AfterBattleText",
+ "battle": "_Route6Youngster1BattleText",
+ "event": "EVENT_BEAT_ROUTE_6_TRAINER_2",
+ "range": 4,
+ "won": "_Route6Youngster1EndBattleText"
+ },
+ "4": {
+ "after": "_Route6CooltrainerM2AfterBattleText",
+ "battle": "_Route6CooltrainerM2BattleText",
+ "event": "EVENT_BEAT_ROUTE_6_TRAINER_3",
+ "range": 3,
+ "won": "_Route6CooltrainerM2EndBattleText"
+ },
+ "5": {
+ "after": "_Route6CooltrainerF2AfterBattleText",
+ "battle": "_Route6CooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROUTE_6_TRAINER_4",
+ "range": 3,
+ "won": "_Route6CooltrainerF2EndBattleText"
+ },
+ "6": {
+ "after": "_Route6Youngster2AfterBattleText",
+ "battle": "_Route6Youngster2BattleText",
+ "event": "EVENT_BEAT_ROUTE_6_TRAINER_5",
+ "range": 3,
+ "won": "_Route6Youngster2EndBattleText"
+ }
+ },
+ "Route8": {
+ "1": {
+ "after": "_Route8SuperNerd1AfterBattleText",
+ "battle": "_Route8SuperNerd1BattleText",
+ "event": "EVENT_BEAT_ROUTE_8_TRAINER_0",
+ "range": 4,
+ "won": "_Route8SuperNerd1EndBattleText"
+ },
+ "2": {
+ "after": "_Route8Gambler1AfterBattleText",
+ "battle": "_Route8Gambler1BattleText",
+ "event": "EVENT_BEAT_ROUTE_8_TRAINER_1",
+ "range": 4,
+ "won": "_Route8Gambler1EndBattleText"
+ },
+ "3": {
+ "after": "_Route8SuperNerd2AfterBattleText",
+ "battle": "_Route8SuperNerd2BattleText",
+ "event": "EVENT_BEAT_ROUTE_8_TRAINER_2",
+ "range": 4,
+ "won": "_Route8SuperNerd2EndBattleText"
+ },
+ "4": {
+ "after": "_Route8CooltrainerF1AfterBattleText",
+ "battle": "_Route8CooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROUTE_8_TRAINER_3",
+ "range": 2,
+ "won": "_Route8CooltrainerF1EndBattleText"
+ },
+ "5": {
+ "after": "_Route8SuperNerd3AfterBattleText",
+ "battle": "_Route8SuperNerd3BattleText",
+ "event": "EVENT_BEAT_ROUTE_8_TRAINER_4",
+ "range": 3,
+ "won": "_Route8SuperNerd3EndBattleText"
+ },
+ "6": {
+ "after": "_Route8CooltrainerF2AfterBattleText",
+ "battle": "_Route8CooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROUTE_8_TRAINER_5",
+ "range": 3,
+ "won": "_Route8CooltrainerF2EndBattleText"
+ },
+ "7": {
+ "after": "_Route8CooltrainerF3AfterBattleText",
+ "battle": "_Route8CooltrainerF3BattleText",
+ "event": "EVENT_BEAT_ROUTE_8_TRAINER_6",
+ "range": 2,
+ "won": "_Route8CooltrainerF3EndBattleText"
+ },
+ "8": {
+ "after": "_Route8Gambler2AfterBattleText",
+ "battle": "_Route8Gambler2BattleText",
+ "event": "EVENT_BEAT_ROUTE_8_TRAINER_7",
+ "range": 2,
+ "won": "_Route8Gambler2EndBattleText"
+ },
+ "9": {
+ "after": "_Route8CooltrainerF4AfterBattleText",
+ "battle": "_Route8CooltrainerF4BattleText",
+ "event": "EVENT_BEAT_ROUTE_8_TRAINER_8",
+ "range": 4,
+ "won": "_Route8CooltrainerF4EndBattleText"
+ }
+ },
+ "Route9": {
+ "1": {
+ "after": "_Route9CooltrainerF1AfterBattleText",
+ "battle": "_Route9CooltrainerF1BattleText",
+ "event": "EVENT_BEAT_ROUTE_9_TRAINER_0",
+ "range": 3,
+ "won": "_Route9CooltrainerF1EndBattleText"
+ },
+ "2": {
+ "after": "_Route9AJAfterBattleText",
+ "battle": "_Route9AJBattleText",
+ "event": "EVENT_BEAT_ROUTE_9_TRAINER_1",
+ "range": 2,
+ "won": "_Route9AJEndBattleText"
+ },
+ "3": {
+ "after": "_Route9CooltrainerM2AfterBattleText",
+ "battle": "_Route9CooltrainerM2BattleText",
+ "event": "EVENT_BEAT_ROUTE_9_TRAINER_2",
+ "range": 4,
+ "won": "_Route9CooltrainerM2EndBattleText"
+ },
+ "4": {
+ "after": "_Route9CooltrainerF2AfterBattleText",
+ "battle": "_Route9CooltrainerF2BattleText",
+ "event": "EVENT_BEAT_ROUTE_9_TRAINER_3",
+ "range": 2,
+ "won": "_Route9CooltrainerF2EndBattleText"
+ },
+ "5": {
+ "after": "_Route9Hiker1AfterBattleText",
+ "battle": "_Route9Hiker1BattleText",
+ "event": "EVENT_BEAT_ROUTE_9_TRAINER_4",
+ "range": 2,
+ "won": "_Route9Hiker1EndBattleText"
+ },
+ "6": {
+ "after": "_Route9Hiker2AfterBattleText",
+ "battle": "_Route9Hiker2BattleText",
+ "event": "EVENT_BEAT_ROUTE_9_TRAINER_5",
+ "range": 3,
+ "won": "_Route9Hiker2EndBattleText"
+ },
+ "7": {
+ "after": "_Route9Youngster1AfterBattleText",
+ "battle": "_Route9Youngster1BattleText",
+ "event": "EVENT_BEAT_ROUTE_9_TRAINER_6",
+ "range": 4,
+ "won": "_Route9Youngster1EndBattleText"
+ },
+ "8": {
+ "after": "_Route9Hiker3AfterBattleText",
+ "battle": "_Route9Hiker3BattleText",
+ "event": "EVENT_BEAT_ROUTE_9_TRAINER_7",
+ "range": 2,
+ "won": "_Route9Hiker3EndBattleText"
+ },
+ "9": {
+ "after": "_Route9Youngster2AfterBattleText",
+ "battle": "_Route9Youngster2BattleText",
+ "event": "EVENT_BEAT_ROUTE_9_TRAINER_8",
+ "range": 2,
+ "won": "_Route9Youngster2EndBattleText"
+ }
+ },
+ "SSAnne1FRooms": {
+ "1": {
+ "after": "_SSAnne1FRoomsGentleman1AfterBattleText",
+ "battle": "_SSAnne1FRoomsGentleman1BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_8_TRAINER_0",
+ "range": 2,
+ "won": "_SSAnne1FRoomsGentleman1EndBattleText"
+ },
+ "2": {
+ "after": "_SSAnne1FRoomsGentleman2AfterBattleText",
+ "battle": "_SSAnne1FRoomsGentleman2BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_8_TRAINER_1",
+ "range": 3,
+ "won": "_SSAnne1FRoomsGentleman2EndBattleText"
+ },
+ "3": {
+ "after": "_SSAnne1FRoomsYoungsterAfterBattleText",
+ "battle": "_SSAnne1FRoomsYoungsterBattleText",
+ "event": "EVENT_BEAT_SS_ANNE_8_TRAINER_2",
+ "range": 2,
+ "won": "_SSAnne1FRoomsYoungsterEndBattleText"
+ },
+ "4": {
+ "after": "_SSAnne1FRoomsCooltrainerFAfterBattleText",
+ "battle": "_SSAnne1FRoomsCooltrainerFBattleText",
+ "event": "EVENT_BEAT_SS_ANNE_8_TRAINER_3",
+ "range": 2,
+ "won": "_SSAnne1FRoomsCooltrainerFEndBattleText"
+ }
+ },
+ "SSAnne2FRooms": {
+ "1": {
+ "after": "_SSAnne2FRoomsGentleman1AfterBattleText",
+ "battle": "_SSAnne2FRoomsGentleman1BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_9_TRAINER_0",
+ "range": 2,
+ "won": "_SSAnne2FRoomsGentleman1EndBattleText"
+ },
+ "2": {
+ "after": "_SSAnne2FRoomsFisherAfterBattleText",
+ "battle": "_SSAnne2FRoomsFisherBattleText",
+ "event": "EVENT_BEAT_SS_ANNE_9_TRAINER_1",
+ "range": 3,
+ "won": "_SSAnne2FRoomsFisherEndBattleText"
+ },
+ "3": {
+ "after": "_SSAnne2FRoomsGentleman2AfterBattleText",
+ "battle": "_SSAnne2FRoomsGentleman2BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_9_TRAINER_2",
+ "range": 3,
+ "won": "_SSAnne2FRoomsGentleman2EndBattleText"
+ },
+ "4": {
+ "after": "_SSAnne2FRoomsCooltrainerFAfterBattleText",
+ "battle": "_SSAnne2FRoomsCooltrainerFBattleText",
+ "event": "EVENT_BEAT_SS_ANNE_9_TRAINER_3",
+ "range": 2,
+ "won": "_SSAnne2FRoomsCooltrainerFEndBattleText"
+ }
+ },
+ "SSAnneB1FRooms": {
+ "1": {
+ "after": "_SSAnneB1FRoomsSailor1AfterBattleText",
+ "battle": "_SSAnneB1FRoomsSailor1BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_10_TRAINER_0",
+ "range": 2,
+ "won": "_SSAnneB1FRoomsSailor1EndBattleText"
+ },
+ "2": {
+ "after": "_SSAnneB1FRoomsSailor2AfterBattleText",
+ "battle": "_SSAnneB1FRoomsSailor2BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_10_TRAINER_1",
+ "range": 3,
+ "won": "_SSAnneB1FRoomsSailor2EndBattleText"
+ },
+ "3": {
+ "after": "_SSAnneB1FRoomsSailor3AfterBattleText",
+ "battle": "_SSAnneB1FRoomsSailor3BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_10_TRAINER_2",
+ "range": 2,
+ "won": "_SSAnneB1FRoomsSailor3EndBattleText"
+ },
+ "4": {
+ "after": "_SSAnneB1FRoomsSailor4AfterBattleText",
+ "battle": "_SSAnneB1FRoomsSailor4BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_10_TRAINER_3",
+ "range": 2,
+ "won": "_SSAnneB1FRoomsSailor4EndBattleText"
+ },
+ "5": {
+ "after": "_SSAnneB1FRoomsSailor5AfterBattleText",
+ "battle": "_SSAnneB1FRoomsSailor5BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_10_TRAINER_4",
+ "range": 2,
+ "won": "_SSAnneB1FRoomsSailor5EndBattleText"
+ },
+ "6": {
+ "after": "_SSAnneB1FRoomsFisherAfterBattleText",
+ "battle": "_SSAnneB1FRoomsFisherBattleText",
+ "event": "EVENT_BEAT_SS_ANNE_10_TRAINER_5",
+ "range": 3,
+ "won": "_SSAnneB1FRoomsFisherEndBattleText"
+ }
+ },
+ "SSAnneBow": {
+ "4": {
+ "after": "_SSAnneBowSailor2AfterBattleText",
+ "battle": "_SSAnneBowSailor2BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_5_TRAINER_0",
+ "range": 3,
+ "won": "_SSAnneBowSailor2EndBattleText"
+ },
+ "5": {
+ "after": "_SSAnneBowSailor3AfterBattleText",
+ "battle": "_SSAnneBowSailor3BattleText",
+ "event": "EVENT_BEAT_SS_ANNE_5_TRAINER_1",
+ "range": 3,
+ "won": "_SSAnneBowSailor3EndBattleText"
+ }
+ },
+ "SaffronGym": {
+ "2": {
+ "after": "_SaffronGymChanneler1AfterBattleText",
+ "battle": "_SaffronGymChanneler1BattleText",
+ "event": "EVENT_BEAT_SAFFRON_GYM_TRAINER_0",
+ "range": 3,
+ "won": "_SaffronGymChanneler1EndBattleText"
+ },
+ "3": {
+ "after": "_SaffronGymYoungster1AfterBattleText",
+ "battle": "_SaffronGymYoungster1BattleText",
+ "event": "EVENT_BEAT_SAFFRON_GYM_TRAINER_1",
+ "range": 3,
+ "won": "_SaffronGymYoungster1EndBattleText"
+ },
+ "4": {
+ "after": "_SaffronGymChanneler2AfterBattleText",
+ "battle": "_SaffronGymChanneler2BattleText",
+ "event": "EVENT_BEAT_SAFFRON_GYM_TRAINER_2",
+ "range": 3,
+ "won": "_SaffronGymChanneler2EndBattleText"
+ },
+ "5": {
+ "after": "_SaffronGymYoungster2AfterBattleText",
+ "battle": "_SaffronGymYoungster2BattleText",
+ "event": "EVENT_BEAT_SAFFRON_GYM_TRAINER_3",
+ "range": 3,
+ "won": "_SaffronGymYoungster2EndBattleText"
+ },
+ "6": {
+ "after": "_SaffronGymChanneler3AfterBattleText",
+ "battle": "_SaffronGymChanneler3BattleText",
+ "event": "EVENT_BEAT_SAFFRON_GYM_TRAINER_4",
+ "range": 3,
+ "won": "_SaffronGymChanneler3EndBattleText"
+ },
+ "7": {
+ "after": "_SaffronGymYoungster3AfterBattleText",
+ "battle": "_SaffronGymYoungster3BattleText",
+ "event": "EVENT_BEAT_SAFFRON_GYM_TRAINER_5",
+ "range": 3,
+ "won": "_SaffronGymYoungster3EndBattleText"
+ },
+ "8": {
+ "after": "_SaffronGymYoungster4AfterBattleText",
+ "battle": "_SaffronGymYoungster4BattleText",
+ "event": "EVENT_BEAT_SAFFRON_GYM_TRAINER_6",
+ "range": 3,
+ "won": "_SaffronGymYoungster4EndBattleText"
+ }
+ },
+ "SeafoamIslandsB4F": {
+ "2": {
+ "after": "_SeafoamIslandsB4FArticunoBattleText",
+ "battle": "_SeafoamIslandsB4FArticunoBattleText",
+ "event": "EVENT_BEAT_ARTICUNO",
+ "range": 0,
+ "won": "_SeafoamIslandsB4FArticunoBattleText"
+ }
+ },
+ "SilphCo10F": {
+ "1": {
+ "after": "_SilphCo10FRocketAfterBattleText",
+ "battle": "_SilphCo10FRocketBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_10F_TRAINER_0",
+ "range": 3,
+ "won": "_SilphCo10FRocketEndBattleText"
+ },
+ "2": {
+ "after": "_SilphCo10FScientistAfterBattleText",
+ "battle": "_SilphCo10FScientistBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_10F_TRAINER_1",
+ "range": 4,
+ "won": "_SilphCo10FScientistEndBattleText"
+ }
+ },
+ "SilphCo11F": {
+ "5": {
+ "after": "_SilphCo11FRocket2AfterBattleText",
+ "battle": "_SilphCo11FRocket2BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_11F_TRAINER_0",
+ "range": 3,
+ "won": "_SilphCo11FRocket2EndBattleText"
+ }
+ },
+ "SilphCo2F": {
+ "2": {
+ "after": "_SilphCo2FScientist1AfterBattleText",
+ "battle": "_SilphCo2FScientist1BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_2F_TRAINER_0",
+ "range": 3,
+ "won": "_SilphCo2FScientist1EndBattleText"
+ },
+ "3": {
+ "after": "_SilphCo2FScientist2AfterBattleText",
+ "battle": "_SilphCo2FScientist2BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_2F_TRAINER_1",
+ "range": 4,
+ "won": "_SilphCo2FScientist2EndBattleText"
+ },
+ "4": {
+ "after": "_SilphCo2FRocket1AfterBattleText",
+ "battle": "_SilphCo2FRocket1BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_2F_TRAINER_2",
+ "range": 3,
+ "won": "_SilphCo2FRocket1EndBattleText"
+ },
+ "5": {
+ "after": "_SilphCo2FRocket2AfterBattleText",
+ "battle": "_SilphCo2FRocket2BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_2F_TRAINER_3",
+ "range": 3,
+ "won": "_SilphCo2FRocket2EndBattleText"
+ }
+ },
+ "SilphCo3F": {
+ "2": {
+ "after": "_SilphCo3FRocketAfterBattleText",
+ "battle": "_SilphCo3FRocketBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_3F_TRAINER_0",
+ "range": 2,
+ "won": "_SilphCo3FRocketEndBattleText"
+ },
+ "3": {
+ "after": "_SilphCo3FScientistAfterBattleText",
+ "battle": "_SilphCo3FScientistBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_3F_TRAINER_1",
+ "range": 3,
+ "won": "_SilphCo3FScientistEndBattleText"
+ }
+ },
+ "SilphCo4F": {
+ "2": {
+ "after": "_SilphCo4FRocket1AfterBattleText",
+ "battle": "_SilphCo4FRocket1BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_4F_TRAINER_0",
+ "range": 4,
+ "won": "_SilphCo4FRocket1EndBattleText"
+ },
+ "3": {
+ "after": "_SilphCo4FScientistAfterBattleText",
+ "battle": "_SilphCo4FScientistBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_4F_TRAINER_1",
+ "range": 3,
+ "won": "_SilphCo4FScientistEndBattleText"
+ },
+ "4": {
+ "after": "_SilphCo4FRocket2AfterBattleText",
+ "battle": "_SilphCo4FRocket2BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_4F_TRAINER_2",
+ "range": 4,
+ "won": "_SilphCo4FRocket2EndBattleText"
+ }
+ },
+ "SilphCo5F": {
+ "2": {
+ "after": "_SilphCo5FRocket1AfterBattleText",
+ "battle": "_SilphCo5FRocket1BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_5F_TRAINER_0",
+ "range": 1,
+ "won": "_SilphCo5FRocket1EndBattleText"
+ },
+ "3": {
+ "after": "_SilphCo5FScientistAfterBattleText",
+ "battle": "_SilphCo5FScientistBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_5F_TRAINER_1",
+ "range": 2,
+ "won": "_SilphCo5FScientistEndBattleText"
+ },
+ "4": {
+ "after": "_SilphCo5FRockerAfterBattleText",
+ "battle": "_SilphCo5FRockerBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_5F_TRAINER_2",
+ "range": 4,
+ "won": "_SilphCo5FRockerEndBattleText"
+ },
+ "5": {
+ "after": "_SilphCo5FRocket2AfterBattleText",
+ "battle": "_SilphCo5FRocket2BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_5F_TRAINER_3",
+ "range": 3,
+ "won": "_SilphCo5FRocket2EndBattleText"
+ }
+ },
+ "SilphCo6F": {
+ "6": {
+ "after": "_SilphCo6FRocket1AfterBattleText",
+ "battle": "_SilphCo6FRocket1BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_6F_TRAINER_0",
+ "range": 2,
+ "won": "_SilphCo6FRocket1EndBattleText"
+ },
+ "7": {
+ "after": "_SilphCo6FScientistAfterBattleText",
+ "battle": "_SilphCo6FScientistBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_6F_TRAINER_1",
+ "range": 3,
+ "won": "_SilphCo6FScientistEndBattleText"
+ },
+ "8": {
+ "after": "_SilphCo6FRocket2AfterBattleText",
+ "battle": "_SilphCo6FRocket2BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_6F_TRAINER_2",
+ "range": 2,
+ "won": "_SilphCo6FRocket2EndBattleText"
+ }
+ },
+ "SilphCo7F": {
+ "5": {
+ "after": "_SilphCo7FRocket1AfterBattleText",
+ "battle": "_SilphCo7FRocket1BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_7F_TRAINER_0",
+ "range": 2,
+ "won": "_SilphCo7FRocket1EndBattleText"
+ },
+ "6": {
+ "after": "_SilphCo7FScientistAfterBattleText",
+ "battle": "_SilphCo7FScientistBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_7F_TRAINER_1",
+ "range": 3,
+ "won": "_SilphCo7FScientistEndBattleText"
+ },
+ "7": {
+ "after": "_SilphCo7FRocket2AfterBattleText",
+ "battle": "_SilphCo7FRocket2BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_7F_TRAINER_2",
+ "range": 3,
+ "won": "_SilphCo7FRocket2EndBattleText"
+ },
+ "8": {
+ "after": "_SilphCo7FRocket3AfterBattleText",
+ "battle": "_SilphCo7FRocket3BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_7F_TRAINER_3",
+ "range": 4,
+ "won": "_SilphCo7FRocket3EndBattleText"
+ }
+ },
+ "SilphCo8F": {
+ "2": {
+ "after": "_SilphCo8FRocket1AfterBattleText",
+ "battle": "_SilphCo8FRocket1BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_8F_TRAINER_0",
+ "range": 4,
+ "won": "_SilphCo8FRocket1EndBattleText"
+ },
+ "3": {
+ "after": "_SilphCo8FScientistAfterBattleText",
+ "battle": "_SilphCo8FScientistBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_8F_TRAINER_1",
+ "range": 4,
+ "won": "_SilphCo8FScientistEndBattleText"
+ },
+ "4": {
+ "after": "_SilphCo8FRocket2AfterBattleText",
+ "battle": "_SilphCo8FRocket2BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_8F_TRAINER_2",
+ "range": 4,
+ "won": "_SilphCo8FRocket2EndBattleText"
+ }
+ },
+ "SilphCo9F": {
+ "2": {
+ "after": "_SilphCo9FRocket1AfterBattleText",
+ "battle": "_SilphCo9FRocket1BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_9F_TRAINER_0",
+ "range": 4,
+ "won": "_SilphCo9FRocket1EndBattleText"
+ },
+ "3": {
+ "after": "_SilphCo9FScientistAfterBattleText",
+ "battle": "_SilphCo9FScientistBattleText",
+ "event": "EVENT_BEAT_SILPH_CO_9F_TRAINER_1",
+ "range": 2,
+ "won": "_SilphCo9FScientistEndBattleText"
+ },
+ "4": {
+ "after": "_SilphCo9FRocket2AfterBattleText",
+ "battle": "_SilphCo9FRocket2BattleText",
+ "event": "EVENT_BEAT_SILPH_CO_9F_TRAINER_2",
+ "range": 4,
+ "won": "_SilphCo9FRocket2EndBattleText"
+ }
+ },
+ "VermilionGym": {
+ "2": {
+ "after": "_VermilionGymGentlemanAfterBattleText",
+ "battle": "_VermilionGymGentlemanBattleText",
+ "event": "EVENT_BEAT_VERMILION_GYM_TRAINER_0",
+ "range": 3,
+ "won": "_VermilionGymGentlemanEndBattleText"
+ },
+ "3": {
+ "after": "_VermilionGymSuperNerdAfterBattleText",
+ "battle": "_VermilionGymSuperNerdBattleText",
+ "event": "EVENT_BEAT_VERMILION_GYM_TRAINER_1",
+ "range": 2,
+ "won": "_VermilionGymSuperNerdEndBattleText"
+ },
+ "4": {
+ "after": "_VermilionGymSailorAfterBattleText",
+ "battle": "_VermilionGymSailorBattleText",
+ "event": "EVENT_BEAT_VERMILION_GYM_TRAINER_2",
+ "range": 3,
+ "won": "_VermilionGymSailorEndBattleText"
+ }
+ },
+ "VictoryRoad1F": {
+ "1": {
+ "after": "_VictoryRoad1FCooltrainerFAfterBattleText",
+ "battle": "_VictoryRoad1FCooltrainerFBattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_1_TRAINER_0",
+ "range": 2,
+ "won": "_VictoryRoad1FCooltrainerFEndBattleText"
+ },
+ "2": {
+ "after": "_VictoryRoad1FCooltrainerMAfterBattleText",
+ "battle": "_VictoryRoad1FCooltrainerMBattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_1_TRAINER_1",
+ "range": 2,
+ "won": "_VictoryRoad1FCooltrainerMEndBattleText"
+ }
+ },
+ "VictoryRoad2F": {
+ "1": {
+ "after": "_VictoryRoad2FHikerAfterBattleText",
+ "battle": "_VictoryRoad2FHikerBattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_2_TRAINER_0",
+ "range": 4,
+ "won": "_VictoryRoad2FHikerEndBattleText"
+ },
+ "2": {
+ "after": "_VictoryRoad2FSuperNerd1AfterBattleText",
+ "battle": "_VictoryRoad2FSuperNerd1BattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_2_TRAINER_1",
+ "range": 3,
+ "won": "_VictoryRoad2FSuperNerd1EndBattleText"
+ },
+ "3": {
+ "after": "_VictoryRoad2FCooltrainerMAfterBattleText",
+ "battle": "_VictoryRoad2FCooltrainerMBattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_2_TRAINER_2",
+ "range": 3,
+ "won": "_VictoryRoad2FCooltrainerMEndBattleText"
+ },
+ "4": {
+ "after": "_VictoryRoad2FSuperNerd2AfterBattleText",
+ "battle": "_VictoryRoad2FSuperNerd2BattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_2_TRAINER_3",
+ "range": 1,
+ "won": "_VictoryRoad2FSuperNerd2EndBattleText"
+ },
+ "5": {
+ "after": "_VictoryRoad2FSuperNerd3AfterBattleText",
+ "battle": "_VictoryRoad2FSuperNerd3BattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_2_TRAINER_4",
+ "range": 3,
+ "won": "_VictoryRoad2FSuperNerd3EndBattleText"
+ },
+ "6": {
+ "after": "_VictoryRoad2FMoltresBattleText",
+ "battle": "_VictoryRoad2FMoltresBattleText",
+ "event": "EVENT_BEAT_MOLTRES",
+ "range": 0,
+ "won": "_VictoryRoad2FMoltresBattleText"
+ }
+ },
+ "VictoryRoad3F": {
+ "1": {
+ "after": "_VictoryRoad3FCooltrainerM1AfterBattleText",
+ "battle": "_VictoryRoad3FCooltrainerM1BattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_3_TRAINER_0",
+ "range": 1,
+ "won": "_VictoryRoad3FCooltrainerM1EndBattleText"
+ },
+ "2": {
+ "after": "_VictoryRoad3FCooltrainerF1AfterBattleText",
+ "battle": "_VictoryRoad3FCooltrainerF1BattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_3_TRAINER_1",
+ "range": 4,
+ "won": "_VictoryRoad3FCooltrainerF1EndBattleText"
+ },
+ "3": {
+ "after": "_VictoryRoad3FCooltrainerM2AfterBattleText",
+ "battle": "_VictoryRoad3FCooltrainerM2BattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_3_TRAINER_2",
+ "range": 4,
+ "won": "_VictoryRoad3FCooltrainerM2EndBattleText"
+ },
+ "4": {
+ "after": "_VictoryRoad3FCooltrainerF2AfterBattleText",
+ "battle": "_VictoryRoad3FCooltrainerF2BattleText",
+ "event": "EVENT_BEAT_VICTORY_ROAD_3_TRAINER_3",
+ "range": 4,
+ "won": "_VictoryRoad3FCooltrainerF2EndBattleText"
+ }
+ },
+ "ViridianForest": {
+ "2": {
+ "after": "_ViridianForestYoungster2AfterBattleText",
+ "battle": "_ViridianForestYoungster2BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_0",
+ "range": 4,
+ "won": "_ViridianForestYoungster2EndBattleText"
+ },
+ "3": {
+ "after": "_ViridianForestYoungster3AfterBattleText",
+ "battle": "_ViridianForestYoungster3BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_1",
+ "range": 4,
+ "won": "_ViridianForestYoungster3EndBattleText"
+ },
+ "4": {
+ "after": "_ViridianForestYoungster4AfterBattleText",
+ "battle": "_ViridianForestYoungster4BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_2",
+ "range": 1,
+ "won": "_ViridianForestYoungster4EndBattleText"
+ },
+ "5": {
+ "after": "_ViridianForestCooltrainerFAfterBattleText",
+ "battle": "_ViridianForestCooltrainerFBattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_3",
+ "range": 0,
+ "won": "_ViridianForestCooltrainerFEndBattleText"
+ },
+ "6": {
+ "after": "_ViridianForestYoungster5AfterBattleText",
+ "battle": "_ViridianForestYoungster5BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_FOREST_TRAINER_4",
+ "range": 4,
+ "won": "_ViridianForestYoungster5EndBattleText"
+ }
+ },
+ "ViridianGym": {
+ "2": {
+ "after": "_ViridianGymCooltrainerM1AfterBattleText",
+ "battle": "_ViridianGymCooltrainerM1BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_GYM_TRAINER_0",
+ "range": 4,
+ "won": "_ViridianGymCooltrainerM1EndBattleText"
+ },
+ "3": {
+ "after": "_ViridianGymHiker1AfterBattleText",
+ "battle": "_ViridianGymHiker1BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_GYM_TRAINER_1",
+ "range": 4,
+ "won": "_ViridianGymHiker1EndBattleText"
+ },
+ "4": {
+ "after": "_ViridianGymRocker1AfterBattleText",
+ "battle": "_ViridianGymRocker1BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_GYM_TRAINER_2",
+ "range": 4,
+ "won": "_ViridianGymRocker1EndBattleText"
+ },
+ "5": {
+ "after": "_ViridianGymHiker2AfterBattleText",
+ "battle": "_ViridianGymHiker2BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_GYM_TRAINER_3",
+ "range": 2,
+ "won": "_ViridianGymHiker2EndBattleText"
+ },
+ "6": {
+ "after": "_ViridianGymCooltrainerM2AfterBattleText",
+ "battle": "_ViridianGymCooltrainerM2BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_GYM_TRAINER_4",
+ "range": 3,
+ "won": "_ViridianGymCooltrainerM2EndBattleText"
+ },
+ "7": {
+ "after": "_ViridianGymHiker3AfterBattleText",
+ "battle": "_ViridianGymHiker3BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_GYM_TRAINER_5",
+ "range": 4,
+ "won": "_ViridianGymHiker3EndBattleText"
+ },
+ "8": {
+ "after": "_ViridianGymRocker2AfterBattleText",
+ "battle": "_ViridianGymRocker2BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_GYM_TRAINER_6",
+ "range": 3,
+ "won": "_ViridianGymRocker2EndBattleText"
+ },
+ "9": {
+ "after": "_ViridianGymCooltrainerM3AfterBattleText",
+ "battle": "_ViridianGymCooltrainerM3BattleText",
+ "event": "EVENT_BEAT_VIRIDIAN_GYM_TRAINER_7",
+ "range": 4,
+ "won": "_ViridianGymCooltrainerM3EndBattleText"
+ }
+ }
+ }
+ },
+ "tileAnimations": [
+ "TILEANIM_NONE",
+ "TILEANIM_WATER",
+ "TILEANIM_WATER_FLOWER"
+ ],
+ "tilesets": [
+ {
+ "blockCount": 128,
+ "id": "OVERWORLD",
+ "imageBase": "overworld",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Overworld"
+ },
+ {
+ "blockCount": 19,
+ "id": "REDS_HOUSE_1",
+ "imageBase": "reds_house",
+ "imageHeight": 40,
+ "imageWidth": 128,
+ "name": "RedsHouse1"
+ },
+ {
+ "blockCount": 40,
+ "id": "MART",
+ "imageBase": "pokecenter",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Mart"
+ },
+ {
+ "blockCount": 128,
+ "id": "FOREST",
+ "imageBase": "forest",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Forest"
+ },
+ {
+ "blockCount": 19,
+ "id": "REDS_HOUSE_2",
+ "imageBase": "reds_house",
+ "imageHeight": 40,
+ "imageWidth": 128,
+ "name": "RedsHouse2"
+ },
+ {
+ "blockCount": 116,
+ "id": "DOJO",
+ "imageBase": "gym",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Dojo"
+ },
+ {
+ "blockCount": 40,
+ "id": "POKECENTER",
+ "imageBase": "pokecenter",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Pokecenter"
+ },
+ {
+ "blockCount": 116,
+ "id": "GYM",
+ "imageBase": "gym",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Gym"
+ },
+ {
+ "blockCount": 35,
+ "id": "HOUSE",
+ "imageBase": "house",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "House"
+ },
+ {
+ "blockCount": 128,
+ "id": "FOREST_GATE",
+ "imageBase": "gate",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "ForestGate"
+ },
+ {
+ "blockCount": 128,
+ "id": "MUSEUM",
+ "imageBase": "gate",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Museum"
+ },
+ {
+ "blockCount": 17,
+ "id": "UNDERGROUND",
+ "imageBase": "underground",
+ "imageHeight": 16,
+ "imageWidth": 128,
+ "name": "Underground"
+ },
+ {
+ "blockCount": 128,
+ "id": "GATE",
+ "imageBase": "gate",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Gate"
+ },
+ {
+ "blockCount": 62,
+ "id": "SHIP",
+ "imageBase": "ship",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Ship"
+ },
+ {
+ "blockCount": 23,
+ "id": "SHIP_PORT",
+ "imageBase": "ship_port",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "ShipPort"
+ },
+ {
+ "blockCount": 110,
+ "id": "CEMETERY",
+ "imageBase": "cemetery",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Cemetery"
+ },
+ {
+ "blockCount": 58,
+ "id": "INTERIOR",
+ "imageBase": "interior",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Interior"
+ },
+ {
+ "blockCount": 128,
+ "id": "CAVERN",
+ "imageBase": "cavern",
+ "imageHeight": 40,
+ "imageWidth": 128,
+ "name": "Cavern"
+ },
+ {
+ "blockCount": 79,
+ "id": "LOBBY",
+ "imageBase": "lobby",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Lobby"
+ },
+ {
+ "blockCount": 72,
+ "id": "MANSION",
+ "imageBase": "mansion",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Mansion"
+ },
+ {
+ "blockCount": 58,
+ "id": "LAB",
+ "imageBase": "lab",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Lab"
+ },
+ {
+ "blockCount": 36,
+ "id": "CLUB",
+ "imageBase": "club",
+ "imageHeight": 40,
+ "imageWidth": 128,
+ "name": "Club"
+ },
+ {
+ "blockCount": 128,
+ "id": "FACILITY",
+ "imageBase": "facility",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "Facility"
+ },
+ {
+ "blockCount": 73,
+ "id": "PLATEAU",
+ "imageBase": "plateau",
+ "imageHeight": 40,
+ "imageWidth": 128,
+ "name": "Plateau"
+ },
+ {
+ "blockCount": 20,
+ "id": "BEACH_HOUSE",
+ "imageBase": "beach_house",
+ "imageHeight": 48,
+ "imageWidth": 128,
+ "name": "BeachHouse"
+ }
+ ],
+ "tmhmMoves": [
+ "MEGA_PUNCH",
+ "RAZOR_WIND",
+ "SWORDS_DANCE",
+ "WHIRLWIND",
+ "MEGA_KICK",
+ "TOXIC",
+ "HORN_DRILL",
+ "BODY_SLAM",
+ "TAKE_DOWN",
+ "DOUBLE_EDGE",
+ "BUBBLEBEAM",
+ "WATER_GUN",
+ "ICE_BEAM",
+ "BLIZZARD",
+ "HYPER_BEAM",
+ "PAY_DAY",
+ "SUBMISSION",
+ "COUNTER",
+ "SEISMIC_TOSS",
+ "RAGE",
+ "MEGA_DRAIN",
+ "SOLARBEAM",
+ "DRAGON_RAGE",
+ "THUNDERBOLT",
+ "THUNDER",
+ "EARTHQUAKE",
+ "FISSURE",
+ "DIG",
+ "PSYCHIC_M",
+ "TELEPORT",
+ "MIMIC",
+ "DOUBLE_TEAM",
+ "REFLECT",
+ "BIDE",
+ "METRONOME",
+ "SELFDESTRUCT",
+ "EGG_BOMB",
+ "FIRE_BLAST",
+ "SWIFT",
+ "SKULL_BASH",
+ "SOFTBOILED",
+ "DREAM_EATER",
+ "SKY_ATTACK",
+ "REST",
+ "THUNDER_WAVE",
+ "PSYWAVE",
+ "EXPLOSION",
+ "ROCK_SLIDE",
+ "TRI_ATTACK",
+ "SUBSTITUTE",
+ "CUT",
+ "FLY",
+ "SURF",
+ "STRENGTH",
+ "FLASH"
+ ],
+ "tms": [
+ "MEGA_PUNCH",
+ "RAZOR_WIND",
+ "SWORDS_DANCE",
+ "WHIRLWIND",
+ "MEGA_KICK",
+ "TOXIC",
+ "HORN_DRILL",
+ "BODY_SLAM",
+ "TAKE_DOWN",
+ "DOUBLE_EDGE",
+ "BUBBLEBEAM",
+ "WATER_GUN",
+ "ICE_BEAM",
+ "BLIZZARD",
+ "HYPER_BEAM",
+ "PAY_DAY",
+ "SUBMISSION",
+ "COUNTER",
+ "SEISMIC_TOSS",
+ "RAGE",
+ "MEGA_DRAIN",
+ "SOLARBEAM",
+ "DRAGON_RAGE",
+ "THUNDERBOLT",
+ "THUNDER",
+ "EARTHQUAKE",
+ "FISSURE",
+ "DIG",
+ "PSYCHIC_M",
+ "TELEPORT",
+ "MIMIC",
+ "DOUBLE_TEAM",
+ "REFLECT",
+ "BIDE",
+ "METRONOME",
+ "SELFDESTRUCT",
+ "EGG_BOMB",
+ "FIRE_BLAST",
+ "SWIFT",
+ "SKULL_BASH",
+ "SOFTBOILED",
+ "DREAM_EATER",
+ "SKY_ATTACK",
+ "REST",
+ "THUNDER_WAVE",
+ "PSYWAVE",
+ "EXPLOSION",
+ "ROCK_SLIDE",
+ "TRI_ATTACK",
+ "SUBSTITUTE"
+ ],
+ "trainerPartyOverrides": {
+ "OPP_CHIEF": [
+ {
+ "level": 41,
+ "species": "MACHOKE"
+ },
+ {
+ "level": 41,
+ "species": "GOLBAT"
+ },
+ {
+ "level": 43,
+ "species": "MAROWAK"
+ },
+ {
+ "level": 43,
+ "species": "WEEZING"
+ },
+ {
+ "level": 46,
+ "species": "PERSIAN"
+ }
+ ]
+ },
+ "trainerPics": [
+ {
+ "imageBase": "youngster",
+ "label": "YoungsterPic",
+ "path": "assets/generated/battle/trainers/youngster.png"
+ },
+ {
+ "imageBase": "bugcatcher",
+ "label": "BugCatcherPic",
+ "path": "assets/generated/battle/trainers/bugcatcher.png"
+ },
+ {
+ "imageBase": "lass",
+ "label": "LassPic",
+ "path": "assets/generated/battle/trainers/lass.png"
+ },
+ {
+ "imageBase": "sailor",
+ "label": "SailorPic",
+ "path": "assets/generated/battle/trainers/sailor.png"
+ },
+ {
+ "imageBase": "jr.trainerm",
+ "label": "JrTrainerMPic",
+ "path": "assets/generated/battle/trainers/jr.trainerm.png"
+ },
+ {
+ "imageBase": "jr.trainerf",
+ "label": "JrTrainerFPic",
+ "path": "assets/generated/battle/trainers/jr.trainerf.png"
+ },
+ {
+ "imageBase": "pokemaniac",
+ "label": "PokemaniacPic",
+ "path": "assets/generated/battle/trainers/pokemaniac.png"
+ },
+ {
+ "imageBase": "supernerd",
+ "label": "SuperNerdPic",
+ "path": "assets/generated/battle/trainers/supernerd.png"
+ },
+ {
+ "imageBase": "hiker",
+ "label": "HikerPic",
+ "path": "assets/generated/battle/trainers/hiker.png"
+ },
+ {
+ "imageBase": "biker",
+ "label": "BikerPic",
+ "path": "assets/generated/battle/trainers/biker.png"
+ },
+ {
+ "imageBase": "burglar",
+ "label": "BurglarPic",
+ "path": "assets/generated/battle/trainers/burglar.png"
+ },
+ {
+ "imageBase": "engineer",
+ "label": "EngineerPic",
+ "path": "assets/generated/battle/trainers/engineer.png"
+ },
+ false,
+ {
+ "imageBase": "fisher",
+ "label": "FisherPic",
+ "path": "assets/generated/battle/trainers/fisher.png"
+ },
+ {
+ "imageBase": "swimmer",
+ "label": "SwimmerPic",
+ "path": "assets/generated/battle/trainers/swimmer.png"
+ },
+ {
+ "imageBase": "cueball",
+ "label": "CueBallPic",
+ "path": "assets/generated/battle/trainers/cueball.png"
+ },
+ {
+ "imageBase": "gambler",
+ "label": "GamblerPic",
+ "path": "assets/generated/battle/trainers/gambler.png"
+ },
+ {
+ "imageBase": "beauty",
+ "label": "BeautyPic",
+ "path": "assets/generated/battle/trainers/beauty.png"
+ },
+ {
+ "imageBase": "psychic",
+ "label": "PsychicPic",
+ "path": "assets/generated/battle/trainers/psychic.png"
+ },
+ {
+ "imageBase": "rocker",
+ "label": "RockerPic",
+ "path": "assets/generated/battle/trainers/rocker.png"
+ },
+ {
+ "imageBase": "juggler",
+ "label": "JugglerPic",
+ "path": "assets/generated/battle/trainers/juggler.png"
+ },
+ {
+ "imageBase": "tamer",
+ "label": "TamerPic",
+ "path": "assets/generated/battle/trainers/tamer.png"
+ },
+ {
+ "imageBase": "birdkeeper",
+ "label": "BirdKeeperPic",
+ "path": "assets/generated/battle/trainers/birdkeeper.png"
+ },
+ {
+ "imageBase": "blackbelt",
+ "label": "BlackbeltPic",
+ "path": "assets/generated/battle/trainers/blackbelt.png"
+ },
+ {
+ "imageBase": "rival1",
+ "label": "Rival1Pic",
+ "path": "assets/generated/battle/trainers/rival1.png"
+ },
+ {
+ "imageBase": "prof.oak",
+ "label": "ProfOakPic",
+ "path": "assets/generated/battle/trainers/prof.oak.png"
+ },
+ false,
+ {
+ "imageBase": "scientist",
+ "label": "ScientistPic",
+ "path": "assets/generated/battle/trainers/scientist.png"
+ },
+ {
+ "imageBase": "giovanni",
+ "label": "GiovanniPic",
+ "path": "assets/generated/battle/trainers/giovanni.png"
+ },
+ {
+ "imageBase": "rocket",
+ "label": "RocketPic",
+ "path": "assets/generated/battle/trainers/rocket.png"
+ },
+ {
+ "imageBase": "cooltrainerm",
+ "label": "CooltrainerMPic",
+ "path": "assets/generated/battle/trainers/cooltrainerm.png"
+ },
+ {
+ "imageBase": "cooltrainerf",
+ "label": "CooltrainerFPic",
+ "path": "assets/generated/battle/trainers/cooltrainerf.png"
+ },
+ {
+ "imageBase": "bruno",
+ "label": "BrunoPic",
+ "path": "assets/generated/battle/trainers/bruno.png"
+ },
+ {
+ "imageBase": "brock",
+ "label": "BrockPic",
+ "path": "assets/generated/battle/trainers/brock.png"
+ },
+ {
+ "imageBase": "misty",
+ "label": "MistyPic",
+ "path": "assets/generated/battle/trainers/misty.png"
+ },
+ {
+ "imageBase": "lt.surge",
+ "label": "LtSurgePic",
+ "path": "assets/generated/battle/trainers/lt.surge.png"
+ },
+ {
+ "imageBase": "erika",
+ "label": "ErikaPic",
+ "path": "assets/generated/battle/trainers/erika.png"
+ },
+ {
+ "imageBase": "koga",
+ "label": "KogaPic",
+ "path": "assets/generated/battle/trainers/koga.png"
+ },
+ {
+ "imageBase": "blaine",
+ "label": "BlainePic",
+ "path": "assets/generated/battle/trainers/blaine.png"
+ },
+ {
+ "imageBase": "sabrina",
+ "label": "SabrinaPic",
+ "path": "assets/generated/battle/trainers/sabrina.png"
+ },
+ {
+ "imageBase": "gentleman",
+ "label": "GentlemanPic",
+ "path": "assets/generated/battle/trainers/gentleman.png"
+ },
+ {
+ "imageBase": "rival2",
+ "label": "Rival2Pic",
+ "path": "assets/generated/battle/trainers/rival2.png"
+ },
+ {
+ "imageBase": "rival3",
+ "label": "Rival3Pic",
+ "path": "assets/generated/battle/trainers/rival3.png"
+ },
+ {
+ "imageBase": "lorelei",
+ "label": "LoreleiPic",
+ "path": "assets/generated/battle/trainers/lorelei.png"
+ },
+ {
+ "imageBase": "channeler",
+ "label": "ChannelerPic",
+ "path": "assets/generated/battle/trainers/channeler.png"
+ },
+ {
+ "imageBase": "agatha",
+ "label": "AgathaPic",
+ "path": "assets/generated/battle/trainers/agatha.png"
+ },
+ {
+ "imageBase": "lance",
+ "label": "LancePic",
+ "path": "assets/generated/battle/trainers/lance.png"
+ }
+ ],
+ "trainers": [
+ "YOUNGSTER",
+ "BUG_CATCHER",
+ "LASS",
+ "SAILOR",
+ "JR_TRAINER_M",
+ "JR_TRAINER_F",
+ "POKEMANIAC",
+ "SUPER_NERD",
+ "HIKER",
+ "BIKER",
+ "BURGLAR",
+ "ENGINEER",
+ "UNUSED_JUGGLER",
+ "FISHER",
+ "SWIMMER",
+ "CUE_BALL",
+ "GAMBLER",
+ "BEAUTY",
+ "PSYCHIC_TR",
+ "ROCKER",
+ "JUGGLER",
+ "TAMER",
+ "BIRD_KEEPER",
+ "BLACKBELT",
+ "RIVAL1",
+ "PROF_OAK",
+ "CHIEF",
+ "SCIENTIST",
+ "GIOVANNI",
+ "ROCKET",
+ "COOLTRAINER_M",
+ "COOLTRAINER_F",
+ "BRUNO",
+ "BROCK",
+ "MISTY",
+ "LT_SURGE",
+ "ERIKA",
+ "KOGA",
+ "BLAINE",
+ "SABRINA",
+ "GENTLEMAN",
+ "RIVAL2",
+ "RIVAL3",
+ "LORELEI",
+ "CHANNELER",
+ "AGATHA",
+ "LANCE"
+ ],
+ "typeNameLabels": [
+ "TypeNames.Normal",
+ "TypeNames.Fighting",
+ "TypeNames.Flying",
+ "TypeNames.Poison",
+ "TypeNames.Fire",
+ "TypeNames.Water",
+ "TypeNames.Grass",
+ "TypeNames.Electric",
+ "TypeNames.Psychic",
+ "TypeNames.Ice",
+ "TypeNames.Ground",
+ "TypeNames.Rock",
+ "TypeNames.Bird",
+ "TypeNames.Bug",
+ "TypeNames.Ghost",
+ "TypeNames.Dragon"
+ ]
+}
diff --git a/tools/tiled_export.py b/tools/tiled_export.py
new file mode 100644
index 00000000..dd7ddcd5
--- /dev/null
+++ b/tools/tiled_export.py
@@ -0,0 +1,1330 @@
+#!/usr/bin/env python3
+"""Build a Tiled workspace from the port's generated data.
+
+ python3 tools/tiled_export.py # -> build/tiled/
+ python3 tools/tiled_export.py --out DIR --palette mono
+ python3 tools/tiled_export.py --maps ROUTE_1,PALLET_TOWN # a subset
+
+Every vanilla map becomes one Tiled map you can open, edit and export back out
+as a mod (see the gen1-mod-export extension in the Tiled fork). Nothing here
+is committable: the whole tree derives from the player's imported ROM cache,
+so it lands in a gitignored directory exactly like data/generated/ does.
+
+HOW THE TWO MODELS LINE UP
+
+A gen1 map is `blocks`, a flat width*height array of block ids. A block is
+32x32 pixels: a 4x4 grid of 8x8 tiles. So one Tiled tileset per gen1 tileset,
+whose *tiles are the blocks* -- composited into an atlas here -- makes a Tiled
+tile layer literally the `blocks` array, with gid = blockId + 1.
+
+Collision does not live on the block, it lives on the 8x8 tile at each cell's
+feet. src/world/Map.lua:45 (Map.defCellTile) reads cell (cx, cy) as tile
+(cx*2, cy*2+1), so a block's four cells read block-local tile indices 4, 6, 12
+and 14 (0-based). Those four lookups against the tileset's `walkable` list are
+what this script bakes into per-block collision rectangles, so Tiled's
+"Show Tile Collision Shapes" draws the real collision over the real art.
+
+Warps, signs and objects use the 16px CELL grid, not the 32px block grid, so
+they are placed at cell*16 pixels in object layers.
+
+PALETTES
+
+By default every map is atlased in the SGB palette it actually renders with, so
+the workspace looks like the game rather than like a spritesheet. Vanilla
+resolves that through a cascade (byMap, byTileset, byPrefix) with interiors
+inheriting the last outdoor map, so `resolve_map_palettes` mirrors the cascade
+and walks the warp graph for the interiors. That means one atlas per
+(tileset, palette) pair -- 85 of them across Kanto -- all numbering their tiles
+identically, so blocks stay interchangeable between maps of different palettes.
+`--palette dmg` or `mono` collapses that back to one flat atlas per tileset.
+"""
+
+import argparse
+import json
+import os
+import re
+import shutil
+import subprocess
+import sys
+
+try:
+ from PIL import Image
+except ImportError: # pragma: no cover - environment problem, not a code path
+ sys.exit("tiled_export needs Pillow: python3 -m pip install Pillow")
+
+REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+# What Tiled writes today (tiled.qbs: version 1.12.2) against the 1.10 file
+# format, which is the newest format Tiled 1.12 emits by default.
+TILED_VERSION = "1.12.2"
+FORMAT_VERSION = "1.10"
+
+BLOCK_PX = 32 # one block
+CELL_PX = 16 # one walk cell; 2x2 per block
+TILE_PX = 8 # one graphics tile; 4x4 per block
+BLOCKS_PER_ROW = 8 # atlas layout, also the blockset composer layout
+
+# Block-local tile index (0-based, row-major over the 4x4 grid) whose walkable
+# membership decides each of the block's four cells. Mirrors Map.defCellTile.
+QUADRANT_TILES = [
+ ("nw", 0, 0, 1 * 4 + 0),
+ ("ne", 1, 0, 1 * 4 + 2),
+ ("sw", 0, 1, 3 * 4 + 0),
+ ("se", 1, 1, 3 * 4 + 2),
+]
+
+# Stale-cache fallbacks the engine applies when a tileset record does not carry
+# these lists (src/world/Map.lua:20-34). Mirrored so the editor shows the same
+# water, shore and warp-pad behavior the game will.
+DEFAULT_WATER_TILES = [0x14]
+DEFAULT_SHORE_TILES = [0x32, 0x48]
+NO_SHORE_TILESETS = {"SHIP_PORT"}
+DEFAULT_WARP_PAD_TILES = {
+ "FACILITY": {0x20: "pad", 0x11: "hole"},
+ "CAVERN": {0x22: "hole"},
+ "INTERIOR": {0x55: "pad"},
+}
+
+# The 2bpp shades the extractor writes, darkest to lightest.
+GRAY_RAMP = [0, 85, 170, 255]
+PALETTES = {
+ # classic DMG green, so the workspace reads as Game Boy rather than as a
+ # grayscale spritesheet; in-game color comes from PaletteFX per map
+ "dmg": [(0x08, 0x18, 0x20), (0x34, 0x68, 0x56),
+ (0x88, 0xC0, 0x70), (0xE0, 0xF8, 0xD0)],
+ "mono": [(0, 0, 0), (85, 85, 85), (170, 170, 170), (255, 255, 255)],
+}
+
+# Padding past the end of a real sheet: deliberately not a Game Boy shade, so a
+# block built out of ROM junk is obvious on sight.
+INVALID_TILE_COLOR = (255, 0, 255)
+
+# The SGB palette cascade, mirrored from src/world/FieldDefaults.lua PALETTES.
+# The importer does not stamp field.palettes, so those literals are the vanilla
+# truth and OverworldController.paletteLookup:461 walks them in this order.
+# A map record's own `palette` beats all of it (OverworldController.lua:506).
+PALETTE_BY_MAP = {
+ "PALLET_TOWN": "PALLET", "VIRIDIAN_CITY": "VIRIDIAN",
+ "PEWTER_CITY": "PEWTER", "CERULEAN_CITY": "CERULEAN",
+ "LAVENDER_TOWN": "LAVENDER", "VERMILION_CITY": "VERMILION",
+ "CELADON_CITY": "CELADON", "FUCHSIA_CITY": "FUCHSIA",
+ "CINNABAR_ISLAND": "CINNABAR", "INDIGO_PLATEAU": "INDIGO",
+ "SAFFRON_CITY": "SAFFRON",
+ "LORELEIS_ROOM": "PALLET", "BRUNOS_ROOM": "CAVE",
+}
+PALETTE_BY_TILESET = {"CEMETERY": "GRAYMON", "CAVERN": "CAVE"}
+PALETTE_BY_PREFIX = [("ROUTE_", "ROUTE")]
+PALETTE_DEFAULT = "ROUTE"
+
+# Mod map ids start here so they cannot collide with the ROM's byte-wide table
+# (src/mods/Schemas.lua:489).
+MOD_MAP_INDEX_BASE = 1000
+
+
+# --------------------------------------------------------------- data loading
+
+def load_generated(name):
+ """Dump one data/generated/.lua through luajit and parse it."""
+ path = os.path.join(REPO, "data", "generated", "%s.lua" % name)
+ if not os.path.exists(path):
+ sys.exit("missing %s -- run scripts/setup.sh --rom ... first" % path)
+ dumper = os.path.join(REPO, "tools", "lua_to_json.lua")
+ lua = shutil.which("luajit") or shutil.which("lua")
+ if not lua:
+ sys.exit("tiled_export needs luajit (or lua) on PATH")
+ try:
+ raw = subprocess.check_output([lua, dumper, path], cwd=REPO)
+ except subprocess.CalledProcessError as err:
+ sys.exit("could not read %s: %s" % (path, err))
+ return json.loads(raw)
+
+
+def as_list(value):
+ """Coerce the dumper's [] / {} ambiguity for an empty table into a list."""
+ if not value:
+ return []
+ if isinstance(value, dict):
+ return [value[k] for k in sorted(value, key=lambda k: int(k))]
+ return value
+
+
+def as_dict(value):
+ return value if isinstance(value, dict) else {}
+
+
+# ------------------------------------------------------------------- palettes
+
+def palette_colors(palettes, name):
+ """One palette as four RGB tuples, DARKEST first.
+
+ palettes.lua stores them lightest-first, which is the Game Boy's own color
+ order: 2bpp index 0 is the lightest shade. The atlas builder works off a
+ darkest-first ramp, so reverse here rather than at every use.
+ """
+ entry = as_list(as_dict(palettes.get("palettes")).get(name))
+ if len(entry) != 4:
+ return None
+ return [tuple(as_list(color)) for color in reversed(entry)]
+
+
+def resolve_map_palettes(maps):
+ """The palette each map actually renders with.
+
+ The cascade decides towns, cave/tower tilesets and routes. Everything else
+ -- 138 of the 222 maps, i.e. every interior -- renders with the palette of
+ the last OUTDOOR map the player stood on, which is state, not data. For an
+ editor the useful approximation is the outdoor map you reach it from, so
+ those inherit across warps, nearest first.
+ """
+ resolved = {}
+ for map_id, map_def in maps.items():
+ if map_id in PALETTE_BY_MAP:
+ resolved[map_id] = PALETTE_BY_MAP[map_id]
+ continue
+ tileset = map_def.get("tileset")
+ if tileset in PALETTE_BY_TILESET:
+ resolved[map_id] = PALETTE_BY_TILESET[tileset]
+ continue
+ for prefix, palette in PALETTE_BY_PREFIX:
+ if map_id.startswith(prefix):
+ resolved[map_id] = palette
+ break
+
+ # warp graph, both ways: a door is walkable in either direction
+ neighbors = {map_id: set() for map_id in maps}
+ for map_id, map_def in maps.items():
+ for warp in as_list(map_def.get("warps")):
+ other = warp.get("destMap")
+ # LAST_MAP is "wherever you came from", so it carries no palette
+ if other in neighbors and other != map_id:
+ neighbors[map_id].add(other)
+ neighbors[other].add(map_id)
+
+ queue = sorted(resolved)
+ while queue:
+ current = queue.pop(0)
+ for other in sorted(neighbors[current]):
+ if other not in resolved:
+ resolved[other] = resolved[current]
+ queue.append(other)
+
+ for map_id in maps:
+ resolved.setdefault(map_id, PALETTE_DEFAULT)
+ return resolved
+
+
+# --------------------------------------------------------- tileset flag model
+
+class TilesetFlags:
+ """The per-8x8-tile flag sets the engine reads, with engine fallbacks."""
+
+ def __init__(self, tileset):
+ self.id = tileset["id"]
+ self.walkable = set(as_list(tileset.get("walkable")))
+ self.door = set(as_list(tileset.get("doorTiles")))
+ self.warp = set(as_list(tileset.get("warpTiles")))
+ self.counter = set(as_list(tileset.get("counterTiles")))
+ self.animated = set(as_list(tileset.get("animatedTiles")))
+
+ water = tileset.get("waterTiles")
+ self.water = set(as_list(water)) if water else set(DEFAULT_WATER_TILES)
+ self.water_is_default = not water
+
+ shore = tileset.get("shoreTiles")
+ if shore is not None:
+ self.shore = set(as_list(shore))
+ self.shore_is_default = False
+ elif self.id in NO_SHORE_TILESETS:
+ self.shore = set()
+ self.shore_is_default = True
+ else:
+ self.shore = set(DEFAULT_SHORE_TILES)
+ self.shore_is_default = True
+
+ grass = tileset.get("grassTile")
+ self.grass = {grass} if grass is not None else set()
+
+ pads = tileset.get("warpPadTiles")
+ if pads:
+ self.warp_pads = {int(k): v for k, v in as_dict(pads).items()}
+ self.warp_pads_are_default = False
+ else:
+ self.warp_pads = dict(DEFAULT_WARP_PAD_TILES.get(self.id, {}))
+ self.warp_pads_are_default = True
+
+ def tile_flags(self, tile_id):
+ """Authored flags for one 8x8 tile, omitting engine-default sets.
+
+ The defaults are deliberately not written back as authored values: a
+ tileset that names waterTiles wins outright over the fallback
+ (Map.lua:18), so echoing the fallback into a mod tileset would freeze
+ Kanto's tile ids into content that has no reason to share them.
+ """
+ out = {}
+ if tile_id in self.walkable:
+ out["walkable"] = True
+ if tile_id in self.door:
+ out["door"] = True
+ if tile_id in self.warp:
+ out["warp"] = True
+ if tile_id in self.counter:
+ out["counter"] = True
+ if tile_id in self.animated:
+ out["animated"] = True
+ if tile_id in self.grass:
+ out["grass"] = True
+ if tile_id in self.water and not self.water_is_default:
+ out["water"] = True
+ if tile_id in self.shore and not self.shore_is_default:
+ out["shore"] = True
+ if tile_id in self.warp_pads and not self.warp_pads_are_default:
+ out["warpPad"] = self.warp_pads[tile_id]
+ return out
+
+ def inherited_note(self, tile_id):
+ """Flags the engine will apply that are NOT authored on the record."""
+ notes = []
+ if tile_id in self.water and self.water_is_default:
+ notes.append("water (engine default)")
+ if tile_id in self.shore and self.shore_is_default:
+ notes.append("shore (engine default)")
+ if tile_id in self.warp_pads and self.warp_pads_are_default:
+ notes.append("%s (engine default)" % self.warp_pads[tile_id])
+ return ", ".join(notes)
+
+
+# ------------------------------------------------------------- block atlasing
+
+def max_tile_id(tileset):
+ """Highest 8x8 tile id any of this tileset's blocks references.
+
+ Six vanilla tilesets (GATE, FOREST_GATE, MUSEUM, HOUSE, REDS_HOUSE_1/2)
+ address ids far past their extracted sheet -- GATE reaches 223 over a
+ 96-tile sheet. Those are the ROM's trailing padding blocks; no map uses
+ one. They still have to survive the round trip, and a Tiled gid cannot
+ point outside its tileset, so the editing sheet is padded to cover them.
+ """
+ highest = -1
+ for block in as_list(tileset.get("blocks")):
+ for tile_id in as_list(block):
+ highest = max(highest, tile_id)
+ return highest
+
+
+def load_tile_sheet(tileset, colors):
+ """The 8x8 sheet as RGB, padded to address every tile id blocks reference.
+
+ `colors` is four RGB tuples, DARKEST first. Returns the image, its size,
+ and how many tiles the real sheet holds -- anything past that is padding,
+ marked so nobody paints with it.
+ """
+ path = os.path.join(REPO, tileset["image"])
+ if not os.path.exists(path):
+ sys.exit("tileset %s: missing image %s" % (tileset["id"], path))
+ sheet = Image.open(path)
+ if sheet.mode != "L":
+ sheet = sheet.convert("L")
+ # 2bpp art: map the four shades the extractor writes onto the palette,
+ # nearest-ramp for anything a mod sheet smuggled in
+ lut = []
+ for value in range(256):
+ nearest = min(range(4), key=lambda i: abs(GRAY_RAMP[i] - value))
+ lut.append(nearest)
+ indexed = sheet.point(lut, mode="L")
+ out = Image.frombytes("P", sheet.size, indexed.tobytes())
+ out.putpalette([channel for color in colors for channel in color])
+ out = out.convert("RGB")
+
+ width, height = sheet.size
+ per_row = tileset.get("tilesPerRow") or (width // TILE_PX)
+ real_tiles = (width // TILE_PX) * (height // TILE_PX)
+
+ needed = max(real_tiles, max_tile_id(tileset) + 1)
+ rows = (needed + per_row - 1) // per_row
+ if rows * TILE_PX > height:
+ padded = Image.new("RGB", (width, rows * TILE_PX), INVALID_TILE_COLOR)
+ padded.paste(out, (0, 0))
+ out = padded
+
+ return out, out.size, real_tiles
+
+
+def build_block_atlas(tileset, colors):
+ """Composite every block of one tileset into a 32x32-per-block atlas."""
+ sheet, (sheet_w, _sheet_h), _real = load_tile_sheet(tileset, colors)
+ per_row = tileset.get("tilesPerRow") or (sheet_w // TILE_PX)
+ blocks = as_list(tileset.get("blocks"))
+
+ columns = min(BLOCKS_PER_ROW, max(1, len(blocks)))
+ rows = (len(blocks) + columns - 1) // columns
+ atlas = Image.new("RGB", (columns * BLOCK_PX, rows * BLOCK_PX), colors[3])
+
+ for index, block in enumerate(blocks):
+ bx = (index % columns) * BLOCK_PX
+ by = (index // columns) * BLOCK_PX
+ for slot, tile_id in enumerate(as_list(block)):
+ sx = (tile_id % per_row) * TILE_PX
+ sy = (tile_id // per_row) * TILE_PX
+ tile = sheet.crop((sx, sy, sx + TILE_PX, sy + TILE_PX))
+ atlas.paste(tile, (bx + (slot % 4) * TILE_PX,
+ by + (slot // 4) * TILE_PX))
+ return atlas, columns, rows
+
+
+# ---------------------------------------------------------------- JSON output
+
+def write_json(path, payload):
+ os.makedirs(os.path.dirname(path), exist_ok=True)
+ with open(path, "w", encoding="utf-8") as handle:
+ json.dump(payload, handle, indent=1, sort_keys=False)
+ handle.write("\n")
+
+
+def props(pairs):
+ """Tiled's modern property array (varianttomapconverter.cpp:186).
+
+ An entry may be (name, value) or (name, value, enum_type). The third form
+ stamps `propertytype`, which is what makes Tiled edit the value with a
+ dropdown instead of a text box -- without it the stored property shadows the
+ class member and comes up as free text. Such a property is reported by the
+ live API as its INDEX into the enum, which the exporter resolves back to the
+ name through the value lists in vanilla.json.
+ """
+ out = []
+ for pair in pairs:
+ name, value = pair[0], pair[1]
+ enum_type = pair[2] if len(pair) > 2 else None
+ if value is None or value == "":
+ continue
+ if isinstance(value, bool):
+ kind = "bool"
+ elif isinstance(value, int):
+ kind = "int"
+ elif isinstance(value, float):
+ kind = "float"
+ else:
+ kind = "string"
+ value = str(value)
+ entry = {"name": name, "type": kind, "value": value}
+ if enum_type:
+ entry["propertytype"] = enum_type
+ out.append(entry)
+ return out
+
+
+def class_prop(name, type_name, value):
+ return {"name": name, "type": "class",
+ "propertytype": type_name, "value": value}
+
+
+# ------------------------------------------------------------ tileset writing
+
+def blocks_tileset_name(tileset_id, palette_name):
+ """blocks_OVERWORLD, or blocks_OVERWORLD__PALLET for a palette variant.
+
+ The exporter strips both the prefix and the __PALETTE suffix to recover the
+ gen1 tileset id, which is what lets a map on one palette accept blocks
+ pasted from a map on another: every variant numbers its tiles identically,
+ because tile id IS block id.
+ """
+ if not palette_name:
+ return "blocks_%s" % tileset_id
+ return "blocks_%s__%s" % (tileset_id, palette_name)
+
+
+def write_blocks_tileset(out_dir, tileset, flags, colors, palette_name=None):
+ """One Tiled tileset whose tiles are this gen1 tileset's 32x32 blocks."""
+ tileset_id = tileset["id"]
+ atlas, columns, rows = build_block_atlas(tileset, colors)
+ name = blocks_tileset_name(tileset_id, palette_name)
+ png_name = "%s.png" % name
+ png_path = os.path.join(out_dir, "tilesets", png_name)
+ os.makedirs(os.path.dirname(png_path), exist_ok=True)
+ atlas.save(png_path)
+
+ blocks = as_list(tileset.get("blocks"))
+ tiles = []
+ for index, block in enumerate(blocks):
+ rows_of = as_list(block)
+ collision = []
+ summary = []
+ notes = []
+ for label, cx, cy, slot in QUADRANT_TILES:
+ tile_id = rows_of[slot] if slot < len(rows_of) else 0
+ walkable = tile_id in flags.walkable
+ summary.append("." if walkable else "#")
+ if not walkable:
+ collision.append({
+ "id": len(collision) + 1,
+ "name": label,
+ "type": "",
+ "x": cx * CELL_PX, "y": cy * CELL_PX,
+ "width": CELL_PX, "height": CELL_PX,
+ "rotation": 0, "visible": True,
+ })
+ marks = []
+ if tile_id in flags.grass:
+ marks.append("grass")
+ if tile_id in flags.water:
+ marks.append("water")
+ if tile_id in flags.shore:
+ marks.append("shore")
+ if tile_id in flags.door:
+ marks.append("door")
+ if tile_id in flags.warp:
+ marks.append("warp")
+ if tile_id in flags.counter:
+ marks.append("counter")
+ if tile_id in flags.warp_pads:
+ marks.append(flags.warp_pads[tile_id])
+ if marks:
+ notes.append("%s=%s" % (label, "/".join(marks)))
+
+ entry = {
+ "id": index,
+ "properties": props([
+ ("blockId", index),
+ # the four cell-feet tiles, in the order Tiled draws them
+ ("collision", "".join(summary)),
+ ("terrain", " ".join(notes)),
+ ]),
+ }
+ if collision:
+ entry["objectgroup"] = {
+ "draworder": "index", "id": 1, "name": "",
+ "opacity": 1, "type": "objectgroup", "visible": True,
+ "x": 0, "y": 0, "objects": collision,
+ }
+ tiles.append(entry)
+
+ write_json(os.path.join(out_dir, "tilesets", "%s.tsj" % name), {
+ "columns": columns,
+ "image": png_name,
+ "imageheight": rows * BLOCK_PX,
+ "imagewidth": columns * BLOCK_PX,
+ "margin": 0,
+ "name": name,
+ "spacing": 0,
+ "tilecount": len(blocks),
+ "tiledversion": TILED_VERSION,
+ "tileheight": BLOCK_PX,
+ "tilewidth": BLOCK_PX,
+ "type": "tileset",
+ "version": FORMAT_VERSION,
+ "properties": props([
+ ("gen1Tileset", tileset_id),
+ ("gen1Palette", palette_name),
+ ("animation", tileset.get("animation")),
+ ("blocksPerRow", columns),
+ ]),
+ "tiles": tiles,
+ })
+ return columns, rows, len(blocks)
+
+
+def write_tiles_tileset(out_dir, tileset, flags, colors):
+ """The raw 8x8 sheet, with the engine's flags on each tile.
+
+ This is the surface you author collision on for a NEW tileset: walkability
+ is a property of the 8x8 tile id, not of the block, so marking tiles here
+ is what `walkable`, `waterTiles` and friends are built from on export.
+ """
+ tileset_id = tileset["id"]
+ sheet, (width, height), real_tiles = load_tile_sheet(tileset, colors)
+ png_name = "tiles_%s.png" % tileset_id
+ sheet.save(os.path.join(out_dir, "tilesets", png_name))
+
+ per_row = tileset.get("tilesPerRow") or (width // TILE_PX)
+ count = (width // TILE_PX) * (height // TILE_PX)
+
+ tiles = []
+ for tile_id in range(count):
+ pairs = list(flags.tile_flags(tile_id).items())
+ note = flags.inherited_note(tile_id)
+ if note:
+ pairs.append(("inherited", note))
+ if tile_id >= real_tiles:
+ # only reachable through the ROM's padding blocks; keeping the id
+ # addressable is what lets those blocks round trip untouched
+ pairs.append(("beyondSheet", True))
+ if pairs:
+ tiles.append({"id": tile_id, "properties": props(pairs)})
+
+ write_json(os.path.join(out_dir, "tilesets", "tiles_%s.tsj" % tileset_id), {
+ "columns": per_row,
+ "image": png_name,
+ "imageheight": height,
+ "imagewidth": width,
+ "margin": 0,
+ "name": "tiles_%s" % tileset_id,
+ "spacing": 0,
+ "tilecount": count,
+ "tiledversion": TILED_VERSION,
+ "tileheight": TILE_PX,
+ "tilewidth": TILE_PX,
+ "type": "tileset",
+ "version": FORMAT_VERSION,
+ "properties": props([("gen1Tileset", tileset_id)]),
+ "tiles": tiles,
+ })
+ return count
+
+
+def write_blockset_map(out_dir, tileset, block_columns):
+ """A composer map: the blockset laid out as raw 8x8 tiles, 4x4 per block.
+
+ Editing this is how you define new blocks -- paint 8x8 tiles inside a 4x4
+ cell and the exporter reads the region back as one `blocks` row of 16 tile
+ ids. Block index is (row * blocksPerRow + column), matching the atlas.
+ """
+ tileset_id = tileset["id"]
+ blocks = as_list(tileset.get("blocks"))
+ columns = min(block_columns, max(1, len(blocks)))
+ rows = (len(blocks) + columns - 1) // columns
+
+ width = columns * 4
+ height = rows * 4
+ data = [0] * (width * height)
+ for index, block in enumerate(blocks):
+ base_x = (index % columns) * 4
+ base_y = (index // columns) * 4
+ for slot, tile_id in enumerate(as_list(block)):
+ x = base_x + (slot % 4)
+ y = base_y + (slot // 4)
+ data[y * width + x] = tile_id + 1 # gid, 0 means empty
+
+ write_json(os.path.join(out_dir, "blocksets", "%s.tmj" % tileset_id), {
+ "compressionlevel": -1,
+ "height": height,
+ "infinite": False,
+ "layers": [{
+ "data": data,
+ "height": height, "width": width,
+ "id": 1, "name": "tiles", "opacity": 1,
+ "type": "tilelayer", "visible": True, "x": 0, "y": 0,
+ }],
+ "nextlayerid": 2,
+ "nextobjectid": 1,
+ "orientation": "orthogonal",
+ "renderorder": "right-down",
+ "tiledversion": TILED_VERSION,
+ "tileheight": TILE_PX,
+ "tilewidth": TILE_PX,
+ "type": "map",
+ "version": FORMAT_VERSION,
+ "width": width,
+ "class": "Gen1Blockset",
+ "properties": props([
+ ("gen1Tileset", tileset_id),
+ ("blocksPerRow", columns),
+ ("blockCount", len(blocks)),
+ ("animation", tileset.get("animation")),
+ ]),
+ "tilesets": [{
+ "firstgid": 1,
+ "source": "../tilesets/tiles_%s.tsj" % tileset_id,
+ }],
+ })
+
+
+# ---------------------------------------------------------------- map writing
+
+def object_entries(map_def, next_id):
+ """Warp, sign and object layers, all on the 16px cell grid."""
+ warps, signs, objects = [], [], []
+
+ for index, warp in enumerate(as_list(map_def.get("warps")), start=1):
+ warps.append({
+ "id": next_id(), "name": "warp %d" % index, "type": "Warp",
+ "x": warp["x"] * CELL_PX, "y": warp["y"] * CELL_PX,
+ "width": CELL_PX, "height": CELL_PX,
+ "rotation": 0, "visible": True,
+ "properties": props([
+ ("warpIndex", index),
+ ("destMap", warp.get("destMap")),
+ ("destWarp", warp.get("destWarp")),
+ ]),
+ })
+
+ for index, sign in enumerate(as_list(map_def.get("signs")), start=1):
+ signs.append({
+ "id": next_id(), "name": "sign %d" % index, "type": "Sign",
+ "x": sign["x"] * CELL_PX, "y": sign["y"] * CELL_PX,
+ "width": CELL_PX, "height": CELL_PX,
+ "rotation": 0, "visible": True,
+ # carried explicitly because the ROM's sign order is not reading
+ # order, and re-sorting a map nobody edited would fake a diff
+ "properties": props([("signIndex", index),
+ ("text", sign.get("text"))]),
+ })
+
+ ordered = sorted(as_list(map_def.get("objects")),
+ key=lambda o: o.get("index") or 0)
+ for obj in ordered:
+ objects.append({
+ "id": next_id(),
+ "name": obj.get("name") or "",
+ "type": "Gen1Object",
+ "x": obj["x"] * CELL_PX, "y": obj["y"] * CELL_PX,
+ "width": CELL_PX, "height": CELL_PX,
+ "rotation": 0, "visible": True,
+ "properties": props([
+ ("objectIndex", obj.get("index")),
+ # sprite and trainerClass stay free text: a mod registers its
+ # own, and an enum cannot hold a name outside its list
+ ("sprite", obj.get("sprite")),
+ ("movement", obj.get("movement"), "Movement"),
+ ("range", obj.get("range"), "SightRange"),
+ ("text", obj.get("text")),
+ ("trainerClass", obj.get("trainerClass")),
+ ("trainerParty", obj.get("trainerParty")),
+ ("item", obj.get("item")),
+ ("pokemon", obj.get("pokemon")),
+ ("level", obj.get("level")),
+ ("hidden", obj.get("hidden")),
+ ]),
+ })
+ return warps, signs, objects
+
+
+def write_map(out_dir, map_def, palette_name=None):
+ map_id = map_def["id"]
+ width, height = map_def["width"], map_def["height"]
+ blocks = as_list(map_def.get("blocks"))
+
+ counter = [0]
+
+ def next_id():
+ counter[0] += 1
+ return counter[0]
+
+ warps, signs, objects = object_entries(map_def, next_id)
+
+ connections = as_dict(map_def.get("connections"))
+ connection_props = []
+ for direction in ("north", "south", "east", "west"):
+ conn = as_dict(connections.get(direction))
+ if conn:
+ connection_props.append(class_prop(
+ "connect" + direction.capitalize(), "Gen1Connection",
+ {"map": conn.get("map", ""), "offset": conn.get("offset", 0)}))
+
+ layers = [{
+ "data": [block + 1 for block in blocks], # gid, block 0 is gid 1
+ "height": height, "width": width,
+ "id": 1, "name": "blocks", "opacity": 1,
+ "type": "tilelayer", "visible": True, "x": 0, "y": 0,
+ }]
+ for layer_id, (name, entries) in enumerate(
+ (("warps", warps), ("signs", signs), ("objects", objects)),
+ start=2):
+ layers.append({
+ "draworder": "topdown", "id": layer_id, "name": name,
+ "objects": entries, "opacity": 1, "type": "objectgroup",
+ "visible": True, "x": 0, "y": 0,
+ })
+
+ write_json(os.path.join(out_dir, "maps", "%s.tmj" % map_id), {
+ "compressionlevel": -1,
+ "height": height,
+ "infinite": False,
+ "layers": layers,
+ "nextlayerid": 5,
+ "nextobjectid": counter[0] + 1,
+ "orientation": "orthogonal",
+ "renderorder": "right-down",
+ "tiledversion": TILED_VERSION,
+ "tileheight": BLOCK_PX,
+ "tilewidth": BLOCK_PX,
+ "type": "map",
+ "version": FORMAT_VERSION,
+ "width": width,
+ "class": "Gen1Map",
+ "properties": props([
+ ("mapId", map_id),
+ ("label", map_def.get("label")),
+ ("index", map_def.get("index")),
+ ("tileset", map_def.get("tileset")),
+ ("borderBlock", map_def.get("borderBlock")),
+ # what the map renders with today; changing it exports a
+ # `palette` on the map record, which beats the cascade.
+ # PaletteId-typed so it is a dropdown rather than free text
+ ("palette", palette_name, "PaletteId"),
+ # set false on a map you author from scratch; the exporter uses it
+ # to choose maps:patch (diff against vanilla) over maps:register
+ ("vanilla", True),
+ ("source", map_def.get("source")),
+ ]) + connection_props,
+ "tilesets": [{
+ "firstgid": 1,
+ "source": "../tilesets/%s.tsj" % blocks_tileset_name(
+ map_def["tileset"], palette_name),
+ }],
+ })
+
+
+# -------------------------------------------------------------- world writing
+
+def connected_components(maps):
+ """Undirected components of the connection graph."""
+ neighbors = {map_id: set() for map_id in maps}
+ for map_id, map_def in maps.items():
+ for conn in as_dict(map_def.get("connections")).values():
+ other = as_dict(conn).get("map")
+ if other in neighbors:
+ neighbors[map_id].add(other)
+ neighbors[other].add(map_id)
+
+ seen = set()
+ components = []
+ for map_id in sorted(maps):
+ if map_id in seen or not neighbors[map_id]:
+ continue
+ stack, group = [map_id], []
+ seen.add(map_id)
+ while stack:
+ current = stack.pop()
+ group.append(current)
+ for other in sorted(neighbors[current]):
+ if other not in seen:
+ seen.add(other)
+ stack.append(other)
+ components.append(sorted(group))
+ return components
+
+
+def place_component(maps, group):
+ """BFS the component into pixel positions.
+
+ Same arithmetic as OverworldController.computeNeighbors:146-154 -- a
+ connection offset is in blocks, so it scales by 32 to pixels, and the
+ perpendicular axis lands flush against the neighbor's far edge.
+ """
+ root = min(group, key=lambda m: (maps[m].get("index", 1 << 30), m))
+ placed = {root: (0, 0)}
+ queue = [root]
+ while queue:
+ current = queue.pop(0)
+ cx, cy = placed[current]
+ current_def = maps[current]
+ for direction, conn in sorted(as_dict(
+ current_def.get("connections")).items()):
+ conn = as_dict(conn)
+ other = conn.get("map")
+ other_def = maps.get(other)
+ if not other_def or other in placed:
+ continue
+ offset = (conn.get("offset") or 0) * BLOCK_PX
+ if direction == "north":
+ dx, dy = offset, -other_def["height"] * BLOCK_PX
+ elif direction == "south":
+ dx, dy = offset, current_def["height"] * BLOCK_PX
+ elif direction == "west":
+ dx, dy = -other_def["width"] * BLOCK_PX, offset
+ else:
+ dx, dy = current_def["width"] * BLOCK_PX, offset
+ placed[other] = (cx + dx, cy + dy)
+ queue.append(other)
+ return root, placed
+
+
+def write_worlds(out_dir, maps):
+ components = connected_components(maps)
+ components.sort(key=len, reverse=True)
+ written = []
+ for rank, group in enumerate(components):
+ root, placed = place_component(maps, group)
+ name = "kanto" if rank == 0 else root.lower()
+ entries = []
+ for map_id, (x, y) in sorted(placed.items()):
+ entries.append({
+ "fileName": "maps/%s.tmj" % map_id,
+ "x": x, "y": y,
+ "width": maps[map_id]["width"] * BLOCK_PX,
+ "height": maps[map_id]["height"] * BLOCK_PX,
+ })
+ write_json(os.path.join(out_dir, "%s.world" % name), {
+ "type": "world",
+ "onlyShowAdjacentMaps": False,
+ "maps": entries,
+ })
+ written.append((name, len(entries)))
+ return written
+
+
+# ------------------------------------------------------------ project writing
+
+def enum_type(type_id, name, values, storage="string"):
+ # values are taken exactly as given: build_enums owns the order, and the
+ # exporter resolves an enum index against that same order
+ return {"type": "enum", "id": type_id, "name": name,
+ "storageType": storage, "values": list(values),
+ "valuesAsFlags": False}
+
+
+def class_type(type_id, name, members, usage, color="#ffa0a0a4"):
+ # "useAs", not "usageFlags": that is the key Tiled reads
+ # (libtiled/propertytype.cpp:415, written back at :391). Getting it wrong
+ # is silent -- every class falls back to being a property-value type only,
+ # so a map/object/tile class never actually applies to anything.
+ return {"type": "class", "id": type_id, "name": name, "color": color,
+ "drawFill": True, "useAs": usage, "members": members}
+
+
+def member(name, kind, value, property_type=None):
+ entry = {"name": name, "type": kind, "value": value}
+ if property_type:
+ entry["propertyType"] = property_type
+ return entry
+
+
+def object_field_values(maps, field):
+ return sorted({obj.get(field) for m in maps.values()
+ for obj in as_list(m.get("objects")) if obj.get(field)})
+
+
+def build_enums(maps, tilesets, palettes=None):
+ """The enum value lists, in the exact order the project declares them.
+
+ Order is load bearing and that is why this is shared rather than rebuilt:
+ Tiled hands an enum-typed property back as { value: , typeName },
+ carrying the index into `values`, not the name. The exporter resolves the
+ index through the copy of these lists in vanilla.json, so the two must not
+ be allowed to drift apart -- which is also why the baseline and the project
+ must build them from here rather than each assembling its own.
+ """
+ enums = {
+ "SpriteId": object_field_values(maps, "sprite"),
+ "Movement": object_field_values(maps, "movement"),
+ "SightRange": object_field_values(maps, "range"),
+ "TrainerClass": object_field_values(maps, "trainerClass"),
+ "VanillaMapId": sorted(maps),
+ "VanillaTilesetId": sorted(tilesets),
+ }
+ # palettes.lua's own declaration order, not sorted: it is the SGB table order
+ palette_names = as_list(as_dict(palettes).get("order")) if palettes else []
+ if palette_names:
+ enums["PaletteId"] = palette_names
+ return enums
+
+
+def write_project(out_dir, maps, tilesets, extensions_path, palettes=None):
+ enums = build_enums(maps, tilesets, palettes)
+ type_id = [0]
+
+ def next_type_id():
+ type_id[0] += 1
+ return type_id[0]
+
+ # Enums give dropdowns instead of typo-prone free text. destMap and
+ # tileset stay plain strings on purpose: a mod may name a map or tileset
+ # of its own that no vanilla enum can know about.
+ types = [enum_type(next_type_id(), name, values)
+ for name, values in enums.items()]
+
+ types.append(class_type(next_type_id(), "Gen1Connection", [
+ member("map", "string", ""),
+ member("offset", "int", 0),
+ ], ["property"], color="#ff6fa8dc"))
+
+ types.append(class_type(next_type_id(), "Gen1Map", [
+ member("mapId", "string", ""),
+ member("label", "string", ""),
+ member("index", "int", 0),
+ member("tileset", "string", "OVERWORLD"),
+ member("borderBlock", "int", 0),
+ member("palette", "string", "", "PaletteId"),
+ member("vanilla", "bool", False),
+ # a plain bool, not an enum: an enum-typed property arrives as an index
+ # rather than a name, and a two-state choice does not need that risk
+ member("exactExport", "bool", False),
+ member("source", "string", ""),
+ member("connectNorth", "class", {"map": "", "offset": 0},
+ "Gen1Connection"),
+ member("connectSouth", "class", {"map": "", "offset": 0},
+ "Gen1Connection"),
+ member("connectEast", "class", {"map": "", "offset": 0},
+ "Gen1Connection"),
+ member("connectWest", "class", {"map": "", "offset": 0},
+ "Gen1Connection"),
+ ], ["map"], color="#ffe69138"))
+
+ types.append(class_type(next_type_id(), "Gen1Blockset", [
+ member("gen1Tileset", "string", ""),
+ member("blocksPerRow", "int", BLOCKS_PER_ROW),
+ member("blockCount", "int", 0),
+ member("animation", "string", "TILEANIM_NONE"),
+ ], ["map"], color="#ff8e7cc3"))
+
+ types.append(class_type(next_type_id(), "Warp", [
+ member("warpIndex", "int", 0),
+ member("destMap", "string", ""),
+ member("destWarp", "int", 1),
+ ], ["object"], color="#ff3d85c6"))
+
+ types.append(class_type(next_type_id(), "Sign", [
+ member("signIndex", "int", 0),
+ member("text", "string", ""),
+ ], ["object"], color="#ff6aa84f"))
+
+ types.append(class_type(next_type_id(), "Gen1Object", [
+ member("objectIndex", "int", 0),
+ member("sprite", "string", "SPRITE_YOUNGSTER", "SpriteId"),
+ member("movement", "string", "STAY", "Movement"),
+ member("range", "string", "NONE", "SightRange"),
+ member("text", "string", ""),
+ member("trainerClass", "string", "", "TrainerClass"),
+ member("trainerParty", "int", 0),
+ member("item", "string", ""),
+ member("pokemon", "string", ""),
+ member("level", "int", 0),
+ member("hidden", "bool", False),
+ ], ["object"], color="#ffcc0000"))
+
+ # Per-8x8-tile flags, so authoring a new tileset is checkbox work.
+ types.append(class_type(next_type_id(), "Gen1Tile", [
+ member("walkable", "bool", False),
+ member("grass", "bool", False),
+ member("water", "bool", False),
+ member("shore", "bool", False),
+ member("door", "bool", False),
+ member("warp", "bool", False),
+ member("counter", "bool", False),
+ member("animated", "bool", False),
+ member("warpPad", "string", ""),
+ ], ["tile"], color="#ffffd966"))
+
+ write_json(os.path.join(out_dir, "gen1.tiled-project"), {
+ "automappingRulesFile": "",
+ "commands": [],
+ "compatibilityVersion": 1100,
+ "extensionsPath": extensions_path,
+ "folders": ["maps", "blocksets", "tilesets"],
+ "propertyTypes": types,
+ })
+
+
+# ------------------------------------------------------------------- baseline
+
+def load_version():
+ """engine release and mod api from src/core/Version.lua.
+
+ Scraped rather than executed (Version.lua carries a function, and this only
+ needs two numbers), matching tools/modkit.py:115 so an exported manifest
+ declares the same range `modkit scaffold` would write.
+ """
+ path = os.path.join(REPO, "src", "core", "Version.lua")
+ try:
+ with open(path, encoding="utf-8") as handle:
+ source = handle.read()
+ except OSError:
+ return "0.0.0-dev", 2
+ engine = re.search(r'engine\s*=\s*"([^"]+)"', source)
+ mod_api = re.search(r"modApi\s*=\s*(\d+)", source)
+ return (engine.group(1) if engine else "0.0.0-dev",
+ int(mod_api.group(1)) if mod_api else 2)
+
+
+def write_baseline(out_dir, maps, tilesets, tileset_stats, map_palettes=None,
+ palettes=None):
+ """What the exporter diffs against to emit maps:patch instead of register.
+
+ Only the fields the mod schema accepts (src/mods/Schemas.lua:486) are kept,
+ so a diff can never propose a key the loader would reject.
+ """
+ baseline_maps = {}
+ for map_id, map_def in maps.items():
+ baseline_maps[map_id] = {
+ "index": map_def.get("index"),
+ "label": map_def.get("label"),
+ "tileset": map_def.get("tileset"),
+ "width": map_def["width"],
+ "height": map_def["height"],
+ "borderBlock": map_def.get("borderBlock"),
+ "blocks": as_list(map_def.get("blocks")),
+ "connections": as_dict(map_def.get("connections")),
+ "warps": as_list(map_def.get("warps")),
+ "signs": as_list(map_def.get("signs")),
+ "objects": as_list(map_def.get("objects")),
+ }
+
+ baseline_tilesets = {}
+ for tileset_id, tileset in tilesets.items():
+ stats = tileset_stats.get(tileset_id, {})
+ flags = TilesetFlags(tileset)
+ record = {
+ "blockCount": len(as_list(tileset.get("blocks"))),
+ "tileCount": stats.get("tileCount"),
+ "blocksPerRow": stats.get("columns"),
+ "animation": tileset.get("animation"),
+ # the ROM cache path, not a copy: a mod that keeps drawing on the
+ # player's own imported sheet references it here instead of
+ # carrying extracted art
+ "image": tileset.get("image"),
+ "imageWidth": tileset.get("imageWidth"),
+ "imageHeight": tileset.get("imageHeight"),
+ "tilesPerRow": tileset.get("tilesPerRow"),
+ "blocks": as_list(tileset.get("blocks")),
+ }
+ # only the authored lists, matching what the editor round-trips, so a
+ # diff never proposes an engine fallback as an authored value
+ for field, values in (
+ ("walkable", flags.walkable),
+ ("doorTiles", flags.door),
+ ("warpTiles", flags.warp),
+ ("counterTiles", flags.counter),
+ ("animatedTiles", flags.animated)):
+ if values:
+ record[field] = sorted(values)
+ if not flags.water_is_default:
+ record["waterTiles"] = sorted(flags.water)
+ if not flags.shore_is_default:
+ record["shoreTiles"] = sorted(flags.shore)
+ if tileset.get("grassTile") is not None:
+ record["grassTile"] = tileset["grassTile"]
+ baseline_tilesets[tileset_id] = record
+
+ engine, mod_api = load_version()
+ next_major = int(engine.split(".")[0]) + 1
+
+ write_json(os.path.join(out_dir, "vanilla.json"), {
+ "generatedBy": "tools/tiled_export.py",
+ "modApi": mod_api,
+ "gameVersion": ">=%s <%d.0.0" % (engine, next_major),
+ # Tiled reports an enum-typed property as its INDEX into these lists,
+ # so the exporter needs them to recover the name a mod must carry
+ "propertyEnums": build_enums(maps, tilesets, palettes),
+ # what each map renders with today, so changing the property in the
+ # editor is what produces a `palette` on the exported record
+ "paletteByMap": map_palettes or {},
+ "blockPx": BLOCK_PX,
+ "cellPx": CELL_PX,
+ "tilePx": TILE_PX,
+ "blocksPerRow": BLOCKS_PER_ROW,
+ "modMapIndexBase": MOD_MAP_INDEX_BASE,
+ "nextModMapIndex": max(
+ [MOD_MAP_INDEX_BASE] +
+ [(m.get("index") or 0) + 1 for m in maps.values()
+ if (m.get("index") or 0) >= MOD_MAP_INDEX_BASE]),
+ "maps": baseline_maps,
+ "tilesets": baseline_tilesets,
+ })
+
+
+def write_session(out_dir, worlds):
+ """Seed .tiled-session so Tiled restores the overworld itself.
+
+ A loaded world is session state, and the session is the only place that can
+ say "this workspace has a world". Scripting cannot win the startup race:
+ extensions are evaluated in initializePluginsAndExtensions(), while the
+ session -- and with it WorldManager::loadWorlds(mLoadedWorlds) -- is
+ restored afterwards (mainwindow.cpp:1559), and the loaded set is only ever
+ captured on aboutToSwitchSession (:596). Putting the world in the session
+ up front uses Tiled's own restore path instead of racing it.
+
+ Merged, never clobbered: the session also holds the author's open files and
+ expanded folders, and a regenerate must not throw those away.
+ """
+ path = os.path.join(out_dir, "gen1.tiled-session")
+ session = {}
+ if os.path.exists(path):
+ try:
+ with open(path, encoding="utf-8") as handle:
+ session = json.load(handle)
+ except (OSError, ValueError):
+ session = {}
+
+ # ABSOLUTE paths: Session resolves relative paths for project, openFiles,
+ # activeFile, recentFiles, expandedProjectPaths and fileStates
+ # (session.cpp:64-72) -- and loadedWorlds is not on that list. A relative
+ # entry there is handed straight to QFile and resolved against the process
+ # working directory, so it silently fails to load.
+ # the session has to know which project it belongs to, or the project dock
+ # comes up with no folders to browse
+ session.setdefault("project", "gen1.tiled-project")
+
+ existing = session.get("loadedWorlds") or []
+ for world in worlds:
+ absolute = os.path.join(out_dir, world)
+ if absolute not in existing:
+ existing.append(absolute)
+ session["loadedWorlds"] = existing
+ write_json(path, session)
+ return existing
+
+
+README = """# Gen1 map workspace
+
+Generated by `tools/tiled_export.py` from the imported ROM cache. Everything
+here is derived content: it is gitignored, and regenerating is always safe.
+
+ python3 tools/tiled_export.py
+
+## Opening it
+
+Open `gen1.tiled-project` in Tiled. Open `kanto.world` to see the connected
+overworld stitched together and scroll between maps; open any `maps/*.tmj`
+to edit one map on its own.
+
+The project points `extensionsPath` at the Tiled fork's `extensions/`
+directory, so the "Gen1 mod" export format and the "Export Gen1 Mod" action
+load automatically.
+
+## What the layers mean
+
+- `blocks` -- the tile layer IS the map's `blocks` array. One Tiled tile is
+ one 32x32 gen1 block; gid = blockId + 1.
+- `warps`, `signs`, `objects` -- object layers on the 16px CELL grid (two
+ cells per block edge), which is the grid warps and NPCs are addressed on.
+
+Turn on View > Show Tile Collision Shapes to see real walkability: the red
+rectangles are cells whose feet tile is not in the tileset's `walkable` list.
+
+## Colors
+
+Each map is drawn in the SGB palette it renders with in game, so `tilesets/`
+holds one atlas per (tileset, palette) pair -- `blocks_OVERWORLD__PALLET`,
+`blocks_OVERWORLD__VIRIDIAN` and so on. They are the same blocks numbered
+identically, so blocks copied between maps of different palettes still work.
+
+A map's `palette` property is what it renders with. Change it and the export
+carries `palette = "..."` on the map record, which beats the vanilla cascade
+(`OverworldController.lua:506`). Magenta tiles are ROM padding, not art.
+
+Interiors have no palette of their own in the base game -- they inherit the last
+outdoor map you stood on -- so here they show the palette of the outdoor map
+they are reached from, which is the best a static editor can do.
+
+Regenerate with `--palette dmg` for one flat Game Boy green atlas instead.
+
+## Editing a vanilla map
+
+Edit it and export. Because the map carries `vanilla: true` and its `mapId`,
+the exporter diffs against `vanilla.json` and emits `mod.content.maps:patch`
+carrying only the fields you actually changed.
+
+## Authoring a new map
+
+File > New > New Map, 32x32 tile size, then set the map's Class to `Gen1Map`,
+fill in `mapId` / `label` / `tileset`, and leave `vanilla` false. The exporter
+emits `mod.content.maps:register` and assigns an index at or above 1000, which
+is the id range the loader reserves for mod maps.
+
+## Authoring new blocks
+
+`blocksets/.tmj` shows a tileset's blocks as raw 8x8 tiles, four by
+four per block, in the same order as the block atlas. Paint there to define new
+blocks; the exporter reads each 4x4 region back as one row of 16 tile ids.
+
+Collision is a property of the 8x8 TILE, not of the block -- the engine reads
+the tile at each cell's feet. Set those flags on the tiles of
+`tilesets/tiles_.tsj` (Class `Gen1Tile`); the exporter turns them into
+`walkable`, `waterTiles`, `doorTiles` and friends.
+
+A tile flagged `inherited` is getting that behavior from an engine fallback
+rather than from the tileset record (see `src/world/Map.lua`). A tileset that
+names the list itself wins outright, so a new tileset should flag its own.
+"""
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Build a Tiled workspace from the generated map data.")
+ parser.add_argument("--out", default=os.path.join(REPO, "build", "tiled"),
+ help="output directory (default build/tiled)")
+ parser.add_argument("--palette", default="game",
+ choices=["game"] + sorted(PALETTES),
+ help="game = each map in its own SGB palette (default); "
+ "dmg/mono = one flat palette everywhere")
+ parser.add_argument("--maps", default="",
+ help="comma-separated map ids; default every map")
+ parser.add_argument("--fork",
+ default=os.path.join(os.path.dirname(REPO),
+ "tiled_gen1recomp"),
+ help="path to the Tiled fork holding extensions/")
+ parser.add_argument("--clean", action="store_true",
+ help="remove the output directory first")
+ args = parser.parse_args()
+
+ out_dir = os.path.abspath(args.out)
+ if args.clean and os.path.isdir(out_dir):
+ shutil.rmtree(out_dir)
+ os.makedirs(out_dir, exist_ok=True)
+
+ maps = load_generated("maps")
+ tilesets = load_generated("tilesets")
+
+ wanted = [m.strip() for m in args.maps.split(",") if m.strip()]
+ if wanted:
+ missing = [m for m in wanted if m not in maps]
+ if missing:
+ sys.exit("unknown map id(s): %s" % ", ".join(missing))
+ selected = {m: maps[m] for m in wanted}
+ else:
+ selected = maps
+
+ palettes = load_generated("palettes") if args.palette == "game" else {}
+ map_palettes = resolve_map_palettes(maps) if args.palette == "game" else {}
+
+ # Which (tileset, palette) pairs any map actually renders with. There are
+ # only 37 across all of Kanto, so building a variant per pair is cheap and
+ # makes the editor show the colors the game will.
+ needed = {}
+ for map_id, map_def in maps.items():
+ needed.setdefault(map_def["tileset"], set()).add(map_palettes.get(map_id))
+
+ # every tileset gets its flat atlas too, so a new map can pick any tileset
+ # (and any palette) without a regenerate
+ stats = {}
+ missing_palettes = set()
+ for tileset_id in sorted(tilesets):
+ tileset = tilesets[tileset_id]
+ flags = TilesetFlags(tileset)
+ flat = PALETTES[args.palette if args.palette in PALETTES else "dmg"]
+
+ columns, _rows, block_count = write_blocks_tileset(
+ out_dir, tileset, flags, flat)
+ tile_count = write_tiles_tileset(out_dir, tileset, flags, flat)
+ write_blockset_map(out_dir, tileset, columns)
+ stats[tileset_id] = {"columns": columns, "tileCount": tile_count,
+ "blockCount": block_count}
+
+ for palette_name in sorted(n for n in needed.get(tileset_id, ()) if n):
+ colors = palette_colors(palettes, palette_name)
+ if not colors:
+ missing_palettes.add(palette_name)
+ continue
+ write_blocks_tileset(out_dir, tileset, flags, colors, palette_name)
+
+ for map_id in sorted(selected):
+ write_map(out_dir, selected[map_id], map_palettes.get(map_id))
+
+ worlds = write_worlds(out_dir, selected)
+ write_session(out_dir, ["%s.world" % name for name, _count in worlds])
+
+ extensions = os.path.join(os.path.abspath(args.fork), "extensions")
+ write_project(out_dir, maps, tilesets,
+ os.path.relpath(extensions, out_dir), palettes)
+ write_baseline(out_dir, maps, tilesets, stats, map_palettes, palettes)
+
+ with open(os.path.join(out_dir, "README.md"), "w", encoding="utf-8") as fh:
+ fh.write(README)
+
+ print("wrote %s" % out_dir)
+ print(" %d maps, %d tilesets (%s palette)"
+ % (len(selected), len(tilesets), args.palette))
+ if map_palettes:
+ variants = sum(len([n for n in names if n]) for names in needed.values())
+ print(" %d palette variants over %d named palettes"
+ % (variants, len(set(map_palettes.values()))))
+ if missing_palettes:
+ print(" note: no color data for %s; those maps use the flat atlas"
+ % ", ".join(sorted(missing_palettes)))
+ for name, count in worlds:
+ print(" %s.world: %d maps" % (name, count))
+ if not os.path.isdir(extensions):
+ print(" note: no extensions dir at %s yet" % extensions)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tools/yellow_symbol_aliases.py b/tools/yellow_symbol_aliases.py
new file mode 100644
index 00000000..7ffee89a
--- /dev/null
+++ b/tools/yellow_symbol_aliases.py
@@ -0,0 +1,223 @@
+"""Red→Yellow symbol / label remaps for make_yellow_manifest.py.
+
+Names present in both pokered and pokeyellow.sym are remapped by address
+only. This table covers Red symbol names that do not exist in Yellow:
+either an equivalent Yellow label, or None to drop the symbol (and strip
+text.labels / metadata references).
+"""
+
+from __future__ import annotations
+
+# Red symbol name -> Yellow symbol name, or None to omit.
+SYMBOL_ALIASES: dict[str, str | None] = {
+ # Map header
+ "CeruleanTradeHouse_h": "CeruleanMelaniesHouse_h",
+
+ # Cerulean City Slowbro -> Electrode
+ "_CeruleanCityCooltrainerF1SlowbroPunchText":
+ "_CeruleanCityCooltrainerF1ElectrodePunchText",
+ "_CeruleanCityCooltrainerF1SlowbroUseSonicboomText":
+ "_CeruleanCityCooltrainerF1ElectrodeUseSonicboomText",
+ "_CeruleanCityCooltrainerF1SlowbroWithdrawText":
+ "_CeruleanCityCooltrainerF1ElectrodeWithdrawText",
+ "_CeruleanCitySlowbroIgnoredOrdersText":
+ "_CeruleanCityElectrodeIgnoredOrdersText",
+ "_CeruleanCitySlowbroIsLoafingAroundText":
+ "_CeruleanCityElectrodeIsLoafingAroundText",
+ "_CeruleanCitySlowbroTookASnoozeText":
+ "_CeruleanCityElectrodeTookASnoozeText",
+ "_CeruleanCitySlowbroTurnedAwayText":
+ "_CeruleanCityElectrodeTurnedAwayText",
+
+ # Cerulean Trade House granny -> Melanie house
+ "_CeruleanTradeHouseGrannyText": "MelanieText1",
+
+ # Game Corner clerk / NPC renames
+ "_GameCornerClerk1CantAffordTheCoinsText":
+ "_GameCornerClerkCantAffordTheCoinsText",
+ "_GameCornerClerk1CoinCaseIsFullText":
+ "_GameCornerClerkCoinCaseIsFullText",
+ "_GameCornerClerk1DoYouNeedSomeGameCoinsText":
+ "_GameCornerClerkDoYouNeedSomeGameCoinsText",
+ "_GameCornerClerk1DontHaveCoinCaseText":
+ "_GameCornerClerkDontHaveCoinCaseText",
+ "_GameCornerClerk1PleaseComePlaySometimeText":
+ "_GameCornerClerkPleaseComePlaySometimeText",
+ "_GameCornerClerk1ThanksHereAre50CoinsText":
+ "_GameCornerClerkThanksHereAre50CoinsText",
+ "_GameCornerClerk2INeedMoreCoinsText":
+ "_GameCornerMiddleAgedMan2INeedMoreCoinsText",
+ "_GameCornerClerk2Received20CoinsText":
+ "_GameCornerMiddleAgedMan2Received20CoinsText",
+ "_GameCornerClerk2WantSomeCoinsText":
+ "_GameCornerMiddleAgedMan2WantSomeCoinsText",
+ "_GameCornerClerk2YouHaveLotsOfCoinsText":
+ "_GameCornerMiddleAgedMan2YouHaveLotsOfCoinsText",
+ "_GameCornerFishingGuruDontNeedMyCoinsText":
+ "_GameCornerFishingGuru1DontNeedMyCoinsText",
+ "_GameCornerFishingGuruReceived10CoinsText":
+ "_GameCornerFishingGuru1Received10CoinsText",
+ "_GameCornerFishingGuruWantToPlayText":
+ "_GameCornerFishingGuru1WantToPlayText",
+ "_GameCornerFishingGuruWinsComeAndGoText":
+ "_GameCornerFishingGuru1WinsComeAndGoText",
+ "_GameCornerGentlemanCloselyWatchTheReelsText":
+ "_GameCornerFishingGuru2CloselyWatchTheReelsText",
+ "_GameCornerGentlemanReceived20CoinsText":
+ "_GameCornerFishingGuru2Received20CoinsText",
+ "_GameCornerGentlemanThrowingMeOffText":
+ "_GameCornerFishingGuru2ThrowingMeOffText",
+ "_GameCornerGentlemanYouGotYourOwnCoinsText":
+ "_GameCornerFishingGuru2YouGotYourOwnCoinsText",
+
+ # Link / cable-club prompts (Yellow folds these into Colosseum texts)
+ "_LinkCanceledText": "_ColosseumCanceledText",
+ "_PleaseWaitText": "_ColosseumPleaseWaitText",
+ "_WhereWouldYouLikeText": "_ColosseumWhereToText",
+
+ # Mt. Moon Rocket1 -> Jessie/James
+ "_MtMoonB2FRocket1AfterBattleText": "_MtMoonJessieJamesText4",
+ "_MtMoonB2FRocket1BattleText": "_MtMoonJessieJamesText1",
+ "_MtMoonB2FRocket1EndBattleText": "_MtMoonJessieJamesText3",
+
+ # Oak's Lab starter-choice texts -> Yellow Pikachu/Eevee flow
+ "_OaksLabLastMonText": None,
+ "_OaksLabMonEnergeticText": None,
+ "_OaksLabOak1RaiseYourYoungPokemonText":
+ "_OaksLabOak1YouShouldTalkToIt",
+ "_OaksLabOak1WhichPokemonDoYouWantText":
+ "_OaksLabOak1GoAheadItsYours",
+ "_OaksLabReceivedMonText": "_OaksLabReceivedText",
+ "_OaksLabRivalGoAheadAndChooseText": None,
+ "_OaksLabRivalIllTakeThisOneText": "_OaksLabRivalTakesText1",
+ "_OaksLabRivalReceivedMonText": None,
+ "_OaksLabRivalWhatDidYouCallMeForText":
+ "_OaksLabRivalWhatAboutMeText",
+ "_OaksLabThoseArePokeBallsText": "_OaksLabThatsAPokeball",
+ "_OaksLabYouWantBulbasaurText": None,
+ "_OaksLabYouWantCharmanderText": None,
+ "_OaksLabYouWantSquirtleText": None,
+
+ # Pallet Town Oak
+ "_PalletTownOakItsUnsafeText": "_PalletTownOakHeyWaitDontGoOutText",
+
+ # Fan Club: Pikachu fan -> Clefairy fan; signs removed in Yellow
+ "_PokemonFanClubPikachuFanBetterText":
+ "_PokemonFanClubClefairyFanBetterText",
+ "_PokemonFanClubPikachuFanNormalText":
+ "_PokemonFanClubClefairyFanNormalText",
+ "_PokemonFanClubPikachuText": "_PokemonFanClubClefairyText",
+ "_PokemonFanClubSign1Text": None,
+ "_PokemonFanClubSign2Text": None,
+
+ # Pokemon Tower 7F Rockets -> Jessie/James
+ "_PokemonTower7FRocket1AfterBattleText":
+ "_PokemonTowerJessieJamesText4",
+ "_PokemonTower7FRocket1BattleText":
+ "_PokemonTowerJessieJamesText1",
+ "_PokemonTower7FRocket1EndBattleText":
+ "_PokemonTowerJessieJamesText3",
+ "_PokemonTower7FRocket2AfterBattleText":
+ "_PokemonTowerJessieJamesText4",
+ "_PokemonTower7FRocket2BattleText":
+ "_PokemonTowerJessieJamesText2",
+ "_PokemonTower7FRocket2EndBattleText":
+ "_PokemonTowerJessieJamesText3",
+ "_PokemonTower7FRocket3AfterBattleText":
+ "_PokemonTowerJessieJamesText4",
+ "_PokemonTower7FRocket3BattleText":
+ "_PokemonTowerJessieJamesText1",
+ "_PokemonTower7FRocket3EndBattleText":
+ "_PokemonTowerJessieJamesText3",
+
+ # Rocket Hideout B4F: Rocket1/2 -> Jessie/James; Rocket3 -> remaining Rocket
+ "_RocketHideoutB4FRocket1AfterBattleText":
+ "_RocketHideoutJessieJamesText4",
+ "_RocketHideoutB4FRocket1BattleText":
+ "_RocketHideoutJessieJamesText1",
+ "_RocketHideoutB4FRocket1EndBattleText":
+ "_RocketHideoutJessieJamesText3",
+ "_RocketHideoutB4FRocket2AfterBattleText":
+ "_RocketHideoutJessieJamesText4",
+ "_RocketHideoutB4FRocket2BattleText":
+ "_RocketHideoutJessieJamesText2",
+ "_RocketHideoutB4FRocket2EndBattleText":
+ "_RocketHideoutJessieJamesText3",
+ "_RocketHideoutB4FRocket3AfterBattleText":
+ "_RocketHideoutB4FRocketAfterBattleText",
+ "_RocketHideoutB4FRocket3BattleText":
+ "_RocketHideoutB4FRocketBattleText",
+ "_RocketHideoutB4FRocket3EndBattleText":
+ "_RocketHideoutB4FRocketEndBattleText",
+
+ # Route 6 shared after-battle -> M1-specific (F1 updated in manifest)
+ "_Route6CooltrainerAfterBattleText":
+ "_Route6CooltrainerM1AfterBattleText",
+
+ # Route 9 CooltrainerM1 -> AJ
+ "_Route9CooltrainerM1AfterBattleText": "_Route9AJAfterBattleText",
+ "_Route9CooltrainerM1BattleText": "_Route9AJBattleText",
+ "_Route9CooltrainerM1EndBattleText": "_Route9AJEndBattleText",
+
+ # Silph Co. unreferenced Porygon text
+ "_SilphCo10FPorygonText": None,
+
+ # Silph Co. 11F Rocket1 -> Jessie/James
+ "_SilphCo11FRocket1AfterBattleText": "_SilphCoJessieJamesText4",
+ "_SilphCo11FRocket1BattleText": "_SilphCoJessieJamesText1",
+ "_SilphCo11FRocket1EndBattleText": "_SilphCoJessieJamesText3",
+
+ # Viridian City old man post-training lines
+ "_ViridianCityOldManKnowHowToCatchPokemonText":
+ "_ViridianCityOldManHadMyCoffeeNowText",
+ "_ViridianCityOldManTimeIsMoneyText":
+ "_ViridianCityOldManLosingMyTouchText",
+
+ # Viridian Forest Youngster5 is a trainer in Yellow (no talk far-text)
+ "_ViridianForestYoungster5Text": None,
+
+ # Celadon Mansion granny (Yellow uses happiness-gated Text2..)
+ "_CeladonMansion1FGrannyText": "_CeladonMansion1Text2",
+}
+
+# Red FightIntro Gengar/Nidorino 2bpp labels — Yellow uses a different intro.
+# Omitted from symbols; RomExtractor must skip (see field.intro paths).
+OMIT_INTRO_SYMBOLS = (
+ "FightIntroBackMon",
+ "FightIntroFrontMon",
+ "FightIntroFrontMon2",
+ "FightIntroFrontMon3",
+)
+
+# Map-constant / label renames applied throughout the manifest.
+MAP_CONST_RENAMES = {
+ "CERULEAN_TRADE_HOUSE": "CERULEAN_MELANIES_HOUSE",
+}
+MAP_LABEL_RENAMES = {
+ "CeruleanTradeHouse": "CeruleanMelaniesHouse",
+}
+
+# Game Corner object / text-pointer id renames (Yellow single clerk + gurus).
+GAME_CORNER_ID_RENAMES = {
+ "TEXT_GAMECORNER_CLERK1": "TEXT_GAMECORNER_CLERK",
+ "TEXT_GAMECORNER_CLERK2": "TEXT_GAMECORNER_MIDDLE_AGED_MAN2",
+ "TEXT_GAMECORNER_FISHING_GURU": "TEXT_GAMECORNER_FISHING_GURU1",
+ "TEXT_GAMECORNER_GENTLEMAN": "TEXT_GAMECORNER_FISHING_GURU2",
+ "GAMECORNER_CLERK1": "GAMECORNER_CLERK",
+ "GAMECORNER_CLERK2": "GAMECORNER_MIDDLE_AGED_MAN2",
+ "GAMECORNER_FISHING_GURU": "GAMECORNER_FISHING_GURU1",
+ "GAMECORNER_GENTLEMAN": "GAMECORNER_FISHING_GURU2",
+ "GameCornerClerk1Text": "GameCornerClerkText",
+ "GameCornerClerk2Text": "GameCornerMiddleAgedMan2Text",
+ "GameCornerFishingGuruText": "GameCornerFishingGuru1Text",
+ "GameCornerGentlemanText": "GameCornerFishingGuru2Text",
+}
+
+FAN_CLUB_ID_RENAMES = {
+ "TEXT_POKEMONFANCLUB_PIKACHU_FAN": "TEXT_POKEMONFANCLUB_CLEFAIRY_FAN",
+ "TEXT_POKEMONFANCLUB_PIKACHU": "TEXT_POKEMONFANCLUB_CLEFAIRY",
+ "POKEMONFANCLUB_PIKACHU_FAN": "POKEMONFANCLUB_CLEFAIRY_FAN",
+ "POKEMONFANCLUB_PIKACHU": "POKEMONFANCLUB_CLEFAIRY",
+ "PokemonFanClubPikachuFanText": "PokemonFanClubClefairyFanText",
+ "PokemonFanClubPikachuText": "PokemonFanClubClefairyText",
+}