Facing a Headbutt tree asks to HEADBUTT it, and HEADBUTT from the party menu skips the question. ShakeHeadbuttTree shakes the tree as a sprite over grass, then TreeMonEncounter scores the facing tile against the trainer ID and draws from the map's common or rare tree table. A Pokémon that falls fights as BATTLETYPE_TREE: "fell out of the tree!", and the time of day's AsleepTreeMons species start asleep. Smashable rocks run SmashRockScript, and ROCK SMASH from the party menu acts on the facing rock; after the rock breaks, RockMonEncounter gives the map's rock set a 40% chance of a wild battle. Closes #26 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
839 lines
27 KiB
TypeScript
839 lines
27 KiB
TypeScript
/** 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,
|
||
/** hMoneyTemp: HRAM, not WRAM like the other entries above. */
|
||
moneyTemp: 0xffc3,
|
||
} 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,
|
||
"_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,
|
||
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,
|
||
"_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,
|
||
"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,
|
||
AskQuantityThrowAwayText: 0x10ae9,
|
||
ThrewAwayText: 0x10aee,
|
||
YouDontHaveAMonText: 0x10af8,
|
||
RaiseThePPOfWhichMoveText: 0xf725,
|
||
PPIsMaxedOutText: 0xf72f,
|
||
PPsIncreasedText: 0xf734,
|
||
BicycleEffect: 0xee08,
|
||
EvoStoneEffect: 0xee0f,
|
||
EscapeRopeEffect: 0xf44f,
|
||
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 = {
|
||
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_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;
|