Files
gen1recomp/src/import/gba/versions.lua
T
bryanthaboi d920f7acdb clean up
2026-09-22 17:05:12 -04:00

2491 lines
104 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- Known clean US FRLG dumps → extract pointers (ROM file offsets).
-- Baseline pointers are FireRed USA 1.0; select() applies the LeafGreen profile.
-- Both 1.1 revisions normalize to their own edition 1.0 before extraction.
local Versions = {}
Versions.ROM_SIZE = 16777216
-- v53: outdoor LAB continuity — shared Y cuts, frlg bias, mid cohere, MRF.
-- v67: extract-first MapEvents + script BFS (cache is script/event source of truth)
-- v68: native FRLG mid atlas + pret map palettes (demake 2bpp still stored)
-- Text charmap $F0=':' fix lives in text_ir.lua; re-run script extract to refresh
-- cached strings (live cache was patched in-place for the yen→colon bug).
-- v72: naming keyboard 1:1 — cursor 2×2 frames, cropped KB, CLEAR row text
-- v75: restore title_screen.png composite + press_start / copyright aliases
-- v76: intro movie layout — copyright crop, GF sprite coords, scene1 frames
-- v77: GF presents center fix, scene3 gengar/bg pal, copyright x=0 crop
-- v78: scene2 PLTT slot shift, scene1 128px frames, scene3 grass 64×32
-- v79: title flames 10-frame sheet; title screen on Bg+Oam compositor
-- v80: trainer tables + battle intro back pics / party summary bar
-- v85: dual-layer native atlas (under/over) for pret BG2 sprite cover
-- v86: battle_transition ROM gfx → pokemon/battle_transition/
-- v87: standard Lua array LZ77 decompression + robust chrome extraction for Android
-- v88: authentic 1:1 FRLG trainer card composite (BG0+BG2), badges & Red/Leaf trainer pic fix
-- v89: summary base tilemaps from ROM (fix magenta bg on Android), keypad icons extracted from ROM
-- v90: fanfare audio cues, emote cues (0x62-0x66), pause menu YES/NO exit & main menu launcher exit
-- v91: ROM-native Help topics, context lists, text and chrome.
-- v93: original furniture/sign scripts and metatile interaction behaviors.
-- v99: gEggMoves → pokemon/egg_moves.lua (hidden-mon egg moves were inert).
-- v100: location preview screens (sMapPreviewScreenData artwork) + ROM-derived
-- mapsec names and sDungeonInfo dungeon descriptions.
-- v111: hidden-item bitfield fix in extract_map_events (id % 256, qty % 128).
-- v112: deoxys_rock_fragments field effect — the Birth Island meteorite shatter
-- had no artwork, so the rock simply vanished instead of breaking apart.
-- Both branches had taken 111 for unrelated cache layouts, so this merge
-- moves the Deoxys artwork onto its own number instead of sharing one.
-- v113: script opcode layouts corrected against pret asm/macros/event.inc —
-- comparestat is {byte,word} (was {byte,half}), setptr / loadbytefromptr /
-- setptrbyte each carry a leading byte plus a word (were shorter). The
-- old sizes mis-decoded every instruction after one, so every cached
-- script is stale.
-- v114: pokemon/icons/412.rgba, the SPECIES_EGG menu icon — eggs were drawn
-- with the icon of the species they hatch into.
-- v115: LeafGreen profiles, edition-specific title assets and Deoxys stats.
Versions.CACHE_VERSION = 117
Versions.NATIVE_VERSION = 6
Versions.OW_VERSION = 3
Versions.ANIM_VERSION = 1
-- Audio pack (M4A banks / DirectSound samples / cries).
Versions.AUDIO_VERSION = 6
-- FireRed USA 1.0 (BPRE) — located by structural scan (entry0 ms=me=0, SE_SELECT ms=me=2).
Versions.AUDIO = {
song_table = 0x4A32CC, -- gSongTable file offset
song_count = 347, -- ids 0 .. MUS_TEACHY_TV_MENU (346)
cry_table = 0x48C914, -- gCryTable (ToneData × 388)
cry_count = 388,
}
-- game3 FieldView prefers pret 4bpp path when native cache is ready.
Versions.NATIVE_RENDER = true
Versions.OW_RENDER = true
Versions.TILESET_ANIM = true
--- GBA ROM pointer → file offset, or nil if not in ROM image.
function Versions.gbaToFile(addr)
addr = tonumber(addr)
if not addr or addr < 0x08000000 or addr >= 0x0A000000 then return nil end
return addr - 0x08000000
end
-- FireRed USA 1.0 overworld object graphics (pret pokefirered.sym).
Versions.OW_GFX_POINTERS = 0x39FDB0 -- gObjectEventGraphicsInfoPointers
Versions.OW_SPRITE_PALETTES = 0x3A5158 -- sObjectEventSpritePalettes
Versions.NUM_OBJ_EVENT_GFX = 152
-- pret OBJ_EVENT_GFX_RED / OBJ_EVENT_GFX_GREEN (Leaf)
Versions.OW_PLAYER_MALE = 0
Versions.OW_PLAYER_MALE_BIKE = 1
Versions.OW_PLAYER_MALE_SURF = 2
Versions.OW_PLAYER_MALE_FIELD_MOVE = 3
Versions.OW_PLAYER_MALE_FISH = 4
Versions.OW_PLAYER_FEMALE = 7
Versions.OW_PLAYER_FEMALE_BIKE = 8
Versions.OW_PLAYER_FEMALE_SURF = 9
Versions.OW_PLAYER_FEMALE_FIELD_MOVE = 10
Versions.OW_PLAYER_FEMALE_FISH = 11
-- FireRed USA 1.0 font (menu cursor = SelectorArrow2 / charmap ▶ = 0xEF).
Versions.FONT_LATIN_NORMAL = 0x1FF300 -- sFontNormalLatinGlyphs
Versions.FONT_LATIN_WIDTHS = 0x207300 -- sFontNormalLatinGlyphWidths
Versions.FONT_GLYPH_BYTES = 64 -- 0x20 u16s per latin glyph
Versions.MENU_CURSOR_GLYPH = 0xEF -- gText_SelectorArrow2
-- Pokémon species pack (names / icons / types / stats / abilities) — FireRed USA 1.0.
Versions.POKEMON_VERSION = 3
Versions.NUM_SPECIES = 412 -- SPECIES_NONE .. last (incl. egg/forms)
Versions.SPECIES_NAMES = 0x245EE0 -- gSpeciesNames
Versions.SPECIES_NAME_LENGTH = 11 -- 10 chars + 0xFF
Versions.SPECIES_INFO = 0x254784 -- gSpeciesInfo / BaseStats (28 bytes)
Versions.SPECIES_INFO_SIZE = 28
Versions.DEOXYS_BASE_STATS = 0x25E026 -- sDeoxysBaseStats, u16[6]
Versions.MON_ICON_TABLE = 0x3D37A0 -- gMonIconTable
Versions.MON_ICON_PAL_INDICES = 0x3D3E80 -- gMonIconPaletteIndices
Versions.MON_ICON_PALETTES = 0x3D3740 -- gMonIconPalettes (16 colors × N)
Versions.MON_ICON_PAL_COUNT = 6
Versions.MON_ICON_BYTES = 0x400 -- 32×64 4bpp (2 frames)
Versions.MON_ICON_W = 32
Versions.MON_ICON_H = 32 -- first frame only
-- sSpeciesToNationalPokedexNum[NUM_SPECIES-1]; SpeciesToNational uses [species-1].
Versions.SPECIES_TO_NATIONAL = 0x251FEE
-- gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH+1] (FireRed USA 1.0 file off).
Versions.ABILITY_NAMES = 0x24FC40
Versions.ABILITY_NAME_LENGTH = 12
Versions.ABILITIES_COUNT = 78
Versions.ABILITY_DESCRIPTIONS = 0x24FB08 -- gAbilityDescriptionPointers (78 pointers)
-- Moves / learnsets / evolutions / TMHM / dex (FireRed USA 1.0 file offsets).
Versions.MOVE_NAMES = 0x247094 -- gMoveNames
Versions.MOVE_NAME_LENGTH = 12 -- +1 EOS → 13-byte stride
Versions.MOVE_DESCRIPTIONS = 0x4886E8 -- gMoveDescriptionPointers (354 pointers)
Versions.LEVEL_UP_LEARNSETS = 0x25D7B4 -- gLevelUpLearnsets pointer table
-- gEggMoves (pokefirered/src/data/pokemon/egg_moves.h). Not a pointer table:
-- one flat u16 stream of `{ species + EGG_MOVES_SPECIES_OFFSET, move…, 0xFFFF }`
-- runs, each run ended by EGG_MOVES_TERMINATOR; the table simply stops after the
-- last run, so the following symbol's data ends the scan. Only species that
-- actually have an egg move appear, so it is sparse.
Versions.EGG_MOVES = 0x25EF0C -- gEggMoves (FireRed USA 1.0)
Versions.EGG_MOVES_SPECIES_OFFSET = 20000
Versions.EGG_MOVES_TERMINATOR = 0xFFFF
Versions.EGG_MOVES_MAX = 16 -- per species; the ROM's real max is 8
Versions.EVOLUTION_TABLE = 0x259754 -- gEvolutionTable
Versions.EVOS_PER_MON = 5
Versions.EVOLUTION_ENTRY_SIZE = 8 -- method,u16 param,u16 target,u16 pad
Versions.TMHM_LEARNSETS = 0x252BC8 -- sTMHMLearnsets (u32 lo + u32 hi)
Versions.TMHM_MOVES = 0x45A5A4 -- sTMHMMoves[58] u16
Versions.TMHM_COUNT = 58 -- 50 TM + 8 HM
Versions.POKEDEX_ENTRIES = 0x44E850 -- gPokedexEntries (national index)
Versions.POKEDEX_ENTRY_SIZE = 36
Versions.NATIONAL_DEX_COUNT = 386 -- Deoxys; entries are 0..386 inclusive → 387
Versions.SPECIES_TO_KANTO = 0x251EE0 -- sSpeciesToKantoPokedexNum (411 u16s)
Versions.DEX_CATEGORIES = 0x452C4C -- gDexCategories (9 categories)
Versions.EASY_CHAT_GROUPS = 0x3ECED4 -- sEasyChatGroups (22 entries × 8 bytes)
Versions.EASY_CHAT_GROUP_COUNT = 22
Versions.POKEDEX_ORDERS = {
alphabetical = 0x443FF2,
weight = 0x4442F6,
height = 0x4445FA,
type = 0x4448FE,
}
-- src/pokedex_screen.c:144
Versions.POKEDEX_BG_TILES = {
kanto = { gfx = 0x440274, pal = 0x4404C8 },
national = { gfx = 0x4403AC, pal = 0x4406E0 },
}
-- src/pokedex_screen.c:143
Versions.POKEDEX_CHROME_GFX = {
{ file = "mini_page.rgba", gfx = 0x440124, lz = true, w = 64, h = 40 },
{ file = "map_kanto.rgba", gfx = 0x443620, lz = true, w = 96, h = 72 },
{ file = "map_one_island.rgba", gfx = 0x443910, lz = true, w = 32, h = 24 },
{ file = "map_two_island.rgba", gfx = 0x443988, lz = true, w = 32, h = 24 },
{ file = "map_three_island.rgba", gfx = 0x4439FC, lz = true, w = 32, h = 24 },
{ file = "map_four_island.rgba", gfx = 0x443A78, lz = true, w = 32, h = 32 },
{ file = "map_five_island.rgba", gfx = 0x443AF8, lz = true, w = 32, h = 32 },
{ file = "map_six_island.rgba", gfx = 0x443BB0, lz = true, w = 32, h = 32 },
{ file = "map_seven_island.rgba", gfx = 0x443C54, lz = true, w = 32, h = 32 },
{ file = "caught_marker.rgba", gfx = 0x443600, w = 8, h = 8 },
{ file = "blit_wide_ellipse.rgba", gfx = 0x443D00, w = 88, h = 16 },
}
-- src/pokedex_screen.c:158
Versions.POKEDEX_CATEGORY_ICONS = {
{ file = "cat_icon_cave.rgba", gfx = 0x4408E0, pal = 0x443420 },
{ file = "cat_icon_urban.rgba", gfx = 0x440BD8, pal = 0x443440 },
{ file = "cat_icon_cancel.rgba", gfx = 0x440EF0, pal = 0x443460 },
{ file = "cat_icon_forest.rgba", gfx = 0x44112C, pal = 0x443480 },
{ file = "cat_icon_grassland.rgba", gfx = 0x4414BC, pal = 0x4434A0 },
{ file = "cat_icon_qmark.rgba", gfx = 0x441808, pal = 0x4434C0 },
{ file = "cat_icon_mountain.rgba", gfx = 0x441A40, pal = 0x4434E0 },
{ file = "cat_icon_rare.rgba", gfx = 0x441D54, pal = 0x443500 },
{ file = "cat_icon_sea.rgba", gfx = 0x442004, pal = 0x443520 },
{ file = "cat_icon_numerical.rgba", gfx = 0x44223C, pal = 0x443540 },
{ file = "cat_icon_rough_terrain.rgba", gfx = 0x4424E4, pal = 0x443560 },
{ file = "cat_icon_waters_edge.rgba", gfx = 0x442838, pal = 0x443580 },
{ file = "cat_icon_type.rgba", gfx = 0x442BC0, pal = 0x4435A0 },
{ file = "cat_icon_lightest.rgba", gfx = 0x442EF8, pal = 0x4435C0 },
{ file = "cat_icon_smallest.rgba", gfx = 0x44318C, pal = 0x4435E0 },
-- src/graphics.c:1211
{ file = "cat_icon_abc.rgba", gfx = 0xE9C16C, pal = 0xE9C14C },
}
Versions.POKEDEX_CATEGORY_ICON_W = 64
Versions.POKEDEX_CATEGORY_ICON_H = 48
-- src/pokedex_area_markers.c:39
Versions.POKEDEX_AREA_MARKER_GFX = 0x46343C
-- src/pokedex_area_markers.c:41
Versions.POKEDEX_AREA_MARKER_SHAPES = {
{ file = "marker_0.rgba", tile = 0, w = 8, h = 8 },
{ file = "marker_1.rgba", tile = 1, w = 16, h = 8 },
{ file = "marker_2.rgba", tile = 3, w = 8, h = 16 },
{ file = "marker_3.rgba", tile = 5, w = 32, h = 16 },
{ file = "marker_4.rgba", tile = 13, w = 16, h = 32 },
{ file = "marker_5.rgba", tile = 21, w = 32, h = 16 },
{ file = "marker_6.rgba", tile = 29, w = 16, h = 32 },
}
-- src/pokedex_screen.c:815
Versions.POKEDEX_SILHOUETTE_PAL = 0x452368
-- src/pokedex_area_markers.c:237
Versions.POKEDEX_MARKER_BLEND_TILE = 15
-- src/pokedex_area_markers.c:219
Versions.POKEDEX_MARKER_BLEND_EVA = 12
Versions.POKEDEX_MARKER_BLEND_EVB = 8
-- src/pokedex_area_markers.c:101
Versions.DEX_AREA_MARKERS = 0x463580
Versions.DEX_AREA_MARKER_ENTRY_SIZE = 4
Versions.DEX_AREA_COUNT = 80
-- src/pokemon_storage_system_data.c:51
-- src/pokemon_storage_system_tasks.c:169
-- src/pokemon_storage_system_graphics.c:79
-- src/graphics.c:1214
Versions.STORAGE_PALETTES = {
misc1 = 0x3D2BCC,
misc2 = 0x3CE7F0,
menu = 0x3CE5DC,
scrollingBg = 0x3CE738,
interface = 0xE9C3F8,
partyMenu = 0xE9C3D8,
interfaceNoMon = 0xE9C418,
}
-- src/pokemon_storage_system_tasks.c:219
Versions.STORAGE_BG1_BASE_TILE = 0x100
Versions.STORAGE_SHEETS = {
handCursor = { off = 0x3D2BEC, size = 2048 },
handCursorShadow = { off = 0x3D33EC, size = 128 },
boxScrollArrow = { off = 0x3D2AD0, size = 128 },
waveform = { off = 0x3CE810, size = 448 },
scrollingBg = { off = 0x3CE438, lz = true },
menu = { off = 0xE9C438, lz = true },
}
Versions.STORAGE_TILEMAPS = {
menu = { off = 0x3CE5FC, lz = true, w = 32, h = 20 },
pkmnData = { off = 0x3CE6F8, w = 8, h = 4 },
closeBoxButton = { off = 0x3CE778, w = 9, h = 4 },
partySlotFilled = { off = 0x3CE7C0, w = 4, h = 3 },
partySlotEmpty = { off = 0x3CE7D8, w = 4, h = 3 },
partyMenu = { off = 0xE9CAEC, lz = true, w = 12, h = 22 },
}
-- src/pokemon_storage_system_graphics.c:168
Versions.STORAGE_WALLPAPERS = 0x3D2A10
Versions.STORAGE_WALLPAPER_COUNT = 16
Versions.STORAGE_WALLPAPER_W = 20
Versions.STORAGE_WALLPAPER_H = 18
-- src/wild_pokemon_area.c:25
Versions.DEX_AREA_MAPSEC_TABLES = {
{ off = 0x464148, count = 55 },
{ off = 0x464224, count = 4 },
{ off = 0x464234, count = 2 },
{ off = 0x46423C, count = 5 },
{ off = 0x464250, count = 2 },
{ off = 0x464258, count = 7 },
{ off = 0x464274, count = 7 },
{ off = 0x464290, count = 11 },
}
-- Region map & location preview screens (pokefirered src/region_map.c,
-- src/map_preview_screen.c, include/map_preview_screen.h).
-- sMapPreviewScreenData[]: struct MapPreviewScreen { u8 mapsec; u8 type;
-- u16 flagId; const void *tilesptr; const void *tilemapptr; const void *palptr; }
Versions.MAP_PREVIEW_SCREEN_DATA = 0x43E9E8
Versions.MAP_PREVIEW_COUNT = 28
Versions.MAP_PREVIEW_ENTRY_SIZE = 16
Versions.MAP_PREVIEW_TYPE_CAVE = 0 -- MPS_TYPE_CAVE
Versions.MAP_PREVIEW_TYPE_FOREST = 1 -- MPS_TYPE_FOREST
-- CopyToBgTilemapBufferRect(2, tilemap, 0, 0, 32, 20) — 640 u16 = 1280 bytes.
Versions.MAP_PREVIEW_TILEMAP_W = 32
Versions.MAP_PREVIEW_TILEMAP_H = 20
-- Each entry's palptr holds 0x40 bytes (32 BGR555 colours = BG banks 13 and 14);
-- palptr + 0x40 == tilesptr for all 28 entries and tilesptr starts with its LZ77
-- header, so the palette cannot be longer. pret's MapPreview_LoadGfx asks for 3
-- banks (0x60 bytes) and so also copies that LZ77 header into bank 15, but no
-- tilemap entry in the visible area references bank 15.
Versions.MAP_PREVIEW_PALETTE_COUNT = 32
Versions.MAP_PREVIEW_PALETTE_BYTES = 0x40
Versions.MAP_PREVIEW_PALETTE_BANKS = 2
-- Tilemap entries reference banks 13 and 14 only across visible columns 0-29;
-- the sole bank-0 references sit in the off-screen padding columns 30-31.
Versions.MAP_PREVIEW_BANK_LO = 13
Versions.MAP_PREVIEW_BANK_HI = 14
-- sMapsecName_* — one 0xFF-terminated string per mapsec, ascending, contiguous.
Versions.MAPSEC_NAMES = 0x3EECFC
-- sRegionMapSectionIdToName[] — 109 pointers into the block above; usable as a
-- defensive cross-check (table[i] == offset of the i-th string).
Versions.MAPSEC_NAME_POINTERS = 0x3F1CAC
Versions.MAPSEC_FIRST = 88 -- MAPSEC_PALLET_TOWN
Versions.MAPSEC_LAST = 196 -- MAPSEC_SPECIAL_AREA
Versions.MAPSEC_COUNT = 109
-- sDungeonInfo[]: struct DungeonMapInfo { u32 id; const u8 *name; const u8 *desc; }
Versions.DUNGEON_INFO = 0x3F1B3C
Versions.DUNGEON_INFO_COUNT = 19
Versions.DUNGEON_INFO_ENTRY_SIZE = 12
-- Region map graphics & palettes (pokefirered src/region_map.c)
Versions.REGION_MAP_TOP_BAR_PAL = 0x3EF23C
Versions.REGION_MAP_CURSOR_PAL = 0x3EF25C
Versions.REGION_MAP_PLAYER_RED_PAL = 0x3EF27C
Versions.REGION_MAP_PLAYER_LEAF_PAL = 0x3EF29C
Versions.REGION_MAP_MISC_ICON_PAL = 0x3EF2BC
Versions.REGION_MAP_BG_PAL = 0x3EF2DC
Versions.REGION_MAP_SWITCH_CURSOR_PAL = 0x3EF384
Versions.REGION_MAP_EDGE_PAL = 0x3EF3A4
Versions.REGION_MAP_SWITCH_CURSOR_LEFT_GFX = 0x3EF3C4
Versions.REGION_MAP_SWITCH_CURSOR_RIGHT_GFX = 0x3EF450
Versions.REGION_MAP_CURSOR_GFX = 0x3EF4E0
Versions.REGION_MAP_PLAYER_RED_GFX = 0x3EF524
Versions.REGION_MAP_PLAYER_LEAF_GFX = 0x3EF59C
Versions.REGION_MAP_BG_GFX = 0x3EF61C
Versions.REGION_MAP_EDGE_GFX = 0x3F0330
Versions.REGION_MAP_SWITCH_MENU_GFX = 0x3F0580
Versions.REGION_MAP_KANTO_TILEMAP = 0x3F089C
Versions.REGION_MAP_SEVII123_TILEMAP = 0x3F0AFC
Versions.REGION_MAP_SEVII45_TILEMAP = 0x3F0C0C
Versions.REGION_MAP_SEVII67_TILEMAP = 0x3F0CF0
Versions.REGION_MAP_EDGE_TILEMAP = 0x3F0E0C
Versions.REGION_MAP_DUNGEON_ICON_GFX = 0x3F18D8
Versions.REGION_MAP_FLY_ICON_GFX = 0x3F1908
Versions.REGION_MAP_BG_SECONDARY_GFX = 0x3F1978
Versions.REGION_MAP_BG_SECONDARY_TILEMAP = 0x3F19A0
-- pokefirered/src/heal_location.c:28
Versions.S_HEAL_LOCATIONS = 0x3EEBF8
Versions.S_WHITEOUT_RESPAWN_MAP_IDXS = 0x3EEC98
Versions.S_WHITEOUT_RESPAWN_HEALER_NPC_IDS = 0x3EECE8
Versions.NUM_HEAL_LOCATIONS = 20
-- pokefirered/src/region_map.c:828
Versions.S_MAP_FLY_DESTINATIONS = 0x3F2EE0
Versions.NUM_MAP_FLY_DESTINATIONS = 108
-- Multichoice list table (FireRed USA 1.0). gMultichoiceLists (65 lists).
Versions.MULTICHOICE_LISTS = 0x3E04B0
Versions.MULTICHOICE_COUNT = 65
-- Items table (FireRed USA 1.0). 375 entries × 44 bytes stride.
Versions.ITEMS = 0x3DB028
Versions.ITEMS_COUNT = 375
Versions.ITEM_STRIDE = 44
-- Region map section names table (FireRed USA 1.0).
Versions.KANTO_MAPSEC_START = 88 -- 0x58 (MAPSEC_PALLET_TOWN)
Versions.KANTO_MAPSEC_COUNT = 109 -- 88..196 (MAPSEC_PALLET_TOWN .. MAPSEC_SPECIAL_AREA)
-- gBattleMoves (FireRed USA 1.0). Rows are 12 bytes (9-byte BattleMove + pad).
Versions.BATTLE_MOVES_VERSION = 1
Versions.BATTLE_MOVES = 0x250C04
Versions.BATTLE_MOVE_SIZE = 12
Versions.MOVES_COUNT = 355 -- MOVE_NONE .. last Gen3 move id inclusive span
-- Battle anim IR pack — ROM-native bytecode extraction (FireRed USA 1.0).
-- Addresses verified by structural scan of the ROM.
Versions.BATTLE_ANIMS_VERSION = 5
Versions.BATTLE_ANIMS = {
-- gBattleAnims_Moves: 355 GBA pointers to bytecode scripts (one per move id 0..354).
moves_table = 0x1C68F4,
move_count = 355,
status_table = 0x1C6E84,
status_count = 9,
general_table = 0x1C6EA8,
general_count = 28,
special_table = 0x1C6F18,
special_count = 7,
-- gBattleAnimPicTable: 289 CompressedSpriteSheet entries, stride 8 (ptr+size).
-- pic_ptr = rom:u32(pic_table + tag_idx*8), palette = rom:u32(pal_table + tag_idx*8)
pic_table = 0x3ACC08,
pal_table = 0x3AD510,
tag_count = 289, -- ANIM_SPRITES_START+0 .. ANIM_SPRITES_START+288
sprites_start = 10000, -- ANIM_SPRITES_START constant
-- pokefirered/src/graphics.c:841
substitute_pal = 0xD2D090,
substitute_front = 0xD2D0B4,
substitute_back = 0xD2D2F4,
-- pokefirered/src/graphics.c:857
stat_mask_gfx = 0xD2D8F4,
stat_mask_tilemap1 = 0xD2DB04,
stat_mask_tilemap2 = 0xD2DC20,
stat_mask_pal = 0xD2DD3C,
-- pokefirered/src/graphics.c:17
smokescreen_gfx = 0xD0162C,
smokescreen_pal = 0xD0170C,
-- pokefirered/src/graphics.c:990
muddy_water_pal = 0xE7BAB0,
named_bgs = {
-- pokefirered/src/graphics.c:705
ATTRACT = { gfx = 0xD234B4, pal = 0xD23F24, map = 0xD23F4C },
-- pokefirered/src/graphics.c:723
SCARY_FACE_PLAYER = { gfx = 0xD24BCC, pal = 0xD24BA4, map = 0xE7F4AC },
SCARY_FACE_OPPONENT = { gfx = 0xD24BCC, pal = 0xD24BA4, map = 0xE7F690 },
-- pokefirered/src/graphics.c:817
MORNING_SUN = { gfx = 0xD2A808, pal = 0xD2A8A8, map = 0xD2A8C0 },
-- pokefirered/src/graphics.c:565
METAL_SHINE = { gfx = 0xD1D224, pal = 0xD1D360, map = 0xD1D388 },
-- pokefirered/src/graphics.c:870
CURE_BUBBLES = { gfx = 0xD2DE3C, pal = 0xD2DF78, map = 0xD2DF98 },
-- pokefirered/src/graphics.c:643
CURSE = { gfx = 0xD2083C, map = 0xD20858, pal_white1 = true },
-- pokefirered/src/field_weather.c:130
FOG = { gfx_raw = 0x3C3540, gfx_size = 0x800, pal_raw = 0x3C2CE0, map = 0xE7F1F4 },
-- pokefirered/src/graphics.c:939
SANDSTORM = { gfx = 0xE794D0, pal_tag = "FLYING_DIRT", map = 0xE79354 },
-- pokefirered/src/graphics.c:1055
SURF_PLAYER = { gfx = 0xE809CC, pal = 0xE81CEC, map = 0xE81FE4 },
SURF_OPPONENT = { gfx = 0xE809CC, pal = 0xE81CEC, map = 0xE81D14 },
},
}
-- ANIM_TAG_* index → name string (from pokefirered/include/constants/battle_anim.h).
-- Indices not in this list are unused/reserved (false = skip extraction).
Versions.ANIM_TAG_NAMES = {
[0]="BONE",[1]="SPARK",[2]="PENCIL",[3]="AIR_WAVE",[4]="ORB",[5]="SWORD",
[6]="SEED",[7]="EXPLOSION_6",[8]="PINK_ORB",[9]="GUST",[10]="ICE_CUBE",
[11]="SPARK_2",[12]="ORANGE",[13]="YELLOW_BALL",[14]="LOCK_ON",[15]="TIED_BAG",
[16]="BLACK_SMOKE",[17]="BLACK_BALL",[18]="CONVERSION",[19]="GLASS",
[20]="HORN_HIT",[21]="HIT",[22]="HIT_2",[23]="BLUE_SHARDS",[24]="CLOSING_EYE",
[25]="WAVING_HAND",[26]="HIT_DUPLICATE",[27]="LEER",[28]="BLUE_BURST",
[29]="SMALL_EMBER",[30]="GRAY_SMOKE",[31]="BLUE_STAR",[32]="BUBBLE_BURST",
[33]="FIRE",[34]="SPINNING_FIRE",[35]="FIRE_PLUME",[36]="LIGHTNING_2",
[37]="LIGHTNING",[38]="CLAW_SLASH_2",[39]="CLAW_SLASH",[40]="SCRATCH_3",
[41]="SCRATCH_2",[42]="BUBBLE_BURST_2",[43]="ICE_CHUNK",[44]="GLASS_2",
[45]="PINK_HEART_2",[46]="SAP_DRIP",[47]="SAP_DRIP_2",[48]="SPARKLE_1",
[49]="SPARKLE_2",[50]="HUMANOID_FOOT",[51]="MONSTER_FOOT",[52]="HUMANOID_HAND",
[53]="NOISE_LINE",[54]="YELLOW_UNK",[55]="RED_FIST",[56]="SLAM_HIT",[57]="RING",
[58]="ROCKS",[59]="Z",[60]="YELLOW_UNK_2",[61]="AIR_SLASH",[62]="SPINNING_GREEN_ORBS",
[63]="LEAF",[64]="FINGER",[65]="POISON_POWDER",[66]="BROWN_TRIANGLE",
[67]="SLEEP_POWDER",[68]="STUN_SPORE",[69]="POWDER",[70]="SPARKLE_3",
[71]="SPARKLE_4",[72]="MUSIC_NOTES",[73]="DUCK",[74]="MUD_SAND",[75]="ALERT",
[76]="BLUE_FLAMES",[77]="BLUE_FLAMES_2",[78]="SHOCK_4",[79]="SHOCK",
[80]="BELL_2",[81]="PINK_GLOVE",[82]="BLUE_LINES",[83]="IMPACT_3",[84]="IMPACT_2",
[85]="RETICLE",[86]="BREATH",[87]="ANGER",[88]="SNOWBALL",[89]="VINE",
[90]="SWORD_2",[91]="CLAPPING",[92]="RED_TUBE",[93]="AMNESIA",[94]="STRING_2",
[95]="PENCIL_2",[96]="PETAL",[97]="BENT_SPOON",[98]="WEB",[99]="MILK_BOTTLE",
[100]="COIN",[101]="CRACKED_EGG",[102]="HATCHED_EGG",[103]="FRESH_EGG",
[104]="FANGS",[105]="EXPLOSION_2",[106]="EXPLOSION_3",[107]="WATER_DROPLET",
[108]="WATER_DROPLET_2",[109]="SEED_2",[110]="SPROUT",[111]="RED_WAND",
[112]="PURPLE_GREEN_UNK",[113]="WATER_COLUMN",[114]="MUD_UNK",[115]="RAIN_DROPS",
[116]="FURY_SWIPES",[117]="VINE_2",[118]="TEETH",[119]="BONE_2",[120]="WHITE_BAG",
[121]="UNKNOWN",[122]="PURPLE_CORAL",[123]="PURPLE_DROPLET",[124]="SHOCK_2",
[125]="CLOSING_EYE_2",[126]="METAL_BALL",[127]="MONSTER_DOLL",[128]="WHIRLWIND",
[129]="WHIRLWIND_2",[130]="EXPLOSION_4",[131]="EXPLOSION_5",[132]="TONGUE",
[133]="SMOKE",[134]="SMOKE_2",[135]="IMPACT",[136]="CIRCLE_IMPACT",[137]="SCRATCH",
[138]="CUT",[139]="SHARP_TEETH",[140]="RAINBOW_RINGS",[141]="ICE_CRYSTALS",
[142]="ICE_SPIKES",[143]="HANDS_AND_FEET",[144]="MIST_CLOUD",[145]="CLAMP",
[146]="BUBBLE",[147]="ORBS",[148]="WATER_IMPACT",[149]="WATER_ORB",
[150]="POISON_BUBBLE",[151]="TOXIC_BUBBLE",[152]="SPIKES",[153]="HORN_HIT_2",
[154]="AIR_WAVE_2",[155]="SMALL_BUBBLES",[156]="ROUND_SHADOW",[157]="SUNLIGHT",
[158]="SPORE",[159]="FLOWER",[160]="RAZOR_LEAF",[161]="NEEDLE",
[162]="WHIRLWIND_LINES",[163]="GOLD_RING",[164]="PURPLE_RING",[165]="BLUE_RING",
[166]="GREEN_LIGHT_WALL",[167]="BLUE_LIGHT_WALL",[168]="RED_LIGHT_WALL",
[169]="GRAY_LIGHT_WALL",[170]="ORANGE_LIGHT_WALL",[171]="BLACK_BALL_2",
[172]="PURPLE_GAS_CLOUD",[173]="SPARK_H",[174]="YELLOW_STAR",[175]="LARGE_FRESH_EGG",
[176]="SHADOW_BALL",[177]="LICK",[178]="VOID_LINES",[179]="STRING",
[180]="WEB_THREAD",[181]="SPIDER_WEB",[182]="LIGHTBULB",[183]="SLASH",
[184]="FOCUS_ENERGY",[185]="SPHERE_TO_CUBE",[186]="TENDRILS",[187]="EYE",
[188]="WHITE_SHADOW",[189]="TEAL_ALERT",[190]="OPENING_EYE",
[191]="ROUND_WHITE_HALO",[192]="FANG_ATTACK",[193]="PURPLE_HAND_OUTLINE",
[194]="MOON",[195]="GREEN_SPARKLE",[196]="SPIRAL",[197]="SNORE_Z",
[198]="EXPLOSION",[199]="NAIL",[200]="GHOSTLY_SPIRIT",[201]="WARM_ROCK",
[202]="BREAKING_EGG",[203]="THIN_RING",[204]="PUNCH_IMPACT",[205]="BELL",
[206]="MUSIC_NOTES_2",[207]="SPEED_DUST",[208]="TORN_METAL",[209]="THOUGHT_BUBBLE",
[210]="MAGENTA_HEART",[211]="ELECTRIC_ORBS",[212]="CIRCLE_OF_LIGHT",
[213]="ELECTRICITY",[214]="FINGER_2",[215]="MOVEMENT_WAVES",[216]="RED_HEART",
[217]="RED_ORB",[218]="EYE_SPARKLE",[219]="PINK_HEART",[220]="ANGEL",
[221]="DEVIL",[222]="SWIPE",[223]="ROOTS",[224]="ITEM_BAG",
[225]="JAGGED_MUSIC_NOTE",[226]="POKEBALL",[227]="SPOTLIGHT",[228]="LETTER_Z",
[229]="RAPID_SPIN",[230]="TRI_ATTACK_TRIANGLE",[231]="WISP_ORB",[232]="WISP_FIRE",
[233]="GOLD_STARS",[234]="ECLIPSING_ORB",[235]="GRAY_ORB",[236]="BLUE_ORB",
[237]="RED_ORB_2",[238]="PINK_PETAL",[239]="PAIN_SPLIT",[240]="CONFETTI",
[241]="GREEN_STAR",[242]="PINK_CLOUD",[243]="SWEAT_DROP",[244]="GUARD_RING",
[245]="PURPLE_SCRATCH",[246]="PURPLE_SWIPE",[247]="TAG_HAND",[248]="SMALL_RED_EYE",
[249]="HOLLOW_ORB",[250]="X_SIGN",[251]="BLUEGREEN_ORB",[252]="PAW_PRINT",
[253]="PURPLE_FLAME",[254]="RED_BALL",[255]="SMELLINGSALT_EFFECT",[256]="METEOR",
[257]="FLAT_ROCK",[258]="MAGNIFYING_GLASS",[259]="BROWN_ORB",
[260]="METAL_SOUND_WAVES",[261]="FLYING_DIRT",[262]="ICICLE_SPEAR",[263]="HAIL",
[264]="GLOWY_RED_ORB",[265]="GLOWY_GREEN_ORB",[266]="GREEN_SPIKE",
[267]="WHITE_CIRCLE_OF_LIGHT",[268]="GLOWY_BLUE_ORB",[269]="SAFARI_BAIT",
[270]="WHITE_FEATHER",[271]="SPARKLE_6",[272]="SPLASH",[273]="SWEAT_BEAD",
[274]="GEM_1",[275]="GEM_2",[276]="GEM_3",[277]="SLAM_HIT_2",[278]="RECYCLE",
[279]="RED_PARTICLES",[280]="PROTECT",[281]="DIRT_MOUND",[282]="SHOCK_3",
[283]="WEATHER_BALL",[284]="BIRD",[285]="CROSS_IMPACT",[286]="SLASH_2",
[287]="WHIP_HIT",[288]="BLUE_RING_2",
}
Versions.ANIM_TEMPLATE_NAMES = {
[0x083BF434] = "gWeatherBallUpSpriteTemplate",
[0x083BF44C] = "gWeatherBallNormalDownSpriteTemplate",
[0x083BF480] = "gSpinningSparkleSpriteTemplate",
[0x083D4E54] = "gHorizontalLungeSpriteTemplate",
[0x083D4E6C] = "gVerticalDipSpriteTemplate",
[0x083D4E84] = "gSlideMonToOriginalPosSpriteTemplate",
[0x083D4E9C] = "gSlideMonToOffsetSpriteTemplate",
[0x083D4EB4] = "gSlideMonToOffsetAndBackSpriteTemplate",
[0x083E2990] = "gSleepPowderParticleSpriteTemplate",
[0x083E29A8] = "gStunSporeParticleSpriteTemplate",
[0x083E29C0] = "gPoisonPowderParticleSpriteTemplate",
[0x083E2A58] = "gPowerAbsorptionOrbSpriteTemplate",
[0x083E2A70] = "gSolarBeamBigOrbSpriteTemplate",
[0x083E2ABC] = "gStockpileAbsorptionOrbSpriteTemplate",
[0x083E2AE8] = "gAbsorptionOrbSpriteTemplate",
[0x083E2B00] = "gHyperBeamOrbSpriteTemplate",
[0x083E2B34] = "gLeechSeedSpriteTemplate",
[0x083E2B64] = "gSporeParticleSpriteTemplate",
[0x083E2B94] = "gPetalDanceBigFlowerSpriteTemplate",
[0x083E2BAC] = "gPetalDanceSmallFlowerSpriteTemplate",
[0x083E2C08] = "gRazorLeafParticleSpriteTemplate",
[0x083E2C20] = "gTwisterLeafSpriteTemplate",
[0x083E2C50] = "gRazorLeafCutterSpriteTemplate",
[0x083E2C7C] = "gSwiftStarSpriteTemplate",
[0x083E2D0C] = "gConstrictBindingSpriteTemplate",
[0x083E2D54] = "gMimicOrbSpriteTemplate",
[0x083E2DC4] = "gIngrainRootSpriteTemplate",
[0x083E2DDC] = "gFrenzyPlantRootSpriteTemplate",
[0x083E2E04] = "gIngrainOrbSpriteTemplate",
[0x083E2E88] = "gPresentSpriteTemplate",
[0x083E2EA0] = "gKnockOffItemSpriteTemplate",
[0x083E2ED0] = "gPresentHealParticleSpriteTemplate",
[0x083E2EE8] = "gItemStealSpriteTemplate",
[0x083E2F60] = "gTrickBagSpriteTemplate",
[0x083E3024] = "gAromatherapySmallFlowerSpriteTemplate",
[0x083E303C] = "gAromatherapyBigFlowerSpriteTemplate",
[0x083E30A8] = "gSilverWindBigSparkSpriteTemplate",
[0x083E30C0] = "gSilverWindMediumSparkSpriteTemplate",
[0x083E30D8] = "gSilverWindSmallSparkSpriteTemplate",
[0x083E3100] = "gNeedleArmSpikeSpriteTemplate",
[0x083E3148] = "gSlamHitSpriteTemplate",
[0x083E3160] = "gVineWhipSpriteTemplate",
[0x083E3294] = "gCuttingSliceSpriteTemplate",
[0x083E32AC] = "gAirCutterSliceSpriteTemplate",
[0x083E3354] = "gProtectSpriteTemplate",
[0x083E33B4] = "gMilkBottleSpriteTemplate",
[0x083E33F4] = "gGrantingStarsSpriteTemplate",
[0x083E340C] = "gSparklingStarsSpriteTemplate",
[0x083E3500] = "gSleepLetterZSpriteTemplate",
[0x083E3518] = "gLockOnTargetSpriteTemplate",
[0x083E3530] = "gLockOnMoveTargetSpriteTemplate",
[0x083E3550] = "gBowMonSpriteTemplate",
[0x083E35A4] = "gSlashSliceSpriteTemplate",
[0x083E35BC] = "gFalseSwipeSliceSpriteTemplate",
[0x083E35D4] = "gFalseSwipePositionedSliceSpriteTemplate",
[0x083E3604] = "gEndureEnergySpriteTemplate",
[0x083E365C] = "gSharpenSphereSpriteTemplate",
[0x083E3674] = "gOctazookaBallSpriteTemplate",
[0x083E36A8] = "gOctazookaSmokeSpriteTemplate",
[0x083E36EC] = "gConversionSpriteTemplate",
[0x083E371C] = "gConversion2SpriteTemplate",
[0x083E3734] = "gMoonSpriteTemplate",
[0x083E3764] = "gMoonlightSparkleSpriteTemplate",
[0x083E37A4] = "gHealingBlueStarSpriteTemplate",
[0x083E37BC] = "gHornHitSpriteTemplate",
[0x083E37EC] = "gSuperFangSpriteTemplate",
[0x083E3880] = "gWavyMusicNotesSpriteTemplate",
[0x083E38C8] = "gFastFlyingMusicNotesSpriteTemplate",
[0x083E38E0] = "gBellyDrumHandSpriteTemplate",
[0x083E3914] = "gSlowFlyingMusicNotesSpriteTemplate",
[0x083E398C] = "gThoughtBubbleSpriteTemplate",
[0x083E3A34] = "gMetronomeFingerSpriteTemplate",
[0x083E3A4C] = "gFollowMeFingerSpriteTemplate",
[0x083E3AC4] = "gTauntFingerSpriteTemplate",
[0x083E3BBC] = "gKinesisZapEnergySpriteTemplate",
[0x083E3BF8] = "gSwordsDanceBladeSpriteTemplate",
[0x083E3C10] = "gSonicBoomSpriteTemplate",
[0x083E3CA0] = "gSupersonicRingSpriteTemplate",
[0x083E3CB8] = "gScreechRingSpriteTemplate",
[0x083E3CD0] = "gMetalSoundSpriteTemplate",
[0x083E3CE8] = "gWaterPulseRingSpriteTemplate",
[0x083E3D00] = "gEggThrowSpriteTemplate",
[0x083E3D50] = "gCoinThrowSpriteTemplate",
[0x083E3D68] = "gFallingCoinSpriteTemplate",
[0x083E3D94] = "gBulletSeedSpriteTemplate",
[0x083E3DC8] = "gRazorWindTornadoSpriteTemplate",
[0x083E3E08] = "gViceGripSpriteTemplate",
[0x083E3E48] = "gGuillotineSpriteTemplate",
[0x083E3ED0] = "gBreathPuffSpriteTemplate",
[0x083E3F04] = "gAngerMarkSpriteTemplate",
[0x083E3F4C] = "gPencilSpriteTemplate",
[0x083E3F64] = "gSnoreZSpriteTemplate",
[0x083E3F94] = "gExplosionSpriteTemplate",
[0x083E4028] = "gSoftBoiledEggSpriteTemplate",
[0x083E4094] = "gThinRingExpandingSpriteTemplate",
[0x083E40C8] = "gThinRingShrinkingSpriteTemplate",
[0x083E40E0] = "gBlendThinRingExpandingSpriteTemplate",
[0x083E40F8] = "gHyperVoiceRingSpriteTemplate",
[0x083E4110] = "gUproarRingSpriteTemplate",
[0x083E41B0] = "gBellSpriteTemplate",
[0x083E41D0] = "gHealBellMusicNoteSpriteTemplate",
[0x083E41E8] = "gMagentaHeartSpriteTemplate",
[0x083E4218] = "gRedHeartProjectileSpriteTemplate",
[0x083E4230] = "gRedHeartBurstSpriteTemplate",
[0x083E4248] = "gRedHeartRisingSpriteTemplate",
[0x083E427C] = "gHiddenPowerOrbSpriteTemplate",
[0x083E4294] = "gHiddenPowerOrbScatterSpriteTemplate",
[0x083E42C8] = "gSpitUpOrbSpriteTemplate",
[0x083E42FC] = "gEyeSparkleSpriteTemplate",
[0x083E4320] = "gAngelSpriteTemplate",
[0x083E4338] = "gPinkHeartSpriteTemplate",
[0x083E4368] = "gDevilSpriteTemplate",
[0x083E43B0] = "gFurySwipesSpriteTemplate",
[0x083E43F8] = "gMovementWavesSpriteTemplate",
[0x083E4430] = "gJaggedMusicNoteSpriteTemplate",
[0x083E4484] = "gPerishSongMusicNoteSpriteTemplate",
[0x083E449C] = "gPerishSongMusicNote2SpriteTemplate",
[0x083E44DC] = "gGuardRingSpriteTemplate",
[0x083E58E0] = "gWaterBubbleProjectileSpriteTemplate",
[0x083E592C] = "gAuroraBeamRingSpriteTemplate",
[0x083E595C] = "gHydroPumpOrbSpriteTemplate",
[0x083E5974] = "gMudShotOrbSpriteTemplate",
[0x083E598C] = "gSignalBeamRedOrbSpriteTemplate",
[0x083E59A4] = "gSignalBeamGreenOrbSpriteTemplate",
[0x083E59D0] = "gFlamethrowerFlameSpriteTemplate",
[0x083E59E8] = "gPsywaveRingSpriteTemplate",
[0x083E5A38] = "gHydroCannonChargeSpriteTemplate",
[0x083E5A50] = "gHydroCannonBeamSpriteTemplate",
[0x083E5A80] = "gWaterGunProjectileSpriteTemplate",
[0x083E5A98] = "gWaterGunDropletSpriteTemplate",
[0x083E5AB0] = "gSmallBubblePairSpriteTemplate",
[0x083E5AC8] = "gSmallDriftingBubblesSpriteTemplate",
[0x083E5B70] = "gWaterPulseBubbleSpriteTemplate",
[0x083E5BA0] = "gWeatherBallWaterDownSpriteTemplate",
[0x083E5BE0] = "gFireSpiralInwardSpriteTemplate",
[0x083E5BF8] = "gFireSpreadSpriteTemplate",
[0x083E5C70] = "gLargeFlameSpriteTemplate",
[0x083E5C88] = "gLargeFlameScatterSpriteTemplate",
[0x083E5CA0] = "gFirePlumeSpriteTemplate",
[0x083E5D18] = "gSunlightRaySpriteTemplate",
[0x083E5D4C] = "gEmberSpriteTemplate",
[0x083E5D64] = "gEmberFlareSpriteTemplate",
[0x083E5D7C] = "gBurnFlameSpriteTemplate",
[0x083E5D94] = "gFireBlastRingSpriteTemplate",
[0x083E5DE4] = "gFireBlastCrossSpriteTemplate",
[0x083E5DFC] = "gFireSpiralOutwardSpriteTemplate",
[0x083E5E14] = "gWeatherBallFireDownSpriteTemplate",
[0x083E5E60] = "gEruptionFallingRockSpriteTemplate",
[0x083E5EB4] = "gWillOWispOrbSpriteTemplate",
[0x083E5EE4] = "gWillOWispFireSpriteTemplate",
[0x083E5F38] = "gLightningSpriteTemplate",
[0x083E5FC4] = "gSparkElectricitySpriteTemplate",
[0x083E5FDC] = "gZapCannonBallSpriteTemplate",
[0x083E6008] = "gZapCannonSparkSpriteTemplate",
[0x083E6058] = "gThunderboltOrbSpriteTemplate",
[0x083E6070] = "gSparkElectricityFlashingSpriteTemplate",
[0x083E6088] = "gElectricitySpriteTemplate",
[0x083E60B8] = "gThunderWaveSpriteTemplate",
[0x083E61D4] = "gGrowingChargeOrbSpriteTemplate",
[0x083E6204] = "gElectricPuffSpriteTemplate",
[0x083E621C] = "gVoltTackleOrbSlideSpriteTemplate",
[0x083E6290] = "gGrowingShockWaveOrbSpriteTemplate",
[0x083E6348] = "gIceCrystalSpiralInwardLarge",
[0x083E6360] = "gIceCrystalSpiralInwardSmall",
[0x083E638C] = "gIceBeamInnerCrystalSpriteTemplate",
[0x083E63A4] = "gIceBeamOuterCrystalSpriteTemplate",
[0x083E63E0] = "gIceCrystalHitLargeSpriteTemplate",
[0x083E63F8] = "gIceCrystalHitSmallSpriteTemplate",
[0x083E6410] = "gSwirlingSnowballSpriteTemplate",
[0x083E6428] = "gBlizzardIceCrystalSpriteTemplate",
[0x083E6440] = "gPowderSnowSnowballSpriteTemplate",
[0x083E647C] = "gIceGroundSpikeSpriteTemplate",
[0x083E64A4] = "gMistCloudSpriteTemplate",
[0x083E64BC] = "gSmogCloudSpriteTemplate",
[0x083E64E8] = "gMistBallSpriteTemplate",
[0x083E6514] = "gPoisonGasCloudSpriteTemplate",
[0x083E65BC] = "gWeatherBallIceDownSpriteTemplate",
[0x083E665C] = "gIceBallChunkSpriteTemplate",
[0x083E6674] = "gIceBallImpactShardSpriteTemplate",
[0x083E66E0] = "gKarateChopSpriteTemplate",
[0x083E66F8] = "gJumpKickSpriteTemplate",
[0x083E6710] = "gFistFootSpriteTemplate",
[0x083E6728] = "gFistFootRandomPosSpriteTemplate",
[0x083E6740] = "gCrossChopHandSpriteTemplate",
[0x083E6758] = "gSlidingKickSpriteTemplate",
[0x083E678C] = "gSpinningHandOrFootSpriteTemplate",
[0x083E67C0] = "gMegaPunchKickSpriteTemplate",
[0x083E67D8] = "gStompFootSpriteTemplate",
[0x083E67F0] = "gDizzyPunchDuckSpriteTemplate",
[0x083E6808] = "gBrickBreakWallSpriteTemplate",
[0x083E6820] = "gBrickBreakWallShardSpriteTemplate",
[0x083E6864] = "gSuperpowerOrbSpriteTemplate",
[0x083E687C] = "gSuperpowerRockSpriteTemplate",
[0x083E6894] = "gSuperpowerFireballSpriteTemplate",
[0x083E68AC] = "gArmThrustHandSpriteTemplate",
[0x083E6900] = "gRevengeSmallScratchSpriteTemplate",
[0x083E6948] = "gRevengeBigScratchSpriteTemplate",
[0x083E697C] = "gFocusPunchFistSpriteTemplate",
[0x083E69AC] = "gToxicBubbleSpriteTemplate",
[0x083E6A20] = "gSludgeProjectileSpriteTemplate",
[0x083E6A38] = "gAcidPoisonBubbleSpriteTemplate",
[0x083E6A50] = "gSludgeBombHitParticleSpriteTemplate",
[0x083E6A84] = "gAcidPoisonDropletSpriteTemplate",
[0x083E6AB8] = "gPoisonBubbleSpriteTemplate",
[0x083E6AD0] = "gWaterBubbleSpriteTemplate",
[0x083E6AE8] = "gEllipticalGustSpriteTemplate",
[0x083E6B1C] = "gGustToTargetSpriteTemplate",
[0x083E6B4C] = "gAirWaveCrescentSpriteTemplate",
[0x083E6BB8] = "gFlyBallUpSpriteTemplate",
[0x083E6BD0] = "gFlyBallAttackSpriteTemplate",
[0x083E6C00] = "gFallingFeatherSpriteTemplate",
[0x083E6C84] = "gWhirlwindLineSpriteTemplate",
[0x083E6CD0] = "gBounceBallShrinkSpriteTemplate",
[0x083E6CFC] = "gBounceBallLandSpriteTemplate",
[0x083E6D40] = "gDiveBallSpriteTemplate",
[0x083E6D7C] = "gDiveWaterSplashSpriteTemplate",
[0x083E6D94] = "gSprayWaterDropletSpriteTemplate",
[0x083E6DC4] = "gSkyAttackBirdSpriteTemplate",
[0x083E6DF8] = "gPsychUpSpiralSpriteTemplate",
[0x083E6E10] = "gLightScreenWallSpriteTemplate",
[0x083E6E28] = "gReflectWallSpriteTemplate",
[0x083E6E40] = "gMirrorCoatWallSpriteTemplate",
[0x083E6E58] = "gBarrierWallSpriteTemplate",
[0x083E6E70] = "gMagicCoatWallSpriteTemplate",
[0x083E6EA4] = "gReflectSparkleSpriteTemplate",
[0x083E6ED4] = "gSpecialScreenSparkleSpriteTemplate",
[0x083E6EEC] = "gGoldRingSpriteTemplate",
[0x083E6F8C] = "gBentSpoonSpriteTemplate",
[0x083E6FF4] = "gQuestionMarkSpriteTemplate",
[0x083E705C] = "gRedXSpriteTemplate",
[0x083E7148] = "gLusterPurgeCircleSpriteTemplate",
[0x083E71D0] = "gPsychoBoostOrbSpriteTemplate",
[0x083E7224] = "gMegahornHornSpriteTemplate",
[0x083E7278] = "gLeechLifeNeedleSpriteTemplate",
[0x083E7290] = "gWebThreadSpriteTemplate",
[0x083E72A8] = "gStringWrapSpriteTemplate",
[0x083E72DC] = "gSpiderWebSpriteTemplate",
[0x083E72F4] = "gLinearStingerSpriteTemplate",
[0x083E730C] = "gPinMissileSpriteTemplate",
[0x083E7324] = "gIcicleSpearSpriteTemplate",
[0x083E7378] = "gTailGlowOrbSpriteTemplate",
[0x083E73B4] = "gFallingRockSpriteTemplate",
[0x083E73CC] = "gRockFragmentSpriteTemplate",
[0x083E73E4] = "gSwirlingDirtSpriteTemplate",
[0x083E7420] = "gWhirlpoolSpriteTemplate",
[0x083E7438] = "gFireSpinSpriteTemplate",
[0x083E7450] = "gFlyingSandCrescentSpriteTemplate",
[0x083E74C0] = "gAncientPowerRockSpriteTemplate",
[0x083E7508] = "gRockTombRockSpriteTemplate",
[0x083E7548] = "gRockBlastRockSpriteTemplate",
[0x083E7560] = "gRockScatterSpriteTemplate",
[0x083E7578] = "gTwisterRockSpriteTemplate",
[0x083E7590] = "gWeatherBallRockDownSpriteTemplate",
[0x083E75C4] = "gConfuseRayBallBounceSpriteTemplate",
[0x083E75DC] = "gConfuseRayBallSpiralSpriteTemplate",
[0x083E7608] = "gShadowBallSpriteTemplate",
[0x083E763C] = "gLickSpriteTemplate",
[0x083E7680] = "gCurseNailSpriteTemplate",
[0x083E7698] = "gCurseGhostSpriteTemplate",
[0x083E76B0] = "gNightmareDevilSpriteTemplate",
[0x083E772C] = "gOutrageFlameSpriteTemplate",
[0x083E77A4] = "gDragonBreathFireSpriteTemplate",
[0x083E77D8] = "gDragonRageFirePlumeSpriteTemplate",
[0x083E7830] = "gDragonRageFireSpitSpriteTemplate",
[0x083E7848] = "gDragonDanceOrbSpriteTemplate",
[0x083E7860] = "gOverheatFlameSpriteTemplate",
[0x083E7930] = "gSharpTeethSpriteTemplate",
[0x083E7948] = "gClampJawSpriteTemplate",
[0x083E7998] = "gTearDropSpriteTemplate",
[0x083E79E8] = "gClawSlashSpriteTemplate",
[0x083E7A28] = "gBonemerangSpriteTemplate",
[0x083E7A40] = "gSpinningBoneSpriteTemplate",
[0x083E7A58] = "gSandAttackDirtSpriteTemplate",
[0x083E7A7C] = "gMudSlapMudSpriteTemplate",
[0x083E7A94] = "gMudsportMudSpriteTemplate",
[0x083E7AAC] = "gDirtPlumeSpriteTemplate",
[0x083E7AC4] = "gDirtMoundSpriteTemplate",
[0x083E7B0C] = "gConfusionDuckSpriteTemplate",
[0x083E7B24] = "gSimplePaletteBlendSpriteTemplate",
[0x083E7B3C] = "gComplexPaletteBlendSpriteTemplate",
[0x083E7B88] = "gShakeMonOrTerrainSpriteTemplate",
[0x083E7C08] = "gBasicHitSplatSpriteTemplate",
[0x083E7C20] = "gHandleInvertHitSplatSpriteTemplate",
[0x083E7C38] = "gWaterHitSplatSpriteTemplate",
[0x083E7C50] = "gRandomPosHitSplatSpriteTemplate",
[0x083E7C68] = "gMonEdgeHitSplatSpriteTemplate",
[0x083E7C80] = "gCrossImpactSpriteTemplate",
[0x083E7C98] = "gFlashingHitSplatSpriteTemplate",
[0x083E7CB0] = "gPersistHitSplatSpriteTemplate",
[0x083FEE00] = "gScratchSpriteTemplate",
[0x083FEE18] = "gBlackSmokeSpriteTemplate",
[0x083FEE30] = "gBlackBallSpriteTemplate",
[0x083FEE5C] = "gOpeningEyeSpriteTemplate",
[0x083FEE74] = "gWhiteHaloSpriteTemplate",
[0x083FEE8C] = "gTealAlertSpriteTemplate",
[0x083FEEE4] = "gMeanLookEyeSpriteTemplate",
[0x083FEEFC] = "gSpikesSpriteTemplate",
[0x083FEF30] = "gLeerSpriteTemplate",
[0x083FEF70] = "gLetterZSpriteTemplate",
[0x083FEFBC] = "gFangSpriteTemplate",
[0x083FF00C] = "gSpotlightSpriteTemplate",
[0x083FF024] = "gClappingHandSpriteTemplate",
[0x083FF03C] = "gClappingHand2SpriteTemplate",
[0x083FF068] = "gRapidSpinSpriteTemplate",
[0x083FF0D8] = "gTriAttackTriangleSpriteTemplate",
[0x083FF118] = "gEclipsingOrbSpriteTemplate",
[0x083FF150] = "gBatonPassPokeballSpriteTemplate",
[0x083FF168] = "gWishStarSpriteTemplate",
[0x083FF1F8] = "gSwallowBlueOrbSpriteTemplate",
[0x083FF26C] = "gGreenStarSpriteTemplate",
[0x083FF2B0] = "gWeakFrustrationAngerMarkSpriteTemplate",
[0x083FF324] = "gSweetScentPetalSpriteTemplate",
[0x083FF370] = "gPainSplitProjectileSpriteTemplate",
[0x083FF388] = "gFlatterConfettiSpriteTemplate",
[0x083FF3A0] = "gFlatterSpotlightSpriteTemplate",
[0x083FF3B8] = "gReversalOrbSpriteTemplate",
[0x083FF46C] = "gYawnCloudSpriteTemplate",
[0x083FF514] = "gSmokeBallEscapeCloudSpriteTemplate",
[0x083FF5B4] = "gRoarNoiseLineSpriteTemplate",
[0x083FF5E4] = "gAssistPawprintSpriteTemplate",
[0x083FF644] = "gSmellingSaltsHandSpriteTemplate",
[0x083FF674] = "gSmellingSaltExclamationSpriteTemplate",
[0x083FF68C] = "gHelpingHandClapSpriteTemplate",
[0x083FF6A4] = "gForesightMagnifyingGlassSpriteTemplate",
[0x083FF6BC] = "gMeteorMashStarSpriteTemplate",
[0x083FF6EC] = "gBlockXSpriteTemplate",
[0x083FF764] = "gKnockOffStrikeSpriteTemplate",
[0x083FF790] = "gRecycleSpriteTemplate",
[0x0840C1EC] = "gSafariBaitSpriteTemplate",
[0x0840C210] = "gSafariRockTemplate",
}
Versions.ANIM_CALLBACK_NAMES = {
[0x08075D9D] = "SpriteOnMonPos",
[0x08075DF5] = "TranslateAnimSpriteToTargetMonLocation",
[0x08075E81] = "ThrowProjectile",
[0x08075F0D] = "TravelDiagonally",
[0x08076FD1] = "SpinningSparkle",
[0x0807729D] = "WeatherBallUp",
[0x08077351] = "WeatherBallDown",
[0x080990AD] = "DoHorizontalLunge",
[0x08099145] = "DoVerticalDip",
[0x080991B5] = "SlideMonToOriginalPos",
[0x080992E1] = "SlideMonToOffset",
[0x08099395] = "SlideMonToOffsetAndBack",
[0x080A22E9] = "MovePowderParticle",
[0x080A2389] = "PowerAbsorptionOrb",
[0x080A23D9] = "SolarBeamBigOrb",
[0x080A2581] = "AbsorptionOrb",
[0x080A25ED] = "HyperBeamOrb",
[0x080A26F1] = "LeechSeed",
[0x080A27D1] = "SporeParticle",
[0x080A2921] = "PetalDanceBigFlower",
[0x080A29ED] = "PetalDanceSmallFlower",
[0x080A2AA5] = "RazorLeafParticle",
[0x080A2B9D] = "TranslateLinearSingleSineWave",
[0x080A2D11] = "MoveTwisterParticle",
[0x080A2E29] = "ConstrictBinding",
[0x080A3099] = "MimicOrb",
[0x080A3169] = "IngrainRoot",
[0x080A31ED] = "FrenzyPlantRoot",
[0x080A3335] = "IngrainOrb",
[0x080A3519] = "Present",
[0x080A35F5] = "KnockOffItem",
[0x080A3671] = "PresentHealParticle",
[0x080A36B5] = "ItemSteal",
[0x080A37BD] = "TrickBag",
[0x080A4041] = "FlyingParticle",
[0x080A4299] = "NeedleArmSpike",
[0x080A4451] = "WhipHit",
[0x080A44E1] = "CuttingSlice",
[0x080A4589] = "AirCutterSlice",
[0x080A48F1] = "Protect",
[0x080A4ACD] = "MilkBottle",
[0x080A4D0D] = "GrantingStars",
[0x080A4D5D] = "SparklingStars",
[0x080A4EF5] = "SleepLetterZ",
[0x080A4FAD] = "LockOnTarget",
[0x080A5299] = "LockOnMoveTarget",
[0x080A5341] = "BowMon",
[0x080A5941] = "SlashSlice",
[0x080A59A9] = "FalseSwipeSlice",
[0x080A59F1] = "FalseSwipePositionedSlice",
[0x080A5AD9] = "EndureEnergy",
[0x080A5B7D] = "SharpenSphere",
[0x080A5C69] = "Conversion",
[0x080A5D4D] = "Conversion2",
[0x080A5EE1] = "Moon",
[0x080A5F41] = "MoonlightSparkle",
[0x080A6245] = "HornHit",
[0x080A65CD] = "SuperFang",
[0x080A66D5] = "WavyMusicNotes",
[0x080A68B1] = "FlyingMusicNotes",
[0x080A69B9] = "BellyDrumHand",
[0x080A6A29] = "SlowFlyingMusicNotes",
[0x080A6B65] = "ThoughtBubble",
[0x080A6C09] = "MetronomeFinger",
[0x080A6C85] = "FollowMeFinger",
[0x080A6D91] = "TauntFinger",
[0x080A71D9] = "KinesisZapEnergy",
[0x080A727D] = "SwordsDanceBlade",
[0x080A72C9] = "SonicBoomProjectile",
[0x080A7A89] = "CoinThrow",
[0x080A7B3D] = "FallingCoin",
[0x080A7BC5] = "BulletSeed",
[0x080A7D05] = "RazorWindTornado",
[0x080A7D65] = "ViceGripPincer",
[0x080A7E15] = "GuillotinePincer",
[0x080A851D] = "BreathPuff",
[0x080A85AD] = "AngerMark",
[0x080A8A1D] = "Pencil",
[0x080A8BC5] = "BlendThinRing",
[0x080A8CA5] = "HyperVoiceRing",
[0x080A8EE9] = "UproarRing",
[0x080A8F39] = "SoftBoiledEgg",
[0x080A97E9] = "HealBellMusicNote",
[0x080A9861] = "MagentaHeart",
[0x080A9B41] = "RedHeartProjectile",
[0x080A9BC5] = "ParticleBurst",
[0x080A9C4D] = "RedHeartRising",
[0x080AA175] = "OrbitFast",
[0x080AA2B1] = "OrbitScatter",
[0x080AA37D] = "SpitUpOrb",
[0x080AA3F1] = "EyeSparkle",
[0x080AA409] = "Angel",
[0x080AA509] = "PinkHeart",
[0x080AA58D] = "Devil",
[0x080AA6B9] = "FurySwipes",
[0x080AA709] = "MovementWaves",
[0x080AA839] = "JaggedMusicNote",
[0x080AA939] = "PerishSongMusicNote2",
[0x080AA999] = "PerishSongMusicNote",
[0x080AAAE5] = "GuardRing",
[0x080AAC99] = "WaterBubbleProjectile",
[0x080AAE85] = "AuroraBeamRings",
[0x080AB025] = "ToTargetInSinWave",
[0x080AB169] = "HydroCannonCharge",
[0x080AB1F9] = "HydroCannonBeam",
[0x080AB2CD] = "WaterGunDroplet",
[0x080AB309] = "SmallBubblePair",
[0x080ABA79] = "SmallDriftingBubbles",
[0x080AC625] = "WaterPulseBubble",
[0x080AC6D9] = "WaterPulseRing",
[0x080AC90D] = "FireSpiralInward",
[0x080AC94D] = "FireSpread",
[0x080AC991] = "FirePlume",
[0x080ACA01] = "LargeFlame",
[0x080ACBB1] = "Sunlight",
[0x080ACBDD] = "EmberFlare",
[0x080ACC45] = "BurnFlame",
[0x080ACC61] = "FireRing",
[0x080ACDA9] = "FireCross",
[0x080ACDE9] = "FireSpiralOutward",
[0x080AD455] = "EruptionFallingRock",
[0x080AD541] = "WillOWispOrb",
[0x080AD6F5] = "WillOWispFire",
[0x080ADBED] = "Lightning",
[0x080ADD4D] = "SparkElectricity",
[0x080ADEB1] = "ZapCannonSpark",
[0x080AE001] = "ThunderboltOrb",
[0x080AE06D] = "SparkElectricityFlashing",
[0x080AE1A1] = "Electricity",
[0x080AE471] = "ThunderWave",
[0x080AE71D] = "GrowingChargeOrb",
[0x080AE775] = "ElectricPuff",
[0x080AE7DD] = "VoltTackleOrbSlide",
[0x080AEC81] = "GrowingShockWaveOrb",
[0x080AF2F1] = "IcePunchSwirlingParticle",
[0x080AF331] = "IceBeamParticle",
[0x080AF3B9] = "IceEffectParticle",
[0x080AF469] = "SwirlingSnowball",
[0x080AF6D9] = "MoveParticleBeyondTarget",
[0x080AF88D] = "WaveFromCenterOfTarget",
[0x080AF915] = "InitSwirlingFogAnim",
[0x080AFD4D] = "ThrowMistBall",
[0x080AFFD5] = "InitPoisonGasCloudAnim",
[0x080B06FD] = "InitIceBallAnim",
[0x080B07C1] = "InitIceBallParticle",
[0x080B08DD] = "SlideHandOrFootToTarget",
[0x080B0929] = "JumpKick",
[0x080B0955] = "BasicFistOrFoot",
[0x080B09A5] = "FistOrFootRandomPos",
[0x080B0B81] = "CrossChopHand",
[0x080B0C29] = "SlidingKick",
[0x080B0CED] = "SpinningKickOrPunch",
[0x080B0D59] = "StompFoot",
[0x080B0DF1] = "DizzyPunchDuck",
[0x080B0E81] = "BrickBreakWall",
[0x080B0F69] = "BrickBreakWallShard",
[0x080B107D] = "SuperpowerOrb",
[0x080B1189] = "SuperpowerRock",
[0x080B12E9] = "SuperpowerFireball",
[0x080B13F9] = "ArmThrustHit",
[0x080B1485] = "RevengeScratch",
[0x080B14F1] = "FocusPunchFist",
[0x080B1621] = "SludgeProjectile",
[0x080B16A1] = "AcidPoisonBubble",
[0x080B1745] = "SludgeBombHitParticle",
[0x080B17C5] = "AcidPoisonDroplet",
[0x080B1839] = "BubbleEffect",
[0x080B18E5] = "EllipticalGust",
[0x080B1A1D] = "GustToTarget",
[0x080B1AB9] = "AirWaveCrescent",
[0x080B1BB1] = "FlyBallUp",
[0x080B1C3D] = "FlyBallAttack",
[0x080B1D89] = "FallingFeather",
[0x080B2781] = "WhirlwindLine",
[0x080B2915] = "BounceBallShrink",
[0x080B2975] = "BounceBallLand",
[0x080B2A09] = "DiveBall",
[0x080B2AF5] = "DiveWaterSplash",
[0x080B2BD9] = "SprayWaterDroplet",
[0x080B2D65] = "SkyAttackBird",
[0x080B2ECD] = "DefensiveWall",
[0x080B31D1] = "WallSparkle",
[0x080B3279] = "BentSpoon",
[0x080B32F5] = "QuestionMark",
[0x080B37ED] = "RedX",
[0x080B3E85] = "PsychoBoost",
[0x080B3FAD] = "MegahornHorn",
[0x080B407D] = "LeechLifeNeedle",
[0x080B4129] = "TranslateWebThread",
[0x080B41F9] = "StringWrap",
[0x080B42C1] = "SpiderWeb",
[0x080B4365] = "TranslateStinger",
[0x080B4495] = "MissileArc",
[0x080B45D9] = "TailGlowOrb",
[0x080B4635] = "FallingRock",
[0x080B46F9] = "RockFragment",
[0x080B477D] = "ParticleInVortex",
[0x080B4AA9] = "FlyingSandCrescent",
[0x080B4B8D] = "RaiseSprite",
[0x080B4FE5] = "RockTomb",
[0x080B5075] = "RockBlastRock",
[0x080B50A1] = "RockScatter",
[0x080B5269] = "ConfuseRayBallBounce",
[0x080B5451] = "ConfuseRayBallSpiral",
[0x080B563D] = "ShadowBall",
[0x080B57F9] = "Lick",
[0x080B664D] = "CurseNail",
[0x080B67D5] = "GhostStatusSprite",
[0x080B725D] = "OutrageFlame",
[0x080B73AD] = "DragonRageFirePlume",
[0x080B741D] = "DragonFireToTarget",
[0x080B7449] = "DragonDanceOrb",
[0x080B77E5] = "OverheatFlame",
[0x080B7BD5] = "Bite",
[0x080B7C89] = "TearDrop",
[0x080B86B1] = "ClawSlash",
[0x080B8B6D] = "BonemerangProjectile",
[0x080B8C55] = "BoneHitProjectile",
[0x080B8CC9] = "DirtScatter",
[0x080B8D59] = "MudSportDirt",
[0x080B9379] = "DirtPlumeParticle",
[0x080B941D] = "DigDirtMound",
[0x080B9905] = "ConfusionDuck",
[0x080B99D5] = "SimplePaletteBlend",
[0x080B9A7D] = "ComplexPaletteBlend",
[0x080BA27D] = "ShakeMonOrBattleTerrain",
[0x080BA561] = "HitSplatBasic",
[0x080BA5A9] = "HitSplatPersistent",
[0x080BA5F9] = "HitSplatHandleInvert",
[0x080BA631] = "HitSplatRandom",
[0x080BA6C9] = "HitSplatOnMonEdge",
[0x080BA739] = "CrossImpact",
[0x080BA781] = "FlashingHitSplat",
[0x080DE2C1] = "BlackSmoke",
[0x080DE39D] = "WhiteHalo",
[0x080DE441] = "TealAlert",
[0x080DE4DD] = "MeanLookEye",
[0x080DE8B1] = "Spikes",
[0x080DE99D] = "Leer",
[0x080DE9D9] = "LetterZ",
[0x080DEA99] = "Fang",
[0x080DEB21] = "Spotlight",
[0x080DEC91] = "ClappingHand",
[0x080DEDBD] = "ClappingHand2",
[0x080DEEBD] = "RapidSpin",
[0x080DF469] = "TriAttackTriangle",
[0x080DF581] = "BatonPassPokeball",
[0x080DF689] = "WishStar",
[0x080DF8F9] = "SwallowBlueOrb",
[0x080DFEDD] = "GreenStar",
[0x080E04E1] = "WeakFrustrationAngerMark",
[0x080E0791] = "SweetScentPetal",
[0x080E0A3D] = "PainSplitProjectile",
[0x080E0C69] = "FlatterConfetti",
[0x080E0D75] = "FlatterSpotlight",
[0x080E0E95] = "ReversalOrb",
[0x080E186D] = "YawnCloud",
[0x080E1929] = "SmokeBallEscapeCloud",
[0x080E20D5] = "RoarNoiseLine",
[0x080E24E1] = "AssistPawprint",
[0x080E2775] = "SmellingSaltsHand",
[0x080E29F1] = "SmellingSaltExclamation",
[0x080E2AB1] = "HelpingHandClap",
[0x080E2F15] = "ForesightMagnifyingGlass",
[0x080E321D] = "MeteorMashStar",
[0x080E34D1] = "BlockX",
[0x080E4335] = "KnockOffStrike",
[0x080E43A5] = "Recycle",
[0x080F1B3D] = "SpriteCB_SafariBaitOrRock_Init",
}
Versions.ANIM_TASK_NAMES = {
[0x08076049] = "AlphaFadeIn",
[0x0807616D] = "BlendMonInAndOut",
[0x08076289] = "BlendPalInAndOutByTag",
[0x080766B9] = "GetFrustrationPowerLevel",
[0x08077031] = "AttackerPunchWithTrace",
[0x080783FD] = "FrozenIceCube",
[0x08078695] = "StatsChange",
[0x080989F9] = "ShakeMon",
[0x08098B1D] = "ShakeMon2",
[0x08098CD1] = "ShakeMonInPlace",
[0x08098E91] = "ShakeAndSinkMon",
[0x08098F85] = "TranslateMonElliptical",
[0x0809907D] = "TranslateMonEllipticalRespectSide",
[0x0809949D] = "WindUpLunge",
[0x080995FD] = "SlideOffScreen",
[0x08099705] = "SwayMon",
[0x080998B1] = "ScaleMonAndRestore",
[0x08099981] = "RotateMonSpriteToSide",
[0x08099A79] = "RotateMonToSideAndRestore",
[0x08099BD5] = "ShakeTargetBasedOnMovePowerOrDmg",
[0x080A2501] = "CreateSmallSolarBeamOrbs",
[0x080A28C5] = "SporeDoubleBattle",
[0x080A2F0D] = "ShrinkTargetCopy",
[0x080A39C1] = "LeafBlade",
[0x080A41C5] = "CycleMagicalLeafPal",
[0x080A5695] = "SkullBashPosition",
[0x080A5CD5] = "ConversionAlphaBlend",
[0x080A5DE1] = "Conversion2AlphaBlend",
[0x080A5FC1] = "MoonlightEndFade",
[0x080A63B5] = "DoubleTeam",
[0x080A65E9] = "MusicNotesRainbowBlend",
[0x080A66A1] = "MusicNotesClearRainbowBlend",
[0x080A70A1] = "Withdraw",
[0x080A76F1] = "AirCutterProjectile",
[0x080A7FB1] = "GrowAndGrayscale",
[0x080A8075] = "Minimize",
[0x080A8339] = "Splash",
[0x080A84B5] = "GrowAndShrink",
[0x080A8639] = "ThrashMoveMonHorizontal",
[0x080A86A5] = "ThrashMoveMonVertical",
[0x080A8875] = "SketchDrawMon",
[0x080A917D] = "AttackerStretchAndDisappear",
[0x080A9211] = "ExtremeSpeedImpact",
[0x080A939D] = "ExtremeSpeedMonReappear",
[0x080A94AD] = "SpeedDust",
[0x080A96B5] = "LoadMusicNotesPals",
[0x080A9761] = "FreeMusicNotesPals",
[0x080A98B1] = "FakeOut",
[0x080A9A21] = "StretchTargetUp",
[0x080A9AB1] = "StretchAttackerUp",
[0x080A9CE9] = "HeartsBackground",
[0x080A9F11] = "ScaryFace",
[0x080AA7C9] = "UproarDistortion",
[0x080AAB7D] = "IsFuryCutterHitRight",
[0x080AABA1] = "GetFuryCutterHitCount",
[0x080AABC1] = "CreateRaindrops",
[0x080AAF61] = "RotateAuroraRingColors",
[0x080AB101] = "StartSinAnimTimer",
[0x080AB38D] = "CreateSurfWave",
[0x080ABB29] = "WaterSpoutLaunch",
[0x080AC00D] = "WaterSpoutRain",
[0x080AC329] = "WaterSport",
[0x080ACEA5] = "EruptionLaunchRocks",
[0x080AD801] = "MoveHeatWaveTargets",
[0x080ADAA5] = "BlendBackground",
[0x080ADAD9] = "ShakeTargetInPattern",
[0x080AE221] = "ElectricBolt",
[0x080AE541] = "ElectricChargingParticles",
[0x080AE8A1] = "VoltTackleAttackerReappear",
[0x080AEA11] = "VoltTackleBolt",
[0x080AECE1] = "ShockWaveProgressingBolt",
[0x080AEFA1] = "ShockWaveLightning",
[0x080AFAE5] = "HazeScrollingFog",
[0x080AFD81] = "MistBallFog",
[0x080B038D] = "Hail",
[0x080B0871] = "GetRolloutCounter",
[0x080B1531] = "MoveSkyUppercutBg",
[0x080B194D] = "AnimateGustTornadoPalette",
[0x080B2869] = "DrillPeckHitSplats",
[0x080B3419] = "MeditateStretchAttacker",
[0x080B3481] = "Teleport",
[0x080B3585] = "ImprisonOrbs",
[0x080B3835] = "SkillSwap",
[0x080B3A59] = "ExtrasensoryDistortion",
[0x080B3C79] = "TransparentCloneGrowAndShrink",
[0x080B4811] = "LoadSandstormBackground",
[0x080B4BD1] = "Rollout",
[0x080B5149] = "GetSeismicTossDamageLevel",
[0x080B5189] = "MoveSeismicTossBg",
[0x080B51ED] = "SeismicTossBgAccelerateDownAtEnd",
[0x080B54E9] = "NightShadeClone",
[0x080B58AD] = "NightmareClone",
[0x080B5AAD] = "SpiteTargetShadow",
[0x080B6021] = "DestinyBondWhiteShadow",
[0x080B63B5] = "CurseStretchingBlackBg",
[0x080B68C9] = "GrudgeFlames",
[0x080B6BBD] = "GhostGetOut",
[0x080B75E1] = "DragonDanceWaver",
[0x080B78E1] = "AttackerFadeToInvisible",
[0x080B79DD] = "AttackerFadeFromInvisible",
[0x080B7A81] = "InitAttackerFadeFromInvisible",
[0x080B7DA5] = "MoveAttackerMementoShadow",
[0x080B8071] = "MoveTargetMementoShadow",
[0x080B85B9] = "InitMementoShadow",
[0x080B8665] = "MementoHandleBg",
[0x080B86ED] = "MetallicShine",
[0x080B8A75] = "SetGrayscaleOrOriginalPal",
[0x080B8B39] = "GetIsDoomDesireHitTurn",
[0x080B8E95] = "DigDownMovement",
[0x080B90ED] = "DigUpMovement",
[0x080B94B5] = "HorizontalShake",
[0x080B97D9] = "IsPowerOver99",
[0x080B9801] = "PositionFissureBgOnBattler",
[0x080B9BDD] = "BlendColorCycle",
[0x080B9CE5] = "BlendColorCycleExclude",
[0x080B9E59] = "BlendColorCycleByTag",
[0x080B9F6D] = "FlashAnimTagWithColor",
[0x080BA0E9] = "InvertScreenColor",
[0x080BA47D] = "ShakeBattleTerrain",
[0x080BA7F9] = "BlendBattleAnimPal",
[0x080BA83D] = "BlendBattleAnimPalExclude",
[0x080BA935] = "SetCamouflageBlend",
[0x080BAA21] = "BlendParticle",
[0x080BAB39] = "HardwarePaletteFade",
[0x080BAB99] = "TraceMonBlended",
[0x080BACED] = "DrawFallingWhiteLinesOnAttacker",
[0x080BB661] = "Flash",
[0x080BB7DD] = "BlendNonAttackerPalettes",
[0x080BB82D] = "StartSlidingBg",
[0x080BB921] = "GetAttackerSide",
[0x080BB94D] = "GetTargetSide",
[0x080BB979] = "GetTargetIsAttackerPartner",
[0x080BB9B1] = "SetAllNonAttackersInvisiblity",
[0x080BBDF1] = "GetBattleTerrain",
[0x080BBE11] = "AllocBackupPalBuffer",
[0x080BBE3D] = "FreeBackupPalBuffer",
[0x080BBE6D] = "CopyPalUnfadedToBackup",
[0x080BBF09] = "CopyPalUnfadedFromBackup",
[0x080BBFA5] = "CopyPalFadedToUnfaded",
[0x080BC02D] = "IsContest",
[0x080BC061] = "SetAnimAttackerAndTargetForEffectTgt",
[0x080BC091] = "IsTargetSameSide",
[0x080BC0DD] = "SetAnimTargetToBattlerTarget",
[0x080BC0FD] = "SetAnimAttackerAndTargetForEffectAtk",
[0x080BC12D] = "SetAttackerInvisibleWaitForSignal",
[0x080DCE11] = "SoundTask_FireBlast",
[0x080DCF39] = "SoundTask_LoopSEAdjustPanning",
[0x080DD06D] = "SoundTask_PlayCryHighPitch",
[0x080DD149] = "SoundTask_PlayDoubleCry",
[0x080DD2F5] = "SoundTask_WaitForCry",
[0x080DD335] = "SoundTask_PlayCryWithEcho",
[0x080DD3DD] = "SoundTask_PlaySE1WithPanning",
[0x080DD411] = "SoundTask_PlaySE2WithPanning",
[0x080DD445] = "SoundTask_AdjustPanningVar",
[0x080DE34D] = "SmokescreenImpact",
[0x080DE6F1] = "SetPsychicBackground",
[0x080DE7B5] = "FadeScreenToWhite",
[0x080DEAB5] = "IsTargetPlayerSide",
[0x080DEAF1] = "IsHealingMove",
[0x080DEDD9] = "CreateSpotlight",
[0x080DEE79] = "RemoveSpotlight",
[0x080DEF9D] = "RapinSpinMonElevation",
[0x080DF1DD] = "TormentAttacker",
[0x080DF525] = "DefenseCurlDeformMon",
[0x080DF849] = "StockpileDeformMon",
[0x080DF8A1] = "SpitUpDeformMon",
[0x080DF965] = "SwallowDeformMon",
[0x080DF9BD] = "TransformMon",
[0x080DFBE5] = "IsMonInvisible",
[0x080DFC25] = "CastformGfxChange",
[0x080DFC51] = "MorningSunLightBeam",
[0x080E017D] = "DoomDesireLightBeam",
[0x080E0489] = "StrongFrustrationGrowAndShrink",
[0x080E0559] = "RockMonBackAndForth",
[0x080E0851] = "FlailMovement",
[0x080E0B01] = "PainSplitMovement",
[0x080E0FB9] = "RolePlaySilhouette",
[0x080E12F9] = "AcidArmor",
[0x080E1705] = "DeepInhale",
[0x080E1C49] = "SlideMonForFocusBand",
[0x080E1D5D] = "SquishAndSweatDroplets",
[0x080E1FC5] = "FacadeColorBlend",
[0x080E2085] = "StatusClearedEffect",
[0x080E21CD] = "GlareEyeDots",
[0x080E2519] = "BarrageBall",
[0x080E28DD] = "SmellingSaltsSquish",
[0x080E2CE5] = "HelpingHandAttackerMovement",
[0x080E3295] = "MonToSubstitute",
[0x080E3665] = "OdorSleuthMovement",
[0x080E38D9] = "GetReturnPowerLevel",
[0x080E392D] = "SnatchOpposingMonMove",
[0x080E3FC1] = "SnatchPartnerMove",
[0x080E4161] = "TeeterDanceMovement",
[0x080E44ED] = "GetWeather",
[0x080E4541] = "SlackOffSquish",
[0x080EF0B5] = "LoadHealthboxPalsForLevelUp",
[0x080EF181] = "FreeHealthboxPalsForLevelUp",
[0x080EF1A1] = "FlashHealthboxOnLevelUp",
[0x080EF299] = "SwitchOutShrinkMon",
[0x080EF345] = "SwitchOutBallEffect",
[0x080EF491] = "LoadBallGfx",
[0x080EF4B9] = "FreeBallGfx",
[0x080EF4E1] = "IsBallBlockedByTrainerOrDodged",
[0x080EF5AD] = "ThrowBall",
[0x080EF6D5] = "ThrowBallSpecial",
[0x080F1421] = "SwapMonSpriteToFromSubstitute",
[0x080F15C9] = "SubstituteFadeToInvisible",
[0x080F16CD] = "IsAttackerBehindSubstitute",
[0x080F1701] = "SetTargetToEffectBattler",
[0x080F1AE1] = "LoadBaitGfx",
[0x080F1B15] = "FreeBaitGfx",
[0x080F1C8D] = "SafariOrGhost_DecideAnimSides",
[0x080F1CE5] = "SafariGetReaction",
[0x080F1D15] = "GetTrappedMoveAnimId",
[0x080F1D7D] = "GetBattlersFromArg",
}
Versions.BATTLE_ANIM_STATUS_NAMES = {
[0] = "STATUS_PSN",
[1] = "STATUS_CONFUSION",
[2] = "STATUS_BRN",
[3] = "STATUS_INFATUATION",
[4] = "STATUS_SLP",
[5] = "STATUS_PRZ",
[6] = "STATUS_FRZ",
[7] = "STATUS_CURSED",
[8] = "STATUS_NIGHTMARE",
}
Versions.BATTLE_ANIM_GENERAL_NAMES = {
[0] = "CASTFORM_CHANGE",
[1] = "STATS_CHANGE",
[2] = "SUBSTITUTE_FADE",
[3] = "SUBSTITUTE_APPEAR",
[4] = "BAIT_THROW",
[5] = "ITEM_KNOCKOFF",
[6] = "TURN_TRAP",
[7] = "HELD_ITEM_EFFECT",
[8] = "SMOKEBALL_ESCAPE",
[9] = "FOCUS_BAND",
[10] = "RAIN_CONTINUES",
[11] = "SUN_CONTINUES",
[12] = "SANDSTORM_CONTINUES",
[13] = "HAIL_CONTINUES",
[14] = "LEECH_SEED_DRAIN",
[15] = "MON_HIT",
[16] = "ITEM_STEAL",
[17] = "SNATCH_MOVE",
[18] = "FUTURE_SIGHT_HIT",
[19] = "DOOM_DESIRE_HIT",
[20] = "FOCUS_PUNCH_SETUP",
[21] = "INGRAIN_HEAL",
[22] = "WISH_HEAL",
[23] = "MON_SCARED",
[24] = "GHOST_GET_OUT",
[25] = "SILPH_SCOPED",
[26] = "ROCK_THROW",
[27] = "SAFARI_REACTION",
}
Versions.BATTLE_ANIM_SPECIAL_NAMES = {
[0] = "LVL_UP",
[1] = "SWITCH_OUT_PLAYER_MON",
[2] = "SWITCH_OUT_OPPONENT_MON",
[3] = "BALL_THROW",
[4] = "BALL_THROW_WITH_TRAINER",
[5] = "SUBSTITUTE_TO_MON",
[6] = "MON_TO_SUBSTITUTE",
}
-- Wild encounters (FireRed USA 1.0): gWildMonHeaders[] — 20-byte entries,
-- terminated by mapGroup/mapNum = 0xFF. Verified via Route 1 land fingerprint.
Versions.WILD_MON_HEADERS = 0x3C9CB8
Versions.WILD_MON_HEADER_SIZE = 20
Versions.LAND_WILD_COUNT = 12
Versions.WATER_WILD_COUNT = 5
Versions.ROCK_WILD_COUNT = 5
Versions.FISH_WILD_COUNT = 10
-- Field-effect graphics & palettes (FireRed USA 1.0)
Versions.FIELD_EFFECT_TALL_GRASS = 0x39A008 -- gFieldEffectObjectPic_TallGrass
Versions.FIELD_EFFECT_PAL_GENERAL_1 = 0x398FC8 -- gFieldEffectObjectPalette1
Versions.FIELD_EFFECT_PAL_GENERAL_0 = 0x398FA8 -- gFieldEffectObjectPalette0
Versions.FIELD_EFFECT_PAL_PLAYER = 0x35B968 -- gObjectEventPal_Player (surf blob, etc.)
Versions.FIELD_EFFECTS = {
tall_grass = { pic = 0x39A008, pal = 0x398FC8, w = 16, h = 16, frames = 5 },
cut_grass = { pic = 0x398648, pal = 0x398FC8, w = 8, h = 8, frames = 1 },
-- pokefirered/src/fldeff_rocksmash.c:108 (gObjectEventPic_RockSmashRock)
rock_smash = { pic = 0x3947A8, pal = 0x36D888, w = 16, h = 16, frames = 4 },
surf_blob = { pic = 0x396B08, pal = 0x35B968, w = 32, h = 32, frames = 6 },
-- pokefirered/src/data/field_effects/field_effect_objects.h:1099
fly_bird = { pic = 0x39D3C8, pal = 0x35B968, w = 64, h = 64, frames = 5 },
-- pokefirered/src/data/field_effects/field_effect_objects.h:99
ripple = { pic = 0x3986A8, pal = 0x398FC8, w = 16, h = 16, frames = 5 },
-- pokefirered/src/data/field_effects/field_effect_objects.h:565
splash = { pic = 0x39AC48, pal = 0x398FA8, w = 16, h = 8, frames = 2 },
-- pokefirered/src/data/field_effects/field_effect_objects.h:1203
hot_springs_water = { pic = 0x39C508, pal = 0x398FC8, w = 16, h = 16, frames = 1 },
emoticons = { pic = 0x3C6AC8, pal = 0x35B968, w = 16, h = 16, frames = 15 },
-- pokefirered/src/field_effect.c:326
pokeball_glow = {
pic = 0x3CAF90, pal = 0x3CAFB0, w = 8, h = 8, frames = 1, indexed = true,
},
-- pokefirered/src/field_effect.c:336
pokemoncenter_monitor = {
pic = 0x3CAFD0, pal = 0x3CAFB0, w = 32, h = 16, frames = 4,
},
-- pokefirered/src/field_effect.c:3963 sImages_DeoxysRockFragment
-- (graphics/field_effects/pics/deoxys_rock_fragment_*.png, 4x 8x8 4bpp).
-- The palette is sDeoxysObjectPals[10] (0x3F6206 + 10*32), the fully
-- awakened red ramp step — the puzzle is always solved by the time the rock
-- shatters, so the shards are always red.
deoxys_rock_fragments = {
pic = 0x3CBDB0, pal = 0x3F6346, w = 8, h = 8, frames = 4,
},
}
-- Battle interface chrome (FireRed USA 1.0 file offsets; LZ unless noted).
-- Healthbox pals are uncompressed INCBIN_U16 (pret graphics.c); matched to healthbox.pal.
-- Terrain grass: sBattleTerrainPalette/Tiles/Tilemap_Grass (battle_bg.c).
Versions.BATTLE_UI = {
textbox_gfx = 0xD00000, -- gBattleInterface_Textbox_Gfx LZ → 8192
textbox_pal = 0xD004D8, -- LZ → 64 (2×16 colors)
textbox_tilemap = 0xD0051C, -- LZ → 4096 (32×64 tiles)
healthbox_elements = 0xD11BC4, -- uncompressed 320×24 4bpp
healthbox_player = 0xD1F340, -- gHealthboxSinglesPlayerGfx LZ → 4096
healthbox_enemy = 0xD1F604, -- gHealthboxSinglesOpponentGfx LZ → 2048
healthbox_safari = 0xD1FABC, -- src/graphics.c:620
healthbox_doubles_player = 0xD1F794, -- gHealthboxDoublesPlayerGfx LZ → 2048
healthbox_doubles_opponent = 0xD1F928, -- gHealthboxDoublesOpponentGfx LZ → 2048
healthbox_pal = 0xD11B84, -- uncompressed 32 (gBattleInterface_Healthbox_Pal)
healthbar_pal = 0xD11BA4, -- uncompressed 32 (gBattleInterface_Healthbar_Pal)
font_bold_glyphs = 0x22FC48, -- uncompressed 8192 2bpp (sFontBoldJapaneseGlyphs, src/text.c:384)
terrain_grass = {
pal = 0x248400, -- LZ → 96 (3 banks)
tiles = 0x24844C, -- LZ → 3136
tilemap = 0x2489A8, -- LZ → 4096 (32×32)
},
-- Indoor / lab (MAP_TYPE_INDOOR → BATTLE_TERRAIN_BUILDING)
terrain_building = {
pal = 0x24DDF0, -- LZ → 96
tiles = 0x24DE34, -- LZ → 2464
tilemap = 0x24E16C, -- LZ → 4096
},
party_summary_bar = 0xE7BB04, -- gBattleInterface_PartySummaryBar_Gfx LZ → 512
}
Versions.BALL_OPEN = {
particle_sheets = 0x40BF48, -- pokefirered/src/battle_anim_special.c:117
particle_palettes = 0x40BFA8, -- pokefirered/src/battle_anim_special.c:133
fade_colors = 0x40C1C4, -- pokefirered/src/battle_anim_special.c:345
sine_table = 0x25E074, -- pokefirered/src/trig.c:4
}
-- Battle field→battle transitions (FireRed USA 1.0; uncompressed INCBINs in
-- battle_transition.c). Fingerprinted vs pret graphics/battle_transitions/*.
Versions.BATTLE_TRANSITION = {
big_pokeball_gfx = 0x3F87A0, -- 32×88 4bpp (44 tiles)
sliding_pokeball_bin = 0x3F8D20, -- 64 B paint tile
sliding_pokeball_gfx = 0x3F8D60, -- 32×32 4bpp
mugshot_banner_gfx = 0x3F8F60, -- 120×8 4bpp
-- unused_brendan / unused_lass at 0x3F9140 / 0x3F9940 (not extracted)
grid_square_gfx = 0x3FA140, -- 8×120 4bpp (15 shrink frames)
sliding_pokeball_pal = 0x3FA638, -- 16 colors (shared big/trail)
mugshot_pals = {
lorelei = 0x3FA660,
bruno = 0x3FA680,
agatha = 0x3FA6A0,
lance = 0x3FA6C0,
blue = 0x3FA6E0,
red = 0x3FA700, -- player male strip colors
green = 0x3FA720, -- player female strip colors
},
big_pokeball_tilemap = 0x3FA784, -- 20×30 u16
vsbar_tilemap = 0x3FAC34, -- 20×32 u16
}
Versions.MON_BACK_PIC_TABLE = 0x23654C -- gMonBackPicTable
Versions.GHOST_PALETTE = 0xE93B14 -- pokefirered/src/graphics.c:1135
Versions.GHOST_FRONT_PIC = 0xE93B38 -- pokefirered/src/graphics.c:1136
-- Trainer graphics / tables (FireRed USA 1.0 file offsets).
Versions.TRAINER_FRONT_PIC_TABLE = 0x23957C
Versions.TRAINER_FRONT_PIC_PAL_TABLE = 0x239A1C
Versions.TRAINER_BACK_PIC_TABLE = 0x239FA4
Versions.TRAINER_BACK_PIC_PAL_TABLE = 0x239FD4
Versions.TRAINERS_TABLE = 0x23EAC8
Versions.TRAINER_STRIDE = 0x28
Versions.TRAINER_CLASS_NAMES = 0x23E558
Versions.TRAINER_CLASS_NAME_STRIDE = 13
Versions.TRAINER_CLASS_COUNT = 107
Versions.TRAINER_PIC_COUNT = 148
Versions.TRAINERS_COUNT = 743 -- pret NUM_TRAINERS
-- Party menu chrome (LZ-compressed; FireRed USA 1.0).
Versions.PARTY_MENU_BG_GFX = 0xE82700 -- gPartyMenuBg_Gfx
Versions.PARTY_MENU_BG_PAL = 0xE829C8 -- gPartyMenuBg_Pal
Versions.PARTY_MENU_BG_TILEMAP = 0xE82AB0 -- gPartyMenuBg_Tilemap
Versions.PARTY_MENU_BALL_GFX = 0xE82BE8 -- gPartyMenuPokeball_Gfx
Versions.PARTY_MENU_BALL_PAL = 0xE82E7C -- gPartyMenuPokeball_Pal
-- Pokémon Summary Screen (LZ-compressed & raw; FireRed USA 1.0).
Versions.SUMMARY_BG_GFX = 0xE9A460 -- gSummaryScreen_Gfx (LZ 4bpp, 16384 bytes)
Versions.SUMMARY_BG_PAL = 0xE9B310 -- gSummaryScreen_Pal (7 banks, 224 bytes)
Versions.SUMMARY_EXP_BAR_GFX = 0xE9B3F0 -- gSummaryExpBar_Gfx (LZ 4bpp, 384 bytes)
Versions.SUMMARY_HP_BAR_GFX = 0xE9B4B8 -- gSummaryHpBar_Gfx (LZ 4bpp, 384 bytes)
Versions.SUMMARY_HP_EXP_PAL = 0xE9B578 -- gSummaryBar_Pal (32 bytes)
Versions.SUMMARY_PAGE_INFO_TILEMAP = 0xE9B598 -- gSummaryPage_Info_Tilemap (LZ 32x20, 1280 bytes)
Versions.SUMMARY_PAGE_SKILLS_TILEMAP = 0xE9B750 -- gSummaryPage_Skills_Tilemap (LZ 32x20, 1280 bytes)
Versions.SUMMARY_PAGE_MOVES_TILEMAP = 0xE9B950 -- gSummaryPage_Moves_Tilemap (LZ 32x32, 2048 bytes)
Versions.SUMMARY_PAGE_MOVES_INFO_TILEMAP = 0xE9BA9C -- gSummaryPage_MovesInfo_Tilemap (LZ 32x20, 1280 bytes)
Versions.SUMMARY_PAGE_EGG_TILEMAP = 0xE9BBCC -- gSummaryPage_Egg_Tilemap (LZ 32x20, 1280 bytes)
Versions.SUMMARY_PAGE_MOVES_INFO_BASE_TILEMAP = 0x463B88 -- sBgTilemap_MovesInfoPage (LZ 32x20, 1280 bytes)
Versions.SUMMARY_PAGE_MOVES_BASE_TILEMAP = 0x463C80 -- sBgTilemap_MovesPage (LZ 32x32, 2048 bytes)
Versions.KEYPAD_ICONS_GFX = 0x1EA700 -- gKeypadIconTiles (4bpp, 2048 bytes = 128x32)
Versions.SUMMARY_STATUS_ICONS_GFX = 0xE82EA0 -- gStatusGfx_Icons (LZ 4bpp, 1024 bytes)
Versions.SUMMARY_STATUS_ICONS_PAL = 0xE9BF28 -- gSummaryStatus_Pal (32 bytes)
Versions.SUMMARY_CURSOR_LEFT_GFX = 0x463740 -- sMoveSelectionCursor_Left_Gfx (288 bytes)
Versions.SUMMARY_CURSOR_RIGHT_GFX = 0x46386C -- sMoveSelectionCursor_Right_Gfx (288 bytes)
Versions.SUMMARY_CURSOR_PAL = 0x463720 -- sMoveSelectionCursor_Pal (32 bytes)
Versions.SUMMARY_SHINY_STAR_GFX = 0x463B64 -- sShinyStar_Gfx (64 bytes)
Versions.SUMMARY_SHINY_STAR_PAL = 0x463B44 -- sShinyStar_Pal (32 bytes)
Versions.SUMMARY_POKERUS_GFX = 0x463B20 -- sPokerus_Gfx (64 bytes)
Versions.SUMMARY_POKERUS_PAL = 0x463B00 -- sPokerus_Pal (32 bytes)
Versions.SUMMARY_HP_BAR_YELLOW_PAL = 0x463AAC -- sHpBar_Yellow_Pal (32 bytes)
Versions.SUMMARY_HP_BAR_RED_PAL = 0x463ACC -- sHpBar_Red_Pal (32 bytes)
Versions.MENU_INFO_GFX = 0xE95DDC -- gMenuInfoElements_Gfx (4bpp 128x128, 8192 bytes)
Versions.MENU_INFO_PAL = 0xE95D9C -- gMenuInfoElements1_Pal + gMenuInfoElements2_Pal (64 bytes)
-- Bag / item-menu chrome + item icons (LZ; FireRed USA 1.0).
Versions.BAG_BG_GFX = 0xE830CC -- gBagBg_Gfx
Versions.BAG_BG_TILEMAP = 0xE832C0 -- gBagBg_Tilemap
Versions.BAG_BG_ITEM_PC_TILEMAP = 0xE83444 -- gBagBg_ItemPC_Tilemap
Versions.BAG_BG_PAL = 0xE835B4 -- gBagBgPalette (3 banks)
Versions.BAG_BG_PAL_FEMALE = 0xE83604 -- gBagBgPalette_FemaleOverride
Versions.BAG_MALE_GFX = 0xE8362C -- gBagMale_Gfx (64×256)
Versions.BAG_FEMALE_GFX = 0xE83DBC -- gBagFemale_Gfx
Versions.BAG_SPRITE_PAL = 0xE84560 -- gBag_Pal
Versions.BAG_SWAP_GFX = 0xE84588 -- gSwapLine_Gfx
Versions.BAG_SWAP_PAL = 0xE845C8 -- gSwapLine_Pal
Versions.BAG_LIST_TILEMAP = 0x452D08 -- sItemListTilemap (raw u16 18x12)
Versions.BAG_LIST_TILES_W = 18
Versions.BAG_LIST_TILES_H = 12
Versions.BAG_LIST_BLANK_TILE = 0x02D -- src/item_menu.c:1163
Versions.RED_ARROW_PAL = 0x463308 -- sRedArrowPal (raw 32 bytes)
Versions.RED_ARROW_OTHER_GFX = 0x463328 -- sRedArrowOtherGfx (LZ 4bpp 16x32)
-- TM Case (LZ-compressed & raw; FireRed USA 1.0).
Versions.TM_CASE_BG_GFX = 0xE845D8 -- gTMCase_Gfx (LZ 4bpp, 2912 bytes)
Versions.TM_CASE_MENU_TILEMAP = 0xE84A24 -- gTMCaseMenu_Tilemap (LZ 32x32, 2048 bytes)
Versions.TM_CASE_BG_TILEMAP = 0xE84B70 -- gTMCase_Tilemap (LZ 32x32, 2048 bytes)
Versions.TM_CASE_MENU_MALE_PAL = 0xE84CB0 -- gTMCaseMenu_Male_Pal (LZ 4 banks, 128 bytes)
Versions.TM_CASE_MENU_FEMALE_PAL = 0xE84D20 -- gTMCaseMenu_Female_Pal (LZ 4 banks, 128 bytes)
Versions.TM_CASE_DISC_GFX = 0xE84D90 -- gTMCaseDisc_Gfx (LZ 4bpp, 1024 bytes)
Versions.TM_CASE_DISC_TYPES1_PAL = 0xE84F20 -- gTMCaseDiscTypes1_Pal (LZ 16 banks, 512 bytes)
Versions.TM_CASE_DISC_TYPES2_PAL = 0xE85068 -- gTMCaseDiscTypes2_Pal (LZ 1 bank, 32 bytes)
Versions.TM_CASE_HM_GFX = 0xE99138 -- gTMCaseHM_Gfx (raw 4bpp, 96 bytes)
-- Berry Pouch (LZ-compressed; FireRed USA 1.0).
Versions.BERRY_POUCH_SPRITE_GFX = 0xE8560C -- gBerryPouchSpriteTiles (LZ 4bpp 64x64, 2048 bytes)
Versions.BERRY_POUCH_BG_GFX = 0xE859D0 -- gBerryPouchBgGfx (LZ 4bpp, 1664 bytes)
Versions.BERRY_POUCH_BG_PAL = 0xE85BA4 -- gBerryPouchBgPals (LZ 3 banks, 96 bytes)
Versions.BERRY_POUCH_BG_PAL_FEMALE = 0xE85BF4 -- gBerryPouchBgPal0FemaleOverride (LZ 1 bank, 32 bytes)
Versions.BERRY_POUCH_SPRITE_PAL = 0xE85C1C -- gBerryPouchSpritePalette (LZ 1 bank, 32 bytes)
Versions.BERRY_POUCH_BG_TILEMAP = 0xE85C44 -- gBerryPouchBg1Tilemap (LZ 32x32, 2048 bytes)
-- Trainer Card (LZ-compressed & raw; FireRed USA 1.0).
Versions.TRAINER_CARD_BG_TILES = 0xE991F8 -- gKantoTrainerCard_Gfx (LZ 4bpp, 6144 bytes)
Versions.TRAINER_CARD_FRONT_MAP = 0x3CC6F0 -- sKantoTrainerCardFront_Tilemap (LZ 30x20, 1200 bytes)
Versions.TRAINER_CARD_BG_MAP = 0x3CCEC8 -- sKantoTrainerCardBg_Tilemap (LZ 30x20, 1200 bytes)
Versions.TRAINER_CARD_PAL = 0xE99198 -- gKantoTrainerCardBlue_Pal (3 banks, 96 bytes)
Versions.TRAINER_CARD_FEMALE_PAL = 0x3CD2A0 -- sKantoTrainerCardFemaleBg_Pal (1 bank, 32 bytes)
Versions.TRAINER_CARD_BADGES_TILES = 0x3CD5E8 -- sKantoTrainerCardBadges_Gfx (LZ 4bpp, 1024 bytes)
Versions.TRAINER_CARD_BADGES_PAL = 0x3CD2E0
Versions.TRAINER_CARD_BACK_MAP = 0x3CC984
Versions.TRAINER_CARD_FRONT_LINK_MAP = 0x3CCCA4
Versions.TRAINER_CARD_GREEN_PAL = 0x3CCFE0
Versions.TRAINER_CARD_BRONZE_PAL = 0x3CD0A0
Versions.TRAINER_CARD_SILVER_PAL = 0x3CD160
Versions.TRAINER_CARD_GOLD_PAL = 0x3CD220
Versions.TRAINER_CARD_STAR_PAL = 0x3CD300
Versions.TRAINER_CARD_STICKERS_TILES = 0x3CC368
Versions.TRAINER_CARD_STICKER_PAL1 = 0x3CD320
Versions.TRAINER_CARD_STICKER_PAL2 = 0x3CD340
Versions.TRAINER_CARD_STICKER_PAL3 = 0x3CD360
Versions.TRAINER_CARD_STICKER_PAL4 = 0x3CD380
Versions.TRAINER_CARD_STAR_TILE = 143 -- src/trainer_card.c:1553
Versions.TRAINER_PIC_RED = 135
Versions.TRAINER_PIC_LEAF = 136
Versions.SHOP_BG_GFX = 0xE85DC8 -- gBuyMenuFrame_Gfx
Versions.SHOP_BG_TILEMAP = 0xE85EFC -- gBuyMenuFrame_Tilemap
Versions.SHOP_BG_TM_TILEMAP = 0xE86038 -- gBuyMenuFrame_TmHmTilemap
Versions.SHOP_BG_PAL = 0xE86170 -- gBuyMenuFrame_Pal
Versions.ITEM_ICON_TABLE = 0x3D4294 -- sItemIconTable[ITEMS_COUNT+1]
Versions.ITEMS_COUNT = 375 -- pret ITEMS_COUNT (table rows = +1)
-- Door animation graphics (sDoorGraphics[] from field_door.c; FireRed USA 1.0 file offsets).
-- Table layout: 12 bytes/entry: u32(metatileId|isLarge<<16) | ptr_tiles | ptr_pal
-- Verified by matching known metatile-ID sequence from DOOR_ENTRIES (0x03D/0x062/0x15B...).
Versions.DOOR_GRAPHICS_TABLE = 0x35B5D8 -- sDoorGraphics[32]
Versions.DOOR_GRAPHICS_COUNT = 32 -- entries in the table
-- src/slot_machine.c:399, :739
Versions.SLOT_REEL_ICONS_PAL = 0x464974
Versions.SLOT_REEL_ICONS_GFX = 0x464A14
Versions.SLOT_CLEFAIRY_PAL = 0x46504C
Versions.SLOT_CLEFAIRY_GFX = 0x46506C
Versions.SLOT_DIGITS_PAL = 0x465524
Versions.SLOT_DIGITS_GFX = 0x465544
Versions.SLOT_BG_PAL = 0x465930
Versions.SLOT_BG_GFX = 0x4659D0
Versions.SLOT_BG_TILEMAP = 0x4661D4
Versions.SLOT_MATCH_LINES_PAL = 0x4664BC
Versions.SLOT_PAYOUT_LIGHTS_PAL = 0x4664DC
Versions.SLOT_BUTTON_PRESSED_GFX = 0x46653C
Versions.SLOT_COMBOS_WINDOW_PAL = 0x4665C0
Versions.SLOT_COMBOS_WINDOW_GFX = 0x466620
Versions.SLOT_COMBOS_WINDOW_TILEMAP = 0x466998
-- src/slot_machine.c:429, :857
Versions.SLOT_REEL_ICON_PAL_TAGS = 0x465608
Versions.SLOT_REEL_BUTTON_MAP_IDXS = 0x466C40
Versions.SLOT_REELS = 3
Versions.SLOT_BUTTON_TILES = 4
-- src/trade_scene.c:151
Versions.TRADE_POKEBALL_PAL = 0x26205C
Versions.TRADE_POKEBALL_GFX = 0x26207C
Versions.TRADE_CABLE_CLOSEUP_MAP = 0x26407C
Versions.TRADE_GBA_PAL = 0x26499C
Versions.TRADE_LINK_MON_PAL = 0x2649FC
Versions.TRADE_LINK_MON_GLOW_GFX = 0x264A1C
Versions.TRADE_LINK_MON_SHADOW_GFX = 0x264C1C
Versions.TRADE_CABLE_END_GFX = 0x264E1C
Versions.TRADE_GBA_SCREEN_GFX = 0x26501C
Versions.TRADE_GBA_MAP_WIRELESS = 0x269A5C
Versions.TRADE_GBA_MAP_CABLE = 0x26AA5C
Versions.TRADE_GBA_GFX = 0xEAEA80
Versions.TRADE_GBA_PAL2 = 0xEAEA20
-- src/trade_scene.c:398
Versions.TRADE_GBA_SCREEN_ANIM = 0x26CED8
-- src/link_rfu_3.c:34
Versions.WIRELESS_ICON_PAL = 0x43EEC0
Versions.WIRELESS_ICON_GFX = 0x43EEE0
-- src/wireless_communication_status_screen.c:50
Versions.WIRELESS_STATUS_PALS = 0x46F4D0
Versions.WIRELESS_STATUS_GFX = 0x46F6D0
Versions.WIRELESS_STATUS_TILEMAP = 0x46F8E0
-- src/union_room_chat_display.c:1262, src/union_room_chat_objects.c:30
Versions.UR_CHAT_BG_PAL = 0xEA1700
Versions.UR_CHAT_BG_GFX = 0xEA1720
Versions.UR_CHAT_BG_TILEMAP = 0xEA1958
Versions.UR_CHAT_ICONS_GFX = 0xEA1A50
Versions.UR_CHAT_PANEL_PAL = 0xEAA9F0
Versions.UR_CHAT_PANEL_GFX = 0xEAAA10
Versions.UR_CHAT_PANEL_TILEMAP = 0xEAAA6C
Versions.UR_CHAT_OBJECTS_PAL = 0x45AC14
Versions.UR_CHAT_SELECTOR_GFX = 0x45AC34
Versions.UR_CHAT_TEXT_CURSOR_GFX = 0x45AEB8
Versions.UR_CHAT_CHAR_CURSOR_GFX = 0x45AED8
Versions.UR_CHAT_R_BUTTON_GFX = 0x45AF04
-- src/graphics.c:1230, src/fame_checker.c:119
Versions.FAME_BG_PAL = 0xE9F220
Versions.FAME_BG_GFX = 0xE9F260
Versions.FAME_BG3_TILEMAP = 0xEA0700
Versions.FAME_BG2_TILEMAP = 0xEA0F00
Versions.FAME_QUESTION_GFX = 0x45CE00
Versions.FAME_CURSOR_GFX = 0x45D100
Versions.FAME_CURSOR_PAL = 0x45D500
Versions.FAME_FUJI_GFX = 0x45D520
Versions.FAME_FUJI_PAL = 0x45DD20
Versions.FAME_BILL_GFX = 0x45DD40
Versions.FAME_BILL_PAL = 0x45E540
Versions.FAME_DAISY_GFX = 0x45E560
Versions.FAME_DAISY_PAL = 0x45ED60
Versions.FAME_OAK_GFX = 0x45ED80
Versions.FAME_OAK_PAL = 0x45F580
Versions.FAME_SILHOUETTE_PAL = 0x45F5C0
Versions.FAME_TRAINER_PIC_IDXS = 0x45F61C
-- src/fame_checker.c:209, :246, :380, :399
Versions.FAME_NAME_QUOTE_PTRS = 0x45F63C
Versions.FAME_FLAVOR_TEXT_PTRS = 0x45F6BC
Versions.FAME_ORIGIN_LOCATION_PTRS = 0x45F89C
Versions.FAME_ORIGIN_OBJECT_PTRS = 0x45FA1C
Versions.FAME_NONTRAINER_NAME_PTRS = { 0x41E5E9, 0x41E5ED, 0x41E5F3, 0x41E5F8 }
Versions.FAME_PERSON_COUNT = 16
Versions.FAME_FLAVOR_TEXT_COUNT = 6
-- src/graphics.c:1117
Versions.TEACHY_TV_GFX = 0xE86240
Versions.TEACHY_TV_SCREEN_TILEMAP = 0xE86BE8
Versions.TEACHY_TV_TITLE_TILEMAP = 0xE86D6C
Versions.TEACHY_TV_PAL = 0xE86F98
-- src/teachy_tv.c:869
Versions.TEACHY_TV_END_TILES = 0x479590
-- src/mystery_gift_show_card.c:150, src/mystery_gift_show_news.c:99
Versions.WONDER_CARD_GRAPHICS = 0x467FB8
Versions.WONDER_NEWS_GRAPHICS = 0x468720
Versions.WONDER_BG_COUNT = 8
Versions.WONDER_BG_TILE_OFFSET = 8
-- src/trainer_tower.c:105, :191, :204, :382; src/trainer_tower_sets.c:8951
Versions.TRAINER_TOWER_HEADER = 0x4827AC
Versions.TRAINER_TOWER_FLOORS = 0x4827B4
Versions.TRAINER_TOWER_CHALLENGE_TYPES = 4
Versions.TRAINER_TOWER_MAX_FLOORS = 8
Versions.TRAINER_TOWER_TRAINERS_PER_FLOOR = 3
Versions.TT_SINGLES_INFO = 0x479ED8
Versions.TT_SINGLES_INFO_COUNT = 83
Versions.TT_DOUBLES_INFO = 0x47A024
Versions.TT_DOUBLES_INFO_COUNT = 10
Versions.TT_ENCOUNTER_MUSIC_LUT = 0x47A074
Versions.TT_ENCOUNTER_MUSIC_LUT_COUNT = 105
Versions.TT_ENCOUNTER_MUSIC = 0x47A2D2
Versions.TT_ENCOUNTER_MUSIC_COUNT = 14
Versions.FACILITY_CLASS_TO_PIC = 0x2538A8
Versions.FACILITY_CLASS_TO_TRAINER_CLASS = 0x25393E
Versions.FACILITY_CLASS_COUNT = 150
-- src/data/pokemon/tutor_learnsets.h:1, :22
Versions.TUTOR_MOVES = 0x459B60
Versions.TUTOR_LEARNSETS = 0x459B7E
Versions.TUTOR_MOVE_COUNT = 15
-- src/script_menu.c:647, :1161
Versions.MUSEUM_AERODACTYL_GFX = 0x3E0780
Versions.MUSEUM_AERODACTYL_PAL = 0x3E0F80
Versions.MUSEUM_KABUTOPS_GFX = 0x3E0FA0
Versions.MUSEUM_KABUTOPS_PAL = 0x3E17A0
Versions.MUSEUM_FOSSIL_SIZE = 64 -- SPRITE_SIZE(64x64), src/script_menu.c:634
-- src/daycare.c:137, :138, :139
Versions.EGG_PALETTE = 0x25F842
Versions.EGG_HATCH_GFX = 0x25F862
Versions.EGG_SHARD_GFX = 0x260062
-- src/learn_move.c:384 MoveRelearnerLoadBgGfx
Versions.MOVE_RELEARNER_PAL = 0xE97DDC
Versions.MOVE_RELEARNER_GFX = 0xE97DFC
Versions.MOVE_RELEARNER_TILEMAP = 0xE97EC4
-- src/battle_records.c:37, :563 LoadFrameGfxOnBg
Versions.BATTLE_RECORDS_GFX = 0x3F6388
Versions.BATTLE_RECORDS_PAL = 0x3F6448
Versions.BATTLE_RECORDS_TILEMAP = 0x3F6468
-- Title screen + Oak speech graphics (FireRed USA 1.0 file offsets).
-- Verified by matching pret .gbapal bytes + LZ sizes in local dump.
Versions.INTRO = {
-- Oak speech pics: 64×96 8bpp; ROM stores 32-color pal, indices use bank bits.
leaf_pal = 0x460ED4,
leaf_tiles = 0x460F14, -- LZ → 0x1800
red_pal = 0x4615FC,
red_tiles = 0x46163C, -- LZ → 0x1800
oak_pal = 0x461CD4,
oak_tiles = 0x461D14, -- LZ → 0x1800
rival_pal = 0x4623AC,
rival_tiles = 0x4623EC, -- LZ → 0x1800
platform_pal = 0x4629D0, -- 16 colors
platform_tiles = 0x462A10, -- LZ → 0x600 (3×32×32)
-- Title screen
logo_pal = 0xEAB6C4, -- 256 colors
logo_tiles = 0xEAB8C4, -- LZ → 0x4000 (8bpp)
logo_map = 0xEAD390, -- LZ → 0x500 (32×20)
box_pal = 0xEAD5E8, -- 16 colors
box_tiles = 0xEAD608, -- LZ → 0x10E0 (135 tiles 4bpp)
box_map = 0xEADEE4, -- LZ → 0x500
copyright_pal = 0xEAE094, -- 16 colors (bg + press-start)
copyright_tiles = 0xEAE0B4, -- LZ → 0x800
copyright_map = 0xEAE374, -- LZ → 0x500
-- Oak speech scene BG (verified vs pret oak_speech_bg.* LZ)
oak_speech_bg_pal = 0x460568, -- first 16 of shared guide pal
oak_speech_bg_tiles = 0x460CA4, -- LZ → 0x140 (10 tiles)
oak_speech_bg_map = 0x460CE8, -- LZ → 0x500
-- Controls guide + Pikachu intro BG (pret bg_tiles + pikachu_intro/tilemap)
-- Shared pal is 64 colors (4 banks) packed before tiles LZ.
guide_bg_pal = 0x460568, -- 64 colors
guide_bg_tiles = 0x4605E8, -- LZ → 0x1400 (160 tiles)
pikachu_intro_map = 0x460BA8, -- LZ → 0x438 (30×18)
controls_page2_map = 0x460D94, -- 5×16 u16 uncompressed
controls_page3_map = 0x460E34, -- 5×16 u16 uncompressed
stdpal_2 = 0x471E2C, -- GetTextWindowPalette(2); TopBar / chrome rows
-- Pikachu intro sprites (pret pikachu_intro/{body,ears,eyes})
pikachu_pal = 0x4629F0, -- 16 colors
pikachu_body = 0x462B74, -- LZ → 0x400 (32×64, 2 frames)
pikachu_ears = 0x462D34, -- LZ → 0x200 (32×32)
pikachu_eyes = 0x462E18, -- LZ → 0x80 (16×8)
-- Nidoran♀ front (species 29) + poke ball for release anim
-- gMonFrontPicTable @ 0x2350AC; gMonPaletteTable @ 0x23730C (FR USA 1.0)
mon_front_pic_table = 0x2350AC,
mon_palette_table = 0x23730C,
nidoran_f_tiles = 0xD42FB8, -- LZ → 0x800 (64×64); was wrongly 0x4096CC (Bulbasaur)
nidoran_f_pal = 0xD4321C, -- LZ → 0x20
ball_poke_tiles = 0xD01724, -- LZ → 0x180 (16×48)
ball_poke_pal = 0xD017E0, -- LZ → 0x20
}
-- Intro cutscene sequence assets (pokefirered/src/intro.c rodata offsets).
Versions.INTRO_MOVIE = {
copyright_pal = 0x402260,
copyright_tiles = 0x402280, -- LZ → 1248 bytes
copyright_map = 0x4024E4, -- LZ → 2048 bytes (32×32)
gf_bg_pal = 0x402630,
gf_bg_tiles = 0x402650, -- LZ → 96 bytes
gf_bg_map = 0x402668, -- LZ → 1280 bytes (32×20)
gf_logo_pal = 0x40270C,
gf_text_tiles = 0x40272C, -- LZ → 1152 bytes
gf_logo_tiles = 0x4028F8, -- LZ → 1024 bytes
star_pal = 0x402A44,
star_tiles = 0x402A64, -- LZ → 128 bytes
sparkles_pal = 0x402ABC,
sparkles_small_tiles = 0x402ADC, -- LZ → 128 bytes
sparkles_big_tiles = 0x402B2C, -- LZ → 2048 bytes
presents_tiles = 0x402CD4, -- LZ → 256 bytes
scene1_grass_pal = 0x402D34,
scene1_grass_tiles = 0x402D54, -- LZ → 12704 bytes
scene1_grass_map = 0x403FE8, -- LZ → 4096 bytes (64×32)
scene1_bg_pal = 0x4048CC,
scene1_bg_tiles = 0x4048EC, -- LZ → 4352 bytes
scene1_bg_map = 0x404F7C, -- LZ → 4096 bytes (64×32)
scene2_bg_pal = 0x4053B4, -- 96 bytes (3 banks)
scene2_bg_tiles = 0x405414, -- LZ → 2176 bytes
scene2_bg_map = 0x405890, -- LZ → 4096 bytes (64×32)
scene2_plants_pal = 0x405B08,
scene2_plants_tiles = 0x405B28, -- LZ → 544 bytes
scene2_plants_map = 0x405CDC, -- LZ → 1280 bytes (32×20)
gengar_pal = 0x405DA4,
scene2_gengar_close_tiles = 0x405DC4, -- LZ → 3648 bytes
scene2_gengar_close_map = 0x40644C, -- LZ → 2048 bytes (32×32)
scene2_nidorino_close_pal = 0x406634,
scene2_nidorino_close_tiles = 0x406654, -- LZ → 5440 bytes
scene2_nidorino_close_map = 0x4071D0, -- LZ → 2048 bytes (32×32)
scene3_bg_pal = 0x407430, -- 64 bytes (2 banks)
scene3_bg_tiles = 0x407470, -- LZ → 2784 bytes
scene3_bg_map = 0x407A50, -- LZ → 1280 bytes (32×20)
scene3_gengar_anim_tiles = 0x407B9C, -- LZ → 11136 bytes
scene3_gengar_anim_map = 0x408D98, -- LZ → 4096 bytes (64×32)
scene2_gengar_tiles = 0x40926C, -- LZ → 2048 bytes (64×64)
nidorino_pal = 0x4096AC,
scene2_nidorino_tiles = 0x4096CC, -- LZ → 2048 bytes (64×64)
scene3_grass_pal = 0x409A1C,
scene3_grass_tiles = 0x409A3C, -- LZ → 2048 bytes (64×64)
scene3_gengar_static_tiles = 0x409D20, -- LZ → 6144 bytes
scene3_nidorino_tiles = 0x40A3E4, -- LZ → 10240 bytes
scene3_swipe_pal = 0x40B834,
scene3_recoil_dust_pal = 0x40B854,
scene3_swipe_tiles = 0x40B874, -- LZ → 2560 bytes
scene3_recoil_dust_tiles = 0x40BAE0, -- LZ → 512 bytes
}
-- Title screen particle effects (pokefirered/src/title_screen.c).
Versions.TITLE_EFFECTS = {
border_bg_tiles = 0x3BF58C, -- LZ → 128 bytes
border_bg_map = 0x3BF5A8, -- LZ → 1280 bytes
slash_tiles = 0x3BF64C, -- LZ → 2048 bytes
flames_pal = 0x3BF77C, -- 32 bytes
flames_tiles = 0x3BF79C, -- LZ → 1280 bytes
blank_flames_tiles = 0x3BFA14, -- LZ → 1280 bytes
}
-- Naming screen chrome (FireRed USA 1.0). Verified by matching pret LZ/4bpp.
Versions.NAMING = {
keyboard_pal = 0xE97FE4, -- 16 colors
rival_pal = 0xE98004, -- 16 colors
menu_pal = 0xE98024, -- 6×16 banks (menu / page labels / buttons / cursor)
menu_gfx = 0xE980E4, -- LZ → 0x600
background_map = 0xE982BC, -- LZ → 0x500
keyboard_upper_map = 0xE98398, -- LZ → 0x500
keyboard_lower_map = 0xE98458, -- LZ → 0x500
keyboard_symbols_map = 0xE98518, -- LZ → 0x500
-- Uncompressed 4bpp sprite sheets (sequential in ROM)
page_swap_frame = 0xE985D8, -- 0x280
back_button = 0xE98858, -- 0x1E0
ok_button = 0xE98A38, -- 0x1E0
page_swap_upper = 0xE98C18, -- 0x60
page_swap_lower = 0xE98CB8, -- 0x60
page_swap_others = 0xE98D58, -- 0x60
cursor = 0xE98DF8, -- 0x80
cursor_squished = 0xE98E98, -- 0x80
cursor_filled = 0xE98F38, -- 0x80
page_swap_button = 0xE98FD8, -- 0x100
input_arrow = 0xE990D8, -- 0x20
underscore = 0xE990F8, -- 0x20
rival_gfx = 0x38A428, -- uncompressed 0x900 (naming-screen rival bust)
}
-- General primary tileset anim frames (TilesetAnim_General).
Versions.TILESET_ANIM_GENERAL = {
flower = { base = 0x3A73E0, stride = 0x80, count = 5, bytes = 0x80 },
water = { base = 0x3A7674, stride = 0x600, count = 8, bytes = 0x600 },
sand = { base = 0x3AA674, stride = 0x240, count = 8, bytes = 0x240 },
}
-- Extract tileset pair → engine tileset id (palette bank key).
Versions.PAIR_TILESET = {
sevii_outdoor = "SEVII_OUTDOOR",
network = "SEVII_NETWORK",
house = "SEVII_HOUSE",
harbor = "SEVII_HARBOR",
pallet_outdoor = "FR_PALLET_OUTDOOR",
player_house = "FR_PLAYER_HOUSE",
oak_lab = "FR_OAK_LAB",
pewter_outdoor = "FR_PEWTER_OUTDOOR",
pewter_gym = "FR_PEWTER_GYM",
viridian_outdoor = "FR_VIRIDIAN_OUTDOOR",
}
-- Individual tileset blobs (FireRed USA 1.0), verified by matching pret bins in ROM.
Versions.TILESETS = {
general = {
compressed = true,
secondary = false,
tiles = 0x0EA1D68,
palettes = 0x0EA1B68,
metatiles = 0x29F6C8,
attributes = 0x2A1EC8,
metatile_bytes = 10240, -- 640 mids
attr_bytes = 2560,
palette_count = 16,
},
building = {
compressed = true,
secondary = false,
tiles = 0x0275294,
palettes = 0x0277694,
metatiles = 0x02AD7B4,
attributes = 0x02AFFB4,
metatile_bytes = 10240, -- 640 mids
attr_bytes = 2560,
palette_count = 16,
},
sevii_islands_123 = {
compressed = true,
secondary = true,
tiles = 0x0298B70,
palettes = 0x0299AA4,
metatiles = 0x2CD1CC,
attributes = 0x2CE39C,
metatile_bytes = 4560, -- 285 mids
attr_bytes = 1140,
palette_count = 16,
},
pokemon_center = {
compressed = true,
secondary = true,
tiles = 0x0277C5C,
palettes = 0x0278CC4,
metatiles = 0x02B3A60,
attributes = 0x02B4A50,
metatile_bytes = 4080, -- 255 mids
attr_bytes = 1020,
palette_count = 16,
},
generic_building_2 = {
compressed = true,
secondary = true,
tiles = 0x028E5A4,
palettes = 0x028EC70,
metatiles = 0x02BEF14,
attributes = 0x02BFA94,
metatile_bytes = 2944, -- 184 mids
attr_bytes = 736,
palette_count = 16,
},
island_harbor = {
compressed = true,
secondary = true,
tiles = 0x029D0E4,
palettes = 0x029D894,
metatiles = 0x02D1D30,
attributes = 0x02D2220,
metatile_bytes = 1264, -- 79 mids
attr_bytes = 316,
palette_count = 16,
},
-- Pallet Town / Route 1 secondary (petaltown / pallet_town).
-- Sizes must match pret bins in ROM (attrs sit immediately after metatiles).
-- Oversized metatile_bytes previously skipped real attrs → outdoor doors
-- seeded as solid BUILDING (0x07) instead of MB_WARP_DOOR.
pallet_town = {
compressed = true,
secondary = true,
tiles = 0x026D37C,
palettes = 0x026D7C0,
metatiles = 0x02A28C8,
attributes = 0x02A2E58,
metatile_bytes = 1424, -- 89 mids
attr_bytes = 356,
palette_count = 16,
},
pewter_city = {
compressed = true,
secondary = true,
tiles = 0x026E1C0,
palettes = 0x026EAB8,
metatiles = 0x02A3728,
attributes = 0x02A3C18,
metatile_bytes = 1264, -- 79 mids
attr_bytes = 316,
palette_count = 16,
},
-- Viridian City / Route 2 secondary (matched pret bins in FR 1.0 ROM).
viridian_city = {
compressed = true,
secondary = true,
tiles = 0x026D9C0,
palettes = 0x026DFC0,
metatiles = 0x02A2FBC,
attributes = 0x02A35AC,
metatile_bytes = 1520, -- 95 mids
attr_bytes = 380,
palette_count = 16,
},
pewter_gym = {
compressed = true,
secondary = true,
tiles = 0x02831BC,
palettes = 0x02839B0,
metatiles = 0x02AAA14,
attributes = 0x02AB064,
metatile_bytes = 1616, -- 101 mids
attr_bytes = 404,
palette_count = 16,
},
-- Player house interior secondary.
pretty_petals_flower_shop = {
compressed = true,
secondary = true,
tiles = 0x0EA99F4,
palettes = 0x0EA97F4,
metatiles = 0x02B4E4C,
attributes = 0x02B4FCC,
metatile_bytes = 384, -- 24 mids (ROM matches pret generic_building_1)
attr_bytes = 96,
palette_count = 16,
},
-- Oak lab secondary.
lab = {
compressed = true,
secondary = true,
tiles = 0x02806EC,
palettes = 0x0280D00,
metatiles = 0x02B68A0,
attributes = 0x02B7390,
metatile_bytes = 2800, -- 175 mids
attr_bytes = 700,
palette_count = 16,
},
}
-- Primary+secondary pairs used by Island 1 maps.
Versions.TILESET_PAIRS = {
sevii_outdoor = { primary = "general", secondary = "sevii_islands_123" },
network = { primary = "building", secondary = "pokemon_center" },
house = { primary = "building", secondary = "generic_building_2" },
harbor = { primary = "general", secondary = "island_harbor" },
pallet_outdoor = { primary = "general", secondary = "pallet_town" },
player_house = { primary = "building", secondary = "pretty_petals_flower_shop" },
oak_lab = { primary = "building", secondary = "lab" },
pewter_outdoor = { primary = "general", secondary = "pewter_city" },
pewter_gym = { primary = "building", secondary = "pewter_gym" },
viridian_outdoor = { primary = "general", secondary = "viridian_city" },
}
-- Layout geometry + which tileset pair each map uses.
Versions.MAPS = {
SEVII_ONE_ISLAND = {
layout = "OneIsland",
width = 24, height = 20,
kind = "town",
environment = "TOWN",
pair = "sevii_outdoor",
},
SEVII_ONE_ISLAND_KINDLE_ROAD = {
layout = "OneIsland_KindleRoad",
width = 24, height = 140,
kind = "route",
environment = "ROUTE",
pair = "sevii_outdoor",
},
SEVII_ONE_ISLAND_TREASURE_BEACH = {
layout = "OneIsland_TreasureBeach",
width = 24, height = 40,
kind = "route",
environment = "ROUTE",
pair = "sevii_outdoor",
},
-- FRLG Network Center (heal + Network Machine). Not a stock Gen1/2 Poké Center.
SEVII_ONE_ISLAND_POKECENTER = {
layout = "OneIsland_PokemonCenter_1F",
width = 19, height = 11,
kind = "indoor",
environment = "INDOOR",
pair = "network",
},
SEVII_ONE_ISLAND_POKECENTER_2F = {
layout = "OneIsland_PokemonCenter_2F",
width = 15, height = 10,
kind = "indoor",
environment = "INDOOR",
pair = "network",
},
SEVII_ONE_ISLAND_HARBOR = {
layout = "Island_Harbor",
width = 17, height = 13,
kind = "indoor",
environment = "INDOOR",
pair = "harbor",
},
SEVII_ONE_ISLAND_HOUSE1 = {
layout = "House3",
width = 11, height = 9,
kind = "indoor",
environment = "INDOOR",
pair = "house",
},
SEVII_ONE_ISLAND_HOUSE2 = {
layout = "House3",
width = 11, height = 9,
kind = "indoor",
environment = "INDOOR",
pair = "house",
},
FR_PALLET_TOWN = {
layout = "PalletTown",
width = 24, height = 20,
kind = "town",
environment = "TOWN",
pair = "pallet_outdoor",
},
FR_ROUTE_1 = {
layout = "Route1",
width = 24, height = 40,
kind = "route",
environment = "ROUTE",
pair = "pallet_outdoor",
},
FR_VIRIDIAN_CITY = {
layout = "ViridianCity",
width = 48, height = 40,
kind = "town",
environment = "TOWN",
pair = "viridian_outdoor",
},
FR_ROUTE_2 = {
layout = "Route2",
width = 24, height = 80,
kind = "route",
environment = "ROUTE",
pair = "viridian_outdoor",
},
-- pret: 2F bedroom is 12×9; 1F living room is 13×10 (names are easy to swap).
FR_PLAYERS_HOUSE_2F = {
layout = "PlayersHouse_2F",
width = 12, height = 9,
kind = "indoor",
environment = "INDOOR",
pair = "player_house",
},
FR_PLAYERS_HOUSE_1F = {
layout = "PlayersHouse_1F",
width = 13, height = 10,
kind = "indoor",
environment = "INDOOR",
pair = "player_house",
},
FR_RIVALS_HOUSE = {
layout = "RivalsHouse",
width = 13, height = 10,
kind = "indoor",
environment = "INDOOR",
pair = "house",
},
FR_OAKS_LAB = {
layout = "OaksLab",
width = 13, height = 14,
kind = "indoor",
environment = "INDOOR",
pair = "oak_lab",
},
FR_PEWTER_CITY = {
layout = "PewterCity",
width = 48, height = 40,
kind = "town",
environment = "TOWN",
pair = "pewter_outdoor",
},
FR_PEWTER_CITY_GYM = {
layout = "PewterCity_Gym",
width = 13, height = 16,
kind = "indoor",
environment = "INDOOR",
pair = "pewter_gym",
},
}
-- FireRed USA 1.0 gMapGroups (array of MapGroup* → MapHeader*).
-- Verified: group[3][0] = PalletTown MapHeader @ 0x350618.
Versions.G_MAP_GROUPS = 0x3526A8
Versions.NUM_MAP_GROUPS = 43 -- pret map_groups.json group_order length
-- pokefirered/src/overworld.c:494
Versions.G_MAP_LAYOUTS = 0x34EB8C
-- FireRed USA 1.0 MapHeader file offsets (verified against local dump).
-- Legacy hand list — prefer MapTree.walk(gMapGroups) for new extract.
-- Shared layouts (House3 / Harbor / PC 2F) disambiguated by header proximity
-- to One Island Network Center (0x351B6C).
Versions.MAP_HEADERS = {
SEVII_ONE_ISLAND = 0x350768,
SEVII_ONE_ISLAND_KINDLE_ROAD = 0x350B04,
SEVII_ONE_ISLAND_TREASURE_BEACH = 0x350B20,
SEVII_ONE_ISLAND_POKECENTER = 0x351B6C,
SEVII_ONE_ISLAND_POKECENTER_2F = 0x351B18,
SEVII_ONE_ISLAND_HARBOR = 0x351B50,
SEVII_ONE_ISLAND_HOUSE1 = 0x351BA4,
SEVII_ONE_ISLAND_HOUSE2 = 0x351BC0,
FR_PALLET_TOWN = 0x350618,
FR_VIRIDIAN_CITY = 0x350634,
FR_ROUTE_1 = 0x35082C,
FR_ROUTE_2 = 0x350848,
-- MapHeaders: 0x350D50 = 1F (Mom + 4 warps); 0x350D6C = 2F (bedroom signs + 1 warp).
FR_PLAYERS_HOUSE_1F = 0x350D50,
FR_PLAYERS_HOUSE_2F = 0x350D6C,
FR_RIVALS_HOUSE = 0x350D88,
FR_OAKS_LAB = 0x350DA4,
FR_PEWTER_CITY = 0x350650,
FR_PEWTER_CITY_GYM = 0x350EA0,
}
-- FireRed USA 1.0 map.bin offsets (matched against pret layout bins).
local FIRERED_10_LAYOUTS = {
OneIsland = { offset = 0x321354, width = 24, height = 20 },
OneIsland_KindleRoad = { offset = 0x324330, width = 24, height = 140 },
OneIsland_TreasureBeach = { offset = 0x325D94, width = 24, height = 40 },
OneIsland_PokemonCenter_1F = { offset = 0x33A7CC, width = 19, height = 11 },
-- Shared Pokémon Center 2F bin (several maps); first hit is fine — identical data.
OneIsland_PokemonCenter_2F = { offset = 0x2D59B4, width = 15, height = 10 },
Island_Harbor = { offset = 0x343DFC, width = 17, height = 13 },
House3 = { offset = 0x2D5BF0, width = 11, height = 9 },
PalletTown = { offset = 0x2DD100, width = 24, height = 20 },
Route1 = { offset = 0x2E4E4C, width = 24, height = 40 },
ViridianCity = { offset = 0x2DD4E4, width = 48, height = 40 },
Route2 = { offset = 0x2E55F0, width = 24, height = 80 },
-- Verified vs pret map.bin + local FR ROM: 0x2D50FC = 1F (13×10), 0x2D5224 = 2F (12×9).
PlayersHouse_1F = { offset = 0x2D50FC, width = 13, height = 10 },
PlayersHouse_2F = { offset = 0x2D5224, width = 12, height = 9 },
RivalsHouse = { offset = 0x2D5320, width = 13, height = 10 },
OaksLab = { offset = 0x2D54FC, width = 13, height = 14 },
PewterCity = { offset = 0x2DE408, width = 48, height = 40 },
PewterCity_Gym = { offset = 0x2D718C, width = 13, height = 16 },
}
-- Cell-space warps (pret map.json). Engine warps are cells (Gen2 setMap x/y).
Versions.WARPS = {
SEVII_ONE_ISLAND = {
{ x = 14, y = 5, destMap = "SEVII_ONE_ISLAND_POKECENTER", destWarp = 1 },
{ x = 19, y = 9, destMap = "SEVII_ONE_ISLAND_HOUSE1", destWarp = 1 },
{ x = 8, y = 11, destMap = "SEVII_ONE_ISLAND_HOUSE2", destWarp = 1 },
{ x = 12, y = 18, destMap = "SEVII_ONE_ISLAND_HARBOR", destWarp = 1 },
},
SEVII_ONE_ISLAND_POKECENTER = {
{ x = 9, y = 9, destMap = "SEVII_ONE_ISLAND", destWarp = 1 },
{ x = 1, y = 5, destMap = "SEVII_ONE_ISLAND_POKECENTER_2F", destWarp = 1 },
},
SEVII_ONE_ISLAND_POKECENTER_2F = {
{ x = 1, y = 6, destMap = "SEVII_ONE_ISLAND_POKECENTER", destWarp = 2 },
},
SEVII_ONE_ISLAND_HARBOR = {
{ x = 8, y = 2, destMap = "SEVII_ONE_ISLAND", destWarp = 4 },
},
SEVII_ONE_ISLAND_HOUSE1 = {
{ x = 4, y = 7, destMap = "SEVII_ONE_ISLAND", destWarp = 2 },
},
SEVII_ONE_ISLAND_HOUSE2 = {
{ x = 4, y = 7, destMap = "SEVII_ONE_ISLAND", destWarp = 3 },
},
-- destWarp is 1-based index into the destination map's warp list (pret dest_warp_id + 1).
FR_PALLET_TOWN = {
{ x = 6, y = 7, destMap = "FR_PLAYERS_HOUSE_1F", destWarp = 2 },
{ x = 15, y = 7, destMap = "FR_RIVALS_HOUSE", destWarp = 1 },
{ x = 16, y = 13, destMap = "FR_OAKS_LAB", destWarp = 1 },
},
FR_ROUTE_1 = {
},
FR_PLAYERS_HOUSE_1F = {
{ x = 5, y = 8, destMap = "FR_PALLET_TOWN", destWarp = 1 },
{ x = 4, y = 8, destMap = "FR_PALLET_TOWN", destWarp = 1 },
{ x = 10, y = 2, destMap = "FR_PLAYERS_HOUSE_2F", destWarp = 1 },
{ x = 3, y = 9, destMap = "FR_PALLET_TOWN", destWarp = 1 },
},
FR_PLAYERS_HOUSE_2F = {
{ x = 10, y = 2, destMap = "FR_PLAYERS_HOUSE_1F", destWarp = 3 },
},
FR_RIVALS_HOUSE = {
{ x = 4, y = 8, destMap = "FR_PALLET_TOWN", destWarp = 2 },
{ x = 5, y = 8, destMap = "FR_PALLET_TOWN", destWarp = 2 },
{ x = 3, y = 8, destMap = "FR_PALLET_TOWN", destWarp = 2 },
},
FR_OAKS_LAB = {
{ x = 6, y = 12, destMap = "FR_PALLET_TOWN", destWarp = 3 },
{ x = 7, y = 12, destMap = "FR_PALLET_TOWN", destWarp = 3 },
{ x = 5, y = 12, destMap = "FR_PALLET_TOWN", destWarp = 3 },
},
-- Pewter outdoor warps (pret map.json; only Gym wired until other interiors extract).
FR_PEWTER_CITY = {
{ x = 17, y = 6, destMap = "FR_PEWTER_CITY", destWarp = 1 }, -- museum stub
{ x = 25, y = 4, destMap = "FR_PEWTER_CITY", destWarp = 1 },
{ x = 15, y = 16, destMap = "FR_PEWTER_CITY_GYM", destWarp = 1 },
},
FR_PEWTER_CITY_GYM = {
{ x = 5, y = 14, destMap = "FR_PEWTER_CITY", destWarp = 3 },
{ x = 6, y = 14, destMap = "FR_PEWTER_CITY", destWarp = 3 },
{ x = 7, y = 14, destMap = "FR_PEWTER_CITY", destWarp = 3 },
},
}
-- FireRed USA 1.0 — verified against local dump + pret bins.
local FIRERED_10 = {
id = "firered_1_0",
game = "firered",
tilesets = Versions.TILESETS,
layouts = FIRERED_10_LAYOUTS,
map_headers = Versions.MAP_HEADERS,
g_map_groups = Versions.G_MAP_GROUPS,
g_map_layouts = Versions.G_MAP_LAYOUTS,
num_map_groups = Versions.NUM_MAP_GROUPS,
ow_gfx_pointers = Versions.OW_GFX_POINTERS,
ow_sprite_palettes = Versions.OW_SPRITE_PALETTES,
num_obj_event_gfx = Versions.NUM_OBJ_EVENT_GFX,
}
local LEAFGREEN_10 = {}
for key, value in pairs(FIRERED_10) do LEAFGREEN_10[key] = value end
LEAFGREEN_10.id, LEAFGREEN_10.game = "leafgreen_1_0", "leafgreen"
-- SHA-1 (lowercase) → version table. Engine identity is SHA-1 only.
Versions.BY_SHA1 = {
["574fa542ffebb14be69902d1d36f1ec0a4afd71e"] = LEAFGREEN_10,
["7862c67bdecbe21d1d69ce082ce34327e1c6ed5e"] = LEAFGREEN_10,
["41cb23d8dccc8ebd7c649cd8fbb58eeace6e2fdc"] = FIRERED_10,
["dd5945db9b930750cb39d00c84da8571feebf417"] = FIRERED_10,
}
-- Legacy MD5 keys retained only for error messages / migration hints.
Versions.BY_MD5 = {
["e26ee0d44e809351c8ce2d73c7400cdd"] = "41cb23d8dccc8ebd7c649cd8fbb58eeace6e2fdc",
}
-- FRLG (mapGroup, mapNum) → Sevii host map ids (Island 1).
Versions.FRLG_MAP_TO_SEVII = {
["3:12"] = "SEVII_ONE_ISLAND",
["3:45"] = "SEVII_ONE_ISLAND_KINDLE_ROAD",
["3:46"] = "SEVII_ONE_ISLAND_TREASURE_BEACH",
["32:0"] = "SEVII_ONE_ISLAND_POKECENTER",
["32:1"] = "SEVII_ONE_ISLAND_POKECENTER_2F",
["32:2"] = "SEVII_ONE_ISLAND_HOUSE1",
["32:3"] = "SEVII_ONE_ISLAND_HOUSE2",
["32:4"] = "SEVII_ONE_ISLAND_HARBOR",
}
-- Standalone Fire Red map ids (engine Game3).
Versions.FRLG_MAP_TO_FR = {
["3:0"] = "FR_PALLET_TOWN",
["3:1"] = "FR_VIRIDIAN_CITY",
["3:2"] = "FR_PEWTER_CITY",
["3:19"] = "FR_ROUTE_1",
["3:20"] = "FR_ROUTE_2",
["4:0"] = "FR_PLAYERS_HOUSE_1F",
["4:1"] = "FR_PLAYERS_HOUSE_2F",
["4:2"] = "FR_RIVALS_HOUSE",
["4:3"] = "FR_OAKS_LAB",
["6:2"] = "FR_PEWTER_CITY_GYM",
}
-- pret map_groups.json name → existing engine id (keep save / session stable).
Versions.PRET_TO_FR = {
PalletTown = "FR_PALLET_TOWN",
ViridianCity = "FR_VIRIDIAN_CITY",
PewterCity = "FR_PEWTER_CITY",
Route1 = "FR_ROUTE_1",
Route2 = "FR_ROUTE_2",
PalletTown_PlayersHouse_1F = "FR_PLAYERS_HOUSE_1F",
PalletTown_PlayersHouse_2F = "FR_PLAYERS_HOUSE_2F",
PalletTown_RivalsHouse = "FR_RIVALS_HOUSE",
PalletTown_ProfessorOaksLab = "FR_OAKS_LAB",
PewterCity_Gym = "FR_PEWTER_CITY_GYM",
OneIsland = "SEVII_ONE_ISLAND",
OneIsland_KindleRoad = "SEVII_ONE_ISLAND_KINDLE_ROAD",
OneIsland_TreasureBeach = "SEVII_ONE_ISLAND_TREASURE_BEACH",
OneIsland_PokemonCenter_1F = "SEVII_ONE_ISLAND_POKECENTER",
OneIsland_PokemonCenter_2F = "SEVII_ONE_ISLAND_POKECENTER_2F",
OneIsland_Harbor = "SEVII_ONE_ISLAND_HARBOR",
OneIsland_House1 = "SEVII_ONE_ISLAND_HOUSE1",
OneIsland_House2 = "SEVII_ONE_ISLAND_HOUSE2",
}
function Versions.seviiMapFor(group, num)
return Versions.FRLG_MAP_TO_SEVII[string.format("%d:%d", tonumber(group) or 0, tonumber(num) or 0)]
end
function Versions.frMapFor(group, num)
local MapCatalog = require("src.import.gba.map_catalog")
return MapCatalog.mapIdFor(group, num)
or Versions.FRLG_MAP_TO_FR[string.format("%d:%d", tonumber(group) or 0, tonumber(num) or 0)]
or Versions.FRLG_MAP_TO_SEVII[string.format("%d:%d", tonumber(group) or 0, tonumber(num) or 0)]
end
function Versions.mapIdFor(group, num)
return Versions.frMapFor(group, num)
end
function Versions.normalizeSha1(sha1)
if type(sha1) ~= "string" then return nil end
return sha1:lower():gsub("%s+", "")
end
--- Canonical FireRed identity SHA-1 (maps legacy MD5 → SHA-1).
function Versions.identitySha1(hash)
local key = Versions.normalizeSha1(hash)
if not key or key == "" then return nil end
if Versions.BY_MD5[key] and type(Versions.BY_MD5[key]) == "string" then
return Versions.BY_MD5[key]
end
return key
end
-- Deprecated alias
Versions.normalizeMd5 = Versions.normalizeSha1
function Versions.lookup(sha1)
local key = Versions.identitySha1(sha1)
if not key or key == "" then return nil, "missing sha1" end
local ver = Versions.BY_SHA1[key]
if not ver then
return nil, "unsupported or unknown FRLG dump SHA-1"
end
return ver
end
function Versions.lookupSha1(sha1)
return Versions.lookup(sha1)
end
-- Retain table identities: extractors and runtime modules hold references to
-- nested tables. Rebuild from immutable baseline entries when editions change,
-- never remap an already remapped value or mutate data read from the ROM.
local baseline, seen = {}, {}
local function capture(t)
if seen[t] then return end
seen[t] = true
local entries = {}
baseline[#baseline + 1] = { target = t, entries = entries }
for k, v in pairs(t) do
entries[#entries + 1] = { k, v }
if type(v) == "table" then capture(v) end
end
end
capture(Versions)
local edition, addresses = "firered", nil
function Versions.address(base)
if not addresses then return base end
return assert(addresses[base], string.format("Missing LeafGreen address 0x%X", base))
end
function Versions.select(identity)
local game = identity
if Versions.BY_SHA1[identity] then game = Versions.BY_SHA1[identity].game end
game = game == "leafgreen" and "leafgreen" or "firered"
if game == edition then return end
addresses = game == "leafgreen" and require("src.import.gba.editions.leafgreen_1_0") or nil
for _, record in ipairs(baseline) do
local t = record.target
-- Root functions added below capture() are retained.
for _, entry in ipairs(record.entries) do
t[entry[1]] = nil
end
if t ~= Versions then for k in pairs(t) do t[k] = nil end end
for _, entry in ipairs(record.entries) do
local k, v = entry[1], entry[2]
t[addresses and addresses[k] or k] = addresses and addresses[v] or v
end
end
edition = game
end
Versions.game = require("src.import.gba.versions_game").game
return Versions