summaryrefslogtreecommitdiff
path: root/wram.asm
diff options
context:
space:
mode:
Diffstat (limited to 'wram.asm')
-rwxr-xr-xwram.asm4610
1 files changed, 2305 insertions, 2305 deletions
diff --git a/wram.asm b/wram.asm
index 7d642d2e..75f849ee 100755
--- a/wram.asm
+++ b/wram.asm
@@ -1,2305 +1,2305 @@
-
-INCLUDE "constants.asm"
-
-flag_array: MACRO
- ds ((\1) + 7) / 8
-ENDM
-
-box_struct_length EQU 25 + NUM_MOVES * 2
-box_struct: MACRO
-\1Species:: db
-\1HP:: dw
-\1BoxLevel:: db
-\1Status:: db
-\1Type::
-\1Type1:: db
-\1Type2:: db
-\1CatchRate:: db
-\1Moves:: ds NUM_MOVES
-\1OTID:: dw
-\1Exp:: ds 3
-\1HPExp:: dw
-\1AttackExp:: dw
-\1DefenseExp:: dw
-\1SpeedExp:: dw
-\1SpecialExp:: dw
-\1DVs:: ds 2
-\1PP:: ds NUM_MOVES
-ENDM
-
-party_struct: MACRO
- box_struct \1
-\1Level:: db
-\1Stats::
-\1MaxHP:: dw
-\1Attack:: dw
-\1Defense:: dw
-\1Speed:: dw
-\1Special:: dw
-ENDM
-
-battle_struct: MACRO
-\1Species:: db
-\1HP:: dw
-\1BoxLevel:: db
-\1Status:: db
-\1Type::
-\1Type1:: db
-\1Type2:: db
-\1CatchRate:: db
-\1Moves:: ds NUM_MOVES
-\1DVs:: ds 2
-\1Level:: db
-\1MaxHP:: dw
-\1Attack:: dw
-\1Defense:: dw
-\1Speed:: dw
-\1Special:: dw
-\1PP:: ds NUM_MOVES
-ENDM
-
-
-SECTION "WRAM Bank 0", WRAM0
-
-wc000:: ds 1
-wc001:: ds 1
-wc002:: ds 1
-wc003:: ds 1
-wc004:: ds 1
-wc005:: ds 1
-wc006:: ds 8
-wc00e:: ds 4
-wc012:: ds 4
-wc016:: ds 16
-wc026:: ds 1
-wc027:: ds 1
-wc028:: ds 2
-wc02a:: ds 1
-wc02b:: ds 1
-wc02c:: ds 1
-wc02d:: ds 1
-wc02e:: ds 8
-wc036:: ds 8
-wc03e:: ds 8
-wc046:: ds 8
-wc04e:: ds 8
-wc056:: ds 8
-wc05e:: ds 8
-wc066:: ds 8
-wc06e:: ds 8
-wc076:: ds 8
-wc07e:: ds 8
-wc086:: ds 8
-wc08e:: ds 8
-wc096:: ds 8
-wc09e:: ds 8
-wc0a6:: ds 8
-wc0ae:: ds 8
-wc0b6:: ds 8
-wc0be:: ds 8
-wc0c6:: ds 8
-wc0ce:: ds 1
-wc0cf:: ds 1
-wc0d0:: ds 1
-wc0d1:: ds 1
-wc0d2:: ds 1
-wc0d3:: ds 1
-wc0d4:: ds 1
-wc0d5:: ds 1
-wc0d6:: ds 8
-wc0de:: ds 8
-wc0e6:: ds 1
-wc0e7:: ds 1
-wc0e8:: ds 1
-wc0e9:: ds 1
-wc0ea:: ds 1
-wc0eb:: ds 1
-wc0ec:: ds 1
-wc0ed:: ds 1
-wc0ee:: ds 1
-wc0ef:: ds 1
-wc0f0:: ds 1
-wc0f1:: ds 1
-wc0f2:: ds 14
-
-
-SECTION "Sprite State Data", WRAM0[$c100]
-
-wSpriteStateData1:: ; c100
-; data for all sprites on the current map
-; holds info for 16 sprites with $10 bytes each
-; player sprite is always sprite 0
-; C1x0: picture ID (fixed, loaded at map init)
-; C1x1: movement status (0: uninitialized, 1: ready, 2: delayed, 3: moving)
-; C1x2: sprite image index (changed on update, $ff if off screen, includes facing direction, progress in walking animation and a sprite-specific offset)
-; C1x3: Y screen position delta (-1,0 or 1; added to c1x4 on each walking animation update)
-; C1x4: Y screen position (in pixels, always 4 pixels above grid which makes sprites appear to be in the center of a tile)
-; C1x5: X screen position delta (-1,0 or 1; added to c1x6 on each walking animation update)
-; C1x6: X screen position (in pixels, snaps to grid if not currently walking)
-; C1x7: intra-animation-frame counter (counting upwards to 4 until c1x8 is incremented)
-; C1x8: animation frame counter (increased every 4 updates, hold four states (totalling to 16 walking frames)
-; C1x9: facing direction (0: down, 4: up, 8: left, $c: right)
-; C1xA
-; C1xB
-; C1xC
-; C1xD
-; C1xE
-; C1xF
- ds $10 * $10
-
-
-SECTION "Sprite State Data 2", WRAM0[$c200]
-
-wSpriteStateData2:: ; c200
-; more data for all sprites on the current map
-; holds info for 16 sprites with $10 bytes each
-; player sprite is always sprite 0
-; C2x0: walk animation counter (counting from $10 backwards when moving)
-; C2x1:
-; C2x2: Y displacement (initialized at 8, supposed to keep moving sprites from moving too far, but bugged)
-; C2x3: X displacement (initialized at 8, supposed to keep moving sprites from moving too far, but bugged)
-; C2x4: Y position (in 2x2 tile grid steps, topmost 2x2 tile has value 4)
-; C2x5: X position (in 2x2 tile grid steps, leftmost 2x2 tile has value 4)
-; C2x6: movement byte 1 (determines whether a sprite can move, $ff:not moving, $fe:random movements, others unknown)
-; C2x7: (?) (set to $80 when in grass, else $0; may be used to draw grass above the sprite)
-; C2x8: delay until next movement (counted downwards, status (c1x1) is set to ready if reached 0)
-; C2x9
-; C2xA
-; C2xB
-; C2xC
-; C2xD
-; C2xE: sprite image base offset (in video ram, player always has value 1, used to compute c1x2)
-; C2xF
- ds $10 * $10
-
-
-SECTION "OAM Buffer", WRAM0[$c300]
-
-wOAMBuffer:: ; c300
-; buffer for OAM data. Copied to OAM by DMA
- ds 4 * 40
-
-wTileMap:: ; c3a0
-; buffer for tiles that are visible on screen (20 columns by 18 rows)
- ds 20 * 18
-
-wSerialPartyMonsPatchList:: ; c508
-; list of indexes to patch with SERIAL_NO_DATA_BYTE after transfer
-
-wTileMapBackup:: ; c508
-; buffer for temporarily saving and restoring current screen's tiles
-; (e.g. if menus are drawn on top)
-; ds 20 * 18
-
- ds 200
-
-wSerialEnemyMonsPatchList:: ; c5d0
-; list of indexes to patch with SERIAL_NO_DATA_BYTE after transfer
- ds 200
-
- ds 80
-
-wTempPic::
-wOverworldMap:: ; c6e8
- ds 1300
-
-wScreenEdgeTiles:: ; cbfc
-; the tiles of the row or column to be redrawn by RedrawExposedScreenEdge
- ds 20 * 2
-
-; coordinates of the position of the cursor for the top menu item (id 0)
-wTopMenuItemY:: ; cc24
- ds 1
-wTopMenuItemX:: ; cc25
- ds 1
-
-wCurrentMenuItem:: ; cc26
-; the id of the currently selected menu item
-; the top item has id 0, the one below that has id 1, etc.
-; note that the "top item" means the top item currently visible on the screen
-; add this value to [wListScrollOffset] to get the item's position within the list
- ds 1
-
-wTileBehindCursor:: ; cc27
-; the tile that was behind the menu cursor's current location
- ds 1
-
-wMaxMenuItem:: ; cc28
-; id of the bottom menu item
- ds 1
-
-wMenuWatchedKeys:: ; cc29
-; bit mask of keys that the menu will respond to
- ds 1
-
-wLastMenuItem:: ; cc2a
-; id of previously selected menu item
- ds 1
-
-wcc2b:: ds 1
-wcc2c:: ds 1
-wcc2d:: ds 1
-
-wPlayerMoveListIndex:: ; cc2e
- ds 1
-
-wPlayerMonNumber:: ; cc2f
- ds 1
-
-wMenuCursorLocation:: ; cc30
-; the address of the menu cursor's current location within wTileMap
- ds 2
-
- ds 2
-
-wMenuJoypadPollCount:: ; cc34
-; how many times should HandleMenuInput poll the joypad state before it returns?
- ds 1
-
-wMenuItemToSwap:: ; cc35
-; id of menu item selected for swapping (counts from 1) (0 means that no menu item has been selected for swapping)
- ds 1
-
-wListScrollOffset:: ; cc36
-; offset of the current top menu item from the beginning of the list
-; keeps track of what section of the list is on screen
- ds 1
-
-wcc37:: ds 1
-
-wTradeCenterPointerTableIndex:: ; cc38
- ds 1
-
- ds 1
-
-wcc3a:: ds 1
-wcc3b:: ds 1
-
-wDoNotWaitForButtonPressAfterDisplayingText:: ; cc3c
-; if non-zero, skip waiting for a button press after displaying text in DisplayTextID
- ds 1
-
-wSerialSyncAndExchangeNybbleReceiveData:: ; cc3d
-; the final received nybble is stored here by Serial_SyncAndExchangeNybble
-
-wSerialExchangeNybbleTempReceiveData:: ; cc3d
-; temporary nybble used by Serial_ExchangeNybble
-
-wLinkMenuSelectionReceiveBuffer:: ; cc3d
-; two byte buffer
-; the received menu selection is stored twice
-
-wcc3d:: ds 1
-
-wSerialExchangeNybbleReceiveData:: ; cc3e
-; the final received nybble is stored here by Serial_ExchangeNybble
- ds 1
-
- ds 3
-
-wSerialExchangeNybbleSendData:: ; cc42
-; this nybble is sent when using Serial_SyncAndExchangeNybble or Serial_ExchangeNybble
-
-wLinkMenuSelectionSendBuffer:: ; cc42
-; two byte buffer
-; the menu selection byte is stored twice before sending
-
- ds 5
-
-wLinkTimeoutCounter:: ; cc47
-; 1 byte
-
-wUnknownSerialCounter:: ; cc47
-; 2 bytes
-
-wcc47:: ds 1
-wcc48:: ds 1
-
-wWhichTradeMonSelectionMenu:: ; cc49
-; $00 = player mons
-; $01 = enemy mons
-
-wcc49:: ds 1
-
-wMenuWrappingEnabled:: ; cc4a
-; set to 1 if you can go from the bottom to the top or top to bottom of a menu
-; set to 0 if you can't go past the top or bottom of the menu
- ds 1
-
-wcc4b:: ds 2
-wcc4d:: ds 1
-
-wPredefID:: ; cc4e
- ds 1
-wPredefRegisters:: ; cc4f
- ds 6
-
-wTrainerHeaderFlagBit:: ; cc55
- ds 1
-
- ds 1
-
-wNPCMovementScriptPointerTableNum:: ; cc57
-; which NPC movement script pointer is being used
-; 0 if an NPC movement script is not running
- ds 1
-
-wNPCMovementScriptBank:: ; cc58
-; ROM bank of current NPC movement script
- ds 1
-
- ds 2
-
-wHallOfFame:: ; cc5b
-wBoostExpByExpAll:: ; cc5b
-wAnimationType:: ; cc5b
-; values between 0-6. Shake screen horizontally, shake screen vertically, blink Pokemon...
-
-wcc5b:: ds 1
-wcc5c:: ds 1
-wcc5d:: ds 1
-wcc5e:: ds 13
-
-wcc6b:: ds 14
-wcc79:: ds 30
-
-wNPCMovementDirections2:: ; cc97
-
-wSwitchPartyMonTempBuffer:: ; cc97
-; temporary buffer when swapping party mon data
- ds 10
-
-wcca1:: ds 49
-
-wRLEByteCount:: ; ccd2
- ds 1
-
-wSimulatedJoypadStatesEnd:: ; ccd3
-; this is the end of the joypad states
-; the list starts above this address and extends downwards in memory until here
-; overloaded with below labels
-
-wccd3:: ds 1
-wccd4:: ds 1
-
-; if [ccd5] != 1, the second AI layer is not applied
-wAILayer2Encouragement:: ; ccd5
- ds 1
- ds 1
-
-; current HP of player and enemy substitutes
-wPlayerSubstituteHP:: ; ccd7
- ds 1
-wEnemySubstituteHP:: ; ccd8
- ds 1
-
-wccd9:: ds 2
-
-wMoveMenuType:: ; ccdb
-; 0=regular, 1=mimic, 2=above message box (relearn, heal pp..)
- ds 1
-
-wPlayerSelectedMove:: ; ccdc
- ds 1
-wEnemySelectedMove:: ; ccdd
- ds 1
-
-wLinkBattleRandomNumberListIndex:: ; ccde
- ds 1
-
-wAICount:: ; ccdf
-; number of times remaining that AI action can occur
- ds 1
-
- ds 2
-
-wEnemyMoveListIndex:: ; cce2
- ds 1
-
-wcce3:: ds 1
-wcce4:: ds 1
-
-wTotalPayDayMoney:: ; cce5
-; total amount of money made using Pay Day during the current battle
- ds 3
-
-wSafariEscapeFactor:: ; cce8
- ds 1
-wSafariBaitFactor:: ; cce9
- ds 1;
-
- ds 1
-
-wcceb:: ds 1
-wccec:: ds 1
-
-wMonIsDisobedient:: ds 1 ; cced
-
-wPlayerDisabledMoveNumber:: ds 1 ; ccee
-wEnemyDisabledMoveNumber:: ds 1 ; ccef
-
-wccf0:: ds 1
-
-wPlayerUsedMove:: ds 1 ; ccf1
-wEnemyUsedMove:: ds 1 ; ccf2
-
-wccf3:: ds 1
-
-wMoveDidntMiss:: ds 1 ; ccf4
-
-wPartyFoughtCurrentEnemyFlags:: ; ccf5
-; flags that indicate which party members have fought the current enemy mon
- flag_array 6
-
-wccf6:: ds 1
-wccf7:: ds 14
-
-wUnknownSlotVar:: ; cd05
-
-wEnemyNumHits:: ; cd05
-; number of hits by enemy in attacks like Double Slap, etc.
-
-wEnemyBideAccumulatedDamage:: ; cd05
-; the amount of damage accumulated by the enemy while biding (2 bytes)
-
-ds 10
-
-wInGameTradeGiveMonSpecies:: ; cd0f
-
-wPlayerMonUnmodifiedLevel:: ; cd0f
- ds 1
-
-wInGameTradeTextPointerTablePointer:: ; cd10
-
-wPlayerMonUnmodifiedMaxHP:: ; cd10
- ds 2
-
-wInGameTradeTextPointerTableIndex:: ; cd12
-
-wPlayerMonUnmodifiedAttack:: ; cd12
- ds 1
-wInGameTradeGiveMonName:: ; cd13
- ds 1
-wPlayerMonUnmodifiedDefense:: ; cd14
- ds 2
-wPlayerMonUnmodifiedSpeed:: ; cd16
- ds 2
-wPlayerMonUnmodifiedSpecial:: ; cd18
- ds 2
-
-; stat modifiers for the player's current pokemon
-; value can range from 1 - 13 ($1 to $D)
-; 7 is normal
-
-wPlayerMonStatMods::
-wPlayerMonAttackMod:: ; cd1a
- ds 1
-wPlayerMonDefenseMod:: ; cd1b
- ds 1
-wPlayerMonSpeedMod:: ; cd1c
- ds 1
-wPlayerMonSpecialMod:: ; cd1d
- ds 1
-
-wInGameTradeReceiveMonName:: ; cd1e
-
-wPlayerMonAccuracyMod:: ; cd1e
- ds 1
-wPlayerMonEvasionMod:: ; cd1f
- ds 1
-
- ds 3
-
-wEnemyMonUnmodifiedLevel:: ; cd23
- ds 1
-wEnemyMonUnmodifiedMaxHP:: ; cd24
- ds 2
-wEnemyMonUnmodifiedAttack:: ; cd26
- ds 2
-wEnemyMonUnmodifiedDefense:: ; cd28
- ds 1
-
-wInGameTradeMonNick:: ; cd29
- ds 1
-
-wEnemyMonUnmodifiedSpeed:: ; cd2a
- ds 2
-wEnemyMonUnmodifiedSpecial:: ; cd2c
- ds 1
-
-wEngagedTrainerClass:: ; cd2d
- ds 1
-wEngagedTrainerSet:: ; cd2e
-; ds 1
-
-; stat modifiers for the enemy's current pokemon
-; value can range from 1 - 13 ($1 to $D)
-; 7 is normal
-
-wEnemyMonStatMods::
-wEnemyMonAttackMod:: ; cd2e
- ds 1
-wEnemyMonDefenseMod:: ; cd2f
- ds 1
-wEnemyMonSpeedMod:: ; cd30
- ds 1
-wEnemyMonSpecialMod:: ; cd31
- ds 1
-wEnemyMonAccuracyMod:: ; cd32
- ds 1
-wEnemyMonEvasionMod:: ; cd33
- ds 1
-
-wInGameTradeReceiveMonSpecies::
- ds 1
-
- ds 2
-
-wNPCMovementDirections2Index:: ; cd37
-
-wcd37:: ds 1
-
-wSimulatedJoypadStatesIndex:: ; cd38
-; the next simulated joypad state is at wSimulatedJoypadStatesEnd plus this value minus 1
-; 0 if the joypad state is not being simulated
- ds 1
-
-wWastedByteCD39:: ; cd39
-; written to but nothing ever reads it
- ds 1
-
-wWastedByteCD3A:: ; cd3a
-; written to but nothing ever reads it
- ds 1
-
-wOverrideSimulatedJoypadStatesMask:: ; cd3b
-; mask indicating which real button presses can override simulated ones
-; XXX is it ever not 0?
- ds 1
-
- ds 1
-
-wTradedPlayerMonSpecies:: ; cd3d
-
-wTradingWhichPlayerMon:: ; cd3d
-
-wChangeBoxSavedMapTextPointer:: ; cd3d
-
-wFlyAnimUsingCoordList:: ; cd3d
-
-wPlayerSpinInPlaceAnimFrameDelay:: ; cd3d
-
-wPlayerSpinWhileMovingUpOrDownAnimDeltaY:: ; cd3d
-
-wHiddenObjectFunctionArgument:: ; cd3d
-
-wSubtrahend:: ; cd3d
-; subtract (BCD) wSubtrahend, wSubtrahend+1, wSubtrahend+2
-
-wWhichTrade:: ; cd3d
-; which entry from TradeMons to select
-
-wTrainerSpriteOffset:: ; cd3d
- ds 1
-
-wTradedEnemyMonSpecies:: ; cd3e
-
-wTradingWhichEnemyMon:: ; cd3e
-
-wFlyAnimCounter:: ; cd3e
-
-wPlayerSpinInPlaceAnimFrameDelayDelta:: ; cd3e
-
-wPlayerSpinWhileMovingUpOrDownAnimMaxY:: ; cd3e
-
-wHiddenObjectFunctionRomBank:: ; cd3e
-
-wTrainerEngageDistance:: ; cd3e
- ds 1
-
-wNameOfPlayerMonToBeTraded:: ; cd3f
-
-wFlyAnimBirdSpriteImageIndex:: ; cd3f
-
-wPlayerSpinInPlaceAnimFrameDelayEndValue:: ; cd3f
-
-wPlayerSpinWhileMovingUpOrDownAnimFrameDelay:: ; cd3f
-
-wHiddenObjectIndex:: ; cd3f
-
-wTrainerFacingDirection:: ; cd3f
-wcd3f::
- ds 1
-
-wPlayerSpinInPlaceAnimSoundID:: ; cd40
-
-wHiddenObjectY:: ; cd40
-
-wTrainerScreenY:: ; cd40
- ds 1
-
-wTradedPlayerMonOT:: ; cd41
-
-wHiddenObjectX:: ; cd41
-
-wTrainerScreenX:: ; cd41
- ds 1
-
-wcd42:: ds 1
-wcd43:: ds 1
-wcd44:: ds 1
-wcd45:: ds 1
-wcd46:: ds 1
-wcd47:: ds 1
-wcd48:: ds 1
-wcd49:: ds 1
-wcd4a:: ds 1
-wcd4b:: ds 1
-
-wTradedPlayerMonOTID:: ; cd4c
-
-wcd4c:: ds 1
-wcd4d:: ds 1
-
-wTradedEnemyMonOT:: ; cd4e
-
-wcd4e:: ds 1
-wcd4f:: ds 1
-wcd50:: ds 9
-
-wTradedEnemyMonOTID:: ; cd59
- ds 2
-
-wcd5b:: ds 1
-wcd5c:: ds 1
-
-wMonPartySpriteSpecies:: ; cd5d
- ds 1
-
-wLeftGBMonSpecies:: ; cd5e
-; in the trade animation, the mon that leaves the left gameboy
- ds 1
-
-wRightGBMonSpecies:: ; cd5f
-; in the trade animation, the mon that leaves the right gameboy
- ds 1
-
-wFlags_0xcd60:: ; cd60
-; bit 0: is player engaged by trainer (to avoid being engaged by multiple trainers simultaneously)
-; bit 1: boulder dust animation (from using Strength) pending
-; bit 5: don't play sound when A or B is pressed in menu
-; bit 6: tried pushing against boulder once (you need to push twice before it will move)
- ds 1
-
- ds 9
-
-wcd6a:: ds 1
-
-wJoyIgnore:: ; cd6b
-; Set buttons are ignored.
- ds 1
-
-wcd6c:: ds 1
-wcd6d:: ds 4
-wcd71:: ds 1
-wcd72:: ds 5
-wcd77:: ds 1
-wcd78:: ds 9
-
-wSerialOtherGameboyRandomNumberListBlock:: ; cd81
-; buffer for transferring the random number list generated by the other gameboy
-
-wTileMapBackup2:: ; cd81
-; second buffer for temporarily saving and restoring current screen's tiles (e.g. if menus are drawn on top)
- ds 20 * 18
-
-wBuffer:: ; cee9
-; Temporary storage area of 30 bytes.
-wHPBarMaxHP:: ; cee9
- ds 2
-wHPBarOldHP:: ; ceeb
- ds 2
-wHPBarNewHP:: ; ceed
- ds 2
-wHPBarDelta:: ; ceef
- ds 1
-
-wcef0:: ds 1
-wcef1:: ds 12
-
-wHPBarHPDifference:: ; cefd
- ds 1
- ds 7
-
-wcf05:: ds 1
-wcf06:: ds 1
-
-wAnimSoundID:: ; cf07
-; sound ID during battle animations
- ds 1
-
-wcf08:: ds 1
-wcf09:: ds 1
-wcf0a:: ds 1
-wBattleResult:: ; cf0b
-; $00 - win
-; $01 - lose
-; $02 - draw
- ds 1
-
-wAutoTextBoxDrawingControl:: ; cf0c
-; bit 0: if set, DisplayTextID automatically draws a text box
- ds 1
-
-wcf0d:: ds 1
-wcf0e:: ds 1
-wcf0f:: ds 1
-
-wNPCMovementScriptFunctionNum:: ; cf10
-; which script function within the pointer table indicated by
-; wNPCMovementScriptPointerTableNum
- ds 1
-
-wcf11:: ds 1
-
-wPredefParentBank:: ; cf12
- ds 1
-
-wSpriteIndex:: ds 1
-
-wCurSpriteMovement2:: ; cf14
-; movement byte 2 of current sprite
- ds 1
-
- ds 2
-
-wNPCMovementScriptSpriteOffset:: ; cf17
-; sprite offset of sprite being controlled by NPC movement script
- ds 1
-
-wcf18:: ds 2
-
-wOnSGB:: ; cf1b
-; if running on SGB, it's 1, else it's 0
- ds 1
-
-wcf1c:: ds 1
-wcf1d:: ds 1
-wcf1e:: ds 1
-wcf1f:: ds 6
-wcf25:: ds 8
-wcf2d:: ds 1
-wcf2e:: ds 2
-wcf30:: ds 7
-wcf37:: ds 20
-wcf4b:: ds 1
-wcf4c:: ds 1
-wGainBoostedExp:: ; cf4d
- ds 1
- ds 17
-
-wGymCityName:: ; cf5f
-wStringBuffer1:: ; cf5f
- ds 16 + 1
-wGymLeaderName:: ; cf70
-wStringBuffer2:: ; cf70
- ds 16 + 1
-wStringBuffer3:: ; cf81
- ds 9 + 1
-
-wList:: ; cf8b
- ds 2
-
-wcf8d:: ds 1
-wcf8e:: ds 1
-
-wItemPrices:: ; cf8f
- ds 2
-
-wcf91:: ds 1
-
-wWhichPokemon:: ; cf92
-; which pokemon you selected
- ds 1
-
-wcf93:: ds 1
-
-wHPBarType:: ; cf94
-; type of HP bar
-; $00 = enemy HUD in battle
-; $01 = player HUD in battle / status screen
-; $02 = party menu
-
-wListMenuID:: ; cf94
-; ID used by DisplayListMenuID
- ds 1
-
-wcf95:: ds 1
-wcf96:: ds 1
-wcf97:: ds 1
-
-; LoadMonData copies mon data here
-wLoadedMon:: party_struct wLoadedMon ; cf98
-
-wFontLoaded:: ; cfc4
-; bit 0: The space in VRAM that is used to store walk animation tile patterns
-; for the player and NPCs is in use for font tile patterns.
-; This means that NPC movement must be disabled.
-; The other bits are unused.
- ds 1
-
-wWalkCounter:: ; cfc5
-; walk animation counter
- ds 1
-
-wTileInFrontOfPlayer:: ; cfc6
-; background tile number in front of the player (either 1 or 2 steps ahead)
- ds 1
-
-wMusicHeaderPointer:: ; cfc7
-; (the current music channel address - $4000) / 3
- ds 1
-
-wcfc8:: ds 1
-wcfc9:: ds 1
-wcfca:: ds 1
-
-wUpdateSpritesEnabled:: ; cfcb
-; $01 enables UpdateSprites; anything else disables it
- ds 1
-
-W_ENEMYMOVENUM:: ; cfcc
- ds 1
-W_ENEMYMOVEEFFECT:: ; cfcd
- ds 1
-W_ENEMYMOVEPOWER:: ; cfce
- ds 1
-W_ENEMYMOVETYPE:: ; cfcf
- ds 1
-W_ENEMYMOVEACCURACY:: ; cfd0
- ds 1
-W_ENEMYMOVEMAXPP:: ; cfd1
- ds 1
-W_PLAYERMOVENUM:: ; cfd2
- ds 1
-W_PLAYERMOVEEFFECT:: ; cfd3
- ds 1
-W_PLAYERMOVEPOWER:: ; cfd4
- ds 1
-W_PLAYERMOVETYPE:: ; cfd5
- ds 1
-W_PLAYERMOVEACCURACY:: ; cfd6
- ds 1
-W_PLAYERMOVEMAXPP:: ; cfd7
- ds 1
-
-
-wEnemyMonSpecies2:: ; cfd8
- ds 1
-wBattleMonSpecies2:: ; cfd9
- ds 1
-
-wEnemyMonNick:: ds 11 ; cfda
-
-wEnemyMon:: ; cfe5
-; The wEnemyMon struct reaches past 0xcfff,
-; the end of wram bank 0 on cgb.
-; This has no significance on dmg, where wram
-; isn't banked (c000-dfff is contiguous).
-; However, recent versions of rgbds have replaced
-; dmg-style wram with cgb wram banks.
-
-; Until this is fixed, this struct will have
-; to be declared manually.
-
-wEnemyMonSpecies:: db
-wEnemyMonHP:: dw
-wEnemyMonPartyPos::
-wEnemyMonBoxLevel:: db
-wEnemyMonStatus:: db
-wEnemyMonType::
-wEnemyMonType1:: db
-wEnemyMonType2:: db
-wEnemyMonCatchRate_NotReferenced:: db
-wEnemyMonMoves:: ds NUM_MOVES
-wEnemyMonDVs:: ds 2
-wEnemyMonLevel:: db
-wEnemyMonMaxHP:: dw
-wEnemyMonAttack:: dw
-wEnemyMonDefense:: dw
-wEnemyMonSpeed:: dw
-wEnemyMonSpecial:: dw
-wEnemyMonPP:: ds 2 ; NUM_MOVES - 2
-SECTION "WRAM Bank 1", WRAMX, BANK[1]
- ds 2 ; NUM_MOVES - 2
-
-wEnemyMonBaseStats:: ds 5
-wEnemyMonCatchRate:: ds 1
-wEnemyMonBaseExp:: ds 1
-
-wBattleMonNick:: ds 11 ; d009
-wBattleMon:: battle_struct wBattleMon ; d014
-
-
-W_TRAINERCLASS:: ; d031
- ds 1
-
- ds 1
-
-wTrainerPicPointer:: ; wd033
- ds 2
- ds 1
-wd036:: ds 16
-wd046:: ds 1
-wd047:: ds 1
-wd048:: ds 2
-
-W_TRAINERNAME:: ; d04a
-; 13 bytes for the letters of the opposing trainer
-; the name is terminated with $50 with possible
-; unused trailing letters
- ds 13
-
-W_ISINBATTLE:: ; d057
-; no battle, this is 0
-; wild battle, this is 1
-; trainer battle, this is 2
- ds 1
-
-wPartyGainExpFlags:: ; d058
-; flags that indicate which party members should be be given exp when GainExperience is called
- flag_array 6
-
-W_CUROPPONENT:: ; d059
-; in a wild battle, this is the species of pokemon
-; in a trainer battle, this is the trainer class + $C8
- ds 1
-
-W_BATTLETYPE:: ; d05a
-; in normal battle, this is 0
-; in old man battle, this is 1
-; in safari battle, this is 2
- ds 1
-
-wDamageMultipliers:: ; d05b
-; bits 0-6: Effectiveness
- ; $0 = immune
- ; $5 = not very effective
- ; $a = neutral
- ; $14 = super-effective
-; bit 7: STAB
- ds 1
-
-W_LONEATTACKNO:: ; d05c
-; which entry in LoneAttacks to use
-W_GYMLEADERNO:: ; d05c
-; it's actually the same thing as ^
- ds 1
-W_TRAINERNO:: ; d05d
-; which instance of [youngster, lass, etc] is this?
- ds 1
-
-wCriticalHitOrOHKO:: ; d05e
-; $00 = normal attack
-; $01 = critical hit
-; $02 = successful OHKO
-; $ff = failed OHKO
- ds 1
-
-W_MOVEMISSED:: ; d05f
- ds 1
-
-wPlayerStatsToDouble:: ; d060
-; always 0
- ds 1
-
-wPlayerStatsToHalve:: ; d061
-; always 0
- ds 1
-
-W_PLAYERBATTSTATUS1:: ; d062
-; bit 0 - bide
-; bit 1 - thrash / petal dance
-; bit 2 - attacking multiple times (e.g. double kick)
-; bit 3 - flinch
-; bit 4 - charging up for attack
-; bit 5 - using multi-turn move (e.g. wrap)
-; bit 6 - invulnerable to normal attack (using fly/dig)
-; bit 7 - confusion
- ds 1
-
-W_PLAYERBATTSTATUS2:: ; d063
-; bit 0 - X Accuracy effect
-; bit 1 - protected by "mist"
-; bit 2 - focus energy effect
-; bit 4 - has a substitute
-; bit 5 - need to recharge
-; bit 6 - rage
-; bit 7 - leech seeded
- ds 1
-
-W_PLAYERBATTSTATUS3:: ; d064
-; bit 0 - toxic
-; bit 1 - light screen
-; bit 2 - reflect
-; bit 3 - tranformed
- ds 1
-
-wEnemyStatsToDouble:: ; d065
-; always 0
- ds 1
-
-wEnemyStatsToHalve:: ; d066
-; always 0
- ds 1
-
-W_ENEMYBATTSTATUS1:: ; d067
- ds 1
-W_ENEMYBATTSTATUS2:: ; d068
- ds 1
-W_ENEMYBATTSTATUS3:: ; d069
- ds 1
-
-wPlayerNumAttacksLeft::
-; when the player is attacking multiple times, the number of attacks left
- ds 1
-
-W_PLAYERCONFUSEDCOUNTER:: ; wd06b
- ds 1
-
-W_PLAYERTOXICCOUNTER:: ; d06c
- ds 1
-W_PLAYERDISABLEDMOVE:: ; d06d
-; high nibble: which move is disabled (1-4)
-; low nibble: disable turns left
- ds 1
-
- ds 1
-
-wEnemyNumAttacksLeft:: ; d06f
-; when the enemy is attacking multiple times, the number of attacks left
- ds 1
-
-W_ENEMYCONFUSEDCOUNTER:: ; wd070
- ds 1
-
-W_ENEMYTOXICCOUNTER:: ; d071
- ds 1
-W_ENEMYDISABLEDMOVE:: ; d072
-; high nibble: which move is disabled (1-4)
-; low nibble: disable turns left
- ds 1
-
- ds 1
-
-wPlayerNumHits:: ; d074
-; number of hits by player in attacks like Double Slap, etc.
-
-wPlayerBideAccumulatedDamage:: ; d074
-; the amount of damage accumulated by the player while biding (2 bytes)
-
-wUnknownSerialCounter2:: ; d075
-; 2 bytes
-
- ds 4
-
-wEscapedFromBattle::
-; non-zero when an item or move that allows escape from battle was used
- ds 1
-
-wd079::
-wAmountMoneyWon:: ds 1 ; wd079 - wd07b
-wd07a:: ds 1
- ds 1
-
-W_ANIMATIONID:: ; d07c
-; ID number of the current battle animation
- ds 1
-
-wd07d:: ds 1
-wd07e:: ds 3
-
-; base coordinates of frame block
-W_BASECOORDX:: ; d081
- ds 1
-W_BASECOORDY:: ; d082
- ds 1
-
-; low health alarm counter/enable
-; high bit = enable, others = timer to cycle frequencies
-wLowHealthAlarm:: ds 1 ; d083
-
-W_FBTILECOUNTER:: ; d084
-; counts how many tiles of the current frame block have been drawn
- ds 1
-
-wd085:: ds 1
-
-W_SUBANIMFRAMEDELAY:: ; d086
-; duration of each frame of the current subanimation in terms of screen refreshes
- ds 1
-W_SUBANIMCOUNTER:: ; d087
-; counts the number of subentries left in the current subanimation
- ds 1
-
-wd088:: ds 1
-
-W_NUMFBTILES:: ; d089
-; number of tiles in current battle animation frame block
- ds 1
-
-wTradedMonMovingRight:: ; d08a
-; $01 if mon is moving from left gameboy to right gameboy; $00 if vice versa
-
-wd08a:: ds 1
-
-wTownMapSpriteBlinkingCounter:: ; d08b
-
-wPartyMonAnimCounter:: ; d08b
-
-W_SUBANIMTRANSFORM:: ; d08b
-; controls what transformations are applied to the subanimation
-; 01: flip horizontally and vertically
-; 02: flip horizontally and translate downwards 40 pixels
-; 03: translate base coordinates of frame blocks, but don't change their internal coordinates or flip their tiles
-; 04: reverse the subanimation
- ds 1
-
-wEndBattleWinTextPointer:: ; d08c
- ds 2
-
-wEndBattleLoseTextPointer:: ; d08e
- ds 2
-
- ds 2
-
-wEndBattleTextRomBank:: ; d092
- ds 1
-
- ds 1
-
-W_SUBANIMADDRPTR:: ; d094
-; the address _of the address_ of the current subanimation entry
- ds 2
-W_SUBANIMSUBENTRYADDR:: ; d096
-; the address of the current subentry of the current subanimation
- ds 2
-
- ds 2
-
-wd09a:: ds 1
-
-wTownMapSpriteBlinkingEnabled:: ; d09b
-; non-zero when enabled. causes nest locations to blink on and off.
-; the town selection cursor will blink regardless of what this value is
-
-wd09b:: ds 1
-
-W_FBDESTADDR:: ; d09c
-; current destination address in OAM for frame blocks (big endian)
- ds 2
-
-W_FBMODE:: ; d09e
-; controls how the frame blocks are put together to form frames
-; specifically, after finishing drawing the frame block, the frame block's mode determines what happens
-; 00: clean OAM buffer and delay
-; 02: move onto the next frame block with no delay and no cleaning OAM buffer
-; 03: delay, but don't clean OAM buffer
-; 04: delay, without cleaning OAM buffer, and do not advance [W_FBDESTADDR], so that the next frame block will overwrite this one
-; sprite data is written column by column, each byte contains 8 columns (one for ech bit)
-; for 2bpp sprites, pairs of two consecutive bytes (i.e. pairs of consecutive rows of sprite data)
-; contain the upper and lower bit of each of the 8 pixels, respectively
- ds 1
-
-wNewTileBlockID:: ; d09f
-
-wd09f:: ds 1
-wd0a0:: ds 1
-
-W_SPRITECURPOSX:: ; d0a1
- ds 1
-W_SPRITECURPOSY:: ; d0a2
- ds 1
-W_SPRITEWITDH:: ; d0a3
- ds 1
-W_SPRITEHEIGHT:: ; d0a4
- ds 1
-W_SPRITEINPUTCURBYTE:: ; d0a5
-; current input byte
- ds 1
-W_SPRITEINPUTBITCOUNTER:: ; d0a6
-; bit offset of last read input bit
- ds 1
-
-W_SPRITEOUTPUTBITOFFSET:: ; d0a7; determines where in the output byte the two bits are placed. Each byte contains four columns (2bpp data)
-; 3 -> XX000000 1st column
-; 2 -> 00XX0000 2nd column
-; 1 -> 0000XX00 3rd column
-; 0 -> 000000XX 4th column
- ds 1
-
-W_SPRITELOADFLAGS:: ; d0a8
-; bit 0 determines used buffer (0 -> $a188, 1 -> $a310)
-; bit 1 loading last sprite chunk? (there are at most 2 chunks per load operation)
- ds 1
-W_SPRITEUNPACKMODE:: ; d0a9
- ds 1
-W_SPRITEFLIPPED:: ; d0aa
- ds 1
-
-W_SPRITEINPUTPTR:: ; d0ab
-; pointer to next input byte
- ds 2
-W_SPRITEOUTPUTPTR:: ; d0ad
-; pointer to current output byte
- ds 2
-W_SPRITEOUTPUTPTRCACHED:: ; d0af
-; used to revert pointer for different bit offsets
- ds 2
-W_SPRITEDECODETABLE0PTR:: ; d0b1
-; pointer to differential decoding table (assuming initial value 0)
- ds 2
-W_SPRITEDECODETABLE1PTR:: ; d0b3
-; pointer to differential decoding table (assuming initial value 1)
- ds 2
-
-wd0b5:: ds 1
-
-wNameListType:: ; d0b6
- ds 1
-
-wPredefBank:: ; d0b7
- ds 1
-
-W_MONHEADER:: ; d0b8
-W_MONHDEXNUM:: ; d0b8
- ds 1
-
-W_MONHBASESTATS:: ; d0b9
-W_MONHBASEHP:: ; d0b9
- ds 1
-W_MONHBASEATTACK:: ; d0ba
- ds 1
-W_MONHBASEDEFENSE:: ; d0bb
- ds 1
-W_MONHBASESPEED:: ; d0bc
- ds 1
-W_MONHBASESPECIAL:: ; d0bd
- ds 1
-
-W_MONHTYPES:: ; d0be
-W_MONHTYPE1:: ; d0be
- ds 1
-W_MONHTYPE2:: ; d0bf
- ds 1
-
-W_MONHCATCHRATE:: ; d0c0
- ds 1
-W_MONHBASEXP:: ; d0c1
- ds 1
-W_MONHSPRITEDIM:: ; d0c2
- ds 1
-W_MONHFRONTSPRITE:: ; d0c3
- ds 2
-W_MONHBACKSPRITE:: ; d0c5
- ds 2
-
-W_MONHMOVES:: ; d0c7
- ds 4
-
-W_MONHGROWTHRATE:: ; d0cb
- ds 1
-
-W_MONHLEARNSET:: ; d0cc
-; bit field
- flag_array 50 + 5
- ds 1
-
-wd0d4:: ds 3
-
-W_MONHPADDING:: ; d0d7
-
-
-W_DAMAGE:: ; d0d7
- ds 2
-
-ds 2
-
-wRepelRemainingSteps:: ; wd0db
- ds 1
-
-wMoves:: ; wd0dc
-; list of moves for FormatMovesString
- ds 4
-
-wMoveNum:: ; d0e0
- ds 1
-
-wMovesString:: ; d0e1
- ds 56
-
-wd119:: ds 1
-
-wWalkBikeSurfStateCopy:: ; d11a
-; wWalkBikeSurfState is sometimes copied here, but it doesn't seem to be used for anything
- ds 1
-
-wd11b:: ds 1
-wd11c:: ds 1
-wd11d:: ds 1
-wd11e:: ds 1
-wd11f:: ds 1
-
-wNumRunAttempts::
-; number of times the player has tried to run from battle
- ds 1
-
-wd121:: ds 1
-wd122:: ds 2
-wd124:: ds 1
-
-wTextBoxID:: ; d125
- ds 1
-
-wd126:: ds 1
-
-W_CURENEMYLVL:: ; d127
- ds 1
-
-wd128:: ds 1
-wd129:: ds 1
-wd12a:: ds 1
-
-wLinkState:: ; d12b
- ds 1
-
-wTwoOptionMenuID:: ds 1
-wd12d:: ds 1
-wd12e:: ds 1
-wd12f:: ds 1
-wd130:: ds 1
-wd131:: ds 1
-wd132:: ds 1
-wd133:: ds 6
-wd139:: ds 1
-
-wIgnoreInputCounter:: ; d13a
-; counts downward each frame
-; when it hits 0, bit 5 (ignore input bit) of wd730 is reset
- ds 1
-
-wStepCounter:: ; d13b
-; counts down once every step
- ds 1
-
-wNumberOfNoRandomBattleStepsLeft:: ; d13c
-; after a battle, you have at least 3 steps before a random battle can occur
- ds 1
-
-W_PRIZE1:: ; d13d
- ds 1
-W_PRIZE2:: ; d13e
- ds 1
-W_PRIZE3:: ; d13f
- ds 1
-
- ds 1
-
-wSerialRandomNumberListBlock:: ; d141
-; the first 7 bytes are the preamble
-
-wd141:: ds 2
-wd143:: ds 2
-wd145:: ds 3
-
-wLinkBattleRandomNumberList:: ; d148
-; shared list of 9 random numbers, indexed by wLinkBattleRandomNumberListIndex
- ds 10
-
-wSerialPlayerDataBlock:: ; d152
-; the first 6 bytes are the preamble
-
-wd152:: ds 1
-wd153:: ds 3
-wd156:: ds 1
-wd157:: ds 1
-
-
-wPlayerName:: ; d158
- ds 11
-
-wPartyCount:: ds 1 ; d163
-wPartySpecies:: ds PARTY_LENGTH ; d164
-wPartyEnd:: ds 1 ; d16a
-
-wPartyMons::
-wPartyMon1:: party_struct wPartyMon1 ; d16b
-wPartyMon2:: party_struct wPartyMon2 ; d197
-wPartyMon3:: party_struct wPartyMon3 ; d1c3
-wPartyMon4:: party_struct wPartyMon4 ; d1ef
-wPartyMon5:: party_struct wPartyMon5 ; d21b
-wPartyMon6:: party_struct wPartyMon6 ; d247
-
-wPartyMonOT:: ds 11 * PARTY_LENGTH ; d273
-wPartyMonNicks:: ds 11 * PARTY_LENGTH ; d2b5
-
-
-wPokedexOwned:: ; d2f7
- flag_array NUM_POKEMON
-wPokedexOwnedEnd::
-
-wPokedexSeen:: ; d30a
- flag_array NUM_POKEMON
-wPokedexSeenEnd::
-
-
-wNumBagItems:: ; d31d
- ds 1
-wBagItems:: ; d31e
-; item, quantity
- ds 20 * 2
- ds 1 ; end
-
-wPlayerMoney:: ; d347
- ds 3 ; BCD
-
-W_RIVALNAME:: ; d34a
- ds 11
-
-W_OPTIONS:: ; d355
-; bit 7 = battle animation
-; 0: On
-; 1: Off
-; bit 6 = battle style
-; 0: Shift
-; 1: Set
-; bits 0-3 = text speed (number of frames to delay after printing a letter)
-; 1: Fast
-; 3: Medium
-; 5: Slow
- ds 1
-
-W_OBTAINEDBADGES:: ; d356
- ds 1
-
- ds 1
-
-wd358:: ds 1
-
-wPlayerID:: ; d359
- ds 2
-
-wd35b:: ds 1
-wd35c:: ds 1
-
-wMapPalOffset:: ; d35d
-; offset subtracted from FadePal4 to get the background and object palettes for the current map
-; normally, it is 0. it is 6 when Flash is needed, causing FadePal2 to be used instead of FadePal4
- ds 1
-
-W_CURMAP:: ; d35e
- ds 1
-
-wCurrentTileBlockMapViewPointer:: ; d35f
-; pointer to the upper left corner of the current view in the tile block map
- ds 2
-
-W_YCOORD:: ; d361
-; player’s position on the current map
- ds 1
-
-W_XCOORD:: ; d362
- ds 1
-
-W_YBLOCKCOORD:: ; d363
-; player's y position (by block)
- ds 1
-
-W_XBLOCKCOORD:: ; d364
- ds 1
-
-wLastMap:: ; d365
- ds 1
-
-wd366:: ds 1
-
-W_CURMAPTILESET:: ; d367
- ds 1
-
-W_CURMAPHEIGHT:: ; d368
-; blocks
- ds 1
-
-W_CURMAPWIDTH:: ; d369
-; blocks
- ds 1
-
-W_MAPDATAPTR:: ; d36a
- ds 2
-
-W_MAPTEXTPTR:: ; d36c
- ds 2
-
-W_MAPSCRIPTPTR:: ; d36e
- ds 2
-
-W_MAPCONNECTIONS:: ; d370
-; connection byte
- ds 1
-
-W_MAPCONN1PTR:: ; d371
- ds 1
-
-wd372:: ds 1
-wd373:: ds 1
-wd374:: ds 1
-wd375:: ds 1
-wd376:: ds 1
-wd377:: ds 1
-wd378:: ds 1
-wd379:: ds 1
-wd37a:: ds 1
-wd37b:: ds 1
-
-W_MAPCONN2PTR:: ; d37c
- ds 1
-
-wd37d:: ds 1
-wd37e:: ds 1
-wd37f:: ds 1
-wd380:: ds 1
-wd381:: ds 1
-wd382:: ds 1
-wd383:: ds 1
-wd384:: ds 1
-wd385:: ds 1
-wd386:: ds 1
-
-W_MAPCONN3PTR:: ; d387
- ds 1
-
-wd388:: ds 1
-wd389:: ds 1
-wd38a:: ds 1
-wd38b:: ds 1
-wd38c:: ds 1
-wd38d:: ds 1
-wd38e:: ds 1
-wd38f:: ds 1
-wd390:: ds 1
-wd391:: ds 1
-
-W_MAPCONN4PTR:: ; d392
- ds 1
-
-wd393:: ds 1
-wd394:: ds 1
-wd395:: ds 1
-wd396:: ds 1
-wd397:: ds 1
-wd398:: ds 1
-wd399:: ds 1
-wd39a:: ds 1
-wd39b:: ds 1
-wd39c:: ds 1
-
-W_SPRITESET:: ; d39d
-; sprite set for the current map (11 sprite picture ID's)
- ds 11
-
-W_SPRITESETID:: ; d3a8
-; sprite set ID for the current map
- ds 1
-
-wd3a9:: ds 1
-wd3aa:: ds 3
-wd3ad:: ds 1
-
-wNumberOfWarps:: ; d3ae
-; number of warps in current map
- ds 1
-
-wWarpEntries:: ; d3af
-; current map warp entries
- ds 128
-
-wDestinationWarpID:: ; d42f
-; if $ff, the player's coordinates are not updated when entering the map
- ds 1
-
-wd430:: ds 1 ; d430
-wd431:: ds 1 ; d431
-
- ds 3
-
-wd435:: ds 1
-wd436:: ds 1
-
- ds 60
-
-wd472:: ds 1
-wd473:: ds 1
-
- ds 61
-
-wd4b0:: ds 1
-wd4b1:: ds 32
-wd4d1:: ds 16
-
-W_NUMSPRITES:: ; d4e1
-; number of sprites on the current map
- ds 1
-
-; these two variables track the X and Y offset in blocks from the last special warp used
-; they don't seem to be used for anything
-wYOffsetSinceLastSpecialWarp:: ; d4e2
- ds 1
-wXOffsetSinceLastSpecialWarp:: ; d4e3
- ds 1
-
-W_MAPSPRITEDATA:: ; d4e4
-; two bytes per sprite (movement byte 2, text ID)
- ds 32
-
-W_MAPSPRITEEXTRADATA:: ; d504
-; two bytes per sprite (trainer class/item ID, trainer set ID)
- ds 32
-
-wd524:: ds 1
-wd525:: ds 1
-
-wMapViewVRAMPointer:: ; d526
-; the address of the upper left corner of the visible portion of the BG tile map in VRAM
- ds 2
-
-wd528:: ds 1
-wd529:: ds 1
-wd52a:: ds 1
-
-W_TILESETBANK:: ; d52b
- ds 1
-
-W_TILESETBLOCKSPTR:: ; d52c
-; maps blocks (4x4 tiles) to tiles
- ds 2
-
-W_TILESETGFXPTR:: ; d52e
- ds 2
-
-W_TILESETCOLLISIONPTR:: ; d530
-; list of all walkable tiles
- ds 2
-
-W_TILESETTALKINGOVERTILES:: ; d532
- ds 3
-
-W_GRASSTILE:: ; d535
- ds 1
-
- ds 4
-
-wNumBoxItems:: ; d53a
- ds 1
-wBoxItems:: ; d53b
-; item, quantity
- ds 50 * 2
- ds 1 ; end
-
-wd5a0:: ds 2
-wd5a2:: ds 1
-wd5a3:: ds 1
-
-wPlayerCoins:: ; d5a4
- ds 2 ; BCD
-
-W_MISSABLEOBJECTFLAGS:: ; d5a6
-; bit array of missable objects. set = removed
- ds 39
-
-wd5cd:: ds 1
-
-W_MISSABLEOBJECTLIST:: ; d5ce
-; each entry consists of 2 bytes
-; * the sprite ID (depending on the current map)
-; * the missable object index (global, used for W_MISSABLEOBJECTFLAGS)
-; terminated with $FF
- ds 17 * 2
-
-W_GAMEPROGRESSFLAGS:: ; d5f0
-; $c8 bytes
- ds 0
-
-W_OAKSLABCURSCRIPT:: ; d5f0
- ds 1
-W_PALLETTOWNCURSCRIPT:: ; d5f1
- ds 1
- ds 1
-W_BLUESHOUSECURSCRIPT:: ; d5f3
- ds 1
-W_VIRIDIANCITYCURSCRIPT:: ; d5f4
- ds 1
- ds 2
-W_PEWTERCITYCURSCRIPT:: ; d5f7
- ds 1
-W_ROUTE3CURSCRIPT:: ; d5f8
- ds 1
-W_ROUTE4CURSCRIPT:: ; d5f9
- ds 1
- ds 1
-W_VIRIDIANGYMCURSCRIPT:: ; d5fb
- ds 1
-W_PEWTERGYMCURSCRIPT:: ; d5fc
- ds 1
-W_CERULEANGYMCURSCRIPT:: ; d5fd
- ds 1
-W_VERMILIONGYMCURSCRIPT:: ; d5fe
- ds 1
-W_CELADONGYMCURSCRIPT:: ; d5ff
- ds 1
-W_ROUTE6CURSCRIPT:: ; d600
- ds 1
-W_ROUTE8CURSCRIPT:: ; d601
- ds 1
-W_ROUTE24CURSCRIPT:: ; d602
- ds 1
-W_ROUTE25CURSCRIPT:: ; d603
- ds 1
-W_ROUTE9CURSCRIPT:: ; d604
- ds 1
-W_ROUTE10CURSCRIPT:: ; d605
- ds 1
-W_MTMOON1CURSCRIPT:: ; d606
- ds 1
-W_MTMOON3CURSCRIPT:: ; d607
- ds 1
-W_SSANNE8CURSCRIPT:: ; d608
- ds 1
-W_SSANNE9CURSCRIPT:: ; d609
- ds 1
-W_ROUTE22CURSCRIPT:: ; d60a
- ds 1
- ds 1
-W_REDSHOUSE2CURSCRIPT:: ; d60c
- ds 1
-W_VIRIDIANMARKETCURSCRIPT:: ; d60d
- ds 1
-W_ROUTE22GATECURSCRIPT:: ; d60e
- ds 1
-W_CERULEANCITYCURSCRIPT:: ; d60f
- ds 1
- ds 7
-W_SSANNE5CURSCRIPT:: ; d617
- ds 1
-W_VIRIDIANFORESTCURSCRIPT:: ; d618
- ds 1
-W_MUSEUM1FCURSCRIPT:: ; d619
- ds 1
-W_ROUTE13CURSCRIPT:: ; d61a
- ds 1
-W_ROUTE14CURSCRIPT:: ; d61b
- ds 1
-W_ROUTE17CURSCRIPT:: ; d61c
- ds 1
-W_ROUTE19CURSCRIPT:: ; d61d
- ds 1
-W_ROUTE21CURSCRIPT:: ; d61e
- ds 1
-W_SAFARIZONEENTRANCECURSCRIPT:: ; d61f
- ds 1
-W_ROCKTUNNEL2CURSCRIPT:: ; d620
- ds 1
-W_ROCKTUNNEL1CURSCRIPT:: ; d621
- ds 1
- ds 1
-W_ROUTE11CURSCRIPT:: ; d623
- ds 1
-W_ROUTE12CURSCRIPT:: ; d624
- ds 1
-W_ROUTE15CURSCRIPT:: ; d625
- ds 1
-W_ROUTE16CURSCRIPT:: ; d626
- ds 1
-W_ROUTE18CURSCRIPT:: ; d627
- ds 1
-W_ROUTE20CURSCRIPT:: ; d628
- ds 1
-W_SSANNE10CURSCRIPT:: ; d629
- ds 1
-W_VERMILIONCITYCURSCRIPT:: ; d62a
- ds 1
-W_POKEMONTOWER2CURSCRIPT:: ; d62b
- ds 1
-W_POKEMONTOWER3CURSCRIPT:: ; d62c
- ds 1
-W_POKEMONTOWER4CURSCRIPT:: ; d62d
- ds 1
-W_POKEMONTOWER5CURSCRIPT:: ; d62e
- ds 1
-W_POKEMONTOWER6CURSCRIPT:: ; d62f
- ds 1
-W_POKEMONTOWER7CURSCRIPT:: ; d630
- ds 1
-W_ROCKETHIDEOUT1CURSCRIPT:: ; d631
- ds 1
-W_ROCKETHIDEOUT2CURSCRIPT:: ; d632
- ds 1
-W_ROCKETHIDEOUT3CURSCRIPT:: ; d633
- ds 1
-W_ROCKETHIDEOUT4CURSCRIPT:: ; d634
- ds 2
-W_ROUTE6GATECURSCRIPT:: ; d636
- ds 1
-W_ROUTE8GATECURSCRIPT:: ; d637
- ds 2
-W_CINNABARISLANDCURSCRIPT:: ; d639
- ds 1
-W_MANSION1CURSCRIPT:: ; d63a
- ds 2
-W_MANSION2CURSCRIPT:: ; d63c
- ds 1
-W_MANSION3CURSCRIPT:: ; d63d
- ds 1
-W_MANSION4CURSCRIPT:: ; d63e
- ds 1
-W_VICTORYROAD2CURSCRIPT:: ; d63f
- ds 1
-W_VICTORYROAD3CURSCRIPT:: ; d640
- ds 2
-W_FIGHTINGDOJOCURSCRIPT:: ; d642
- ds 1
-W_SILPHCO2CURSCRIPT:: ; d643
- ds 1
-W_SILPHCO3CURSCRIPT:: ; d644
- ds 1
-W_SILPHCO4CURSCRIPT:: ; d645
- ds 1
-W_SILPHCO5CURSCRIPT:: ; d646
- ds 1
-W_SILPHCO6CURSCRIPT:: ; d647
- ds 1
-W_SILPHCO7CURSCRIPT:: ; d648
- ds 1
-W_SILPHCO8CURSCRIPT:: ; d649
- ds 1
-W_SILPHCO9CURSCRIPT:: ; d64a
- ds 1
-W_HALLOFFAMEROOMCURSCRIPT:: ; d64b
- ds 1
-W_GARYCURSCRIPT:: ; d64c
- ds 1
-W_LORELEICURSCRIPT:: ; d64d
- ds 1
-W_BRUNOCURSCRIPT:: ; d64e
- ds 1
-W_AGATHACURSCRIPT:: ; d64f
- ds 1
-W_UNKNOWNDUNGEON3CURSCRIPT:: ; d650
- ds 1
-W_VICTORYROAD1CURSCRIPT:: ; d651
- ds 1
- ds 1
-W_LANCECURSCRIPT:: ; d653
- ds 1
- ds 4
-W_SILPHCO10CURSCRIPT:: ; d658
- ds 1
-W_SILPHCO11CURSCRIPT:: ; d659
- ds 1
- ds 1
-W_FUCHSIAGYMCURSCRIPT:: ; d65b
- ds 1
-W_SAFFRONGYMCURSCRIPT:: ; d65c
- ds 1
- ds 1
-W_CINNABARGYMCURSCRIPT:: ; d65e
- ds 1
-W_CELADONGAMECORNERCURSCRIPT:: ; d65f
- ds 1
-W_ROUTE16GATECURSCRIPT:: ; d660
- ds 1
-W_BILLSHOUSECURSCRIPT:: ; d661
- ds 1
-W_ROUTE5GATECURSCRIPT:: ; d662
- ds 1
-W_POWERPLANTCURSCRIPT:: ; d663
-; overload
- ds 0
-W_ROUTE7GATECURSCRIPT:: ; d663
-; overload
- ds 1
- ds 1
-W_SSANNE2CURSCRIPT:: ; d665
- ds 1
-W_SEAFOAMISLANDS4CURSCRIPT:: ; d666
- ds 1
-W_ROUTE23CURSCRIPT:: ; d667
- ds 1
-W_SEAFOAMISLANDS5CURSCRIPT:: ; d668
- ds 1
-W_ROUTE18GATECURSCRIPT:: ; d669
- ds 1
-
- ds 134
-
-wd6f0:: ds 14
-wd6fe:: ds 2
-
-wWalkBikeSurfState:: ; d700
-; $00 = walking
-; $01 = biking
-; $02 = surfing
- ds 1
-
- ds 10
-
-W_TOWNVISITEDFLAG:: ; d70b
- flag_array 13
-
-wSafariSteps:: ; d70d
-; starts at 502
- ds 2
-
-W_FOSSILITEM:: ; d70f
-; item given to cinnabar lab
- ds 1
-
-W_FOSSILMON:: ; d710
-; mon that will result from the item
- ds 1
-
- ds 2
-
-W_ENEMYMONORTRAINERCLASS:: ; d713
-; trainer classes start at $c8
- ds 1
-
-wPlayerJumpingYScreenCoordsIndex:: ; d714
- ds 1
-
-W_RIVALSTARTER:: ; d715
- ds 1
-
- ds 1
-
-W_PLAYERSTARTER:: ; d717
- ds 1
-
-wBoulderSpriteIndex:: ; d718
-; sprite index of the boulder the player is trying to push
- ds 1
-
-wLastBlackoutMap:: ; d719
- ds 1
-
-wDestinationMap:: ; d71a
-; destination map (for certain types of special warps, not ordinary walking)
- ds 1
-
-wd71b:: ds 1
-
-wTileInFrontOfBoulderAndBoulderCollisionResult:: ; d71c
-; used to store the tile in front of the boulder when trying to push a boulder
-; also used to store the result of the collision check ($ff for a collision and $00 for no collision)
- ds 1
-
-wDungeonWarpDestinationMap:: ; d71d
-; destination map for dungeon warps
- ds 1
-
-wWhichDungeonWarp:: ; d71e
-; which dungeon warp within the source map was used
- ds 1
-
-wd71f:: ds 9
-
-wd728::
-; bit 0: using Strength outside of battle
- ds 1
-
- ds 1
-
-wd72a:: ds 2
-
-wd72c:: ; d72c
-; bit 0: if not set, the 3 minimum steps between random battles have passed
- ds 1
-
-wd72d:: ds 1
-wd72e:: ds 2
-
-wd730::
-; bit 0: NPC sprite being moved by script
-; bit 5: ignore joypad input
-; bit 6: print text with no delay between each letter
-; bit 7: set if joypad states are being simulated in the overworld
- ds 1
-
- ds 1
-
-wd732:: ; d732
-; bit 0: play time being counted
-; bit 1: remnant of debug mode? not set by the game code.
-; if it is set
-; 1. skips most of Prof. Oak's speech, and uses NINTEN as the player's name and SONY as the rival's name
-; 2. does not have the player start in floor two of the playyer's house (instead sending them to [wLastMap])
-; 3. allows wild battles to be avoided by holding down B
-; bit 2: the target warp is a fly warp (bit 3 set or blacked out) or a dungeon warp (bit 4 set)
-; bit 3: used warp pad, escape rope, dig, teleport, or fly, so the target warp is a "fly warp"
-; bit 4: jumped into hole (Pokemon Mansion, Seafoam Islands, Victory Road) or went down waterfall (Seafoam Islands), so the target warp is a "dungeon warp"
-; bit 5: currently being forced to ride bike (cycling road)
-; bit 6: map destination is [wLastBlackoutMap] (usually the last used pokemon center, but could be the player's house)
- ds 1
-
-W_FLAGS_D733:: ; d733
-; bit 4: use variable [W_CURMAPSCRIPT] instead of the provided index for next frame's map script (used to start battle when talking to trainers)
-; bit 7: used fly out of battle
- ds 1
-
-wd734:: ds 2
-
-wd736:: ; d736
-; bit 0: check if the player is standing on a door and make him walk down a step if so
-; bit 1: the player is currently stepping down from a door
-; bit 2: standing on a warp
-; bit 6: jumping down a ledge
- ds 1
-
-wCompletedInGameTradeFlags:: ; d737
- ds 2
-
- ds 2
-
-wd73b:: ds 1
-wd73c:: ds 3
-
-wCardKeyDoorY:: ; d73f
- ds 1
-
-wCardKeyDoorX:: ; d740
- ds 1
-
- ds 2
-
-wd743:: ds 1
-wd744:: ds 3
-wd747:: ds 3
-wd74a:: ds 1
-
-wd74b:: ; d74b
-; bit 0: Prof. Oak has lead the player to the north end of his lab
-; bit 1: Prof. Oak has asked the player to choose a pokemon
-; bit 2: the player and the rival have received their pokemon
-; bit 3: the player has battled the rival in Oak's lab
-; bit 4: Prof. Oak has given the player 5 pokeballs
-; bit 5: received pokedex
- ds 1
-
-wd74c:: ds 2
-wd74e:: ds 3
-wd751:: ds 1
-wd752:: ds 2
-wd754:: ds 1
-wd755:: ds 5
-wd75a:: ds 1
-wd75b:: ds 3
-wd75e:: ds 1
-wd75f:: ds 5
-wd764:: ds 1
-wd765:: ds 1
-wd766:: ds 1
-wd767:: ds 1
-wd768:: ds 1
-wd769:: ds 3
-wd76c:: ds 5
-wd771:: ds 2
-wd773:: ds 4
-wd777:: ds 1
-wd778:: ds 4
-wd77c:: ds 1
-wd77d:: ds 1
-wd77e:: ds 5
-wd783:: ds 11
-wd78e:: ds 2
-wd790:: ds 2
-wd792:: ds 4
-wd796:: ds 2
-wd798:: ds 2
-wd79a:: ds 1
-wd79b:: ds 1
-wd79c:: ds 5
-wd7a1:: ds 2
-wd7a3:: ds 12
-wd7af:: ds 2
-wd7b1:: ds 2
-wd7b3:: ds 1
-wd7b4:: ds 5
-wd7b9:: ds 4
-wd7bd:: ds 2
-wd7bf:: ds 3
-wd7c2:: ds 1
-wd7c3:: ds 2
-wd7c5:: ds 1
-wd7c6:: ds 3
-wd7c9:: ds 4
-wd7cd:: ds 2
-wd7cf:: ds 2
-wd7d1:: ds 1
-wd7d2:: ds 1
-wd7d3:: ds 2
-wd7d5:: ds 1
-wd7d6:: ds 1
-wd7d7:: ds 1
-wd7d8:: ds 1
-wd7d9:: ds 2
-wd7db:: ds 2
-wd7dd:: ds 2
-wd7df:: ds 1
-wd7e0:: ds 1
-wd7e1:: ds 2
-wd7e3:: ds 2
-wd7e5:: ds 2
-wd7e7:: ds 1
-wd7e8:: ds 1
-wd7e9:: ds 2
-wd7eb:: ds 2
-wd7ed:: ds 1
-wd7ee:: ds 1
-wd7ef:: ds 1
-wd7f0:: ds 1
-wd7f1:: ds 1
-wd7f2:: ds 1
-wd7f3:: ds 2
-wd7f5:: ds 1
-wd7f6:: ds 9
-wd7ff:: ds 4
-wd803:: ds 2
-wd805:: ds 2
-wd807:: ds 2
-wd809:: ds 10
-wd813:: ds 2
-wd815:: ds 1
-wd816:: ds 1
-wd817:: ds 2
-wd819:: ds 2
-wd81b:: ds 10
-wd825:: ds 1
-wd826:: ds 1
-wd827:: ds 1
-wd828:: ds 1
-wd829:: ds 1
-wd82a:: ds 1
-wd82b:: ds 1
-wd82c:: ds 1
-wd82d:: ds 1
-wd82e:: ds 1
-wd82f:: ds 1
-wd830:: ds 1
-wd831:: ds 1
-wd832:: ds 1
-wd833:: ds 1
-wd834:: ds 1
-wd835:: ds 1
-wd836:: ds 1
-wd837:: ds 1
-wd838:: ds 15
-wd847:: ds 2
-wd849:: ds 2
-wd84b:: ds 12
-wd857:: ds 8
-wd85f:: ds 4
-wd863:: ds 1
-wd864:: ds 1
-wd865:: ds 1
-wd866:: ds 1
-wd867:: ds 2
-wd869:: ds 20
-wd87d:: ds 2
-wd87f:: ds 1
-wd880:: ds 1
-wd881:: ds 1
-wd882:: ds 5
-
-wLinkEnemyTrainerName:: ; d887
-; linked game's trainer name
-
-W_GRASSRATE:: ; d887
- ds 1
-
-W_GRASSMONS:: ; d888
- ds 20
-
-
-wEnemyPartyCount:: ds 1 ; d89c
-wEnemyPartyMons:: ds PARTY_LENGTH + 1 ; d89d
-
-wEnemyMons:: ; d8a4
-wEnemyMon1:: party_struct wEnemyMon1
-wEnemyMon2:: party_struct wEnemyMon2
-wEnemyMon3:: party_struct wEnemyMon3
-wEnemyMon4:: party_struct wEnemyMon4
-wEnemyMon5:: party_struct wEnemyMon5
-wEnemyMon6:: party_struct wEnemyMon6
-
-wEnemyMonOT:: ds 11 * PARTY_LENGTH ; d9ac
-wEnemyMonNicks:: ds 11 * PARTY_LENGTH ; d9ee
-
-
-W_TRAINERHEADERPTR:: ; da30
- ds 2
-
- ds 6
-
-wda38:: ds 1
-
-W_CURMAPSCRIPT:: ; da39
-; index of current map script, mostly used as index for function pointer array
-; mostly copied from map-specific map script pointer and wirtten back later
- ds 1
-
- ds 6
-
-W_PLAYTIMEHOURS:: ; da40
- ds 2
-W_PLAYTIMEMINUTES:: ; da42
- ds 2
-W_PLAYTIMESECONDS:: ; da44
- ds 1
-W_PLAYTIMEFRAMES:: ; da45
- ds 1
-
-wSafariZoneGameOver:: ; da46
- ds 1
-
-W_NUMSAFARIBALLS:: ; da47
- ds 1
-
-
-W_DAYCARE_IN_USE:: ; da48
-; 0 if no pokemon is in the daycare
-; 1 if pokemon is in the daycare
- ds 1
-
-W_DAYCAREMONNAME:: ds 11 ; da49
-W_DAYCAREMONOT:: ds 11 ; da54
-
-wDayCareMon:: box_struct wDayCareMon ; da5f
-
-
-W_NUMINBOX:: ds 1 ; da80
-wBoxSpecies:: ds MONS_PER_BOX + 1
-
-wBoxMons::
-wBoxMon1:: box_struct wBoxMon1 ; da96
-wBoxMon2:: ds box_struct_length * (MONS_PER_BOX + -1) ; dab7
-
-wBoxMonOT:: ds 11 * MONS_PER_BOX ; dd2a
-wBoxMonNicks:: ds 11 * MONS_PER_BOX ; de06
-wBoxMonNicksEnd:: ; dee2
-
-
-SECTION "Stack", WRAMX[$dfff], BANK[1]
-wStack:: ; dfff
- ds -$100
-
-
-INCLUDE "sram.asm"
+
+INCLUDE "constants.asm"
+
+flag_array: MACRO
+ ds ((\1) + 7) / 8
+ENDM
+
+box_struct_length EQU 25 + NUM_MOVES * 2
+box_struct: MACRO
+\1Species:: db
+\1HP:: dw
+\1BoxLevel:: db
+\1Status:: db
+\1Type::
+\1Type1:: db
+\1Type2:: db
+\1CatchRate:: db
+\1Moves:: ds NUM_MOVES
+\1OTID:: dw
+\1Exp:: ds 3
+\1HPExp:: dw
+\1AttackExp:: dw
+\1DefenseExp:: dw
+\1SpeedExp:: dw
+\1SpecialExp:: dw
+\1DVs:: ds 2
+\1PP:: ds NUM_MOVES
+ENDM
+
+party_struct: MACRO
+ box_struct \1
+\1Level:: db
+\1Stats::
+\1MaxHP:: dw
+\1Attack:: dw
+\1Defense:: dw
+\1Speed:: dw
+\1Special:: dw
+ENDM
+
+battle_struct: MACRO
+\1Species:: db
+\1HP:: dw
+\1BoxLevel:: db
+\1Status:: db
+\1Type::
+\1Type1:: db
+\1Type2:: db
+\1CatchRate:: db
+\1Moves:: ds NUM_MOVES
+\1DVs:: ds 2
+\1Level:: db
+\1MaxHP:: dw
+\1Attack:: dw
+\1Defense:: dw
+\1Speed:: dw
+\1Special:: dw
+\1PP:: ds NUM_MOVES
+ENDM
+
+
+SECTION "WRAM Bank 0", WRAM0
+
+wc000:: ds 1
+wc001:: ds 1
+wc002:: ds 1
+wc003:: ds 1
+wc004:: ds 1
+wc005:: ds 1
+wc006:: ds 8
+wc00e:: ds 4
+wc012:: ds 4
+wc016:: ds 16
+wc026:: ds 1
+wc027:: ds 1
+wc028:: ds 2
+wc02a:: ds 1
+wc02b:: ds 1
+wc02c:: ds 1
+wc02d:: ds 1
+wc02e:: ds 8
+wc036:: ds 8
+wc03e:: ds 8
+wc046:: ds 8
+wc04e:: ds 8
+wc056:: ds 8
+wc05e:: ds 8
+wc066:: ds 8
+wc06e:: ds 8
+wc076:: ds 8
+wc07e:: ds 8
+wc086:: ds 8
+wc08e:: ds 8
+wc096:: ds 8
+wc09e:: ds 8
+wc0a6:: ds 8
+wc0ae:: ds 8
+wc0b6:: ds 8
+wc0be:: ds 8
+wc0c6:: ds 8
+wc0ce:: ds 1
+wc0cf:: ds 1
+wc0d0:: ds 1
+wc0d1:: ds 1
+wc0d2:: ds 1
+wc0d3:: ds 1
+wc0d4:: ds 1
+wc0d5:: ds 1
+wc0d6:: ds 8
+wc0de:: ds 8
+wc0e6:: ds 1
+wc0e7:: ds 1
+wc0e8:: ds 1
+wc0e9:: ds 1
+wc0ea:: ds 1
+wc0eb:: ds 1
+wc0ec:: ds 1
+wc0ed:: ds 1
+wc0ee:: ds 1
+wc0ef:: ds 1
+wc0f0:: ds 1
+wc0f1:: ds 1
+wc0f2:: ds 14
+
+
+SECTION "Sprite State Data", WRAM0[$c100]
+
+wSpriteStateData1:: ; c100
+; data for all sprites on the current map
+; holds info for 16 sprites with $10 bytes each
+; player sprite is always sprite 0
+; C1x0: picture ID (fixed, loaded at map init)
+; C1x1: movement status (0: uninitialized, 1: ready, 2: delayed, 3: moving)
+; C1x2: sprite image index (changed on update, $ff if off screen, includes facing direction, progress in walking animation and a sprite-specific offset)
+; C1x3: Y screen position delta (-1,0 or 1; added to c1x4 on each walking animation update)
+; C1x4: Y screen position (in pixels, always 4 pixels above grid which makes sprites appear to be in the center of a tile)
+; C1x5: X screen position delta (-1,0 or 1; added to c1x6 on each walking animation update)
+; C1x6: X screen position (in pixels, snaps to grid if not currently walking)
+; C1x7: intra-animation-frame counter (counting upwards to 4 until c1x8 is incremented)
+; C1x8: animation frame counter (increased every 4 updates, hold four states (totalling to 16 walking frames)
+; C1x9: facing direction (0: down, 4: up, 8: left, $c: right)
+; C1xA
+; C1xB
+; C1xC
+; C1xD
+; C1xE
+; C1xF
+ ds $10 * $10
+
+
+SECTION "Sprite State Data 2", WRAM0[$c200]
+
+wSpriteStateData2:: ; c200
+; more data for all sprites on the current map
+; holds info for 16 sprites with $10 bytes each
+; player sprite is always sprite 0
+; C2x0: walk animation counter (counting from $10 backwards when moving)
+; C2x1:
+; C2x2: Y displacement (initialized at 8, supposed to keep moving sprites from moving too far, but bugged)
+; C2x3: X displacement (initialized at 8, supposed to keep moving sprites from moving too far, but bugged)
+; C2x4: Y position (in 2x2 tile grid steps, topmost 2x2 tile has value 4)
+; C2x5: X position (in 2x2 tile grid steps, leftmost 2x2 tile has value 4)
+; C2x6: movement byte 1 (determines whether a sprite can move, $ff:not moving, $fe:random movements, others unknown)
+; C2x7: (?) (set to $80 when in grass, else $0; may be used to draw grass above the sprite)
+; C2x8: delay until next movement (counted downwards, status (c1x1) is set to ready if reached 0)
+; C2x9
+; C2xA
+; C2xB
+; C2xC
+; C2xD
+; C2xE: sprite image base offset (in video ram, player always has value 1, used to compute c1x2)
+; C2xF
+ ds $10 * $10
+
+
+SECTION "OAM Buffer", WRAM0[$c300]
+
+wOAMBuffer:: ; c300
+; buffer for OAM data. Copied to OAM by DMA
+ ds 4 * 40
+
+wTileMap:: ; c3a0
+; buffer for tiles that are visible on screen (20 columns by 18 rows)
+ ds 20 * 18
+
+wSerialPartyMonsPatchList:: ; c508
+; list of indexes to patch with SERIAL_NO_DATA_BYTE after transfer
+
+wTileMapBackup:: ; c508
+; buffer for temporarily saving and restoring current screen's tiles
+; (e.g. if menus are drawn on top)
+; ds 20 * 18
+
+ ds 200
+
+wSerialEnemyMonsPatchList:: ; c5d0
+; list of indexes to patch with SERIAL_NO_DATA_BYTE after transfer
+ ds 200
+
+ ds 80
+
+wTempPic::
+wOverworldMap:: ; c6e8
+ ds 1300
+
+wScreenEdgeTiles:: ; cbfc
+; the tiles of the row or column to be redrawn by RedrawExposedScreenEdge
+ ds 20 * 2
+
+; coordinates of the position of the cursor for the top menu item (id 0)
+wTopMenuItemY:: ; cc24
+ ds 1
+wTopMenuItemX:: ; cc25
+ ds 1
+
+wCurrentMenuItem:: ; cc26
+; the id of the currently selected menu item
+; the top item has id 0, the one below that has id 1, etc.
+; note that the "top item" means the top item currently visible on the screen
+; add this value to [wListScrollOffset] to get the item's position within the list
+ ds 1
+
+wTileBehindCursor:: ; cc27
+; the tile that was behind the menu cursor's current location
+ ds 1
+
+wMaxMenuItem:: ; cc28
+; id of the bottom menu item
+ ds 1
+
+wMenuWatchedKeys:: ; cc29
+; bit mask of keys that the menu will respond to
+ ds 1
+
+wLastMenuItem:: ; cc2a
+; id of previously selected menu item
+ ds 1
+
+wcc2b:: ds 1
+wcc2c:: ds 1
+wcc2d:: ds 1
+
+wPlayerMoveListIndex:: ; cc2e
+ ds 1
+
+wPlayerMonNumber:: ; cc2f
+ ds 1
+
+wMenuCursorLocation:: ; cc30
+; the address of the menu cursor's current location within wTileMap
+ ds 2
+
+ ds 2
+
+wMenuJoypadPollCount:: ; cc34
+; how many times should HandleMenuInput poll the joypad state before it returns?
+ ds 1
+
+wMenuItemToSwap:: ; cc35
+; id of menu item selected for swapping (counts from 1) (0 means that no menu item has been selected for swapping)
+ ds 1
+
+wListScrollOffset:: ; cc36
+; offset of the current top menu item from the beginning of the list
+; keeps track of what section of the list is on screen
+ ds 1
+
+wcc37:: ds 1
+
+wTradeCenterPointerTableIndex:: ; cc38
+ ds 1
+
+ ds 1
+
+wcc3a:: ds 1
+wcc3b:: ds 1
+
+wDoNotWaitForButtonPressAfterDisplayingText:: ; cc3c
+; if non-zero, skip waiting for a button press after displaying text in DisplayTextID
+ ds 1
+
+wSerialSyncAndExchangeNybbleReceiveData:: ; cc3d
+; the final received nybble is stored here by Serial_SyncAndExchangeNybble
+
+wSerialExchangeNybbleTempReceiveData:: ; cc3d
+; temporary nybble used by Serial_ExchangeNybble
+
+wLinkMenuSelectionReceiveBuffer:: ; cc3d
+; two byte buffer
+; the received menu selection is stored twice
+
+wcc3d:: ds 1
+
+wSerialExchangeNybbleReceiveData:: ; cc3e
+; the final received nybble is stored here by Serial_ExchangeNybble
+ ds 1
+
+ ds 3
+
+wSerialExchangeNybbleSendData:: ; cc42
+; this nybble is sent when using Serial_SyncAndExchangeNybble or Serial_ExchangeNybble
+
+wLinkMenuSelectionSendBuffer:: ; cc42
+; two byte buffer
+; the menu selection byte is stored twice before sending
+
+ ds 5
+
+wLinkTimeoutCounter:: ; cc47
+; 1 byte
+
+wUnknownSerialCounter:: ; cc47
+; 2 bytes
+
+wcc47:: ds 1
+wcc48:: ds 1
+
+wWhichTradeMonSelectionMenu:: ; cc49
+; $00 = player mons
+; $01 = enemy mons
+
+wcc49:: ds 1
+
+wMenuWrappingEnabled:: ; cc4a
+; set to 1 if you can go from the bottom to the top or top to bottom of a menu
+; set to 0 if you can't go past the top or bottom of the menu
+ ds 1
+
+wcc4b:: ds 2
+wcc4d:: ds 1
+
+wPredefID:: ; cc4e
+ ds 1
+wPredefRegisters:: ; cc4f
+ ds 6
+
+wTrainerHeaderFlagBit:: ; cc55
+ ds 1
+
+ ds 1
+
+wNPCMovementScriptPointerTableNum:: ; cc57
+; which NPC movement script pointer is being used
+; 0 if an NPC movement script is not running
+ ds 1
+
+wNPCMovementScriptBank:: ; cc58
+; ROM bank of current NPC movement script
+ ds 1
+
+ ds 2
+
+wHallOfFame:: ; cc5b
+wBoostExpByExpAll:: ; cc5b
+wAnimationType:: ; cc5b
+; values between 0-6. Shake screen horizontally, shake screen vertically, blink Pokemon...
+
+wcc5b:: ds 1
+wcc5c:: ds 1
+wcc5d:: ds 1
+wcc5e:: ds 13
+
+wcc6b:: ds 14
+wcc79:: ds 30
+
+wNPCMovementDirections2:: ; cc97
+
+wSwitchPartyMonTempBuffer:: ; cc97
+; temporary buffer when swapping party mon data
+ ds 10
+
+wcca1:: ds 49
+
+wRLEByteCount:: ; ccd2
+ ds 1
+
+wSimulatedJoypadStatesEnd:: ; ccd3
+; this is the end of the joypad states
+; the list starts above this address and extends downwards in memory until here
+; overloaded with below labels
+
+wccd3:: ds 1
+wccd4:: ds 1
+
+; if [ccd5] != 1, the second AI layer is not applied
+wAILayer2Encouragement:: ; ccd5
+ ds 1
+ ds 1
+
+; current HP of player and enemy substitutes
+wPlayerSubstituteHP:: ; ccd7
+ ds 1
+wEnemySubstituteHP:: ; ccd8
+ ds 1
+
+wccd9:: ds 2
+
+wMoveMenuType:: ; ccdb
+; 0=regular, 1=mimic, 2=above message box (relearn, heal pp..)
+ ds 1
+
+wPlayerSelectedMove:: ; ccdc
+ ds 1
+wEnemySelectedMove:: ; ccdd
+ ds 1
+
+wLinkBattleRandomNumberListIndex:: ; ccde
+ ds 1
+
+wAICount:: ; ccdf
+; number of times remaining that AI action can occur
+ ds 1
+
+ ds 2
+
+wEnemyMoveListIndex:: ; cce2
+ ds 1
+
+wcce3:: ds 1
+wcce4:: ds 1
+
+wTotalPayDayMoney:: ; cce5
+; total amount of money made using Pay Day during the current battle
+ ds 3
+
+wSafariEscapeFactor:: ; cce8
+ ds 1
+wSafariBaitFactor:: ; cce9
+ ds 1;
+
+ ds 1
+
+wcceb:: ds 1
+wccec:: ds 1
+
+wMonIsDisobedient:: ds 1 ; cced
+
+wPlayerDisabledMoveNumber:: ds 1 ; ccee
+wEnemyDisabledMoveNumber:: ds 1 ; ccef
+
+wccf0:: ds 1
+
+wPlayerUsedMove:: ds 1 ; ccf1
+wEnemyUsedMove:: ds 1 ; ccf2
+
+wccf3:: ds 1
+
+wMoveDidntMiss:: ds 1 ; ccf4
+
+wPartyFoughtCurrentEnemyFlags:: ; ccf5
+; flags that indicate which party members have fought the current enemy mon
+ flag_array 6
+
+wccf6:: ds 1
+wccf7:: ds 14
+
+wUnknownSlotVar:: ; cd05
+
+wEnemyNumHits:: ; cd05
+; number of hits by enemy in attacks like Double Slap, etc.
+
+wEnemyBideAccumulatedDamage:: ; cd05
+; the amount of damage accumulated by the enemy while biding (2 bytes)
+
+ds 10
+
+wInGameTradeGiveMonSpecies:: ; cd0f
+
+wPlayerMonUnmodifiedLevel:: ; cd0f
+ ds 1
+
+wInGameTradeTextPointerTablePointer:: ; cd10
+
+wPlayerMonUnmodifiedMaxHP:: ; cd10
+ ds 2
+
+wInGameTradeTextPointerTableIndex:: ; cd12
+
+wPlayerMonUnmodifiedAttack:: ; cd12
+ ds 1
+wInGameTradeGiveMonName:: ; cd13
+ ds 1
+wPlayerMonUnmodifiedDefense:: ; cd14
+ ds 2
+wPlayerMonUnmodifiedSpeed:: ; cd16
+ ds 2
+wPlayerMonUnmodifiedSpecial:: ; cd18
+ ds 2
+
+; stat modifiers for the player's current pokemon
+; value can range from 1 - 13 ($1 to $D)
+; 7 is normal
+
+wPlayerMonStatMods::
+wPlayerMonAttackMod:: ; cd1a
+ ds 1
+wPlayerMonDefenseMod:: ; cd1b
+ ds 1
+wPlayerMonSpeedMod:: ; cd1c
+ ds 1
+wPlayerMonSpecialMod:: ; cd1d
+ ds 1
+
+wInGameTradeReceiveMonName:: ; cd1e
+
+wPlayerMonAccuracyMod:: ; cd1e
+ ds 1
+wPlayerMonEvasionMod:: ; cd1f
+ ds 1
+
+ ds 3
+
+wEnemyMonUnmodifiedLevel:: ; cd23
+ ds 1
+wEnemyMonUnmodifiedMaxHP:: ; cd24
+ ds 2
+wEnemyMonUnmodifiedAttack:: ; cd26
+ ds 2
+wEnemyMonUnmodifiedDefense:: ; cd28
+ ds 1
+
+wInGameTradeMonNick:: ; cd29
+ ds 1
+
+wEnemyMonUnmodifiedSpeed:: ; cd2a
+ ds 2
+wEnemyMonUnmodifiedSpecial:: ; cd2c
+ ds 1
+
+wEngagedTrainerClass:: ; cd2d
+ ds 1
+wEngagedTrainerSet:: ; cd2e
+; ds 1
+
+; stat modifiers for the enemy's current pokemon
+; value can range from 1 - 13 ($1 to $D)
+; 7 is normal
+
+wEnemyMonStatMods::
+wEnemyMonAttackMod:: ; cd2e
+ ds 1
+wEnemyMonDefenseMod:: ; cd2f
+ ds 1
+wEnemyMonSpeedMod:: ; cd30
+ ds 1
+wEnemyMonSpecialMod:: ; cd31
+ ds 1
+wEnemyMonAccuracyMod:: ; cd32
+ ds 1
+wEnemyMonEvasionMod:: ; cd33
+ ds 1
+
+wInGameTradeReceiveMonSpecies::
+ ds 1
+
+ ds 2
+
+wNPCMovementDirections2Index:: ; cd37
+
+wcd37:: ds 1
+
+wSimulatedJoypadStatesIndex:: ; cd38
+; the next simulated joypad state is at wSimulatedJoypadStatesEnd plus this value minus 1
+; 0 if the joypad state is not being simulated
+ ds 1
+
+wWastedByteCD39:: ; cd39
+; written to but nothing ever reads it
+ ds 1
+
+wWastedByteCD3A:: ; cd3a
+; written to but nothing ever reads it
+ ds 1
+
+wOverrideSimulatedJoypadStatesMask:: ; cd3b
+; mask indicating which real button presses can override simulated ones
+; XXX is it ever not 0?
+ ds 1
+
+ ds 1
+
+wTradedPlayerMonSpecies:: ; cd3d
+
+wTradingWhichPlayerMon:: ; cd3d
+
+wChangeBoxSavedMapTextPointer:: ; cd3d
+
+wFlyAnimUsingCoordList:: ; cd3d
+
+wPlayerSpinInPlaceAnimFrameDelay:: ; cd3d
+
+wPlayerSpinWhileMovingUpOrDownAnimDeltaY:: ; cd3d
+
+wHiddenObjectFunctionArgument:: ; cd3d
+
+wSubtrahend:: ; cd3d
+; subtract (BCD) wSubtrahend, wSubtrahend+1, wSubtrahend+2
+
+wWhichTrade:: ; cd3d
+; which entry from TradeMons to select
+
+wTrainerSpriteOffset:: ; cd3d
+ ds 1
+
+wTradedEnemyMonSpecies:: ; cd3e
+
+wTradingWhichEnemyMon:: ; cd3e
+
+wFlyAnimCounter:: ; cd3e
+
+wPlayerSpinInPlaceAnimFrameDelayDelta:: ; cd3e
+
+wPlayerSpinWhileMovingUpOrDownAnimMaxY:: ; cd3e
+
+wHiddenObjectFunctionRomBank:: ; cd3e
+
+wTrainerEngageDistance:: ; cd3e
+ ds 1
+
+wNameOfPlayerMonToBeTraded:: ; cd3f
+
+wFlyAnimBirdSpriteImageIndex:: ; cd3f
+
+wPlayerSpinInPlaceAnimFrameDelayEndValue:: ; cd3f
+
+wPlayerSpinWhileMovingUpOrDownAnimFrameDelay:: ; cd3f
+
+wHiddenObjectIndex:: ; cd3f
+
+wTrainerFacingDirection:: ; cd3f
+wcd3f::
+ ds 1
+
+wPlayerSpinInPlaceAnimSoundID:: ; cd40
+
+wHiddenObjectY:: ; cd40
+
+wTrainerScreenY:: ; cd40
+ ds 1
+
+wTradedPlayerMonOT:: ; cd41
+
+wHiddenObjectX:: ; cd41
+
+wTrainerScreenX:: ; cd41
+ ds 1
+
+wcd42:: ds 1
+wcd43:: ds 1
+wcd44:: ds 1
+wcd45:: ds 1
+wcd46:: ds 1
+wcd47:: ds 1
+wcd48:: ds 1
+wcd49:: ds 1
+wcd4a:: ds 1
+wcd4b:: ds 1
+
+wTradedPlayerMonOTID:: ; cd4c
+
+wcd4c:: ds 1
+wcd4d:: ds 1
+
+wTradedEnemyMonOT:: ; cd4e
+
+wcd4e:: ds 1
+wcd4f:: ds 1
+wcd50:: ds 9
+
+wTradedEnemyMonOTID:: ; cd59
+ ds 2
+
+wcd5b:: ds 1
+wcd5c:: ds 1
+
+wMonPartySpriteSpecies:: ; cd5d
+ ds 1
+
+wLeftGBMonSpecies:: ; cd5e
+; in the trade animation, the mon that leaves the left gameboy
+ ds 1
+
+wRightGBMonSpecies:: ; cd5f
+; in the trade animation, the mon that leaves the right gameboy
+ ds 1
+
+wFlags_0xcd60:: ; cd60
+; bit 0: is player engaged by trainer (to avoid being engaged by multiple trainers simultaneously)
+; bit 1: boulder dust animation (from using Strength) pending
+; bit 5: don't play sound when A or B is pressed in menu
+; bit 6: tried pushing against boulder once (you need to push twice before it will move)
+ ds 1
+
+ ds 9
+
+wcd6a:: ds 1
+
+wJoyIgnore:: ; cd6b
+; Set buttons are ignored.
+ ds 1
+
+wcd6c:: ds 1
+wcd6d:: ds 4
+wcd71:: ds 1
+wcd72:: ds 5
+wcd77:: ds 1
+wcd78:: ds 9
+
+wSerialOtherGameboyRandomNumberListBlock:: ; cd81
+; buffer for transferring the random number list generated by the other gameboy
+
+wTileMapBackup2:: ; cd81
+; second buffer for temporarily saving and restoring current screen's tiles (e.g. if menus are drawn on top)
+ ds 20 * 18
+
+wBuffer:: ; cee9
+; Temporary storage area of 30 bytes.
+wHPBarMaxHP:: ; cee9
+ ds 2
+wHPBarOldHP:: ; ceeb
+ ds 2
+wHPBarNewHP:: ; ceed
+ ds 2
+wHPBarDelta:: ; ceef
+ ds 1
+
+wcef0:: ds 1
+wcef1:: ds 12
+
+wHPBarHPDifference:: ; cefd
+ ds 1
+ ds 7
+
+wcf05:: ds 1
+wcf06:: ds 1
+
+wAnimSoundID:: ; cf07
+; sound ID during battle animations
+ ds 1
+
+wcf08:: ds 1
+wcf09:: ds 1
+wcf0a:: ds 1
+wBattleResult:: ; cf0b
+; $00 - win
+; $01 - lose
+; $02 - draw
+ ds 1
+
+wAutoTextBoxDrawingControl:: ; cf0c
+; bit 0: if set, DisplayTextID automatically draws a text box
+ ds 1
+
+wcf0d:: ds 1
+wcf0e:: ds 1
+wcf0f:: ds 1
+
+wNPCMovementScriptFunctionNum:: ; cf10
+; which script function within the pointer table indicated by
+; wNPCMovementScriptPointerTableNum
+ ds 1
+
+wcf11:: ds 1
+
+wPredefParentBank:: ; cf12
+ ds 1
+
+wSpriteIndex:: ds 1
+
+wCurSpriteMovement2:: ; cf14
+; movement byte 2 of current sprite
+ ds 1
+
+ ds 2
+
+wNPCMovementScriptSpriteOffset:: ; cf17
+; sprite offset of sprite being controlled by NPC movement script
+ ds 1
+
+wcf18:: ds 2
+
+wOnSGB:: ; cf1b
+; if running on SGB, it's 1, else it's 0
+ ds 1
+
+wcf1c:: ds 1
+wcf1d:: ds 1
+wcf1e:: ds 1
+wcf1f:: ds 6
+wcf25:: ds 8
+wcf2d:: ds 1
+wcf2e:: ds 2
+wcf30:: ds 7
+wcf37:: ds 20
+wcf4b:: ds 1
+wcf4c:: ds 1
+wGainBoostedExp:: ; cf4d
+ ds 1
+ ds 17
+
+wGymCityName:: ; cf5f
+wStringBuffer1:: ; cf5f
+ ds 16 + 1
+wGymLeaderName:: ; cf70
+wStringBuffer2:: ; cf70
+ ds 16 + 1
+wStringBuffer3:: ; cf81
+ ds 9 + 1
+
+wList:: ; cf8b
+ ds 2
+
+wcf8d:: ds 1
+wcf8e:: ds 1
+
+wItemPrices:: ; cf8f
+ ds 2
+
+wcf91:: ds 1
+
+wWhichPokemon:: ; cf92
+; which pokemon you selected
+ ds 1
+
+wcf93:: ds 1
+
+wHPBarType:: ; cf94
+; type of HP bar
+; $00 = enemy HUD in battle
+; $01 = player HUD in battle / status screen
+; $02 = party menu
+
+wListMenuID:: ; cf94
+; ID used by DisplayListMenuID
+ ds 1
+
+wcf95:: ds 1
+wcf96:: ds 1
+wcf97:: ds 1
+
+; LoadMonData copies mon data here
+wLoadedMon:: party_struct wLoadedMon ; cf98
+
+wFontLoaded:: ; cfc4
+; bit 0: The space in VRAM that is used to store walk animation tile patterns
+; for the player and NPCs is in use for font tile patterns.
+; This means that NPC movement must be disabled.
+; The other bits are unused.
+ ds 1
+
+wWalkCounter:: ; cfc5
+; walk animation counter
+ ds 1
+
+wTileInFrontOfPlayer:: ; cfc6
+; background tile number in front of the player (either 1 or 2 steps ahead)
+ ds 1
+
+wMusicHeaderPointer:: ; cfc7
+; (the current music channel address - $4000) / 3
+ ds 1
+
+wcfc8:: ds 1
+wcfc9:: ds 1
+wcfca:: ds 1
+
+wUpdateSpritesEnabled:: ; cfcb
+; $01 enables UpdateSprites; anything else disables it
+ ds 1
+
+W_ENEMYMOVENUM:: ; cfcc
+ ds 1
+W_ENEMYMOVEEFFECT:: ; cfcd
+ ds 1
+W_ENEMYMOVEPOWER:: ; cfce
+ ds 1
+W_ENEMYMOVETYPE:: ; cfcf
+ ds 1
+W_ENEMYMOVEACCURACY:: ; cfd0
+ ds 1
+W_ENEMYMOVEMAXPP:: ; cfd1
+ ds 1
+W_PLAYERMOVENUM:: ; cfd2
+ ds 1
+W_PLAYERMOVEEFFECT:: ; cfd3
+ ds 1
+W_PLAYERMOVEPOWER:: ; cfd4
+ ds 1
+W_PLAYERMOVETYPE:: ; cfd5
+ ds 1
+W_PLAYERMOVEACCURACY:: ; cfd6
+ ds 1
+W_PLAYERMOVEMAXPP:: ; cfd7
+ ds 1
+
+
+wEnemyMonSpecies2:: ; cfd8
+ ds 1
+wBattleMonSpecies2:: ; cfd9
+ ds 1
+
+wEnemyMonNick:: ds 11 ; cfda
+
+wEnemyMon:: ; cfe5
+; The wEnemyMon struct reaches past 0xcfff,
+; the end of wram bank 0 on cgb.
+; This has no significance on dmg, where wram
+; isn't banked (c000-dfff is contiguous).
+; However, recent versions of rgbds have replaced
+; dmg-style wram with cgb wram banks.
+
+; Until this is fixed, this struct will have
+; to be declared manually.
+
+wEnemyMonSpecies:: db
+wEnemyMonHP:: dw
+wEnemyMonPartyPos::
+wEnemyMonBoxLevel:: db
+wEnemyMonStatus:: db
+wEnemyMonType::
+wEnemyMonType1:: db
+wEnemyMonType2:: db
+wEnemyMonCatchRate_NotReferenced:: db
+wEnemyMonMoves:: ds NUM_MOVES
+wEnemyMonDVs:: ds 2
+wEnemyMonLevel:: db
+wEnemyMonMaxHP:: dw
+wEnemyMonAttack:: dw
+wEnemyMonDefense:: dw
+wEnemyMonSpeed:: dw
+wEnemyMonSpecial:: dw
+wEnemyMonPP:: ds 2 ; NUM_MOVES - 2
+SECTION "WRAM Bank 1", WRAMX, BANK[1]
+ ds 2 ; NUM_MOVES - 2
+
+wEnemyMonBaseStats:: ds 5
+wEnemyMonCatchRate:: ds 1
+wEnemyMonBaseExp:: ds 1
+
+wBattleMonNick:: ds 11 ; d009
+wBattleMon:: battle_struct wBattleMon ; d014
+
+
+W_TRAINERCLASS:: ; d031
+ ds 1
+
+ ds 1
+
+wTrainerPicPointer:: ; wd033
+ ds 2
+ ds 1
+wd036:: ds 16
+wd046:: ds 1
+wd047:: ds 1
+wd048:: ds 2
+
+W_TRAINERNAME:: ; d04a
+; 13 bytes for the letters of the opposing trainer
+; the name is terminated with $50 with possible
+; unused trailing letters
+ ds 13
+
+W_ISINBATTLE:: ; d057
+; no battle, this is 0
+; wild battle, this is 1
+; trainer battle, this is 2
+ ds 1
+
+wPartyGainExpFlags:: ; d058
+; flags that indicate which party members should be be given exp when GainExperience is called
+ flag_array 6
+
+W_CUROPPONENT:: ; d059
+; in a wild battle, this is the species of pokemon
+; in a trainer battle, this is the trainer class + $C8
+ ds 1
+
+W_BATTLETYPE:: ; d05a
+; in normal battle, this is 0
+; in old man battle, this is 1
+; in safari battle, this is 2
+ ds 1
+
+wDamageMultipliers:: ; d05b
+; bits 0-6: Effectiveness
+ ; $0 = immune
+ ; $5 = not very effective
+ ; $a = neutral
+ ; $14 = super-effective
+; bit 7: STAB
+ ds 1
+
+W_LONEATTACKNO:: ; d05c
+; which entry in LoneAttacks to use
+W_GYMLEADERNO:: ; d05c
+; it's actually the same thing as ^
+ ds 1
+W_TRAINERNO:: ; d05d
+; which instance of [youngster, lass, etc] is this?
+ ds 1
+
+wCriticalHitOrOHKO:: ; d05e
+; $00 = normal attack
+; $01 = critical hit
+; $02 = successful OHKO
+; $ff = failed OHKO
+ ds 1
+
+W_MOVEMISSED:: ; d05f
+ ds 1
+
+wPlayerStatsToDouble:: ; d060
+; always 0
+ ds 1
+
+wPlayerStatsToHalve:: ; d061
+; always 0
+ ds 1
+
+W_PLAYERBATTSTATUS1:: ; d062
+; bit 0 - bide
+; bit 1 - thrash / petal dance
+; bit 2 - attacking multiple times (e.g. double kick)
+; bit 3 - flinch
+; bit 4 - charging up for attack
+; bit 5 - using multi-turn move (e.g. wrap)
+; bit 6 - invulnerable to normal attack (using fly/dig)
+; bit 7 - confusion
+ ds 1
+
+W_PLAYERBATTSTATUS2:: ; d063
+; bit 0 - X Accuracy effect
+; bit 1 - protected by "mist"
+; bit 2 - focus energy effect
+; bit 4 - has a substitute
+; bit 5 - need to recharge
+; bit 6 - rage
+; bit 7 - leech seeded
+ ds 1
+
+W_PLAYERBATTSTATUS3:: ; d064
+; bit 0 - toxic
+; bit 1 - light screen
+; bit 2 - reflect
+; bit 3 - tranformed
+ ds 1
+
+wEnemyStatsToDouble:: ; d065
+; always 0
+ ds 1
+
+wEnemyStatsToHalve:: ; d066
+; always 0
+ ds 1
+
+W_ENEMYBATTSTATUS1:: ; d067
+ ds 1
+W_ENEMYBATTSTATUS2:: ; d068
+ ds 1
+W_ENEMYBATTSTATUS3:: ; d069
+ ds 1
+
+wPlayerNumAttacksLeft::
+; when the player is attacking multiple times, the number of attacks left
+ ds 1
+
+W_PLAYERCONFUSEDCOUNTER:: ; wd06b
+ ds 1
+
+W_PLAYERTOXICCOUNTER:: ; d06c
+ ds 1
+W_PLAYERDISABLEDMOVE:: ; d06d
+; high nibble: which move is disabled (1-4)
+; low nibble: disable turns left
+ ds 1
+
+ ds 1
+
+wEnemyNumAttacksLeft:: ; d06f
+; when the enemy is attacking multiple times, the number of attacks left
+ ds 1
+
+W_ENEMYCONFUSEDCOUNTER:: ; wd070
+ ds 1
+
+W_ENEMYTOXICCOUNTER:: ; d071
+ ds 1
+W_ENEMYDISABLEDMOVE:: ; d072
+; high nibble: which move is disabled (1-4)
+; low nibble: disable turns left
+ ds 1
+
+ ds 1
+
+wPlayerNumHits:: ; d074
+; number of hits by player in attacks like Double Slap, etc.
+
+wPlayerBideAccumulatedDamage:: ; d074
+; the amount of damage accumulated by the player while biding (2 bytes)
+
+wUnknownSerialCounter2:: ; d075
+; 2 bytes
+
+ ds 4
+
+wEscapedFromBattle::
+; non-zero when an item or move that allows escape from battle was used
+ ds 1
+
+wd079::
+wAmountMoneyWon:: ds 1 ; wd079 - wd07b
+wd07a:: ds 1
+ ds 1
+
+W_ANIMATIONID:: ; d07c
+; ID number of the current battle animation
+ ds 1
+
+wd07d:: ds 1
+wd07e:: ds 3
+
+; base coordinates of frame block
+W_BASECOORDX:: ; d081
+ ds 1
+W_BASECOORDY:: ; d082
+ ds 1
+
+; low health alarm counter/enable
+; high bit = enable, others = timer to cycle frequencies
+wLowHealthAlarm:: ds 1 ; d083
+
+W_FBTILECOUNTER:: ; d084
+; counts how many tiles of the current frame block have been drawn
+ ds 1
+
+wd085:: ds 1
+
+W_SUBANIMFRAMEDELAY:: ; d086
+; duration of each frame of the current subanimation in terms of screen refreshes
+ ds 1
+W_SUBANIMCOUNTER:: ; d087
+; counts the number of subentries left in the current subanimation
+ ds 1
+
+wd088:: ds 1
+
+W_NUMFBTILES:: ; d089
+; number of tiles in current battle animation frame block
+ ds 1
+
+wTradedMonMovingRight:: ; d08a
+; $01 if mon is moving from left gameboy to right gameboy; $00 if vice versa
+
+wd08a:: ds 1
+
+wTownMapSpriteBlinkingCounter:: ; d08b
+
+wPartyMonAnimCounter:: ; d08b
+
+W_SUBANIMTRANSFORM:: ; d08b
+; controls what transformations are applied to the subanimation
+; 01: flip horizontally and vertically
+; 02: flip horizontally and translate downwards 40 pixels
+; 03: translate base coordinates of frame blocks, but don't change their internal coordinates or flip their tiles
+; 04: reverse the subanimation
+ ds 1
+
+wEndBattleWinTextPointer:: ; d08c
+ ds 2
+
+wEndBattleLoseTextPointer:: ; d08e
+ ds 2
+
+ ds 2
+
+wEndBattleTextRomBank:: ; d092
+ ds 1
+
+ ds 1
+
+W_SUBANIMADDRPTR:: ; d094
+; the address _of the address_ of the current subanimation entry
+ ds 2
+W_SUBANIMSUBENTRYADDR:: ; d096
+; the address of the current subentry of the current subanimation
+ ds 2
+
+ ds 2
+
+wd09a:: ds 1
+
+wTownMapSpriteBlinkingEnabled:: ; d09b
+; non-zero when enabled. causes nest locations to blink on and off.
+; the town selection cursor will blink regardless of what this value is
+
+wd09b:: ds 1
+
+W_FBDESTADDR:: ; d09c
+; current destination address in OAM for frame blocks (big endian)
+ ds 2
+
+W_FBMODE:: ; d09e
+; controls how the frame blocks are put together to form frames
+; specifically, after finishing drawing the frame block, the frame block's mode determines what happens
+; 00: clean OAM buffer and delay
+; 02: move onto the next frame block with no delay and no cleaning OAM buffer
+; 03: delay, but don't clean OAM buffer
+; 04: delay, without cleaning OAM buffer, and do not advance [W_FBDESTADDR], so that the next frame block will overwrite this one
+; sprite data is written column by column, each byte contains 8 columns (one for ech bit)
+; for 2bpp sprites, pairs of two consecutive bytes (i.e. pairs of consecutive rows of sprite data)
+; contain the upper and lower bit of each of the 8 pixels, respectively
+ ds 1
+
+wNewTileBlockID:: ; d09f
+
+wd09f:: ds 1
+wd0a0:: ds 1
+
+W_SPRITECURPOSX:: ; d0a1
+ ds 1
+W_SPRITECURPOSY:: ; d0a2
+ ds 1
+W_SPRITEWITDH:: ; d0a3
+ ds 1
+W_SPRITEHEIGHT:: ; d0a4
+ ds 1
+W_SPRITEINPUTCURBYTE:: ; d0a5
+; current input byte
+ ds 1
+W_SPRITEINPUTBITCOUNTER:: ; d0a6
+; bit offset of last read input bit
+ ds 1
+
+W_SPRITEOUTPUTBITOFFSET:: ; d0a7; determines where in the output byte the two bits are placed. Each byte contains four columns (2bpp data)
+; 3 -> XX000000 1st column
+; 2 -> 00XX0000 2nd column
+; 1 -> 0000XX00 3rd column
+; 0 -> 000000XX 4th column
+ ds 1
+
+W_SPRITELOADFLAGS:: ; d0a8
+; bit 0 determines used buffer (0 -> $a188, 1 -> $a310)
+; bit 1 loading last sprite chunk? (there are at most 2 chunks per load operation)
+ ds 1
+W_SPRITEUNPACKMODE:: ; d0a9
+ ds 1
+W_SPRITEFLIPPED:: ; d0aa
+ ds 1
+
+W_SPRITEINPUTPTR:: ; d0ab
+; pointer to next input byte
+ ds 2
+W_SPRITEOUTPUTPTR:: ; d0ad
+; pointer to current output byte
+ ds 2
+W_SPRITEOUTPUTPTRCACHED:: ; d0af
+; used to revert pointer for different bit offsets
+ ds 2
+W_SPRITEDECODETABLE0PTR:: ; d0b1
+; pointer to differential decoding table (assuming initial value 0)
+ ds 2
+W_SPRITEDECODETABLE1PTR:: ; d0b3
+; pointer to differential decoding table (assuming initial value 1)
+ ds 2
+
+wd0b5:: ds 1
+
+wNameListType:: ; d0b6
+ ds 1
+
+wPredefBank:: ; d0b7
+ ds 1
+
+W_MONHEADER:: ; d0b8
+W_MONHDEXNUM:: ; d0b8
+ ds 1
+
+W_MONHBASESTATS:: ; d0b9
+W_MONHBASEHP:: ; d0b9
+ ds 1
+W_MONHBASEATTACK:: ; d0ba
+ ds 1
+W_MONHBASEDEFENSE:: ; d0bb
+ ds 1
+W_MONHBASESPEED:: ; d0bc
+ ds 1
+W_MONHBASESPECIAL:: ; d0bd
+ ds 1
+
+W_MONHTYPES:: ; d0be
+W_MONHTYPE1:: ; d0be
+ ds 1
+W_MONHTYPE2:: ; d0bf
+ ds 1
+
+W_MONHCATCHRATE:: ; d0c0
+ ds 1
+W_MONHBASEXP:: ; d0c1
+ ds 1
+W_MONHSPRITEDIM:: ; d0c2
+ ds 1
+W_MONHFRONTSPRITE:: ; d0c3
+ ds 2
+W_MONHBACKSPRITE:: ; d0c5
+ ds 2
+
+W_MONHMOVES:: ; d0c7
+ ds 4
+
+W_MONHGROWTHRATE:: ; d0cb
+ ds 1
+
+W_MONHLEARNSET:: ; d0cc
+; bit field
+ flag_array 50 + 5
+ ds 1
+
+wd0d4:: ds 3
+
+W_MONHPADDING:: ; d0d7
+
+
+W_DAMAGE:: ; d0d7
+ ds 2
+
+ds 2
+
+wRepelRemainingSteps:: ; wd0db
+ ds 1
+
+wMoves:: ; wd0dc
+; list of moves for FormatMovesString
+ ds 4
+
+wMoveNum:: ; d0e0
+ ds 1
+
+wMovesString:: ; d0e1
+ ds 56
+
+wd119:: ds 1
+
+wWalkBikeSurfStateCopy:: ; d11a
+; wWalkBikeSurfState is sometimes copied here, but it doesn't seem to be used for anything
+ ds 1
+
+wd11b:: ds 1
+wd11c:: ds 1
+wd11d:: ds 1
+wd11e:: ds 1
+wd11f:: ds 1
+
+wNumRunAttempts::
+; number of times the player has tried to run from battle
+ ds 1
+
+wd121:: ds 1
+wd122:: ds 2
+wd124:: ds 1
+
+wTextBoxID:: ; d125
+ ds 1
+
+wd126:: ds 1
+
+W_CURENEMYLVL:: ; d127
+ ds 1
+
+wd128:: ds 1
+wd129:: ds 1
+wd12a:: ds 1
+
+wLinkState:: ; d12b
+ ds 1
+
+wTwoOptionMenuID:: ds 1
+wd12d:: ds 1
+wd12e:: ds 1
+wd12f:: ds 1
+wd130:: ds 1
+wd131:: ds 1
+wd132:: ds 1
+wd133:: ds 6
+wd139:: ds 1
+
+wIgnoreInputCounter:: ; d13a
+; counts downward each frame
+; when it hits 0, bit 5 (ignore input bit) of wd730 is reset
+ ds 1
+
+wStepCounter:: ; d13b
+; counts down once every step
+ ds 1
+
+wNumberOfNoRandomBattleStepsLeft:: ; d13c
+; after a battle, you have at least 3 steps before a random battle can occur
+ ds 1
+
+W_PRIZE1:: ; d13d
+ ds 1
+W_PRIZE2:: ; d13e
+ ds 1
+W_PRIZE3:: ; d13f
+ ds 1
+
+ ds 1
+
+wSerialRandomNumberListBlock:: ; d141
+; the first 7 bytes are the preamble
+
+wd141:: ds 2
+wd143:: ds 2
+wd145:: ds 3
+
+wLinkBattleRandomNumberList:: ; d148
+; shared list of 9 random numbers, indexed by wLinkBattleRandomNumberListIndex
+ ds 10
+
+wSerialPlayerDataBlock:: ; d152
+; the first 6 bytes are the preamble
+
+wd152:: ds 1
+wd153:: ds 3
+wd156:: ds 1
+wd157:: ds 1
+
+
+wPlayerName:: ; d158
+ ds 11
+
+wPartyCount:: ds 1 ; d163
+wPartySpecies:: ds PARTY_LENGTH ; d164
+wPartyEnd:: ds 1 ; d16a
+
+wPartyMons::
+wPartyMon1:: party_struct wPartyMon1 ; d16b
+wPartyMon2:: party_struct wPartyMon2 ; d197
+wPartyMon3:: party_struct wPartyMon3 ; d1c3
+wPartyMon4:: party_struct wPartyMon4 ; d1ef
+wPartyMon5:: party_struct wPartyMon5 ; d21b
+wPartyMon6:: party_struct wPartyMon6 ; d247
+
+wPartyMonOT:: ds 11 * PARTY_LENGTH ; d273
+wPartyMonNicks:: ds 11 * PARTY_LENGTH ; d2b5
+
+
+wPokedexOwned:: ; d2f7
+ flag_array NUM_POKEMON
+wPokedexOwnedEnd::
+
+wPokedexSeen:: ; d30a
+ flag_array NUM_POKEMON
+wPokedexSeenEnd::
+
+
+wNumBagItems:: ; d31d
+ ds 1
+wBagItems:: ; d31e
+; item, quantity
+ ds 20 * 2
+ ds 1 ; end
+
+wPlayerMoney:: ; d347
+ ds 3 ; BCD
+
+W_RIVALNAME:: ; d34a
+ ds 11
+
+W_OPTIONS:: ; d355
+; bit 7 = battle animation
+; 0: On
+; 1: Off
+; bit 6 = battle style
+; 0: Shift
+; 1: Set
+; bits 0-3 = text speed (number of frames to delay after printing a letter)
+; 1: Fast
+; 3: Medium
+; 5: Slow
+ ds 1
+
+W_OBTAINEDBADGES:: ; d356
+ ds 1
+
+ ds 1
+
+wd358:: ds 1
+
+wPlayerID:: ; d359
+ ds 2
+
+wd35b:: ds 1
+wd35c:: ds 1
+
+wMapPalOffset:: ; d35d
+; offset subtracted from FadePal4 to get the background and object palettes for the current map
+; normally, it is 0. it is 6 when Flash is needed, causing FadePal2 to be used instead of FadePal4
+ ds 1
+
+W_CURMAP:: ; d35e
+ ds 1
+
+wCurrentTileBlockMapViewPointer:: ; d35f
+; pointer to the upper left corner of the current view in the tile block map
+ ds 2
+
+W_YCOORD:: ; d361
+; player’s position on the current map
+ ds 1
+
+W_XCOORD:: ; d362
+ ds 1
+
+W_YBLOCKCOORD:: ; d363
+; player's y position (by block)
+ ds 1
+
+W_XBLOCKCOORD:: ; d364
+ ds 1
+
+wLastMap:: ; d365
+ ds 1
+
+wd366:: ds 1
+
+W_CURMAPTILESET:: ; d367
+ ds 1
+
+W_CURMAPHEIGHT:: ; d368
+; blocks
+ ds 1
+
+W_CURMAPWIDTH:: ; d369
+; blocks
+ ds 1
+
+W_MAPDATAPTR:: ; d36a
+ ds 2
+
+W_MAPTEXTPTR:: ; d36c
+ ds 2
+
+W_MAPSCRIPTPTR:: ; d36e
+ ds 2
+
+W_MAPCONNECTIONS:: ; d370
+; connection byte
+ ds 1
+
+W_MAPCONN1PTR:: ; d371
+ ds 1
+
+wd372:: ds 1
+wd373:: ds 1
+wd374:: ds 1
+wd375:: ds 1
+wd376:: ds 1
+wd377:: ds 1
+wd378:: ds 1
+wd379:: ds 1
+wd37a:: ds 1
+wd37b:: ds 1
+
+W_MAPCONN2PTR:: ; d37c
+ ds 1
+
+wd37d:: ds 1
+wd37e:: ds 1
+wd37f:: ds 1
+wd380:: ds 1
+wd381:: ds 1
+wd382:: ds 1
+wd383:: ds 1
+wd384:: ds 1
+wd385:: ds 1
+wd386:: ds 1
+
+W_MAPCONN3PTR:: ; d387
+ ds 1
+
+wd388:: ds 1
+wd389:: ds 1
+wd38a:: ds 1
+wd38b:: ds 1
+wd38c:: ds 1
+wd38d:: ds 1
+wd38e:: ds 1
+wd38f:: ds 1
+wd390:: ds 1
+wd391:: ds 1
+
+W_MAPCONN4PTR:: ; d392
+ ds 1
+
+wd393:: ds 1
+wd394:: ds 1
+wd395:: ds 1
+wd396:: ds 1
+wd397:: ds 1
+wd398:: ds 1
+wd399:: ds 1
+wd39a:: ds 1
+wd39b:: ds 1
+wd39c:: ds 1
+
+W_SPRITESET:: ; d39d
+; sprite set for the current map (11 sprite picture ID's)
+ ds 11
+
+W_SPRITESETID:: ; d3a8
+; sprite set ID for the current map
+ ds 1
+
+wd3a9:: ds 1
+wd3aa:: ds 3
+wd3ad:: ds 1
+
+wNumberOfWarps:: ; d3ae
+; number of warps in current map
+ ds 1
+
+wWarpEntries:: ; d3af
+; current map warp entries
+ ds 128
+
+wDestinationWarpID:: ; d42f
+; if $ff, the player's coordinates are not updated when entering the map
+ ds 1
+
+wd430:: ds 1 ; d430
+wd431:: ds 1 ; d431
+
+ ds 3
+
+wd435:: ds 1
+wd436:: ds 1
+
+ ds 60
+
+wd472:: ds 1
+wd473:: ds 1
+
+ ds 61
+
+wd4b0:: ds 1
+wd4b1:: ds 32
+wd4d1:: ds 16
+
+W_NUMSPRITES:: ; d4e1
+; number of sprites on the current map
+ ds 1
+
+; these two variables track the X and Y offset in blocks from the last special warp used
+; they don't seem to be used for anything
+wYOffsetSinceLastSpecialWarp:: ; d4e2
+ ds 1
+wXOffsetSinceLastSpecialWarp:: ; d4e3
+ ds 1
+
+W_MAPSPRITEDATA:: ; d4e4
+; two bytes per sprite (movement byte 2, text ID)
+ ds 32
+
+W_MAPSPRITEEXTRADATA:: ; d504
+; two bytes per sprite (trainer class/item ID, trainer set ID)
+ ds 32
+
+wd524:: ds 1
+wd525:: ds 1
+
+wMapViewVRAMPointer:: ; d526
+; the address of the upper left corner of the visible portion of the BG tile map in VRAM
+ ds 2
+
+wd528:: ds 1
+wd529:: ds 1
+wd52a:: ds 1
+
+W_TILESETBANK:: ; d52b
+ ds 1
+
+W_TILESETBLOCKSPTR:: ; d52c
+; maps blocks (4x4 tiles) to tiles
+ ds 2
+
+W_TILESETGFXPTR:: ; d52e
+ ds 2
+
+W_TILESETCOLLISIONPTR:: ; d530
+; list of all walkable tiles
+ ds 2
+
+W_TILESETTALKINGOVERTILES:: ; d532
+ ds 3
+
+W_GRASSTILE:: ; d535
+ ds 1
+
+ ds 4
+
+wNumBoxItems:: ; d53a
+ ds 1
+wBoxItems:: ; d53b
+; item, quantity
+ ds 50 * 2
+ ds 1 ; end
+
+wd5a0:: ds 2
+wd5a2:: ds 1
+wd5a3:: ds 1
+
+wPlayerCoins:: ; d5a4
+ ds 2 ; BCD
+
+W_MISSABLEOBJECTFLAGS:: ; d5a6
+; bit array of missable objects. set = removed
+ ds 39
+
+wd5cd:: ds 1
+
+W_MISSABLEOBJECTLIST:: ; d5ce
+; each entry consists of 2 bytes
+; * the sprite ID (depending on the current map)
+; * the missable object index (global, used for W_MISSABLEOBJECTFLAGS)
+; terminated with $FF
+ ds 17 * 2
+
+W_GAMEPROGRESSFLAGS:: ; d5f0
+; $c8 bytes
+ ds 0
+
+W_OAKSLABCURSCRIPT:: ; d5f0
+ ds 1
+W_PALLETTOWNCURSCRIPT:: ; d5f1
+ ds 1
+ ds 1
+W_BLUESHOUSECURSCRIPT:: ; d5f3
+ ds 1
+W_VIRIDIANCITYCURSCRIPT:: ; d5f4
+ ds 1
+ ds 2
+W_PEWTERCITYCURSCRIPT:: ; d5f7
+ ds 1
+W_ROUTE3CURSCRIPT:: ; d5f8
+ ds 1
+W_ROUTE4CURSCRIPT:: ; d5f9
+ ds 1
+ ds 1
+W_VIRIDIANGYMCURSCRIPT:: ; d5fb
+ ds 1
+W_PEWTERGYMCURSCRIPT:: ; d5fc
+ ds 1
+W_CERULEANGYMCURSCRIPT:: ; d5fd
+ ds 1
+W_VERMILIONGYMCURSCRIPT:: ; d5fe
+ ds 1
+W_CELADONGYMCURSCRIPT:: ; d5ff
+ ds 1
+W_ROUTE6CURSCRIPT:: ; d600
+ ds 1
+W_ROUTE8CURSCRIPT:: ; d601
+ ds 1
+W_ROUTE24CURSCRIPT:: ; d602
+ ds 1
+W_ROUTE25CURSCRIPT:: ; d603
+ ds 1
+W_ROUTE9CURSCRIPT:: ; d604
+ ds 1
+W_ROUTE10CURSCRIPT:: ; d605
+ ds 1
+W_MTMOON1CURSCRIPT:: ; d606
+ ds 1
+W_MTMOON3CURSCRIPT:: ; d607
+ ds 1
+W_SSANNE8CURSCRIPT:: ; d608
+ ds 1
+W_SSANNE9CURSCRIPT:: ; d609
+ ds 1
+W_ROUTE22CURSCRIPT:: ; d60a
+ ds 1
+ ds 1
+W_REDSHOUSE2CURSCRIPT:: ; d60c
+ ds 1
+W_VIRIDIANMARKETCURSCRIPT:: ; d60d
+ ds 1
+W_ROUTE22GATECURSCRIPT:: ; d60e
+ ds 1
+W_CERULEANCITYCURSCRIPT:: ; d60f
+ ds 1
+ ds 7
+W_SSANNE5CURSCRIPT:: ; d617
+ ds 1
+W_VIRIDIANFORESTCURSCRIPT:: ; d618
+ ds 1
+W_MUSEUM1FCURSCRIPT:: ; d619
+ ds 1
+W_ROUTE13CURSCRIPT:: ; d61a
+ ds 1
+W_ROUTE14CURSCRIPT:: ; d61b
+ ds 1
+W_ROUTE17CURSCRIPT:: ; d61c
+ ds 1
+W_ROUTE19CURSCRIPT:: ; d61d
+ ds 1
+W_ROUTE21CURSCRIPT:: ; d61e
+ ds 1
+W_SAFARIZONEENTRANCECURSCRIPT:: ; d61f
+ ds 1
+W_ROCKTUNNEL2CURSCRIPT:: ; d620
+ ds 1
+W_ROCKTUNNEL1CURSCRIPT:: ; d621
+ ds 1
+ ds 1
+W_ROUTE11CURSCRIPT:: ; d623
+ ds 1
+W_ROUTE12CURSCRIPT:: ; d624
+ ds 1
+W_ROUTE15CURSCRIPT:: ; d625
+ ds 1
+W_ROUTE16CURSCRIPT:: ; d626
+ ds 1
+W_ROUTE18CURSCRIPT:: ; d627
+ ds 1
+W_ROUTE20CURSCRIPT:: ; d628
+ ds 1
+W_SSANNE10CURSCRIPT:: ; d629
+ ds 1
+W_VERMILIONCITYCURSCRIPT:: ; d62a
+ ds 1
+W_POKEMONTOWER2CURSCRIPT:: ; d62b
+ ds 1
+W_POKEMONTOWER3CURSCRIPT:: ; d62c
+ ds 1
+W_POKEMONTOWER4CURSCRIPT:: ; d62d
+ ds 1
+W_POKEMONTOWER5CURSCRIPT:: ; d62e
+ ds 1
+W_POKEMONTOWER6CURSCRIPT:: ; d62f
+ ds 1
+W_POKEMONTOWER7CURSCRIPT:: ; d630
+ ds 1
+W_ROCKETHIDEOUT1CURSCRIPT:: ; d631
+ ds 1
+W_ROCKETHIDEOUT2CURSCRIPT:: ; d632
+ ds 1
+W_ROCKETHIDEOUT3CURSCRIPT:: ; d633
+ ds 1
+W_ROCKETHIDEOUT4CURSCRIPT:: ; d634
+ ds 2
+W_ROUTE6GATECURSCRIPT:: ; d636
+ ds 1
+W_ROUTE8GATECURSCRIPT:: ; d637
+ ds 2
+W_CINNABARISLANDCURSCRIPT:: ; d639
+ ds 1
+W_MANSION1CURSCRIPT:: ; d63a
+ ds 2
+W_MANSION2CURSCRIPT:: ; d63c
+ ds 1
+W_MANSION3CURSCRIPT:: ; d63d
+ ds 1
+W_MANSION4CURSCRIPT:: ; d63e
+ ds 1
+W_VICTORYROAD2CURSCRIPT:: ; d63f
+ ds 1
+W_VICTORYROAD3CURSCRIPT:: ; d640
+ ds 2
+W_FIGHTINGDOJOCURSCRIPT:: ; d642
+ ds 1
+W_SILPHCO2CURSCRIPT:: ; d643
+ ds 1
+W_SILPHCO3CURSCRIPT:: ; d644
+ ds 1
+W_SILPHCO4CURSCRIPT:: ; d645
+ ds 1
+W_SILPHCO5CURSCRIPT:: ; d646
+ ds 1
+W_SILPHCO6CURSCRIPT:: ; d647
+ ds 1
+W_SILPHCO7CURSCRIPT:: ; d648
+ ds 1
+W_SILPHCO8CURSCRIPT:: ; d649
+ ds 1
+W_SILPHCO9CURSCRIPT:: ; d64a
+ ds 1
+W_HALLOFFAMEROOMCURSCRIPT:: ; d64b
+ ds 1
+W_GARYCURSCRIPT:: ; d64c
+ ds 1
+W_LORELEICURSCRIPT:: ; d64d
+ ds 1
+W_BRUNOCURSCRIPT:: ; d64e
+ ds 1
+W_AGATHACURSCRIPT:: ; d64f
+ ds 1
+W_UNKNOWNDUNGEON3CURSCRIPT:: ; d650
+ ds 1
+W_VICTORYROAD1CURSCRIPT:: ; d651
+ ds 1
+ ds 1
+W_LANCECURSCRIPT:: ; d653
+ ds 1
+ ds 4
+W_SILPHCO10CURSCRIPT:: ; d658
+ ds 1
+W_SILPHCO11CURSCRIPT:: ; d659
+ ds 1
+ ds 1
+W_FUCHSIAGYMCURSCRIPT:: ; d65b
+ ds 1
+W_SAFFRONGYMCURSCRIPT:: ; d65c
+ ds 1
+ ds 1
+W_CINNABARGYMCURSCRIPT:: ; d65e
+ ds 1
+W_CELADONGAMECORNERCURSCRIPT:: ; d65f
+ ds 1
+W_ROUTE16GATECURSCRIPT:: ; d660
+ ds 1
+W_BILLSHOUSECURSCRIPT:: ; d661
+ ds 1
+W_ROUTE5GATECURSCRIPT:: ; d662
+ ds 1
+W_POWERPLANTCURSCRIPT:: ; d663
+; overload
+ ds 0
+W_ROUTE7GATECURSCRIPT:: ; d663
+; overload
+ ds 1
+ ds 1
+W_SSANNE2CURSCRIPT:: ; d665
+ ds 1
+W_SEAFOAMISLANDS4CURSCRIPT:: ; d666
+ ds 1
+W_ROUTE23CURSCRIPT:: ; d667
+ ds 1
+W_SEAFOAMISLANDS5CURSCRIPT:: ; d668
+ ds 1
+W_ROUTE18GATECURSCRIPT:: ; d669
+ ds 1
+
+ ds 134
+
+wd6f0:: ds 14
+wd6fe:: ds 2
+
+wWalkBikeSurfState:: ; d700
+; $00 = walking
+; $01 = biking
+; $02 = surfing
+ ds 1
+
+ ds 10
+
+W_TOWNVISITEDFLAG:: ; d70b
+ flag_array 13
+
+wSafariSteps:: ; d70d
+; starts at 502
+ ds 2
+
+W_FOSSILITEM:: ; d70f
+; item given to cinnabar lab
+ ds 1
+
+W_FOSSILMON:: ; d710
+; mon that will result from the item
+ ds 1
+
+ ds 2
+
+W_ENEMYMONORTRAINERCLASS:: ; d713
+; trainer classes start at $c8
+ ds 1
+
+wPlayerJumpingYScreenCoordsIndex:: ; d714
+ ds 1
+
+W_RIVALSTARTER:: ; d715
+ ds 1
+
+ ds 1
+
+W_PLAYERSTARTER:: ; d717
+ ds 1
+
+wBoulderSpriteIndex:: ; d718
+; sprite index of the boulder the player is trying to push
+ ds 1
+
+wLastBlackoutMap:: ; d719
+ ds 1
+
+wDestinationMap:: ; d71a
+; destination map (for certain types of special warps, not ordinary walking)
+ ds 1
+
+wd71b:: ds 1
+
+wTileInFrontOfBoulderAndBoulderCollisionResult:: ; d71c
+; used to store the tile in front of the boulder when trying to push a boulder
+; also used to store the result of the collision check ($ff for a collision and $00 for no collision)
+ ds 1
+
+wDungeonWarpDestinationMap:: ; d71d
+; destination map for dungeon warps
+ ds 1
+
+wWhichDungeonWarp:: ; d71e
+; which dungeon warp within the source map was used
+ ds 1
+
+wd71f:: ds 9
+
+wd728::
+; bit 0: using Strength outside of battle
+ ds 1
+
+ ds 1
+
+wd72a:: ds 2
+
+wd72c:: ; d72c
+; bit 0: if not set, the 3 minimum steps between random battles have passed
+ ds 1
+
+wd72d:: ds 1
+wd72e:: ds 2
+
+wd730::
+; bit 0: NPC sprite being moved by script
+; bit 5: ignore joypad input
+; bit 6: print text with no delay between each letter
+; bit 7: set if joypad states are being simulated in the overworld
+ ds 1
+
+ ds 1
+
+wd732:: ; d732
+; bit 0: play time being counted
+; bit 1: remnant of debug mode? not set by the game code.
+; if it is set
+; 1. skips most of Prof. Oak's speech, and uses NINTEN as the player's name and SONY as the rival's name
+; 2. does not have the player start in floor two of the playyer's house (instead sending them to [wLastMap])
+; 3. allows wild battles to be avoided by holding down B
+; bit 2: the target warp is a fly warp (bit 3 set or blacked out) or a dungeon warp (bit 4 set)
+; bit 3: used warp pad, escape rope, dig, teleport, or fly, so the target warp is a "fly warp"
+; bit 4: jumped into hole (Pokemon Mansion, Seafoam Islands, Victory Road) or went down waterfall (Seafoam Islands), so the target warp is a "dungeon warp"
+; bit 5: currently being forced to ride bike (cycling road)
+; bit 6: map destination is [wLastBlackoutMap] (usually the last used pokemon center, but could be the player's house)
+ ds 1
+
+W_FLAGS_D733:: ; d733
+; bit 4: use variable [W_CURMAPSCRIPT] instead of the provided index for next frame's map script (used to start battle when talking to trainers)
+; bit 7: used fly out of battle
+ ds 1
+
+wd734:: ds 2
+
+wd736:: ; d736
+; bit 0: check if the player is standing on a door and make him walk down a step if so
+; bit 1: the player is currently stepping down from a door
+; bit 2: standing on a warp
+; bit 6: jumping down a ledge
+ ds 1
+
+wCompletedInGameTradeFlags:: ; d737
+ ds 2
+
+ ds 2
+
+wd73b:: ds 1
+wd73c:: ds 3
+
+wCardKeyDoorY:: ; d73f
+ ds 1
+
+wCardKeyDoorX:: ; d740
+ ds 1
+
+ ds 2
+
+wd743:: ds 1
+wd744:: ds 3
+wd747:: ds 3
+wd74a:: ds 1
+
+wd74b:: ; d74b
+; bit 0: Prof. Oak has lead the player to the north end of his lab
+; bit 1: Prof. Oak has asked the player to choose a pokemon
+; bit 2: the player and the rival have received their pokemon
+; bit 3: the player has battled the rival in Oak's lab
+; bit 4: Prof. Oak has given the player 5 pokeballs
+; bit 5: received pokedex
+ ds 1
+
+wd74c:: ds 2
+wd74e:: ds 3
+wd751:: ds 1
+wd752:: ds 2
+wd754:: ds 1
+wd755:: ds 5
+wd75a:: ds 1
+wd75b:: ds 3
+wd75e:: ds 1
+wd75f:: ds 5
+wd764:: ds 1
+wd765:: ds 1
+wd766:: ds 1
+wd767:: ds 1
+wd768:: ds 1
+wd769:: ds 3
+wd76c:: ds 5
+wd771:: ds 2
+wd773:: ds 4
+wd777:: ds 1
+wd778:: ds 4
+wd77c:: ds 1
+wd77d:: ds 1
+wd77e:: ds 5
+wd783:: ds 11
+wd78e:: ds 2
+wd790:: ds 2
+wd792:: ds 4
+wd796:: ds 2
+wd798:: ds 2
+wd79a:: ds 1
+wd79b:: ds 1
+wd79c:: ds 5
+wd7a1:: ds 2
+wd7a3:: ds 12
+wd7af:: ds 2
+wd7b1:: ds 2
+wd7b3:: ds 1
+wd7b4:: ds 5
+wd7b9:: ds 4
+wd7bd:: ds 2
+wd7bf:: ds 3
+wd7c2:: ds 1
+wd7c3:: ds 2
+wd7c5:: ds 1
+wd7c6:: ds 3
+wd7c9:: ds 4
+wd7cd:: ds 2
+wd7cf:: ds 2
+wd7d1:: ds 1
+wd7d2:: ds 1
+wd7d3:: ds 2
+wd7d5:: ds 1
+wd7d6:: ds 1
+wd7d7:: ds 1
+wd7d8:: ds 1
+wd7d9:: ds 2
+wd7db:: ds 2
+wd7dd:: ds 2
+wd7df:: ds 1
+wd7e0:: ds 1
+wd7e1:: ds 2
+wd7e3:: ds 2
+wd7e5:: ds 2
+wd7e7:: ds 1
+wd7e8:: ds 1
+wd7e9:: ds 2
+wd7eb:: ds 2
+wd7ed:: ds 1
+wd7ee:: ds 1
+wd7ef:: ds 1
+wd7f0:: ds 1
+wd7f1:: ds 1
+wd7f2:: ds 1
+wd7f3:: ds 2
+wd7f5:: ds 1
+wd7f6:: ds 9
+wd7ff:: ds 4
+wd803:: ds 2
+wd805:: ds 2
+wd807:: ds 2
+wd809:: ds 10
+wd813:: ds 2
+wd815:: ds 1
+wd816:: ds 1
+wd817:: ds 2
+wd819:: ds 2
+wd81b:: ds 10
+wd825:: ds 1
+wd826:: ds 1
+wd827:: ds 1
+wd828:: ds 1
+wd829:: ds 1
+wd82a:: ds 1
+wd82b:: ds 1
+wd82c:: ds 1
+wd82d:: ds 1
+wd82e:: ds 1
+wd82f:: ds 1
+wd830:: ds 1
+wd831:: ds 1
+wd832:: ds 1
+wd833:: ds 1
+wd834:: ds 1
+wd835:: ds 1
+wd836:: ds 1
+wd837:: ds 1
+wd838:: ds 15
+wd847:: ds 2
+wd849:: ds 2
+wd84b:: ds 12
+wd857:: ds 8
+wd85f:: ds 4
+wd863:: ds 1
+wd864:: ds 1
+wd865:: ds 1
+wd866:: ds 1
+wd867:: ds 2
+wd869:: ds 20
+wd87d:: ds 2
+wd87f:: ds 1
+wd880:: ds 1
+wd881:: ds 1
+wd882:: ds 5
+
+wLinkEnemyTrainerName:: ; d887
+; linked game's trainer name
+
+W_GRASSRATE:: ; d887
+ ds 1
+
+W_GRASSMONS:: ; d888
+ ds 20
+
+
+wEnemyPartyCount:: ds 1 ; d89c
+wEnemyPartyMons:: ds PARTY_LENGTH + 1 ; d89d
+
+wEnemyMons:: ; d8a4
+wEnemyMon1:: party_struct wEnemyMon1
+wEnemyMon2:: party_struct wEnemyMon2
+wEnemyMon3:: party_struct wEnemyMon3
+wEnemyMon4:: party_struct wEnemyMon4
+wEnemyMon5:: party_struct wEnemyMon5
+wEnemyMon6:: party_struct wEnemyMon6
+
+wEnemyMonOT:: ds 11 * PARTY_LENGTH ; d9ac
+wEnemyMonNicks:: ds 11 * PARTY_LENGTH ; d9ee
+
+
+W_TRAINERHEADERPTR:: ; da30
+ ds 2
+
+ ds 6
+
+wda38:: ds 1
+
+W_CURMAPSCRIPT:: ; da39
+; index of current map script, mostly used as index for function pointer array
+; mostly copied from map-specific map script pointer and wirtten back later
+ ds 1
+
+ ds 6
+
+W_PLAYTIMEHOURS:: ; da40
+ ds 2
+W_PLAYTIMEMINUTES:: ; da42
+ ds 2
+W_PLAYTIMESECONDS:: ; da44
+ ds 1
+W_PLAYTIMEFRAMES:: ; da45
+ ds 1
+
+wSafariZoneGameOver:: ; da46
+ ds 1
+
+W_NUMSAFARIBALLS:: ; da47
+ ds 1
+
+
+W_DAYCARE_IN_USE:: ; da48
+; 0 if no pokemon is in the daycare
+; 1 if pokemon is in the daycare
+ ds 1
+
+W_DAYCAREMONNAME:: ds 11 ; da49
+W_DAYCAREMONOT:: ds 11 ; da54
+
+wDayCareMon:: box_struct wDayCareMon ; da5f
+
+
+W_NUMINBOX:: ds 1 ; da80
+wBoxSpecies:: ds MONS_PER_BOX + 1
+
+wBoxMons::
+wBoxMon1:: box_struct wBoxMon1 ; da96
+wBoxMon2:: ds box_struct_length * (MONS_PER_BOX + -1) ; dab7
+
+wBoxMonOT:: ds 11 * MONS_PER_BOX ; dd2a
+wBoxMonNicks:: ds 11 * MONS_PER_BOX ; de06
+wBoxMonNicksEnd:: ; dee2
+
+
+SECTION "Stack", WRAMX[$dfff], BANK[1]
+wStack:: ; dfff
+ ds -$100
+
+
+INCLUDE "sram.asm"