pokegold-spaceworld/ram/wram.asm
DrippingYellow baeb0acd54
Decompile and label all battle animations (#116)
* Began decompiling Bank $33

* Decompiled battle anim functions

* Decompiled battle anim OAM and AnimObjGFX, split up and labelled battle animation graphics, other minor changes

* Deleted useless files I forgot to delete

* Decompiled framesets

* Decompiled battle anim objects

* Partially started decompiling animations

* Finished decompiling and labelling bank 32 in its entirety

* Replaced gfx.c with latest version

* Labelled all sound effects, properly constantified

* Fixed up bg_effects.asm, other minor LYOverrides-related changes
2025-06-03 23:39:19 -04:00

1813 lines
29 KiB
NASM

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
wSoundLength:: db
wCurNoteDuration:: db
wCurMusicByte:: db
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
wPitchSweep:: db
wMusicID:: dw
wMusicBank:: db
wNoiseSampleAddress:: dw
wNoiseSampleDelay:: db
wc1a2:: db
wNoiseSampleSet:: db
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
wSweepingFadeIndex:: db
wSweepingFadeCounter:: db
wIncrementTempo: dw
wMapMusic:: db
wCryPitch:: dw
wCryLength:: dw
wLastVolume:: db
wc1b3:: db
wSFXPriority:: db
wChannel1JumpCondition:: db
wChannel2JumpCondition:: db
wChannel3JumpCondition:: db
wChannel4JumpCondition:: db
wStereoPanningMask:: db
wCryTracks:: db
; either wChannelsEnd or wMusicEnd, unsure
wSFXDuration:: db
wMusicInitEnd::
SECTION "OAM Buffer", WRAM0
wShadowOAM::
; wShadowOAMSprite00 - wShadowOAMSprite39
for n, NUM_SPRITE_OAM_STRUCTS
wShadowOAMSprite{02d:n}:: sprite_oam_struct wShadowOAMSprite{02d:n}
endr
wShadowOAMEnd::
wTileMap::
ds SCREEN_HEIGHT * SCREEN_WIDTH
UNION
wTileMapBackup::
ds SCREEN_HEIGHT * SCREEN_WIDTH
NEXTU
wc408:: db
wc409:: db
NEXTU
wSpriteAnimData::
; wSpriteAnimDict pairs keys with values
; keys: SPRITE_ANIM_DICT_* indexes (taken from SpriteAnimObjects)
; values: vTiles0 offsets
wSpriteAnimDict::
ds NUM_SPRITEANIMDICT_ENTRIES * 2
wSpriteAnimationStructs::
; field 0: index
; fields 1-3: loaded from SpriteAnimSeqData
wSpriteAnim1:: sprite_anim_struct wSpriteAnim1
wSpriteAnim2:: sprite_anim_struct wSpriteAnim2
wSpriteAnim3:: sprite_anim_struct wSpriteAnim3
wSpriteAnim4:: sprite_anim_struct wSpriteAnim4
wSpriteAnim5:: sprite_anim_struct wSpriteAnim5
wSpriteAnim6:: sprite_anim_struct wSpriteAnim6
wSpriteAnim7:: sprite_anim_struct wSpriteAnim7
wSpriteAnim8:: sprite_anim_struct wSpriteAnim8
wSpriteAnim9:: sprite_anim_struct wSpriteAnim9
wSpriteAnim10:: sprite_anim_struct wSpriteAnim10
wSpriteAnimationStructsEnd::
wSpriteAnimCount:: db
NEXTU
ds 1
wClockDialogArrowBlinkCounter:: ds 1
wc40a:: ds 1
; Monster or Trainer test?
wWhichPicTest::
db
wc40c:: ds 1
wc40d:: ds 1
wc40e:: ds 1
ds 3
wDayOfWeekBuffer:: db
ds 7
wc41a:: db
ds 1
wHourBuffer:: db
ds 9
wMinuteBuffer:: db
ds 150
UNION
wCurSpriteOAMAddr:: dw
NEXTU
ds 1
wCurIcon:: db
ENDU
wCurIconTile:: db
UNION
wCurSpriteOAMFlags:: db
NEXTU
wSpriteAnimAddrBackup:: dw
ENDU
wCurAnimVTile:: db
wCurAnimXCoord:: db
wCurAnimYCoord:: db
wCurAnimXOffset:: db
wCurAnimYOffset:: db
wGlobalAnimYOffset:: db
wGlobalAnimXOffset:: db
wSpriteAnimDataEnd::
ds 7
wNamingScreenDestinationPointer:: dw
wNamingScreenCurNameLength:: db
wNamingScreenMaxNameLength:: db
wNamingScreenType:: db
wNamingScreenCursorObjectPointer:: dw
wNamingScreenLastCharacter:: db
wNamingScreenStringEntryCoordY:: db
wNamingScreenStringEntryCoordX:: db
NEXTU
ds 200
wSlots::
wReel1:: slot_reel wReel1
wReel2:: slot_reel wReel2
wReel3:: slot_reel wReel3
wReel1Stopped:: ds 3
wReel2Stopped:: ds 3
wReel3Stopped:: ds 3
wSlotBias:: db
wSlotBet:: db
wFirstTwoReelsMatching:: db
wFirstTwoReelsMatchingSevens:: db
wSlotMatched:: db
wCurReelStopped:: ds 3
wPayout:: dw
wCurReelXCoord:: db
wCurReelYCoord:: db
ds 2
wSlotBuildingMatch:: db
wSlotsDataEnd::
ds 2
wc51a:: ds 1
ds 25
wSlotsEnd:: db
NEXTU
ds 200
wMemoryGameCards:: ds 9 * 5
wMemoryGameCardsEnd::
wMemoryGameLastCardPicked:: db
wMemoryGameCard1:: db
wMemoryGameCard2:: db
wMemoryGameCard1Location:: db
wMemoryGameCard2Location:: db
wMemoryGameNumberTriesRemaining:: db
wMemoryGameLastMatches:: ds 5
wMemoryGameCounter:: db
wMemoryGameNumCardsMatched:: db
NEXTU
ds 200
wPokedexOrder:: ds $100
wPokedexOrderEnd::
wDexListingScrollOffset:: db
wPokedexHandCursorPosIndex:: db
wCurDexMode:: db
wPokedexInputFlags:: db
wPokedexHandCursorStructAddress:: dw
wPokedexCursorStructAddress:: dw
wPokedexSlowpokeAnimStructAddress:: dw
wDexListingEnd:: db
wDexTempCursorY:: db
wDexTempListingScrollOffset:: db
wDexListingCursor:: db
wDexUnownCount::
wDexSearchMonType1:: db
wDexUnownModeListLength::
wDexSearchMonType2:: db
wDexArrowCursorPosIndex:: db
wDexCurUnownIndex::
wDexConvertedMonType:: db
wDexSearchResultCount:: db
wc5e3:: db
wc5e4:: db
wc5e5:: db
wc5e6:: db
wDexPlaySlowpokeAnimation:: db
ENDU
SECTION "Map Buffer", WRAM0
wMapBuffer::
wMapScriptNumber:: db
wMapScriptNumberLocation:: dw
wUnknownMapPointer:: dw ; TODO
wc5ed:: db
ds 18
wMapBufferEnd::
UNION
wc600::
wOverworldMapBlocks:: ds 1300
wOverworldMapBlocksEnd::
NEXTU
wLYOverrides:: ds SCREEN_HEIGHT_PX
wLYOverridesEnd:: db
ds 15
wLYOverrides2:: ds SCREEN_HEIGHT_PX
wLYOverrides2End::
NEXTU
; Pikachu minigame
wPikachuMinigamePikachuObjectPointer:: ds 2
wPikachuMinigamePikachuTailObjectPointer:: ds 2
wPikachuMinigamePikachuNextAnim:: ds 1
wPikachuMinigameControlEnable:: ds 1
wc606:: ds 1 ; written to, but is this read from?
wPikachuMinigamePikachuYOffset:: ds 1
wPikachuMinigameNoteTimer:: ds 1
wPikachuMinigameScore:: ds 2
wPikachuMinigameNoteCounter:: ds 2 ; not used for anything meaningful?
wPikachuMinigameSpawnTypeIndex:: ds 1
wPikachuMinigameSpawnDataIndex:: ds 1
wPikachuMinigameScoreModifier:: ds 1
wPikachuMinigameNoteCaught:: ds 1
; Time keeping
wPikachuMinigameTimeFrames:: ds 1
wPikachuMinigameTimeSeconds:: ds 1
; are these two used?
wc613:: ds 1
wc614:: ds 1
wPikachuMinigameRedrawTimer:: ds 1
wc616:: ds 1
wPikachuMinigameScrollSpeed:: ds 1
wPikachuMinigameColumnFlags:: ds 1
wPikachuMinigameSavedColumnPointer:: ds 2
wPikachuMinigameColumnPointer:: ds 2
wPikachuMinigameRepeatColumnCounter:: ds 1
wPikachuMinigameRepeatColumnCounter2:: ds 1
wPikachuMinigameSceneTimer:: ds 1
wPikachuMinigameJumptableIndex:: ds 1
wPikachuMinigameBGMapPointer:: ds 2
wPikachuMinigameTilemapPointer:: ds 2
wPikachuMinigameTilesPointer:: ds 2
wPikachuMinigameColumnBuffer:: ds 16
NEXTU
wPicrossCursorSpritePointer:: ds 2
wPicrossCurrentGridNumber:: ds 1
wPicrossCurrentCellNumber:: ds 1
wPicrossCurrentCellType:: ds 1
wPicrossJoypadAction:: ds 1
wPicrossJoyStateBuffer:: ds 1
wPicrossCursorMovementDelay:: ds 1
wPicrossMarkedCells:: ds 4*4*4*4
ds 1
wPicrossLayoutBuffer:: ds $20
wPicrossLayoutBuffer2:: ds $20 - 1
wPicrossBitmap:: ds 4*4*4*4
wPicrossBase2bppPointer:: ds 2
wPicrossBaseGFXPointer:: ds 2
wPicrossDrawingRoutineCounter:: ds 1
ds 11
wPicrossNumbersBuffer:: ds 4*4*4*4
wPicrossRowGFX2bppBuffer:: ds 144
ds 112
wPicrossErrorCheck:: ds 1
ds 1
NEXTU
; Battle-related
ds $140
wBattleAnimTileDict::
; wBattleAnimTileDict pairs keys with values
; keys: BATTLE_ANIM_GFX_* indexes (taken from anim_*gfx arguments)
; values: vTiles0 offsets
ds NUM_BATTLEANIMTILEDICT_ENTRIES * 2
wActiveAnimObjects::
; wAnimObject1 - wAnimObject10
for n, 1, NUM_BATTLE_ANIM_STRUCTS + 1
wAnimObject{d:n}:: battle_anim_struct wAnimObject{d:n}
endr
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::
wLastAnimObjectIndex:: db
wBattleAnimFlags:: db
wBattleAnimAddress:: dw
wBattleAnimDuration:: db
wBattleAnimParent:: dw
wBattleAnimLoops:: db
wBattleAnimVar:: db
wBattleAnimByte:: db
wBattleAnimOAMPointerLo:: db
db
UNION
wBattleObjectTempID:: db
wBattleObjectTempXCoord:: db
wBattleObjectTempYCoord:: db
wBattleObjectTempParam:: db
NEXTU
wBattleBGEffectTempID:: db
wBattleBGEffectTempJumptableIndex:: db
wBattleBGEffectTempTurn:: db
wBattleBGEffectTempParam:: db
NEXTU
wBattleSineWaveTempProgress:: db
wBattleSineWaveTempOffset:: db
wBattleSineWaveTempAmplitude:: db
wBattleSineWaveTempTimer:: db
NEXTU
wBattleAnimTempOAMFlags:: db
wBattleAnimTempFixY:: db
wBattleAnimTempTileID:: db
wBattleAnimTempXCoord:: db
wBattleAnimTempYCoord:: db
wBattleAnimTempXOffset:: db
wBattleAnimTempYOffset:: db
wBattleAnimTempFrameOAMFlags:: db
wBattleAnimTempPalette:: db
NEXTU
wBattleAnimGFXTempTileID::
wBattleAnimGFXTempPicHeight:: db
wBattlePicResizeTempPointer:: dw
ENDU
ds $32
wBattleAnimEnd::
ds $1a3 ; TODO
wBattle::
wEnemyMoveStruct:: move_struct wEnemyMoveStruct
wPlayerMoveStruct:: move_struct wPlayerMoveStruct
wEnemyMonNickname:: ds 6
wBattleMonNickname:: ds 6
UNION
wBattleMon:: battle_struct wBattleMon
NEXTU
ds 14
wIntroJumptableIndex:: db
wIntroBGMapPointer:: ds 2
wIntroTilemapPointer:: ds 2
wIntroTilesPointer:: ds 2
wIntroFrameCounter1:: ds 1
wIntroFrameCounter2:: ds 1
wIntroSpriteStateFlag:: ds 1
ENDU
wca22:: ds 1
wca23:: ds 1
wca24:: ds 1
ds 6
wca2b:: ds 1
ds 10
wCurOTMon:: db
wBattleParticipantsNotFainted::
; Bit array. Bits 0 - 5 correspond to party members 1 - 6.
; Bit set if the mon appears in battle.
; Bit cleared if the mon faints.
; Backed up if the enemy switches.
; All bits cleared if the enemy faints.
db
wTypeModifier::
; >10: super-effective
; 10: normal
; <10: not very effective
; bit 7: stab
db
wCriticalHit::
; 0 if not critical
; 1 for a critical hit
; 2 for a OHKO
db
wAttackMissed::
; nonzero for a miss
wca3a:: db
wPlayerSubStatus1:: db
wPlayerSubStatus2:: db
wPlayerSubStatus3:: db
wPlayerSubStatus4:: db
wPlayerSubStatus5:: db
wEnemySubStatus1:: db
wEnemySubStatus2:: db
wEnemySubStatus3:: db
wEnemySubStatus4:: db
wEnemySubStatus5:: db
wPlayerRolloutCount:: db
wPlayerConfuseCount:: db
wPlayerToxicCount:: db
wPlayerDisableCount:: db
wPlayerEncoreCount:: db
wPlayerPerishCount:: db
wPlayerFuryCutterCount:: db
ds 1
wEnemyRolloutCount:: db
wEnemyConfuseCount:: db
wEnemyToxicCount:: db
wEnemyDisableCount:: db
wEnemyEncoreCount:: db
wEnemyPerishCount:: db
wEnemyFuryCutterCount:: db
ds 1
wPlayerDamageTaken:: dw
wEnemyDamageTaken:: dw
UNION
wBattleReward:: ds 3
NEXTU
wPicrossAnimateDust:: ds 1
ENDU
wBattleAnimParam::
wca5c:: ds 1
wBattleScriptBuffer:: ds 30
wBattleScriptBufferAddress:: dw
wTurnEnded:: db
ds $15
wPlayerStats::
wPlayerAttack:: dw
wPlayerDefense:: dw
wPlayerSpeed:: dw
wPlayerSpAtk:: dw
wPlayerSpDef:: dw
ds 1
wEnemyStats::
wEnemyAttack:: dw
wEnemyDefense:: dw
wEnemySpeed:: dw
wEnemySpAtk:: dw
wEnemySpDef:: dw
ds 1
wPlayerStatLevels::
wPlayerAtkLevel::
wcaa9:: ds 1
wPlayerDefLevel:: db
wPlayerSpdLevel:: db
wPlayerSAtkLevel:: db
wPlayerSDefLevel:: db
wPlayerAccLevel:: db
wPlayerEvaLevel:: db
ds 1
wEnemyStatLevels::
wEnemyAtkLevel::
wcab1:: ds 1
wEnemyDefLevel:: db
wEnemySpdLevel:: db
wEnemySAtkLevel:: db
wEnemySDefLevel:: db
wEnemyAccLevel:: db
wEnemyEvaLevel:: db
ds 1
wcab9:: ds 1
wcaba:: ds 1
ds 1
wPlayerSubstituteHP:: ds 1
wEnemySubstituteHP:: ds 1
wcabe:: ds 1
ds 1
wcac0:: ds 1
wCurPlayerSelectedMove:: db
wCurEnemySelectedMove:: db
wLinkBattleRNCount:: db
wEnemyItemState:: db
ds 2
wCurEnemyMoveNum:: db
wEnemyHPAtTimeOfPlayerSwitch:: dw
UNION
wPayDayMoney:: ds 3
NEXTU
wcaca:: ds 1
wcacb:: ds 1
wcacc:: ds 1
ENDU
wcacd:: ds 1
wcace:: ds 1
ds 1
wEnemyBackupDVs:: dw
wAlreadyDisobeyed::
wcad2:: ds 1
wDisabledMove:: ds 1
wEnemyDisabledMove:: ds 1
wcad5:: ds 1
UNION
wCurPlayerMove:: ds 1
wCurEnemyMove:: ds 1
NEXTU
wcad6:: ds 1
wcad7:: ds 1
ENDU
wEnemyMinimized:: db
wAlreadyFailed:: db
wBattleParticipantsIncludingFainted:: db
wBattleLowHealthAlarm:: db
wPlayerMinimized:: db
wPlayerScreens::
wcadd:: db
wEnemyScreens::
wcade:: db
wPlayerSafeguardCount:: db
wEnemySafeguardCount:: db
; There's got to be a better name for this...
wMonSGBPaletteFlagsBuffer:: db
wBattleWeather:: db
wWeatherCount:: db
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
wSelectedItem::
wCurSpecies:: db
wNamedObjectTypeBuffer:: db
SECTION "CB5E", WRAM0[$CB5E]
wJumptableIndex:: db
wSlotsDelay::
wMemoryGameCardChoice::
wFlyDestination::
wIntroSceneFrameCounter::
wTrainerGearPointerPosition::
wPokedexSlowpokeNumSearchEntries::
wNestIconBlinkCounter::
wBattleTransitionCounter:: db
wBattleTransitionSineWaveOffset::
wBattleTransitionSpinQuadrant::
wIntroSceneTimer::
wTrainerGearCard::
wcb60:: ds 1
wTrainerGearRadioIndex::
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
wFieldDebugPage::
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
ds 2
wcc1c:: dw
ds 1
wcc1f:: dw
ds 1
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
UNION
wcc3a::
wChargeMoveNum::
wMovementBufferCount:: db
wcc3b::
wMovementBufferObject:: db
ptrba wMovementBufferPointer
wMovementBuffer::
ds 55
NEXTU
wSpriteViewerMenuStartingItem:: db
ds 2
wSpriteViewerSavedMenuPointerY:: db
wSpriteViewerJumptableIndex:: db
ds 56
NEXTU
; trainer HUD data
ds 1
wPlaceBallsDirection:: db
wTrainerHUDTiles:: ds 4
ENDU
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
wFXAnimID:: dw
wPlaceBallsX:: db
wPlaceBallsY:: db
; Both RBY and final GSC write directly to wLowHealth, this prototype writes it here.
; TODO: Investigate how it actually functions.
wLowHealthAlarmBuffer:: db
SECTION "CCC7", WRAM0[$CCC7]
wDisableVBlankOAMUpdate:: db
SECTION "CCCA", WRAM0[$CCCA]
wBGP:: db
wOBP0:: db
wOBP1:: db
wNumHits:: db
wDisableVBlankWYUpdate:: db
wSGB:: db
SECTION "CCD0", WRAM0[$CCD0]
wccd0:: ds 1
wPlayerHPPal:: ds 1
wEnemyHPPal:: ds 1
wHPPals:: ds PARTY_LENGTH
wCurHPPal:: db
ds 7
; Todo: Replace instances of wcce1-f4 with "wSGBPals + #"
wSGBPals:: ; ds PALPACKET_LENGTH * 3
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 11
wcd1d:: ds 8
ds 1
UNION
wStringBuffer1:: ds STRING_BUFFER_LENGTH
NEXTU
ds 1
wcd27:: ds 1
ds 1
wcd29:: ds 1
wcd2a:: ds 1
ENDU
SECTION "CD31", WRAM0[$CD31]
UNION
wStartDay:: db
wStartHour:: db
wStartMinute:: db
NEXTU
wHPBarTempHP:: dw
NEXTU
wStringBuffer2:: ds STRING_BUFFER_LENGTH
NEXTU
wcd31:: db
wcd32:: db
wcd33:: db
ENDU
SECTION "CD3C", WRAM0[$CD3C]
wcd3c:: db
wRegularItemsCursor:: db
wBackpackAndKeyItemsCursor:: db
wBattleMenuCursorPosition::
wStartmenuCursor:: db
wCurMoveNum:: db
wCurBattleMon::
wcd41:: db
wcd42:: db
wFieldDebugMenuCursorBuffer::
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
wNumMoves::
wcd57:: ds 1
wItemEffectSucceeded::
wFieldMoveSucceeded::
; 0 - use move
; 1 - use item
; 2 - switch
wBattlePlayerAction:: db
wVramState:: db
ds 3 ; TODO
wcd5d:: db
db
wChosenStarter:: db
wcd60:: db
SECTION "CD70", WRAM0[$CD70]
wcd70:: ds 1
wcd71:: ds 1
wcd72:: dw
wcd74:: db
wcd75:: db
wCurItem:: db
wItemIndex:: db
wCurPartySpecies: db
wCurPartyMon: db
SECTION "CD7B", WRAM0[$CD7B]
wWhichHPBar:: db
wPokemonWithdrawDepositParameter:: ds 1
wItemQuantity:: db
wItemQuantityBuffer:: db
wTempMon:: party_struct wTempMon
wSpriteFlags:: db
wTalkingTargetType:: db
;bit 0 = has engaged NPC in dialogue
;bit 1 = has engaged sign in dialogue
wcdb1:: ds 1
wcdb2:: ds 1
ds 1
wcdb4:: ds 1
wcdb5:: ds 1
wcdb6:: ds 1
ds 2
wPartyMenuActionText:: ds 1
wItemAttributeValue:: db
wCurPartyLevel:: db
wScrollingMenuListSize:: db
wLinkMode:: db
; 00 -
; 01 -
; 02 -
; 03 -
wNextWarp:: db
wNextMapGroup:: db
wNextMapNumber:: db
wPrevWarp:: db
wcdc2:: db
UNION
wSkipMovesBeforeLevelUp::
wListMovesLineSpacing::
wFieldMoveScriptID:: db
wMapBlocksAddress:: dw
wReplacementBlock:: db
NEXTU
wMonSubmenuCount:: db
wMonSubmenuItems:: ds NUM_MONMENU_ITEMS + 1
NEXTU
wHPBarMaxHP:: dw
wHPBarOldHP:: dw
wHPBarNewHP:: dw
wHPBarDelta:: dw
wHPBarHPDifference:: dw
NEXTU
; switch AI
wEnemyEffectivenessVsPlayerMons:: flag_array PARTY_LENGTH
wPlayerEffectivenessVsEnemyMons:: flag_array PARTY_LENGTH
NEXTU
wcdc3:: db
wcdc4:: db
wcdc5:: db
wcdc6:: db
wcdc7:: db
wcdc8:: db
ds 1
wcdca:: db
NEXTU
; battle HUD
wBattleHUDTiles:: ds PARTY_LENGTH
NEXTU
; thrown ball data
wFinalCatchRate:: db
wThrownBallWobbleCount:: db
ENDU
wLinkBattleRNs:: ds 10
wTempEnemyMonSpecies:: ds 1
wTempBattleMonSpecies:: ds 1
wEnemyMon:: battle_struct wEnemyMon
wEnemyMonBaseStats:: ds NUM_EXP_STATS
wEnemyMonCatchRate:: db
wcdff:: ds 1
wBattleMode:: db
wce01:: ds 1
wOtherTrainerClass:: ds 1
wBattleType::
wce03:: ds 1
wce04:: ds 1
wOtherTrainerID:: ds 1
wBattleResult:: 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
wMonHeaderEnd::
SECTION "CE26", WRAM0[$CE26]
wce26:: ds 1
ds 2
wCurDamage:: dw
ds 2
wce2d:: ds 1
wListMoves_MoveIndicesBuffer:: ds NUM_MOVES
wce32:: ds 1
wce33:: ds 1
wce34:: ds 1
wWildMon:: db
wBattleHasJustStarted:: db
wNamedObjectIndexBuffer::
wNumSetBits::
wTextDecimalByte::
wTempIconSpecies::
wTempSpecies::
wMoveGrammar::
wTypeMatchup::
wCurType::
wTempByteValue::
wApplyStatLevelMultipliersToEnemy::
wce37::
db
wce38:: ds 1
wNumFleeAttempts::
wce39:: ds 1
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
wOptions::
; bit 0-2: number of frames to delay when printing text
; fast 1; mid 3; slow 5
; bit 3: ?
; bit 4: no text delay
; bit 5: stereo off/on
; bit 6: battle style shift/set
; bit 7: battle scene off/on
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]
UNION
wPlayerID:: dw
NEXTU
wce73: ds 1
wce74: ds 1
ENDU
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
; wObjectStruct1 - wObjectStruct12
for n, 1, NUM_OBJECT_STRUCTS - 1
wObject{d:n}Struct:: object_struct wObject{d:n}
endr
wCmdQueue::
wCmdQueueEntry1:: ds 16
wCmdQueueEntry2:: ds 16
wCmdQueueEntry3:: ds 16
wCmdQueueEntry4:: ds 16
wMapObjects::
wPlayerObject:: map_object wPlayer ; player is map object 0
; wMap1Object - wMap15Object
for n, 1, NUM_OBJECTS
wMap{d:n}Object:: map_object wMap{d:n}
endr
wd14f::
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 minutes 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]
wCoins:: db
wd15c:: db
wMoney:: ds 3
;wd15d:: db
;wd15e:: db
;wd15f:: db
SECTION "D163", WRAM0[$D163]
wBadges::
wJohtoBadges::
flag_array NUM_JOHTO_BADGES
wKantoBadges::
flag_array NUM_KANTO_BADGES
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]
wd35f:: 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[$D4A7]
wd4a7:: db
ds 1
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[$D642]
wd642:: db
wBGMapAnchor::
dw
UNION
wUsedSprites::
ds 2
NEXTU
ds 1
wd646:: db
ENDU
wUsedNPCSprites::
ds 8
wUsedStaticSprites::
ds 2
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
wTilesetAnim::
dw
ds 2 ; TODO
wTilesetEnd::
wPokemonData::
wPartyCount:: db
wPartySpecies:: ds PARTY_LENGTH
wPartyEnd:: db
wPartyMons::
; wPartyMon1 - wPartyMon6
for n, 1, PARTY_LENGTH + 1
wPartyMon{d:n}:: party_struct wPartyMon{d:n}
endr
wPartyMonOTs::
; wPartyMon1OT - wPartyMon6OT
for n, 1, PARTY_LENGTH + 1
wPartyMon{d:n}OT:: ds PLAYER_NAME_LENGTH
endr
wPartyMonNicknames::
; wPartyMon1Nickname - wPartyMon6Nickname
for n, 1, PARTY_LENGTH + 1
wPartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
endr
wPartyMonNicknamesEnd::
wPokedexCaught:: flag_array NUM_POKEMON
wEndPokedexCaught::
wPokedexSeen:: flag_array NUM_POKEMON
wEndPokedexSeen::
wUnownDex:: ds NUM_UNOWN
wAnnonID:: ds 1
wd875:: ds 1
wBufferMonNickname::
wd876:: ds 1
ds 5
wBufferMonOT::
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
wBreedMon1Nickname:: ds MON_NAME_LENGTH
wBreedMon1OT:: ds PLAYER_NAME_LENGTH
wBreedMon1:: box_struct wBreedMon1
wBreedMon2Nickname:: ds MON_NAME_LENGTH
wBreedMon2OT:: ds PLAYER_NAME_LENGTH
wBreedMon2:: box_struct wBreedMon2
SECTION "D8FD", WRAM0[$D8FD]
wd8fd:: ds 1
wd8fe:: ds 1
SECTION "D913", WRAM0[$D913]
wOTPartyCount:: db
wOTPartySpecies:: ds PARTY_LENGTH
wOTPartySpeciesEnd:: db
SECTION "Wild mon buffer", WRAM0[$D91B]
UNION
wWildMons::
ds 41
NEXTU
wOTPartyMons::
; wOTPartyMon1 - wOTPartyMon6
for n, 1, PARTY_LENGTH + 1
wOTPartyMon{d:n}:: party_struct wOTPartyMon{d:n}
endr
wOTPartyMonOT::
; wOTPartyMon1OT - wOTPartyMon6OT
for n, 1, PARTY_LENGTH + 1
wOTPartyMon{d:n}OT:: ds PLAYER_NAME_LENGTH
endr
wOTPartyMonNicknames::
; wOTPartyMon1Nickname - wOTPartyMon6Nickname
for n, 1, PARTY_LENGTH + 1
wOTPartyMon{d:n}Nickname:: ds MON_NAME_LENGTH
endr
wOTPartyDataEnd::
ENDU
SECTION "DA83", WRAM0[$DA83]
wBoxListLength:: db
wBoxList:: ds MONS_PER_BOX
wBoxListEnd:: db
SECTION "DAA3", WRAM0[$DAA3]
wBoxMons::
; wBoxMon1 - wBoxMon30
for n, 1, MONS_PER_BOX + 1
wBoxMon{d:n}:: box_struct wBoxMon{d:n}
endr
wBoxDataEnd::
SECTION "DE63", WRAM0[$DE63]
wBoxMonOT::
; wBoxMon1OT - wBoxMon30OT
for n, 1, MONS_PER_BOX + 1
wBoxMon{d:n}OT:: ds PLAYER_NAME_LENGTH
endr
wBoxMonOTEnd::
wBoxMonNicknames::
; wBoxMon1Nick - wBoxMon30Nick
for n, 1, MONS_PER_BOX + 1
wBoxMon{d:n}Nick:: ds MON_NAME_LENGTH
endr
wBoxMonNicknamesEnd::
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