INCLUDE "constants.asm" SECTION "Music engine RAM", WRAM0 wMusic:: wChannels:: wChannel1:: channel_struct wChannel1 wChannel2:: channel_struct wChannel2 wChannel3:: channel_struct wChannel3 wChannel4:: channel_struct wChannel4 wSFXChannels:: wChannel5:: channel_struct wChannel5 wChannel6:: channel_struct wChannel6 wChannel7:: channel_struct wChannel7 wChannel8:: channel_struct wChannel8 ds 1 wCurTrackDuty:: db wCurTrackIntensity:: db wCurTrackFrequency:: dw wc195:: db ds 2 ; TODO wCurChannel:: db wVolume:: db wSoundOutput:: ; corresponds to $ff25 ; bit 4-7: ch1-4 so2 on/off ; bit 0-3: ch1-4 so1 on/off db ds 1 ; TODO wMusicID:: dw wMusicBank:: db ds 5 ; TODO wLowHealthAlarm:: ; bit 7: on/off ; bit 4: pitch ; bit 0-3: counter db wMusicFade:: ; fades volume over x frames ; bit 7: fade in/out ; bit 0-6: number of frames for each volume level ; $00 = none (default) db wMusicFadeCount:: db wMusicFadeID:: wMusicFadeIDLow:: db wMusicFadeIDHigh:: db ds 2 ; TODO wIncrementTempo: dw wMapMusic:: db wCryPitch:: dw wCryLength:: dw ds 7 ; TODO wc1b9:: db wc1ba:: db ; either wChannelsEnd or wMusicEnd, unsure ds 1 ; TODO wMusicInitEnd:: SECTION "OAM Buffer", WRAM0 wVirtualOAM:: ds SPRITEOAMSTRUCT_LENGTH * NUM_SPRITE_OAM_STRUCTS wVirtualOAMEnd:: wTileMap:: ds SCREEN_HEIGHT * SCREEN_WIDTH UNION wTileMapBackup:: ds SCREEN_HEIGHT * SCREEN_WIDTH NEXTU ds 1 wc409:: ds 1 wc40a:: ds 1 ; Monster or Trainer test? wWhichPicTest:: db wc40c:: ds 1 wc40d:: ds 1 wc40e:: ds 1 ds 11 wc41a:: db ds 165 wSpriteAnimIDBuffer:: db ds 6 wc4c7:: db wc4c8:: db ds 7 wNamingScreenDestinationPointer:: dw wNamingScreenCurNameLength:: db wNamingScreenMaxNameLength:: db wNamingScreenType:: db wNamingScreenCursorObjectPointer:: dw wNamingScreenLastCharacter:: db wNamingScreenStringEntryCoordY:: db wNamingScreenStringEntryCoordX:: db ds 64 wc51a:: ds 1 ENDU SECTION "Map Buffer", WRAM0 wMapBuffer:: wMapScriptNumber:: db wMapScriptNumberLocation:: dw wUnknownMapPointer:: dw ; TODO wc5ed:: db ds 18 wMapBufferEnd:: UNION wOverworldMapBlocks:: ds 1300 wOverworldMapBlocksEnd:: NEXTU wLYOverrides:: ds SCREEN_HEIGHT_PX ds $10 wLYOverrides2:: NEXTU ; Battle-related ds $1ea wActiveBGEffects:: wBGEffect1:: battle_bg_effect wBGEffect1 wBGEffect2:: battle_bg_effect wBGEffect2 wBGEffect3:: battle_bg_effect wBGEffect3 wBGEffect4:: battle_bg_effect wBGEffect4 wBGEffect5:: battle_bg_effect wBGEffect5 wActiveBGEffectsEnd:: wNumActiveBattleAnims:: db wBattleAnimFlags:: db wBattleAnimAddress:: dw wBattleAnimDuration:: db wBattleAnimParent:: dw wBattleAnimLoops:: db wBattleAnimVar:: db wBattleAnimByte:: db wBattleAnimOAMPointerLo:: db db UNION ; unidentified wBattleAnimTemp0:: db wBattleAnimTemp1:: db wBattleAnimTemp2:: db wBattleAnimTemp3:: db NEXTU wBattleAnimTempOAMFlags:: db wBattleAnimTempField02:: db wBattleAnimTempTileID:: db wBattleAnimTempXCoord:: db wBattleAnimTempYCoord:: db wBattleAnimTempXOffset:: db wBattleAnimTempYOffset:: db wBattleAnimTempAddSubFlags:: db wBattleAnimTempPalette:: db ENDU ds $32 wBattleAnimEnd:: ds $1aa ; TODO wc9ef:: ds 1 ds 6 wBattleMonNickname:: ds 6 wEnemyMonNickname:: ds 6 wca02:: ds 1 wca03:: ds 1 wca04:: ds 1 ds 3 wca08:: ds 1 wca09:: ds 1 wca0a:: ds 1 ds 5 ; TODO wca10:: ds 1 wca11:: ds 1 wca12:: ds 1 wca13:: ds 1 wca14:: ds 1 ds $22 ; TODO wca37:: ds 1 wca38:: ds 1 wca39:: ds 1 wca3a:: ds 1 wca3b:: ds 1 wca3c:: ds 1 wPlayerSubStatus3:: db wca3e:: ds 1 wca3f:: ds 1 wca40:: ds 1 wca41:: ds 1 wEnemySubStatus3:: db wca43:: db wca44:: db ds $12 wTrainerClass:: db wca58:: ds 1 wca59:: ds 1 wca5a:: ds 1 wca5b:: ds 1 wca5c:: ds 1 ds $5c wcab9:: ds 1 ds 6 wcac0:: ds 1 wcac1:: ds 1 wcac2:: ds 1 wLinkBattleRNCount:: db ds 12 wcad0:: ds 1 ds 9 wcada:: ds 1 ds 6 wcae1:: ds 1 ENDU SECTION "CB14", WRAM0[$CB14] UNION wRedrawRowOrColumnSrcTiles:: ; the tiles of the row or column to be redrawn by RedrawRowOrColumn ds SCREEN_WIDTH * 2 NEXTU wRedrawFlashlightDst0:: dw wRedrawFlashlightSrc0:: dw wRedrawFlashlightBlackDst0:: dw wRedrawFlashlightDst1:: dw wRedrawFlashlightSrc1:: dw wRedrawFlashlightBlackDst1:: dw wRedrawFlashlightWidthHeight:: db ; width or height of flashlight redraw region ; in units of two tiles (people event meta tile) ENDU SECTION "CB56", WRAM0[$CB4C] wOtherPlayerLinkMode:: db wOtherPlayerLinkAction:: db ds 3 ; TODO wPlayerLinkAction:: db ds 4 ; TODO wLinkTimeoutFrames:: dw wcb58:: ds 2 wMonType:: db wCurSpecies:: db wNamedObjectTypeBuffer:: db SECTION "CB5E", WRAM0[$CB5E] wJumptableIndex:: db wFlyDestination:: db wcb60:: ds 1 wcb61:: ds 1 wVBCopySize:: ds 1 wVBCopySrc:: ds 2 wVBCopyDst:: ds 2 wVBCopyDoubleSize:: ds 1 wVBCopyDoubleSrc:: ds 2 wVBCopyDoubleDst:: ds 2 wcb6c:: db wcb6d:: db wcb6e:: db wPlayerStepDirection:: db SECTION "CB71", WRAM0[$CB70] wcb70:: db wVBCopyFarSize:: ds 1 wVBCopyFarSrc:: ds 2 wVBCopyFarDst:: ds 2 wVBCopyFarSrcBank:: ds 1 wPlayerMovement:: db wMovementObject:: db ptrba wMovementData wcb7c:: ds 1 SECTION "Collision buffer", WRAM0[$CB90] wTileDown:: db wTileUp:: db wTileLeft:: db wTileRight:: db wScreenSave:: ds 6 * 5 SECTION "CBB2", WRAM0[$CBB2] wToolgearBuffer:: ds $40 SECTION "CBF2", WRAM0[$CBF2] wWindowData:: wWindowStackPointer:: dw wMenuJoypad:: db wMenuSelection:: db wMenuSelectionQuantity:: db wWhichIndexSet:: wActiveBackpackPocket:: db wScrollingMenuCursorPosition:: db wWindowStackSize:: db SECTION "CC09", WRAM0[$CC02] wMenuDataHeader:: db wMenuBorderTopCoord:: db wMenuBorderLeftCoord:: db wMenuBorderBottomCoord:: db wMenuBorderRightCoord:: db wMenuDataPointer:: dw wMenuCursorBuffer:: db ds 8 ; TODO wMenuDataHeaderEnd:: wMenuData2:: wMenuDataFlags:: db wMenuDataItems:: db wMenuDataIndicesPointer:: dw wMenuDataDisplayFunctionPointer:: dw wMenuDataPointerTableAddr:: dw SECTION "MenuData3", WRAM0[$CC22] wMenuData3:: w2DMenuCursorInitY:: db w2DMenuCursorInitX:: db w2DMenuNumRows:: db w2DMenuNumCols:: db w2DMenuFlags:: dw w2DMenuCursorOffsets:: db wMenuJoypadFilter:: db w2DMenuDataEnd:: wMenuCursorY:: db wMenuCursorX:: db wCursorOffCharacter:: db wCursorCurrentTile:: dw SECTION "CC32", WRAM0[$CC32] ; Please merge when more is disassembled wVBlankJoyFrameCounter: db wVBlankOccurred: db wLastSpawnMapGroup: db wLastSpawnMapNumber: db ds 2 ;Controls what type of opening (fire/notes) you get. wcc38:: wTitleSequenceOpeningType:: db wDefaultSpawnPoint:: db wMovementBufferCount:: db wMovementBufferObject:: db ptrba wMovementBufferPointer wMovementBuffer:: ds 55 SECTION "CC9A", WRAM0[$CC9A] wSkatingDirection:: db wCompanionCollisionFrameCounter:: db wUnknownWordcc9c:: dw wUnknownBuffercc9e:: ds 14 wSpriteCurPosX : ds 1 wSpriteCurPosY : ds 1 wSpriteWidth : ds 1 wSpriteHeight : ds 1 wSpriteInputCurByte : ds 1 wSpriteInputBitCounter : ds 1 wSpriteOutputBitOffset : ds 1 wSpriteLoadFlags : ds 1 wSpriteUnpackMode : ds 1 wSpriteFlipped : ds 1 wSpriteInputPtr : ds 2 wSpriteOutputPtr : ds 2 wSpriteOutputPtrCached : ds 2 wSpriteDecodeTable0Ptr : ds 2 wSpriteDecodeTable1Ptr : ds 2 wccc0:: ds 1 wccc1:: ds 1 wccc2:: ds 1 wccc3:: ds 1 wccc4:: ds 1 SECTION "CCC7", WRAM0[$CCC7] wDisableVBlankOAMUpdate:: db SECTION "CCCA", WRAM0[$CCCA] wBGP:: db wOBP0:: db wOBP1:: db wcccd:: ds 1 wDisableVBlankWYUpdate:: db wSGB:: db SECTION "CCD0", WRAM0[$CCD0] wccd0:: ds 1 wccd1:: ds 1 wccd2:: ds 1 wccd3:: ds 1 ds 5 wccd9:: ds 1 SECTION "CCE1", WRAM0[$CCE1] wcce1:: ds 1 wcce2:: ds 1 wcce3:: ds 1 wcce4:: ds 1 ds 6 wcceb:: ds 1 ds 5 wccf1:: ds 1 wccf2:: ds 1 wccf3:: ds 1 wccf4:: ds 1 SECTION "CD11", WRAM0[$CD11] wcd11:: ds 1 ds 20 wStringBuffer1:: ds 1 ; How long is this? wcd27:: ds 1 SECTION "CD31", WRAM0[$CD31] UNION wStartDay:: db wStartHour:: db wStartMinute:: db NEXTU wHPBarTempHP:: dw NEXTU wStringBuffer2:: db ; How long is this? ENDU SECTION "CD3C", WRAM0[$CD3C] wcd3c:: db wRegularItemsCursor:: db wBackpackAndKeyItemsCursor:: db wStartmenuCursor:: db wcd40:: db wcd41:: db wcd42:: db wcd43:: db wRegularItemsScrollPosition:: db wBackpackAndKeyItemsScrollPosition:: db wcd46:: ds 1 wcd47:: ds 1 wSelectedSwapPosition:: db wMenuScrollPosition:: db wTextDest:: ds 2 wQueuedScriptBank:: db wQueuedScriptAddr:: dw wPredefID:: db wPredefHL:: dw wPredefDE:: dw wPredefBC:: wFarCallBCBuffer:: dw wcd56:: ds 1 wcd57:: ds 1 wFieldMoveSucceeded:: db wVramState:: db ds 3 ; TODO wcd5d:: db db wChosenStarter:: db SECTION "CD70", WRAM0[$CD70] wcd70:: ds 1 wcd71:: ds 1 wcd72:: dw wcd74:: db wcd75:: db wCurItem:: db wItemIndex:: db wMonDexIndex: db wWhichPokemon: db SECTION "CD7B", WRAM0[$CD7B] wHPBarType:: db wcd7c:: ds 1 wItemQuantity:: db wItemQuantityBuffer:: db wcd7f:: db wcd80:: db wcd81:: db SECTION "CD9E", WRAM0 [$CD9E] wLoadedMonLevel:: db SECTION "CDAF", WRAM0 [$CDAF] wcdaf:: db SECTION "CDB0", WRAM0 [$CDB0] wTalkingTargetType:: db ;bit 0 = has engaged NPC in dialogue ;bit 1 = has engaged sign in dialogue wcdb1:: ds 1 wcdb2:: ds 1 SECTION "CDB9", WRAM0[$CDB9] wcdb9:: ds 1 wItemAttributeParamBuffer:: db wCurPartyLevel:: db SECTION "CDBD", WRAM0[$CDBD] wLinkMode:: db ; 00 - ; 01 - ; 02 - ; 03 - wNextWarp:: db wNextMapGroup:: db wNextMapId:: db wPrevWarp:: db ds 1 UNION wFieldMoveScriptID:: db wMapBlocksAddress:: dw wReplacementBlock:: db NEXTU wHPBarMaxHP:: dw wHPBarOldHP:: dw ENDU wHPBarNewHP:: dw wHPBarDelta:: db wcdca:: db wHPBarHPDifference:: dw wLinkBattleRNs:: ds 10 wcdd7:: ds 1 wcdd8:: ds 1 wcdd9:: ds 1 wcdda:: ds 1 wcddb:: ds 1 wcddc:: ds 1 wcddd:: ds 1 wcdde:: ds 1 wcddf:: ds 1 wcde0:: ds 1 wcde1:: ds 1 wcde2:: ds 1 wcde3:: ds 1 wcde4:: ds 1 wcde5:: ds 1 wcde6:: ds 1 wcde7:: ds 1 wcde8:: ds 1 wcde9:: ds 1 wcdea:: ds 1 wcdeb:: ds 1 SECTION "CDFE", WRAM0[$CDFE] wcdfe:: ds 1 wcdff:: ds 1 wBattleMode:: db wce01:: ds 1 wce02:: ds 1 wce03:: ds 1 wce04:: ds 1 wce05:: ds 1 wce06:: ds 1 wMonHeader:: wMonHIndex:: ; In the ROM base stats data structure, this is the dex number, but it is ; overwritten with the dex number after the header is copied to WRAM. ds 1 wMonHBaseStats:: wMonHBaseHP:: ds 1 wMonHBaseAttack:: ds 1 wMonHBaseDefense:: ds 1 wMonHBaseSpeed:: ds 1 wMonHBaseSpecialAtt:: ds 1 wMonHBaseSpecialDef:: ds 1 wMonHTypes:: wMonHType1:: ds 1 wMonHType2:: ds 1 wMonHCatchRate:: ds 1 wMonHBaseEXP:: ds 1 wMonHItems:: wMonHItem1:: ds 1 wMonHItem2:: ds 1 wMonHGenderRatio:: ds 1 wMonHUnk0:: ds 1 wMonHUnk1:: ds 1 wMonHUnk2:: ds 1 wMonHSpriteDim:: ds 1 wMonHFrontSprite:: ds 2 wMonHBackSprite:: ds 2 wMonHGrowthRate:: ds 1 wMonHLearnset:: ; bit field flag_array 50 + 5 ; size = 7 ds 1 SECTION "CE2D", WRAM0[$CE2D] wce2d:: ds 1 wce2e:: ds 1 wce2f:: ds 1 wce30:: ds 1 wce31:: ds 1 wce32:: ds 1 wce33:: ds 1 wce34:: ds 1 wce35:: ds 1 wce36:: ds 1 wNamedObjectIndexBuffer:: wCountSetBitsResult:: wce37:: db SECTION "CE3A", WRAM0[$CE3A] wce3a:: ds 1 wVBlankSavedROMBank:: db wBuffer:: db wTimeOfDay:: db ; based on RTC ; Time of Day Regular Debug ; 00 - Day 09--15h 00--30s ; 01 - Night 15--06h 30--35s ; 02 - Cave 35--50s ; 03 - Morning 06--09h 50--59s wcd3f: ds 1 SECTION "CE5F", WRAM0[$CE5F] wce5f:: ; debug menu writes $41 to it db wce60:: db ; main menu checks this, maybe states if there's a save present? wActiveFrame:: db wTextBoxFlags:: db wDebugFlags:: db ; Bit 0: Debug battle indicator ; Bit 1: Debug field indicator ; Bit 2-3: Game is continued (set when selecting continue on the main menu) wce64:: ds 1 wce65:: ds 1 wce66:: ds 1 wPlayerName:: ds 6 wMomsName:: ds 6 SECTION "CE73", WRAM0[$CE73] wce73: ds 1 wce74: ds 1 wce75: ds 1 wObjectFollow_Leader:: db wObjectFollow_Follower:: db wCenteredObject:: db wFollowerMovementQueueLength:: db wFollowMovementQueue:: ds 5 wObjectStructs:: ; Note: this might actually not be an object. TODO: Investigate (if indexing starts at 1, then this isn't an object) ; It might just be unused/a leftover. wUnkObjectStruct:: object_struct wUnkObject wPlayerStruct:: object_struct wPlayer wObject1Struct:: object_struct wObject1 wObject2Struct:: object_struct wObject2 wObject3Struct:: object_struct wObject3 wObject4Struct:: object_struct wObject4 wObject5Struct:: object_struct wObject5 wObject6Struct:: object_struct wObject6 wObject7Struct:: object_struct wObject7 wObject8Struct:: object_struct wObject8 wObjectStructsEnd:: wCmdQueue:: wCmdQueueEntry1:: ds 16 wCmdQueueEntry2:: ds 16 wCmdQueueEntry3:: ds 16 wCmdQueueEntry4:: ds 16 wMapObjects:: wPlayerObject:: map_object wPlayer wMap1Object:: map_object wMap1 wMap2Object:: map_object wMap2 wMap3Object:: map_object wMap3 wMap4Object:: map_object wMap4 wMap5Object:: map_object wMap5 wMap6Object:: map_object wMap6 wMap7Object:: map_object wMap7 wMap8Object:: map_object wMap8 wMap9Object:: map_object wMap9 wMap10Object:: map_object wMap10 wMap11Object:: map_object wMap11 wMap12Object:: map_object wMap12 wMap13Object:: map_object wMap13 wMap14Object:: map_object wMap14 wMap15Object:: map_object wMap15 wMapObjectsEnd:: wToolgearFlags:: db ; 76543210 ; | | \- show toolgear ; | | ; | \--- transfer toolgear to window ; \-------- hide toolgear ds 2 ; TODO wTimeOfDayPal:: db ; Applied according to wCurTimeOfDay from wTimeOfDayPalset wd153:: db ; 76543210 ; | \- show player coords in toolgear instead of time ; \-------- switch overworld palettes according to seconds not hours ds 3 ; TODO wTimeOfDayPalFlags:: db ; 76543210 ; \-------- disable overworld palette switch wTimeOfDayPalset:: db ; 76543210 ; \/\/\/\/ ; | | | \- Map Palette for TimeOfDay $00 (MORN) ; | | \--- Map Palette for TimeOfDay $01 (DAY) ; | \----- Map Palette for TimeOfDay $02 (NITE) ; \------- Map Palette for TimeOfDay $03 (DARK) wCurTimeOfDay:: db SECTION "D15B", WRAM0[$D15B] wd15b:: db wd15c:: db wd15d:: db wd15e:: db wd15f:: db SECTION "D163", WRAM0[$D163] wd163:: db wd164:: db wTMsHMs:: db SECTION "D19E", WRAM0[$D19E] wItems:: wNumBagItems:: db SECTION "D1C8", WRAM0[$D1C8] wNumKeyItems:: db wKeyItems:: db SECTION "D1DE", WRAM0[$D1DE] wNumBallItems:: db wBallQuantities:: db ds 10 wUnknownListLengthd1ea:: db wUnknownListd1eb:: db SECTION "Rival's Name", WRAM0[$D256] wRegisteredItem:: db wRegisteredItemQuantity:: db wRivalName:: ds 6 ds 6 wPlayerState:: db ; 00 - walking ; 01 - bicycle ; 02 - skateboard ; 04 - surfing wd265:: db wd266:: db ;The starting house's map script number is stored at d29a. Others are probably nearby. SECTION "D29A", WRAM0[$D29A] wd29a:: db wd29b:: db wd29c:: db wd29d:: db wd29e:: db db wd2a0:: db SECTION "D35F", WRAM0[$D35F] wOptions:: db SECTION "D39D", WRAM0[$D39D] wd39d:: db SECTION "D3A5", WRAM0[$D3A5] wd3a5:: db SECTION "Game Event Flags", WRAM0[$D41A] wd41a:: db ; 76543210 ; | \- read email? ; \-------- talked to Blue, triggers Oak wd41b:: db ; 76543210 ; |\-- followed Oak to his back room ; \--- chose a starter wd41c:: db ; 76543210 ; \----- recieved pokedexes wd41d:: db ; 76543210 ; \--- beat rival in the lab wd41e:: db SECTION "D4A9", WRAM0[$D4A9] wd4a9:: db ds 1 ; TODO wJoypadFlags:: db ; 76543210 ; ||||\__/ ; |||| \-- unkn ; |||\----- set for rival intro textbox ; ||\------ don't wait for keypress to close text box ; |\------- joypad sync mtx ; \-------- joypad disabled SECTION "wDigWarpNumber", WRAM0[$D4B2] wDigWarpNumber:: db wd4b3:: ds 1 wd4b4:: ds 1 wd4b5:: ds 1 wd4b6:: ds 1 wd4b7:: ds 1 wd4b8:: ds 1 wd4b9:: ds 1 SECTION "Warp data", WRAM0[$D513] wWarpNumber:: db wCurrMapWarpCount:: db wCurrMapWarps:: REPT 32 ; TODO: confirm this ds 5 ENDR wCurrMapSignCount:: db wCurrMapSigns:: REPT 16 ; TODO: confirm this ds 4 ENDR wCurrMapObjectCount:: db wCurrMapInlineTrainers:: REPT 32 ; TODO: confirm this ds 2 ; inline trainers. each pair of bytes is direction, distance ENDR SECTION "D637", WRAM0[$D637] wd637:: db ;OW battle state? $3 wild battle, $8 is trainer battle $4 is left battle, $B is load overworld? $0 is in overworld wd638:: db ;wd637's last written-to value SECTION "Used sprites", WRAM0[$D643] wBGMapAnchor:: dw wUsedSprites:: dw ; This is for the player wUsedNPCSprites:: ds 2 * 5 ; This is for the NPCs wUsedSpritesEnd:: SECTION "Map header", WRAM0[$D656] wMapGroup:: db wMapId:: db wOverworldMapAnchor:: dw wYCoord:: db wXCoord:: db wMetatileNextY:: db wMetatileNextX:: db wd65e:: db wMapPartial:: wMapAttributesBank:: db wMapTileset:: db wMapPermissions:: db wMapAttributesPtr:: dw wMapPartialEnd:: wMapAttributes:: wMapHeight:: db wMapWidth:: db wMapBlocksPointer:: dw wMapTextPtr:: dw wMapScriptPtr:: dw wMapObjectsPtr:: dw wMapConnections:: db wMapAttributesEnd:: wNorthMapConnection:: map_connection_struct wNorth wSouthMapConnection:: map_connection_struct wSouth wWestMapConnection:: map_connection_struct wWest wEastMapConnection:: map_connection_struct wEast wTileset:: wTilesetBank:: db wTilesetBlocksAddress:: dw wTilesetTilesAddress:: dw wTilesetCollisionAddress:: dw ds 4 ; TODO wTilesetEnd:: wPartyCount:: db wPartySpecies:: ds PARTY_LENGTH wPartyEnd:: db wPartyMons:: wPartyMon1:: party_struct wPartyMon1 wPartyMon2:: party_struct wPartyMon2 wPartyMon3:: party_struct wPartyMon3 wPartyMon4:: party_struct wPartyMon4 wPartyMon5:: party_struct wPartyMon5 wPartyMon6:: party_struct wPartyMon6 wPlayerPartyEnd:: wPartyMonOT:: ds PARTY_LENGTH * 6 wPartyMonOTEnd:: wPartyMonNicknames:: ds PARTY_LENGTH * MON_NAME_LENGTH ; = $24 wPartyMonNicknamesEnd:: wPokedexOwned:: flag_array NUM_POKEMON wPokedexOwnedEnd:: wPokedexSeen:: flag_array NUM_POKEMON wPokedexSeenEnd:: wAnnonDex:: ds 26 wAnnonID:: ds 1 wd875:: ds 1 wd876:: ds 1 ds 5 wd87c:: ds 1 ds 5 wd882:: ds 1 wd883:: ds 1 wd884:: ds 1 SECTION "D8A2", WRAM0[$D8A2] wd8a2:: ds 1 wd8a3:: ds 1 wd8a4:: ds 1 wd8a5:: ds 1 ds 5 wd8ab:: ds 1 SECTION "wd8b1", WRAM0[$D8B1] wd8b1:: ds 1 ds 5 wd8b7:: ds 1 wd8b8:: ds 1 SECTION "D8D1", WRAM0[$D8D1] wd8d1:: ds 1 ds 5 wd8d7:: ds 1 ds 5 wd8dd:: ds 1 SECTION "D8E3", WRAM0[$D8E3] wd8e3:: ds 1 wd8e4:: ds 1 SECTION "D8FD", WRAM0[$D8FD] wd8fd:: ds 1 SECTION "D913", WRAM0[$D913] wd913:: ds 1 SECTION "Wild mon buffer", WRAM0[$D91B] UNION wWildMons:: ds 41 NEXTU ds 2 wd91d:: ds 1 ds 29 wd93b:: ds 1 ENDU SECTION "DA3B", WRAM0[$DA3B] wOTPartyMonOT:: db SECTION "DA5F", WRAM0[$DA5F] wda5f:: db SECTION "DA83", WRAM0[$DA83] wBoxListLength:: db wBoxList:: ds MONS_PER_BOX SECTION "DAA3", WRAM0[$DAA3] wdaa3:: db wdaa4:: db wdaa5:: db SECTION "DE63", WRAM0[$DE63] wde63:: db SECTION "DF17", WRAM0[$DF17] wdf17:: ds 1 SECTION "DFCB", WRAM0[$DFCB] wdfcb:: ds 1 SECTION "Stack Bottom", WRAM0 ; Where SP is set at game init wStackBottom:: ; Due to the way the stack works (`push` first decrements, then writes), the byte at $DFFF is actually wasted