From e094b73536fd5720175ed47384588cc765c82b3c Mon Sep 17 00:00:00 2001 From: Colson Rice Date: Fri, 21 Aug 2026 23:08:26 -0400 Subject: [PATCH 1/2] Give Gen 2 the ROM text table Gen 1 has had all along Gold and Silver had no label-keyed string table at all. The manifests carried no text section, RomExtractorGen2 had no extractText, and game.data.text was never assigned, so every call through src/core/RomText.lua fell back to the literal written beside it. The only Gen 2 text the cache held was the script text in data/generated/text.lua, keyed by bank:address for the overworld VM, which nothing can look a battle line up in. make_gold_manifest.py now walks data/text/'s five dialogue files for their labels, the way make_rom_manifest.text_metadata walks pokered's, and embeds each one's symbol. 889 labels, all of them resolving in both editions. make_silver_manifest.py inherits the list unchanged and re-resolves the addresses from pokesilver.sym. RomExtractorGen2:extractText decodes them into data/generated/rom_text.lua. The mechanism is the one extractOakSpeech already used for _OakText1-7: resolve the label, decode from the cart, key by name. What is new is that the list comes from the manifest rather than being written out in Lua, so all of data/text/ arrives instead of seven strings. decodeGen2Text also emits the three runtime name slots it used to drop. PlaceMoveUsersName, PlaceMoveTargetsName and PlaceEnemysName (home/text.asm) substitute a battler's name as the line prints, so , and are markers, not glyphs. Skipped as control glyphs, SubTookDamageText decoded as "The SUBSTITUTE / took damage for" with nothing after it. Game2:load assigns the table to self.data.text, which is what makes the existing shared RomText helper work on Gold and Silver at all. The new cache file is listed in the Gold override rather than bumping CACHE_FORMAT, so caches built before this stage re-import themselves and Red, Blue and Yellow are left alone. --- src/core/Game2.lua | 6 + src/import/RomExtractorGen2.lua | 48 +- src/import/RomImporter.lua | 6 + tests/gen2_diploma_test.lua | 2 +- tests/gen2_rom_text_test.lua | 139 ++ tests/gen2_trade_gfx_test.lua | 2 +- tests/run_tests.lua | 1 + tools/make_gold_manifest.py | 66 +- tools/rom_manifest_gold.json | 4049 +++++++++++++++++++++++++++++++ tools/rom_manifest_silver.json | 4049 +++++++++++++++++++++++++++++++ 10 files changed, 8361 insertions(+), 7 deletions(-) create mode 100644 tests/gen2_rom_text_test.lua diff --git a/src/core/Game2.lua b/src/core/Game2.lua index 8b87ed00..e5edaa4f 100644 --- a/src/core/Game2.lua +++ b/src/core/Game2.lua @@ -943,6 +943,12 @@ function Game2:load() self.data.gen2Scripts = loadGenerated("data/generated/scripts.lua") self.data.gen2StdScripts = loadGenerated("data/generated/std_scripts.lua") self.data.gen2Text = loadGenerated("data/generated/text.lua") + -- The engine's own strings, keyed by the disassembly's label. gen2Text + -- above is the script text and is keyed by bank:address for the overworld + -- VM, so the two are different tables and both are loaded. This one is + -- what src/core/RomText.lua reads, which is why it lands on `text`: that + -- helper is shared with Gen 1 and looks up data.text[label]. + self.data.text = loadGenerated("data/generated/rom_text.lua") or {} -- data/generated/events.lua: the side tables a script command NAMES rather -- than carries -- the phone book, the in-game trades, the elevator's floor -- labels, the decoration descriptions. Keyed for World's own `eventTables` diff --git a/src/import/RomExtractorGen2.lua b/src/import/RomExtractorGen2.lua index 683ccb24..1ad47af4 100644 --- a/src/import/RomExtractorGen2.lua +++ b/src/import/RomExtractorGen2.lua @@ -27,7 +27,7 @@ RomExtractorGen2.__index = RomExtractorGen2 -- scripts, pokemon, moves, items, marts, encounters, trainers, pokedex, -- landmarks, intro movie, menu gfx, title, credits, diploma, trade animation, -- audio, stubs -local STAGE_COUNT = 26 +local STAGE_COUNT = 27 local Opcodes = require("src.script.gen2.Opcodes") -- BG palette slots inside one loaded 8-palette set (constants/tileset_constants.asm @@ -136,6 +136,18 @@ local TEXT_NO_GLYPH = { [0x13] = true, [0x15] = true, } +-- The three runtime name slots. PlaceMoveUsersName, PlaceMoveTargetsName and +-- PlaceEnemysName (home/text.asm:302, :307, :327) swap these for a battler's +-- own name as the line prints, so they are markers rather than glyphs. They +-- decode to the same shape Gen 1 uses, which src/core/RomText.lua already +-- fills in argument order. Dropped, SubTookDamageText read "took damage +-- for" with nothing after it. +local NAME_SLOT = { + [""] = "{USER}", + [""] = "{TARGET}", + [""] = "{ENEMY}", +} + local ROOF_TILES = 9 local SPRITEDATA_LENGTH = 6 @@ -2596,6 +2608,8 @@ function RomExtractorGen2:decodeGen2Text(bank, address, charmap, buffers) out[#out + 1] = ch elseif ch == "<……>" or b == 0x56 then out[#out + 1] = "……" + elseif NAME_SLOT[ch] then + out[#out + 1] = NAME_SLOT[ch] elseif not ch then out[#out + 1] = ("{BYTE:%02X}"):format(b) end @@ -3698,6 +3712,37 @@ function RomExtractorGen2:splashGfx() } end +-- The engine's own strings, keyed by the label the disassembly gives them. +-- +-- This is what extractOakSpeech has always done for _OakText1-7: resolve the +-- label, decode from the cart, key by name. What is new is that the list of +-- labels comes from the manifest instead of being written out here, so all of +-- data/text/ arrives rather than seven strings. Gen 1 has had the same table +-- since RomExtractor:extractText; this is the Gen 2 side of it, and it is +-- what lets src/core/RomText.lua work on Gold and Silver at all. +-- +-- Written as `rom_text` rather than `text`: data/generated/text.lua is +-- already the script text, keyed by bank:address for the overworld VM, and +-- these are a different table with different keys. +function RomExtractorGen2:extractText() + self:beginStage("Dialogue") + local charmap = self.manifest.charmap or {} + local labels = (self.manifest.text or {}).labels or {} + local texts = {} + for index, label in ipairs(labels) do + local location = self.symbols[label] + -- A label the manifest names but the symbol table does not carry would + -- be a generator bug, not a cart difference: make_gold_manifest.py + -- resolves every one of these before it writes the list. + if location then + texts[label] = self:decodeGen2Text(location[1], location[2], charmap) + end + self:tick("Dialogue", index, #labels) + end + self:write("rom_text", texts) + return texts +end + -- OakSpeech (engine/menus/intro_menu.asm): named _OakText* strings plus the -- POKEMON_PROF / CAL trainer pics shown before NamePlayer. Also pulls -- Shrink1/2 pics and the GameFreak splash sheets for the boot cinema. @@ -6283,6 +6328,7 @@ function RomExtractorGen2:run() results.sprites = self:extractSprites() results.stdScripts = self:extractStdScripts() results.scripts = self:extractScriptsAndText(results.maps, results.stdScripts) + results.text = self:extractText() results.pokemon = self:extractPokemon() results.moves = self:extractMoves() results.items = self:extractItems() diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua index 2c303fac..22274747 100644 --- a/src/import/RomImporter.lua +++ b/src/import/RomImporter.lua @@ -104,6 +104,12 @@ local VERSION_REQUIRED_FILES_OVERRIDE = { "data/generated/sprites.lua", -- OW sheets (Chris + NPCs) "data/generated/scripts.lua", -- disassembled map scripts "data/generated/text.lua", -- decoded Gen 2 dialogue strings + -- The engine's own strings, keyed by label rather than by address. A + -- cache built before RomExtractorGen2:extractText has none, and every + -- line that reads through src/core/RomText.lua would silently keep + -- printing its Lua fallback, so this re-imports those caches rather than + -- bumping CACHE_FORMAT and dragging Red, Blue and Yellow through it too. + "data/generated/rom_text.lua", "data/generated/pokemon.lua", "data/generated/tilesets.lua", "data/generated/audio.lua", diff --git a/tests/gen2_diploma_test.lua b/tests/gen2_diploma_test.lua index 151d12d8..3f670afd 100644 --- a/tests/gen2_diploma_test.lua +++ b/tests/gen2_diploma_test.lua @@ -42,7 +42,7 @@ check(type(RomExtractorGen2.extractDiploma) == "function", "RomExtractorGen2:extractDiploma exists") check(extractorSource:find("results.diploma = self:extractDiploma()", 1, true) ~= nil, "and RomExtractorGen2:run calls it") -check(extractorSource:find("local STAGE_COUNT = 26", 1, true) ~= nil, +check(extractorSource:find("local STAGE_COUNT = 27", 1, true) ~= nil, "STAGE_COUNT counts the new stage, so the progress bar still ends at 1") -- The three symbols the stage reads have to be in the curated manifest set or diff --git a/tests/gen2_rom_text_test.lua b/tests/gen2_rom_text_test.lua new file mode 100644 index 00000000..8ffefcc5 --- /dev/null +++ b/tests/gen2_rom_text_test.lua @@ -0,0 +1,139 @@ +-- Gen 2's engine text, the counterpart to Gen 1's data/generated/text.lua. +-- +-- Gold and Silver had no label-keyed string table at all: the manifests +-- carried no `text` section, RomExtractorGen2 had no extractText, and +-- game.data.text was never assigned, so every call through +-- src/core/RomText.lua fell back to the literal written beside it. These +-- cover the three halves of closing that: the manifest names the labels and +-- resolves every one, the decoder emits the runtime name slots rather than +-- dropping them, and RomText fills those slots. +-- +-- GOLD_CACHE="..." luajit tests/gen2_rom_text_test.lua +-- +-- ROM-free apart from the last section, which reads an imported cache's +-- rom_text.lua and skips cleanly when there is none. +package.path = "./?.lua;./?/init.lua;" .. package.path + +local S = require("tests.harness").suite("gen2 rom text") +local check, eq = S.check, S.eq + +love = require("tests.love_stub") + +local Json = require("src.link.Json") +local romText = require("src.core.RomText") + +local function manifest(path) + local file = assert(io.open(path, "r")) + local data = assert(Json.decode(file:read("*a"))) + file:close() + return data +end + +-- ---- the label list, and that every label resolves ------------------------ +-- A label the list names but the symbol table cannot place would fail the +-- import at the Dialogue stage rather than at generation time, so the pairing +-- is asserted here instead. +for _, edition in ipairs({ "gold", "silver" }) do + local data = manifest("tools/rom_manifest_" .. edition .. ".json") + local labels = (data.text or {}).labels or {} + check((data.text or {}).labels ~= nil, + edition .. " carries a text section") + check(#labels > 800, + ("%s names %d text labels"):format(edition, #labels)) + + local unresolved = {} + for _, label in ipairs(labels) do + if not data.symbols[label] then unresolved[#unresolved + 1] = label end + end + eq(#unresolved, 0, + ("every %s text label resolves to a symbol (%s)") + :format(edition, table.concat(unresolved, ", "):sub(1, 60))) + + local named = {} + for _, label in ipairs(labels) do named[label] = true end + + -- data/text/ also holds keyboard layouts and kana tables. Decoded as text + -- they come out as keyboard rows, so make_gold_manifest.TEXT_SOURCES leaves + -- their files out. `BattleText::` is excluded for a different reason: it + -- is a bank anchor sharing an address with the first real label under it, + -- and its own comment in the disassembly says so. + for _, excluded in ipairs({ "NameInputLower", "MailEntry_Uppercase", + "Dakutens", "Gen1TrainerClassNames", "BattleText" }) do + check(not named[excluded], + edition .. " leaves " .. excluded .. " out of the text list") + end +end + +-- Both editions describe the same strings; only the addresses move. +do + local gold = (manifest("tools/rom_manifest_gold.json").text or {}).labels or {} + local silver = + (manifest("tools/rom_manifest_silver.json").text or {}).labels or {} + eq(#gold, #silver, "Gold and Silver name the same number of labels") + local mismatch + for index, label in ipairs(gold) do + if silver[index] ~= label then mismatch = label; break end + end + eq(mismatch, nil, "and the same labels in the same order") +end + +-- ---- the slots RomText fills ---------------------------------------------- +-- decodeGen2Text emits {USER}, {TARGET} and {ENEMY} for the three names +-- PlaceMoveUsersName / PlaceMoveTargetsName / PlaceEnemysName write at +-- runtime (home/text.asm:302, :307, :327). Dropped, the line printed with a +-- hole where the name belongs. +do + local data = { text = { + SubTookDamageText = "The SUBSTITUTE\ntook damage for\v{TARGET}!", + WantsToBattleText = "{ENEMY}\nwants to battle!", + ConfusedNoMoreText = "{USER}'s\nconfused no more!", + SuperEffectiveText = "It's super-\neffective!", + } } + + eq(romText(data, "SubTookDamageText", "fallback", "GEODUDE"), + "The SUBSTITUTE\ntook damage for\vGEODUDE!", + "a {TARGET} slot takes the name the caller passes") + eq(romText(data, "WantsToBattleText", "fallback", "FALKNER"), + "FALKNER\nwants to battle!", "and so does {ENEMY}") + eq(romText(data, "ConfusedNoMoreText", "fallback", "CYNDAQUIL"), + "CYNDAQUIL's\nconfused no more!", "and {USER}") + eq(romText(data, "SuperEffectiveText", "It's super effective!"), + "It's super-\neffective!", + "a line with no slot comes back as the cart wrote it") + eq(romText(data, "NoSuchLabel", "the engine's own wording"), + "the engine's own wording", + "and a label the cache does not carry falls back") +end + +-- ---- against a real imported cache ---------------------------------------- +do + local cache = os.getenv("GOLD_CACHE") + if not cache then + local home = os.getenv("HOME") or "" + cache = home .. "/Library/Application Support/LOVE/gold-dev/gold" + end + local path = cache .. "/data/generated/rom_text.lua" + local file = io.open(path, "r") + if not file then + print(" (skipped: no rom_text.lua at " .. path .. ")") + else + file:close() + local texts = assert(loadfile(path))() + check(next(texts) ~= nil, "the imported cache carries strings") + -- Wording taken from pokegold's data/text/battle.asm, with \n for `line` + -- and \v for `cont`, which is what RomExtractorGen2 decodes those to. + eq(texts.SuperEffectiveText, "It's super-\neffective!", + "SuperEffectiveText comes off the cart hyphenated and broken") + eq(texts.NotVeryEffectiveText, "It's not very\neffective…", + "NotVeryEffectiveText ends on the ellipsis glyph") + eq(texts.StartPerishText, "Both POKéMON will\nfaint in 3 turns!", + "StartPerishText names both sides") + eq(texts.ButItFailedText, "But it failed!", "and a one-row line is one row") + eq(texts.SubTookDamageText, "The SUBSTITUTE\ntook damage for\v{TARGET}!", + "SpikesText's neighbour keeps its cont row and its target slot") + eq(texts.PlayerHitTimesText, "Hit {NUM} times!", + "a text_decimal reads back as {NUM}") + end +end + +S.finish() diff --git a/tests/gen2_trade_gfx_test.lua b/tests/gen2_trade_gfx_test.lua index 3c08d245..2fbded88 100644 --- a/tests/gen2_trade_gfx_test.lua +++ b/tests/gen2_trade_gfx_test.lua @@ -45,7 +45,7 @@ check(type(RomExtractorGen2.extractTrade) == "function", "RomExtractorGen2:extractTrade exists") check(extractorSource:find("results.trade = self:extractTrade()", 1, true) ~= nil, "and RomExtractorGen2:run calls it") -check(extractorSource:find("local STAGE_COUNT = 26", 1, true) ~= nil, +check(extractorSource:find("local STAGE_COUNT = 27", 1, true) ~= nil, "STAGE_COUNT counts the new stage, so the progress bar still ends at 1") -- pokegold.sym, bank $0a. These are also what the cache is checked against diff --git a/tests/run_tests.lua b/tests/run_tests.lua index 4ba9ccff..ec3c101c 100644 --- a/tests/run_tests.lua +++ b/tests/run_tests.lua @@ -3526,6 +3526,7 @@ runSuites({ "tests/gen2_decorations_test.lua", "tests/gen2_pokerus_test.lua", "tests/gen2_common_text_test.lua", + "tests/gen2_rom_text_test.lua", "tests/gen2_magnet_train_test.lua", "tests/gen2_bank_of_mom_test.lua", "tests/gen2_trainerhouse_test.lua", diff --git a/tools/make_gold_manifest.py b/tools/make_gold_manifest.py index 656c9f99..074e7811 100644 --- a/tools/make_gold_manifest.py +++ b/tools/make_gold_manifest.py @@ -907,9 +907,62 @@ REQUIRED_SYMBOLS = { } -def embedded_symbols(symbols, pokemon_labels, song_labels=()): - """Resolve REQUIRED_SYMBOLS + pic labels + Music_* song headers.""" - names = set(REQUIRED_SYMBOLS) | set(pokemon_labels) | set(song_labels) +# The engine's own text, the counterpart to make_rom_manifest.text_metadata. +# +# Only these five carry dialogue. data/text/'s other files are character +# tables rather than strings: dakutens.asm and name_input_chars.asm / +# mail_input_chars.asm are keyboard layouts, and unused_gen1_trainer_names.asm +# is a dead Gen 1 leftover. Decoding those as text yields keyboard rows and +# kana runs, so they are left out by name rather than filtered afterwards. +# +# None of the five carries an IF DEF(_GOLD) / IF DEF(_SILVER) arm, so the +# label set is one list for both editions and make_silver_manifest.py inherits +# it with the addresses re-resolved from pokesilver.sym. +TEXT_SOURCES = ( + "battle.asm", + "common_1.asm", + "common_2.asm", + "common_3.asm", + "std_text.asm", +) + + +def text_labels(pokegold): + """Every text label in TEXT_SOURCES, in sorted order. + + Unlike Gen 1 there is no `dynamic` map beside this. pokered's decoder is + told which runtime token each label carries; RomExtractorGen2's reads the + cart's own TX_RAM / TX_DECIMAL command bytes and emits {STRBUF} / {NUM} + itself, so the label alone is enough. + """ + labels = set() + for name in TEXT_SOURCES: + path = os.path.join(pokegold, "data/text", name) + pending = None + for _, line in read_asm(path): + stripped = line.strip() + if not stripped: + continue + match = re.match(r"(\w+)::?\s*$", stripped) + if match: + # A label whose next line is another label owns no string of + # its own. `BattleText::` is the one in this set: its own + # comment says "used only for BANK(BattleText)", and it shares + # an address with the first real label under it, so taking it + # would decode that neighbour's string a second time. + pending = match.group(1) + continue + if pending: + labels.add(pending) + pending = None + return sorted(labels) + + +def embedded_symbols(symbols, pokemon_labels, song_labels=(), + text_label_names=()): + """Resolve REQUIRED_SYMBOLS + pic labels + songs + text labels.""" + names = (set(REQUIRED_SYMBOLS) | set(pokemon_labels) + | set(song_labels) | set(text_label_names)) for symbol_name in symbols.by_name: # Pokedex entries are split across four banks and the game derives the # bank arithmetically from the species id (radio.asm's rlca/maskbits @@ -1111,6 +1164,7 @@ def generate(pokegold, symbols_path): pokemon_labels.append(asset["backLabel"]) songs = music_order(pokegold) + text_label_names = text_labels(pokegold) sfx = sfx_order(pokegold) # Index 0 is NO_ITEM, so the parsed list is already 1-based on item id. @@ -1202,6 +1256,9 @@ def generate(pokegold, symbols_path): "battleAnimBgPaletteOrder": battle_anim_bg_pals, "battleAnimObPaletteOrder": battle_anim_ob_pals, }, + # Label -> decoded string is built at import time from these, the + # same way Gen 1 builds data/generated/text.lua from its own list. + "text": {"labels": text_label_names}, "charmap": charmap(pokegold), "fontCharmap": font_extract.parse_charmap(pokegold), "pokemonAssets": assets, @@ -1210,7 +1267,8 @@ def generate(pokegold, symbols_path): "maps": {name: map_groups[name] for name in map_order}, "tilesets": {name: {} for name in tilesets}, } - data["symbols"] = embedded_symbols(symbols, pokemon_labels, songs) + data["symbols"] = embedded_symbols( + symbols, pokemon_labels, songs, text_label_names) return data diff --git a/tools/rom_manifest_gold.json b/tools/rom_manifest_gold.json index 8c250e00..333445da 100644 --- a/tools/rom_manifest_gold.json +++ b/tools/rom_manifest_gold.json @@ -12712,6 +12712,22 @@ 16, 19557 ], + "AlreadyAsleepText": [ + 64, + 23414 + ], + "AlreadyConfusedText": [ + 64, + 22417 + ], + "AlreadyParalyzedText": [ + 64, + 24391 + ], + "AlreadyPoisonedText": [ + 64, + 23471 + ], "AmpharosBackpic": [ 29, 25057 @@ -12816,6 +12832,30 @@ 106, 18033 ], + "AskNumber1FText": [ + 64, + 19476 + ], + "AskNumber1MText": [ + 64, + 19144 + ], + "AskNumber2FText": [ + 64, + 19575 + ], + "AskNumber2MText": [ + 64, + 19229 + ], + "AttackMissed2Text": [ + 64, + 23016 + ], + "AttackMissedText": [ + 64, + 22997 + ], "AzumarillBackpic": [ 29, 32162 @@ -12832,6 +12872,10 @@ 9, 25135 ], + "BadlyPoisonedText": [ + 64, + 23451 + ], "BargainShopData": [ 5, 24282 @@ -12860,6 +12904,178 @@ 2, 23561 ], + "BattleText_AnEGGCantBattle": [ + 64, + 21740 + ], + "BattleText_CantEscape": [ + 64, + 21862 + ], + "BattleText_CantEscape2": [ + 64, + 21761 + ], + "BattleText_EnemyFled": [ + 64, + 20885 + ], + "BattleText_EnemyIsAboutToUseWillPlayerChangeMon": [ + 64, + 21648 + ], + "BattleText_EnemyMonFainted": [ + 64, + 21358 + ], + "BattleText_EnemySentOut": [ + 64, + 21694 + ], + "BattleText_EnemyWasDefeated": [ + 64, + 21408 + ], + "BattleText_GotAwaySafely": [ + 64, + 21821 + ], + "BattleText_ItemHealedConfusion": [ + 64, + 22384 + ], + "BattleText_ItemsCantBeUsedHere": [ + 64, + 21945 + ], + "BattleText_MonCantBeRecalled": [ + 64, + 21992 + ], + "BattleText_MonFainted": [ + 64, + 21563 + ], + "BattleText_MonHasNoMovesLeft": [ + 64, + 22072 + ], + "BattleText_MonIsAlreadyOut": [ + 64, + 21971 + ], + "BattleText_MonsLightScreenFell": [ + 64, + 21165 + ], + "BattleText_MonsReflectFaded": [ + 64, + 21195 + ], + "BattleText_PlayerPickedUpPayDayMoney": [ + 64, + 20748 + ], + "BattleText_RainContinuesToFall": [ + 64, + 21221 + ], + "BattleText_SafeguardFaded": [ + 64, + 21144 + ], + "BattleText_StringBuffer1GrewToLevel": [ + 64, + 22114 + ], + "BattleText_TargetRecoveredWithItem": [ + 64, + 21062 + ], + "BattleText_TargetWasHitByFutureSight": [ + 64, + 21116 + ], + "BattleText_TargetsEncoreEnded": [ + 64, + 22096 + ], + "BattleText_TheMoveIsDisabled": [ + 64, + 22049 + ], + "BattleText_TheRainStopped": [ + 64, + 21293 + ], + "BattleText_TheSandstormRages": [ + 64, + 21271 + ], + "BattleText_TheSandstormSubsided": [ + 64, + 21333 + ], + "BattleText_TheSunlightFaded": [ + 64, + 21312 + ], + "BattleText_TheSunlightIsStrong": [ + 64, + 21246 + ], + "BattleText_TheresNoEscapeFromTrainerBattle": [ + 64, + 21775 + ], + "BattleText_TheresNoPPLeftForThisMove": [ + 64, + 22015 + ], + "BattleText_TheresNoWillToBattle": [ + 64, + 21713 + ], + "BattleText_UseNextMon": [ + 64, + 21577 + ], + "BattleText_UserFledUsingAStringBuffer1": [ + 64, + 21839 + ], + "BattleText_UserHurtBySpikes": [ + 64, + 21876 + ], + "BattleText_UserRecoveredPPUsing": [ + 64, + 21087 + ], + "BattleText_UserWasReleasedFromStringBuffer1": [ + 64, + 22458 + ], + "BattleText_UsersHurtByStringBuffer1": [ + 64, + 22439 + ], + "BattleText_UsersStringBuffer1Activated": [ + 64, + 21924 + ], + "BattleText_WildFled": [ + 64, + 20867 + ], + "BattleText_WildMonIsAngry": [ + 64, + 22166 + ], + "BattleText_WildMonIsEating": [ + 64, + 22143 + ], "BattleWinSlideInEnemyTrainerFrontpic": [ 15, 27158 @@ -12876,6 +13092,14 @@ 106, 19025 ], + "BeatUpAttackText": [ + 64, + 25058 + ], + "BecameConfusedText": [ + 64, + 22364 + ], "BeedrillBackpic": [ 24, 17173 @@ -12888,6 +13112,14 @@ 104, 17941 ], + "BeganToNapText": [ + 64, + 22758 + ], + "BellChimedText": [ + 64, + 23381 + ], "BellossomBackpic": [ 26, 25968 @@ -12912,6 +13144,10 @@ 105, 16837 ], + "BellyDrumText": [ + 64, + 24967 + ], "BillsPCOrangePalette": [ 2, 21965 @@ -12928,6 +13164,10 @@ 104, 17276 ], + "BlewSpikesText": [ + 64, + 24899 + ], "BlisseyBackpic": [ 29, 30565 @@ -12940,14 +13180,26 @@ 107, 21761 ], + "BlownAwayText": [ + 64, + 23687 + ], "BoltEmote": [ 5, 17737 ], + "BracedItselfText": [ + 64, + 24750 + ], "BugCatchingContestantEventFlagTable": [ 4, 32186 ], + "BugContestPrizeNoRoomText": [ + 64, + 20500 + ], "BulbasaurBackpic": [ 28, 32477 @@ -12960,6 +13212,10 @@ 104, 16384 ], + "ButItFailedText": [ + 64, + 24229 + ], "ButterfreeBackpic": [ 21, 21096 @@ -12976,6 +13232,10 @@ 26, 26667 ], + "CantEscapeNowText": [ + 64, + 24492 + ], "CardFlipLZ01": [ 56, 21795 @@ -13112,6 +13372,10 @@ 48, 16384 ], + "ClampedByText": [ + 64, + 22542 + ], "ClefableBackpic": [ 22, 24685 @@ -13164,10 +13428,82 @@ 105, 19293 ], + "CoinVendor_Buy500CoinsText": [ + 64, + 20375 + ], + "CoinVendor_Buy50CoinsText": [ + 64, + 20344 + ], + "CoinVendor_CancelText": [ + 64, + 20469 + ], + "CoinVendor_CoinCaseFullText": [ + 64, + 20436 + ], + "CoinVendor_IntroText": [ + 64, + 20267 + ], + "CoinVendor_NoCoinCaseText": [ + 64, + 20196 + ], + "CoinVendor_NotEnoughMoneyText": [ + 64, + 20407 + ], + "CoinVendor_WelcomeText": [ + 64, + 20167 + ], + "CoinsScatteredText": [ + 64, + 24042 + ], + "ConfusedNoMoreText": [ + 64, + 22342 + ], "ContestMons": [ 37, 31672 ], + "ContestResults_ConsolationPrizeText": [ + 64, + 19913 + ], + "ContestResults_DidNotWinText": [ + 64, + 19967 + ], + "ContestResults_JoinUsNextTimeText": [ + 64, + 19875 + ], + "ContestResults_PartyFullText": [ + 64, + 20053 + ], + "ContestResults_PlayerWonAPrizeText": [ + 64, + 19818 + ], + "ContestResults_ReadyToJudgeText": [ + 64, + 19046 + ], + "ContestResults_ReturnPartyText": [ + 64, + 20001 + ], + "CopiedStatsText": [ + 64, + 25003 + ], "CopyBackpic": [ 15, 31090 @@ -13188,6 +13524,14 @@ 107, 19589 ], + "CoveredByVeilText": [ + 64, + 24785 + ], + "CrashedText": [ + 64, + 23035 + ], "CreditsBellossomGFX": [ 33, 27958 @@ -13216,6 +13560,10 @@ 58, 20882 ], + "CriticalHitText": [ + 64, + 23099 + ], "CrobatBackpic": [ 29, 30296 @@ -13280,6 +13628,10 @@ 9, 29015 ], + "DefrostedOpponentText": [ + 64, + 23552 + ], "DelibirdBackpic": [ 26, 28406 @@ -13292,6 +13644,10 @@ 107, 19906 ], + "DestinyBondEffectText": [ + 64, + 23307 + ], "DewgongBackpic": [ 30, 25464 @@ -13304,6 +13660,18 @@ 105, 18846 ], + "DidntAffect1Text": [ + 64, + 24257 + ], + "DidntAffect2Text": [ + 64, + 24277 + ], + "DifficultBookshelfText": [ + 64, + 18433 + ], "DiglettBackpic": [ 30, 30978 @@ -13328,6 +13696,14 @@ 2, 31366 ], + "DisabledMoveText": [ + 64, + 22711 + ], + "DisabledNoMoreText": [ + 64, + 22270 + ], "DittoBackpic": [ 30, 19507 @@ -13364,6 +13740,10 @@ 105, 18490 ], + "DoesntAffectText": [ + 64, + 23078 + ], "DoneTileAnimation": [ 63, 17058 @@ -13380,6 +13760,14 @@ 107, 20667 ], + "DownpourText": [ + 64, + 24920 + ], + "DraggedOutText": [ + 64, + 24313 + ], "DragonairBackpic": [ 28, 25841 @@ -13420,6 +13808,10 @@ 4, 19964 ], + "DreamEatenText": [ + 64, + 23516 + ], "DrowzeeBackpic": [ 30, 21286 @@ -13540,10 +13932,22 @@ 4, 31045 ], + "EliminatedStatsText": [ + 64, + 24107 + ], + "EnduredText": [ + 64, + 22629 + ], "EnemyHPBarBorderGFX": [ 62, 19378 ], + "EnemyHitTimesText": [ + 64, + 23725 + ], "EnteiBackpic": [ 29, 26732 @@ -13572,6 +13976,10 @@ 107, 16728 ], + "EvadedText": [ + 64, + 23996 + ], "EvosAttacksPointers": [ 16, 26557 @@ -13620,6 +14028,10 @@ 105, 18372 ], + "FastAsleepText": [ + 64, + 22188 + ], "FearowBackpic": [ 30, 22036 @@ -13632,6 +14044,14 @@ 104, 18743 ], + "FellAsleepText": [ + 64, + 23398 + ], + "FellInLoveText": [ + 64, + 24768 + ], "FeraligatrBackpic": [ 22, 25968 @@ -13676,10 +14096,22 @@ 106, 17160 ], + "FledFromBattleText": [ + 64, + 23649 + ], + "FledInFearText": [ + 64, + 23670 + ], "FlickeringCaveEntrancePalette": [ 63, 17709 ], + "FlinchedText": [ + 64, + 22239 + ], "Font": [ 62, 17138 @@ -13700,6 +14132,10 @@ 62, 21262 ], + "ForesawAttackText": [ + 64, + 25036 + ], "ForretressBackpic": [ 46, 17219 @@ -13716,6 +14152,14 @@ 62, 18674 ], + "FrozenSolidText": [ + 64, + 22219 + ], + "FullyParalyzedText": [ + 64, + 24370 + ], "FurretBackpic": [ 26, 18539 @@ -13800,6 +14244,10 @@ 15, 31064 ], + "GettingPumpedText": [ + 64, + 23789 + ], "GirafarigBackpic": [ 25, 16384 @@ -13884,6 +14332,14 @@ 105, 17595 ], + "GotAnEncoreText": [ + 64, + 23230 + ], + "GotMoneyForWinningText": [ + 64, + 21380 + ], "GranbullBackpic": [ 28, 23053 @@ -13952,6 +14408,14 @@ 106, 16493 ], + "GymStatue_CityGymText": [ + 64, + 20118 + ], + "GymStatue_WinningTrainersText": [ + 64, + 20132 + ], "HOF_SlideBackpic": [ 33, 26135 @@ -13968,10 +14432,38 @@ 62, 19410 ], + "HPIsFullText": [ + 64, + 24297 + ], + "HappinessText1": [ + 64, + 20689 + ], + "HappinessText2": [ + 64, + 20636 + ], + "HappinessText3": [ + 64, + 20594 + ], "HappyEmote": [ 5, 17545 ], + "HasANightmareText": [ + 64, + 20968 + ], + "HasNoPPLeftText": [ + 64, + 22895 + ], + "HasSubstituteText": [ + 64, + 23853 + ], "HaunterBackpic": [ 28, 17990 @@ -14064,6 +14556,14 @@ 56, 24760 ], + "HomepageText": [ + 64, + 18800 + ], + "HookedPokemonAttackedText": [ + 64, + 20792 + ], "HoothootBackpic": [ 27, 29087 @@ -14124,6 +14624,26 @@ 107, 20245 ], + "HungOnText": [ + 64, + 22606 + ], + "HurtByBurnText": [ + 64, + 20926 + ], + "HurtByCurseText": [ + 64, + 20988 + ], + "HurtByPoisonText": [ + 64, + 20904 + ], + "HurtItselfText": [ + 64, + 22308 + ], "HypnoBackpic": [ 23, 29080 @@ -14144,6 +14664,10 @@ 35, 27326 ], + "IdentifiedText": [ + 64, + 24678 + ], "IgglybuffBackpic": [ 29, 31368 @@ -14156,6 +14680,30 @@ 106, 21350 ], + "IgnoredOrders2Text": [ + 64, + 25098 + ], + "IgnoredOrdersText": [ + 64, + 22811 + ], + "IgnoredSleepingText": [ + 64, + 22832 + ], + "InLoveWithText": [ + 64, + 22649 + ], + "IncenseBurnerText": [ + 64, + 18671 + ], + "InfatuationText": [ + 64, + 22671 + ], "InitializeEventsScript": [ 64, 17256 @@ -14224,6 +14772,14 @@ 1, 25029 ], + "IsConfusedText": [ + 64, + 22292 + ], + "ItFailedText": [ + 64, + 24245 + ], "ItemAttributes": [ 1, 26784 @@ -14504,6 +15060,10 @@ 106, 20340 ], + "LeechSeedSapsText": [ + 64, + 20948 + ], "LickitungBackpic": [ 28, 17349 @@ -14516,6 +15076,10 @@ 105, 21170 ], + "LightScreenEffectText": [ + 64, + 24169 + ], "LoadOrientedFrontpic": [ 20, 22948 @@ -14524,6 +15088,18 @@ 112, 19520 ], + "LoafingAroundText": [ + 64, + 22734 + ], + "LookTownMapText": [ + 64, + 18740 + ], + "LostAgainstText": [ + 64, + 21631 + ], "LugiaBackpic": [ 21, 32466 @@ -14572,6 +15148,14 @@ 105, 16502 ], + "MadeSubstituteText": [ + 64, + 23831 + ], + "MagazineBookshelfText": [ + 64, + 18506 + ], "MagbyBackpic": [ 28, 24918 @@ -14652,6 +15236,10 @@ 105, 18264 ], + "MagnitudeText": [ + 64, + 24838 + ], "MankeyBackpic": [ 23, 28275 @@ -14724,6 +15312,10 @@ 105, 20829 ], + "MartSignText": [ + 64, + 19011 + ], "Marts": [ 5, 25342 @@ -14752,6 +15344,10 @@ 104, 22068 ], + "MerchandiseShelfText": [ + 64, + 18713 + ], "MetapodBackpic": [ 30, 23522 @@ -14800,6 +15396,14 @@ 107, 21658 ], + "MimicLearnedMoveText": [ + 64, + 23963 + ], + "MirrorMoveFailedText": [ + 64, + 24438 + ], "MisdreavusBackpic": [ 25, 31608 @@ -14812,6 +15416,10 @@ 107, 17156 ], + "MistText": [ + 64, + 23744 + ], "MoltresBackpic": [ 23, 16802 @@ -15252,6 +15860,10 @@ 61, 17688 ], + "MustRechargeText": [ + 64, + 22252 + ], "NPCTradeCableText": [ 63, 19744 @@ -15380,6 +15992,10 @@ 104, 20535 ], + "NoPPLeftText": [ + 64, + 22862 + ], "NoctowlBackpic": [ 27, 30705 @@ -15392,6 +16008,62 @@ 106, 20232 ], + "NotVeryEffectiveText": [ + 64, + 23158 + ], + "NothingHappenedText": [ + 64, + 24206 + ], + "NumberAcceptedFText": [ + 64, + 19632 + ], + "NumberAcceptedMText": [ + 64, + 19286 + ], + "NumberDeclinedFText": [ + 64, + 19664 + ], + "NumberDeclinedMText": [ + 64, + 19322 + ], + "NurseAskHealText": [ + 64, + 18079 + ], + "NurseDayText": [ + 64, + 17984 + ], + "NurseGoodbyeText": [ + 64, + 18224 + ], + "NurseMornText": [ + 64, + 17941 + ], + "NurseNiteText": [ + 64, + 18020 + ], + "NursePokerusText": [ + 64, + 18278 + ], + "NurseReturnPokemonText": [ + 64, + 18172 + ], + "NurseTakePokemonText": [ + 64, + 18146 + ], "OctilleryBackpic": [ 30, 16384 @@ -15444,6 +16116,10 @@ 106, 17489 ], + "OneHitKOText": [ + 64, + 23116 + ], "OnixBackpic": [ 25, 17140 @@ -15480,6 +16156,10 @@ 2, 24741 ], + "ParalyzedText": [ + 64, + 24333 + ], "ParasBackpic": [ 29, 16977 @@ -15508,6 +16188,10 @@ 2, 31430 ], + "PerishCountText": [ + 64, + 21034 + ], "PersianBackpic": [ 24, 29263 @@ -15536,6 +16220,14 @@ 36, 17466 ], + "PhoneFullFText": [ + 64, + 19730 + ], + "PhoneFullMText": [ + 64, + 19383 + ], "PhoneOutOfAreaScript": [ 36, 17958 @@ -15560,6 +16252,10 @@ 106, 21137 ], + "PictureBookshelfText": [ + 64, + 18463 + ], "PidgeotBackpic": [ 27, 19109 @@ -15648,6 +16344,14 @@ 5, 28636 ], + "PlayerHitTimesText": [ + 64, + 23706 + ], + "PokecenterSignText": [ + 64, + 18982 + ], "PokedexCursorPalette": [ 2, 21841 @@ -15688,6 +16392,10 @@ 60, 26439 ], + "PokemonFellFromTreeText": [ + 64, + 20820 + ], "PokemonNames": [ 108, 19316 @@ -15796,6 +16504,10 @@ 0, 14778 ], + "PresentFailedText": [ + 64, + 25072 + ], "PrimeapeBackpic": [ 26, 17463 @@ -15808,6 +16520,22 @@ 104, 22617 ], + "ProtectedByMistText": [ + 64, + 23766 + ], + "ProtectedByText": [ + 64, + 24414 + ], + "ProtectedItselfText": [ + 64, + 24602 + ], + "ProtectingItselfText": [ + 64, + 24623 + ], "PsyduckBackpic": [ 26, 21393 @@ -15832,6 +16560,10 @@ 107, 22319 ], + "PutACurseText": [ + 64, + 24562 + ], "PuzzlePieceBorderData.TileBordersGFX": [ 56, 24368 @@ -15880,6 +16612,10 @@ 36, 21708 ], + "RageBuildingText": [ + 64, + 23208 + ], "RaichuBackpic": [ 25, 20523 @@ -15944,6 +16680,46 @@ 63, 17597 ], + "ReceivedItemText": [ + 64, + 19856 + ], + "RecoilText": [ + 64, + 23810 + ], + "RecoveredUsingText": [ + 64, + 21896 + ], + "ReflectEffectText": [ + 64, + 24188 + ], + "RegainedHealthText": [ + 64, + 22977 + ], + "RegisteredNumberFText": [ + 64, + 19603 + ], + "RegisteredNumberMText": [ + 64, + 19257 + ], + "ReleasedByText": [ + 64, + 24857 + ], + "RematchFText": [ + 64, + 19786 + ], + "RematchMText": [ + 64, + 19439 + ], "RemoraidBackpic": [ 26, 22456 @@ -15956,6 +16732,10 @@ 107, 19692 ], + "RestedText": [ + 64, + 22942 + ], "RhydonBackpic": [ 23, 18877 @@ -16008,6 +16788,10 @@ 5, 17609 ], + "SafeguardProtectText": [ + 64, + 24808 + ], "SandshrewBackpic": [ 23, 31080 @@ -16032,6 +16816,14 @@ 104, 19409 ], + "SandstormBrewedText": [ + 64, + 24729 + ], + "SandstormHitsText": [ + 64, + 21011 + ], "ScizorBackpic": [ 25, 31970 @@ -16112,6 +16904,18 @@ 105, 18727 ], + "SentAllToMomText": [ + 64, + 21507 + ], + "SentHalfToMomText": [ + 64, + 21488 + ], + "SentSomeToMomText": [ + 64, + 21442 + ], "SentretBackpic": [ 30, 18217 @@ -16124,6 +16928,14 @@ 106, 19915 ], + "SharedPainText": [ + 64, + 23248 + ], + "ShedLeechSeedText": [ + 64, + 24879 + ], "ShellderBackpic": [ 24, 16384 @@ -16172,6 +16984,10 @@ 107, 20123 ], + "SketchedText": [ + 64, + 23288 + ], "SkiploomBackpic": [ 28, 28285 @@ -16332,6 +17148,10 @@ 36, 17910 ], + "SpikesText": [ + 64, + 24646 + ], "SpinarakBackpic": [ 30, 24500 @@ -16344,6 +17164,10 @@ 106, 20560 ], + "SpiteEffectText": [ + 64, + 23348 + ], "SpriteMons": [ 5, 18025 @@ -16392,6 +17216,14 @@ 105, 22617 ], + "StartPerishText": [ + 64, + 24695 + ], + "StartedNightmareText": [ + 64, + 24512 + ], "StaryuBackpic": [ 29, 23076 @@ -16432,10 +17264,30 @@ 107, 18048 ], + "StoleText": [ + 64, + 24463 + ], + "StoringEnergyText": [ + 64, + 22563 + ], "StubbedGetFrontpic": [ 112, 19066 ], + "SubFadedText": [ + 64, + 23941 + ], + "SubTookDamageText": [ + 64, + 23906 + ], + "SuckedHealthText": [ + 64, + 23493 + ], "SudowoodoBackpic": [ 25, 26480 @@ -16460,6 +17312,10 @@ 107, 22113 ], + "SunGotBrightText": [ + 64, + 24941 + ], "SunfloraBackpic": [ 23, 17634 @@ -16484,6 +17340,10 @@ 106, 23269 ], + "SuperEffectiveText": [ + 64, + 23135 + ], "SwarmGrassWildMons": [ 10, 32284 @@ -16508,6 +17368,10 @@ 4, 23142 ], + "TVText": [ + 64, + 18789 + ], "TangelaBackpic": [ 30, 28456 @@ -16532,6 +17396,10 @@ 105, 23402 ], + "TeamRocketOathText": [ + 64, + 18560 + ], "TeddiursaBackpic": [ 29, 27843 @@ -16568,14 +17436,50 @@ 105, 17272 ], + "Text_BallCaught": [ + 102, + 17502 + ], + "Text_BattleEffectActivate": [ + 101, + 18077 + ], + "Text_BattleFoeEffectActivate": [ + 101, + 18114 + ], + "Text_BattleUser": [ + 101, + 18149 + ], "Text_BreedHuh": [ 101, 18257 ], + "Text_Gained": [ + 100, + 24078 + ], + "Text_MoveForgetCount": [ + 102, + 17088 + ], + "Text_NPCTraded": [ + 100, + 20317 + ], + "Text_PlayedPokeFlute": [ + 102, + 17801 + ], "TheEndGFX": [ 50, 31933 ], + "TiedAgainstText": [ + 64, + 21425 + ], "TilesetBGPalette": [ 2, 30558 @@ -16632,6 +17536,18 @@ 106, 21575 ], + "TooWeakSubText": [ + 64, + 23874 + ], + "TookAimText": [ + 64, + 23275 + ], + "TookDownWithItText": [ + 64, + 23183 + ], "TotodileBackpic": [ 27, 24806 @@ -16744,6 +17660,18 @@ 14, 22978 ], + "TransformedText": [ + 64, + 24142 + ], + "TransformedTypeText": [ + 64, + 24071 + ], + "TrashCanText": [ + 64, + 18893 + ], "TreeMonMaps": [ 46, 25574 @@ -16752,6 +17680,10 @@ 46, 25712 ], + "TurnedAwayText": [ + 64, + 22793 + ], "TypeMatchups": [ 13, 19713 @@ -16808,6 +17740,14 @@ 107, 16835 ], + "UnaffectedText": [ + 64, + 23062 + ], + "UnleashedEnergyText": [ + 64, + 22585 + ], "UnownABackpic": [ 46, 20556 @@ -17036,6 +17976,14 @@ 46, 19007 ], + "UnusedRivalLossText": [ + 64, + 21525 + ], + "UnusedRivalWinText": [ + 64, + 21593 + ], "UrsaringBackpic": [ 29, 27566 @@ -17048,6 +17996,10 @@ 107, 19050 ], + "UsedBindText": [ + 64, + 22486 + ], "VaporeonBackpic": [ 29, 19040 @@ -17148,6 +18100,10 @@ 63, 17061 ], + "WantsToBattleText": [ + 64, + 20847 + ], "WartortleBackpic": [ 26, 18181 @@ -17160,6 +18116,34 @@ 104, 17164 ], + "WasBurnedText": [ + 64, + 23537 + ], + "WasDefrostedText": [ + 64, + 24544 + ], + "WasDisabledText": [ + 64, + 24018 + ], + "WasFrozenText": [ + 64, + 23570 + ], + "WasPoisonedText": [ + 64, + 23434 + ], + "WasSeededText": [ + 64, + 23981 + ], + "WasTrappedText": [ + 64, + 22505 + ], "WaveSamples": [ 58, 19890 @@ -17200,6 +18184,10 @@ 105, 21390 ], + "WentToSleepText": [ + 64, + 22924 + ], "WigglytuffBackpic": [ 30, 18736 @@ -17212,6 +18200,14 @@ 104, 20752 ], + "WildPokemonAppearedText": [ + 64, + 20770 + ], + "WindowText": [ + 64, + 18759 + ], "WobbuffetBackpic": [ 29, 29757 @@ -17224,6 +18220,22 @@ 107, 17375 ], + "WokeUpText": [ + 64, + 22207 + ], + "WontDropAnymoreText": [ + 64, + 23620 + ], + "WontObeyText": [ + 64, + 22777 + ], + "WontRiseAnymoreText": [ + 64, + 23591 + ], "WooperBackpic": [ 30, 26637 @@ -17236,6 +18248,10 @@ 107, 16503 ], + "WrappedByText": [ + 64, + 22521 + ], "WriteTileFromAnimBuffer": [ 63, 17585 @@ -17292,14 +18308,146 @@ 104, 20858 ], + "_ActorNameText": [ + 101, + 18023 + ], + "_AlreadyASaveFileText": [ + 101, + 23097 + ], + "_AlreadySetUpText": [ + 100, + 17756 + ], + "_AlreadySurfingText": [ + 101, + 16405 + ], + "_AlreadyUsingStrengthText": [ + 101, + 16658 + ], + "_AnEggCantHoldAnItemText": [ + 101, + 17731 + ], + "_AnotherSaveFileText": [ + 101, + 23151 + ], "_AreWeGeniusesText": [ 100, 22601 ], + "_AskCutText": [ + 101, + 17313 + ], + "_AskDeleteMoveText": [ + 102, + 18433 + ], + "_AskFloorElevatorText": [ + 100, + 19953 + ], + "_AskForgetMoveText": [ + 102, + 16969 + ], + "_AskGiveNicknameText": [ + 102, + 17604 + ], + "_AskHeadbuttText": [ + 101, + 17021 + ], + "_AskItemMoveText": [ + 101, + 17959 + ], + "_AskQuantityThrowAwayText": [ + 101, + 17791 + ], + "_AskRockSmashText": [ + 101, + 17128 + ], + "_AskStrengthText": [ + 101, + 16737 + ], + "_AskSurfText": [ + 101, + 16429 + ], + "_AskThrowAwayText": [ + 101, + 17769 + ], + "_AskWaterfallText": [ + 101, + 16512 + ], + "_AskWhirlpoolText": [ + 101, + 16933 + ], + "_BGEventText": [ + 101, + 23443 + ], "_BackAlreadyText": [ 100, 22807 ], + "_BadgeRequiredText": [ + 100, + 24749 + ], + "_BallAlmostHadItText": [ + 102, + 17450 + ], + "_BallAppearedCaughtText": [ + 102, + 17418 + ], + "_BallBlockedText": [ + 102, + 18167 + ], + "_BallBoxFullText": [ + 102, + 18273 + ], + "_BallBrokeFreeText": [ + 102, + 17389 + ], + "_BallDodgedText": [ + 102, + 17313 + ], + "_BallDontBeAThiefText": [ + 102, + 18198 + ], + "_BallMissedText": [ + 102, + 17367 + ], + "_BallSentToPCText": [ + 102, + 17534 + ], + "_BallSoCloseText": [ + 102, + 17473 + ], "_BargainShopComeAgainText": [ 101, 24234 @@ -17328,10 +18476,110 @@ 101, 24113 ], + "_BattleDugText": [ + 101, + 18243 + ], + "_BattleFlewText": [ + 101, + 18227 + ], + "_BattleGlowingText": [ + 101, + 18213 + ], + "_BattleLoweredHeadText": [ + 101, + 18193 + ], + "_BattleMadeWhirlwindText": [ + 101, + 18153 + ], + "_BattleMonNickCommaText": [ + 100, + 24221 + ], + "_BattleStatFellText": [ + 101, + 18141 + ], + "_BattleStatSharplyFellText": [ + 101, + 18124 + ], + "_BattleStatWentUpText": [ + 101, + 18103 + ], + "_BattleStatWentWayUpText": [ + 101, + 18087 + ], + "_BattleTookSunlightText": [ + 101, + 18173 + ], + "_BenFernText1": [ + 100, + 19047 + ], + "_BenFernText2A": [ + 100, + 19061 + ], + "_BenFernText2B": [ + 100, + 19080 + ], + "_BenFernText3A": [ + 100, + 19098 + ], + "_BenFernText3B": [ + 100, + 19112 + ], + "_BenIntroText1": [ + 100, + 18968 + ], + "_BenIntroText2": [ + 100, + 18986 + ], + "_BenIntroText3": [ + 100, + 18997 + ], "_BidsFarewellToMonText": [ 100, 18201 ], + "_BlindingFlashText": [ + 100, + 24847 + ], + "_BoostedExpPointsText": [ + 100, + 24091 + ], + "_BootedHMText": [ + 100, + 24343 + ], + "_BootedTMText": [ + 100, + 24326 + ], + "_BouldersMayMoveText": [ + 101, + 16821 + ], + "_BouldersMoveText": [ + 101, + 16793 + ], "_BreedAppearsToCareForText": [ 101, 18477 @@ -17364,6 +18612,26 @@ 101, 18534 ], + "_BreedingIsNotPossibleText": [ + 100, + 17240 + ], + "_BugCatchingContestIsOverText": [ + 100, + 19996 + ], + "_BugCatchingContestTimeUpText": [ + 100, + 19967 + ], + "_BurnWasHealedText": [ + 100, + 16563 + ], + "_ButNoSpaceText": [ + 100, + 20070 + ], "_CGB_GSIntro.ShellderLaprasBGPalette": [ 2, 22241 @@ -17376,10 +18644,114 @@ 2, 22895 ], + "_CameToItsSensesText": [ + 100, + 16694 + ], + "_CanCutText": [ + 101, + 17353 + ], "_CantAcceptEggText": [ 100, 22429 ], + "_CantCarryItemText": [ + 101, + 17392 + ], + "_CantGetOffBikeText": [ + 101, + 17246 + ], + "_CantRegisterText": [ + 101, + 17929 + ], + "_CantSurfText": [ + 101, + 16384 + ], + "_CantUseDigText": [ + 101, + 16582 + ], + "_CantUseItemText": [ + 100, + 24782 + ], + "_CantUseTeleportText": [ + 101, + 16636 + ], + "_CardFlipChooseACardText": [ + 102, + 17214 + ], + "_CardFlipDarnText": [ + 102, + 17306 + ], + "_CardFlipNotEnoughCoinsText": [ + 102, + 17195 + ], + "_CardFlipPlaceYourBetText": [ + 102, + 17230 + ], + "_CardFlipPlayAgainText": [ + 102, + 17247 + ], + "_CardFlipPlayWithThreeCoinsText": [ + 102, + 17171 + ], + "_CardFlipShuffledText": [ + 102, + 17268 + ], + "_CardFlipYeahText": [ + 102, + 17299 + ], + "_CaughtAskNicknameText": [ + 101, + 19555 + ], + "_ChangeBoxSaveText": [ + 101, + 23232 + ], + "_ChangeWhichNumberText": [ + 100, + 17145 + ], + "_ClearAllSaveDataText": [ + 102, + 16838 + ], + "_ClockHasResetText": [ + 101, + 22815 + ], + "_ClockIsThisOKText": [ + 101, + 22802 + ], + "_ClockSetWithControlPadText": [ + 101, + 22739 + ], + "_ClockTimeMayBeWrongText": [ + 101, + 22685 + ], + "_CoinCaseCountText": [ + 102, + 17827 + ], "_ComeAgainText": [ 100, 22990 @@ -17388,6 +18760,78 @@ 100, 22576 ], + "_ComeBackText": [ + 100, + 24291 + ], + "_CompatibilityShouldTheyBreedText": [ + 100, + 17267 + ], + "_CongratulationsYourPokemonText": [ + 101, + 23542 + ], + "_ContainedMoveText": [ + 100, + 24361 + ], + "_ContestAlreadyCaughtText": [ + 101, + 19013 + ], + "_ContestAskSwitchText": [ + 101, + 18999 + ], + "_ContestCaughtMonText": [ + 101, + 18984 + ], + "_ContestJudging_FirstPlaceScoreText": [ + 101, + 19111 + ], + "_ContestJudging_FirstPlaceText": [ + 101, + 19042 + ], + "_ContestJudging_SecondPlaceScoreText": [ + 101, + 19198 + ], + "_ContestJudging_SecondPlaceText": [ + 101, + 19150 + ], + "_ContestJudging_ThirdPlaceScoreText": [ + 101, + 19276 + ], + "_ContestJudging_ThirdPlaceText": [ + 101, + 19229 + ], + "_CoordinatesEventText": [ + 101, + 23453 + ], + "_CorruptedEventText": [ + 101, + 23410 + ], + "_CuredOfPoisonText": [ + 100, + 16516 + ], + "_CutNothingText": [ + 100, + 24818 + ], + "_DSTIsThatOKText": [ + 102, + 18693 + ], "_DayCareLadyIntroEggText": [ 100, 22176 @@ -17408,22 +18852,170 @@ 100, 21900 ], + "_DeleterAskWhichMonText": [ + 102, + 18680 + ], + "_DeleterAskWhichMoveText": [ + 102, + 18551 + ], + "_DeleterEggText": [ + 102, + 18494 + ], + "_DeleterForgotMoveText": [ + 102, + 18460 + ], + "_DeleterIntroText": [ + 102, + 18587 + ], + "_DeleterNoComeAgainText": [ + 102, + 18525 + ], + "_DidNotLearnMoveText": [ + 102, + 16943 + ], + "_DoItMonText": [ + 100, + 24157 + ], + "_EggPhotoText": [ + 100, + 23443 + ], "_EmptyMailboxText": [ 101, 18563 ], + "_EndUsedMove1Text": [ + 101, + 18062 + ], + "_EndUsedMove2Text": [ + 101, + 18065 + ], + "_EndUsedMove3Text": [ + 101, + 18068 + ], + "_EndUsedMove4Text": [ + 101, + 18071 + ], + "_EndUsedMove5Text": [ + 101, + 18074 + ], + "_EnemyUsedOnText": [ + 100, + 16970 + ], + "_EnemyWithdrewText": [ + 100, + 16951 + ], + "_EnterTheAmountText": [ + 100, + 17524 + ], + "_EnterTheIDNoText": [ + 100, + 17506 + ], + "_EvolvedIntoText": [ + 101, + 23571 + ], + "_EvolvingText": [ + 101, + 23623 + ], + "_ExpPointsText": [ + 100, + 24123 + ], + "_FernIntroText1": [ + 100, + 19015 + ], + "_FernIntroText2": [ + 100, + 19031 + ], + "_FluteWakeUpText": [ + 102, + 17773 + ], "_ForYourMonSendsText": [ 100, 18255 ], + "_ForYourMonWillTradeText": [ + 100, + 18314 + ], "_FoundAnEggText": [ 100, 23013 ], + "_FoundItemText": [ + 101, + 17376 + ], + "_FruitBearingTreeText": [ + 100, + 16384 + ], + "_FruitPackIsFullText": [ + 100, + 16446 + ], + "_GearEllipseText": [ + 102, + 16486 + ], + "_GearOutOfServiceText": [ + 102, + 16489 + ], + "_GearTodayText": [ + 102, + 16484 + ], + "_GoForItMonText": [ + 100, + 24172 + ], + "_GoMonText": [ + 100, + 24145 + ], + "_GoodComeBackText": [ + 100, + 24272 + ], "_GotBackMonText": [ 100, 22788 ], + "_GotOffBikeText": [ + 101, + 17291 + ], + "_GotOnBikeText": [ + 101, + 17270 + ], + "_GrewToLevelText": [ + 100, + 16664 + ], "_HallOfFamePC.HOFMaster": [ 33, 26331 @@ -17436,6 +19028,14 @@ 100, 22919 ], + "_HeadbuttNothingText": [ + 101, + 17005 + ], + "_HealthReturnedText": [ + 100, + 16620 + ], "_HerbShopLadyIntroText": [ 101, 23692 @@ -17464,6 +19064,18 @@ 101, 23858 ], + "_HeyItsFruitText": [ + 100, + 16412 + ], + "_HoldStillText": [ + 100, + 23340 + ], + "_HugeWaterfallText": [ + 101, + 16484 + ], "_IllKeepItThanksText": [ 100, 23222 @@ -17472,10 +19084,166 @@ 100, 22549 ], + "_IsThisOKText": [ + 100, + 17493 + ], + "_ItemBelongsToSomeoneElseText": [ + 102, + 18110 + ], + "_ItemCantGetOnText": [ + 102, + 18244 + ], + "_ItemCantHeldText": [ + 101, + 21732 + ], + "_ItemCantUseOnEggText": [ + 102, + 18039 + ], + "_ItemCantUseOnMonText": [ + 102, + 17649 + ], + "_ItemGotOffText": [ + 102, + 18359 + ], + "_ItemGotOnText": [ + 102, + 18338 + ], + "_ItemLooksBitterText": [ + 102, + 18021 + ], + "_ItemOakWarningText": [ + 102, + 18069 + ], + "_ItemStatRoseText": [ + 102, + 17631 + ], + "_ItemStorageFullText": [ + 101, + 21637 + ], + "_ItemUsedText": [ + 102, + 18319 + ], + "_ItemWontHaveEffectText": [ + 102, + 18141 + ], + "_ItemfinderItemNearbyText": [ + 101, + 17467 + ], + "_ItemfinderNopeText": [ + 101, + 17517 + ], + "_ItemsDiscardedText": [ + 101, + 21413 + ], + "_ItemsOakWarningText": [ + 101, + 21470 + ], + "_ItemsThrowAwayText": [ + 101, + 21384 + ], + "_ItemsTooImportantText": [ + 101, + 21434 + ], + "_ItemsTossOutHowManyText": [ + 101, + 21355 + ], + "_ItsGoingToHatchText": [ + 100, + 17335 + ], + "_JustSawSomeRareMonText": [ + 100, + 20096 + ], + "_KarpGuruRecordText": [ + 101, + 19362 + ], + "_KnowsMoveText": [ + 102, + 18383 + ], + "_LC_DragText1": [ + 100, + 19344 + ], + "_LC_DragText2": [ + 100, + 19364 + ], + "_LC_Text1": [ + 100, + 19128 + ], + "_LC_Text10": [ + 100, + 19304 + ], + "_LC_Text11": [ + 100, + 19325 + ], + "_LC_Text2": [ + 100, + 19148 + ], + "_LC_Text3": [ + 100, + 19167 + ], + "_LC_Text4": [ + 100, + 19186 + ], + "_LC_Text5": [ + 100, + 19205 + ], + "_LC_Text6": [ + 100, + 19225 + ], + "_LC_Text7": [ + 100, + 19246 + ], + "_LC_Text8": [ + 100, + 19265 + ], + "_LC_Text9": [ + 100, + 19285 + ], "_LastHealthyMonText": [ 100, 22500 ], + "_LearnedMoveText": [ + 102, + 16865 + ], "_LeftWithDayCareLadyText": [ 101, 18323 @@ -17484,6 +19252,58 @@ 101, 18372 ], + "_LinkAbnormalMonText": [ + 101, + 22941 + ], + "_LinkAskTradeForText": [ + 101, + 22985 + ], + "_LinkTimeoutText": [ + 101, + 22842 + ], + "_LinkTradeCantBattleText": [ + 101, + 22888 + ], + "_LookAdorableDecoText": [ + 100, + 17901 + ], + "_LookClefairyPosterText": [ + 100, + 17831 + ], + "_LookGiantDecoText": [ + 100, + 17925 + ], + "_LookJigglypuffPosterText": [ + 100, + 17865 + ], + "_LookPikachuPosterText": [ + 100, + 17798 + ], + "_LookTownMapText": [ + 100, + 17779 + ], + "_LuckyNumberMatchPCText": [ + 101, + 19477 + ], + "_LuckyNumberMatchPartyText": [ + 101, + 19400 + ], + "_MagikarpGuruMeasureText": [ + 101, + 19307 + ], "_MailAlreadyHoldingItemText": [ 101, 18673 @@ -17532,6 +19352,10 @@ 101, 21892 ], + "_MainMenuTimeUnknownText": [ + 101, + 22032 + ], "_MartAskMoreText": [ 101, 24689 @@ -17580,22 +19404,322 @@ 101, 24518 ], + "_MayPassWhirlpoolText": [ + 101, + 16876 + ], + "_MayRegisterItemText": [ + 101, + 21966 + ], + "_MaySmashText": [ + 101, + 17095 + ], + "_MemoryGameDarnText": [ + 101, + 21312 + ], + "_MemoryGameYeahText": [ + 101, + 21302 + ], + "_MomBankWhatDoYouWantToDoText": [ + 100, + 21543 + ], + "_MomBoughtWithYourMoneyText": [ + 100, + 18020 + ], + "_MomFoundADollText": [ + 100, + 18089 + ], + "_MomFoundAnItemText": [ + 100, + 17984 + ], + "_MomHaventSavedThatMuchText": [ + 100, + 21663 + ], + "_MomHiHowAreYouText": [ + 100, + 17963 + ], + "_MomInsufficientFundsInWalletText": [ + 100, + 21718 + ], + "_MomIsThisAboutYourMoneyText": [ + 100, + 21439 + ], + "_MomItsInPCText": [ + 100, + 18057 + ], + "_MomItsInYourRoomText": [ + 100, + 18141 + ], + "_MomJustDoWhatYouCanText": [ + 100, + 21877 + ], + "_MomLeavingText1": [ + 100, + 21092 + ], + "_MomLeavingText2": [ + 100, + 21325 + ], + "_MomLeavingText3": [ + 100, + 21363 + ], + "_MomLostGearBookletText": [ + 102, + 18936 + ], + "_MomNotEnoughRoomInBankText": [ + 100, + 21744 + ], + "_MomNotEnoughRoomInWalletText": [ + 100, + 21692 + ], + "_MomSaveMoneyText": [ + 100, + 21630 + ], + "_MomStartSavingMoneyText": [ + 100, + 21770 + ], + "_MomStoreMoneyText": [ + 100, + 21568 + ], + "_MomStoredMoneyText": [ + 100, + 21824 + ], + "_MomTakeMoneyText": [ + 100, + 21599 + ], + "_MomTakenMoneyText": [ + 100, + 21859 + ], "_MonNameBidsFarewellText": [ 100, 18223 ], + "_MonNameSentToText": [ + 100, + 18199 + ], "_MonWasSentToText": [ 100, 18175 ], + "_MoveAskForgetText": [ + 102, + 16888 + ], + "_MoveBoulderText": [ + 101, + 16713 + ], + "_MoveCantForgetHMText": [ + 102, + 17138 + ], + "_MoveForgotText": [ + 102, + 17102 + ], + "_MoveKnowsOneText": [ + 102, + 18401 + ], + "_MoveMonWOMailSaveText": [ + 101, + 23285 + ], + "_MoveNameText": [ + 101, + 18057 + ], + "_MysteryGiftCanceledText": [ + 100, + 24521 + ], + "_MysteryGiftCommErrorText": [ + 100, + 24551 + ], + "_MysteryGiftFiveADayText": [ + 100, + 24634 + ], + "_MysteryGiftOneADayText": [ + 100, + 24665 + ], + "_MysteryGiftSentHomeText": [ + 100, + 24717 + ], + "_MysteryGiftSentText": [ + 100, + 24700 + ], + "_NPCTradeAfterText1": [ + 100, + 20519 + ], + "_NPCTradeAfterText2": [ + 100, + 20775 + ], + "_NPCTradeAfterText3": [ + 100, + 21032 + ], + "_NPCTradeCableText": [ + 100, + 20283 + ], + "_NPCTradeCancelText1": [ + 100, + 20415 + ], + "_NPCTradeCancelText2": [ + 100, + 20632 + ], + "_NPCTradeCancelText3": [ + 100, + 20902 + ], + "_NPCTradeCompleteText1": [ + 100, + 20485 + ], + "_NPCTradeCompleteText2": [ + 100, + 20735 + ], + "_NPCTradeCompleteText3": [ + 100, + 20992 + ], + "_NPCTradeFanfareText": [ + 100, + 20345 + ], + "_NPCTradeIntroText1": [ + 100, + 20348 + ], + "_NPCTradeIntroText2": [ + 100, + 20549 + ], + "_NPCTradeIntroText3": [ + 100, + 20820 + ], + "_NPCTradeWrongText1": [ + 100, + 20445 + ], + "_NPCTradeWrongText2": [ + 100, + 20692 + ], + "_NPCTradeWrongText3": [ + 100, + 20937 + ], + "_NameRaterBetterNameText": [ + 100, + 23615 + ], + "_NameRaterComeAgainText": [ + 100, + 23824 + ], + "_NameRaterEggText": [ + 100, + 23930 + ], + "_NameRaterFinishedText": [ + 100, + 23779 + ], + "_NameRaterHelloText": [ + 100, + 23477 + ], + "_NameRaterNamedText": [ + 100, + 24036 + ], + "_NameRaterPerfectNameText": [ + 100, + 23856 + ], + "_NameRaterSameNameText": [ + 100, + 23956 + ], + "_NameRaterWhatNameText": [ + 100, + 23732 + ], + "_NameRaterWhichMonText": [ + 100, + 23570 + ], + "_NewDexDataText": [ + 102, + 17561 + ], "_NewPokedexEntry": [ 16, 23170 ], + "_NoCoinCaseText": [ + 100, + 20255 + ], + "_NoCoinsText": [ + 100, + 20235 + ], + "_NoCyclingText": [ + 102, + 18216 + ], + "_NoPhotoText": [ + 100, + 23410 + ], "_NoRoomForEggText": [ 100, 23255 ], + "_NoRoomTMHMText": [ + 100, + 24461 + ], "_NotEnoughMoneyText": [ 100, 22945 @@ -17604,14 +19728,282 @@ 100, 23003 ], + "_NothingHereText": [ + 100, + 16469 + ], + "_NothingToChooseText": [ + 100, + 17543 + ], + "_NothingToPutAwayText": [ + 100, + 17666 + ], "_NothingToSellText": [ 101, 24438 ], + "_OKComeBackText": [ + 100, + 24255 + ], + "_OPT_AddictivelyText": [ + 100, + 18641 + ], + "_OPT_AlmostPoisonouslyText": [ + 100, + 18561 + ], + "_OPT_AptlyNamedText": [ + 100, + 18482 + ], + "_OPT_BoldSortOfText": [ + 100, + 18784 + ], + "_OPT_CuteText": [ + 100, + 18755 + ], + "_OPT_EvolutionMustBeText": [ + 100, + 18680 + ], + "_OPT_ExcitingText": [ + 100, + 18848 + ], + "_OPT_FlippedOutText": [ + 100, + 18716 + ], + "_OPT_FriendlyText": [ + 100, + 18880 + ], + "_OPT_FrighteningText": [ + 100, + 18801 + ], + "_OPT_GuardedText": [ + 100, + 18924 + ], + "_OPT_HeartMeltinglyText": [ + 100, + 18737 + ], + "_OPT_HotHotHotText": [ + 100, + 18892 + ], + "_OPT_InspiringText": [ + 100, + 18867 + ], + "_OPT_IntroText1": [ + 100, + 18333 + ], + "_OPT_IntroText2": [ + 100, + 18352 + ], + "_OPT_IntroText3": [ + 100, + 18365 + ], + "_OPT_LooksInWaterText": [ + 100, + 18660 + ], + "_OPT_LovelyText": [ + 100, + 18935 + ], + "_OPT_MaryText1": [ + 100, + 18425 + ], + "_OPT_MischievouslyText": [ + 100, + 18602 + ], + "_OPT_NowText": [ + 100, + 18860 + ], + "_OPT_OakText1": [ + 100, + 18382 + ], + "_OPT_OakText2": [ + 100, + 18395 + ], + "_OPT_OakText3": [ + 100, + 18416 + ], + "_OPT_PleasantText": [ + 100, + 18772 + ], + "_OPT_PokemonChannelText": [ + 100, + 18955 + ], + "_OPT_PowerfulText": [ + 100, + 18836 + ], + "_OPT_ProvocativelyText": [ + 100, + 18700 + ], + "_OPT_SensuallyText": [ + 100, + 18582 + ], + "_OPT_SpeedyText": [ + 100, + 18945 + ], + "_OPT_StimulatingText": [ + 100, + 18909 + ], + "_OPT_SuaveDebonairText": [ + 100, + 18816 + ], + "_OPT_SweetAdorablyText": [ + 100, + 18440 + ], + "_OPT_TopicallyText": [ + 100, + 18621 + ], + "_OPT_UnbearablyText": [ + 100, + 18521 + ], + "_OPT_UndeniablyKindOfText": [ + 100, + 18500 + ], + "_OPT_WeirdText": [ + 100, + 18763 + ], + "_OPT_WigglySlicklyText": [ + 100, + 18461 + ], + "_OPT_WowImpressivelyText": [ + 100, + 18541 + ], "_OTSendsText": [ 100, 18274 ], + "_OakPCText1": [ + 101, + 20092 + ], + "_OakPCText2": [ + 101, + 20122 + ], + "_OakPCText3": [ + 101, + 20154 + ], + "_OakPCText4": [ + 101, + 21267 + ], + "_OakRating01": [ + 101, + 20204 + ], + "_OakRating02": [ + 101, + 20236 + ], + "_OakRating03": [ + 101, + 20284 + ], + "_OakRating04": [ + 101, + 20344 + ], + "_OakRating05": [ + 101, + 20406 + ], + "_OakRating06": [ + 101, + 20467 + ], + "_OakRating07": [ + 101, + 20529 + ], + "_OakRating08": [ + 101, + 20592 + ], + "_OakRating09": [ + 101, + 20642 + ], + "_OakRating10": [ + 101, + 20698 + ], + "_OakRating11": [ + 101, + 20747 + ], + "_OakRating12": [ + 101, + 20807 + ], + "_OakRating13": [ + 101, + 20859 + ], + "_OakRating14": [ + 101, + 20924 + ], + "_OakRating15": [ + 101, + 20980 + ], + "_OakRating16": [ + 101, + 21029 + ], + "_OakRating17": [ + 101, + 21088 + ], + "_OakRating18": [ + 101, + 21147 + ], + "_OakRating19": [ + 101, + 21204 + ], "_OakText1": [ 101, 22052 @@ -17640,6 +20032,70 @@ 101, 22493 ], + "_OakThisIsntTheTimeText": [ + 101, + 17842 + ], + "_OakTimeHoursQuestionMarkText": [ + 100, + 16824 + ], + "_OakTimeHowManyMinutesText": [ + 100, + 16827 + ], + "_OakTimeIsItText": [ + 100, + 16941 + ], + "_OakTimeMinutesQuestionMarkText": [ + 100, + 16854 + ], + "_OakTimeOversleptText": [ + 100, + 16857 + ], + "_OakTimeSoDarkText": [ + 100, + 16898 + ], + "_OakTimeWhatDayIsItText": [ + 100, + 16924 + ], + "_OakTimeWhatHoursText": [ + 100, + 16816 + ], + "_OakTimeWhatTimeIsItText": [ + 100, + 16798 + ], + "_OakTimeWhoaMinutesText": [ + 100, + 16846 + ], + "_OakTimeWokeUpText": [ + 100, + 16719 + ], + "_OakTimeYikesText": [ + 100, + 16873 + ], + "_ObjectEventText": [ + 101, + 23428 + ], + "_ObtainedFruitText": [ + 100, + 16429 + ], + "_ObtainedTheVoltorbBadgeText": [ + 100, + 17446 + ], "_OhFineThenText": [ 100, 22974 @@ -17648,10 +20104,66 @@ 100, 22396 ], + "_PCCantDepositLastMonText": [ + 101, + 18920 + ], + "_PCCantTakeText": [ + 101, + 18954 + ], + "_PCGottaHavePokemonText": [ + 101, + 18798 + ], "_PCMonHoldingMailText": [ 101, 18835 ], + "_PCNoSingleMonText": [ + 101, + 18890 + ], + "_PCWhatText": [ + 101, + 18828 + ], + "_PPIsMaxedOutText": [ + 102, + 17901 + ], + "_PPRestoredText": [ + 102, + 17944 + ], + "_PPsIncreasedText": [ + 102, + 17924 + ], + "_PackEmptyText": [ + 101, + 17991 + ], + "_PackNoItemText": [ + 101, + 17758 + ], + "_PasswordAskEnterText": [ + 102, + 16810 + ], + "_PasswordAskResetClockText": [ + 102, + 16792 + ], + "_PasswordAskResetText": [ + 102, + 16727 + ], + "_PasswordWrongText": [ + 102, + 16775 + ], "_PerfectHeresYourMonText": [ 100, 22761 @@ -17684,22 +20196,454 @@ 101, 24335 ], + "_PhoneClickText": [ + 102, + 16636 + ], + "_PhoneEllipseText": [ + 102, + 16644 + ], + "_PhoneJustTalkToThemText": [ + 102, + 16680 + ], + "_PhoneOutOfAreaText": [ + 102, + 16647 + ], + "_PhoneThankYouText": [ + 102, + 16710 + ], + "_PhoneWrongNumberText": [ + 102, + 16609 + ], + "_PlayedFluteText": [ + 102, + 17726 + ], + "_PlayerFoundItemText": [ + 100, + 20054 + ], + "_PlayerPickedUpPayDayMoney": [ + 100, + 24304 + ], + "_PlayersPCAskWhatDoText": [ + 101, + 19663 + ], + "_PlayersPCDepositItemsText": [ + 101, + 19832 + ], + "_PlayersPCHowManyDepositText": [ + 101, + 19798 + ], + "_PlayersPCHowManyWithdrawText": [ + 101, + 19688 + ], + "_PlayersPCNoItemsText": [ + 101, + 19782 + ], + "_PlayersPCNoRoomDepositText": [ + 101, + 19860 + ], + "_PlayersPCNoRoomWithdrawText": [ + 101, + 19750 + ], + "_PlayersPCTurnOnText": [ + 101, + 19642 + ], + "_PlayersPCWithdrewItemsText": [ + 101, + 19723 + ], + "_PnP_BoldText": [ + 100, + 19539 + ], + "_PnP_CoolText": [ + 100, + 19649 + ], + "_PnP_CuteText": [ + 100, + 19455 + ], + "_PnP_GreatText": [ + 100, + 19609 + ], + "_PnP_HappyText": [ + 100, + 19485 + ], + "_PnP_InspiringText": [ + 100, + 19667 + ], + "_PnP_LazyText": [ + 100, + 19466 + ], + "_PnP_MyTypeText": [ + 100, + 19630 + ], + "_PnP_NoisyText": [ + 100, + 19504 + ], + "_PnP_OddText": [ + 100, + 19722 + ], + "_PnP_PickyText": [ + 100, + 19559 + ], + "_PnP_PrecociousText": [ + 100, + 19522 + ], + "_PnP_RightForMeText": [ + 100, + 19703 + ], + "_PnP_SoSoText": [ + 100, + 19592 + ], + "_PnP_SortOfOKText": [ + 100, + 19575 + ], + "_PnP_Text1": [ + 100, + 19385 + ], + "_PnP_Text2": [ + 100, + 19406 + ], + "_PnP_Text3": [ + 100, + 19426 + ], + "_PnP_Text4": [ + 100, + 19441 + ], + "_PnP_Text5": [ + 100, + 19743 + ], + "_PnP_WeirdText": [ + 100, + 19683 + ], + "_PocketIsFullText": [ + 101, + 23522 + ], + "_PoisonFaintText": [ + 101, + 17552 + ], + "_PoisonWhiteoutText": [ + 101, + 17566 + ], + "_PokecenterBillsPCText": [ + 101, + 19931 + ], + "_PokecenterOaksPCText": [ + 101, + 20025 + ], + "_PokecenterPCCantUseText": [ + 101, + 19599 + ], + "_PokecenterPCOaksClosedText": [ + 101, + 20076 + ], + "_PokecenterPCTurnOnText": [ + 101, + 19892 + ], + "_PokecenterPCWhoseText": [ + 101, + 19913 + ], + "_PokecenterPlayersPCText": [ + 101, + 19979 + ], + "_PokedexShowText": [ + 100, + 18961 + ], + "_PokegearAskDeleteText": [ + 102, + 16575 + ], + "_PokegearAskWhoCallText": [ + 102, + 16521 + ], + "_PokegearPressButtonText": [ + 102, + 16548 + ], + "_PokemonAskSwapItemText": [ + 101, + 21687 + ], + "_PokemonHoldItemText": [ + 101, + 21554 + ], + "_PokemonNotEnoughHPText": [ + 101, + 21950 + ], + "_PokemonNotHoldingText": [ + 101, + 21609 + ], "_PokemonRemoveMailText": [ 101, 21578 ], + "_PokemonSwapItemText": [ + 101, + 21511 + ], + "_PokemonTookItemText": [ + 101, + 21663 + ], "_PrepMonFrontpic": [ 0, 14783 ], + "_PrestoAllDoneText": [ + 100, + 23375 + ], + "_PutAwayAndSetUpText": [ + 100, + 17714 + ], + "_PutAwayTheDecoText": [ + 100, + 17645 + ], + "_PutItemInPocketText": [ + 101, + 23491 + ], + "_RaiseThePPOfWhichMoveText": [ + 102, + 17841 + ], + "_ReceiveItemText": [ + 100, + 20211 + ], "_ReceivedEggText": [ 100, 23178 ], + "_ReceivedItemText": [ + 101, + 23472 + ], + "_ReceivedTMHMText": [ + 100, + 24500 + ], + "_RecoveredSomeHPText": [ + 100, + 16491 + ], + "_RegisteredItemText": [ + 101, + 17906 + ], + "_RemainingTimeText": [ + 100, + 17092 + ], "_RemoveMailText": [ 100, 22463 ], + "_RepelUsedEarlierIsStillInEffectText": [ + 102, + 17682 + ], + "_RepelWoreOffText": [ + 100, + 20029 + ], + "_RestoreThePPOfWhichMoveText": [ + 102, + 17870 + ], + "_RetrieveMysteryGiftText": [ + 100, + 24573 + ], + "_RevitalizedText": [ + 100, + 16643 + ], + "_RidOfParalysisText": [ + 100, + 16539 + ], + "_RocketRadioText1": [ + 100, + 19751 + ], + "_RocketRadioText10": [ + 100, + 19931 + ], + "_RocketRadioText2": [ + 100, + 19769 + ], + "_RocketRadioText3": [ + 100, + 19784 + ], + "_RocketRadioText4": [ + 100, + 19804 + ], + "_RocketRadioText5": [ + 100, + 19825 + ], + "_RocketRadioText6": [ + 100, + 19844 + ], + "_RocketRadioText7": [ + 100, + 19862 + ], + "_RocketRadioText8": [ + 100, + 19885 + ], + "_RocketRadioText9": [ + 100, + 19907 + ], + "_RodBiteText": [ + 101, + 17180 + ], + "_RodNothingText": [ + 101, + 17193 + ], + "_SaveFileCorruptedText": [ + 101, + 23203 + ], + "_SavedTheGameText": [ + 101, + 23078 + ], + "_SavingDontTurnOffThePowerText": [ + 101, + 23043 + ], + "_SavingRecordText": [ + 100, + 20179 + ], + "_SentTrophyHomeText": [ + 102, + 17962 + ], + "_SetUpTheDecoText": [ + 100, + 17695 + ], + "_SlotsBetHowManyCoinsText": [ + 101, + 24749 + ], + "_SlotsDarnText": [ + 102, + 16477 + ], + "_SlotsLinedUpText": [ + 102, + 16449 + ], + "_SlotsNotEnoughCoinsText": [ + 102, + 16392 + ], + "_SlotsPlayAgainText": [ + 102, + 16436 + ], + "_SlotsRanOutOfCoinsText": [ + 102, + 16411 + ], + "_SlotsStartText": [ + 102, + 16384 + ], + "_SpaceSpaceColonText": [ + 102, + 16722 + ], + "_SquirtbottleNothingText": [ + 101, + 17663 + ], + "_StartMenuContestEndText": [ + 101, + 21319 + ], + "_StopLearningMoveText": [ + 102, + 16921 + ], + "_StoppedEvolvingText": [ + 101, + 23593 + ], + "_SweetScentNothingText": [ + 101, + 17630 + ], + "_TMHMNotCompatibleText": [ + 100, + 24405 + ], "_TakeGoodCareOfEggText": [ 100, 23199 @@ -17708,14 +20652,226 @@ 100, 18229 ], + "_TeleportReturnText": [ + 101, + 16603 + ], + "_TestEventText": [ + 100, + 17356 + ], + "_ThatCantBeUsedRightNowText": [ + 100, + 16994 + ], + "_ThatItemCantBePutInThePackText": [ + 100, + 17024 + ], + "_ThatsEnoughComeBackText": [ + 100, + 24228 + ], + "_TheBoxIsFullText": [ + 100, + 17428 + ], + "_TheItemWasPutInThePackText": [ + 100, + 17060 + ], + "_ThePasswordIsText": [ + 100, + 17474 + ], + "_ThereIsNoEggText": [ + 100, + 17316 + ], + "_ThrewAwayText": [ + 101, + 17820 + ], + "_TimeAskOkayText": [ + 102, + 18712 + ], + "_TimesetAskAdjustDSTText": [ + 102, + 18876 + ], + "_TimesetAskDSTText": [ + 102, + 18727 + ], + "_TimesetAskNotDSTText": [ + 102, + 18813 + ], + "_TimesetDSTText": [ + 102, + 18775 + ], + "_TimesetNotDSTText": [ + 102, + 18844 + ], + "_UnusedNothingHereText": [ + 101, + 17213 + ], + "_UseCutText": [ + 100, + 24803 + ], + "_UseDigText": [ + 101, + 16543 + ], + "_UseEscapeRopeText": [ + 101, + 16558 + ], + "_UseHeadbuttText": [ + 101, + 16984 + ], + "_UseRockSmashText": [ + 101, + 17073 + ], + "_UseSacredAshText": [ + 101, + 17705 + ], + "_UseStrengthText": [ + 101, + 16693 + ], + "_UseSweetScentText": [ + 101, + 17607 + ], + "_UseWaterfallText": [ + 101, + 16463 + ], + "_UseWhirlpoolText": [ + 101, + 16855 + ], + "_UsedInsteadText": [ + 101, + 18045 + ], + "_UsedMove1Text": [ + 101, + 18027 + ], + "_UsedMove2Text": [ + 101, + 18036 + ], + "_UsedSurfText": [ + 100, + 24885 + ], + "_WaitButtonText": [ + 102, + 17532 + ], + "_WarpingText": [ + 100, + 17135 + ], + "_WasDefrostedText": [ + 100, + 16586 + ], + "_WasSentToBillsPCText": [ + 101, + 18771 + ], + "_WhatDoYouWantToPlayWithText": [ + 100, + 17376 + ], "_WhatShouldIRaiseText": [ 100, 22366 ], + "_WhichMonPhotoText": [ + 100, + 23305 + ], + "_WhichSidePutAwayText": [ + 100, + 17608 + ], + "_WhichSidePutOnText": [ + 100, + 17570 + ], + "_WhitedOutText": [ + 101, + 17426 + ], + "_WillTradeText": [ + 100, + 18292 + ], + "_WillYouPlayWithMonText": [ + 100, + 17178 + ], + "_WindowAreaExceededErrorText": [ + 101, + 23337 + ], + "_WindowPoppingErrorText": [ + 101, + 23373 + ], + "_WokeUpText": [ + 100, + 16606 + ], + "_WouldYouLikeToSaveTheGameText": [ + 101, + 23009 + ], + "_YouCanHaveThisText": [ + 100, + 17408 + ], + "_YouCantUseItInABattleText": [ + 101, + 17993 + ], + "_YouDontHaveAMonText": [ + 101, + 17883 + ], + "_YouNeedTwoMonForBreedingText": [ + 100, + 17205 + ], + "_YourFoesWeakGetmMonText": [ + 100, + 24191 + ], + "_YourFriendIsNotReadyText": [ + 100, + 24609 + ], "_YourMonHasGrownText": [ 100, 22651 ], + "_YourMonsHPWasHealedText": [ + 100, + 17108 + ], "wBaseUnusedBackpic": [ 1, 53556 @@ -17725,6 +20881,899 @@ 53554 ] }, + "text": { + "labels": [ + "AlreadyAsleepText", + "AlreadyConfusedText", + "AlreadyParalyzedText", + "AlreadyPoisonedText", + "AskNumber1FText", + "AskNumber1MText", + "AskNumber2FText", + "AskNumber2MText", + "AttackMissed2Text", + "AttackMissedText", + "BadlyPoisonedText", + "BattleText_AnEGGCantBattle", + "BattleText_CantEscape", + "BattleText_CantEscape2", + "BattleText_EnemyFled", + "BattleText_EnemyIsAboutToUseWillPlayerChangeMon", + "BattleText_EnemyMonFainted", + "BattleText_EnemySentOut", + "BattleText_EnemyWasDefeated", + "BattleText_GotAwaySafely", + "BattleText_ItemHealedConfusion", + "BattleText_ItemsCantBeUsedHere", + "BattleText_MonCantBeRecalled", + "BattleText_MonFainted", + "BattleText_MonHasNoMovesLeft", + "BattleText_MonIsAlreadyOut", + "BattleText_MonsLightScreenFell", + "BattleText_MonsReflectFaded", + "BattleText_PlayerPickedUpPayDayMoney", + "BattleText_RainContinuesToFall", + "BattleText_SafeguardFaded", + "BattleText_StringBuffer1GrewToLevel", + "BattleText_TargetRecoveredWithItem", + "BattleText_TargetWasHitByFutureSight", + "BattleText_TargetsEncoreEnded", + "BattleText_TheMoveIsDisabled", + "BattleText_TheRainStopped", + "BattleText_TheSandstormRages", + "BattleText_TheSandstormSubsided", + "BattleText_TheSunlightFaded", + "BattleText_TheSunlightIsStrong", + "BattleText_TheresNoEscapeFromTrainerBattle", + "BattleText_TheresNoPPLeftForThisMove", + "BattleText_TheresNoWillToBattle", + "BattleText_UseNextMon", + "BattleText_UserFledUsingAStringBuffer1", + "BattleText_UserHurtBySpikes", + "BattleText_UserRecoveredPPUsing", + "BattleText_UserWasReleasedFromStringBuffer1", + "BattleText_UsersHurtByStringBuffer1", + "BattleText_UsersStringBuffer1Activated", + "BattleText_WildFled", + "BattleText_WildMonIsAngry", + "BattleText_WildMonIsEating", + "BeatUpAttackText", + "BecameConfusedText", + "BeganToNapText", + "BellChimedText", + "BellyDrumText", + "BlewSpikesText", + "BlownAwayText", + "BracedItselfText", + "BugContestPrizeNoRoomText", + "ButItFailedText", + "CantEscapeNowText", + "ClampedByText", + "CoinVendor_Buy500CoinsText", + "CoinVendor_Buy50CoinsText", + "CoinVendor_CancelText", + "CoinVendor_CoinCaseFullText", + "CoinVendor_IntroText", + "CoinVendor_NoCoinCaseText", + "CoinVendor_NotEnoughMoneyText", + "CoinVendor_WelcomeText", + "CoinsScatteredText", + "ConfusedNoMoreText", + "ContestResults_ConsolationPrizeText", + "ContestResults_DidNotWinText", + "ContestResults_JoinUsNextTimeText", + "ContestResults_PartyFullText", + "ContestResults_PlayerWonAPrizeText", + "ContestResults_ReadyToJudgeText", + "ContestResults_ReturnPartyText", + "CopiedStatsText", + "CoveredByVeilText", + "CrashedText", + "CriticalHitText", + "DefrostedOpponentText", + "DestinyBondEffectText", + "DidntAffect1Text", + "DidntAffect2Text", + "DifficultBookshelfText", + "DisabledMoveText", + "DisabledNoMoreText", + "DoesntAffectText", + "DownpourText", + "DraggedOutText", + "DreamEatenText", + "EliminatedStatsText", + "EnduredText", + "EnemyHitTimesText", + "EvadedText", + "FastAsleepText", + "FellAsleepText", + "FellInLoveText", + "FledFromBattleText", + "FledInFearText", + "FlinchedText", + "ForesawAttackText", + "FrozenSolidText", + "FullyParalyzedText", + "GettingPumpedText", + "GotAnEncoreText", + "GotMoneyForWinningText", + "GymStatue_CityGymText", + "GymStatue_WinningTrainersText", + "HPIsFullText", + "HappinessText1", + "HappinessText2", + "HappinessText3", + "HasANightmareText", + "HasNoPPLeftText", + "HasSubstituteText", + "HomepageText", + "HookedPokemonAttackedText", + "HungOnText", + "HurtByBurnText", + "HurtByCurseText", + "HurtByPoisonText", + "HurtItselfText", + "IdentifiedText", + "IgnoredOrders2Text", + "IgnoredOrdersText", + "IgnoredSleepingText", + "InLoveWithText", + "IncenseBurnerText", + "InfatuationText", + "IsConfusedText", + "ItFailedText", + "LeechSeedSapsText", + "LightScreenEffectText", + "LoafingAroundText", + "LookTownMapText", + "LostAgainstText", + "MadeSubstituteText", + "MagazineBookshelfText", + "MagnitudeText", + "MartSignText", + "MerchandiseShelfText", + "MimicLearnedMoveText", + "MirrorMoveFailedText", + "MistText", + "MustRechargeText", + "NoPPLeftText", + "NotVeryEffectiveText", + "NothingHappenedText", + "NumberAcceptedFText", + "NumberAcceptedMText", + "NumberDeclinedFText", + "NumberDeclinedMText", + "NurseAskHealText", + "NurseDayText", + "NurseGoodbyeText", + "NurseMornText", + "NurseNiteText", + "NursePokerusText", + "NurseReturnPokemonText", + "NurseTakePokemonText", + "OneHitKOText", + "ParalyzedText", + "PerishCountText", + "PhoneFullFText", + "PhoneFullMText", + "PictureBookshelfText", + "PlayerHitTimesText", + "PokecenterSignText", + "PokemonFellFromTreeText", + "PresentFailedText", + "ProtectedByMistText", + "ProtectedByText", + "ProtectedItselfText", + "ProtectingItselfText", + "PutACurseText", + "RageBuildingText", + "ReceivedItemText", + "RecoilText", + "RecoveredUsingText", + "ReflectEffectText", + "RegainedHealthText", + "RegisteredNumberFText", + "RegisteredNumberMText", + "ReleasedByText", + "RematchFText", + "RematchMText", + "RestedText", + "SafeguardProtectText", + "SandstormBrewedText", + "SandstormHitsText", + "SentAllToMomText", + "SentHalfToMomText", + "SentSomeToMomText", + "SharedPainText", + "ShedLeechSeedText", + "SketchedText", + "SpikesText", + "SpiteEffectText", + "StartPerishText", + "StartedNightmareText", + "StoleText", + "StoringEnergyText", + "SubFadedText", + "SubTookDamageText", + "SuckedHealthText", + "SunGotBrightText", + "SuperEffectiveText", + "TVText", + "TeamRocketOathText", + "Text_BallCaught", + "Text_BattleEffectActivate", + "Text_BattleFoeEffectActivate", + "Text_BattleUser", + "Text_BreedHuh", + "Text_Gained", + "Text_MoveForgetCount", + "Text_NPCTraded", + "Text_PlayedPokeFlute", + "TiedAgainstText", + "TooWeakSubText", + "TookAimText", + "TookDownWithItText", + "TransformedText", + "TransformedTypeText", + "TrashCanText", + "TurnedAwayText", + "UnaffectedText", + "UnleashedEnergyText", + "UnusedRivalLossText", + "UnusedRivalWinText", + "UsedBindText", + "WantsToBattleText", + "WasBurnedText", + "WasDefrostedText", + "WasDisabledText", + "WasFrozenText", + "WasPoisonedText", + "WasSeededText", + "WasTrappedText", + "WentToSleepText", + "WildPokemonAppearedText", + "WindowText", + "WokeUpText", + "WontDropAnymoreText", + "WontObeyText", + "WontRiseAnymoreText", + "WrappedByText", + "_ActorNameText", + "_AlreadyASaveFileText", + "_AlreadySetUpText", + "_AlreadySurfingText", + "_AlreadyUsingStrengthText", + "_AnEggCantHoldAnItemText", + "_AnotherSaveFileText", + "_AreWeGeniusesText", + "_AskCutText", + "_AskDeleteMoveText", + "_AskFloorElevatorText", + "_AskForgetMoveText", + "_AskGiveNicknameText", + "_AskHeadbuttText", + "_AskItemMoveText", + "_AskQuantityThrowAwayText", + "_AskRockSmashText", + "_AskStrengthText", + "_AskSurfText", + "_AskThrowAwayText", + "_AskWaterfallText", + "_AskWhirlpoolText", + "_BGEventText", + "_BackAlreadyText", + "_BadgeRequiredText", + "_BallAlmostHadItText", + "_BallAppearedCaughtText", + "_BallBlockedText", + "_BallBoxFullText", + "_BallBrokeFreeText", + "_BallDodgedText", + "_BallDontBeAThiefText", + "_BallMissedText", + "_BallSentToPCText", + "_BallSoCloseText", + "_BargainShopComeAgainText", + "_BargainShopFinalPriceText", + "_BargainShopIntroText", + "_BargainShopNoFundsText", + "_BargainShopPackFullText", + "_BargainShopSoldOutText", + "_BargainShopThanksText", + "_BattleDugText", + "_BattleFlewText", + "_BattleGlowingText", + "_BattleLoweredHeadText", + "_BattleMadeWhirlwindText", + "_BattleMonNickCommaText", + "_BattleStatFellText", + "_BattleStatSharplyFellText", + "_BattleStatWentUpText", + "_BattleStatWentWayUpText", + "_BattleTookSunlightText", + "_BenFernText1", + "_BenFernText2A", + "_BenFernText2B", + "_BenFernText3A", + "_BenFernText3B", + "_BenIntroText1", + "_BenIntroText2", + "_BenIntroText3", + "_BidsFarewellToMonText", + "_BlindingFlashText", + "_BoostedExpPointsText", + "_BootedHMText", + "_BootedTMText", + "_BouldersMayMoveText", + "_BouldersMoveText", + "_BreedAppearsToCareForText", + "_BreedAskNicknameText", + "_BreedBrimmingWithEnergyText", + "_BreedClearboxText", + "_BreedEggHatchText", + "_BreedFriendlyText", + "_BreedNoInterestText", + "_BreedShowsInterestText", + "_BreedingIsNotPossibleText", + "_BugCatchingContestIsOverText", + "_BugCatchingContestTimeUpText", + "_BurnWasHealedText", + "_ButNoSpaceText", + "_CameToItsSensesText", + "_CanCutText", + "_CantAcceptEggText", + "_CantCarryItemText", + "_CantGetOffBikeText", + "_CantRegisterText", + "_CantSurfText", + "_CantUseDigText", + "_CantUseItemText", + "_CantUseTeleportText", + "_CardFlipChooseACardText", + "_CardFlipDarnText", + "_CardFlipNotEnoughCoinsText", + "_CardFlipPlaceYourBetText", + "_CardFlipPlayAgainText", + "_CardFlipPlayWithThreeCoinsText", + "_CardFlipShuffledText", + "_CardFlipYeahText", + "_CaughtAskNicknameText", + "_ChangeBoxSaveText", + "_ChangeWhichNumberText", + "_ClearAllSaveDataText", + "_ClockHasResetText", + "_ClockIsThisOKText", + "_ClockSetWithControlPadText", + "_ClockTimeMayBeWrongText", + "_CoinCaseCountText", + "_ComeAgainText", + "_ComeBackLaterText", + "_ComeBackText", + "_CompatibilityShouldTheyBreedText", + "_CongratulationsYourPokemonText", + "_ContainedMoveText", + "_ContestAlreadyCaughtText", + "_ContestAskSwitchText", + "_ContestCaughtMonText", + "_ContestJudging_FirstPlaceScoreText", + "_ContestJudging_FirstPlaceText", + "_ContestJudging_SecondPlaceScoreText", + "_ContestJudging_SecondPlaceText", + "_ContestJudging_ThirdPlaceScoreText", + "_ContestJudging_ThirdPlaceText", + "_CoordinatesEventText", + "_CorruptedEventText", + "_CuredOfPoisonText", + "_CutNothingText", + "_DSTIsThatOKText", + "_DayCareLadyIntroEggText", + "_DayCareLadyIntroText", + "_DayCareManIntroEggText", + "_DayCareManIntroText", + "_DaycareDummyText", + "_DeleterAskWhichMonText", + "_DeleterAskWhichMoveText", + "_DeleterEggText", + "_DeleterForgotMoveText", + "_DeleterIntroText", + "_DeleterNoComeAgainText", + "_DidNotLearnMoveText", + "_DoItMonText", + "_EggPhotoText", + "_EmptyMailboxText", + "_EndUsedMove1Text", + "_EndUsedMove2Text", + "_EndUsedMove3Text", + "_EndUsedMove4Text", + "_EndUsedMove5Text", + "_EnemyUsedOnText", + "_EnemyWithdrewText", + "_EnterTheAmountText", + "_EnterTheIDNoText", + "_EvolvedIntoText", + "_EvolvingText", + "_ExpPointsText", + "_FernIntroText1", + "_FernIntroText2", + "_FluteWakeUpText", + "_ForYourMonSendsText", + "_ForYourMonWillTradeText", + "_FoundAnEggText", + "_FoundItemText", + "_FruitBearingTreeText", + "_FruitPackIsFullText", + "_GearEllipseText", + "_GearOutOfServiceText", + "_GearTodayText", + "_GoForItMonText", + "_GoMonText", + "_GoodComeBackText", + "_GotBackMonText", + "_GotOffBikeText", + "_GotOnBikeText", + "_GrewToLevelText", + "_HaveNoRoomText", + "_HeadbuttNothingText", + "_HealthReturnedText", + "_HerbShopLadyIntroText", + "_HerbalLadyComeAgainText", + "_HerbalLadyFinalPriceText", + "_HerbalLadyHowManyText", + "_HerbalLadyNoMoneyText", + "_HerbalLadyPackFullText", + "_HerbalLadyThanksText", + "_HeyItsFruitText", + "_HoldStillText", + "_HugeWaterfallText", + "_IllKeepItThanksText", + "_IllRaiseYourMonText", + "_IsThisOKText", + "_ItemBelongsToSomeoneElseText", + "_ItemCantGetOnText", + "_ItemCantHeldText", + "_ItemCantUseOnEggText", + "_ItemCantUseOnMonText", + "_ItemGotOffText", + "_ItemGotOnText", + "_ItemLooksBitterText", + "_ItemOakWarningText", + "_ItemStatRoseText", + "_ItemStorageFullText", + "_ItemUsedText", + "_ItemWontHaveEffectText", + "_ItemfinderItemNearbyText", + "_ItemfinderNopeText", + "_ItemsDiscardedText", + "_ItemsOakWarningText", + "_ItemsThrowAwayText", + "_ItemsTooImportantText", + "_ItemsTossOutHowManyText", + "_ItsGoingToHatchText", + "_JustSawSomeRareMonText", + "_KarpGuruRecordText", + "_KnowsMoveText", + "_LC_DragText1", + "_LC_DragText2", + "_LC_Text1", + "_LC_Text10", + "_LC_Text11", + "_LC_Text2", + "_LC_Text3", + "_LC_Text4", + "_LC_Text5", + "_LC_Text6", + "_LC_Text7", + "_LC_Text8", + "_LC_Text9", + "_LastHealthyMonText", + "_LearnedMoveText", + "_LeftWithDayCareLadyText", + "_LeftWithDayCareManText", + "_LinkAbnormalMonText", + "_LinkAskTradeForText", + "_LinkTimeoutText", + "_LinkTradeCantBattleText", + "_LookAdorableDecoText", + "_LookClefairyPosterText", + "_LookGiantDecoText", + "_LookJigglypuffPosterText", + "_LookPikachuPosterText", + "_LookTownMapText", + "_LuckyNumberMatchPCText", + "_LuckyNumberMatchPartyText", + "_MagikarpGuruMeasureText", + "_MailAlreadyHoldingItemText", + "_MailAskSendToPCText", + "_MailClearedPutAwayText", + "_MailDetachedText", + "_MailEggText", + "_MailLoseMessageText", + "_MailMessageLostText", + "_MailMovedFromBoxText", + "_MailNoSpaceText", + "_MailPackFullText", + "_MailSentToPCText", + "_MailboxFullText", + "_MainMenuTimeUnknownText", + "_MartAskMoreText", + "_MartBoughtText", + "_MartCantBuyText", + "_MartComeAgainText", + "_MartFinalPriceText", + "_MartHowManyText", + "_MartNoMoneyText", + "_MartPackFullText", + "_MartSellHowManyText", + "_MartSellPriceText", + "_MartThanksText", + "_MartWelcomeText", + "_MayPassWhirlpoolText", + "_MayRegisterItemText", + "_MaySmashText", + "_MemoryGameDarnText", + "_MemoryGameYeahText", + "_MomBankWhatDoYouWantToDoText", + "_MomBoughtWithYourMoneyText", + "_MomFoundADollText", + "_MomFoundAnItemText", + "_MomHaventSavedThatMuchText", + "_MomHiHowAreYouText", + "_MomInsufficientFundsInWalletText", + "_MomIsThisAboutYourMoneyText", + "_MomItsInPCText", + "_MomItsInYourRoomText", + "_MomJustDoWhatYouCanText", + "_MomLeavingText1", + "_MomLeavingText2", + "_MomLeavingText3", + "_MomLostGearBookletText", + "_MomNotEnoughRoomInBankText", + "_MomNotEnoughRoomInWalletText", + "_MomSaveMoneyText", + "_MomStartSavingMoneyText", + "_MomStoreMoneyText", + "_MomStoredMoneyText", + "_MomTakeMoneyText", + "_MomTakenMoneyText", + "_MonNameBidsFarewellText", + "_MonNameSentToText", + "_MonWasSentToText", + "_MoveAskForgetText", + "_MoveBoulderText", + "_MoveCantForgetHMText", + "_MoveForgotText", + "_MoveKnowsOneText", + "_MoveMonWOMailSaveText", + "_MoveNameText", + "_MysteryGiftCanceledText", + "_MysteryGiftCommErrorText", + "_MysteryGiftFiveADayText", + "_MysteryGiftOneADayText", + "_MysteryGiftSentHomeText", + "_MysteryGiftSentText", + "_NPCTradeAfterText1", + "_NPCTradeAfterText2", + "_NPCTradeAfterText3", + "_NPCTradeCableText", + "_NPCTradeCancelText1", + "_NPCTradeCancelText2", + "_NPCTradeCancelText3", + "_NPCTradeCompleteText1", + "_NPCTradeCompleteText2", + "_NPCTradeCompleteText3", + "_NPCTradeFanfareText", + "_NPCTradeIntroText1", + "_NPCTradeIntroText2", + "_NPCTradeIntroText3", + "_NPCTradeWrongText1", + "_NPCTradeWrongText2", + "_NPCTradeWrongText3", + "_NameRaterBetterNameText", + "_NameRaterComeAgainText", + "_NameRaterEggText", + "_NameRaterFinishedText", + "_NameRaterHelloText", + "_NameRaterNamedText", + "_NameRaterPerfectNameText", + "_NameRaterSameNameText", + "_NameRaterWhatNameText", + "_NameRaterWhichMonText", + "_NewDexDataText", + "_NoCoinCaseText", + "_NoCoinsText", + "_NoCyclingText", + "_NoPhotoText", + "_NoRoomForEggText", + "_NoRoomTMHMText", + "_NotEnoughMoneyText", + "_NotYetText", + "_NothingHereText", + "_NothingToChooseText", + "_NothingToPutAwayText", + "_NothingToSellText", + "_OKComeBackText", + "_OPT_AddictivelyText", + "_OPT_AlmostPoisonouslyText", + "_OPT_AptlyNamedText", + "_OPT_BoldSortOfText", + "_OPT_CuteText", + "_OPT_EvolutionMustBeText", + "_OPT_ExcitingText", + "_OPT_FlippedOutText", + "_OPT_FriendlyText", + "_OPT_FrighteningText", + "_OPT_GuardedText", + "_OPT_HeartMeltinglyText", + "_OPT_HotHotHotText", + "_OPT_InspiringText", + "_OPT_IntroText1", + "_OPT_IntroText2", + "_OPT_IntroText3", + "_OPT_LooksInWaterText", + "_OPT_LovelyText", + "_OPT_MaryText1", + "_OPT_MischievouslyText", + "_OPT_NowText", + "_OPT_OakText1", + "_OPT_OakText2", + "_OPT_OakText3", + "_OPT_PleasantText", + "_OPT_PokemonChannelText", + "_OPT_PowerfulText", + "_OPT_ProvocativelyText", + "_OPT_SensuallyText", + "_OPT_SpeedyText", + "_OPT_StimulatingText", + "_OPT_SuaveDebonairText", + "_OPT_SweetAdorablyText", + "_OPT_TopicallyText", + "_OPT_UnbearablyText", + "_OPT_UndeniablyKindOfText", + "_OPT_WeirdText", + "_OPT_WigglySlicklyText", + "_OPT_WowImpressivelyText", + "_OTSendsText", + "_OakPCText1", + "_OakPCText2", + "_OakPCText3", + "_OakPCText4", + "_OakRating01", + "_OakRating02", + "_OakRating03", + "_OakRating04", + "_OakRating05", + "_OakRating06", + "_OakRating07", + "_OakRating08", + "_OakRating09", + "_OakRating10", + "_OakRating11", + "_OakRating12", + "_OakRating13", + "_OakRating14", + "_OakRating15", + "_OakRating16", + "_OakRating17", + "_OakRating18", + "_OakRating19", + "_OakText1", + "_OakText2", + "_OakText3", + "_OakText4", + "_OakText5", + "_OakText6", + "_OakText7", + "_OakThisIsntTheTimeText", + "_OakTimeHoursQuestionMarkText", + "_OakTimeHowManyMinutesText", + "_OakTimeIsItText", + "_OakTimeMinutesQuestionMarkText", + "_OakTimeOversleptText", + "_OakTimeSoDarkText", + "_OakTimeWhatDayIsItText", + "_OakTimeWhatHoursText", + "_OakTimeWhatTimeIsItText", + "_OakTimeWhoaMinutesText", + "_OakTimeWokeUpText", + "_OakTimeYikesText", + "_ObjectEventText", + "_ObtainedFruitText", + "_ObtainedTheVoltorbBadgeText", + "_OhFineThenText", + "_OnlyOneMonText", + "_PCCantDepositLastMonText", + "_PCCantTakeText", + "_PCGottaHavePokemonText", + "_PCMonHoldingMailText", + "_PCNoSingleMonText", + "_PCWhatText", + "_PPIsMaxedOutText", + "_PPRestoredText", + "_PPsIncreasedText", + "_PackEmptyText", + "_PackNoItemText", + "_PasswordAskEnterText", + "_PasswordAskResetClockText", + "_PasswordAskResetText", + "_PasswordWrongText", + "_PerfectHeresYourMonText", + "_PharmacyComeAgainText", + "_PharmacyFinalPriceText", + "_PharmacyHowManyText", + "_PharmacyIntroText", + "_PharmacyNoMoneyText", + "_PharmacyPackFullText", + "_PharmacyThanksText", + "_PhoneClickText", + "_PhoneEllipseText", + "_PhoneJustTalkToThemText", + "_PhoneOutOfAreaText", + "_PhoneThankYouText", + "_PhoneWrongNumberText", + "_PlayedFluteText", + "_PlayerFoundItemText", + "_PlayerPickedUpPayDayMoney", + "_PlayersPCAskWhatDoText", + "_PlayersPCDepositItemsText", + "_PlayersPCHowManyDepositText", + "_PlayersPCHowManyWithdrawText", + "_PlayersPCNoItemsText", + "_PlayersPCNoRoomDepositText", + "_PlayersPCNoRoomWithdrawText", + "_PlayersPCTurnOnText", + "_PlayersPCWithdrewItemsText", + "_PnP_BoldText", + "_PnP_CoolText", + "_PnP_CuteText", + "_PnP_GreatText", + "_PnP_HappyText", + "_PnP_InspiringText", + "_PnP_LazyText", + "_PnP_MyTypeText", + "_PnP_NoisyText", + "_PnP_OddText", + "_PnP_PickyText", + "_PnP_PrecociousText", + "_PnP_RightForMeText", + "_PnP_SoSoText", + "_PnP_SortOfOKText", + "_PnP_Text1", + "_PnP_Text2", + "_PnP_Text3", + "_PnP_Text4", + "_PnP_Text5", + "_PnP_WeirdText", + "_PocketIsFullText", + "_PoisonFaintText", + "_PoisonWhiteoutText", + "_PokecenterBillsPCText", + "_PokecenterOaksPCText", + "_PokecenterPCCantUseText", + "_PokecenterPCOaksClosedText", + "_PokecenterPCTurnOnText", + "_PokecenterPCWhoseText", + "_PokecenterPlayersPCText", + "_PokedexShowText", + "_PokegearAskDeleteText", + "_PokegearAskWhoCallText", + "_PokegearPressButtonText", + "_PokemonAskSwapItemText", + "_PokemonHoldItemText", + "_PokemonNotEnoughHPText", + "_PokemonNotHoldingText", + "_PokemonRemoveMailText", + "_PokemonSwapItemText", + "_PokemonTookItemText", + "_PrestoAllDoneText", + "_PutAwayAndSetUpText", + "_PutAwayTheDecoText", + "_PutItemInPocketText", + "_RaiseThePPOfWhichMoveText", + "_ReceiveItemText", + "_ReceivedEggText", + "_ReceivedItemText", + "_ReceivedTMHMText", + "_RecoveredSomeHPText", + "_RegisteredItemText", + "_RemainingTimeText", + "_RemoveMailText", + "_RepelUsedEarlierIsStillInEffectText", + "_RepelWoreOffText", + "_RestoreThePPOfWhichMoveText", + "_RetrieveMysteryGiftText", + "_RevitalizedText", + "_RidOfParalysisText", + "_RocketRadioText1", + "_RocketRadioText10", + "_RocketRadioText2", + "_RocketRadioText3", + "_RocketRadioText4", + "_RocketRadioText5", + "_RocketRadioText6", + "_RocketRadioText7", + "_RocketRadioText8", + "_RocketRadioText9", + "_RodBiteText", + "_RodNothingText", + "_SaveFileCorruptedText", + "_SavedTheGameText", + "_SavingDontTurnOffThePowerText", + "_SavingRecordText", + "_SentTrophyHomeText", + "_SetUpTheDecoText", + "_SlotsBetHowManyCoinsText", + "_SlotsDarnText", + "_SlotsLinedUpText", + "_SlotsNotEnoughCoinsText", + "_SlotsPlayAgainText", + "_SlotsRanOutOfCoinsText", + "_SlotsStartText", + "_SpaceSpaceColonText", + "_SquirtbottleNothingText", + "_StartMenuContestEndText", + "_StopLearningMoveText", + "_StoppedEvolvingText", + "_SweetScentNothingText", + "_TMHMNotCompatibleText", + "_TakeGoodCareOfEggText", + "_TakeGoodCareOfMonText", + "_TeleportReturnText", + "_TestEventText", + "_ThatCantBeUsedRightNowText", + "_ThatItemCantBePutInThePackText", + "_ThatsEnoughComeBackText", + "_TheBoxIsFullText", + "_TheItemWasPutInThePackText", + "_ThePasswordIsText", + "_ThereIsNoEggText", + "_ThrewAwayText", + "_TimeAskOkayText", + "_TimesetAskAdjustDSTText", + "_TimesetAskDSTText", + "_TimesetAskNotDSTText", + "_TimesetDSTText", + "_TimesetNotDSTText", + "_UnusedNothingHereText", + "_UseCutText", + "_UseDigText", + "_UseEscapeRopeText", + "_UseHeadbuttText", + "_UseRockSmashText", + "_UseSacredAshText", + "_UseStrengthText", + "_UseSweetScentText", + "_UseWaterfallText", + "_UseWhirlpoolText", + "_UsedInsteadText", + "_UsedMove1Text", + "_UsedMove2Text", + "_UsedSurfText", + "_WaitButtonText", + "_WarpingText", + "_WasDefrostedText", + "_WasSentToBillsPCText", + "_WhatDoYouWantToPlayWithText", + "_WhatShouldIRaiseText", + "_WhichMonPhotoText", + "_WhichSidePutAwayText", + "_WhichSidePutOnText", + "_WhitedOutText", + "_WillTradeText", + "_WillYouPlayWithMonText", + "_WindowAreaExceededErrorText", + "_WindowPoppingErrorText", + "_WokeUpText", + "_WouldYouLikeToSaveTheGameText", + "_YouCanHaveThisText", + "_YouCantUseItInABattleText", + "_YouDontHaveAMonText", + "_YouNeedTwoMonForBreedingText", + "_YourFoesWeakGetmMonText", + "_YourFriendIsNotReadyText", + "_YourMonHasGrownText", + "_YourMonsHPWasHealedText" + ] + }, "tilesets": { "TILESET_CAVE": {}, "TILESET_CHAMPIONS_ROOM": {}, diff --git a/tools/rom_manifest_silver.json b/tools/rom_manifest_silver.json index 065dc1c6..0b869a25 100644 --- a/tools/rom_manifest_silver.json +++ b/tools/rom_manifest_silver.json @@ -12712,6 +12712,22 @@ 16, 19557 ], + "AlreadyAsleepText": [ + 64, + 23414 + ], + "AlreadyConfusedText": [ + 64, + 22417 + ], + "AlreadyParalyzedText": [ + 64, + 24391 + ], + "AlreadyPoisonedText": [ + 64, + 23471 + ], "AmpharosBackpic": [ 29, 27083 @@ -12816,6 +12832,30 @@ 106, 18071 ], + "AskNumber1FText": [ + 64, + 19476 + ], + "AskNumber1MText": [ + 64, + 19144 + ], + "AskNumber2FText": [ + 64, + 19575 + ], + "AskNumber2MText": [ + 64, + 19229 + ], + "AttackMissed2Text": [ + 64, + 23016 + ], + "AttackMissedText": [ + 64, + 22997 + ], "AzumarillBackpic": [ 30, 17179 @@ -12832,6 +12872,10 @@ 9, 25135 ], + "BadlyPoisonedText": [ + 64, + 23451 + ], "BargainShopData": [ 5, 24282 @@ -12860,6 +12904,178 @@ 2, 23561 ], + "BattleText_AnEGGCantBattle": [ + 64, + 21740 + ], + "BattleText_CantEscape": [ + 64, + 21862 + ], + "BattleText_CantEscape2": [ + 64, + 21761 + ], + "BattleText_EnemyFled": [ + 64, + 20885 + ], + "BattleText_EnemyIsAboutToUseWillPlayerChangeMon": [ + 64, + 21648 + ], + "BattleText_EnemyMonFainted": [ + 64, + 21358 + ], + "BattleText_EnemySentOut": [ + 64, + 21694 + ], + "BattleText_EnemyWasDefeated": [ + 64, + 21408 + ], + "BattleText_GotAwaySafely": [ + 64, + 21821 + ], + "BattleText_ItemHealedConfusion": [ + 64, + 22384 + ], + "BattleText_ItemsCantBeUsedHere": [ + 64, + 21945 + ], + "BattleText_MonCantBeRecalled": [ + 64, + 21992 + ], + "BattleText_MonFainted": [ + 64, + 21563 + ], + "BattleText_MonHasNoMovesLeft": [ + 64, + 22072 + ], + "BattleText_MonIsAlreadyOut": [ + 64, + 21971 + ], + "BattleText_MonsLightScreenFell": [ + 64, + 21165 + ], + "BattleText_MonsReflectFaded": [ + 64, + 21195 + ], + "BattleText_PlayerPickedUpPayDayMoney": [ + 64, + 20748 + ], + "BattleText_RainContinuesToFall": [ + 64, + 21221 + ], + "BattleText_SafeguardFaded": [ + 64, + 21144 + ], + "BattleText_StringBuffer1GrewToLevel": [ + 64, + 22114 + ], + "BattleText_TargetRecoveredWithItem": [ + 64, + 21062 + ], + "BattleText_TargetWasHitByFutureSight": [ + 64, + 21116 + ], + "BattleText_TargetsEncoreEnded": [ + 64, + 22096 + ], + "BattleText_TheMoveIsDisabled": [ + 64, + 22049 + ], + "BattleText_TheRainStopped": [ + 64, + 21293 + ], + "BattleText_TheSandstormRages": [ + 64, + 21271 + ], + "BattleText_TheSandstormSubsided": [ + 64, + 21333 + ], + "BattleText_TheSunlightFaded": [ + 64, + 21312 + ], + "BattleText_TheSunlightIsStrong": [ + 64, + 21246 + ], + "BattleText_TheresNoEscapeFromTrainerBattle": [ + 64, + 21775 + ], + "BattleText_TheresNoPPLeftForThisMove": [ + 64, + 22015 + ], + "BattleText_TheresNoWillToBattle": [ + 64, + 21713 + ], + "BattleText_UseNextMon": [ + 64, + 21577 + ], + "BattleText_UserFledUsingAStringBuffer1": [ + 64, + 21839 + ], + "BattleText_UserHurtBySpikes": [ + 64, + 21876 + ], + "BattleText_UserRecoveredPPUsing": [ + 64, + 21087 + ], + "BattleText_UserWasReleasedFromStringBuffer1": [ + 64, + 22458 + ], + "BattleText_UsersHurtByStringBuffer1": [ + 64, + 22439 + ], + "BattleText_UsersStringBuffer1Activated": [ + 64, + 21924 + ], + "BattleText_WildFled": [ + 64, + 20867 + ], + "BattleText_WildMonIsAngry": [ + 64, + 22166 + ], + "BattleText_WildMonIsEating": [ + 64, + 22143 + ], "BattleWinSlideInEnemyTrainerFrontpic": [ 15, 27158 @@ -12876,6 +13092,14 @@ 106, 19029 ], + "BeatUpAttackText": [ + 64, + 25058 + ], + "BecameConfusedText": [ + 64, + 22364 + ], "BeedrillBackpic": [ 24, 19540 @@ -12888,6 +13112,14 @@ 104, 17937 ], + "BeganToNapText": [ + 64, + 22758 + ], + "BellChimedText": [ + 64, + 23381 + ], "BellossomBackpic": [ 26, 27056 @@ -12912,6 +13144,10 @@ 105, 16840 ], + "BellyDrumText": [ + 64, + 24967 + ], "BillsPCOrangePalette": [ 2, 21965 @@ -12928,6 +13164,10 @@ 104, 17262 ], + "BlewSpikesText": [ + 64, + 24899 + ], "BlisseyBackpic": [ 29, 31762 @@ -12940,14 +13180,26 @@ 107, 21782 ], + "BlownAwayText": [ + 64, + 23687 + ], "BoltEmote": [ 5, 17737 ], + "BracedItselfText": [ + 64, + 24750 + ], "BugCatchingContestantEventFlagTable": [ 4, 32186 ], + "BugContestPrizeNoRoomText": [ + 64, + 20500 + ], "BulbasaurBackpic": [ 29, 21089 @@ -12960,6 +13212,10 @@ 104, 16384 ], + "ButItFailedText": [ + 64, + 24229 + ], "ButterfreeBackpic": [ 21, 23446 @@ -12976,6 +13232,10 @@ 26, 27406 ], + "CantEscapeNowText": [ + 64, + 24492 + ], "CardFlipLZ01": [ 56, 21795 @@ -13112,6 +13372,10 @@ 48, 16384 ], + "ClampedByText": [ + 64, + 22542 + ], "ClefableBackpic": [ 22, 26062 @@ -13164,10 +13428,82 @@ 105, 19288 ], + "CoinVendor_Buy500CoinsText": [ + 64, + 20375 + ], + "CoinVendor_Buy50CoinsText": [ + 64, + 20344 + ], + "CoinVendor_CancelText": [ + 64, + 20469 + ], + "CoinVendor_CoinCaseFullText": [ + 64, + 20436 + ], + "CoinVendor_IntroText": [ + 64, + 20267 + ], + "CoinVendor_NoCoinCaseText": [ + 64, + 20196 + ], + "CoinVendor_NotEnoughMoneyText": [ + 64, + 20407 + ], + "CoinVendor_WelcomeText": [ + 64, + 20167 + ], + "CoinsScatteredText": [ + 64, + 24042 + ], + "ConfusedNoMoreText": [ + 64, + 22342 + ], "ContestMons": [ 37, 31672 ], + "ContestResults_ConsolationPrizeText": [ + 64, + 19913 + ], + "ContestResults_DidNotWinText": [ + 64, + 19967 + ], + "ContestResults_JoinUsNextTimeText": [ + 64, + 19875 + ], + "ContestResults_PartyFullText": [ + 64, + 20053 + ], + "ContestResults_PlayerWonAPrizeText": [ + 64, + 19818 + ], + "ContestResults_ReadyToJudgeText": [ + 64, + 19046 + ], + "ContestResults_ReturnPartyText": [ + 64, + 20001 + ], + "CopiedStatsText": [ + 64, + 25003 + ], "CopyBackpic": [ 15, 31090 @@ -13188,6 +13524,14 @@ 107, 19610 ], + "CoveredByVeilText": [ + 64, + 24785 + ], + "CrashedText": [ + 64, + 23035 + ], "CreditsBellossomGFX": [ 33, 27958 @@ -13216,6 +13560,10 @@ 58, 20882 ], + "CriticalHitText": [ + 64, + 23099 + ], "CrobatBackpic": [ 29, 31225 @@ -13280,6 +13628,10 @@ 9, 29015 ], + "DefrostedOpponentText": [ + 64, + 23552 + ], "DelibirdBackpic": [ 26, 28452 @@ -13292,6 +13644,10 @@ 107, 19939 ], + "DestinyBondEffectText": [ + 64, + 23307 + ], "DewgongBackpic": [ 30, 25706 @@ -13304,6 +13660,18 @@ 105, 18852 ], + "DidntAffect1Text": [ + 64, + 24257 + ], + "DidntAffect2Text": [ + 64, + 24277 + ], + "DifficultBookshelfText": [ + 64, + 18433 + ], "DiglettBackpic": [ 21, 32573 @@ -13328,6 +13696,14 @@ 2, 31366 ], + "DisabledMoveText": [ + 64, + 22711 + ], + "DisabledNoMoreText": [ + 64, + 22270 + ], "DittoBackpic": [ 30, 20050 @@ -13364,6 +13740,10 @@ 105, 18509 ], + "DoesntAffectText": [ + 64, + 23078 + ], "DoneTileAnimation": [ 63, 17058 @@ -13380,6 +13760,14 @@ 107, 20701 ], + "DownpourText": [ + 64, + 24920 + ], + "DraggedOutText": [ + 64, + 24313 + ], "DragonairBackpic": [ 28, 25209 @@ -13420,6 +13808,10 @@ 4, 19964 ], + "DreamEatenText": [ + 64, + 23516 + ], "DrowzeeBackpic": [ 30, 20558 @@ -13540,10 +13932,22 @@ 4, 31045 ], + "EliminatedStatsText": [ + 64, + 24107 + ], + "EnduredText": [ + 64, + 22629 + ], "EnemyHPBarBorderGFX": [ 62, 19378 ], + "EnemyHitTimesText": [ + 64, + 23725 + ], "EnteiBackpic": [ 29, 28478 @@ -13572,6 +13976,10 @@ 107, 16720 ], + "EvadedText": [ + 64, + 23996 + ], "EvosAttacksPointers": [ 16, 26557 @@ -13620,6 +14028,10 @@ 105, 18395 ], + "FastAsleepText": [ + 64, + 22188 + ], "FearowBackpic": [ 30, 21309 @@ -13632,6 +14044,14 @@ 104, 18694 ], + "FellAsleepText": [ + 64, + 23398 + ], + "FellInLoveText": [ + 64, + 24768 + ], "FeraligatrBackpic": [ 22, 26490 @@ -13676,10 +14096,22 @@ 106, 17185 ], + "FledFromBattleText": [ + 64, + 23649 + ], + "FledInFearText": [ + 64, + 23670 + ], "FlickeringCaveEntrancePalette": [ 63, 17709 ], + "FlinchedText": [ + 64, + 22239 + ], "Font": [ 62, 17138 @@ -13700,6 +14132,10 @@ 62, 21262 ], + "ForesawAttackText": [ + 64, + 25036 + ], "ForretressBackpic": [ 46, 17057 @@ -13716,6 +14152,14 @@ 62, 18674 ], + "FrozenSolidText": [ + 64, + 22219 + ], + "FullyParalyzedText": [ + 64, + 24370 + ], "FurretBackpic": [ 26, 19622 @@ -13800,6 +14244,10 @@ 15, 31064 ], + "GettingPumpedText": [ + 64, + 23789 + ], "GirafarigBackpic": [ 25, 18275 @@ -13884,6 +14332,14 @@ 105, 17623 ], + "GotAnEncoreText": [ + 64, + 23230 + ], + "GotMoneyForWinningText": [ + 64, + 21380 + ], "GranbullBackpic": [ 28, 23351 @@ -13952,6 +14408,14 @@ 106, 16503 ], + "GymStatue_CityGymText": [ + 64, + 20118 + ], + "GymStatue_WinningTrainersText": [ + 64, + 20132 + ], "HOF_SlideBackpic": [ 33, 26135 @@ -13968,10 +14432,38 @@ 62, 19410 ], + "HPIsFullText": [ + 64, + 24297 + ], + "HappinessText1": [ + 64, + 20689 + ], + "HappinessText2": [ + 64, + 20636 + ], + "HappinessText3": [ + 64, + 20594 + ], "HappyEmote": [ 5, 17545 ], + "HasANightmareText": [ + 64, + 20968 + ], + "HasNoPPLeftText": [ + 64, + 22895 + ], + "HasSubstituteText": [ + 64, + 23853 + ], "HaunterBackpic": [ 28, 17025 @@ -14064,6 +14556,14 @@ 56, 24760 ], + "HomepageText": [ + 64, + 18800 + ], + "HookedPokemonAttackedText": [ + 64, + 20792 + ], "HoothootBackpic": [ 27, 28706 @@ -14124,6 +14624,26 @@ 107, 20272 ], + "HungOnText": [ + 64, + 22606 + ], + "HurtByBurnText": [ + 64, + 20926 + ], + "HurtByCurseText": [ + 64, + 20988 + ], + "HurtByPoisonText": [ + 64, + 20904 + ], + "HurtItselfText": [ + 64, + 22308 + ], "HypnoBackpic": [ 23, 30776 @@ -14144,6 +14664,10 @@ 35, 27300 ], + "IdentifiedText": [ + 64, + 24678 + ], "IgglybuffBackpic": [ 30, 16914 @@ -14156,6 +14680,30 @@ 106, 21359 ], + "IgnoredOrders2Text": [ + 64, + 25098 + ], + "IgnoredOrdersText": [ + 64, + 22811 + ], + "IgnoredSleepingText": [ + 64, + 22832 + ], + "InLoveWithText": [ + 64, + 22649 + ], + "IncenseBurnerText": [ + 64, + 18671 + ], + "InfatuationText": [ + 64, + 22671 + ], "InitializeEventsScript": [ 64, 17256 @@ -14224,6 +14772,14 @@ 1, 25030 ], + "IsConfusedText": [ + 64, + 22292 + ], + "ItFailedText": [ + 64, + 24245 + ], "ItemAttributes": [ 1, 26726 @@ -14504,6 +15060,10 @@ 106, 20341 ], + "LeechSeedSapsText": [ + 64, + 20948 + ], "LickitungBackpic": [ 27, 32257 @@ -14516,6 +15076,10 @@ 105, 21184 ], + "LightScreenEffectText": [ + 64, + 24169 + ], "LoadOrientedFrontpic": [ 20, 22948 @@ -14524,6 +15088,18 @@ 112, 19520 ], + "LoafingAroundText": [ + 64, + 22734 + ], + "LookTownMapText": [ + 64, + 18740 + ], + "LostAgainstText": [ + 64, + 21631 + ], "LugiaBackpic": [ 28, 29483 @@ -14572,6 +15148,14 @@ 105, 16484 ], + "MadeSubstituteText": [ + 64, + 23831 + ], + "MagazineBookshelfText": [ + 64, + 18506 + ], "MagbyBackpic": [ 28, 24901 @@ -14652,6 +15236,10 @@ 105, 18286 ], + "MagnitudeText": [ + 64, + 24838 + ], "MankeyBackpic": [ 23, 29571 @@ -14724,6 +15312,10 @@ 105, 20838 ], + "MartSignText": [ + 64, + 19011 + ], "Marts": [ 5, 25342 @@ -14752,6 +15344,10 @@ 104, 22004 ], + "MerchandiseShelfText": [ + 64, + 18713 + ], "MetapodBackpic": [ 30, 23291 @@ -14800,6 +15396,14 @@ 107, 21678 ], + "MimicLearnedMoveText": [ + 64, + 23963 + ], + "MirrorMoveFailedText": [ + 64, + 24438 + ], "MisdreavusBackpic": [ 25, 32010 @@ -14812,6 +15416,10 @@ 107, 17160 ], + "MistText": [ + 64, + 23744 + ], "MoltresBackpic": [ 23, 19733 @@ -15252,6 +15860,10 @@ 61, 17688 ], + "MustRechargeText": [ + 64, + 22252 + ], "NPCTradeCableText": [ 63, 19744 @@ -15380,6 +15992,10 @@ 104, 20465 ], + "NoPPLeftText": [ + 64, + 22862 + ], "NoctowlBackpic": [ 27, 30646 @@ -15392,6 +16008,62 @@ 106, 20240 ], + "NotVeryEffectiveText": [ + 64, + 23158 + ], + "NothingHappenedText": [ + 64, + 24206 + ], + "NumberAcceptedFText": [ + 64, + 19632 + ], + "NumberAcceptedMText": [ + 64, + 19286 + ], + "NumberDeclinedFText": [ + 64, + 19664 + ], + "NumberDeclinedMText": [ + 64, + 19322 + ], + "NurseAskHealText": [ + 64, + 18079 + ], + "NurseDayText": [ + 64, + 17984 + ], + "NurseGoodbyeText": [ + 64, + 18224 + ], + "NurseMornText": [ + 64, + 17941 + ], + "NurseNiteText": [ + 64, + 18020 + ], + "NursePokerusText": [ + 64, + 18278 + ], + "NurseReturnPokemonText": [ + 64, + 18172 + ], + "NurseTakePokemonText": [ + 64, + 18146 + ], "OctilleryBackpic": [ 30, 17443 @@ -15444,6 +16116,10 @@ 106, 17518 ], + "OneHitKOText": [ + 64, + 23116 + ], "OnixBackpic": [ 25, 16763 @@ -15480,6 +16156,10 @@ 2, 24741 ], + "ParalyzedText": [ + 64, + 24333 + ], "ParasBackpic": [ 29, 17277 @@ -15508,6 +16188,10 @@ 2, 31430 ], + "PerishCountText": [ + 64, + 21034 + ], "PersianBackpic": [ 24, 30047 @@ -15536,6 +16220,14 @@ 36, 17466 ], + "PhoneFullFText": [ + 64, + 19730 + ], + "PhoneFullMText": [ + 64, + 19383 + ], "PhoneOutOfAreaScript": [ 36, 17958 @@ -15560,6 +16252,10 @@ 106, 21136 ], + "PictureBookshelfText": [ + 64, + 18463 + ], "PidgeotBackpic": [ 27, 18421 @@ -15648,6 +16344,14 @@ 5, 28636 ], + "PlayerHitTimesText": [ + 64, + 23706 + ], + "PokecenterSignText": [ + 64, + 18982 + ], "PokedexCursorPalette": [ 2, 21841 @@ -15688,6 +16392,10 @@ 60, 26439 ], + "PokemonFellFromTreeText": [ + 64, + 20820 + ], "PokemonNames": [ 108, 19316 @@ -15796,6 +16504,10 @@ 0, 14778 ], + "PresentFailedText": [ + 64, + 25072 + ], "PrimeapeBackpic": [ 26, 18546 @@ -15808,6 +16520,22 @@ 104, 22560 ], + "ProtectedByMistText": [ + 64, + 23766 + ], + "ProtectedByText": [ + 64, + 24414 + ], + "ProtectedItselfText": [ + 64, + 24602 + ], + "ProtectingItselfText": [ + 64, + 24623 + ], "PsyduckBackpic": [ 26, 22120 @@ -15832,6 +16560,10 @@ 107, 22333 ], + "PutACurseText": [ + 64, + 24562 + ], "PuzzlePieceBorderData.TileBordersGFX": [ 56, 24368 @@ -15880,6 +16612,10 @@ 36, 21708 ], + "RageBuildingText": [ + 64, + 23208 + ], "RaichuBackpic": [ 25, 22411 @@ -15944,6 +16680,46 @@ 63, 17597 ], + "ReceivedItemText": [ + 64, + 19856 + ], + "RecoilText": [ + 64, + 23810 + ], + "RecoveredUsingText": [ + 64, + 21896 + ], + "ReflectEffectText": [ + 64, + 24188 + ], + "RegainedHealthText": [ + 64, + 22977 + ], + "RegisteredNumberFText": [ + 64, + 19603 + ], + "RegisteredNumberMText": [ + 64, + 19257 + ], + "ReleasedByText": [ + 64, + 24857 + ], + "RematchFText": [ + 64, + 19786 + ], + "RematchMText": [ + 64, + 19439 + ], "RemoraidBackpic": [ 26, 24247 @@ -15956,6 +16732,10 @@ 107, 19716 ], + "RestedText": [ + 64, + 22942 + ], "RhydonBackpic": [ 23, 20980 @@ -16008,6 +16788,10 @@ 5, 17609 ], + "SafeguardProtectText": [ + 64, + 24808 + ], "SandshrewBackpic": [ 23, 31577 @@ -16032,6 +16816,14 @@ 104, 19350 ], + "SandstormBrewedText": [ + 64, + 24729 + ], + "SandstormHitsText": [ + 64, + 21011 + ], "ScizorBackpic": [ 26, 16384 @@ -16112,6 +16904,18 @@ 105, 18734 ], + "SentAllToMomText": [ + 64, + 21507 + ], + "SentHalfToMomText": [ + 64, + 21488 + ], + "SentSomeToMomText": [ + 64, + 21442 + ], "SentretBackpic": [ 30, 18492 @@ -16124,6 +16928,14 @@ 106, 19896 ], + "SharedPainText": [ + 64, + 23248 + ], + "ShedLeechSeedText": [ + 64, + 24879 + ], "ShellderBackpic": [ 24, 16779 @@ -16172,6 +16984,10 @@ 107, 20164 ], + "SketchedText": [ + 64, + 23288 + ], "SkiploomBackpic": [ 28, 29181 @@ -16332,6 +17148,10 @@ 36, 17910 ], + "SpikesText": [ + 64, + 24646 + ], "SpinarakBackpic": [ 30, 24024 @@ -16344,6 +17164,10 @@ 106, 20577 ], + "SpiteEffectText": [ + 64, + 23348 + ], "SpriteMons": [ 5, 18025 @@ -16392,6 +17216,14 @@ 105, 22613 ], + "StartPerishText": [ + 64, + 24695 + ], + "StartedNightmareText": [ + 64, + 24512 + ], "StaryuBackpic": [ 29, 24253 @@ -16432,10 +17264,30 @@ 107, 18056 ], + "StoleText": [ + 64, + 24463 + ], + "StoringEnergyText": [ + 64, + 22563 + ], "StubbedGetFrontpic": [ 112, 19066 ], + "SubFadedText": [ + 64, + 23941 + ], + "SubTookDamageText": [ + 64, + 23906 + ], + "SuckedHealthText": [ + 64, + 23493 + ], "SudowoodoBackpic": [ 25, 27987 @@ -16460,6 +17312,10 @@ 107, 22111 ], + "SunGotBrightText": [ + 64, + 24941 + ], "SunfloraBackpic": [ 23, 20565 @@ -16484,6 +17340,10 @@ 106, 23272 ], + "SuperEffectiveText": [ + 64, + 23135 + ], "SwarmGrassWildMons": [ 10, 32284 @@ -16508,6 +17368,10 @@ 4, 23142 ], + "TVText": [ + 64, + 18789 + ], "TangelaBackpic": [ 30, 29165 @@ -16532,6 +17396,10 @@ 105, 23380 ], + "TeamRocketOathText": [ + 64, + 18560 + ], "TeddiursaBackpic": [ 29, 29309 @@ -16568,14 +17436,50 @@ 105, 17300 ], + "Text_BallCaught": [ + 102, + 17502 + ], + "Text_BattleEffectActivate": [ + 101, + 18077 + ], + "Text_BattleFoeEffectActivate": [ + 101, + 18114 + ], + "Text_BattleUser": [ + 101, + 18149 + ], "Text_BreedHuh": [ 101, 18257 ], + "Text_Gained": [ + 100, + 24078 + ], + "Text_MoveForgetCount": [ + 102, + 17088 + ], + "Text_NPCTraded": [ + 100, + 20317 + ], + "Text_PlayedPokeFlute": [ + 102, + 17801 + ], "TheEndGFX": [ 50, 31933 ], + "TiedAgainstText": [ + 64, + 21425 + ], "TilesetBGPalette": [ 2, 30558 @@ -16632,6 +17536,18 @@ 106, 21576 ], + "TooWeakSubText": [ + 64, + 23874 + ], + "TookAimText": [ + 64, + 23275 + ], + "TookDownWithItText": [ + 64, + 23183 + ], "TotodileBackpic": [ 27, 23780 @@ -16744,6 +17660,18 @@ 14, 22978 ], + "TransformedText": [ + 64, + 24142 + ], + "TransformedTypeText": [ + 64, + 24071 + ], + "TrashCanText": [ + 64, + 18893 + ], "TreeMonMaps": [ 46, 25574 @@ -16752,6 +17680,10 @@ 46, 25712 ], + "TurnedAwayText": [ + 64, + 22793 + ], "TypeMatchups": [ 13, 19713 @@ -16808,6 +17740,14 @@ 107, 16820 ], + "UnaffectedText": [ + 64, + 23062 + ], + "UnleashedEnergyText": [ + 64, + 22585 + ], "UnownABackpic": [ 46, 20410 @@ -17036,6 +17976,14 @@ 46, 18992 ], + "UnusedRivalLossText": [ + 64, + 21525 + ], + "UnusedRivalWinText": [ + 64, + 21593 + ], "UrsaringBackpic": [ 29, 28756 @@ -17048,6 +17996,10 @@ 107, 19077 ], + "UsedBindText": [ + 64, + 22486 + ], "VaporeonBackpic": [ 29, 19047 @@ -17148,6 +18100,10 @@ 63, 17061 ], + "WantsToBattleText": [ + 64, + 20847 + ], "WartortleBackpic": [ 26, 19980 @@ -17160,6 +18116,34 @@ 104, 17164 ], + "WasBurnedText": [ + 64, + 23537 + ], + "WasDefrostedText": [ + 64, + 24544 + ], + "WasDisabledText": [ + 64, + 24018 + ], + "WasFrozenText": [ + 64, + 23570 + ], + "WasPoisonedText": [ + 64, + 23434 + ], + "WasSeededText": [ + 64, + 23981 + ], + "WasTrappedText": [ + 64, + 22505 + ], "WaveSamples": [ 58, 19890 @@ -17200,6 +18184,10 @@ 105, 21402 ], + "WentToSleepText": [ + 64, + 22924 + ], "WigglytuffBackpic": [ 30, 19536 @@ -17212,6 +18200,14 @@ 104, 20688 ], + "WildPokemonAppearedText": [ + 64, + 20770 + ], + "WindowText": [ + 64, + 18759 + ], "WobbuffetBackpic": [ 29, 30955 @@ -17224,6 +18220,22 @@ 107, 17376 ], + "WokeUpText": [ + 64, + 22207 + ], + "WontDropAnymoreText": [ + 64, + 23620 + ], + "WontObeyText": [ + 64, + 22777 + ], + "WontRiseAnymoreText": [ + 64, + 23591 + ], "WooperBackpic": [ 30, 27113 @@ -17236,6 +18248,10 @@ 107, 16496 ], + "WrappedByText": [ + 64, + 22521 + ], "WriteTileFromAnimBuffer": [ 63, 17585 @@ -17292,14 +18308,146 @@ 104, 20809 ], + "_ActorNameText": [ + 101, + 18023 + ], + "_AlreadyASaveFileText": [ + 101, + 23097 + ], + "_AlreadySetUpText": [ + 100, + 17756 + ], + "_AlreadySurfingText": [ + 101, + 16405 + ], + "_AlreadyUsingStrengthText": [ + 101, + 16658 + ], + "_AnEggCantHoldAnItemText": [ + 101, + 17731 + ], + "_AnotherSaveFileText": [ + 101, + 23151 + ], "_AreWeGeniusesText": [ 100, 22601 ], + "_AskCutText": [ + 101, + 17313 + ], + "_AskDeleteMoveText": [ + 102, + 18433 + ], + "_AskFloorElevatorText": [ + 100, + 19953 + ], + "_AskForgetMoveText": [ + 102, + 16969 + ], + "_AskGiveNicknameText": [ + 102, + 17604 + ], + "_AskHeadbuttText": [ + 101, + 17021 + ], + "_AskItemMoveText": [ + 101, + 17959 + ], + "_AskQuantityThrowAwayText": [ + 101, + 17791 + ], + "_AskRockSmashText": [ + 101, + 17128 + ], + "_AskStrengthText": [ + 101, + 16737 + ], + "_AskSurfText": [ + 101, + 16429 + ], + "_AskThrowAwayText": [ + 101, + 17769 + ], + "_AskWaterfallText": [ + 101, + 16512 + ], + "_AskWhirlpoolText": [ + 101, + 16933 + ], + "_BGEventText": [ + 101, + 23443 + ], "_BackAlreadyText": [ 100, 22807 ], + "_BadgeRequiredText": [ + 100, + 24749 + ], + "_BallAlmostHadItText": [ + 102, + 17450 + ], + "_BallAppearedCaughtText": [ + 102, + 17418 + ], + "_BallBlockedText": [ + 102, + 18167 + ], + "_BallBoxFullText": [ + 102, + 18273 + ], + "_BallBrokeFreeText": [ + 102, + 17389 + ], + "_BallDodgedText": [ + 102, + 17313 + ], + "_BallDontBeAThiefText": [ + 102, + 18198 + ], + "_BallMissedText": [ + 102, + 17367 + ], + "_BallSentToPCText": [ + 102, + 17534 + ], + "_BallSoCloseText": [ + 102, + 17473 + ], "_BargainShopComeAgainText": [ 101, 24234 @@ -17328,10 +18476,110 @@ 101, 24113 ], + "_BattleDugText": [ + 101, + 18243 + ], + "_BattleFlewText": [ + 101, + 18227 + ], + "_BattleGlowingText": [ + 101, + 18213 + ], + "_BattleLoweredHeadText": [ + 101, + 18193 + ], + "_BattleMadeWhirlwindText": [ + 101, + 18153 + ], + "_BattleMonNickCommaText": [ + 100, + 24221 + ], + "_BattleStatFellText": [ + 101, + 18141 + ], + "_BattleStatSharplyFellText": [ + 101, + 18124 + ], + "_BattleStatWentUpText": [ + 101, + 18103 + ], + "_BattleStatWentWayUpText": [ + 101, + 18087 + ], + "_BattleTookSunlightText": [ + 101, + 18173 + ], + "_BenFernText1": [ + 100, + 19047 + ], + "_BenFernText2A": [ + 100, + 19061 + ], + "_BenFernText2B": [ + 100, + 19080 + ], + "_BenFernText3A": [ + 100, + 19098 + ], + "_BenFernText3B": [ + 100, + 19112 + ], + "_BenIntroText1": [ + 100, + 18968 + ], + "_BenIntroText2": [ + 100, + 18986 + ], + "_BenIntroText3": [ + 100, + 18997 + ], "_BidsFarewellToMonText": [ 100, 18201 ], + "_BlindingFlashText": [ + 100, + 24847 + ], + "_BoostedExpPointsText": [ + 100, + 24091 + ], + "_BootedHMText": [ + 100, + 24343 + ], + "_BootedTMText": [ + 100, + 24326 + ], + "_BouldersMayMoveText": [ + 101, + 16821 + ], + "_BouldersMoveText": [ + 101, + 16793 + ], "_BreedAppearsToCareForText": [ 101, 18477 @@ -17364,6 +18612,26 @@ 101, 18534 ], + "_BreedingIsNotPossibleText": [ + 100, + 17240 + ], + "_BugCatchingContestIsOverText": [ + 100, + 19996 + ], + "_BugCatchingContestTimeUpText": [ + 100, + 19967 + ], + "_BurnWasHealedText": [ + 100, + 16563 + ], + "_ButNoSpaceText": [ + 100, + 20070 + ], "_CGB_GSIntro.ShellderLaprasBGPalette": [ 2, 22241 @@ -17376,10 +18644,114 @@ 2, 22895 ], + "_CameToItsSensesText": [ + 100, + 16694 + ], + "_CanCutText": [ + 101, + 17353 + ], "_CantAcceptEggText": [ 100, 22429 ], + "_CantCarryItemText": [ + 101, + 17392 + ], + "_CantGetOffBikeText": [ + 101, + 17246 + ], + "_CantRegisterText": [ + 101, + 17929 + ], + "_CantSurfText": [ + 101, + 16384 + ], + "_CantUseDigText": [ + 101, + 16582 + ], + "_CantUseItemText": [ + 100, + 24782 + ], + "_CantUseTeleportText": [ + 101, + 16636 + ], + "_CardFlipChooseACardText": [ + 102, + 17214 + ], + "_CardFlipDarnText": [ + 102, + 17306 + ], + "_CardFlipNotEnoughCoinsText": [ + 102, + 17195 + ], + "_CardFlipPlaceYourBetText": [ + 102, + 17230 + ], + "_CardFlipPlayAgainText": [ + 102, + 17247 + ], + "_CardFlipPlayWithThreeCoinsText": [ + 102, + 17171 + ], + "_CardFlipShuffledText": [ + 102, + 17268 + ], + "_CardFlipYeahText": [ + 102, + 17299 + ], + "_CaughtAskNicknameText": [ + 101, + 19555 + ], + "_ChangeBoxSaveText": [ + 101, + 23232 + ], + "_ChangeWhichNumberText": [ + 100, + 17145 + ], + "_ClearAllSaveDataText": [ + 102, + 16838 + ], + "_ClockHasResetText": [ + 101, + 22815 + ], + "_ClockIsThisOKText": [ + 101, + 22802 + ], + "_ClockSetWithControlPadText": [ + 101, + 22739 + ], + "_ClockTimeMayBeWrongText": [ + 101, + 22685 + ], + "_CoinCaseCountText": [ + 102, + 17827 + ], "_ComeAgainText": [ 100, 22990 @@ -17388,6 +18760,78 @@ 100, 22576 ], + "_ComeBackText": [ + 100, + 24291 + ], + "_CompatibilityShouldTheyBreedText": [ + 100, + 17267 + ], + "_CongratulationsYourPokemonText": [ + 101, + 23542 + ], + "_ContainedMoveText": [ + 100, + 24361 + ], + "_ContestAlreadyCaughtText": [ + 101, + 19013 + ], + "_ContestAskSwitchText": [ + 101, + 18999 + ], + "_ContestCaughtMonText": [ + 101, + 18984 + ], + "_ContestJudging_FirstPlaceScoreText": [ + 101, + 19111 + ], + "_ContestJudging_FirstPlaceText": [ + 101, + 19042 + ], + "_ContestJudging_SecondPlaceScoreText": [ + 101, + 19198 + ], + "_ContestJudging_SecondPlaceText": [ + 101, + 19150 + ], + "_ContestJudging_ThirdPlaceScoreText": [ + 101, + 19276 + ], + "_ContestJudging_ThirdPlaceText": [ + 101, + 19229 + ], + "_CoordinatesEventText": [ + 101, + 23453 + ], + "_CorruptedEventText": [ + 101, + 23410 + ], + "_CuredOfPoisonText": [ + 100, + 16516 + ], + "_CutNothingText": [ + 100, + 24818 + ], + "_DSTIsThatOKText": [ + 102, + 18693 + ], "_DayCareLadyIntroEggText": [ 100, 22176 @@ -17408,22 +18852,170 @@ 100, 21900 ], + "_DeleterAskWhichMonText": [ + 102, + 18680 + ], + "_DeleterAskWhichMoveText": [ + 102, + 18551 + ], + "_DeleterEggText": [ + 102, + 18494 + ], + "_DeleterForgotMoveText": [ + 102, + 18460 + ], + "_DeleterIntroText": [ + 102, + 18587 + ], + "_DeleterNoComeAgainText": [ + 102, + 18525 + ], + "_DidNotLearnMoveText": [ + 102, + 16943 + ], + "_DoItMonText": [ + 100, + 24157 + ], + "_EggPhotoText": [ + 100, + 23443 + ], "_EmptyMailboxText": [ 101, 18563 ], + "_EndUsedMove1Text": [ + 101, + 18062 + ], + "_EndUsedMove2Text": [ + 101, + 18065 + ], + "_EndUsedMove3Text": [ + 101, + 18068 + ], + "_EndUsedMove4Text": [ + 101, + 18071 + ], + "_EndUsedMove5Text": [ + 101, + 18074 + ], + "_EnemyUsedOnText": [ + 100, + 16970 + ], + "_EnemyWithdrewText": [ + 100, + 16951 + ], + "_EnterTheAmountText": [ + 100, + 17524 + ], + "_EnterTheIDNoText": [ + 100, + 17506 + ], + "_EvolvedIntoText": [ + 101, + 23571 + ], + "_EvolvingText": [ + 101, + 23623 + ], + "_ExpPointsText": [ + 100, + 24123 + ], + "_FernIntroText1": [ + 100, + 19015 + ], + "_FernIntroText2": [ + 100, + 19031 + ], + "_FluteWakeUpText": [ + 102, + 17773 + ], "_ForYourMonSendsText": [ 100, 18255 ], + "_ForYourMonWillTradeText": [ + 100, + 18314 + ], "_FoundAnEggText": [ 100, 23013 ], + "_FoundItemText": [ + 101, + 17376 + ], + "_FruitBearingTreeText": [ + 100, + 16384 + ], + "_FruitPackIsFullText": [ + 100, + 16446 + ], + "_GearEllipseText": [ + 102, + 16486 + ], + "_GearOutOfServiceText": [ + 102, + 16489 + ], + "_GearTodayText": [ + 102, + 16484 + ], + "_GoForItMonText": [ + 100, + 24172 + ], + "_GoMonText": [ + 100, + 24145 + ], + "_GoodComeBackText": [ + 100, + 24272 + ], "_GotBackMonText": [ 100, 22788 ], + "_GotOffBikeText": [ + 101, + 17291 + ], + "_GotOnBikeText": [ + 101, + 17270 + ], + "_GrewToLevelText": [ + 100, + 16664 + ], "_HallOfFamePC.HOFMaster": [ 33, 26331 @@ -17436,6 +19028,14 @@ 100, 22919 ], + "_HeadbuttNothingText": [ + 101, + 17005 + ], + "_HealthReturnedText": [ + 100, + 16620 + ], "_HerbShopLadyIntroText": [ 101, 23692 @@ -17464,6 +19064,18 @@ 101, 23858 ], + "_HeyItsFruitText": [ + 100, + 16412 + ], + "_HoldStillText": [ + 100, + 23340 + ], + "_HugeWaterfallText": [ + 101, + 16484 + ], "_IllKeepItThanksText": [ 100, 23222 @@ -17472,10 +19084,166 @@ 100, 22549 ], + "_IsThisOKText": [ + 100, + 17493 + ], + "_ItemBelongsToSomeoneElseText": [ + 102, + 18110 + ], + "_ItemCantGetOnText": [ + 102, + 18244 + ], + "_ItemCantHeldText": [ + 101, + 21732 + ], + "_ItemCantUseOnEggText": [ + 102, + 18039 + ], + "_ItemCantUseOnMonText": [ + 102, + 17649 + ], + "_ItemGotOffText": [ + 102, + 18359 + ], + "_ItemGotOnText": [ + 102, + 18338 + ], + "_ItemLooksBitterText": [ + 102, + 18021 + ], + "_ItemOakWarningText": [ + 102, + 18069 + ], + "_ItemStatRoseText": [ + 102, + 17631 + ], + "_ItemStorageFullText": [ + 101, + 21637 + ], + "_ItemUsedText": [ + 102, + 18319 + ], + "_ItemWontHaveEffectText": [ + 102, + 18141 + ], + "_ItemfinderItemNearbyText": [ + 101, + 17467 + ], + "_ItemfinderNopeText": [ + 101, + 17517 + ], + "_ItemsDiscardedText": [ + 101, + 21413 + ], + "_ItemsOakWarningText": [ + 101, + 21470 + ], + "_ItemsThrowAwayText": [ + 101, + 21384 + ], + "_ItemsTooImportantText": [ + 101, + 21434 + ], + "_ItemsTossOutHowManyText": [ + 101, + 21355 + ], + "_ItsGoingToHatchText": [ + 100, + 17335 + ], + "_JustSawSomeRareMonText": [ + 100, + 20096 + ], + "_KarpGuruRecordText": [ + 101, + 19362 + ], + "_KnowsMoveText": [ + 102, + 18383 + ], + "_LC_DragText1": [ + 100, + 19344 + ], + "_LC_DragText2": [ + 100, + 19364 + ], + "_LC_Text1": [ + 100, + 19128 + ], + "_LC_Text10": [ + 100, + 19304 + ], + "_LC_Text11": [ + 100, + 19325 + ], + "_LC_Text2": [ + 100, + 19148 + ], + "_LC_Text3": [ + 100, + 19167 + ], + "_LC_Text4": [ + 100, + 19186 + ], + "_LC_Text5": [ + 100, + 19205 + ], + "_LC_Text6": [ + 100, + 19225 + ], + "_LC_Text7": [ + 100, + 19246 + ], + "_LC_Text8": [ + 100, + 19265 + ], + "_LC_Text9": [ + 100, + 19285 + ], "_LastHealthyMonText": [ 100, 22500 ], + "_LearnedMoveText": [ + 102, + 16865 + ], "_LeftWithDayCareLadyText": [ 101, 18323 @@ -17484,6 +19252,58 @@ 101, 18372 ], + "_LinkAbnormalMonText": [ + 101, + 22941 + ], + "_LinkAskTradeForText": [ + 101, + 22985 + ], + "_LinkTimeoutText": [ + 101, + 22842 + ], + "_LinkTradeCantBattleText": [ + 101, + 22888 + ], + "_LookAdorableDecoText": [ + 100, + 17901 + ], + "_LookClefairyPosterText": [ + 100, + 17831 + ], + "_LookGiantDecoText": [ + 100, + 17925 + ], + "_LookJigglypuffPosterText": [ + 100, + 17865 + ], + "_LookPikachuPosterText": [ + 100, + 17798 + ], + "_LookTownMapText": [ + 100, + 17779 + ], + "_LuckyNumberMatchPCText": [ + 101, + 19477 + ], + "_LuckyNumberMatchPartyText": [ + 101, + 19400 + ], + "_MagikarpGuruMeasureText": [ + 101, + 19307 + ], "_MailAlreadyHoldingItemText": [ 101, 18673 @@ -17532,6 +19352,10 @@ 101, 21892 ], + "_MainMenuTimeUnknownText": [ + 101, + 22032 + ], "_MartAskMoreText": [ 101, 24689 @@ -17580,22 +19404,322 @@ 101, 24518 ], + "_MayPassWhirlpoolText": [ + 101, + 16876 + ], + "_MayRegisterItemText": [ + 101, + 21966 + ], + "_MaySmashText": [ + 101, + 17095 + ], + "_MemoryGameDarnText": [ + 101, + 21312 + ], + "_MemoryGameYeahText": [ + 101, + 21302 + ], + "_MomBankWhatDoYouWantToDoText": [ + 100, + 21543 + ], + "_MomBoughtWithYourMoneyText": [ + 100, + 18020 + ], + "_MomFoundADollText": [ + 100, + 18089 + ], + "_MomFoundAnItemText": [ + 100, + 17984 + ], + "_MomHaventSavedThatMuchText": [ + 100, + 21663 + ], + "_MomHiHowAreYouText": [ + 100, + 17963 + ], + "_MomInsufficientFundsInWalletText": [ + 100, + 21718 + ], + "_MomIsThisAboutYourMoneyText": [ + 100, + 21439 + ], + "_MomItsInPCText": [ + 100, + 18057 + ], + "_MomItsInYourRoomText": [ + 100, + 18141 + ], + "_MomJustDoWhatYouCanText": [ + 100, + 21877 + ], + "_MomLeavingText1": [ + 100, + 21092 + ], + "_MomLeavingText2": [ + 100, + 21325 + ], + "_MomLeavingText3": [ + 100, + 21363 + ], + "_MomLostGearBookletText": [ + 102, + 18936 + ], + "_MomNotEnoughRoomInBankText": [ + 100, + 21744 + ], + "_MomNotEnoughRoomInWalletText": [ + 100, + 21692 + ], + "_MomSaveMoneyText": [ + 100, + 21630 + ], + "_MomStartSavingMoneyText": [ + 100, + 21770 + ], + "_MomStoreMoneyText": [ + 100, + 21568 + ], + "_MomStoredMoneyText": [ + 100, + 21824 + ], + "_MomTakeMoneyText": [ + 100, + 21599 + ], + "_MomTakenMoneyText": [ + 100, + 21859 + ], "_MonNameBidsFarewellText": [ 100, 18223 ], + "_MonNameSentToText": [ + 100, + 18199 + ], "_MonWasSentToText": [ 100, 18175 ], + "_MoveAskForgetText": [ + 102, + 16888 + ], + "_MoveBoulderText": [ + 101, + 16713 + ], + "_MoveCantForgetHMText": [ + 102, + 17138 + ], + "_MoveForgotText": [ + 102, + 17102 + ], + "_MoveKnowsOneText": [ + 102, + 18401 + ], + "_MoveMonWOMailSaveText": [ + 101, + 23285 + ], + "_MoveNameText": [ + 101, + 18057 + ], + "_MysteryGiftCanceledText": [ + 100, + 24521 + ], + "_MysteryGiftCommErrorText": [ + 100, + 24551 + ], + "_MysteryGiftFiveADayText": [ + 100, + 24634 + ], + "_MysteryGiftOneADayText": [ + 100, + 24665 + ], + "_MysteryGiftSentHomeText": [ + 100, + 24717 + ], + "_MysteryGiftSentText": [ + 100, + 24700 + ], + "_NPCTradeAfterText1": [ + 100, + 20519 + ], + "_NPCTradeAfterText2": [ + 100, + 20775 + ], + "_NPCTradeAfterText3": [ + 100, + 21032 + ], + "_NPCTradeCableText": [ + 100, + 20283 + ], + "_NPCTradeCancelText1": [ + 100, + 20415 + ], + "_NPCTradeCancelText2": [ + 100, + 20632 + ], + "_NPCTradeCancelText3": [ + 100, + 20902 + ], + "_NPCTradeCompleteText1": [ + 100, + 20485 + ], + "_NPCTradeCompleteText2": [ + 100, + 20735 + ], + "_NPCTradeCompleteText3": [ + 100, + 20992 + ], + "_NPCTradeFanfareText": [ + 100, + 20345 + ], + "_NPCTradeIntroText1": [ + 100, + 20348 + ], + "_NPCTradeIntroText2": [ + 100, + 20549 + ], + "_NPCTradeIntroText3": [ + 100, + 20820 + ], + "_NPCTradeWrongText1": [ + 100, + 20445 + ], + "_NPCTradeWrongText2": [ + 100, + 20692 + ], + "_NPCTradeWrongText3": [ + 100, + 20937 + ], + "_NameRaterBetterNameText": [ + 100, + 23615 + ], + "_NameRaterComeAgainText": [ + 100, + 23824 + ], + "_NameRaterEggText": [ + 100, + 23930 + ], + "_NameRaterFinishedText": [ + 100, + 23779 + ], + "_NameRaterHelloText": [ + 100, + 23477 + ], + "_NameRaterNamedText": [ + 100, + 24036 + ], + "_NameRaterPerfectNameText": [ + 100, + 23856 + ], + "_NameRaterSameNameText": [ + 100, + 23956 + ], + "_NameRaterWhatNameText": [ + 100, + 23732 + ], + "_NameRaterWhichMonText": [ + 100, + 23570 + ], + "_NewDexDataText": [ + 102, + 17561 + ], "_NewPokedexEntry": [ 16, 23170 ], + "_NoCoinCaseText": [ + 100, + 20255 + ], + "_NoCoinsText": [ + 100, + 20235 + ], + "_NoCyclingText": [ + 102, + 18216 + ], + "_NoPhotoText": [ + 100, + 23410 + ], "_NoRoomForEggText": [ 100, 23255 ], + "_NoRoomTMHMText": [ + 100, + 24461 + ], "_NotEnoughMoneyText": [ 100, 22945 @@ -17604,14 +19728,282 @@ 100, 23003 ], + "_NothingHereText": [ + 100, + 16469 + ], + "_NothingToChooseText": [ + 100, + 17543 + ], + "_NothingToPutAwayText": [ + 100, + 17666 + ], "_NothingToSellText": [ 101, 24438 ], + "_OKComeBackText": [ + 100, + 24255 + ], + "_OPT_AddictivelyText": [ + 100, + 18641 + ], + "_OPT_AlmostPoisonouslyText": [ + 100, + 18561 + ], + "_OPT_AptlyNamedText": [ + 100, + 18482 + ], + "_OPT_BoldSortOfText": [ + 100, + 18784 + ], + "_OPT_CuteText": [ + 100, + 18755 + ], + "_OPT_EvolutionMustBeText": [ + 100, + 18680 + ], + "_OPT_ExcitingText": [ + 100, + 18848 + ], + "_OPT_FlippedOutText": [ + 100, + 18716 + ], + "_OPT_FriendlyText": [ + 100, + 18880 + ], + "_OPT_FrighteningText": [ + 100, + 18801 + ], + "_OPT_GuardedText": [ + 100, + 18924 + ], + "_OPT_HeartMeltinglyText": [ + 100, + 18737 + ], + "_OPT_HotHotHotText": [ + 100, + 18892 + ], + "_OPT_InspiringText": [ + 100, + 18867 + ], + "_OPT_IntroText1": [ + 100, + 18333 + ], + "_OPT_IntroText2": [ + 100, + 18352 + ], + "_OPT_IntroText3": [ + 100, + 18365 + ], + "_OPT_LooksInWaterText": [ + 100, + 18660 + ], + "_OPT_LovelyText": [ + 100, + 18935 + ], + "_OPT_MaryText1": [ + 100, + 18425 + ], + "_OPT_MischievouslyText": [ + 100, + 18602 + ], + "_OPT_NowText": [ + 100, + 18860 + ], + "_OPT_OakText1": [ + 100, + 18382 + ], + "_OPT_OakText2": [ + 100, + 18395 + ], + "_OPT_OakText3": [ + 100, + 18416 + ], + "_OPT_PleasantText": [ + 100, + 18772 + ], + "_OPT_PokemonChannelText": [ + 100, + 18955 + ], + "_OPT_PowerfulText": [ + 100, + 18836 + ], + "_OPT_ProvocativelyText": [ + 100, + 18700 + ], + "_OPT_SensuallyText": [ + 100, + 18582 + ], + "_OPT_SpeedyText": [ + 100, + 18945 + ], + "_OPT_StimulatingText": [ + 100, + 18909 + ], + "_OPT_SuaveDebonairText": [ + 100, + 18816 + ], + "_OPT_SweetAdorablyText": [ + 100, + 18440 + ], + "_OPT_TopicallyText": [ + 100, + 18621 + ], + "_OPT_UnbearablyText": [ + 100, + 18521 + ], + "_OPT_UndeniablyKindOfText": [ + 100, + 18500 + ], + "_OPT_WeirdText": [ + 100, + 18763 + ], + "_OPT_WigglySlicklyText": [ + 100, + 18461 + ], + "_OPT_WowImpressivelyText": [ + 100, + 18541 + ], "_OTSendsText": [ 100, 18274 ], + "_OakPCText1": [ + 101, + 20092 + ], + "_OakPCText2": [ + 101, + 20122 + ], + "_OakPCText3": [ + 101, + 20154 + ], + "_OakPCText4": [ + 101, + 21267 + ], + "_OakRating01": [ + 101, + 20204 + ], + "_OakRating02": [ + 101, + 20236 + ], + "_OakRating03": [ + 101, + 20284 + ], + "_OakRating04": [ + 101, + 20344 + ], + "_OakRating05": [ + 101, + 20406 + ], + "_OakRating06": [ + 101, + 20467 + ], + "_OakRating07": [ + 101, + 20529 + ], + "_OakRating08": [ + 101, + 20592 + ], + "_OakRating09": [ + 101, + 20642 + ], + "_OakRating10": [ + 101, + 20698 + ], + "_OakRating11": [ + 101, + 20747 + ], + "_OakRating12": [ + 101, + 20807 + ], + "_OakRating13": [ + 101, + 20859 + ], + "_OakRating14": [ + 101, + 20924 + ], + "_OakRating15": [ + 101, + 20980 + ], + "_OakRating16": [ + 101, + 21029 + ], + "_OakRating17": [ + 101, + 21088 + ], + "_OakRating18": [ + 101, + 21147 + ], + "_OakRating19": [ + 101, + 21204 + ], "_OakText1": [ 101, 22052 @@ -17640,6 +20032,70 @@ 101, 22493 ], + "_OakThisIsntTheTimeText": [ + 101, + 17842 + ], + "_OakTimeHoursQuestionMarkText": [ + 100, + 16824 + ], + "_OakTimeHowManyMinutesText": [ + 100, + 16827 + ], + "_OakTimeIsItText": [ + 100, + 16941 + ], + "_OakTimeMinutesQuestionMarkText": [ + 100, + 16854 + ], + "_OakTimeOversleptText": [ + 100, + 16857 + ], + "_OakTimeSoDarkText": [ + 100, + 16898 + ], + "_OakTimeWhatDayIsItText": [ + 100, + 16924 + ], + "_OakTimeWhatHoursText": [ + 100, + 16816 + ], + "_OakTimeWhatTimeIsItText": [ + 100, + 16798 + ], + "_OakTimeWhoaMinutesText": [ + 100, + 16846 + ], + "_OakTimeWokeUpText": [ + 100, + 16719 + ], + "_OakTimeYikesText": [ + 100, + 16873 + ], + "_ObjectEventText": [ + 101, + 23428 + ], + "_ObtainedFruitText": [ + 100, + 16429 + ], + "_ObtainedTheVoltorbBadgeText": [ + 100, + 17446 + ], "_OhFineThenText": [ 100, 22974 @@ -17648,10 +20104,66 @@ 100, 22396 ], + "_PCCantDepositLastMonText": [ + 101, + 18920 + ], + "_PCCantTakeText": [ + 101, + 18954 + ], + "_PCGottaHavePokemonText": [ + 101, + 18798 + ], "_PCMonHoldingMailText": [ 101, 18835 ], + "_PCNoSingleMonText": [ + 101, + 18890 + ], + "_PCWhatText": [ + 101, + 18828 + ], + "_PPIsMaxedOutText": [ + 102, + 17901 + ], + "_PPRestoredText": [ + 102, + 17944 + ], + "_PPsIncreasedText": [ + 102, + 17924 + ], + "_PackEmptyText": [ + 101, + 17991 + ], + "_PackNoItemText": [ + 101, + 17758 + ], + "_PasswordAskEnterText": [ + 102, + 16810 + ], + "_PasswordAskResetClockText": [ + 102, + 16792 + ], + "_PasswordAskResetText": [ + 102, + 16727 + ], + "_PasswordWrongText": [ + 102, + 16775 + ], "_PerfectHeresYourMonText": [ 100, 22761 @@ -17684,22 +20196,454 @@ 101, 24335 ], + "_PhoneClickText": [ + 102, + 16636 + ], + "_PhoneEllipseText": [ + 102, + 16644 + ], + "_PhoneJustTalkToThemText": [ + 102, + 16680 + ], + "_PhoneOutOfAreaText": [ + 102, + 16647 + ], + "_PhoneThankYouText": [ + 102, + 16710 + ], + "_PhoneWrongNumberText": [ + 102, + 16609 + ], + "_PlayedFluteText": [ + 102, + 17726 + ], + "_PlayerFoundItemText": [ + 100, + 20054 + ], + "_PlayerPickedUpPayDayMoney": [ + 100, + 24304 + ], + "_PlayersPCAskWhatDoText": [ + 101, + 19663 + ], + "_PlayersPCDepositItemsText": [ + 101, + 19832 + ], + "_PlayersPCHowManyDepositText": [ + 101, + 19798 + ], + "_PlayersPCHowManyWithdrawText": [ + 101, + 19688 + ], + "_PlayersPCNoItemsText": [ + 101, + 19782 + ], + "_PlayersPCNoRoomDepositText": [ + 101, + 19860 + ], + "_PlayersPCNoRoomWithdrawText": [ + 101, + 19750 + ], + "_PlayersPCTurnOnText": [ + 101, + 19642 + ], + "_PlayersPCWithdrewItemsText": [ + 101, + 19723 + ], + "_PnP_BoldText": [ + 100, + 19539 + ], + "_PnP_CoolText": [ + 100, + 19649 + ], + "_PnP_CuteText": [ + 100, + 19455 + ], + "_PnP_GreatText": [ + 100, + 19609 + ], + "_PnP_HappyText": [ + 100, + 19485 + ], + "_PnP_InspiringText": [ + 100, + 19667 + ], + "_PnP_LazyText": [ + 100, + 19466 + ], + "_PnP_MyTypeText": [ + 100, + 19630 + ], + "_PnP_NoisyText": [ + 100, + 19504 + ], + "_PnP_OddText": [ + 100, + 19722 + ], + "_PnP_PickyText": [ + 100, + 19559 + ], + "_PnP_PrecociousText": [ + 100, + 19522 + ], + "_PnP_RightForMeText": [ + 100, + 19703 + ], + "_PnP_SoSoText": [ + 100, + 19592 + ], + "_PnP_SortOfOKText": [ + 100, + 19575 + ], + "_PnP_Text1": [ + 100, + 19385 + ], + "_PnP_Text2": [ + 100, + 19406 + ], + "_PnP_Text3": [ + 100, + 19426 + ], + "_PnP_Text4": [ + 100, + 19441 + ], + "_PnP_Text5": [ + 100, + 19743 + ], + "_PnP_WeirdText": [ + 100, + 19683 + ], + "_PocketIsFullText": [ + 101, + 23522 + ], + "_PoisonFaintText": [ + 101, + 17552 + ], + "_PoisonWhiteoutText": [ + 101, + 17566 + ], + "_PokecenterBillsPCText": [ + 101, + 19931 + ], + "_PokecenterOaksPCText": [ + 101, + 20025 + ], + "_PokecenterPCCantUseText": [ + 101, + 19599 + ], + "_PokecenterPCOaksClosedText": [ + 101, + 20076 + ], + "_PokecenterPCTurnOnText": [ + 101, + 19892 + ], + "_PokecenterPCWhoseText": [ + 101, + 19913 + ], + "_PokecenterPlayersPCText": [ + 101, + 19979 + ], + "_PokedexShowText": [ + 100, + 18961 + ], + "_PokegearAskDeleteText": [ + 102, + 16575 + ], + "_PokegearAskWhoCallText": [ + 102, + 16521 + ], + "_PokegearPressButtonText": [ + 102, + 16548 + ], + "_PokemonAskSwapItemText": [ + 101, + 21687 + ], + "_PokemonHoldItemText": [ + 101, + 21554 + ], + "_PokemonNotEnoughHPText": [ + 101, + 21950 + ], + "_PokemonNotHoldingText": [ + 101, + 21609 + ], "_PokemonRemoveMailText": [ 101, 21578 ], + "_PokemonSwapItemText": [ + 101, + 21511 + ], + "_PokemonTookItemText": [ + 101, + 21663 + ], "_PrepMonFrontpic": [ 0, 14783 ], + "_PrestoAllDoneText": [ + 100, + 23375 + ], + "_PutAwayAndSetUpText": [ + 100, + 17714 + ], + "_PutAwayTheDecoText": [ + 100, + 17645 + ], + "_PutItemInPocketText": [ + 101, + 23491 + ], + "_RaiseThePPOfWhichMoveText": [ + 102, + 17841 + ], + "_ReceiveItemText": [ + 100, + 20211 + ], "_ReceivedEggText": [ 100, 23178 ], + "_ReceivedItemText": [ + 101, + 23472 + ], + "_ReceivedTMHMText": [ + 100, + 24500 + ], + "_RecoveredSomeHPText": [ + 100, + 16491 + ], + "_RegisteredItemText": [ + 101, + 17906 + ], + "_RemainingTimeText": [ + 100, + 17092 + ], "_RemoveMailText": [ 100, 22463 ], + "_RepelUsedEarlierIsStillInEffectText": [ + 102, + 17682 + ], + "_RepelWoreOffText": [ + 100, + 20029 + ], + "_RestoreThePPOfWhichMoveText": [ + 102, + 17870 + ], + "_RetrieveMysteryGiftText": [ + 100, + 24573 + ], + "_RevitalizedText": [ + 100, + 16643 + ], + "_RidOfParalysisText": [ + 100, + 16539 + ], + "_RocketRadioText1": [ + 100, + 19751 + ], + "_RocketRadioText10": [ + 100, + 19931 + ], + "_RocketRadioText2": [ + 100, + 19769 + ], + "_RocketRadioText3": [ + 100, + 19784 + ], + "_RocketRadioText4": [ + 100, + 19804 + ], + "_RocketRadioText5": [ + 100, + 19825 + ], + "_RocketRadioText6": [ + 100, + 19844 + ], + "_RocketRadioText7": [ + 100, + 19862 + ], + "_RocketRadioText8": [ + 100, + 19885 + ], + "_RocketRadioText9": [ + 100, + 19907 + ], + "_RodBiteText": [ + 101, + 17180 + ], + "_RodNothingText": [ + 101, + 17193 + ], + "_SaveFileCorruptedText": [ + 101, + 23203 + ], + "_SavedTheGameText": [ + 101, + 23078 + ], + "_SavingDontTurnOffThePowerText": [ + 101, + 23043 + ], + "_SavingRecordText": [ + 100, + 20179 + ], + "_SentTrophyHomeText": [ + 102, + 17962 + ], + "_SetUpTheDecoText": [ + 100, + 17695 + ], + "_SlotsBetHowManyCoinsText": [ + 101, + 24749 + ], + "_SlotsDarnText": [ + 102, + 16477 + ], + "_SlotsLinedUpText": [ + 102, + 16449 + ], + "_SlotsNotEnoughCoinsText": [ + 102, + 16392 + ], + "_SlotsPlayAgainText": [ + 102, + 16436 + ], + "_SlotsRanOutOfCoinsText": [ + 102, + 16411 + ], + "_SlotsStartText": [ + 102, + 16384 + ], + "_SpaceSpaceColonText": [ + 102, + 16722 + ], + "_SquirtbottleNothingText": [ + 101, + 17663 + ], + "_StartMenuContestEndText": [ + 101, + 21319 + ], + "_StopLearningMoveText": [ + 102, + 16921 + ], + "_StoppedEvolvingText": [ + 101, + 23593 + ], + "_SweetScentNothingText": [ + 101, + 17630 + ], + "_TMHMNotCompatibleText": [ + 100, + 24405 + ], "_TakeGoodCareOfEggText": [ 100, 23199 @@ -17708,14 +20652,226 @@ 100, 18229 ], + "_TeleportReturnText": [ + 101, + 16603 + ], + "_TestEventText": [ + 100, + 17356 + ], + "_ThatCantBeUsedRightNowText": [ + 100, + 16994 + ], + "_ThatItemCantBePutInThePackText": [ + 100, + 17024 + ], + "_ThatsEnoughComeBackText": [ + 100, + 24228 + ], + "_TheBoxIsFullText": [ + 100, + 17428 + ], + "_TheItemWasPutInThePackText": [ + 100, + 17060 + ], + "_ThePasswordIsText": [ + 100, + 17474 + ], + "_ThereIsNoEggText": [ + 100, + 17316 + ], + "_ThrewAwayText": [ + 101, + 17820 + ], + "_TimeAskOkayText": [ + 102, + 18712 + ], + "_TimesetAskAdjustDSTText": [ + 102, + 18876 + ], + "_TimesetAskDSTText": [ + 102, + 18727 + ], + "_TimesetAskNotDSTText": [ + 102, + 18813 + ], + "_TimesetDSTText": [ + 102, + 18775 + ], + "_TimesetNotDSTText": [ + 102, + 18844 + ], + "_UnusedNothingHereText": [ + 101, + 17213 + ], + "_UseCutText": [ + 100, + 24803 + ], + "_UseDigText": [ + 101, + 16543 + ], + "_UseEscapeRopeText": [ + 101, + 16558 + ], + "_UseHeadbuttText": [ + 101, + 16984 + ], + "_UseRockSmashText": [ + 101, + 17073 + ], + "_UseSacredAshText": [ + 101, + 17705 + ], + "_UseStrengthText": [ + 101, + 16693 + ], + "_UseSweetScentText": [ + 101, + 17607 + ], + "_UseWaterfallText": [ + 101, + 16463 + ], + "_UseWhirlpoolText": [ + 101, + 16855 + ], + "_UsedInsteadText": [ + 101, + 18045 + ], + "_UsedMove1Text": [ + 101, + 18027 + ], + "_UsedMove2Text": [ + 101, + 18036 + ], + "_UsedSurfText": [ + 100, + 24885 + ], + "_WaitButtonText": [ + 102, + 17532 + ], + "_WarpingText": [ + 100, + 17135 + ], + "_WasDefrostedText": [ + 100, + 16586 + ], + "_WasSentToBillsPCText": [ + 101, + 18771 + ], + "_WhatDoYouWantToPlayWithText": [ + 100, + 17376 + ], "_WhatShouldIRaiseText": [ 100, 22366 ], + "_WhichMonPhotoText": [ + 100, + 23305 + ], + "_WhichSidePutAwayText": [ + 100, + 17608 + ], + "_WhichSidePutOnText": [ + 100, + 17570 + ], + "_WhitedOutText": [ + 101, + 17426 + ], + "_WillTradeText": [ + 100, + 18292 + ], + "_WillYouPlayWithMonText": [ + 100, + 17178 + ], + "_WindowAreaExceededErrorText": [ + 101, + 23337 + ], + "_WindowPoppingErrorText": [ + 101, + 23373 + ], + "_WokeUpText": [ + 100, + 16606 + ], + "_WouldYouLikeToSaveTheGameText": [ + 101, + 23009 + ], + "_YouCanHaveThisText": [ + 100, + 17408 + ], + "_YouCantUseItInABattleText": [ + 101, + 17993 + ], + "_YouDontHaveAMonText": [ + 101, + 17883 + ], + "_YouNeedTwoMonForBreedingText": [ + 100, + 17205 + ], + "_YourFoesWeakGetmMonText": [ + 100, + 24191 + ], + "_YourFriendIsNotReadyText": [ + 100, + 24609 + ], "_YourMonHasGrownText": [ 100, 22651 ], + "_YourMonsHPWasHealedText": [ + 100, + 17108 + ], "wBaseUnusedBackpic": [ 1, 53556 @@ -17725,6 +20881,899 @@ 53554 ] }, + "text": { + "labels": [ + "AlreadyAsleepText", + "AlreadyConfusedText", + "AlreadyParalyzedText", + "AlreadyPoisonedText", + "AskNumber1FText", + "AskNumber1MText", + "AskNumber2FText", + "AskNumber2MText", + "AttackMissed2Text", + "AttackMissedText", + "BadlyPoisonedText", + "BattleText_AnEGGCantBattle", + "BattleText_CantEscape", + "BattleText_CantEscape2", + "BattleText_EnemyFled", + "BattleText_EnemyIsAboutToUseWillPlayerChangeMon", + "BattleText_EnemyMonFainted", + "BattleText_EnemySentOut", + "BattleText_EnemyWasDefeated", + "BattleText_GotAwaySafely", + "BattleText_ItemHealedConfusion", + "BattleText_ItemsCantBeUsedHere", + "BattleText_MonCantBeRecalled", + "BattleText_MonFainted", + "BattleText_MonHasNoMovesLeft", + "BattleText_MonIsAlreadyOut", + "BattleText_MonsLightScreenFell", + "BattleText_MonsReflectFaded", + "BattleText_PlayerPickedUpPayDayMoney", + "BattleText_RainContinuesToFall", + "BattleText_SafeguardFaded", + "BattleText_StringBuffer1GrewToLevel", + "BattleText_TargetRecoveredWithItem", + "BattleText_TargetWasHitByFutureSight", + "BattleText_TargetsEncoreEnded", + "BattleText_TheMoveIsDisabled", + "BattleText_TheRainStopped", + "BattleText_TheSandstormRages", + "BattleText_TheSandstormSubsided", + "BattleText_TheSunlightFaded", + "BattleText_TheSunlightIsStrong", + "BattleText_TheresNoEscapeFromTrainerBattle", + "BattleText_TheresNoPPLeftForThisMove", + "BattleText_TheresNoWillToBattle", + "BattleText_UseNextMon", + "BattleText_UserFledUsingAStringBuffer1", + "BattleText_UserHurtBySpikes", + "BattleText_UserRecoveredPPUsing", + "BattleText_UserWasReleasedFromStringBuffer1", + "BattleText_UsersHurtByStringBuffer1", + "BattleText_UsersStringBuffer1Activated", + "BattleText_WildFled", + "BattleText_WildMonIsAngry", + "BattleText_WildMonIsEating", + "BeatUpAttackText", + "BecameConfusedText", + "BeganToNapText", + "BellChimedText", + "BellyDrumText", + "BlewSpikesText", + "BlownAwayText", + "BracedItselfText", + "BugContestPrizeNoRoomText", + "ButItFailedText", + "CantEscapeNowText", + "ClampedByText", + "CoinVendor_Buy500CoinsText", + "CoinVendor_Buy50CoinsText", + "CoinVendor_CancelText", + "CoinVendor_CoinCaseFullText", + "CoinVendor_IntroText", + "CoinVendor_NoCoinCaseText", + "CoinVendor_NotEnoughMoneyText", + "CoinVendor_WelcomeText", + "CoinsScatteredText", + "ConfusedNoMoreText", + "ContestResults_ConsolationPrizeText", + "ContestResults_DidNotWinText", + "ContestResults_JoinUsNextTimeText", + "ContestResults_PartyFullText", + "ContestResults_PlayerWonAPrizeText", + "ContestResults_ReadyToJudgeText", + "ContestResults_ReturnPartyText", + "CopiedStatsText", + "CoveredByVeilText", + "CrashedText", + "CriticalHitText", + "DefrostedOpponentText", + "DestinyBondEffectText", + "DidntAffect1Text", + "DidntAffect2Text", + "DifficultBookshelfText", + "DisabledMoveText", + "DisabledNoMoreText", + "DoesntAffectText", + "DownpourText", + "DraggedOutText", + "DreamEatenText", + "EliminatedStatsText", + "EnduredText", + "EnemyHitTimesText", + "EvadedText", + "FastAsleepText", + "FellAsleepText", + "FellInLoveText", + "FledFromBattleText", + "FledInFearText", + "FlinchedText", + "ForesawAttackText", + "FrozenSolidText", + "FullyParalyzedText", + "GettingPumpedText", + "GotAnEncoreText", + "GotMoneyForWinningText", + "GymStatue_CityGymText", + "GymStatue_WinningTrainersText", + "HPIsFullText", + "HappinessText1", + "HappinessText2", + "HappinessText3", + "HasANightmareText", + "HasNoPPLeftText", + "HasSubstituteText", + "HomepageText", + "HookedPokemonAttackedText", + "HungOnText", + "HurtByBurnText", + "HurtByCurseText", + "HurtByPoisonText", + "HurtItselfText", + "IdentifiedText", + "IgnoredOrders2Text", + "IgnoredOrdersText", + "IgnoredSleepingText", + "InLoveWithText", + "IncenseBurnerText", + "InfatuationText", + "IsConfusedText", + "ItFailedText", + "LeechSeedSapsText", + "LightScreenEffectText", + "LoafingAroundText", + "LookTownMapText", + "LostAgainstText", + "MadeSubstituteText", + "MagazineBookshelfText", + "MagnitudeText", + "MartSignText", + "MerchandiseShelfText", + "MimicLearnedMoveText", + "MirrorMoveFailedText", + "MistText", + "MustRechargeText", + "NoPPLeftText", + "NotVeryEffectiveText", + "NothingHappenedText", + "NumberAcceptedFText", + "NumberAcceptedMText", + "NumberDeclinedFText", + "NumberDeclinedMText", + "NurseAskHealText", + "NurseDayText", + "NurseGoodbyeText", + "NurseMornText", + "NurseNiteText", + "NursePokerusText", + "NurseReturnPokemonText", + "NurseTakePokemonText", + "OneHitKOText", + "ParalyzedText", + "PerishCountText", + "PhoneFullFText", + "PhoneFullMText", + "PictureBookshelfText", + "PlayerHitTimesText", + "PokecenterSignText", + "PokemonFellFromTreeText", + "PresentFailedText", + "ProtectedByMistText", + "ProtectedByText", + "ProtectedItselfText", + "ProtectingItselfText", + "PutACurseText", + "RageBuildingText", + "ReceivedItemText", + "RecoilText", + "RecoveredUsingText", + "ReflectEffectText", + "RegainedHealthText", + "RegisteredNumberFText", + "RegisteredNumberMText", + "ReleasedByText", + "RematchFText", + "RematchMText", + "RestedText", + "SafeguardProtectText", + "SandstormBrewedText", + "SandstormHitsText", + "SentAllToMomText", + "SentHalfToMomText", + "SentSomeToMomText", + "SharedPainText", + "ShedLeechSeedText", + "SketchedText", + "SpikesText", + "SpiteEffectText", + "StartPerishText", + "StartedNightmareText", + "StoleText", + "StoringEnergyText", + "SubFadedText", + "SubTookDamageText", + "SuckedHealthText", + "SunGotBrightText", + "SuperEffectiveText", + "TVText", + "TeamRocketOathText", + "Text_BallCaught", + "Text_BattleEffectActivate", + "Text_BattleFoeEffectActivate", + "Text_BattleUser", + "Text_BreedHuh", + "Text_Gained", + "Text_MoveForgetCount", + "Text_NPCTraded", + "Text_PlayedPokeFlute", + "TiedAgainstText", + "TooWeakSubText", + "TookAimText", + "TookDownWithItText", + "TransformedText", + "TransformedTypeText", + "TrashCanText", + "TurnedAwayText", + "UnaffectedText", + "UnleashedEnergyText", + "UnusedRivalLossText", + "UnusedRivalWinText", + "UsedBindText", + "WantsToBattleText", + "WasBurnedText", + "WasDefrostedText", + "WasDisabledText", + "WasFrozenText", + "WasPoisonedText", + "WasSeededText", + "WasTrappedText", + "WentToSleepText", + "WildPokemonAppearedText", + "WindowText", + "WokeUpText", + "WontDropAnymoreText", + "WontObeyText", + "WontRiseAnymoreText", + "WrappedByText", + "_ActorNameText", + "_AlreadyASaveFileText", + "_AlreadySetUpText", + "_AlreadySurfingText", + "_AlreadyUsingStrengthText", + "_AnEggCantHoldAnItemText", + "_AnotherSaveFileText", + "_AreWeGeniusesText", + "_AskCutText", + "_AskDeleteMoveText", + "_AskFloorElevatorText", + "_AskForgetMoveText", + "_AskGiveNicknameText", + "_AskHeadbuttText", + "_AskItemMoveText", + "_AskQuantityThrowAwayText", + "_AskRockSmashText", + "_AskStrengthText", + "_AskSurfText", + "_AskThrowAwayText", + "_AskWaterfallText", + "_AskWhirlpoolText", + "_BGEventText", + "_BackAlreadyText", + "_BadgeRequiredText", + "_BallAlmostHadItText", + "_BallAppearedCaughtText", + "_BallBlockedText", + "_BallBoxFullText", + "_BallBrokeFreeText", + "_BallDodgedText", + "_BallDontBeAThiefText", + "_BallMissedText", + "_BallSentToPCText", + "_BallSoCloseText", + "_BargainShopComeAgainText", + "_BargainShopFinalPriceText", + "_BargainShopIntroText", + "_BargainShopNoFundsText", + "_BargainShopPackFullText", + "_BargainShopSoldOutText", + "_BargainShopThanksText", + "_BattleDugText", + "_BattleFlewText", + "_BattleGlowingText", + "_BattleLoweredHeadText", + "_BattleMadeWhirlwindText", + "_BattleMonNickCommaText", + "_BattleStatFellText", + "_BattleStatSharplyFellText", + "_BattleStatWentUpText", + "_BattleStatWentWayUpText", + "_BattleTookSunlightText", + "_BenFernText1", + "_BenFernText2A", + "_BenFernText2B", + "_BenFernText3A", + "_BenFernText3B", + "_BenIntroText1", + "_BenIntroText2", + "_BenIntroText3", + "_BidsFarewellToMonText", + "_BlindingFlashText", + "_BoostedExpPointsText", + "_BootedHMText", + "_BootedTMText", + "_BouldersMayMoveText", + "_BouldersMoveText", + "_BreedAppearsToCareForText", + "_BreedAskNicknameText", + "_BreedBrimmingWithEnergyText", + "_BreedClearboxText", + "_BreedEggHatchText", + "_BreedFriendlyText", + "_BreedNoInterestText", + "_BreedShowsInterestText", + "_BreedingIsNotPossibleText", + "_BugCatchingContestIsOverText", + "_BugCatchingContestTimeUpText", + "_BurnWasHealedText", + "_ButNoSpaceText", + "_CameToItsSensesText", + "_CanCutText", + "_CantAcceptEggText", + "_CantCarryItemText", + "_CantGetOffBikeText", + "_CantRegisterText", + "_CantSurfText", + "_CantUseDigText", + "_CantUseItemText", + "_CantUseTeleportText", + "_CardFlipChooseACardText", + "_CardFlipDarnText", + "_CardFlipNotEnoughCoinsText", + "_CardFlipPlaceYourBetText", + "_CardFlipPlayAgainText", + "_CardFlipPlayWithThreeCoinsText", + "_CardFlipShuffledText", + "_CardFlipYeahText", + "_CaughtAskNicknameText", + "_ChangeBoxSaveText", + "_ChangeWhichNumberText", + "_ClearAllSaveDataText", + "_ClockHasResetText", + "_ClockIsThisOKText", + "_ClockSetWithControlPadText", + "_ClockTimeMayBeWrongText", + "_CoinCaseCountText", + "_ComeAgainText", + "_ComeBackLaterText", + "_ComeBackText", + "_CompatibilityShouldTheyBreedText", + "_CongratulationsYourPokemonText", + "_ContainedMoveText", + "_ContestAlreadyCaughtText", + "_ContestAskSwitchText", + "_ContestCaughtMonText", + "_ContestJudging_FirstPlaceScoreText", + "_ContestJudging_FirstPlaceText", + "_ContestJudging_SecondPlaceScoreText", + "_ContestJudging_SecondPlaceText", + "_ContestJudging_ThirdPlaceScoreText", + "_ContestJudging_ThirdPlaceText", + "_CoordinatesEventText", + "_CorruptedEventText", + "_CuredOfPoisonText", + "_CutNothingText", + "_DSTIsThatOKText", + "_DayCareLadyIntroEggText", + "_DayCareLadyIntroText", + "_DayCareManIntroEggText", + "_DayCareManIntroText", + "_DaycareDummyText", + "_DeleterAskWhichMonText", + "_DeleterAskWhichMoveText", + "_DeleterEggText", + "_DeleterForgotMoveText", + "_DeleterIntroText", + "_DeleterNoComeAgainText", + "_DidNotLearnMoveText", + "_DoItMonText", + "_EggPhotoText", + "_EmptyMailboxText", + "_EndUsedMove1Text", + "_EndUsedMove2Text", + "_EndUsedMove3Text", + "_EndUsedMove4Text", + "_EndUsedMove5Text", + "_EnemyUsedOnText", + "_EnemyWithdrewText", + "_EnterTheAmountText", + "_EnterTheIDNoText", + "_EvolvedIntoText", + "_EvolvingText", + "_ExpPointsText", + "_FernIntroText1", + "_FernIntroText2", + "_FluteWakeUpText", + "_ForYourMonSendsText", + "_ForYourMonWillTradeText", + "_FoundAnEggText", + "_FoundItemText", + "_FruitBearingTreeText", + "_FruitPackIsFullText", + "_GearEllipseText", + "_GearOutOfServiceText", + "_GearTodayText", + "_GoForItMonText", + "_GoMonText", + "_GoodComeBackText", + "_GotBackMonText", + "_GotOffBikeText", + "_GotOnBikeText", + "_GrewToLevelText", + "_HaveNoRoomText", + "_HeadbuttNothingText", + "_HealthReturnedText", + "_HerbShopLadyIntroText", + "_HerbalLadyComeAgainText", + "_HerbalLadyFinalPriceText", + "_HerbalLadyHowManyText", + "_HerbalLadyNoMoneyText", + "_HerbalLadyPackFullText", + "_HerbalLadyThanksText", + "_HeyItsFruitText", + "_HoldStillText", + "_HugeWaterfallText", + "_IllKeepItThanksText", + "_IllRaiseYourMonText", + "_IsThisOKText", + "_ItemBelongsToSomeoneElseText", + "_ItemCantGetOnText", + "_ItemCantHeldText", + "_ItemCantUseOnEggText", + "_ItemCantUseOnMonText", + "_ItemGotOffText", + "_ItemGotOnText", + "_ItemLooksBitterText", + "_ItemOakWarningText", + "_ItemStatRoseText", + "_ItemStorageFullText", + "_ItemUsedText", + "_ItemWontHaveEffectText", + "_ItemfinderItemNearbyText", + "_ItemfinderNopeText", + "_ItemsDiscardedText", + "_ItemsOakWarningText", + "_ItemsThrowAwayText", + "_ItemsTooImportantText", + "_ItemsTossOutHowManyText", + "_ItsGoingToHatchText", + "_JustSawSomeRareMonText", + "_KarpGuruRecordText", + "_KnowsMoveText", + "_LC_DragText1", + "_LC_DragText2", + "_LC_Text1", + "_LC_Text10", + "_LC_Text11", + "_LC_Text2", + "_LC_Text3", + "_LC_Text4", + "_LC_Text5", + "_LC_Text6", + "_LC_Text7", + "_LC_Text8", + "_LC_Text9", + "_LastHealthyMonText", + "_LearnedMoveText", + "_LeftWithDayCareLadyText", + "_LeftWithDayCareManText", + "_LinkAbnormalMonText", + "_LinkAskTradeForText", + "_LinkTimeoutText", + "_LinkTradeCantBattleText", + "_LookAdorableDecoText", + "_LookClefairyPosterText", + "_LookGiantDecoText", + "_LookJigglypuffPosterText", + "_LookPikachuPosterText", + "_LookTownMapText", + "_LuckyNumberMatchPCText", + "_LuckyNumberMatchPartyText", + "_MagikarpGuruMeasureText", + "_MailAlreadyHoldingItemText", + "_MailAskSendToPCText", + "_MailClearedPutAwayText", + "_MailDetachedText", + "_MailEggText", + "_MailLoseMessageText", + "_MailMessageLostText", + "_MailMovedFromBoxText", + "_MailNoSpaceText", + "_MailPackFullText", + "_MailSentToPCText", + "_MailboxFullText", + "_MainMenuTimeUnknownText", + "_MartAskMoreText", + "_MartBoughtText", + "_MartCantBuyText", + "_MartComeAgainText", + "_MartFinalPriceText", + "_MartHowManyText", + "_MartNoMoneyText", + "_MartPackFullText", + "_MartSellHowManyText", + "_MartSellPriceText", + "_MartThanksText", + "_MartWelcomeText", + "_MayPassWhirlpoolText", + "_MayRegisterItemText", + "_MaySmashText", + "_MemoryGameDarnText", + "_MemoryGameYeahText", + "_MomBankWhatDoYouWantToDoText", + "_MomBoughtWithYourMoneyText", + "_MomFoundADollText", + "_MomFoundAnItemText", + "_MomHaventSavedThatMuchText", + "_MomHiHowAreYouText", + "_MomInsufficientFundsInWalletText", + "_MomIsThisAboutYourMoneyText", + "_MomItsInPCText", + "_MomItsInYourRoomText", + "_MomJustDoWhatYouCanText", + "_MomLeavingText1", + "_MomLeavingText2", + "_MomLeavingText3", + "_MomLostGearBookletText", + "_MomNotEnoughRoomInBankText", + "_MomNotEnoughRoomInWalletText", + "_MomSaveMoneyText", + "_MomStartSavingMoneyText", + "_MomStoreMoneyText", + "_MomStoredMoneyText", + "_MomTakeMoneyText", + "_MomTakenMoneyText", + "_MonNameBidsFarewellText", + "_MonNameSentToText", + "_MonWasSentToText", + "_MoveAskForgetText", + "_MoveBoulderText", + "_MoveCantForgetHMText", + "_MoveForgotText", + "_MoveKnowsOneText", + "_MoveMonWOMailSaveText", + "_MoveNameText", + "_MysteryGiftCanceledText", + "_MysteryGiftCommErrorText", + "_MysteryGiftFiveADayText", + "_MysteryGiftOneADayText", + "_MysteryGiftSentHomeText", + "_MysteryGiftSentText", + "_NPCTradeAfterText1", + "_NPCTradeAfterText2", + "_NPCTradeAfterText3", + "_NPCTradeCableText", + "_NPCTradeCancelText1", + "_NPCTradeCancelText2", + "_NPCTradeCancelText3", + "_NPCTradeCompleteText1", + "_NPCTradeCompleteText2", + "_NPCTradeCompleteText3", + "_NPCTradeFanfareText", + "_NPCTradeIntroText1", + "_NPCTradeIntroText2", + "_NPCTradeIntroText3", + "_NPCTradeWrongText1", + "_NPCTradeWrongText2", + "_NPCTradeWrongText3", + "_NameRaterBetterNameText", + "_NameRaterComeAgainText", + "_NameRaterEggText", + "_NameRaterFinishedText", + "_NameRaterHelloText", + "_NameRaterNamedText", + "_NameRaterPerfectNameText", + "_NameRaterSameNameText", + "_NameRaterWhatNameText", + "_NameRaterWhichMonText", + "_NewDexDataText", + "_NoCoinCaseText", + "_NoCoinsText", + "_NoCyclingText", + "_NoPhotoText", + "_NoRoomForEggText", + "_NoRoomTMHMText", + "_NotEnoughMoneyText", + "_NotYetText", + "_NothingHereText", + "_NothingToChooseText", + "_NothingToPutAwayText", + "_NothingToSellText", + "_OKComeBackText", + "_OPT_AddictivelyText", + "_OPT_AlmostPoisonouslyText", + "_OPT_AptlyNamedText", + "_OPT_BoldSortOfText", + "_OPT_CuteText", + "_OPT_EvolutionMustBeText", + "_OPT_ExcitingText", + "_OPT_FlippedOutText", + "_OPT_FriendlyText", + "_OPT_FrighteningText", + "_OPT_GuardedText", + "_OPT_HeartMeltinglyText", + "_OPT_HotHotHotText", + "_OPT_InspiringText", + "_OPT_IntroText1", + "_OPT_IntroText2", + "_OPT_IntroText3", + "_OPT_LooksInWaterText", + "_OPT_LovelyText", + "_OPT_MaryText1", + "_OPT_MischievouslyText", + "_OPT_NowText", + "_OPT_OakText1", + "_OPT_OakText2", + "_OPT_OakText3", + "_OPT_PleasantText", + "_OPT_PokemonChannelText", + "_OPT_PowerfulText", + "_OPT_ProvocativelyText", + "_OPT_SensuallyText", + "_OPT_SpeedyText", + "_OPT_StimulatingText", + "_OPT_SuaveDebonairText", + "_OPT_SweetAdorablyText", + "_OPT_TopicallyText", + "_OPT_UnbearablyText", + "_OPT_UndeniablyKindOfText", + "_OPT_WeirdText", + "_OPT_WigglySlicklyText", + "_OPT_WowImpressivelyText", + "_OTSendsText", + "_OakPCText1", + "_OakPCText2", + "_OakPCText3", + "_OakPCText4", + "_OakRating01", + "_OakRating02", + "_OakRating03", + "_OakRating04", + "_OakRating05", + "_OakRating06", + "_OakRating07", + "_OakRating08", + "_OakRating09", + "_OakRating10", + "_OakRating11", + "_OakRating12", + "_OakRating13", + "_OakRating14", + "_OakRating15", + "_OakRating16", + "_OakRating17", + "_OakRating18", + "_OakRating19", + "_OakText1", + "_OakText2", + "_OakText3", + "_OakText4", + "_OakText5", + "_OakText6", + "_OakText7", + "_OakThisIsntTheTimeText", + "_OakTimeHoursQuestionMarkText", + "_OakTimeHowManyMinutesText", + "_OakTimeIsItText", + "_OakTimeMinutesQuestionMarkText", + "_OakTimeOversleptText", + "_OakTimeSoDarkText", + "_OakTimeWhatDayIsItText", + "_OakTimeWhatHoursText", + "_OakTimeWhatTimeIsItText", + "_OakTimeWhoaMinutesText", + "_OakTimeWokeUpText", + "_OakTimeYikesText", + "_ObjectEventText", + "_ObtainedFruitText", + "_ObtainedTheVoltorbBadgeText", + "_OhFineThenText", + "_OnlyOneMonText", + "_PCCantDepositLastMonText", + "_PCCantTakeText", + "_PCGottaHavePokemonText", + "_PCMonHoldingMailText", + "_PCNoSingleMonText", + "_PCWhatText", + "_PPIsMaxedOutText", + "_PPRestoredText", + "_PPsIncreasedText", + "_PackEmptyText", + "_PackNoItemText", + "_PasswordAskEnterText", + "_PasswordAskResetClockText", + "_PasswordAskResetText", + "_PasswordWrongText", + "_PerfectHeresYourMonText", + "_PharmacyComeAgainText", + "_PharmacyFinalPriceText", + "_PharmacyHowManyText", + "_PharmacyIntroText", + "_PharmacyNoMoneyText", + "_PharmacyPackFullText", + "_PharmacyThanksText", + "_PhoneClickText", + "_PhoneEllipseText", + "_PhoneJustTalkToThemText", + "_PhoneOutOfAreaText", + "_PhoneThankYouText", + "_PhoneWrongNumberText", + "_PlayedFluteText", + "_PlayerFoundItemText", + "_PlayerPickedUpPayDayMoney", + "_PlayersPCAskWhatDoText", + "_PlayersPCDepositItemsText", + "_PlayersPCHowManyDepositText", + "_PlayersPCHowManyWithdrawText", + "_PlayersPCNoItemsText", + "_PlayersPCNoRoomDepositText", + "_PlayersPCNoRoomWithdrawText", + "_PlayersPCTurnOnText", + "_PlayersPCWithdrewItemsText", + "_PnP_BoldText", + "_PnP_CoolText", + "_PnP_CuteText", + "_PnP_GreatText", + "_PnP_HappyText", + "_PnP_InspiringText", + "_PnP_LazyText", + "_PnP_MyTypeText", + "_PnP_NoisyText", + "_PnP_OddText", + "_PnP_PickyText", + "_PnP_PrecociousText", + "_PnP_RightForMeText", + "_PnP_SoSoText", + "_PnP_SortOfOKText", + "_PnP_Text1", + "_PnP_Text2", + "_PnP_Text3", + "_PnP_Text4", + "_PnP_Text5", + "_PnP_WeirdText", + "_PocketIsFullText", + "_PoisonFaintText", + "_PoisonWhiteoutText", + "_PokecenterBillsPCText", + "_PokecenterOaksPCText", + "_PokecenterPCCantUseText", + "_PokecenterPCOaksClosedText", + "_PokecenterPCTurnOnText", + "_PokecenterPCWhoseText", + "_PokecenterPlayersPCText", + "_PokedexShowText", + "_PokegearAskDeleteText", + "_PokegearAskWhoCallText", + "_PokegearPressButtonText", + "_PokemonAskSwapItemText", + "_PokemonHoldItemText", + "_PokemonNotEnoughHPText", + "_PokemonNotHoldingText", + "_PokemonRemoveMailText", + "_PokemonSwapItemText", + "_PokemonTookItemText", + "_PrestoAllDoneText", + "_PutAwayAndSetUpText", + "_PutAwayTheDecoText", + "_PutItemInPocketText", + "_RaiseThePPOfWhichMoveText", + "_ReceiveItemText", + "_ReceivedEggText", + "_ReceivedItemText", + "_ReceivedTMHMText", + "_RecoveredSomeHPText", + "_RegisteredItemText", + "_RemainingTimeText", + "_RemoveMailText", + "_RepelUsedEarlierIsStillInEffectText", + "_RepelWoreOffText", + "_RestoreThePPOfWhichMoveText", + "_RetrieveMysteryGiftText", + "_RevitalizedText", + "_RidOfParalysisText", + "_RocketRadioText1", + "_RocketRadioText10", + "_RocketRadioText2", + "_RocketRadioText3", + "_RocketRadioText4", + "_RocketRadioText5", + "_RocketRadioText6", + "_RocketRadioText7", + "_RocketRadioText8", + "_RocketRadioText9", + "_RodBiteText", + "_RodNothingText", + "_SaveFileCorruptedText", + "_SavedTheGameText", + "_SavingDontTurnOffThePowerText", + "_SavingRecordText", + "_SentTrophyHomeText", + "_SetUpTheDecoText", + "_SlotsBetHowManyCoinsText", + "_SlotsDarnText", + "_SlotsLinedUpText", + "_SlotsNotEnoughCoinsText", + "_SlotsPlayAgainText", + "_SlotsRanOutOfCoinsText", + "_SlotsStartText", + "_SpaceSpaceColonText", + "_SquirtbottleNothingText", + "_StartMenuContestEndText", + "_StopLearningMoveText", + "_StoppedEvolvingText", + "_SweetScentNothingText", + "_TMHMNotCompatibleText", + "_TakeGoodCareOfEggText", + "_TakeGoodCareOfMonText", + "_TeleportReturnText", + "_TestEventText", + "_ThatCantBeUsedRightNowText", + "_ThatItemCantBePutInThePackText", + "_ThatsEnoughComeBackText", + "_TheBoxIsFullText", + "_TheItemWasPutInThePackText", + "_ThePasswordIsText", + "_ThereIsNoEggText", + "_ThrewAwayText", + "_TimeAskOkayText", + "_TimesetAskAdjustDSTText", + "_TimesetAskDSTText", + "_TimesetAskNotDSTText", + "_TimesetDSTText", + "_TimesetNotDSTText", + "_UnusedNothingHereText", + "_UseCutText", + "_UseDigText", + "_UseEscapeRopeText", + "_UseHeadbuttText", + "_UseRockSmashText", + "_UseSacredAshText", + "_UseStrengthText", + "_UseSweetScentText", + "_UseWaterfallText", + "_UseWhirlpoolText", + "_UsedInsteadText", + "_UsedMove1Text", + "_UsedMove2Text", + "_UsedSurfText", + "_WaitButtonText", + "_WarpingText", + "_WasDefrostedText", + "_WasSentToBillsPCText", + "_WhatDoYouWantToPlayWithText", + "_WhatShouldIRaiseText", + "_WhichMonPhotoText", + "_WhichSidePutAwayText", + "_WhichSidePutOnText", + "_WhitedOutText", + "_WillTradeText", + "_WillYouPlayWithMonText", + "_WindowAreaExceededErrorText", + "_WindowPoppingErrorText", + "_WokeUpText", + "_WouldYouLikeToSaveTheGameText", + "_YouCanHaveThisText", + "_YouCantUseItInABattleText", + "_YouDontHaveAMonText", + "_YouNeedTwoMonForBreedingText", + "_YourFoesWeakGetmMonText", + "_YourFriendIsNotReadyText", + "_YourMonHasGrownText", + "_YourMonsHPWasHealedText" + ] + }, "tilesets": { "TILESET_CAVE": {}, "TILESET_CHAMPIONS_ROOM": {}, From 16eefcde683824a6aaf41f11a8c433374fbe2a58 Mon Sep 17 00:00:00 2001 From: 1jamie Date: Sat, 22 Aug 2026 17:08:14 -0500 Subject: [PATCH 2/2] Implement session teardown and resource management for in-process transitions - Introduced `teardownMountedSession` to handle cleanup of mounted versions, generated data, and mod states during transitions between the editor and launcher. - Added `flushEditorPackageLoaded` to evict save-editor modules from `package.loaded` dynamically, ensuring a clean state for subsequent sessions. - Implemented `Game:reset` and `Game2:reset` methods to clear session-specific fields, allowing for a fresh start when returning to the launcher. - Enhanced `Renderer` and `TileRenderer` to release GPU resources immediately, preventing memory leaks during rapid transitions. - Updated `MagnetTrainRide` to support OAM priority overlays and manage background rendering with new shader functionality. This commit improves the stability and performance of the application during in-process transitions, particularly on Android. fixes Yellow color palette for title screen fixes #1662 #1643 #1536 and finishes fixing #1597 --- main.lua | 64 +- src/core/Game.lua | 22 + src/core/Game2.lua | 18 + src/import/CacheFs.lua | 30 +- src/render/PaletteFX.lua | 26 +- src/render/Renderer.lua | 20 + src/render/TileRenderer.lua | 7 + src/ui/TradeAnim.lua | 678 ++++++++++++++---- src/ui/gen2/MagnetTrainRide.lua | 191 ++++- .../engine/android_exit_to_launcher_test.lua | 22 + tests/engine/cache_fs_red_migration_test.lua | 30 + .../engine/launcher_session_teardown_test.lua | 111 +++ tests/gen2_magnet_train_test.lua | 12 + tests/love_stub.lua | 4 +- tests/save_editor_mod_tests.lua | 22 + tests/yellow_title_palette_test.lua | 48 ++ 16 files changed, 1090 insertions(+), 215 deletions(-) create mode 100644 tests/engine/launcher_session_teardown_test.lua create mode 100644 tests/yellow_title_palette_test.lua diff --git a/main.lua b/main.lua index 8cbf4c7d..7b6fba4c 100644 --- a/main.lua +++ b/main.lua @@ -82,6 +82,43 @@ end local editorHost, editorVersion, editorWindow local closeEditor -- forward declaration: openEditor hands it to the editor +-- Drop CacheFs / Data / mod Runtime / Assets / LegacyCompat for one mounted +-- version session (save editor or game). closeEditor and returnToLauncher +-- both go through here so neither path can forget a singleton the other resets. +local function teardownMountedSession(version) + if version then + require("src.import.CacheFs").unmountVersion(version) + end + require("src.core.Data"):unloadGenerated() + local Runtime = require("src.mods.Runtime") + if Runtime.reset then Runtime.reset() end + local Assets = require("src.render.Assets") + if Assets.installLoader then Assets.installLoader(nil) end + local okCompat, LegacyCompat = pcall(require, "src.mods.LegacyCompat") + if okCompat and LegacyCompat.reset then LegacyCompat.reset() end +end + +-- Evict every save-editor module from package.loaded without a hardcoded +-- panel whitelist. Flat require names (App, Party, …) resolve under +-- tools/save-editor/; path-style keys may also appear. A key is flushed +-- when it names a save-editor path or when tools/save-editor/{panels/}K.lua +-- exists for a flat name K -- new panels are picked up automatically. +local function flushEditorPackageLoaded() + local fs = love and love.filesystem + local function isEditorFlat(name) + if not (fs and fs.getInfo) then return false end + if name:find("[./]") then return false end + return fs.getInfo("tools/save-editor/" .. name .. ".lua") ~= nil + or fs.getInfo("tools/save-editor/panels/" .. name .. ".lua") ~= nil + end + for k in pairs(package.loaded) do + if type(k) == "string" + and (k:find("save%-editor", 1, false) or isEditorFlat(k)) then + package.loaded[k] = nil + end + end +end + -- The editor's modules use flat names (require("Kit"), require("Party")), so -- their directories have to be on the require path. It must be -- love.filesystem's path, not package.path: in a packaged build these files @@ -180,9 +217,9 @@ local function openEditor(version, slotId) if EditorApp.unload then pcall(EditorApp.unload) end EditorApp = nil if version then - require("src.import.CacheFs").unmountVersion(version) - require("src.core.Data"):unloadGenerated() + teardownMountedSession(version) end + flushEditorPackageLoaded() restoreWindow() Importer = editorHost editorHost = nil @@ -197,21 +234,17 @@ end -- Back to the launcher. Everything the editor mounted or cached has to come -- back out: the version overlay (CacheFs) and the generated modules require -- cached behind it (Data), or pressing Play on the OTHER game would boot it --- with this one's data. +-- with this one's data. Also reset Runtime / Assets / LegacyCompat so the +-- next Edit or Play does not inherit the editor's dead mod loader. function closeEditor() local version = editorVersion editorMode = false if EditorApp and EditorApp.unload then EditorApp.unload() end EditorApp = nil if version then - require("src.import.CacheFs").unmountVersion(version) - require("src.core.Data"):unloadGenerated() - end - for k in pairs(package.loaded) do - if type(k) == "string" and (k:find("save%-editor") or k == "App" or k == "Kit" or k == "State" or k == "Catalog" or k == "SaveIO" or k == "Ops" or k == "MonOps" or k == "ItemOps" or k == "PadInput" or k == "Gen" or k == "Theme") then - package.loaded[k] = nil - end + teardownMountedSession(version) end + flushEditorPackageLoaded() editorVersion = nil restoreWindow() Importer = editorHost @@ -333,16 +366,11 @@ local function returnToLauncher() local GameVersion = require("src.core.GameVersion") local currentVersion = GameVersion.get() - if currentVersion then - require("src.import.CacheFs").unmountVersion(currentVersion) - end - require("src.core.Data"):unloadGenerated() + teardownMountedSession(currentVersion) - local Runtime = require("src.mods.Runtime") - if Runtime.reset then - Runtime.reset() + if Game.reset then + pcall(function() Game:reset() end) end - Game = nil autopilot = nil driverCo = nil diff --git a/src/core/Game.lua b/src/core/Game.lua index 85bedf24..b1b730b9 100644 --- a/src/core/Game.lua +++ b/src/core/Game.lua @@ -1381,4 +1381,26 @@ function Game:restoreCheckpointBattle(battle) if battle.resumeCheckpoint then battle:resumeCheckpoint() end end +-- Drop every session-owned field so the next Game:load() starts clean when +-- the process returns to the launcher in-place (Android / intent_game). +-- main.lua must not guess field names: new systems (Game.network, …) are +-- cleared automatically because only functions (methods) are kept. +function Game:reset() + if self.stack and self.stack.clear then + pcall(function() self.stack:clear() end) + end + if self.renderer and self.renderer.releaseCanvases then + pcall(function() self.renderer:releaseCanvases() end) + end + local keys = {} + for key, value in pairs(self) do + if type(value) ~= "function" then + keys[#keys + 1] = key + end + end + for _, key in ipairs(keys) do + self[key] = nil + end +end + return Game diff --git a/src/core/Game2.lua b/src/core/Game2.lua index e5edaa4f..4ab8a479 100644 --- a/src/core/Game2.lua +++ b/src/core/Game2.lua @@ -2123,4 +2123,22 @@ function Game2:joystickremoved() TouchControls:joystickremoved() end +-- In-process return-to-launcher (Android / intent_game): drop session fields +-- so a later Game2.new() + load is not sharing a live stack or mod loader. +-- Methods live on the class table; pairs(self) only sees instance state. +function Game2:reset() + if self.stack and self.stack.clear then + pcall(function() self.stack:clear() end) + end + local keys = {} + for key, value in pairs(self) do + if type(value) ~= "function" then + keys[#keys + 1] = key + end + end + for _, key in ipairs(keys) do + self[key] = nil + end +end + return Game2 diff --git a/src/import/CacheFs.lua b/src/import/CacheFs.lua index 00ef8e99..4b86d5cb 100644 --- a/src/import/CacheFs.lua +++ b/src/import/CacheFs.lua @@ -614,14 +614,18 @@ function CacheFs.mountVersion(version) return true end --- Undo mountVersion. A process normally mounts exactly one version and then --- boots it, but the launcher can open the save editor on one game's save, --- close it, and press Play on another: with the first version's subtree --- still prepended, the other's require("data.generated.*") and generated --- art would silently resolve to the first 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. +-- Undo mountVersion in LIFO order relative to mountVersion: generated-tree +-- overlays first (assets, then data -- reverse of mountGeneratedTrees), then +-- the version folder. PHYSFS resolves by stack order; peeling the wrong +-- layer first can leave another version's generated files winning a name. +-- +-- A process normally mounts exactly one version and then boots it, but the +-- launcher can open the save editor on one game's save, close it, and press +-- Play on another: with the first version's subtree still prepended, the +-- other's require("data.generated.*") and generated art would silently +-- resolve to the first 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. function CacheFs.unmountVersion(version) @@ -633,6 +637,16 @@ function CacheFs.unmountVersion(version) base = love.filesystem.getSaveDirectory() end local done = false + -- LIFO vs mountGeneratedTrees: assets/generated, then data/generated. + if love.filesystem and love.filesystem.unmount then + local generated = { + prefix .. "assets/generated", + prefix .. "data/generated", + } + for _, src in ipairs(generated) do + done = love.filesystem.unmount(src) or done + end + end local fn = resolveUnmount() if fn and base then done = fn(base .. SEP .. sub) or done diff --git a/src/render/PaletteFX.lua b/src/render/PaletteFX.lua index 7accec59..b00d65c3 100644 --- a/src/render/PaletteFX.lua +++ b/src/render/PaletteFX.lua @@ -397,9 +397,12 @@ function PaletteFX.uiSpriteRedraws() end -- Active named-palette table for COLORS: RED++ uses data/palettes_gbc.lua, --- everything else uses the ROM-imported data.palettes. +-- Yellow uses data/palettes_yellow.lua, everything else uses the ROM-imported data.palettes. function PaletteFX.pack(data) - if PaletteFX.usesGbcPack() then + if GameVersion.isYellow() then + local y = PaletteFX.yellowPack() + if y then return y end + elseif PaletteFX.usesGbcPack() then local g = PaletteFX.gbcPack() if g then return g end end @@ -449,24 +452,27 @@ function PaletteFX.pal(data, name) local fromRom = romNamedPal(data, name) if fromRom then return fromRom end end - if PaletteFX.usesYellowCgb() then - local fromCgb = yellowCgbNamedPal(data, name) - if fromCgb then return fromCgb end + if GameVersion.isYellow() then + if PaletteFX.usesYellowCgb() then + local fromCgb = yellowCgbNamedPal(data, name) + if fromCgb then return fromCgb end + end + local y = PaletteFX.yellowPack() + local yc = y and y.palettes and y.palettes[name] + if yc then return yc end + local fromRom = romNamedPal(data, name) + if fromRom then return fromRom end end local p = PaletteFX.pack(data) local c = p and p.palettes and p.palettes[name] if c then return c end - if GameVersion.isYellow() then - local y = PaletteFX.yellowPack() - local yc = y and y.palettes and y.palettes[name] - if yc then return yc end - end if PaletteFX.usesGbcPack() then return romNamedPal(data, name) end return nil end + -- the species' palette (data/pokemon/palettes.asm), MEWMON for unknowns. -- transformed forces PAL_GRAYMON (Ditto's palette) regardless of species -- (engine/gfx/palettes.asm DeterminePaletteID: bit TRANSFORMED, a; a diff --git a/src/render/Renderer.lua b/src/render/Renderer.lua index 412f793c..5ed14d47 100644 --- a/src/render/Renderer.lua +++ b/src/render/Renderer.lua @@ -100,10 +100,30 @@ local function positionLift(ph, contentPx, dpiY, cut) return ScreenPosition.lift(ph, contentPx, ScreenPosition.safeTop() * dpiY) end +-- Free GPU canvases immediately. Overwriting the Lua reference alone leaves +-- VRAM allocated until LOVE's GC runs, which is too slow when Android loops +-- Play → launcher → Play in one process. +local function releaseCanvas(canvas) + if canvas and canvas.release then pcall(canvas.release, canvas) end +end + +function Renderer:releaseCanvases() + releaseCanvas(self.canvas); self.canvas = nil + releaseCanvas(self.battleHUDCanvas); self.battleHUDCanvas = nil + releaseCanvas(self.worldCanvas); self.worldCanvas = nil + releaseCanvas(self.uprightCanvas); self.uprightCanvas = nil + self.worldActive = false + self.uprightActive = false + self.worldOverride = nil +end + function Renderer:init() -- 160x144 real pixels, never DPI-scaled: see src/render/PixelCanvas.lua -- (#208). Every canvas below is sized in framebuffer pixels for the same -- reason -- worldViewSize() already works in drawable pixels. + -- Release any prior session's surfaces before reallocating (in-process + -- return-to-launcher reuses this Renderer singleton). + self:releaseCanvases() self.uiWidth, self.uiHeight = self.WIDTH, self.HEIGHT self.canvas = PixelCanvas.new(self.uiWidth, self.uiHeight, "nearest") self.battleHUDCanvas = nil diff --git a/src/render/TileRenderer.lua b/src/render/TileRenderer.lua index da138779..ad29bce5 100644 --- a/src/render/TileRenderer.lua +++ b/src/render/TileRenderer.lua @@ -951,6 +951,13 @@ function TileRenderer.invalidate() frameImages = {} toggleImages = {} stripData = {} + -- RED++ per-map atlases are large Images; clear and release so an + -- in-process Play → launcher → Play loop does not keep every prior + -- session's bake in VRAM / Lua heap. + for key, img in pairs(gbcAtlasCache) do + safeRelease(img) + gbcAtlasCache[key] = nil + end end Assets.register(TileRenderer.invalidate) diff --git a/src/ui/TradeAnim.lua b/src/ui/TradeAnim.lua index 5e926626..35353e18 100644 --- a/src/ui/TradeAnim.lua +++ b/src/ui/TradeAnim.lua @@ -34,10 +34,12 @@ local DEFAULT_ART = { cableBall = "assets/generated/trade/cable_ball.png", cableBallAlt = "assets/generated/trade/cable_ball_alt.png", bubble = "assets/generated/trade/bubble.png", + moveAnim0 = "assets/generated/battle/anims/move_anim_0.png", + balls = "assets/generated/battle/balls.png", } local function tryImage(path) - if not path then return nil end + if not (path and love and love.graphics and love.graphics.newImage) then return nil end local ok, img = pcall(love.graphics.newImage, path) return ok and img or nil end @@ -89,6 +91,92 @@ local SEQ = { "done", } +-- FrameBlocks 03..08 definition for move_anim_0.png (128x40, 16 tiles/row, 8x8 per tile) +local FRAME_BLOCKS = { + -- FrameBlock03: Pokeball normal (16x16) + [3] = { + { tile = 2, dx = 0, dy = 0, xflip = false, yflip = false }, + { tile = 2, dx = 8, dy = 0, xflip = true, yflip = false }, + { tile = 18, dx = 0, dy = 8, xflip = false, yflip = false }, + { tile = 18, dx = 8, dy = 8, xflip = true, yflip = false }, + }, + -- FrameBlock04: Pokeball tilted left (16x16) + [4] = { + { tile = 6, dx = 0, dy = 0, xflip = false, yflip = false }, + { tile = 7, dx = 8, dy = 0, xflip = false, yflip = false }, + { tile = 22, dx = 0, dy = 8, xflip = false, yflip = false }, + { tile = 23, dx = 8, dy = 8, xflip = false, yflip = false }, + }, + -- FrameBlock05: Pokeball tilted right (16x16) + [5] = { + { tile = 7, dx = 0, dy = 0, xflip = true, yflip = false }, + { tile = 6, dx = 8, dy = 0, xflip = true, yflip = false }, + { tile = 23, dx = 0, dy = 8, xflip = true, yflip = false }, + { tile = 22, dx = 8, dy = 8, xflip = true, yflip = false }, + }, + -- FrameBlock06: Small Poof smoke cloud (32x32) + [6] = { + { tile = 0x23, dx = 8, dy = 0, xflip = false, yflip = false }, + { tile = 0x32, dx = 0, dy = 8, xflip = false, yflip = false }, + { tile = 0x33, dx = 8, dy = 8, xflip = false, yflip = false }, + { tile = 0x23, dx = 16, dy = 0, xflip = true, yflip = false }, + { tile = 0x33, dx = 16, dy = 8, xflip = true, yflip = false }, + { tile = 0x32, dx = 24, dy = 8, xflip = true, yflip = false }, + { tile = 0x32, dx = 0, dy = 16, xflip = false, yflip = true }, + { tile = 0x33, dx = 8, dy = 16, xflip = false, yflip = true }, + { tile = 0x23, dx = 8, dy = 24, xflip = false, yflip = true }, + { tile = 0x33, dx = 16, dy = 16, xflip = true, yflip = true }, + { tile = 0x32, dx = 24, dy = 16, xflip = true, yflip = true }, + { tile = 0x23, dx = 16, dy = 24, xflip = true, yflip = true }, + }, + -- FrameBlock07: Medium Poof smoke cloud (32x32) + [7] = { + { tile = 0x20, dx = 0, dy = 0, xflip = false, yflip = false }, + { tile = 0x21, dx = 8, dy = 0, xflip = false, yflip = false }, + { tile = 0x30, dx = 0, dy = 8, xflip = false, yflip = false }, + { tile = 0x31, dx = 8, dy = 8, xflip = false, yflip = false }, + { tile = 0x21, dx = 16, dy = 0, xflip = true, yflip = false }, + { tile = 0x20, dx = 24, dy = 0, xflip = true, yflip = false }, + { tile = 0x31, dx = 16, dy = 8, xflip = true, yflip = false }, + { tile = 0x30, dx = 24, dy = 8, xflip = true, yflip = false }, + { tile = 0x30, dx = 0, dy = 16, xflip = false, yflip = true }, + { tile = 0x31, dx = 8, dy = 16, xflip = false, yflip = true }, + { tile = 0x20, dx = 0, dy = 24, xflip = false, yflip = true }, + { tile = 0x21, dx = 8, dy = 24, xflip = false, yflip = true }, + { tile = 0x31, dx = 16, dy = 16, xflip = true, yflip = true }, + { tile = 0x30, dx = 24, dy = 16, xflip = true, yflip = true }, + { tile = 0x21, dx = 16, dy = 24, xflip = true, yflip = true }, + { tile = 0x20, dx = 24, dy = 24, xflip = true, yflip = true }, + }, + -- FrameBlock08: Large Poof smoke cloud (32x32) + [8] = { + { tile = 0x22, dx = 0, dy = 0, xflip = false, yflip = false }, + { tile = 0x23, dx = 8, dy = 0, xflip = false, yflip = false }, + { tile = 0x32, dx = 0, dy = 8, xflip = false, yflip = false }, + { tile = 0x33, dx = 8, dy = 8, xflip = false, yflip = false }, + { tile = 0x23, dx = 16, dy = 0, xflip = true, yflip = false }, + { tile = 0x22, dx = 24, dy = 0, xflip = true, yflip = false }, + { tile = 0x33, dx = 16, dy = 8, xflip = true, yflip = false }, + { tile = 0x32, dx = 24, dy = 8, xflip = true, yflip = false }, + { tile = 0x32, dx = 0, dy = 16, xflip = false, yflip = true }, + { tile = 0x33, dx = 8, dy = 16, xflip = false, yflip = true }, + { tile = 0x22, dx = 0, dy = 24, xflip = false, yflip = true }, + { tile = 0x23, dx = 8, dy = 24, xflip = false, yflip = true }, + { tile = 0x33, dx = 16, dy = 16, xflip = true, yflip = true }, + { tile = 0x32, dx = 24, dy = 16, xflip = true, yflip = true }, + { tile = 0x23, dx = 16, dy = 24, xflip = true, yflip = true }, + { tile = 0x22, dx = 24, dy = 24, xflip = true, yflip = true }, + }, +} + +-- BallMoveDistances1 (engine/battle/animations.asm:881) +-- Pokéball jumps up into the open link cable nozzle: -12, -12, -8 (3 frames each) +local BALL_SUCTION_DISTANCES = { -12, -12, -8 } + +-- BallMoveDistances2 (engine/battle/animations.asm:922) +-- Incoming Pokéball bounces out of nozzle onto the ground: 11, 12, -12, -7, 7, 12, -8, 8 (5 frames each) +local BALL_BOUNCE_DISTANCES = { 11, 12, -12, -7, 7, 12, -8, 8 } + function TradeAnim.new(game, opts) opts = opts or {} local self = setmetatable({}, TradeAnim) @@ -120,6 +208,8 @@ function TradeAnim.new(game, opts) cableBall = tryImage(art.cableBall or DEFAULT_ART.cableBall), cableBallAlt = tryImage(art.cableBallAlt or DEFAULT_ART.cableBallAlt), bubble = tryImage(art.bubble or DEFAULT_ART.bubble), + moveAnim0 = tryImage(DEFAULT_ART.moveAnim0), + balls = tryImage(DEFAULT_ART.balls), } self.sentSprite, self.sentSpriteTrueColor = spriteOf(game, self.sent) self.recvSprite, self.recvSpriteTrueColor = spriteOf(game, self.received) @@ -136,6 +226,14 @@ function TradeAnim.new(game, opts) self.monVisible = true self.waitingText = false self.cableFlash = false + self.activeBallBlock = nil + self.activeBallX = 0 + self.activeBallY = 0 + self.activePoofBlock = nil + self.activePoofX = 0 + self.activePoofY = 0 + self.wx = 0 + self.slidingBox = false return self end @@ -151,52 +249,100 @@ function TradeAnim:advance() self.sub = nil self.flash = false self.cableFlash = false - self.poof = nil + self.activeBallBlock = nil + self.activePoofBlock = nil + self.slidingBox = false + self.wx = 0 + if self.phase == "done" then self.game.stack:pop() if self.onDone then self.onDone() end elseif self.phase == "show_enemy" then self.monVisible = false + self.activeBallBlock = 4 + self.activeBallX, self.activeBallY = 72, 40 + self.activePoofBlock = nil + self.cableSlideOut = 0 elseif self.phase == "transfer_lr" then - -- wBaseCoord $54, $1c OAM -> screen (76, 12) - self.monX, self.monY = 76, 12 + -- BaseCoord $54, $1c -> Screen (92, 28) for 16x16 icon (center 100, 36) + self.monX, self.monY = 92, 28 + self.scx = 0 elseif self.phase == "transfer_rl" then - -- wBaseCoord $64, $44 OAM -> screen (92, 52), right GB on screen - self.monX, self.monY = 92, 52 - self.scx = 160 + -- BaseCoord $64, $44 -> Screen (108, 68) for 16x16 icon (center 116, 76) + self.monX, self.monY = 108, 68 + self.scx = 256 elseif self.phase == "ball_enter" then - -- lb bc, $20, $60: b = Y, c = X (Trade_AnimateBallEnteringLinkCable) + -- Pokéball sits at BaseCoord $48 (Screen 72, 64) before shake and suction + self.activeBallBlock = 3 + self.activeBallX, self.activeBallY = 72, 64 self.ballX, self.ballY = 0x60, 0x20 elseif self.phase == "open_cable" or self.phase == "open_cable2" then - -- SCX $a0 -> $f0: cable slides in from the right, open end rests at x64 - self.scx = 0x50 + -- SCX $a0 (160) -> $f0 (240): cable slides in from right, open end rests at x64 + self.scx = 80 + if self.phase == "open_cable" then + self.activeBallBlock = 3 + self.activeBallX, self.activeBallY = 72, 64 + end Sound.play(self.game.data, "Heal_HP") end end -function TradeAnim:say(text, delay, thenFn) - self.waitingText = true - self.game.stack:push(TextBox.new(self.game, text, function() - self.waitingText = false - if thenFn then thenFn() else self:advance() end - end, { auto = { delay = delay or 80 } })) +function TradeAnim:skipHeld() + return self.game.input:wasPressed("a") or self.game.input:wasPressed("b") end -function TradeAnim:skipHeld() - return self.game.input:wasPressed("a") or self.game.input:isDown("a") +function TradeAnim:drawFrameBlock(blockId, x, y) + local block = FRAME_BLOCKS[blockId] + if not block then return end + if self.img.moveAnim0 then + local iw, ih = self.img.moveAnim0:getDimensions() + for _, tile in ipairs(block) do + local tx = (tile.tile % 16) * 8 + local ty = math.floor(tile.tile / 16) * 8 + local quad = love.graphics.newQuad(tx, ty, 8, 8, iw, ih) + local sx = tile.xflip and -1 or 1 + local sy = tile.yflip and -1 or 1 + local ox = tile.xflip and 8 or 0 + local oy = tile.yflip and 8 or 0 + love.graphics.draw(self.img.moveAnim0, quad, x + tile.dx + ox, y + tile.dy + oy, 0, sx, sy) + end + else + if blockId == 3 or blockId == 4 or blockId == 5 then + love.graphics.setColor(0.9, 0.2, 0.2, 1) + love.graphics.arc("fill", x + 8, y + 8, 7, math.pi, 0) + love.graphics.setColor(0.9, 0.9, 0.9, 1) + love.graphics.arc("fill", x + 8, y + 8, 7, 0, math.pi) + love.graphics.setColor(0, 0, 0, 1) + love.graphics.circle("line", x + 8, y + 8, 7) + love.graphics.line(x + 1, y + 8, x + 15, y + 8) + love.graphics.circle("fill", x + 8, y + 8, 2) + love.graphics.setColor(1, 1, 1, 1) + elseif blockId == 6 or blockId == 7 or blockId == 8 then + local r = (blockId - 5) * 5 + love.graphics.setColor(0.8, 0.8, 0.8, 0.8) + love.graphics.circle("fill", x + 16, y + 16, r) + love.graphics.setColor(1, 1, 1, 1) + end + end end function TradeAnim:update(dt) if self.waitingText or self.phase == "done" then return end - local skip = self.game.input:wasPressed("a") + local skip = self:skipHeld() self.t = self.t + 1 local p = self.phase if p == "show_player" then - -- slide from SCX $86 -> 0, hold 80, poof, cry (Trade_ShowPlayerMon) + -- Trade_ShowPlayerMon: + -- 1. Slide from SCX $7e (126) -> 0 at 2px/frame (63 frames) + -- 2. Hold 80 frames + -- 3. TRADE_BALL_POOF_ANIM at BaseCoord $72 (Screen 64, 48): 3 frames x 6 ticks = 18 ticks + -- 4. TRADE_BALL_DROP_ANIM: mon vanishes, ball drops $41 (72, 56) -> $48 (72, 64) over 36 ticks + -- 5. PlayCry while ball sits on ground at (72, 64) if not self.sub then self.sub = "slide" end + if self.sub == "slide" then - self.scx = math.max(0, 0x86 - self.t * 2) + self.scx = math.max(0, 126 - self.t * 2) if skip or self.scx <= 0 then self.scx = 0 self.sub = "hold" @@ -206,52 +352,131 @@ function TradeAnim:update(dt) if skip or self.t >= 80 then self.sub = "poof" self.t = 0 - self.monVisible = false Sound.play(self.game.data, "Ball_Poof") end elseif self.sub == "poof" then - self.poof = math.max(0, 16 - self.t) - if skip or self.t >= 16 then + local step = math.floor(self.t / 6) + if step >= 3 or skip then + self.sub = "ball_drop" + self.t = 0 + self.activePoofBlock = nil + self.monVisible = false + else + self.activePoofBlock = 6 + step + self.activePoofX, self.activePoofY = 64, 48 + end + elseif self.sub == "ball_drop" then + if skip or self.t >= 36 then + self.sub = "cry" + self.t = 0 + self.activeBallBlock = 3 + self.activeBallX, self.activeBallY = 72, 64 Sound.playCry(self.game.data, self.sent.species) + else + local step = math.floor(self.t / 6) + if step == 0 then + self.activeBallBlock = 3 + self.activeBallX, self.activeBallY = 72, 56 + else + local blocks = { 3, 4, 3, 5, 3 } + self.activeBallBlock = blocks[step] or 3 + self.activeBallX, self.activeBallY = 72, 64 + end + end + elseif self.sub == "cry" then + if skip or self.t >= 40 then self.sub = nil self:advance() end end elseif p == "open_cable" or p == "open_cable2" then - -- 20 steps of 4px, matching the SCX loop - self.scx = math.max(0, 0x50 - self.t * 4) + -- Trade_DrawOpenEndOfLinkCable: SCX $a0 (160) -> $f0 (240) in 20 steps of 4px + self.scx = math.max(0, 80 - self.t * 4) if skip or self.scx <= 0 then self.scx = 0 self:advance() end elseif p == "ball_enter" then - -- TRADE_BALL_SHAKE then ball rides the cable; X from $60 toward $a0 - if self.t < 20 then - if skip then self.t = 20 end - return + -- Trade_AnimateBallEnteringLinkCable: + -- 1. TRADE_BALL_SHAKE_ANIM (16 ticks) + TradeShakePokeball suction jump (-12, -12, -8 over 9 ticks): + -- - Shakes at (72, 64) for 16 ticks (FrameBlock 04, 03, 05, 03) + -- - Jumps up: Y=52 (3 ticks), Y=40 (3 ticks), Y=32 (3 ticks) + -- - Ball cleared, SFX_TRADE_MACHINE plays + -- 2. DelayFrames 10 (chills for 10 frames) + -- 3. Ball inside horizontal cable: 16 steps of +4px every 3 frames (48 frames) with Tink sfx & bulge toggle + -- 4. Delay3 + if not self.sub then self.sub = "shake" end + + if self.sub == "shake" then + if skip or self.t >= 16 then + self.sub = "jump_up" + self.t = 0 + else + local shakeBlocks = { 4, 3, 5, 3 } + local step = math.floor(self.t / 4) + 1 + self.activeBallBlock = shakeBlocks[step] or 3 + self.activeBallX, self.activeBallY = 72, 64 + end + elseif self.sub == "jump_up" then + local step = math.floor(self.t / 3) + 1 + if step > #BALL_SUCTION_DISTANCES or skip then + self.sub = "chill" + self.t = 0 + self.activeBallBlock = nil + Sound.play(self.game.data, "Trade_Machine") + else + local yPos = 64 + for i = 1, step do + yPos = yPos + BALL_SUCTION_DISTANCES[i] + end + self.activeBallBlock = 3 + self.activeBallX, self.activeBallY = 72, yPos + end + elseif self.sub == "chill" then + if skip or self.t >= 10 then + self.sub = "suction" + self.t = 0 + self.ballX = 0x60 + end + elseif self.sub == "suction" then + local step = math.floor(self.t / 3) + if step >= 16 or skip then + self.sub = "exit_pause" + self.t = 0 + self.ballX = 0xA0 + else + self.ballX = 0x60 + step * 4 + self.flash = (step % 2 == 1) + if self.t % 3 == 0 and step < 16 then + Sound.play(self.game.data, "Tink") + end + end + elseif self.sub == "exit_pause" then + if skip or self.t >= 3 then + self.sub = nil + self:advance() + end end - local step = self.t - 20 - if step % 3 == 0 then - self.ballX = 0x60 + math.floor(step / 3) * 4 - self.flash = not self.flash - if self.ballX < 0xA0 then Sound.play(self.game.data, "Tink") end - end - if skip then self.ballX = 0xA0 end - if self.ballX >= 0xA0 then self:advance() end elseif p == "transfer_lr" then - -- scroll left GB off while the mon rides the cable, then the sprite - -- itself moves right and down into the right GB (Trade_AnimMonMoveVertical) - if self.t <= 80 then - self.scx = math.min(160, self.t * 2) - self.monX, self.monY = 76, 12 - elseif self.t <= 80 + 32 then - self.monX = 76 + math.floor((self.t - 80) / 8) * 4 - elseif self.t <= 80 + 64 then - self.monX = 92 - self.monY = 12 + math.floor((self.t - 112) / 8) * 10 + -- 16 units of 16px (256px total scroll) at 2px/frame = 128 frames (SCX 0 -> 256) + if self.t <= 128 then + self.scx = math.min(256, self.t * 2) + self.monX, self.monY = 92, 28 + elseif self.t <= 128 + 32 then + local step = math.floor((self.t - 128) / 8) + 1 + step = math.min(4, step) + self.scx = 256 + self.monX = 92 + step * 4 + self.monY = 28 + elseif self.t <= 128 + 64 then + local step = math.floor((self.t - 160) / 8) + 1 + step = math.min(4, step) + self.scx = 256 + self.monX = 108 + self.monY = 28 + step * 10 else self:advance() return @@ -260,17 +485,22 @@ function TradeAnim:update(dt) if skip then self:advance() end elseif p == "transfer_rl" then - -- mirror: sprite climbs out of the right GB, then the screen scrolls - -- back to the left GB + -- 64 frames vertical ascent + 128 frames horizontal scroll (SCX 256 -> 0) if self.t <= 32 then - self.scx = 160 - self.monX, self.monY = 92, 52 - math.floor(self.t / 8) * 10 + local step = math.floor(self.t / 8) + 1 + step = math.min(4, step) + self.scx = 256 + self.monX = 108 + self.monY = 68 - step * 10 elseif self.t <= 64 then - self.monX = 92 - math.floor((self.t - 32) / 8) * 4 - self.monY = 12 - elseif self.t <= 64 + 80 then - self.scx = math.max(0, 160 - (self.t - 64) * 2) - self.monX, self.monY = 76, 12 + local step = math.floor((self.t - 32) / 8) + 1 + step = math.min(4, step) + self.scx = 256 + self.monX = 108 - step * 4 + self.monY = 28 + elseif self.t <= 64 + 128 then + self.scx = math.max(0, 256 - (self.t - 64) * 2) + self.monX, self.monY = 92, 28 else self:advance() return @@ -282,54 +512,185 @@ function TradeAnim:update(dt) if skip or self.t >= 100 then self:advance() end elseif p == "went_to" then - local text = expand(self.game, "_TradeWentToText", { - ["RAM:wStringBuffer"] = speciesName(self.game, self.sent), - ["RAM:wLinkEnemyTrainerName"] = self.enemyName, - }) - self:say(text, 200) + if not self.sub then + self.sub = "text" + self.t = 0 + local text = expand(self.game, "_TradeWentToText", { + ["RAM:wStringBuffer"] = speciesName(self.game, self.sent), + ["RAM:wLinkEnemyTrainerName"] = self.enemyName, + }) + self.dialogText = text + end + + if self.sub == "text" then + if skip or self.t >= 200 then + self.sub = "slide_hold" + self.t = 0 + end + elseif self.sub == "slide_hold" then + if skip or self.t >= 50 then + self.sub = "slide_off" + self.t = 0 + self.slidingBox = true + end + elseif self.sub == "slide_off" then + self.wx = math.min(160, self.t * 2) + if skip or self.wx >= 160 then + self.wx = 160 + self.sub = "slide_end_pause" + self.t = 0 + end + elseif self.sub == "slide_end_pause" then + if skip or self.t >= 10 then + self.slidingBox = false + self.dialogText = nil + self.sub = nil + self:advance() + end + end elseif p == "for_sends" then - local a = expand(self.game, "_TradeForText", { - ["RAM:wStringBuffer"] = speciesName(self.game, self.sent), - }) - local b = expand(self.game, "_TradeSendsText", { - ["RAM:wLinkEnemyTrainerName"] = self.enemyName, - ["RAM:wNameBuffer"] = nameOf(self.game, self.received), - }) - self.waitingText = true - self.game.stack:push(TextBox.new(self.game, a, function() - self.game.stack:push(TextBox.new(self.game, b, function() - self.waitingText = false + if not self.sub then + self.sub = "for_text" + self.t = 0 + self.dialogText = expand(self.game, "_TradeForText", { + ["RAM:wStringBuffer"] = speciesName(self.game, self.sent), + }) + end + + if self.sub == "for_text" then + if skip or self.t >= 80 then + self.sub = "sends_text" + self.t = 0 + self.dialogText = expand(self.game, "_TradeSendsText", { + ["RAM:wLinkEnemyTrainerName"] = self.enemyName, + ["RAM:wNameBuffer"] = nameOf(self.game, self.received), + }) + end + elseif self.sub == "sends_text" then + if skip or self.t >= 80 then + self.dialogText = nil + self.sub = nil self:advance() - end, { auto = { delay = 80 } })) - end, { auto = { delay = 80 } })) + end + end elseif p == "farewell" then - local a = expand(self.game, "_TradeWavesFarewellText", { - ["RAM:wLinkEnemyTrainerName"] = self.enemyName, - }) - local b = expand(self.game, "_TradeTransferredText", { - ["RAM:wNameBuffer"] = nameOf(self.game, self.received), - }) - self.waitingText = true - self.game.stack:push(TextBox.new(self.game, a, function() - self.game.stack:push(TextBox.new(self.game, b, function() - self.waitingText = false + if not self.sub then + self.sub = "farewell_text" + self.t = 0 + self.dialogText = expand(self.game, "_TradeWavesFarewellText", { + ["RAM:wLinkEnemyTrainerName"] = self.enemyName, + }) + end + + if self.sub == "farewell_text" then + if skip or self.t >= 80 then + self.sub = "transferred_text" + self.t = 0 + self.dialogText = expand(self.game, "_TradeTransferredText", { + ["RAM:wNameBuffer"] = nameOf(self.game, self.received), + }) + end + elseif self.sub == "transferred_text" then + if skip or self.t >= 80 then + self.sub = "slide_hold" + self.t = 0 + end + elseif self.sub == "slide_hold" then + if skip or self.t >= 50 then + self.sub = "slide_off" + self.t = 0 + self.slidingBox = true + end + elseif self.sub == "slide_off" then + self.wx = math.min(160, self.t * 2) + if skip or self.wx >= 160 then + self.wx = 160 + self.sub = "slide_end_pause" + self.t = 0 + end + elseif self.sub == "slide_end_pause" then + if skip or self.t >= 10 then + self.slidingBox = false + self.dialogText = nil + self.sub = nil self:advance() - end, { auto = { delay = 80 } })) - end, { auto = { delay = 80 } })) + end + end elseif p == "show_enemy" then - if self.t == 1 then - Sound.play(self.game.data, "Ball_Poof") - self.monVisible = true - elseif self.t == 20 then - Sound.playCry(self.game.data, self.received.species) - elseif self.t >= 120 or skip then - local text = expand(self.game, "_TradeTakeCareText", { - ["RAM:wNameBuffer"] = nameOf(self.game, self.received), - }) - self:say(text, 80) + -- Trade_ShowEnemyMon (engine/movie/trade.asm:354): + -- 1. TRADE_BALL_TILT_ANIM with TradeJumpPokeball (8 bounce steps, 5 ticks each = 40 ticks): + -- - Starts at BaseCoord $84 (Screen X=72, Y=40) + -- - Moves Y by BallMoveDistances2 (+11, +12, -12, -7, +7, +12, -8, +8) + -- - On each step: Cable slides off-screen right by 8px + -- - Plays SFX_SWAP on impacts + -- 2. ClearScreen, Info box at (4, 10), Mon front sprite at (7, 2) + -- 3. TRADE_BALL_POOF_ANIM: FrameBlock 06, 07, 08 (18 ticks), SFX_BALL_POOF, revealing mon + -- 4. PlayCry + -- 5. Trade_Delay100 + -- 6. Info box cleared, PrintTradeTakeCareText (80 ticks) + -- 7. Trade_Delay100 -> finish + if not self.sub then + self.sub = "ball_bounce" + self.t = 0 + self.cableSlideOut = 0 + self.activeBallBlock = 4 + self.activeBallX, self.activeBallY = 72, 40 + end + + if self.sub == "ball_bounce" then + local step = math.floor(self.t / 5) + 1 + if step > #BALL_BOUNCE_DISTANCES or skip then + self.sub = "poof" + self.t = 0 + self.activeBallBlock = nil + self.monVisible = true + self.cableSlideOut = nil + Sound.play(self.game.data, "Ball_Poof") + else + local yPos = 40 + for i = 1, step do + yPos = yPos + BALL_BOUNCE_DISTANCES[i] + end + self.activeBallBlock = 4 + self.activeBallX, self.activeBallY = 72, yPos + self.cableSlideOut = (step - 1) * 8 + if self.t % 5 == 0 and (BALL_BOUNCE_DISTANCES[step] == 12 or step == #BALL_BOUNCE_DISTANCES) then + Sound.play(self.game.data, "Swap") + end + end + elseif self.sub == "poof" then + local step = math.floor(self.t / 6) + if step >= 3 or skip then + self.sub = "cry" + self.t = 0 + self.activePoofBlock = nil + Sound.playCry(self.game.data, self.received.species) + else + self.activePoofBlock = 6 + step + self.activePoofX, self.activePoofY = 64, 48 + end + elseif self.sub == "cry" then + if skip or self.t >= 100 then + self.sub = "take_care" + self.t = 0 + self.dialogText = expand(self.game, "_TradeTakeCareText", { + ["RAM:wNameBuffer"] = nameOf(self.game, self.received), + }) + end + elseif self.sub == "take_care" then + if skip or self.t >= 80 then + self.sub = "delay_end" + self.t = 0 + self.dialogText = nil + end + elseif self.sub == "delay_end" then + if skip or self.t >= 100 then + self.sub = nil + self:advance() + end end end end @@ -337,10 +698,18 @@ end local function drawCableHoriz(self, y, x0, x1) local w = math.max(0, x1 - x0) if w <= 0 then return end + if self.cableFlash then + love.graphics.setColor(0.65, 0.65, 0.65, 1) + else + love.graphics.setColor(1, 1, 1, 1) + end if self.img.cableHoriz then local iw, ih = self.img.cableHoriz:getDimensions() - local quad = love.graphics.newQuad(0, 0, math.min(w, iw), ih, iw, ih) - love.graphics.draw(self.img.cableHoriz, quad, x0, y) + for x = x0, x1 - 1, iw do + local drawW = math.min(iw, x1 - x) + local quad = love.graphics.newQuad(0, 0, drawW, ih, iw, ih) + love.graphics.draw(self.img.cableHoriz, quad, x, y) + end elseif self.img.cableSeg then for x = x0, x1 - 8, 8 do love.graphics.draw(self.img.cableSeg, x, y) @@ -348,13 +717,11 @@ local function drawCableHoriz(self, y, x0, x1) else love.graphics.setColor(0.2, 0.2, 0.2, 1) love.graphics.rectangle("fill", x0, y + 1, w, 6) - love.graphics.setColor(1, 1, 1, 1) end + love.graphics.setColor(1, 1, 1, 1) end function TradeAnim:drawMonInfo(mon, ot, otId, boxTy) - -- Trade_PrintPlayerMonInfoText: rows +0/+2/+4/+6 from the box top; the - -- No. line replaces part of the top border (hlcoord 5, 0 in trade2.asm) Font.drawBox(4, boxTy, 12, 8) local y0 = boxTy * 8 local no = ("No.%03d"):format(dexOf(self.game, mon)) @@ -368,16 +735,6 @@ function TradeAnim:drawMonInfo(mon, ot, otId, boxTy) love.graphics.setColor(1, 1, 1, 1) end --- Trade_WriteCircledMonOAM: the mon crosses the cable as its party-menu --- sprite (wMonPartySpriteSpecies -> WriteMonPartySpriteOAMBySpecies), not as --- its battle pic, and Trade_AnimCircledMon flips both it and the ring to --- their second frame every step. The ring is four OAM blocks -- --- Trade_CircleOAMBlocks .OAMBlock0-3 at (8,8) (24,8) (8,24) (24,24) with the --- X/Y flips -- so the 16x32 bubble sheet holds one quadrant per frame and the --- circle it makes is 32x32 around the 16x16 icon. The icon rides OAM --- block 0 and the circle blocks 1-4 (Trade_WriteCircleOAMBlock counts a up --- from 1), and the lower OAM index wins overlap on DMG, so the icon draws --- on top of the circle's filled interior. #750 function TradeAnim:drawIconInBubble(mon, x, y) if self.img.bubble then if not self.bubbleQuad then @@ -415,11 +772,14 @@ function TradeAnim:drawGameBoy(x, y) end function TradeAnim:drawLeftGB() - -- cable from GB to the right edge + if self.cableFlash then + love.graphics.setColor(0.65, 0.65, 0.65, 1) + end if self.img.cableConn then love.graphics.draw(self.img.cableConn, 88, 32) end - drawCableHoriz(self, 32, 96, 160) + love.graphics.setColor(1, 1, 1, 1) + drawCableHoriz(self, 32, 96, 256) self:drawGameBoy(40, 24) Font.drawBox(4, 12, 9, 4) love.graphics.setColor(0, 0, 0, 1) @@ -429,6 +789,9 @@ end function TradeAnim:drawRightGB() drawCableHoriz(self, 32, 0, 112) + if self.cableFlash then + love.graphics.setColor(0.65, 0.65, 0.65, 1) + end if self.img.cableCorner then love.graphics.draw(self.img.cableCorner, 112, 32) end if self.img.cableVert then for i = 1, 4 do @@ -437,6 +800,7 @@ function TradeAnim:drawRightGB() end if self.img.cableEnd then love.graphics.draw(self.img.cableEnd, 112, 72) end if self.img.cableConn then love.graphics.draw(self.img.cableConn, 104, 72) end + love.graphics.setColor(1, 1, 1, 1) self:drawGameBoy(56, 64) Font.drawBox(6, 0, 9, 4) love.graphics.setColor(0, 0, 0, 1) @@ -444,6 +808,24 @@ function TradeAnim:drawRightGB() love.graphics.setColor(1, 1, 1, 1) end +function TradeAnim:drawDialog() + if not self.dialogText then return end + love.graphics.push() + if self.slidingBox then + love.graphics.translate(self.wx, 0) + end + Font.drawBox(0, 12, 20, 6) + love.graphics.setColor(0, 0, 0, 1) + local lines = {} + for line in self.dialogText:gmatch("[^\n]+") do + lines[#lines + 1] = line + end + if lines[1] then Font.draw(lines[1], 8, 112) end + if lines[2] then Font.draw(lines[2], 8, 128) end + love.graphics.setColor(1, 1, 1, 1) + love.graphics.pop() +end + function TradeAnim:draw() love.graphics.setColor(1, 1, 1, 1) love.graphics.rectangle("fill", 0, 0, 160, 144) @@ -452,10 +834,7 @@ function TradeAnim:draw() if p == "show_player" then love.graphics.push() love.graphics.translate(-self.scx, 0) - -- mon pic on the BG at hlcoord 7, 2; info box on the window at - -- hWY $50, so it sits in the bottom half of the screen if self.monVisible and self.sentSprite then - -- engine/movie/trade.asm:751 love.graphics.draw(self.sentSprite, 56 + self.sentSprite:getWidth(), 16, 0, -1, 1) if self.sentSpriteTrueColor then require("src.render.PaletteFX").markTrueColor( @@ -464,64 +843,79 @@ function TradeAnim:draw() end self:drawMonInfo(self.sent, self.playerOt, self.playerOtId, 10) love.graphics.pop() - if self.poof and self.poof > 0 then - love.graphics.setColor(0, 0, 0, self.poof / 16) - love.graphics.circle("fill", 80, 40, 20 - (self.poof or 0)) - love.graphics.setColor(1, 1, 1, 1) + + if self.activePoofBlock then + self:drawFrameBlock(self.activePoofBlock, self.activePoofX, self.activePoofY) + end + if self.activeBallBlock then + self:drawFrameBlock(self.activeBallBlock, self.activeBallX, self.activeBallY) end elseif p == "open_cable" or p == "open_cable2" then love.graphics.push() love.graphics.translate(self.scx, 0) if self.img.openCable then - love.graphics.draw(self.img.openCable, 64, 16) -- open end at SCX $f0 + love.graphics.draw(self.img.openCable, 64, 16) end love.graphics.pop() + if p == "open_cable" and self.activeBallBlock then + self:drawFrameBlock(self.activeBallBlock, self.activeBallX, self.activeBallY) + end elseif p == "ball_enter" then if self.img.openCable then love.graphics.draw(self.img.openCable, 64, 16) end - -- OAM coords carry a (+8, +16) hardware offset - local ball = self.flash and (self.img.cableBallAlt or self.img.cableBall) - or self.img.cableBall - if ball then - love.graphics.draw(ball, self.ballX - 8, self.ballY - 16) - else - love.graphics.setColor(0, 0, 0, 1) - love.graphics.circle("fill", self.ballX, self.ballY - 8, 6) - love.graphics.setColor(1, 1, 1, 1) + if self.activeBallBlock then + self:drawFrameBlock(self.activeBallBlock, self.activeBallX, self.activeBallY) + elseif self.sub == "suction" or self.sub == "exit_pause" then + local ball = self.flash and (self.img.cableBallAlt or self.img.cableBall) + or self.img.cableBall + if ball then + love.graphics.draw(ball, self.ballX - 8, self.ballY - 16) + else + love.graphics.setColor(0, 0, 0, 1) + love.graphics.circle("fill", self.ballX, self.ballY - 8, 6) + love.graphics.setColor(1, 1, 1, 1) + end end elseif p == "transfer_lr" or p == "transfer_rl" then - -- two-screen world: left GB scene at x0, right GB scene at x160; - -- the mon icon stays in screen space like the OAM sprite it ports love.graphics.push() love.graphics.translate(-self.scx, 0) self:drawLeftGB() - love.graphics.translate(160, 0) + love.graphics.translate(256, 0) self:drawRightGB() love.graphics.pop() local mon = p == "transfer_lr" and self.sent or self.received self:drawIconInBubble(mon, self.monX, self.monY) - if self.cableFlash then - love.graphics.setColor(1, 1, 1, 0.15) - love.graphics.rectangle("fill", 0, 32, 160, 8) - love.graphics.setColor(1, 1, 1, 1) - end elseif p == "show_enemy" then + if self.cableSlideOut and self.img.openCable then + love.graphics.push() + love.graphics.translate(self.cableSlideOut, 0) + love.graphics.draw(self.img.openCable, 64, 16) + love.graphics.pop() + end if self.monVisible and self.recvSprite then - -- engine/movie/trade.asm:751 love.graphics.draw(self.recvSprite, 56 + self.recvSprite:getWidth(), 16, 0, -1, 1) if self.recvSpriteTrueColor then require("src.render.PaletteFX").markTrueColor( 56, 16, self.recvSprite:getDimensions()) end end - self:drawMonInfo(self.received, self.enemyName, self.enemyOtId, 10) + if self.monVisible and self.sub ~= "take_care" and self.sub ~= "delay_end" then + self:drawMonInfo(self.received, self.enemyName, self.enemyOtId, 10) + end + if self.activeBallBlock then + self:drawFrameBlock(self.activeBallBlock, self.activeBallX, self.activeBallY) + end + if self.activePoofBlock then + self:drawFrameBlock(self.activePoofBlock, self.activePoofX, self.activePoofY) + end end - -- went_to / for_sends / farewell / delay: cleared window; TextBox draws + + self:drawDialog() end return TradeAnim diff --git a/src/ui/gen2/MagnetTrainRide.lua b/src/ui/gen2/MagnetTrainRide.lua index dc920687..5a3f6a0f 100644 --- a/src/ui/gen2/MagnetTrainRide.lua +++ b/src/ui/gen2/MagnetTrainRide.lua @@ -22,12 +22,14 @@ -- PAL_BG_YELLOW, out of a TOWN palette set at the current time of day -- (the routine pushes wEnvironment, forces TOWN, and pops it back). -- --- Two hardware details are not reproduced. The four player OBJs all carry --- OAM_PRIO, so on the cart they sit behind background colours 1-3 and only --- show through the window's colour 0; here they are drawn straight over the --- background, which looks the same everywhere the window is transparent and --- differs only if the sprite drifts over solid train tiles. And the ride --- cannot be skipped, exactly as on the cart: the loop reads no input at all. +-- Two hardware details from the cart are faithfully reproduced: +-- 1. Viewport wrapping: the 256x144 background scrolls in 3 LY override bands, +-- wrapped strictly within the 160x144 GB screen so pixels do not bleed into +-- the widescreen surround. +-- 2. OAM Priority (OAM_PRIO): the four player OBJs sit behind background +-- colours 1-3 and only show through the window's colour 0. This is drawn +-- via a base background pass, the player sprite, and an overlay pass where +-- shade 0 is transparent and solid train tiles mask the sprite. local Assets = require("src.render.Assets") local Chrome = require("src.ui.gen2.Chrome") @@ -46,6 +48,30 @@ local BG_W = 256 -- TILEMAP_WIDTH * 8 local TILES_PER_ROW = 16 -- every 2bpp sheet the importer writes local BLACK = { 0, 0, 0 } +-- Overlay shader for OAM_PRIO: shade 0 is transparent; shades 1-3 are solid +-- palette colors, masking any sprites beneath solid background tiles. +local OVERLAY_SHADER_SOURCE = [[ +extern vec3 pal0; +extern vec3 pal1; +extern vec3 pal2; +extern vec3 pal3; + +vec4 effect(vec4 tint, Image tex, vec2 uv, vec2 screen) { + vec4 px = Texel(tex, uv); + float shade = floor((1.0 - px.r) * 3.0 + 0.5); + vec3 rgb = pal0; + if (shade > 2.5) { + rgb = pal3; + } else if (shade > 1.5) { + rgb = pal2; + } else if (shade > 0.5) { + rgb = pal1; + } + float alpha = shade < 0.5 ? 0.0 : px.a; + return vec4(rgb, alpha) * tint; +} +]] + function MagnetTrainRide:wantsFillScale() return true end -- opts: toGoldenrod (the wScriptVar the officer's script set), onDone() @@ -97,7 +123,7 @@ function MagnetTrainRide:palette(slot) end -------------------------------------------------------------------------- --- Sheets +-- Sheets & Shaders -------------------------------------------------------------------------- local function sheetFor(path) @@ -159,22 +185,66 @@ function MagnetTrainRide:playerQuad(vtile) return quad end +function MagnetTrainRide:overlayShader() + if self.ovShader ~= nil then return self.ovShader or nil end + if not (love and love.graphics and love.graphics.newShader) then + self.ovShader = false + return nil + end + local ok, result = pcall(love.graphics.newShader, OVERLAY_SHADER_SOURCE) + self.ovShader = ok and result or false + return self.ovShader or nil +end + +local function palChannel(colors, index) + local c = colors and colors[index] + if not c then return 0, 0, 0 end + return (c[1] or 0) / 255, (c[2] or 0) / 255, (c[3] or 0) / 255 +end + +function MagnetTrainRide:useOverlayShader(colors) + local sh = self:overlayShader() + if not sh then return false end + local resolved = GbcPalette.resolve(colors) + for i = 0, 3 do + local u = "pal" .. i + if sh:hasUniform(u) then + local r, g, b = palChannel(resolved, i + 1) + sh:send(u, { r, g, b }) + end + end + love.graphics.setShader(sh) + return true +end + + -------------------------------------------------------------------------- --- The baked background +-- The baked backgrounds (Base + OAM_PRIO Overlay) -------------------------------------------------------------------------- --- DrawMagnetTrain plus SetMagnetTrainPals, rendered once into a 256x144 --- canvas. Tiles are drawn palette group by palette group so the three --- palettes cost three shader switches rather than one per tile. -function MagnetTrainRide:background() - if self.bgCanvas ~= nil then return self.bgCanvas or nil end +-- DrawMagnetTrain plus SetMagnetTrainPals, rendered once into 256x144 canvases. +-- Base canvas contains the full opaque background; Overlay canvas contains +-- solid shades 1-3 with shade 0 transparent for OAM_PRIO window masking. +function MagnetTrainRide:backgrounds() + if self.bgCanvas ~= nil then + return self.bgCanvas or nil, self.bgOverlayCanvas or nil + end self.bgCanvas = false + self.bgOverlayCanvas = false local rows = self.ride:tilemap() local sheet = self:tileSheet() - if not (rows and sheet) then return nil end - local ok, canvas = pcall(love.graphics.newCanvas, BG_W, SCREEN_H) - if not ok then return nil end - canvas:setFilter("nearest", "nearest") + if not (rows and sheet) then return nil, nil end + + local ok1, baseCanvas = pcall(love.graphics.newCanvas, BG_W, SCREEN_H) + if not ok1 then return nil, nil end + baseCanvas:setFilter("nearest", "nearest") + + local ok2, overlayCanvas = pcall(love.graphics.newCanvas, BG_W, SCREEN_H) + if ok2 and overlayCanvas then + overlayCanvas:setFilter("nearest", "nearest") + else + overlayCanvas = nil + end local groups = {} for row = 1, #rows do @@ -188,11 +258,12 @@ function MagnetTrainRide:background() local G = love.graphics local previous = G.getCanvas() - -- A canvas does not reset the transform: without this the map lands under - -- the renderer's letterbox scale and off the edge. - G.push() + G.push("all") G.origin() - G.setCanvas(canvas) + G.setScissor() + + -- 1. Base background canvas (shades 0-3) + G.setCanvas(baseCanvas) G.clear(0, 0, 0, 1) G.setColor(1, 1, 1, 1) local shader = GbcPalette.available() @@ -205,10 +276,35 @@ function MagnetTrainRide:background() end end if shader then GbcPalette.clear() end + + -- 2. Overlay canvas for OAM_PRIO (shades 1-3 solid, shade 0 transparent) + if overlayCanvas then + G.setCanvas(overlayCanvas) + G.clear(0, 0, 0, 0) + G.setColor(1, 1, 1, 1) + local ovShader = self:overlayShader() + for slot, list in pairs(groups) do + local colors = self:palette(slot) + if ovShader and colors then self:useOverlayShader(colors) end + for _, cell in ipairs(list) do + local quad = sheet.quads[cell[1]] + if quad then G.draw(sheet.image, quad, cell[2], cell[3]) end + end + end + if ovShader then G.setShader() end + end + G.setCanvas(previous) G.pop() - self.bgCanvas = canvas - return canvas + + self.bgCanvas = baseCanvas + self.bgOverlayCanvas = overlayCanvas + return baseCanvas, overlayCanvas +end + +function MagnetTrainRide:background() + local base = self:backgrounds() + return base end -------------------------------------------------------------------------- @@ -240,19 +336,24 @@ function MagnetTrainRide:update(_dt) end end -function MagnetTrainRide:drawBackground() - local canvas = self:background() +-- Draws the 3 LY override bands strictly wrapped inside the 160px GB screen. +function MagnetTrainRide:drawBands(canvas) if not canvas then return end local G = love.graphics G.setColor(1, 1, 1, 1) self.bandQuad = self.bandQuad - or love.graphics.newQuad(0, 0, BG_W, 1, BG_W, SCREEN_H) + or love.graphics.newQuad(0, 0, SCREEN_W, 1, BG_W, SCREEN_H) for _, band in ipairs(self.ride:bands()) do local top, bottom, scx = band[1], band[2], band[3] % BG_W local height = bottom - top + 1 - self.bandQuad:setViewport(0, top, BG_W, height, BG_W, SCREEN_H) - G.draw(canvas, self.bandQuad, -scx, top) - G.draw(canvas, self.bandQuad, -scx + BG_W, top) + local w1 = math.min(SCREEN_W, BG_W - scx) + self.bandQuad:setViewport(scx, top, w1, height, BG_W, SCREEN_H) + G.draw(canvas, self.bandQuad, 0, top) + if w1 < SCREEN_W then + local w2 = SCREEN_W - w1 + self.bandQuad:setViewport(0, top, w2, height, BG_W, SCREEN_H) + G.draw(canvas, self.bandQuad, w1, top) + end end end @@ -277,16 +378,19 @@ function MagnetTrainRide:drawPlayer() if colors then GbcPalette.use(colors) end G.setColor(1, 1, 1, 1) for _, entry in ipairs(oam) do - local quad = self:playerQuad(entry.tile) - if quad then - G.draw(sheet.image, quad, - entry.x + (entry.xflip and 8 or 0), entry.y, 0, - entry.xflip and -1 or 1, 1) + if entry.x >= -8 and entry.x < SCREEN_W and entry.y >= -16 and entry.y < SCREEN_H then + local quad = self:playerQuad(entry.tile) + if quad then + G.draw(sheet.image, quad, + entry.x + (entry.xflip and 8 or 0), entry.y, 0, + entry.xflip and -1 or 1, 1) + end end end if colors then GbcPalette.clear() end end + -- The backdrop is BG colour 0 of the gray palette the train body uses; on the -- cart it is what shows wherever nothing was drawn. function MagnetTrainRide:backdrop() @@ -299,13 +403,24 @@ function MagnetTrainRide:drawPanel() G.setColor(backdrop[1] / 255, backdrop[2] / 255, backdrop[3] / 255, 1) G.rectangle("fill", 0, 0, SCREEN_W, SCREEN_H) G.setColor(1, 1, 1, 1) - self:drawBackground() + + local base, overlay = self:backgrounds() + -- 1. Base background (bushes, train body, window aperture) + self:drawBands(base) + -- 2. Player sprite (OAM_PRIO: sits behind train body, visible through window) self:drawPlayer() + -- 3. Train body / frame overlay (colors 1-3 mask sprite; color 0 is transparent) + self:drawBands(overlay) + G.setColor(1, 1, 1, 1) end function MagnetTrainRide:draw() + local G = love.graphics + G.push("all") + G.setScissor(0, 0, SCREEN_W, SCREEN_H) self:drawPanel() + G.pop() end -- MagnetTrain_LoadGFX_PlayMusic opens on ClearBGPalettes / ClearSprites @@ -323,7 +438,8 @@ function MagnetTrainRide:drawWidescreen(winW, winH) G.setColor(1, 1, 1, 1) local scale = Chrome.fitScale(winW, winH) local ox, oy = Chrome.fitOrigin(winW, winH, scale) - G.push() + G.push("all") + G.setScissor(ox, oy, SCREEN_W * scale, SCREEN_H * scale) G.translate(ox, oy) G.scale(scale, scale) self:drawPanel() @@ -331,3 +447,6 @@ function MagnetTrainRide:drawWidescreen(winW, winH) end return MagnetTrainRide + + + diff --git a/tests/engine/android_exit_to_launcher_test.lua b/tests/engine/android_exit_to_launcher_test.lua index 247366d5..64ae7165 100644 --- a/tests/engine/android_exit_to_launcher_test.lua +++ b/tests/engine/android_exit_to_launcher_test.lua @@ -77,4 +77,26 @@ do check(Runtime.modRequire == nil, "Runtime.reset clears modRequire") end +-- 4. returnToLauncher / closeEditor also clear Assets.loader (orphaned Loader) +do + local Assets = require("src.render.Assets") + Assets.installLoader({ + overrideOrder = function() return { { id = "x", path = "mods/x" } } end, + derivedPath = function() return nil end, + }) + check(Assets.loader ~= nil, "Assets.loader installed for the session") + Assets.installLoader(nil) + check(Assets.loader == nil, "session teardown clears Assets.loader") +end + +-- 5. Gen1 Game:reset exists so main.lua need not guess field names +do + local Game = require("src.core.Game") + check(type(Game.reset) == "function", "Game:reset is defined for in-process return") + Game.mods = { stale = true } + Game:reset() + check(Game.mods == nil, "Game:reset clears session fields") + check(type(Game.load) == "function", "Game:reset keeps methods") +end + T.finish("android_exit_to_launcher_test") diff --git a/tests/engine/cache_fs_red_migration_test.lua b/tests/engine/cache_fs_red_migration_test.lua index 7ab2cd2b..cea34cca 100644 --- a/tests/engine/cache_fs_red_migration_test.lua +++ b/tests/engine/cache_fs_red_migration_test.lua @@ -57,6 +57,36 @@ eq(love.filesystem.read("assets/generated/fonts/font.png"), "font-bytes", eq(love.filesystem.read("data/generated/constants.lua"), "return {}", "post-mount probe reads red data at the un-prefixed path") +-- unmountVersion peels generated overlays (LIFO) then the version folder, so +-- a later Play/Edit on another game cannot resolve this version's files. +do + local mounts = love.filesystem._mounts + local archives = {} + for _, m in ipairs(mounts) do archives[#archives + 1] = m.archive end + local function indexOf(name) + for i, a in ipairs(archives) do if a == name then return i end end + end + local dataIdx = indexOf("red/data/generated") + local assetsIdx = indexOf("red/assets/generated") + check(dataIdx and assetsIdx, "mountVersion recorded generated-tree overlays") + check(assetsIdx > dataIdx, + "assets/generated was mounted after data/generated (LIFO unmount peels it first)") +end +check(CacheFs.unmountVersion("red") == true, "unmountVersion(red) returns true") +check(love.filesystem.read("assets/generated/fonts/font.png") == nil, + "post-unmount probe no longer sees red assets at the un-prefixed path") +check(love.filesystem.read("data/generated/constants.lua") == nil, + "post-unmount probe no longer sees red data at the un-prefixed path") +do + local left = {} + for _, m in ipairs(love.filesystem._mounts) do + if tostring(m.archive):find("red", 1, true) then + left[#left + 1] = m.archive + end + end + eq(#left, 0, "no red/ mounts remain after unmountVersion") +end + -- no legacy cache at all: migration is a no-op, not an error love.filesystem.remove("red/rom-cache.complete") love.filesystem.remove("red/data/generated/maps.lua") diff --git a/tests/engine/launcher_session_teardown_test.lua b/tests/engine/launcher_session_teardown_test.lua new file mode 100644 index 00000000..6ceee3e2 --- /dev/null +++ b/tests/engine/launcher_session_teardown_test.lua @@ -0,0 +1,111 @@ +-- In-process launcher session teardown: Game:reset, Renderer canvas release, +-- Runtime/Assets/LegacyCompat cleanup, and editor package.loaded discovery flush. +-- luajit tests/engine/launcher_session_teardown_test.lua + +package.path = "./?.lua;./?/init.lua;" .. package.path +love = love or require("tests.love_stub") + +local T = require("tests.harness") +local check, eq = T.check, T.eq + +local Runtime = require("src.mods.Runtime") +local Assets = require("src.render.Assets") +local LegacyCompat = require("src.mods.LegacyCompat") +local Game = require("src.core.Game") +local Renderer = require("src.render.Renderer") +local StateStack = require("src.core.StateStack") + +-- ---- Game:reset drops instance state, keeps methods ---------------------- +do + StateStack:init() + StateStack:push({ name = "stale" }) + Game.mods = { id = "orphan" } + Game.save = { money = 1 } + Game.network = { live = true } -- future field: must not need a whitelist + Game.stack = StateStack + Game.renderer = Renderer + Renderer.canvas = love.graphics.newCanvas(8, 8) + + Game:reset() + + check(type(Game.load) == "function", "Game:reset keeps methods") + check(type(Game.reset) == "function", "Game:reset keeps itself") + check(Game.mods == nil, "Game:reset clears mods") + check(Game.save == nil, "Game:reset clears save") + check(Game.network == nil, "Game:reset clears arbitrary future fields") + check(Game.stack == nil, "Game:reset clears stack reference") + check(Game.renderer == nil, "Game:reset clears renderer reference") + check(StateStack:top() == nil, "Game:reset cleared the shared StateStack") +end + +-- ---- Renderer:init releases prior canvases before realloc ---------------- +do + local first = love.graphics.newCanvas(16, 16) + Renderer.canvas = first + Renderer.battleHUDCanvas = love.graphics.newCanvas(16, 16) + Renderer.worldCanvas = love.graphics.newCanvas(16, 16) + Renderer.uprightCanvas = love.graphics.newCanvas(16, 16) + Renderer:init() + check(first.released == true, + "Renderer:init Object:release()s the previous primary canvas") + check(Renderer.canvas ~= nil and Renderer.canvas ~= first, + "Renderer:init allocates a fresh primary canvas") + check(Renderer.canvas.released ~= true, + "the new primary canvas is not released") + -- second init also releases the one just created + local second = Renderer.canvas + Renderer:init() + check(second.released == true, + "a second Renderer:init releases the canvas from the prior init") +end + +-- ---- Shared singleton teardown contract (closeEditor / returnToLauncher) +do + Runtime.install({ emit = function() end }, { call = function() end }, { "e" }) + Assets.installLoader({ + overrideOrder = function() return {} end, + derivedPath = function() return nil end, + }) + LegacyCompat.reports = { some_mod = { order = {} } } + + -- Mirrors main.lua teardownMountedSession without mounting CacheFs. + require("src.core.Data"):unloadGenerated() + Runtime.reset() + Assets.installLoader(nil) + LegacyCompat.reset() + + check(Runtime.errors == nil, "teardown clears Runtime.errors") + check(Assets.loader == nil, "teardown clears Assets.loader") + eq(next(LegacyCompat.reports), nil, "teardown clears LegacyCompat.reports") +end + +-- ---- Editor package.loaded discovery flush (no panel whitelist) --------- +do + love.filesystem.write("tools/save-editor/App.lua", "return {}") + love.filesystem.write("tools/save-editor/panels/NewPanel.lua", "return {}") + package.loaded["App"] = { stale = true } + package.loaded["NewPanel"] = { stale = true } + package.loaded["src.core.Data"] = package.loaded["src.core.Data"] -- keep + + local function isEditorFlat(name) + if name:find("[./]") then return false end + return love.filesystem.getInfo("tools/save-editor/" .. name .. ".lua") ~= nil + or love.filesystem.getInfo("tools/save-editor/panels/" .. name .. ".lua") ~= nil + end + for k in pairs(package.loaded) do + if type(k) == "string" + and (k:find("save%-editor", 1, false) or isEditorFlat(k)) then + package.loaded[k] = nil + end + end + + check(package.loaded["App"] == nil, "discovery flush drops flat App") + check(package.loaded["NewPanel"] == nil, + "discovery flush drops a new panel without a hardcoded list") + check(package.loaded["src.core.Data"] ~= nil, + "discovery flush leaves engine modules alone") + love.filesystem.remove("tools/save-editor/App.lua") + love.filesystem.remove("tools/save-editor/panels/NewPanel.lua") +end + +T.finish("launcher_session_teardown_test") diff --git a/tests/gen2_magnet_train_test.lua b/tests/gen2_magnet_train_test.lua index 4e70649d..0b3c7ecd 100644 --- a/tests/gen2_magnet_train_test.lua +++ b/tests/gen2_magnet_train_test.lua @@ -266,6 +266,18 @@ do "and with no hook at all the special is a no-op, not a clobber") end +-- ---- MagnetTrainRide UI screen -------------------------------------------- +do + local MagnetTrainRide = require("src.ui.gen2.MagnetTrainRide") + check(MagnetTrainRide.isOpaque, "MagnetTrainRide is opaque") + local ride = MagnetTrainRide.new(nil, { toGoldenrod = false }) + check(ride:wantsFillScale(), "wantsFillScale returns true") + check(ride:drawsWidescreen(), "drawsWidescreen returns true") + check(type(ride.drawBands) == "function", "drawBands exists") + check(type(ride.backgrounds) == "function", "backgrounds exists for OAM_PRIO") +end + + -- ---- the arrival, from `warpcheck` to the officer's line ------------------- -- -- The ride is only half the feature: the two station scripts end diff --git a/tests/love_stub.lua b/tests/love_stub.lua index 0e35f8af..28ad9244 100644 --- a/tests/love_stub.lua +++ b/tests/love_stub.lua @@ -56,7 +56,9 @@ stub.graphics = { end, newQuad = function(x, y, w, h) return { x = x, y = y, w = w, h = h } end, newCanvas = function(w, h) - return setmetatable({ w = w, h = h, setFilter = noop }, Image) + local canvas = setmetatable({ w = w, h = h, setFilter = noop, released = false }, Image) + function canvas:release() self.released = true end + return canvas end, newSpriteBatch = function(image, size) local batch = { image = image, sprites = {} } diff --git a/tests/save_editor_mod_tests.lua b/tests/save_editor_mod_tests.lua index 1fac297f..9fccce8d 100644 --- a/tests/save_editor_mod_tests.lua +++ b/tests/save_editor_mod_tests.lua @@ -143,6 +143,28 @@ local ok, err = pcall(function() check(#report.lostMons == 0 and probe.party[1].species == "EDITMON", "validate keeps the modded mon while the mod is enabled") + -- Second editor session in the same process (launcher Close → Edit again): + -- host teardown must leave Runtime/Assets clean and Data unloaded so the + -- next App.load remounts mods instead of serving vanilla catalogs. + App.unload() + if Data._pristineKeys or Data.pokemon then Data:unloadGenerated() end + Runtime.reset() + Assets.installLoader(nil) + package.loaded["App"] = nil + package.loaded["Catalog"] = nil + App = require("App") + App.load(tmpPath) + S = App.getState() + loaded = S.mods:status().loaded + check(#loaded == 1 and loaded[1].id == "zz_editor_fixture", + "fixture mod loads again after host-style teardown") + hasSpecies = false + for _, id in ipairs(S.cat.species) do + if id == "EDITMON" then hasSpecies = true end + end + check(hasSpecies, "second App.load catalog still carries the mod's mon") + check(Data.pokemon.EDITMON ~= nil, "second merge lands EDITMON in Data again") + -- Gold-targeted mods: spa/spd records are usable, and a Gen 1-only -- manifest stays out of Gold (no ROM cache / App.load("gold") required). local ModTargets = require("src.mods.ModTargets") diff --git a/tests/yellow_title_palette_test.lua b/tests/yellow_title_palette_test.lua new file mode 100644 index 00000000..33c5d0db --- /dev/null +++ b/tests/yellow_title_palette_test.lua @@ -0,0 +1,48 @@ +package.path = "./?.lua;./?/init.lua;" .. package.path +local S = require("tests.harness").suite("yellow title palette") +local check, eq = S.check, S.eq + +local GameVersion = require("src.core.GameVersion") +local PaletteFX = require("src.render.PaletteFX") +local TitleState = require("src.ui.TitleState") + +GameVersion.set("yellow") +local prevMode = PaletteFX.mode + +-- Test 1: SGB mode +PaletteFX.setMode("gbc") +local mewmonSgb = PaletteFX.pal(nil, "MEWMON") +check(mewmonSgb ~= nil, "MEWMON palette exists in SGB mode on Yellow") +-- In Yellow SGB SuperPalettes: MEWMON color 1 is Yellow {255, 247, 181}, color 2 is Red {222, 132, 132} +eq(mewmonSgb[1][1], 255, "SGB: Color 0 is white R=255") +eq(mewmonSgb[2][1], 255, "SGB: Color 1 is yellow R=255") +eq(mewmonSgb[3][1], 222, "SGB: Color 2 is red R=222") + +-- Test 2: ADVANCED mode (redpp) +PaletteFX.setMode("redpp") +local mewmonAdv = PaletteFX.pal(nil, "MEWMON") +check(mewmonAdv ~= nil, "MEWMON palette exists in ADVANCED mode on Yellow") +-- Must NOT be Red++'s Mew purple {115, 33, 165}! It must be Yellow's Pikachu palette! +eq(mewmonAdv[1][1], 255, "ADVANCED: Color 0 is white R=255 (Pikachu eye sclera)") +eq(mewmonAdv[2][1], 255, "ADVANCED: Color 1 is yellow R=255 (Pikachu body)") +check(mewmonAdv[3][3] < 150, "ADVANCED: Color 2 is not purple (B < 150, red cheeks)") + +-- Test 3: OG YELLOW mode (ogred on Yellow) +PaletteFX.setMode("ogred") +local mewmonOg = PaletteFX.pal(nil, "MEWMON") +check(mewmonOg ~= nil, "MEWMON palette exists in OG YELLOW mode") +eq(mewmonOg[1][1], 255, "OG YELLOW: Color 0 is white") +eq(mewmonOg[2][1], 255, "OG YELLOW: Color 1 is yellow") + +-- Test 4: TitleState sgbPalettes +local fakeGame = { data = { palettes = PaletteFX.yellowPack() } } +local ts = { yellowLayout = true } +local zones = TitleState.sgbPalettes(ts, fakeGame) +check(zones ~= nil and #zones >= 3, "TitleState produces zones for Yellow") +eq(zones[1].colors, PaletteFX.pal(fakeGame.data, "LOGO2"), "Zone 1 uses LOGO2") +eq(zones[2].colors, PaletteFX.pal(fakeGame.data, "MEWMON"), "Zone 2 uses MEWMON (Pikachu yellow/red)") + +PaletteFX.setMode(prevMode) +GameVersion.set("red") + +S.finish()