Files
Crystal/src/game/rom/profile.ts
T
Sébastien QUEROL 32d736ecae
Checks / web (push) Canceled after 0s
Port weather, copying moves, held items and obedience (#28)
Complete the weather, Substitute, Transform, called-move and forced-switch effects. Add held-item behavior, Exp. Share awards and badge-based traded Pokemon obedience, and persist trainer berry consumption.

Validated with 576 passing unit tests and 149 browser tests, native/reference builds, reference/vendor/release checks and 320 Metal Powder emulator comparisons per browser. Smart AI and special balls/battle types remain on #28.
2026-10-03 15:03:19 +02:00

1016 lines
33 KiB
TypeScript
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.
/** Addresses only, from PRET 7a7881d0d62e0ddbd82dcf10e7116807487ac651.
* RGBDS 1.0.3 crystal11 build was byte-identical to the user-supplied ROM.
* No original graphics, maps, dialogue, music or ROM instructions live here.
* See docs/NATIVE_PORT.md for source references and verification procedure. */
export const SYMBOLS = {
trainerGroups: 0x39999,
trainerClassNames: 0x2c1ef,
trainerClassAttributes: 0x3959c,
trainerClassDVs: 0x270d6,
statusOnlyEffects: 0x385db,
stallMoves: 0x39348,
recklessMoves: 0x393e2,
residualMoves: 0x39446,
riskyEffects: 0x394ff,
mapGroups: 0x94000,
tilesets: 0x4d596,
collisions: 0x4ce1f,
environmentColors: 0xb279,
backgroundPalettes: 0xb319,
objectPalettes: 0xb469,
roofPalettes: 0xb569,
roofTypes: 0x1c021,
roofs: 0x1c03c,
housePalettes: 0x495ee,
sprites: 0x14736,
facings: 0x4049,
standardScripts: 0xbc000,
mapScenes: 0x4d01e,
specials: 0xc029,
/** CheckSpecialPhoneCall.script: pause, then Script_ReceivePhoneCall. */
receiveSpecialPhoneCall: 0x90173,
specialPhoneCallList: 0x90627,
specialCallOnlyWhenOutside: 0x90188,
specialCallWhereverYouAre: 0x90197,
phoneClickText: 0x9032a,
emotes: 0x1444d,
landmarks: 0x1ca8c3,
weekdayNames: 0x909f2,
whatDayText: 0x90a3f,
isItDayText: 0x90a4f,
dstConfirmText: 0x90a83,
timeConfirmText: 0x90ab7,
baseData: 0x51424,
pokemonNames: 0x53384,
pokemonPics: 0x120000,
picsBanks: 0x511d4,
pokemonPalettes: 0xa8ce,
growthRates: 0x50efa,
evosAttacks: 0x425b1,
moves: 0x41afb,
moveNames: 0x1c9f29,
itemNames: 0x1c8000,
itemAttributes: 0x67c1,
itemPocketNames: 0x9701c,
giveItemScript: 0x96f77,
putItemInPocketText: 0x9705b,
pocketIsFullText: 0x97060,
findItemInBallScript: 0x122ce,
caughtAskNicknameText: 0x4db44,
nicknameStrings: 0x11780,
rivalNameString: 0x117c3,
rivalDefaultName: 0xc2b2,
hiddenItemScript: 0x13625,
talkToTrainerScript: 0xbe66a,
seenByTrainerScript: 0xbe675,
wildBattleScript: 0x97cf9,
battleWhiteoutScript: 0x124c1,
spawnPoints: 0x152ab,
johtoGrassWildMons: 0x2a5e9,
grassMonProbTable: 0x2a1cb,
grassCollisions: 0x149ea,
fruitTreeScript: 0x44000,
fruitTreeItems: 0x44097,
engineFlags: 0x80462,
spriteMovementData: 0x4273,
marts: 0x160a9,
martWelcomeText: 0x15f83,
martAskMoreText: 0x15fb9,
martComeAgainText: 0x15fb4,
martHowManyText: 0x15e0e,
martFinalPriceText: 0x15e13,
martNoMoneyText: 0x15fa5,
martPackFullText: 0x15faa,
martThanksText: 0x15fa0,
martCantBuyText: 0x15faf,
martSellHowManyText: 0x15f73,
martSellPriceText: 0x15f78,
martBoughtText: 0x15fbe,
} as const;
/** Assembly routines that scripts `callasm` but that do nothing. */
export const EMPTY_ROUTINES = {
giveItemDummy: 0x96f76,
battleBGMap: 0x1250a,
} as const;
/** Assembly routines that scripts `callasm`, translated natively. */
export const NATIVE_ROUTINES = {
halveMoney: 0x12513,
getWhiteoutSpawn: 0x12527,
tryReceiveItem: 0x122f8,
getCurTreeFruit: 0x44041,
tryResetFruitTrees: 0x4404c,
checkFruitTree: 0x44055,
pickedFruitTree: 0x4405f,
trainerWalkToPlayer: 0x831e,
setMemEvent: 0x1364f,
ringTwiceStartCall: 0x9026f,
hangUp: 0x902eb,
initCallReceiveDelay: 0x113e5,
} as const;
/** Native handlers are selected by the routine a special index points to,
* so the ROM's own special table remains the source of truth. */
export const SPECIAL_ROUTINES = {
nameRival: 0xc29d,
restartMapMusic: 0x3d47,
fadeOutMusic: 0xc48f,
setDayOfWeek: 0x90913,
initialSetDst: 0x90a54,
initialClearDst: 0x90a88,
toggleDecorationsVisibility: 0x27043,
toggleMaptileDecorations: 0x26feb,
fadeOutToWhite: 0x8c084,
fadeOutToBlack: 0x8c0b6,
fadeInFromBlack: 0x8c0ab,
reloadSpritesNoPalettes: 0xd91,
healParty: 0xc658,
healMachineAnim: 0x12324,
checkPokerus: 0xc419,
stubbedTrainerRankingsHealings: 0x1060a2,
warpToSpawnPoint: 0x97c28,
} as const;
/** Work RAM addresses that the event and text formats name as operands. */
export const RAM = {
battleReward: 0xc686,
stringBuffer1: 0xd073,
stringBuffer2: 0xd086,
stringBuffer3: 0xd099,
stringBuffer4: 0xd0ac,
stringBuffer5: 0xd0bf,
playerName: 0xd47d,
momsName: 0xd488,
rivalName: 0xd493,
battleMonNickname: 0xc621,
enemyMonNickname: 0xc616,
curPartyLevel: 0xd143,
monOrItemNameBuffer: 0xd050,
curFruit: 0xd03f,
dailyFlags1: 0xdc1e,
unusedDailyFlag: 0xdc21,
itemQuantityChange: 0xd10c,
movementBuffer: 0xd007,
hiddenItemID: 0xd040,
runningTrainerBattleScript: 0xd04d,
callerContact: 0xd03f,
surfingPlayerState: 0xd1eb,
strengthSpecies: 0xd1ef,
curHPAnimDeltaHP: 0xd1f3,
visitedSpawns: 0xdca5,
tempWildMonSpecies: 0xd22e,
coins: 0xd855,
/** hBGMapMode: HRAM, like hMoneyTemp below. */
bgMapMode: 0xffd4,
blueCardBalance: 0xdc4b,
/** hMoneyTemp: HRAM, not WRAM like the other entries above. */
moneyTemp: 0xffc3,
playerDamageTaken: 0xc682,
enemyDamageTaken: 0xc684,
payDayMoney: 0xc6ec,
textDecimalByte: 0xd265,
} as const;
/** Event constants named directly by translated special routines. */
export const EVENTS = {
playersRoomPoster: 716,
playersHouseConsole: 1857,
playersHouseDoll1: 1858,
playersHouseDoll2: 1859,
playersHouseBigDoll: 1860,
wallOpenedInAerodactylChamber: 809,
wallOpenedInKabutoChamber: 807,
} as const;
/** Engine flag indices named directly by translated routines. */
export const ENGINE_FLAGS = {
pokegear: 4,
pokedex: 11,
allFruitTrees: 84,
} as const;
/** Overworld scripts, routines and tables, keyed by their PRET labels so
* that `npm run check:reference` verifies each address by name. */
export const OVERWORLD = {
"OverworldTownMap": 0xc2c0,
"TownMapGFX": 0xf8ba0,
"JohtoMap": 0x91fff,
"KantoMap": 0x92168,
"TownMapPals.PalMap": 0x91f4b,
"MalePokegearPals": 0xb729,
"FemalePokegearPals": 0xb759,
"DecorationAttributes": 0x26a4f,
"DecorationNames": 0x26b8d,
"DecorationIDs": 0x26f2b,
"_PlayerDecorationMenu.category_pointers": 0x267aa,
"PlayersHousePC": 0xc2e7,
"PutAwayTheDecoText": 0x26ed1,
"NothingToPutAwayText": 0x26ed6,
"SetUpTheDecoText": 0x26edb,
"PutAwayAndSetUpText": 0x26ee0,
"AlreadySetUpText": 0x26ee5,
"WhichSidePutOnText": 0x26e41,
"WhichSidePutAwayText": 0x26e6b,
"DecorationDesc_PosterPointers": 0x26f84,
"DecorationDesc_OrnamentOrConsole.OrnamentConsoleScript": 0x26fd5,
"DecorationDesc_GiantOrnament.BigDollScript": 0x26fe3,
Script_ForcedMovement: 0x1253d,
FallIntoMapScript: 0x96c38,
"_Sine.sinetable_u10": 0x850b,
AskFloorElevatorText: 0x1350d,
Elevator_CurrentFloorText: 0x13537,
ElevatorFloorNames: 0x13583,
JohtoWaterWildMons: 0x2b11d,
KantoGrassWildMons: 0x2b274,
KantoWaterWildMons: 0x2b7f7,
WaterMonProbTable: 0x2a1d9,
SpriteMons: 0x14495,
MonMenuIcons: 0x8eac4,
IconPointers: 0x8ebbf,
AskSurfScript: 0xca2c,
"UsedSurfScript.stubbed_fn": 0xc9a2,
Script_CutFromMenu: 0xc7fe,
SurfFromMenuScript: 0xc983,
Script_StrengthFromMenu: 0xcd29,
Script_UseFlash: 0xc8e6,
UseFlashTextScript: 0xc8f3,
"UseFlashTextScript.BlankText": 0xc908,
BlindingFlash: 0x8c7e1,
Script_WhirlpoolFromMenu: 0xce0b,
Script_WaterfallFromMenu: 0xcb1c,
"SweetScentFromMenu.SweetScent": 0x506c8,
SweetScentEncounter: 0x506ef,
HeadbuttFromMenuScript: 0xcea7,
AskHeadbuttScript: 0xcedc,
ShakeHeadbuttTree: 0x8c80a,
HeadbuttTreeGFX: 0x8c893,
TreeMonEncounter: 0xb81ea,
RockMonEncounter: 0xb8219,
TreeMonMaps: 0xb825e,
RockMonMaps: 0xb82c5,
TreeMons: 0xb82e8,
RockSmashFromMenuScript: 0xcf2e,
HasRockSmash: 0xcf7c,
"CheckBadge.BadgeRequiredText": 0xc73d,
"FieldMoveFailed.CantUseItemText": 0xc780,
CutNothingText: 0xc7c9,
CantSurfText: 0xc9ae,
AlreadySurfingText: 0xc9b3,
"EscapeRopeOrDig.CantUseDigText": 0xcc26,
"TeleportFunction.CantUseTeleportText": 0xccb6,
"FlyFunction.FlyScript": 0xcaa3,
"FlyFunction.ReturnFromFly": 0xcacb,
"EscapeRopeOrDig.UsedEscapeRopeScript": 0xcc2b,
"EscapeRopeOrDig.UsedDigScript": 0xcc35,
"TeleportFunction.TeleportScript": 0xccbb,
FlyFromAnim: 0x8caed,
FlyToAnim: 0x8cb33,
HideSprites: 0x3016,
SkipUpdateMapSprites: 0x154f1,
WaitSFX: 0x3c55,
FadeInFromWhite: 0x8c079,
RepelWoreOffScript: 0x13619,
"ItemFinder.Script_FoundSomething": 0x125ad,
"ItemFinder.Script_FoundNothing": 0x125ba,
"ItemFinder.ItemfinderSound": 0x12599,
"_CardKey.CardKeyScript": 0x507af,
"_BasementKey.BasementKeyScript": 0x507e1,
"_Squirtbottle.SquirtbottleScript": 0x5073c,
"_Squirtbottle.CheckCanUseSquirtbottle": 0x50753,
FishGroups: 0x92488,
TimeFishGroups: 0x9266f,
Script_GotABite: 0xd035,
Script_NotEvenANibble: 0xd01e,
Script_NotEvenANibble2: 0xd027,
Fishing_CheckFacingUp: 0xd06c,
LoadFishingGFX: 0xb84b3,
PutTheRodAway: 0xd095,
FishingGFX: 0xb84f2,
KrisFishingGFX: 0xb8582,
Flypoints: 0x91c5e,
"TownMapBubble.Where": 0x91bf4,
RuinsOfAlphKabutoChamber_MapAttributes: 0x958d0,
"Softboiled_MilkDrinkFunction.ItemCantUseOnMonText": 0xf44a,
RuinsOfAlphAerodactylChamber_MapAttributes: 0x958e8,
AskCutScript: 0xd1a9,
"AskCutScript.CheckMap": 0xd1ba,
CantCutScript: 0xd1cd,
CutDownTreeOrGrass: 0xc810,
GetPartyNickname: 0xc706,
CutTreeBlockPointers: 0xc862,
WhirlpoolBlockPointers: 0xc8a4,
TryStrengthOW: 0xcd78,
SetStrengthFlag: 0xcd12,
Script_AskWaterfall: 0xcb86,
Script_CantDoWaterfall: 0xcb7e,
"Script_UsedWaterfall.CheckContinueWaterfall": 0xcb38,
Script_AskWhirlpoolOW: 0xce6e,
Script_MightyWhirlpool: 0xce66,
DisappearWhirlpool: 0xce1d,
ChrisStateSprites: 0x141b7,
KrisStateSprites: 0x141c0,
Script_GetOnBike: 0xd13e,
Script_GetOnBike_Register: 0xd14e,
Script_GetOffBike: 0xd158,
Script_GetOffBike_Register: 0xd16b,
Script_CantGetOffBike: 0xd171,
UpdatePlayerSprite: 0xe4a,
PlayMapMusic: 0x3cdf,
SurfStartStep: 0x8379,
UpdateTimePals: 0x485,
WaitTileAnimation: 0xfc2fe,
DoneTileAnimation: 0xfc2fb,
StandingTileFrame8: 0xfc2ff,
StandingTileFrame: 0xfc673,
AnimateWaterTile: 0xfc402,
"AnimateWaterTile.WaterTileFrames": 0xfc41c,
AnimateWaterPalette: 0xfc6d7,
AnimateFlowerTile: 0xfc56d,
"AnimateFlowerTile.FlowerTileFrames": 0xfc58c,
AnimateFountainTile: 0xfc387,
"AnimateFountainTile.FountainTileFramePointers": 0xfc3a2,
ForestTreeLeftAnimation: 0xfc45c,
ForestTreeRightAnimation: 0xfc4c4,
ForestTreeLeftAnimation2: 0xfc4f2,
ForestTreeRightAnimation2: 0xfc51c,
ForestTreeLeftFrames: 0xfc484,
ForestTreeRightFrames: 0xfc4a4,
AnimateLavaBubbleTile1: 0xfc5cc,
AnimateLavaBubbleTile2: 0xfc5eb,
LavaBubbleTileFrames: 0xfc605,
AnimateTowerPillarTile: 0xfc645,
"AnimateTowerPillarTile.TowerPillarTileFrameOffsets": 0xfc66b,
AnimateWhirlpoolTile: 0xfc678,
ReadTileToAnimBuffer: 0xfc6a2,
WriteTileFromAnimBuffer: 0xfc696,
ScrollTileRightLeft: 0xfc309,
ScrollTileUpDown: 0xfc318,
ScrollTileLeft: 0xfc327,
ScrollTileRight: 0xfc33b,
ScrollTileUp: 0xfc34f,
ScrollTileDown: 0xfc36a,
FlickeringCaveEntrancePalette: 0xfc71e,
PokeComPalette: 0x49501,
BattleTowerInsidePalette: 0x49550,
IcePathPalette: 0x4959f,
RadioTowerPalette: 0x4963d,
MansionPalette1: 0x4967d,
MansionPalette2: 0x496fe,
} as const;
/** A new game's introduction (engine/menus/intro_menu.asm NewGame):
* InitGender, OakSpeech with InitClock and NamePlayer, and the pictures
* they show, keyed by their PRET labels for \`npm run check:reference\`. */
export const INTRO = {
TrainerPicPointers: 0x128000,
TrainerPalettes: 0xb0ce,
ChrisPic: 0x888a9,
KrisPic: 0x88bb9,
_AreYouABoyOrAreYouAGirlText: 0x1c0ca3,
"InitGender.MenuData": 0x48e04,
_OakText1: 0x1c1d35,
_OakText2: 0x1c1da4,
_OakText4: 0x1c1de5,
_OakText5: 0x1c1e51,
_OakText6: 0x1c4000,
_OakText7: 0x1c4026,
_OakTimeWokeUpText: 0x1bc29c,
_OakTimeWhatTimeIsItText: 0x1bc2eb,
_OakTimeWhatHoursText: 0x1bc2fd,
_OakTimeHoursQuestionMarkText: 0x1bc305,
_OakTimeHowManyMinutesText: 0x1bc308,
_OakTimeWhoaMinutesText: 0x1bc31b,
_OakTimeMinutesQuestionMarkText: 0x1bc323,
_OakTimeOversleptText: 0x1bc326,
_OakTimeYikesText: 0x1bc336,
_OakTimeSoDarkText: 0x1bc34f,
"ChrisNameMenuHeader.MaleNames": 0x882be,
"KrisNameMenuHeader.FemaleNames": 0x882ee,
"NamingScreenJumptable.PlayerNameString": 0x117a3,
"NamePlayer.Chris": 0x60d3,
"NamePlayer.Kris": 0x60de,
String_oclock: 0x9087e,
String_min: 0x9089f,
"GetTimeOfDayString.nite_string": 0x90b71,
"GetTimeOfDayString.morn_string": 0x90b76,
"GetTimeOfDayString.day_string": 0x90b7b,
} as const;
/** The Pokémon stats screen's strings and the type names, keyed by their
* PRET labels so that \`npm run check:reference\` can verify each address. */
export const STATS = {
"LoadPinkPage.Status_Type": 0x4e119,
"LoadPinkPage.OK_str": 0x4e127,
"LoadPinkPage.ExpPointStr": 0x4e12b,
"LoadPinkPage.LevelUpStr": 0x4e136,
"LoadPinkPage.ToStr": 0x4e13f,
"LoadPinkPage.PkrsStr": 0x4e142,
"LoadGreenPage.Item": 0x4e1a0,
"LoadGreenPage.ThreeDashes": 0x4e1a5,
"LoadGreenPage.Move": 0x4e1a9,
IDNoString: 0x4e21e,
OTString: 0x4e222,
TypeNames: 0x5097b,
} as const;
/** Pokémon Center and house PCs, Bill's PC and Oak's PC: routines, menu
* data, strings and texts, keyed by their PRET labels so that
* \`npm run check:reference\` can verify each address by name. */
export const PC = {
TileCollisionStdScripts: 0x13681,
PokemonCenterPC: 0x1559a,
"PokemonCenterPC.WhichPC": 0x1562c,
"PokemonCenterPC.Jumptable": 0x155e6,
"PC_CheckPartyForPokemon.PokecenterPCCantUseText": 0x15663,
PokecenterPCTurnOnText: 0x15a27,
PokecenterPCWhoseText: 0x15a2c,
PokecenterBillsPCText: 0x15a31,
PokecenterPlayersPCText: 0x15a36,
PokecenterOaksPCText: 0x15a3b,
PokecenterPCOaksClosedText: 0x15a40,
PlayersPCTurnOnText: 0x156ff,
PlayersPCAskWhatDoText: 0x157cc,
"PlayersPCMenuData.WhichPC": 0x157ac,
"PlayersPCMenuData.PlayersPCMenuPointers": 0x15746,
"PlayerWithdrawItemMenu.PlayersPCHowManyWithdrawText": 0x15850,
"PlayerWithdrawItemMenu.PlayersPCWithdrewItemsText": 0x15855,
"PlayerWithdrawItemMenu.PlayersPCNoRoomWithdrawText": 0x1585a,
"PlayerDepositItemMenu.PlayersPCNoItemsText": 0x158c7,
"PlayerDepositItemMenu.PlayersPCHowManyDepositText": 0x1596e,
"PlayerDepositItemMenu.PlayersPCDepositItemsText": 0x15973,
"PlayerDepositItemMenu.PlayersPCNoRoomDepositText": 0x15978,
"TossItemFromPC.ItemsTossOutHowManyText": 0x12a45,
"TossItemFromPC.ItemsThrowAwayText": 0x12a4a,
"TossItemFromPC.ItemsDiscardedText": 0x12a4f,
"TossItemFromPC.ItemsTooImportantText": 0x12a5b,
"_PlayerMailBoxMenu.EmptyMailboxText": 0x447b4,
"MailboxPC.SubMenuData": 0x4496c,
"MailboxPC.MailClearedPutAwayText": 0x448ac,
"MailboxPC.MailPackFullText": 0x448b1,
"MailboxPC.MailMessageLostText": 0x448b6,
"MailboxPC.MailAlreadyHoldingItemText": 0x4493c,
"MailboxPC.MailEggText": 0x44941,
"MailboxPC.MailMovedFromBoxText": 0x44946,
PCString_RemoveMail: 0xe3544,
"ScrollingMenu_UpdateDisplay.CancelString": 0x2485f,
"_BillsPC.PCGottaHavePokemonText": 0xe417,
"_BillsPC.PCWhatText": 0xe43a,
"_BillsPC.strings": 0xe47f,
"BillsPCDepositMenuHeader.MenuData": 0xe2545,
"BillsPC_Withdraw.MenuData": 0xe2739,
"BillsPC_ChangeBoxSubmenu.MenuData": 0xe3783,
PCString_ChooseaPKMN: 0xe34dd,
PCString_WhatsUp: 0xe34ea,
PCString_ReleasePKMN: 0xe34f4,
PCString_ItsYourLastPKMN: 0xe350f,
PCString_NoMoreUsablePKMN: 0xe3531,
PCString_ReleasedPKMN: 0xe3551,
PCString_Bye: 0xe355e,
PCString_Stored: 0xe3563,
PCString_Got: 0xe356b,
PCString_BoxFull: 0xe3575,
PCString_PartyFull: 0xe3586,
PCString_NoReleasingEGGS: 0xe3597,
PCString_MoveToWhere: 0xe3500,
PCString_TheresNoRoom: 0xe3521,
"_MovePKMNWithoutMail.MenuData": 0xe28cb,
MoveMonWOMailSaveText: 0x152a6,
"BillsPC_MovePKMNMenu.PCMonHoldingMailText": 0xe4f9,
"MovePKMNWithoutMail_InsertMon.Saving_LeaveOn": 0xe3233,
"BillsPC_PlaceChooseABoxString.ChooseABox": 0xe37a1,
"BillsPC_PlaceEmptyBoxString_SFX.NoMonString": 0xe37d3,
"BillsPC_PrintBoxName.Current": 0xe36f1,
"BillsPC_PrintBoxCountAndCapacity.OutOf20": 0xe3668,
"BillsPC_RefreshTextboxes.CancelString": 0xe2c67,
"BillsPC_BoxName.PartyPKMN": 0xe2abd,
"NamingScreenJumptable.BoxNameString": 0x11822,
"SetDefaultBoxNames.Box": 0x5ccf,
ChangeBoxSaveText: 0x152a1,
OakPCText1: 0x266de,
OakPCText2: 0x266e3,
OakPCText3: 0x266e8,
OakPCText4: 0x2674c,
OakRatings: 0x2667f,
PhoneContacts: 0x9045f,
Script_ReceivePhoneCall: 0x90241,
} as const;
/** The start menu, the party menu and its Pokémon submenu, and the pack
* outside battle: menu data, strings and texts, keyed by their PRET labels
* so that \`npm run check:reference\` can verify each address by name. */
export const MENU = {
"StartMenu.Items": 0x126eb,
PartyMenuStrings: 0x504d2,
MonMenuOptionStrings: 0x24caf,
MonMenuOptions: 0x24cd9,
"GiveTakeItemMenuData.Items": 0x12ca3,
String_MoveWhere: 0x1316b,
"MonMenu_Softboiled_MilkDrink.PokemonNotEnoughHPText": 0x12f00,
MayRegisterItemText: 0x13340,
RegisteredItemText: 0x10afd,
CantRegisterText: 0x10b02,
ItemsOakWarningText: 0x12a67,
MailItems: 0xb9e80,
PokemonSwapItemText: 0x12caf,
PokemonHoldItemText: 0x12cb4,
PokemonRemoveMailText: 0x12cb9,
PokemonNotHoldingText: 0x12cbe,
ItemStorageFullText: 0x12cc3,
PokemonTookItemText: 0x12cc8,
PokemonAskSwapItemText: 0x12ccd,
ItemCantHeldText: 0x12cd2,
"MonMailAction.MenuData": 0x12dd1,
"MonMailAction.MailLoseMessageText": 0x12de2,
"MonMailAction.MailDetachedText": 0x12de7,
"MonMailAction.MailNoSpaceText": 0x12dec,
"MonMailAction.MailAskSendToPCText": 0x12df1,
"MonMailAction.MailboxFullText": 0x12df6,
"MonMailAction.MailSentToPCText": 0x12dfb,
"GiveItem.AnEggCantHoldAnItemText": 0x1048d,
"MenuHeader_UsableKeyItem.MenuData": 0x10251,
"MenuHeader_UsableItem.MenuData": 0x1027c,
"MenuHeader_UnusableItem.MenuData": 0x102a1,
"MenuHeader_UnusableKeyItem.MenuData": 0x102b8,
"MenuHeader_HoldableKeyItem.MenuData": 0x102d5,
"MenuHeader_HoldableItem.MenuData": 0x102fa,
AskThrowAwayText: 0x10ae4,
AskItemMoveText: 0x10b07,
AskQuantityThrowAwayText: 0x10ae9,
ThrewAwayText: 0x10aee,
YouDontHaveAMonText: 0x10af8,
RaiseThePPOfWhichMoveText: 0xf725,
PPIsMaxedOutText: 0xf72f,
PPsIncreasedText: 0xf734,
BicycleEffect: 0xee08,
EvoStoneEffect: 0xee0f,
EscapeRopeEffect: 0xf44f,
RepelEffect: 0xf46a,
SuperRepelEffect: 0xf462,
MaxRepelEffect: 0xf466,
RepelUsedEarlierIsStillInEffectText: 0xf47d,
CoinCaseEffect: 0xf59a,
"CoinCaseEffect.CoinCaseCountText": 0xf5a0,
BlueCardEffect: 0xf58f,
"BlueCardEffect.BlueCardBalanceText": 0xf595,
SacredAshEffect: 0xf753,
SacredAshScript: 0x50821,
NormalBoxEffect: 0xf763,
GorgeousBoxEffect: 0xf767,
"OpenBox.SentTrophyHomeText": 0xf778,
ItemfinderEffect: 0xf5b8,
CardKeyEffect: 0xf745,
BasementKeyEffect: 0xf74c,
SquirtbottleEffect: 0xf73e,
OldRodEffect: 0xf5a5,
GoodRodEffect: 0xf5a9,
SuperRodEffect: 0xf5ad,
VitaminEffect: 0xee3d,
RareCandyEffect: 0xef14,
ItemStatRoseText: 0xeea6,
StatStrings: 0xeeab,
StatExpItemPointerOffsets: 0xeeeb,
"PlacePartyMonEvoStoneCompatibility.string_able": 0x502a3,
"PlacePartyMonEvoStoneCompatibility.string_not_able": 0x502a8,
EvosAttacksPointers: 0x425b1,
EvolvingText: 0x42482,
CongratulationsYourPokemonText: 0x42473,
EvolvedIntoText: 0x42478,
StoppedEvolvingText: 0x4247d,
} as const;
/** Battle engine tables and texts, keyed by their PRET labels so that
* \`npm run check:reference\` can verify each address by name. */
export const BATTLE = {
DownpourText: 0x817a3,
SunGotBrightText: 0x817b8,
SandstormBrewedText: 0x816e4,
BattleText_RainContinuesToFall: 0x8091f,
BattleText_TheSunlightIsStrong: 0x80938,
BattleText_TheSandstormRages: 0x80951,
BattleText_TheRainStopped: 0x80967,
BattleText_TheSunlightFaded: 0x8097a,
BattleText_TheSandstormSubsided: 0x8098f,
SandstormHitsText: 0x8084d,
MadeSubstituteText: 0x81362,
HasSubstituteText: 0x81378,
TooWeakSubText: 0x8138d,
SubTookDamageText: 0x813ad,
SubFadedText: 0x813d0,
TransformedText: 0x81499,
MimicLearnedMoveText: 0x813e6,
MirrorMoveFailedText: 0x815c1,
TransformedTypeText: 0x81452,
SketchedText: 0x81143,
FledFromBattleText: 0x812ac,
FledInFearText: 0x812c1,
BlownAwayText: 0x812d2,
DraggedOutText: 0x81544,
MetronomeExcepts: 0x37454,
WeatherTypeModifiers: 0xfbe13,
WeatherMoveModifiers: 0xfbe20,
WasSeededText: 0x813f8,
EvadedText: 0x81407,
LeechSeedSapsText: 0x8080e,
StartedNightmareText: 0x8160b,
HasANightmareText: 0x80822,
PutACurseText: 0x8163d,
HurtByCurseText: 0x80836,
DestinyBondEffectText: 0x81156,
TookDownWithItText: 0x810da,
ProtectedItselfText: 0x81665,
BracedItselfText: 0x816f9,
EnduredText: 0x80eb0,
SpiteEffectText: 0x8117f,
BellChimedText: 0x811a0,
WasDisabledText: 0x8141d,
GotAnEncoreText: 0x81109,
BattleText_TargetsEncoreEnded: 0x80c8a,
FellInLoveText: 0x8170b,
InLoveWithText: 0x80ec4,
InfatuationText: 0x80eda,
MistText: 0x8130b,
GettingPumpedText: 0x81338,
EliminatedStatsText: 0x81476,
WentToSleepText: 0x80fd7,
RestedText: 0x80fe9,
CantEscapeNowText: 0x815f7,
SharedPainText: 0x8111b,
BellyDrumText: 0x817d2,
CopiedStatsText: 0x817f6,
CoveredByVeilText: 0x8171c,
BattleText_SafeguardFaded: 0x808d2,
StartPerishText: 0x816c2,
PerishCountText: 0x80864,
SpikesText: 0x81691,
BattleText_UserHurtBySpikes: 0x80bae,
ShedLeechSeedText: 0x8177a,
BlewSpikesText: 0x8178e,
ReleasedByText: 0x81764,
ForesawAttackText: 0x81817,
BattleText_TargetWasHitByFutureSight: 0x808b6,
BadlyPoisonedText: 0x811e6,
IgnoredOrders2Text: 0x81850,
TookAimText: 0x81136,
StoringEnergyText: 0x80e6e,
UnleashedEnergyText: 0x80e84,
UsedBindText: 0x80e11,
WrappedByText: 0x80e44,
FireSpinTrapText: 0x80e34,
ClampedByText: 0x80e59,
WhirlpoolTrapText: 0x80e24,
BattleText_UsersHurtByStringBuffer1: 0x80de2,
BattleText_UserWasReleasedFromStringBuffer1: 0x80df5,
"BattleCommand_Charge.UsedText": 0x36bdb,
"BattleCommand_Charge.BattleMadeWhirlwindText": 0x36c0e,
"BattleCommand_Charge.BattleTookSunlightText": 0x36c13,
"BattleCommand_Charge.BattleLoweredHeadText": 0x36c18,
"BattleCommand_Charge.BattleGlowingText": 0x36c1d,
"BattleCommand_Charge.BattleFlewText": 0x36c22,
"BattleCommand_Charge.BattleDugText": 0x36c27,
PlayerHitTimesText: 0x812e5,
EnemyHitTimesText: 0x812f8,
DreamEatenText: 0x81227,
WasFrozenText: 0x8125d,
WasDefrostedText: 0x8162b,
CoinsScatteredText: 0x81435,
StoleText: 0x815da,
MagnitudeText: 0x81751,
BeatUpAttackText: 0x8182d,
PresentFailedText: 0x8183b,
CrashedText: 0x81046,
BattleText_PlayerPickedUpPayDayMoney: 0x80730,
MagnitudePower: 0x379b4,
PresentPower: 0x37907,
FlailReversalPower: 0x35807,
HookedPokemonAttackedText: 0x8075c,
MagikarpLengths: 0xfbca8,
ItemUsedText: 0xf83d,
BallBrokeFreeText: 0xedb5,
BallAppearedCaughtText: 0xedba,
BallAlmostHadItText: 0xedbf,
BallSoCloseText: 0xedc4,
Text_GotchaMonWasCaught: 0xedc9,
WaitButtonText: 0xede6,
NewDexDataText: 0xedf0,
AskGiveNicknameText: 0xedf5,
BallBlockedText: 0xf824,
BallBoxFullText: 0xf838,
BallSentToPCText: 0xedeb,
BallDontBeAThiefText: 0xf829,
WobbleProbabilities: 0xf9ba,
"CatchTutorial.Dude": 0x4e5da,
LightScreenEffectText: 0x814b4,
ReflectEffectText: 0x814c7,
BattleText_MonsLightScreenFell: 0x808e7,
BattleText_MonsReflectFaded: 0x80905,
WantsToBattleText: 0x807a9,
BattleText_EnemyWasDefeated: 0x809da,
GotMoneyForWinningText: 0x809be,
SentSomeToMomText: 0x809fc,
SentHalfToMomText: 0x80a2a,
SentAllToMomText: 0x80a3d,
BattleText_EnemySentOut: 0x80af8,
BattleText_TheresNoEscapeFromTrainerBattle: 0x80b49,
AccuracyLevelMultipliers: 0x34eb2,
AlreadyAsleepText: 0x811c1,
AlreadyConfusedText: 0x80dcc,
AlreadyParalyzedText: 0x81592,
AlreadyPoisonedText: 0x811fa,
AlwaysFleeMons: 0x3c5b1,
AskForgetMoveText: 0x667f,
AttackMissed2Text: 0x81033,
AttackMissedText: 0x81020,
"BattleCommand_StatDownMessage.BattleStatFellText": 0x36415,
"BattleCommand_StatDownMessage.BattleStatSharplyFellText": 0x36410,
"BattleCommand_StatDownMessage.stat": 0x363fe,
"BattleCommand_StatUpMessage.BattleStatWentUpText": 0x363e4,
"BattleCommand_StatUpMessage.BattleStatWentWayUpText": 0x363df,
"BattleCommand_StatUpMessage.stat": 0x363cd,
BattleMonNicknameText: 0x3f2ef,
BattleText_CantEscape: 0x80ba0,
BattleText_CantEscape2: 0x80b3b,
BattleText_EnemyMonFainted: 0x809a8,
BattleText_GotAwaySafely: 0x80b77,
BattleText_ItemHealedConfusion: 0x80dab,
BattleText_MonFainted: 0x80a75,
BattleText_MonHasNoMovesLeft: 0x80c72,
BattleText_StringBuffer1GrewToLevel: 0x80c9c,
BattleText_UserRecoveredPPUsing: 0x80899,
BattleText_UserFledUsingAStringBuffer1: 0x80b89,
BattleText_UsersStringBuffer1Activated: 0x80bde,
LoafingAroundText: 0x80f19,
BeganToNapText: 0x80f31,
WontObeyText: 0x80f44,
TurnedAwayText: 0x80f54,
IgnoredOrdersText: 0x80f66,
IgnoredSleepingText: 0x80f7b,
BattleText_TargetRecoveredWithItem: 0x80880,
BattleText_TheMoveIsDisabled: 0x80c5b,
BattleText_TheresNoPPLeftForThisMove: 0x80c39,
BattleText_WildFled: 0x807bd,
BecameConfusedText: 0x80d97,
BoostedExpPointsText: 0x3f12c,
ButItFailedText: 0x814f0,
ConfusedNoMoreText: 0x80d81,
ConsumableEffects: 0x271de,
CriticalHitChances: 0x346ab,
CriticalHitMoves: 0x346a3,
CriticalHitText: 0x81086,
DefrostedOpponentText: 0x8124b,
DidNotLearnMoveText: 0x667a,
DidntAffect1Text: 0x8150c,
DidntAffect2Text: 0x81520,
DisabledMoveText: 0x80f02,
DisabledNoMoreText: 0x80d39,
DoesntAffectText: 0x81071,
EnemyText: 0x1295,
EnemyWithdrewText: 0x384d0,
ExpPointsText: 0x3f131,
FastAsleepText: 0x80ce7,
FellAsleepText: 0x811b1,
FlinchedText: 0x80d1a,
FrozenSolidText: 0x80d06,
FullyParalyzedText: 0x8157d,
GoMonText: 0x3f2d1,
HasNoPPLeftText: 0x80fba,
HeldStatusHealingEffects: 0x3de44,
HPIsFullText: 0x81534,
DoItMonText: 0x3f2d8,
GoForItMonText: 0x3f2df,
YourFoesWeakGetmMonText: 0x3f2e6,
"WithdrawMonText.WithdrawMonText": 0x3f2fa,
ThatsEnoughComeBackText: 0x3f348,
OKComeBackText: 0x3f34d,
GoodComeBackText: 0x3f352,
ComeBackText: 0x3f35b,
BattleText_UseNextMon: 0x80a83,
BattleText_MonIsAlreadyOut: 0x80c0d,
BattleText_MonCantBeRecalled: 0x80c22,
BattleText_TheresNoWillToBattle: 0x80b0b,
BattleText_AnEGGCantBattle: 0x80b26,
BattleText_EnemyIsAboutToUseWillPlayerChangeMon: 0x80aca,
ChooseAMonString: 0x504e4,
WhichPKMNString: 0x50504,
ItemEffects: 0xe73c,
RestoreHPEffect: 0xf186,
StatusHealingEffect: 0xefcc,
StatusHealingActions: 0xf071,
HealingHPAmounts: 0xf3af,
"PrintPartyMenuActionText.MenuActionTexts": 0x5057b,
ItemWontHaveEffectText: 0xf81f,
ItemCantUseOnEggText: 0xf810,
OakThisIsntTheTimeText: 0x10af3,
UseOnWhichPKMNString: 0x504f3,
FullRestoreEffect: 0xf128,
ReviveEffect: 0xf0c8,
RevivalHerbEffect: 0xf0a9,
EnergypowderEffect: 0xf18c,
EnergyRootEffect: 0xf190,
HealPowderEffect: 0xefad,
BitterBerryEffect: 0xf16a,
RestorePPEffect: 0xf5bf,
XItemEffect: 0xf4c5,
XAccuracyEffect: 0xf482,
GuardSpecEffect: 0xf4ab,
DireHitEffect: 0xf4b8,
PokeDollEffect: 0xf48f,
XItemStats: 0xf504,
HappinessChanges: 0x7221,
ItemLooksBitterText: 0xf80b,
RestoreThePPOfWhichMoveText: 0xf72a,
PPRestoredText: 0xf739,
HungOnText: 0x80e99,
HurtByBurnText: 0x807f8,
HurtByPoisonText: 0x807e2,
HurtItselfText: 0x80d5f,
IdentifiedText: 0x816b1,
IsConfusedText: 0x80d4f,
"IsHMMove.HMMoves": 0x34f0,
ItemAttributes: 0x67c1,
ItFailedText: 0x81500,
LearnedMoveText: 0x666b,
MoveAskForgetText: 0x6670,
MoveCantForgetHMText: 0x669a,
MoveEffectPriorities: 0x3c5df,
MoveEffectsPointers: 0x271f4,
MoveGrammar: 0x105e7a,
MoveNameText: 0x105e23,
"MoveNameText.endusedmovetexts": 0x105e39,
MustRechargeText: 0x80d27,
NoPPLeftText: 0x80f99,
NothingHappenedText: 0x814d9,
NotVeryEffectiveText: 0x810c1,
OftenFleeMons: 0x3c5a8,
OneHitKOText: 0x81097,
ParalyzedText: 0x81558,
"PrintTempMonStats.StatNames": 0x50bb5,
ProtectedByMistText: 0x81321,
ProtectedByText: 0x815a9,
ProtectingItselfText: 0x8167a,
RageBuildingText: 0x810f3,
RecoilText: 0x8134d,
RecoveredUsingText: 0x80bc2,
RegainedHealthText: 0x8100c,
SafeguardProtectText: 0x81733,
SometimesFleeMons: 0x3c59a,
StatLevelMultipliers: 0x364e6,
StatNames: 0x364a6,
StopLearningMoveText: 0x6675,
SuckedHealthText: 0x81210,
SuperEffectiveText: 0x810aa,
Text_1_2_and_Poof: 0x6684,
"Text_1_2_and_Poof.MoveForgotText": 0x6695,
Text_MonGainedExpPoint: 0x3f11b,
TypeBoostItems: 0x35703,
TypeMatchups: 0x34bb1,
UnaffectedText: 0x81061,
UsedMove1Text: 0x105e04,
UsedMove2Text: 0x105e0b,
UsedMoveText: 0x105db9,
"UsedMoveText_CheckObedience.UsedInsteadText": 0x105e1a,
WasBurnedText: 0x8123c,
WasPoisonedText: 0x811d5,
WildPokemonAppearedText: 0x80746,
PokemonFellFromTreeText: 0x80778,
AsleepTreeMonsNite: 0x3eb5d,
AsleepTreeMonsDay: 0x3eb69,
AsleepTreeMonsMorn: 0x3eb6f,
WokeUpText: 0x80cfa,
WontDropAnymoreText: 0x8128f,
WontRiseAnymoreText: 0x81272,
} as const;
/** The Pokégear (engine/pokegear/pokegear.asm) and the phone calls it
* makes (engine/phone/phone.asm): texts, strings and scripts, keyed by
* their PRET labels so that \`npm run check:reference\` can verify each
* address by name. */
export const POKEGEAR = {
PokegearPressButtonText: 0x914d3,
PokegearAskWhoCallText: 0x914ce,
PokegearAskDeleteText: 0x914d8,
"Pokegear_UpdateClock.GearTodayText": 0x90faf,
"PokegearPhone_MakePhoneCall.GearEllipseText": 0x9124c,
"PokegearPhone_MakePhoneCall.GearOutOfServiceText": 0x91251,
"PokegearPhoneContactSubmenu.CallDeleteCancelStrings": 0x9143f,
"PokegearPhoneContactSubmenu.CallCancelStrings": 0x9145b,
NonTrainerCallerNames: 0x903d6,
PhoneOutOfAreaScript: 0x90657,
PhoneScript_JustTalkToThem: 0x90660,
PhoneEllipseText: 0x90336,
String_AM: 0x1dd6fc,
String_PM: 0x1dd6ff,
"Mom_GetScriptPointer.ItemScript": 0xfd0fd,
"Mom_GetScriptPointer.DollScript": 0xfd10a,
MomItems_1: 0xfd136,
"MomItems_1.End": 0xfd15e,
MomItems_2: 0xfd15e,
"MomItems_2.End": 0xfd1ae,
} as const;
/** BankOfMom (engine/events/mom.asm): its texts, strings, menu and digit
* steps, keyed by their PRET labels. */
export const MOM = {
BankOfMom: 0x16218,
"DSTChecks.TimesetAskAdjustDSTText": 0x164f4,
"DSTChecks.MomLostGearBookletText": 0x164f9,
"DSTChecks.TimesetAskDSTText": 0x164fe,
"DSTChecks.TimesetDSTText": 0x16503,
"DSTChecks.TimesetAskNotDSTText": 0x16508,
"DSTChecks.TimesetNotDSTText": 0x1650d,
"Mom_WithdrawDepositMenuJoypad.DigitQuantities": 0x16613,
MomLeavingText1: 0x16649,
MomLeavingText2: 0x1664e,
MomLeavingText3: 0x16653,
MomIsThisAboutYourMoneyText: 0x16658,
MomBankWhatDoYouWantToDoText: 0x1665d,
MomStoreMoneyText: 0x16662,
MomTakeMoneyText: 0x16667,
MomSaveMoneyText: 0x1666c,
MomHaventSavedThatMuchText: 0x16671,
MomNotEnoughRoomInWalletText: 0x16676,
MomInsufficientFundsInWalletText: 0x1667b,
MomNotEnoughRoomInBankText: 0x16680,
MomStartSavingMoneyText: 0x16685,
MomStoredMoneyText: 0x1668a,
MomTakenMoneyText: 0x1668f,
MomJustDoWhatYouCanText: 0x16694,
Mom_SavedString: 0x16699,
Mon_WithdrawString: 0x1669f,
Mom_DepositString: 0x166a8,
Mom_HeldString: 0x166b0,
"BankOfMom_MenuHeader.MenuData": 0x166bd,
} as const;
/** TrainerCard (engine/menus/trainer_card.asm): its strings, the badges'
* OAM templates and the card graphics, keyed by their PRET labels. */
export const TRAINER_CARD = {
"TrainerCard_PrintTopHalfOfCard.Name_Money": 0x252ec,
"TrainerCard_Page1_PrintDexCaught_GameTime.Dex_PlayTime": 0x2534c,
"TrainerCard_Page1_PrintDexCaught_GameTime.Badges": 0x2535c,
TrainerCard_JohtoBadgesOAM: 0x254c9,
LeaderGFX: 0x25583,
BadgeGFX: 0x26043,
ChrisCardPic: 0x88365,
KrisCardPic: 0x88595,
PredefPals: 0x9df6,
} as const;
/** _Option (engine/menus/options_menu.asm): its screen and setting
* strings, keyed by their PRET labels. */
export const OPTIONS = {
StringOptions: 0xe4241,
"Options_TextSpeed.Fast": 0xe4337,
"Options_TextSpeed.Mid": 0xe433c,
"Options_TextSpeed.Slow": 0xe4341,
"Options_BattleScene.On": 0xe4398,
"Options_BattleScene.Off": 0xe439c,
"Options_BattleStyle.Shift": 0xe43d1,
"Options_BattleStyle.Set": 0xe43d7,
"Options_Sound.Mono": 0xe4416,
"Options_Sound.Stereo": 0xe441d,
"Options_Print.Lightest": 0xe4464,
"Options_Print.Lighter": 0xe446d,
"Options_Print.Normal": 0xe4476,
"Options_Print.Darker": 0xe447f,
"Options_Print.Darkest": 0xe4488,
"Options_MenuAccount.Off": 0xe44f2,
"Options_MenuAccount.On": 0xe44f6,
} as const;
export const MAP_GROUP_COUNT = 26;
export const NUM_POKEMON = 251;
export const NUM_TRAINER_CLASSES = 67;
export const NUM_ITEMS = 190;
export const NUM_ENGINE_FLAGS = 162;
export const NUM_FRUIT_TREES = 30;
export const NUM_SPRITEMOVEDATA = 37;
/** The last group has no following pointer to bound it. */
export const LAST_MAP_GROUP_SIZE = 11;
/** Areas whose rules, scripts and presentation are ported. Other decoded
* maps remain unavailable; the label only distinguishes interiors that share
* a ROM landmark name. */
export const NATIVE_MAPS: Record<string, string> = {
"24:3": "Route 29",
"24:13": "Route 29 gate",
"24:4": "New Bark Town",
"24:5": "Elm’s lab",
"24:6": "Your home",
"24:7": "Your room",
"24:8": "Neighbor’s house",
"24:9": "Elm’s house",
"26:1": "Route 30",
"26:3": "Cherrygrove City",
"26:4": "Poké Mart",
"26:5": "Pokémon Center",
"26:6": "Gym speech house",
"26:7": "Guide Gent’s house",
"26:8": "Evolution speech house",
"26:9": "Berry house",
"26:10": "Mr. Pokémon’s house",
};
export const INITIAL_POSITION = { map: "24:7", x: 3, y: 3 } as const;