pokepinball/wram.asm
Nicole d6a41233a0
Add type clarification comment for position coords and velocities (#66)
* Add type clarification comment for position coords and velocities

* Simplify comments

---------

Co-authored-by: Marcus Huderle <huderlem@gmail.com>
2025-04-27 08:17:30 -05:00

2627 lines
48 KiB
NASM

INCLUDE "macros.asm"
INCLUDE "constants/pokemon_constants.asm"
; Sprite Animations use this 3-byte struct.
MACRO animation
\1FrameCounter:: ds 1
\1Frame:: ds 1
\1Index:: ds 1
endm
SECTION "WRAM Bank 0", WRAM0
wc000:: ; 0xc000
ds $10
wPokedexFontBuffer:: ; 0xc010
; Buffer to build up the variable-width font used for various displayed text in the pokedex screen.
; This buffer is copied directly to VRAM tile data. There is room for 10 characters worth of the widest text character.
ds 10 * $20
wc150:: ; 0xc150
ds $68
wc1b8:: ; 0xc1b8
ds $c8
wSendHighScoresTopBarTilemap:: ; 0xc280
; This is the tilemap data that is sent via infrared in the High Scores screen.
; It actually takes up $400 bytes of spaces, but there are other labels that use this space, too.
ds $180
wMonAnimatedCollisionMask:: ; 0xc400
ds $80
ds $40
wc4c0:: ; 0xc4c0
ds $c
wc4cc:: ; 0xc4cc
ds $34
wBottomMessageText:: ; 0xc500 WARNING: text loading code may break if this is moved
; This must be aligned with $100, since there is some logic that depends on the lower byte of the address. (See LoadMonNameIntoEvolutionSelectionList)
ds $100
wBottomMessageBuffer:: ; 0xc600
; This acts as a buffer to hold the scrolling text message.
; Rather than storing the raw text, it stores tile ids for the text.
; The lower-left most tile is at 0xc640, so everything before isn't visible on screen.
ds $100
wStageCollisionMap:: ; 0xc700
ds $300
wca00::
ds $100
wcb00:: ; 0xcb00
ds $500
SECTION "WRAM Bank 1", WRAMX
wSpriteBuffer:: ; 0xd000
ds $a0
wSpriteBufferEnd:: ; 0xd0a0
SECTION "WRAM Bank 1.1", WRAMX
wPaletteData:: ; 0xd200
ds $80
; This buffer holds the intermediate palette data when fading to a new palette.
; The target palette is held in wPaletteData.
wFadeBGPaletteData:: ; 0xd280
ds $40
wFadeOBJPaletteData:: ; 0xd2c0
ds $40
wPartyMons:: ; 0xd300
ds $100
wAddScoreQueue:: ; 0xd400
ds $60
wAddScoreQueueEnd:: ; 0xd460
wNumPartyMons:: ; 0xd460
; Number of pokemon caught in the current pinball game.
ds $1
wCurSelectedPartyMon:: ; 0xd461
; The index of the selected party pokemon.
; This is mainly used during evolution mode, when the player selects which of their
; caught pokemon to evolve.
ds $1
wCurSelectedPartyMonScrollOffset:: ; 0xd462
; Holds the scrolling offset for the pokemon list when choosing which
; pokemon to evolve.
ds $1
wPartySelectionCursorCounter:: ; 0xd463
; Counter to animate the blinking cursor when choosing a pokemon to evolve.
ds $1
wScoreToAdd:: ; 0xd464
; Holds a 6-byte BCD value to add to the player's score.
ds $6
wScore:: ; 0xd46a
; 6-byte BCD value that represents the player's score.
ds $6
wPlayerName:: ; 0xd470
; Player's 3-character name when entering High Scores.
ds $3
wHighScoreId:: ; 0xd473
; 4 randomly-generated bytes when a high score is achieved.
; These 4 bytes are appended to the high score data structure.
; See the high_scores macro.
; These 4 bytes don't appear to be used by anything. It's possible they're used by the
; "send high scores" capability, but haven't tested it.
ds $4
wAddScoreQueueOffset:: ; 0xd477
ds $1
wd478:: ; 0xd478
ds $1
wd479:: ; 0xd479
ds $1
wCurrentJackpot:: ; 0xd47a
; BCD buffer. holds catchem jackpot score
ds $4
wBallType:: ; 0xd47e
; See constants/ball_types.asm
ds $1
wBallTypeCounter:: ; 0xd47f
ds $2
wBallTypeBackup:: ; 0xd481
ds $1
wCurBonusMultiplier:: ; 0xd482
; Current value of the bonus multiplier. Incremented from achieving various events during the game, or hitting the two bonus multiplier
; railings. (left one first, then right one). See MAX_BONUS_MULTIPLIER
ds $1
wEndOfBallBonusCategoryScore:: ; 0xd483
; The "Bonus" score for the currently-displayed category of bonus score. (e.g. bonus score for "Pokemon Caught" category)
; It is a 6-digit BCD value.
ds $6
wEndOfBallBonusSubTotal:: ; 0xd489
; The running subtotal for the end-of-ball-bonus display.
; It is a 6-digit BCD value.
ds $6
wEndOfBallBonusTotalScore:: ; 0xd48f
; The final score after the end-of-ball-bonus score is added to the player's previous score.
; It is a 6-digit BCD value.
ds $6
wGoingToBonusStage:: ; 0xd495
; Set to 1 when the player's pinball enters the Slot cave to go to a Bonus Stage.
ds $1
wReturningFromBonusStage:: ; 0xd496
; Set to 1 when a bonus stage is is finished. This is used when the main field logic is determining
; where to start the ball, since it falls out of the Slot cave after a bonus stage.
ds $1
wNextStage:: ; 0xd497
; Holds the id of the next stage to go to. Used for transitioning between bonus stage and the main red/blue field.
ds $1
wNextBonusStage:: ; 0xd498
; Holds id of the next Bonus Stage the player is eligible to go to.
; This is not the raw stage id (e.g. STAGE_MEOWTH_BONUS), rather, its the id in the order the STAGE constants are defined.
; See constants/bonus_stage_order_constants.asm for list of values.
ds $1
wInitialNextBonusStage:: ; 0xd499
; Holds the id of the first Bonus Stage for the current field. This is used to "wrap around" back to the start of the bonus stages
; after defeating the Mewtwo stage. See wNextBonusStage.
ds $1
wCompletedBonusStage:: ; 0xd49a
; Set to 1 when a bonus stage is successfully cleared.
ds $1
wExtraBalls:: ; 0xd49b
ds $1
wExtraBallState:: ; 0xd49c
; Helper value to control the animation that occurs when an Extra Ball is exercised upon losing a ball.
ds $1
wCurBallLife:: ; 0xd49d
; Keeps track of the current "life" of the ball. It starts at 1 and increments whenever the player loses a ball.
ds $1
wNumBallLives:: ; 0xd49e
; The total number of "lives" the ball has. It is always 3. wCurBallLife is compared to it whenever the player loses a ball.
ds $1
wd49f:: ; 0xd49f
ds $2
wBallSaverIconOn:: ; 0xd4a1
ds $1
wBallSaverFlashRate:: ; 0xd4a2
ds $1
wBallSaverTimerFrames:: ; 0xd4a3
ds $1
wBallSaverTimerSeconds:: ; 0xd4a4
ds $1
wNumTimesBallSavedTextWillDisplay:: ; 0xd4a5
ds $1
wBallSaverTimerFramesBackup:: ; 0xd4a6
ds $1
wBallSaverTimerSecondsBackup:: ; 0xd4a7
ds $1
wNumTimesBallSavedTextWillDisplayBackup:: ; 0xd4a8
ds $1
wExtraBall:: ; 0xd4a9
; Set to 1 if the player has an extra ball.
ds $1
wDrawBottomMessageBox:: ; 0xd4aa
; Set to non-zero value if enable drawing the 1-tile high bottom message bar during V-Blank in normal pinball gameplay.
; Set to 0 to disable.
ds $1
wBallBonusWaitForButtonPress:: ; 0xd4ab
ds $1
wCurrentStage:: ; 0xd4ac
; see constants/stage_constants.asm for list. bit 0 is 1 if the stage has flippers
ds $1
wCurrentStageBackup:: ; 0xd4ad
; Holds backup of current stage id when going to a Bonus Stage. See wCurrentStage.
ds $1
wMoveToNextScreenState:: ; 0xd4ae
; This is set when the the screen state should advance, in the pinball game's core logic state.
ds $1
wStageCollisionState:: ; 0xd4af
ds $1
wStageCollisionStateBackup:: ; 0xd4b0
; Holds backup of stage collision state when going to a Bonus Stage. See wStageCollisionState.
ds $1
ds $2
wBallXPos:: ; 0xd4b3
; 8.8 fixed-point values in little-endian format
ds $2
wBallYPos:: ; 0xd4b5
ds $2
wPreviousBallXPos:: ; 0xd4b7
; 8.8 fixed-point values in little-endian format
ds $2
wPreviousBallYPos:: ; 0xd4b9
ds $2
wBallXVelocity:: ; 0xd4bb
; 8.8 fixed-point values in little-endian format
ds $2
wBallYVelocity:: ; 0xd4bd
; 8.8 fixed-point values in little-endian format
ds $2
ds $4
wBallSpin:: ; 0xd4c3
ds $1
wBallRotation:: ; 0xd4c4
ds $1
wd4c5:: ; 0xd4c5
ds $1
wd4c6:: ; 0xd4c6
ds $1
wd4c7:: ; 0xd4c7
ds $1
wBallSize:: ; 0xd4c8
; Set to 0 for default, set to 1 for mini, set to 2 for super mini
ds $1
wLostBall:: ; 0xd4c9
; Set to 1 when a ball was lost. (Lost a "life"). 0 otherwise.
ds $1
wShowExtraBallText:: ; 0xd4ca
; Setting this byte to 1 or 2 will cause the "Extra Ball" message to scroll across the bottom of the screen.
; 1 = "EXTRA BALL"
; 2 = "EXTRA BALL SPECIAL BONUS"
ds $1
wWhichVoltorb:: ; 0xd4cb
wWhichShellder::
ds $1
wWhichVoltorbId:: ; 0xd4cc
wWhichShellderId::
ds $1
wVoltorb1Animation:: ; 0xd4cd
wShellder1Animation_Unused::
animation wVoltorb1Animation
wVoltorb2Animation:: ; 0xd4d0
wShellder2Animation_Unused::
animation wVoltorb2Animation
wVoltorb3Animation:: ; 0xd4d3
wShellder3Animation_Unused::
animation wVoltorb3Animation
wVoltorbHitAnimationDuration:: ; 0xd4d6
wShellderHitAnimationDuration::
; Number of frames remaining in the light-up animation when a Shellder/Voltorb is hit.
; This single byte actually controls all three of them, since only one can be animated at a time.
ds $1
wWhichAnimatedVoltorb:: ; 0xd4d7
wWhichAnimatedShellder::
; Hold the index (0,1,2) of the Shellder/Voltorb that is currently being animated after it was hit.
ds $1
wWhichBumper:: ; 0xd4d8
; 0 = neither
; 1 = left bumper
; 2 = right bumper
ds $1
wWhichBumperId:: ; 0xd4d9
ds $1
wBumperLightUpDuration:: ; 0xd4da
; Number of frames left in the Bumper light-up animation when the pinball bounces off of it.
; This is shared by both bumpers, so only one can be lit up at a time.
ds $1
wWhichBumperGfx:: ; 0xd4db
; Determines which bumper graphics will be loaded by LoadBumperGraphics_RedField and LoadBumperGraphics_BlueField
; $0 = left bumper
; $1 = right bumper
; $FF = neither bumper
ds $1
wPinballLaunchCollision:: ; 0xd4dc
; 0 = pinball isn't resting at the start, waiting to be launched by the player
; 1 = pinball can be launched to start the round
; second byte is unused, but it's written by HandleGameObjectCollision
ds $2
wPinballLaunched:: ; 0xd4de
; 0 = pinball hasn't been launched, yet
; 1 = pinball was launched
ds $1
wd4df:: ; 0xd4df
ds $1
wChoseInitialMap:: ; 0xd4e0
; Set to 1 after the player chooses the initial map during first pinball launch.
ds $1
wInitialMapSelectionIndex:: ; 0xd4e1
ds $1
wNumMapMoves:: ; 0xd4e2
; Number of times the player has successfully completed a map move.
; Resets to 0 after completing 6.
ds $1
wVisitedMaps:: ; 0xd4e3
; List of the visited maps in order.
; It is reset after moving past Indigo Plateau.
; The last byte is unused, since there are only 6 map moves.
ds $7
wTriggeredGameObject:: ; 0xd4ea
; Game objects, such as the two bumpers, Pikachu savers, CAVE, etc. have unique ids.
; This byte saves the object which the pinball is currently colliding with.
ds $1
wTriggeredGameObjectIndex:: ; 0xd4eb
; Many game objects come in pairs, wuch as the two bumpers, Pikachu savers, etc.
; This byte stores which of them the pinball is currently colliding with.
ds $1
wPreviousTriggeredGameObject:: ; 0xd4ec
; Store the previous triggered game object's id, so that the pinball can't trigger
; an object two frames in a row. It has to "un-collide" before it can collide again.
ds $1
wWhichDiglett:: ; 0xd4ed 0 = none, left = 1 right = 2
wWhichPsyduckPoliwag::
ds $1
wWhichDiglettId:: ; 0xd4ee
wWhichPsyduckPoliwagId::
ds $1
wLeftDiglettAnimationController:: ; 0xd4ef $50 = in and pained look. 0 = normal state
ds $1
wLeftMapMoveCounter:: ; 0xd4f0 WARNING, diglet identifying code relies on this being 2 bytes before right map move counter and 1 byte after that digletts animation controller
ds $1
wRightDiglettAnimationController:: ; 0xd4f1 $50 = in and pained look. 0 = normal state
ds $1
wRightMapMoveCounter:: ; 0xd4f2
ds $1
wLeftMapMoveDiglettAnimationCounter:: ; 0xd4f3
wLeftMapMovePoliwagAnimationCounter::
ds $1
wLeftMapMoveDiglettFrame:: ; 0xd4f4
wLeftMapMovePoliwagFrame::
ds $1
wRightMapMoveDiglettAnimationCounter:: ; 0xd4f5
wRightMapMovePsyduckAnimationCounter::
ds $1
wRightMapMoveDiglettFrame:: ; 0xd4f6
wRightMapMovePsyduckFrame::
ds $1
wLeftMapMoveCounterFramesUntilDecrease:: ; 0xd4f7
; Holds the number of frames remaining until the wLeftMapMoveCounter
; counter will decrease by 1.
ds $2
wRightMapMoveCounterFramesUntilDecrease:: ; 0xd4f9
; Holds the number of frames remaining until the wRightMapMoveCounter
; counter will decrease by 1. WARNING: red tables diglett function relies on this being immediatly after wLeftMapMoveCounterFramesUntilDecrease
ds $2
wBellsproutCollision:: ; 0xd4fb
; Second byte is set by HandleGameObjectCollision, but is unused
ds $2
wBellsproutAnimation:: ; 0xd4fd
animation wBellsproutAnimation
wStaryuCollision:: ; 0xd500
; Second byte is set by HandleGameObjectCollision, but is unused
ds $2
wd502:: ; 0xd502
ds $1
wd503:: ; 0xd503
ds $1
wStaryuAnimation:: ; 0xd504
animation wStaryuAnimation
wSpinnerCollision:: ; 0xd507
; Second byte is set by HandleGameObjectCollision, but is unused
ds $2
wSpinnerState:: ; 0xd509
ds $2
wSpinnerVelocity:: ; 0xd50b
; When the ball intially passes through the spinner, the ball's y velocity is saved to this location.
; Then, the velocity saved here is decreased a little bit each frame, while it's adding to the current "spinner charge".
ds $2
wWhichCAVELight:: ; 0xd50d
ds $1
wWhichCAVELightId:: ; 0xd50e
ds $1
wCAVELightStates:: ; 0xd50f
; Marks each of the 4 CAVE lights as On (1) or Off (0).
; When all four are On, it will do a blinking animation, and then open the Slot bonus.
ds $4
wCAVELightsBlinking:: ; 0xd513
; Set to 1 when the 4 CAVE lights are blinking for a couple seconds after successfully
; lighting up all 4. Set to 0, otherwise.
ds $1
wCAVELightsBlinkingFramesRemaining:: ; 0xd514
; Holds the number of frames remaining in the 4 CAVE lights' blinking animation.
ds $1
wWhichPikachu:: ; 0xd515
ds $1
wWhichPikachuId:: ; 0xd516
ds $1
wPikachuSaverCharge:: ; 0xd517
; Holds the amount of Pikachu "charge" that has been generated by spinning the spinner
; in the right alley. The charge's value ranges from 0 - 15.
ds $1
wWhichPikachuSaverSide:: ; 0xd518
; 0 = Pikachu is on the left side
; 1 = Pikachu is on the right side
ds $1
wPikachuSaverAnimation:: ; 0xd519
animation wPikachuSaverAnimation
wd51c:: ; 0xd51c
ds $1
wPikachuSaverSlotRewardActive:: ; 0xd51d
; Set to 1 if the Pikachu Saver slot reward is active. 0 otherwise.
ds $1
wd51e:: ; 0xd51e
ds $1
wWhichBoardTrigger:: ; 0xd51f
ds $1
wWhichBoardTriggerId:: ; 0xd520
ds $1
wCollidedAlleyTriggers:: ; 0xd521
; These bytes are pretty unnecessary, but the original code decided it would use a roundabout way to decide which function to call based on wWhichBoardTriggerId was collided with.
ds $8
ds $6 ; free space
wIndicatorStates:: ; 0xd52f
ds $13
wLeftAlleyTrigger:: ; 0xd542
ds $1
wLeftAlleyCount:: ; 0xd543
ds $1
wRightAlleyTrigger:: ; 0xd544
ds $1
wRightAlleyCount:: ; 0xd545
ds $1
wSecondaryLeftAlleyTrigger:: ; 0xd546
ds $2
wPinballIsVisible:: ; 0xd548
; Set to 1 if the pinball is visible in play.
; Set to 0 when the pinball disappears in things like the Slot, Slowpoke, Cloyster, Bellsprout, etc.
; When it's set to 0, it disables tilt effects on the pinball.
ds $1
wEnableBallGravityAndTilt:: ; 0xd549
; Set to 1 to enable the effect of gravity and tilt on the pinball.
; 0 disables these forces. Used for things likes the initial pinball launch or to hold the ball stationary.
ds $1
wCurrentMap:: ; 0xd54a
ds $1
wInSpecialMode:: ; 0xd54b
; Set to 1 if currently in special game mode. See wSpecialMode.
ds $1
wSpecialModeCollisionID:: ; 0xd54c 10000 sets it to a input, records what the ball has collided with see constants/special_collision_constants.asm for more info
ds $1
wSpecialModeState:: ; 0xd54d
; Tracks the current state of special modes (catchem, evolution, map move)
ds $1
wd54e:: ; 0xd54e set to 20 by catch mode when all tiles are flipped and on lower stage
ds $1
wd54f:: ; 0xd54f set to 5 by catch mode when all tiles are flipped and on lower stage
ds $1
wSpecialMode:: ; 0xd550
; Represents the current pinball mode. Example special modes would be, Catch'Em, Evolution, Map Move
; See SPECIAL_MODE constants.
ds $1
wEvolutionObjectsDisabled:: ; 0xd551
; 0 = Hitting an evolution game object will either create an evolution trinket or show the "item not found" message.
; non-0 = The volution game objects are disabled, meaning the player needs to wait a few seconds before they can be hit again.
ds $1
wCurrentEvolutionMon:: ; 0xd552
ds $1
wCurrentEvolutionType:: ; 0xd553
ds $1
wNumEvolutionTrinkets:: ; 0xd554
ds $1
wNumPossibleEvolutionObjects:: ; 0xd555
; Each mon has a different number of possible field objects that can produce trinkets.
; This number is used to randomly choose objects that fall within that set, which will
; produce trinkets when hit with the pinball. This also corresponds to the blinking
; arrows that are displayed when the player is trying to hit one of the objects.
ds $1
wEvolutionTrinketCooldownFrames:: ; 0xd556
; Holds the number of remaining frames until the player can hit more objects to discover evolution trinkets in evolution mode.
; When the pinball hits an object in evolution mode, sometimes that object doesn't contain a trinket. When this happens, this
; cooldown is created so the player has to wait a few seconds until the objects becomes activated again.
ds $2
wd558:: ; 0xd558
ds $1
wd559:: ; 0xd559
ds $1
wMapMoveDirection:: ; 0xd55a
; 0 = need to hit the ball left to open map move slot cave
; 1 = need to hit the ball right to open map move slot cave
ds $1
wRareMonsFlag:: ; 0xd55b
ds $1
wEvolutionObjectStates:: ; 0xd55c
; There are 10 possible objects to hit that can spawn an evolution trinket. However, only three
; will actually spawn the trinket. The rest are "duds". This list of states keeps track of which
; ones will spawn the trinket. $1 = spawn trinket, $0 otherwise.
; The indexes in this list correspond to the following objects:
; Blue Field:
; 0: Any of the 3 Shellder bumpers
; 1: Poliwag
; 2: Psyduck
; 3: Left Bonus Multiplier railing
; 4: Right Bonus Multiplier railing
; 5: Slowpoke
; 6: Cloyster
; 7: Left alley trigger point
; 8: Spinner
; 9: Any of the 3 Ball Upgrade lights
; Red Field:
; 0: Any of the 3 Voltorb bumpers
; 1: Left Diglett
; 2: Right Diglett
; 3: Left Bonus Multiplier railing
; 4: Right Bonus Multiplier railing
; 5: Staryu
; 6: Bellsprout
; 7: Staryu alley trigger point
; 8: Spinner
; 9: Any of the 3 Ball Upgrade lights
ds 10
wActiveEvolutionTrinkets:: ; 0xd566
; There are 18 different positions that an evolution trinket can exist.
; Each entry in this list corresponds to one of those positions. The values
; in this list are evolution type constants, and $0 if the trinket is inactive.
; (See constants/evolution_type_constants.asm)
; During gameplay, only one of these trinkets is ever active at a given time.
; However, the game logic perfectly supports multiple being active.
ds 18
wCollidedPointIndex:: ; 0xd578
; Stores the result of the PinballCollidesWithPoints function.
; This index is 1-based, meaning 1 corresponds to the first item in the points array
ds $1
wCurrentCatchEmMon:: ; 0xd579
ds $1
wTimerSeconds:: ; 0xd57a
ds $1
wTimerMinutes:: ; 0xd57b
ds $1
wTimerFrames:: ; 0xd57c
ds $1
wTimerActive:: ; 0xd57d
; Set to 1 when the Timer is displayed and counting down.
ds $1
wTimeRanOut:: ; 0xd57e set to 1 when the timer reaches 0
ds $1
wPauseTimer:: ; 0xd57f If set to nz, timer pauses
ds $1
wd580:: ; 0xd580
ds $1
wd581:: ; 0xd581
ds $1
wTimerDigits:: ; 0xd582
; first byte = minutes
; second byte = tens place
; third byte = ones place
; fourth byte = unused, but still written to
ds $4
wBillboardTilesIlluminationStates:: ; 0xd586
; This array holds the illuminated state for each of the 24 tiles in a pokemon's billboard picture.
; During Catch'Em mode, the billboard picture starts with all tiles being "dark", and they light up
; as the Shellder or Voltorb are hit.
;
; If the tile is lit up, the value is $01, and $00 when dark.
;
; Each entry in this array is 2 bytes.
; Byte 1 = Current illumination state
; Bytes 2 = Previous illumination state. This is used to avoid re-loading the same graphics.
ds $18 * 2
wNumberOfCatchModeTilesFlipped:: ; 0xd5b6 a 24 wide block starts here and is filled before catch mode. first step of catch mode only passes if it is 24. top byte records the number of tiles flipped
ds $5
wWildMonIsHittable:: ; 0xd5bb
; Set to 1 when the wild pokemon is animated and hittable with the pinball.
ds $1
wCurrentAnimatedMonSpriteType:: ; 0xd5bc
ds $1
wCurrentAnimatedMonSpriteFrame:: ; 0xd5bd
ds $1
wLoopsUntilNextCatchSpriteAnimationChange:: ; 0xd5be
ds $1
wBallHitWildMon:: ; 0xd5bf
ds $1
wNumMonHits:: ; 0xd5c0
ds $1
wCurrentCatchMonIdleFrame1Duration:: ; 0xd5c1 sets wLoopsUntilNextCatchSpriteAnimationChange if wCurrentAnimatedMonSpriteFrame - wCurrentAnimatedMonSpriteType < 1 holds animatedSpriteType
ds $1 ;mystery data byte 1
wCurrentCatchMonIdleFrame2Duration:: ; 0xd5c2 sets wLoopsUntilNextCatchSpriteAnimationChange if wCurrentAnimatedMonSpriteFrame - wCurrentAnimatedMonSpriteType >= 1
ds $1 ;mystery data byte 2
wCurrentCatchMonHitFrameDuration:: ; 0xd5c3
ds $1
wCatchModeMonUpdateTimer:: ; 0xd5c4 increments while the caught mon is active once per frame(?), ensuring that the code only checks for the mon being hit every 4 frames or when the animation changes....for some reason (performance?)
ds $1
wNumMewHits:: ; 0xd5c5
ds $1
wd5c6:: ; 0xd5c6
ds $1
wWildMonCollision:: ; 0xd5c7
; Set by HandleGameObjectCollision
; Second byte gets set, but is unused
ds $2
ds $1
wBottomTextEnabled:: ; 0xd5ca
; 1 = text messages in the bottom black bar are enabled
; 0 = disabled--the text won't appear even if LoadScrollingText is called
ds $1
wDisableDrawScoreboardInfo:: ; 0xd5cb
; This is set when text messages are shown in the bottom black bar.
; 1 = Skip drawing the scoreboard icons in the bottom black bar. (num pokemon caught, number of balls left, score)
; 0 = Draw them.
ds $1
MACRO scrolling_text_label
\1Enabled:: ds 1 ; Toggles if enabled. 0 is off, non-0 is on
\1ScrollDelayCounter:: ds 1 ; Number of frames remaining until the next scroll step
\1ScrollDelay:: ds 1 ; Number of frames between each scroll step
\1MessageBoxOffset:: ds 1 ; Offset in wBottomMessageBuffer to place first character of text
\1StopOffset:: ds 1 ; Offset in wBottomMessageBuffer where the scrolling text will briefly stop
\1StopDuration:: ds 1 ; Number of frames the message will remained stopped, before resuming scroll
\1SourceTextOffset:: ds 1 ; Offset in wBottomMessageText for the text to be displayed
\1ScrollStepsRemaining:: ds 1 ; Number of scroll steps remaining. Isn't decremented during the stop.
ENDM
wScrollingText1:: ; 0xd5cc
scrolling_text_label wScrollingText1
wScrollingText2:: ; 0xd5d4
scrolling_text_label wScrollingText2
wScrollingText3:: ; 0xd5dc
scrolling_text_label wScrollingText3
MACRO stationary_text_label
\1Enabled::ds 1 ; Toggles if enabled. 0 is off, non-0 is on
\1MessageBoxOffset:: ds 1 ; Offset in wBottomMessageBuffer to place first character of text
\1SourceTextOffset:: ds 1 ; Offset in wBottomMessageText for the text to be displayed
\1Duration::
\1DurationLowByte:: ds 1 ;how many frames to stay on screen.
\1DurationHighByte:: ds 1 ;thiswill trigger as 0 if >= 128
ENDM
wStationaryText1:: ; 0xd5e4
stationary_text_label wStationaryText1
wStationaryText2:: ; 0xd5e9
stationary_text_label wStationaryText2
wStationaryText3:: ; 0xd5ee
stationary_text_label wStationaryText3
wCapturingMon:: ; 0xd5f3
; Set to 1 when the capturing animation starts.
ds $1
wBallCaptureAnimation:: ; 0xd5f4
animation wBallCaptureAnimation
wWhichPinballUpgradeTrigger:: ; 0xd5f7
ds $1
wWhichPinballUpgradeTriggerId:: ; 0xd5f8
ds $1
wBallUpgradeTriggerStates:: ; 0xd5f9
; Marks each of the 3 ball upgrade triggers as On (1) or Off (0).
; When all three are On, it upgrades the pinball field multiplier. (e.g. Pokeball -> Great Ball)
ds $3
wBallUpgradeTriggersBlinking:: ; 0xd5fc
; Set to 1 when the 3 ball upgrade triggers are blinking for a couple seconds after successfully
; lighting up all 3. Set to 0, otherwise.
ds $1
wBallUpgradeTriggersBlinkingFramesRemaining:: ; 0xd5fd
; Holds the number of frames remaining in the ball upgrade blinking animation.
ds $1
wDittoSlotCollision:: ; 0xd5fe
; Second byte is set by HandleGameObjectCollision, but is unused
ds $2
wDittoEnterOrExitCounter:: ; 0xd600
; Number of frames remaining in the process when the pinball is entering or exiting the Ditto cave.
; This functions the same way as wSlotEnterOrExitCounter.
ds $1
wSlotCollision:: ; 0xd601
; Second byte is set by HandleGameObjectCollision, but is unused
ds $2
wSlotEnterOrExitCounter:: ; 0xd603
; Number of frames remaining in the process when the pinball is entering or exiting the slot cave.
; This functions the same way as wDittoEnterOrExitCounter.
ds $1
wSlotIsOpen:: ; 0xd604
; Whether or not the Slot is open for the pinball to enter. 1 = open; 0 = closed
ds $1
ds $1 ; unused
wSlotGlowingAnimationCounter:: ; 0xd606
; When the slot is open, this counter increments once every frame, which controls the glowing
; animation around the slot cave.
ds $1
wFramesUntilSlotCaveOpens:: ; 0xd607
; When set to non-zero value, it decrements once per frame. When it hits 0, the Slot cave will open.
ds $1
wOpenedSlotByGetting4CAVELights:: ; 0xd608
; Set to 1 when the slot bonus was trigered by lighting up all 4 CAVE lights.
; See wCAVELightStates
ds $1
wOpenedSlotByGetting3Pokeballs:: ; 0xd609
; Set to 1 when the slot bonus was triggered by achieving 3 Pokeballs (the pokeballs underneath the billboard).
; See wNumPokeballs.
ds $1
wWhichBonusMultiplierRailing:: ; 0xd60a
ds $1
wWhichBonusMultiplierRailingId:: ; 0xd60b
ds $1
wBonusMultiplierTensDigit:: ; 0xd60c
; Holds the tens digit for the current bonus multiplier value. This number is displayed on the left-side bonus multiplier railing.
ds $1
wBonusMultiplierOnesDigit:: ; 0xd60d
; Holds the ones digit for the current bonus multiplier value. This number is displayed on the right-side bonus multiplier railing.
ds $1
wd60e:: ; 0xd60e
ds $1
wd60f:: ; 0xd60f
ds $1
wd610:: ; 0xd610
ds $1
wd611:: ; 0xd611
ds $1
wd612:: ; 0xd612
ds $1
wShowBonusMultiplierBottomMessage:: ; 0xd613
; Set to 1 when the bonus multiplier message should appear on the bottom of the screen. 0 otherwise.
ds $1
wd614:: ; 0xd614
ds $1
wd615:: ; 0xd615
ds $1
wGameOver:: ; 0xd616
ds $3
wSlotRewardProgress:: ; 0xd619
; Increases in increments of 10 each time a slot reward is obtained.
ds $1
wCurSlotRewardRouletteIndex:: ; 0xd61a
ds $1
wSlotRouletteCounter:: ; 0xd61b
ds $1
ds $1
wSlotRouletteBillboardPicture:: ; 0xd61d
ds $1
wSlotRouletteSlowed:: ; 0xd61e
ds $1
wCurSlotBonus:: ; 0xd61f
ds $1
wSlotAnyPokemonCaught:: ; 0xd620
; Used by the slot logic to store whether or not any pokemon are caught.
ds $1
wSlotBallIncrease:: ; 0xd621
ds $1
wCatchEmOrEvolutionSlotRewardActive:: ; 0xd622
; Set to 1 if the "Start Catch 'Em Mode" Slot Reward is received.
; Set to 2 if the "Start Evolution Mode" Slot Reward is received.
ds $1
wBonusStageSlotRewardActive:: ; 0xd623
; Set to 1 when the "Go To Bonus" Slot Reward is received.
ds $1
wPreviousNumPokeballs:: ; 0xd624
; See wNumPokeballs. This holds the previous number of them to handle the blinking
; animation, so that it only blinks the newly-acquired pokeballs.
ds $1
wNumPokeballs:: ; 0xd625
; The number of Pokeballs that appear directly underneath the billboard area.
; When you get 3 of these, the bonus stage opens up. This number is increased
; when doing things like catching of evolving a pokemon.
ds $1
wPokeballBlinkingCounter:: ; 0xd626
; Counts the number of frames left in the blinking pokeballs animation.
; These Pokeballs are located underneath the billboard area, and blink after
; doing things such as catching or evolving a pokemon.
ds $1
ds $1 ; unused byte
wNumPokemonCaughtInBallBonus:: ; 0xd628
; Counts the number of pokemon caught in a single ball bonus.
ds $1
wNumPokemonEvolvedInBallBonus:: ; 0xd629
; Counts the number of pokemon evolved in a single ball bonus.
ds $1
wNumBellsproutEntries:: ; 0xd62a
; Counts the number of times Bellsprout was entered without triggering Catch'Em mode.
ds $1
wNumDugtrioTriples:: ; 0xd62b
; Counts the number of times either of the two Dugtrio was hit 3 times on the red field.
ds $1
wNumCAVECompletions:: ; 0xd62c
; Counts the number of times all CAVE lights were lit.
ds $1
wNumSpinnerTurns:: ; 0xd62d
; Counts the number of spinner turns in a single ball bonus.
ds $1
wNumPikachuSaves:: ; 0xd62e
; Counts the number of times the ball was saved by a charged Pikachu.
; This is unused, but was probably intended to be used in the Ball Bonus.
ds $1
wNumMewtwoBonusCompletions:: ; 0xd62f
ds $1
wSlowpokeCollision:: ; 0xd630
; Second byte is set by HandleGameObjectCollision, but is unused
ds $2
wSlowpokeAnimation:: ; 0xd632
animation wSlowpokeAnimation
wCloysterCollision:: ; 0xd635
; Second byte is set by HandleGameObjectCollision, but is unused
ds $2
wCloysterAnimation:: ; 0xd637
animation wCloysterAnimation
wNumSlowpokeEntries:: ; 0xd63a
; Counts the number of times Slowpoke was entered without triggering Evolution mode.
ds $1
wNumCloysterEntries:: ; 0xd63b
; Counts the number of times Cloyster was entered without triggering Catch'Em mode.
ds $1
wNumPsyduckTriples:: ; 0xd63c
; Counts the number of times Psyduck was hit 3 times.
ds $1
wNumPoliwagTriples:: ; 0xd63d
; Counts the number of times Poliwag was hit 3 times.
ds $1
wBlueStageForceFieldDirection:: ; 0xd63e
ds $1
wIndicatorState2Backup:: ; 0xd63f
ds $1
wBlueStageForceFieldGfxNeedsLoading:: ; 0xd640
; A flag to signal that the force field arrow graphics need to be updated because
; it recently changed direction.
ds $1
wBlueStageForceFieldFlippedDown:: ; 0xd641
ds $1
wd642:: ; 0xd642
ds $1
wd643:: ; 0xd643
ds $1
wd644:: ; 0xd644
ds $1
wPsyduckState:: ; 0xd645
ds $1
wPoliwagState:: ; 0xd646
ds $1
wBonusMultiplierRailingEndLightDuration:: ; 0xd647
ds $1
wd648:: ; 0xd648
ds $1
wd649:: ; 0xd649
ds $1
wd64a:: ; 0xd64a
ds $1
wd64b:: ; 0xd64b
ds $1
wBlueFieldForceFieldFrameCounter:: ; 0xd64c
; Continuosly counts up to 60--wraps around to 0.
ds $1
wBlueFieldForceFieldSecondsCounter:: ; 0xd64d
; Increments once every second, based on wBlueFieldForceFieldFrameCounter.
; When it hits 5 seconds, it wraps back to 0.
ds $1
wd64e:: ; 0xd64e
ds $1
wd64f:: ; 0xd64f
ds $1
wd650:: ; 0xd650
ds $1
wd651:: ; 0xd651
ds $1
wd652:: ; 0xd652
ds $1
wGengarBonusClosedGate:: ; 0xd653
ds $1
wWhichGravestone:: ; 0xd654
; second byte is unused
ds $2
wd656:: ; 0xd656
ds $1
wd657:: ; 0xd657
ds $1
wd658:: ; 0xd658
ds $1
wGastly1Enabled:: ; 0xd659
ds $1
wGastly1Animation::
animation wGastly1Animation
wGastly1InHitAnimation:: ; 0xd65d
ds $1
wGastly1XPos:: ; 0xd65e
ds $2
wGastly1YPos:: ; 0xd660
ds $2
wGastly2Enabled:: ; 0xd662
ds $1
wGastly2Animation::
animation wGastly2Animation
wGastly2InHitAnimation:: ; 0xd666
ds $1
wGastly2XPos:: ; 0xd668
ds $2
wGastly2YPos:: ; 0xd66a
ds $2
wGastly3Enabled:: ; 0xd66b
ds $1
wGastly3Animation::
animation wGastly3Animation
wGastly3InHitAnimation:: ; 0xd66f
ds $1
wGastly3XPos:: ; 0xd671
ds $2
wGastly3YPos:: ; 0xd673
ds $2
wd674:: ; 0xd674
ds $1
wd675:: ; 0xd675
ds $2
wd677:: ; 0xd677
ds $2
wd679:: ; 0xd679
ds $2
wNumGastlyHits:: ; 0xd67b
ds $1
wd67c:: ; 0xd67c
ds $1
wd67d:: ; 0xd67d
ds $1
wd67e:: ; 0xd67e
ds $2
wHaunter1AnimationState:: ; 0xd680
ds $2
wd682:: ; 0xd682
ds $1
wHaunter1XPos:: ; 0xd683
ds $2
wHaunter1YPos:: ; 0xd685
ds $2
wd687:: ; 0xd687
ds $2
wHaunter2AnimationState:: ; 0xd689
ds $1
ds $1
wd68b:: ; 0xd68b
ds $1
wHaunter2XPos:: ; 0xd68c
ds $2
wHaunter2YPos:: ; 0xd68e
ds $2
wd690:: ; 0xd690
ds $1
wd691:: ; 0xd691
ds $2
wd693:: ; 0xd693
ds $2
wNumHaunterHits:: ; 0xd695
ds $1
wd696:: ; 0xd696
ds $1
wd697:: ; 0xd697
ds $1
wd698:: ; 0xd698
ds $2
wGengarAnimationState:: ; 0xd69a
ds $1
wd69b:: ; 0xd69b
ds $1
wd69c:: ; 0xd69c
ds $1
wGengarXPos:: ; 0xd69d
ds $2
wGengarYPos:: ; 0xd69f
ds 2
wd6a1:: ; 0xd6a1
ds $1
wNumGengarHits:: ; 0xd6a2
ds $1
wd6a3:: ; 0xd6a3
ds $1
wd6a4:: ; 0xd6a4
ds $1
wd6a5:: ; 0xd6a5
ds $1
wd6a6:: ; 0xd6a6
ds $1
wd6a7:: ; 0xd6a7
ds $1
wd6a8:: ; 0xd6a8
ds $1
wMewtwoBonusClosedGate:: ; 0xd6a9
ds $1
wd6aa:: ; 0xd6aa
ds $2
wMewtwoAnimation:: ; 0xd6ac
animation wMewtwoAnimation
wd6af:: ; 0xd6af
ds $1
wd6b0:: ; 0xd6b0
ds $1
wd6b1:: ; 0xd6b1
ds $1
wd6b2:: ; 0xd6b2
ds $1
wd6b3:: ; 0xd6b3
ds $1
wd6b4:: ; 0xd6b4
ds $1
wd6b5:: ; 0xd6b5
ds $1
MACRO orbiting_ball
\1Enabled:: ds $1
\1Animation:: animation \1Animation
\1AnimationGroup:: ds $1 ; Index into OrbitingBallAnimations
\1XPos:: ds $1
\1YPos:: ds $1
\1PosIndex:: ds $1 ; Index into MewtwoOrbitingBallsCoords
ENDM
wOrbitingBall0:: ; 0xd6b6
orbiting_ball wOrbitingBall0
wOrbitingBall1:: ; 0xd6be
orbiting_ball wOrbitingBall1
wOrbitingBall2:: ; 0xd6c6
orbiting_ball wOrbitingBall2
wOrbitingBall3:: ; 0xd6ce
orbiting_ball wOrbitingBall3
wOrbitingBall4:: ; 0xd6d6
orbiting_ball wOrbitingBall4
wOrbitingBall5:: ; 0xd6de
orbiting_ball wOrbitingBall5
wMeowthBonusClosedGate:: ; 0xd6e6
ds $1
wd6e7:: ; 0xd6e7
ds $2
wMeowthAnimation:: ; 0xd6e9
animation wMeowthAnimation
wMeowthState:: ; 0xd6ec
ds $1
wMeowthXPosition:: ; 0xd6ed
ds $1
wMeowthYPosition:: ; 0xd6ee
ds $2
wMeowthXMovement:: ; 0xd6f0
ds $1
wMeowthYMovement:: ; 0xd6f1
ds $2
wd6f3:: ; 0xd6f3
ds $1
wd6f4:: ; 0xd6f4
ds $1
wd6f5:: ; 0xd6f5
ds $1
wd6f6:: ; 0xd6f6
ds $1
wd6f7:: ; 0xd6f7
ds $1
wd6f8:: ; 0xd6f8
ds $1
wd6f9:: ; 0xd6f9
ds $1
wd6fa:: ; 0xd6fa
ds $1
wd6fb:: ; 0xd6fb
ds $1
wd6fc:: ; 0xd6fc
ds $1
wd6fd:: ; 0xd6fd
ds $2
wd6ff:: ; 0xd6ff
ds $1
wd700:: ; 0xd700
ds $1
wd701:: ; 0xd701
ds $1
wd702:: ; 0xd702
ds $1
wd703:: ; 0xd703
ds $1
wd704:: ; 0xd704
ds $1
wd705:: ; 0xd705
ds $1
wd706:: ; 0xd706
ds $1
wd707:: ; 0xd707
ds $4
wNumActiveJewelsBottom:: ; 0xd70b
ds $1
wNumActiveJewelsTop:: ; 0xd70c
ds $3
wMeowthStageBonusCounter:: ; 0xd70f
ds $1
wd710:: ; 0xd710
ds $1
wMeowthStageScore:: ; 0xd711
ds $1
wd712:: ; 0xd712
ds $1
wDisableMeowthJewelProduction:: ; 0xd713
ds $1
wMeowthJewel0AnimationIndex:: ; 0xd714
ds $1
wMeowthJewel1AnimationIndex:: ; 0xd715
ds $1
wMeowthJewel2AnimationIndex:: ; 0xd716
ds $1
wMeowthJewel0State:: ; 0xd717
ds $1
wMeowthJewel1State:: ; 0xd718
ds $1
wMeowthJewel2State:: ; 0xd719
ds $1
wMeowthJewel0XCoord:: ; 0xd71a
ds $1
wMeowthJewel1XCoord:: ; 0xd71b
ds $1
wMeowthJewel2XCoord:: ; 0xd71c
ds $2
wMeowthJewel3AnimationIndex:: ; 0xd71e
ds $1
wMeowthJewel4AnimationIndex:: ; 0xd71f
ds $1
wMeowthJewel5AnimationIndex:: ; 0xd720
ds $1
wMeowthJewel3State:: ; 0xd721
ds $1
wMeowthJewel4State:: ; 0xd722
ds $1
wMeowthJewel5State:: ; 0xd723
ds $1
wMeowthJewel3XCoord:: ; 0xd724
ds $1
wMeowthJewel4XCoord:: ; 0xd725
ds $1
wMeowthJewel5XCoord:: ; 0xd726
ds $1
wMeowthJewel0YCoord:: ; 0xd727
ds $1
wMeowthJewel1YCoord:: ; 0xd728
ds $1
wMeowthJewel2YCoord:: ; 0xd729
ds $1
wd72a:: ; 0xd72a
ds $1
wd72b:: ; 0xd72b
ds $1
wd72c:: ; 0xd72c
ds $5
wMeowthJewel3YCoord:: ; 0xd731
ds $1
wMeowthJewel4YCoord:: ; 0xd732
ds $1
wMeowthJewel5YCoord:: ; 0xd733
ds $1
wd734:: ; 0xd734
ds $1
wd735:: ; 0xd735
ds $1
wd736:: ; 0xd736
ds $3
wd739:: ; 0xd739
ds $1
wDiglettBonusClosedGate:: ; 0xd73a
ds $1
wd73b:: ; 0xd73b
ds $1
wd73c:: ; 0xd73c
ds $1
wDiglettStates:: ; 0xd73d
ds $1f
wCurrentDiglett:: ; 0xd75c
ds $1
wDiglettsInitializedFlag:: ; 0xd75d
ds $1
wDiglettInitDelayCounter:: ; 0xd75e
ds $1
wd75f:: ; 0xd75f
ds $2
wDugtrioAnimation:: ; 0xd761
animation wDugtrioAnimation
wDugrioState:: ; 0xd764
ds $1
wd765:: ; 0xd765
ds $1
wSeelBonusClosedGate:: ; 0xd766
ds $1
wd767:: ; 0xd767
ds $1
wd768:: ; 0xd768
ds $3
wd76b:: ; 0xd76b
ds $1
wd76c:: ; 0xd76c
ds $1
wd76d:: ; 0xd76d
ds $1
wd76e:: ; 0xd76e
ds $2
wd770:: ; 0xd770
ds $1
wd771:: ; 0xd771
ds $1
wd772:: ; 0xd772
ds $3
wd775:: ; 0xd775
ds $1
wd776:: ; 0xd776
ds $1
wd777:: ; 0xd777
ds $1
wd778:: ; 0xd778
ds $2
wd77a:: ; 0xd77a
ds $1
wd77b:: ; 0xd77b
ds $1
wd77c:: ; 0xd77c
ds $3
wd77f:: ; 0xd77f
ds $1
wd780:: ; 0xd780
ds $1
wd781:: ; 0xd781
ds $1
wd782:: ; 0xd782
ds $2
wd784:: ; 0xd784
ds $1
wd785:: ; 0xd785
ds $1
wd786:: ; 0xd786
ds $b
wd791:: ; 0xd791
ds $1
wSeelStageStreak:: ; 0xd792
ds $1
wSeelStageScore:: ; 0xd793
ds $1
wd794:: ; 0xd794
ds $1
wd795:: ; 0xd795
ds $1
wd796:: ; 0xd796
ds $1
wd797:: ; 0xd797
ds $1
wd798:: ; 0xd798
ds $1
wd799:: ; 0xd799
ds $1
wd79a:: ; 0xd79a
ds $2
wd79c:: ; 0xd79c
ds $2
wd79e:: ; 0xd79e
ds $1
wLeftAndRightTiltPixelsOffset:: ; 0xd79f
; Horizontal offset in pixels that the left and right tilt are currently moving the screen.
ds $1
wUpperTiltPixelsOffset:: ; 0xd7a0
; Vertical offset in pixels that the upper tilt is currently moving the screen.
ds $1
wLeftTiltCounter:: ; 0xd7a1
ds $1
wLeftTiltReset:: ; 0xd7a2
ds $1
wRightTiltCounter:: ; 0xd7a3
ds $1
wRightTiltReset:: ; 0xd7a4
ds $1
wUpperTiltCounter:: ; 0xd7a5
ds $1
wUpperTiltReset:: ; 0xd7a6
ds $1
wLeftTiltPushing:: ; 0xd7a7
ds $1
wRightTiltPushing:: ; 0xd7a8
ds $1
wUpperTiltPushing:: ; 0xd7a9
ds $1
wUnused_d7aa:: ; 0xd7aa
; not actually used
ds $1
wSCX:: ; 0xd7ab
ds $1
wDisableHorizontalScrollForBallStart:: ; 0xd7ac
; Controls whether or not the screen will scroll to accomodate the pinball when its off-screen.
; When the ball is launched on the Blue and Red Fields, the screen starts off scrolled to the right.
; However, when the balls rolls in on Bonus Stages, the screen does NOT scroll.
; 1 = Disable the scrolling
; 0 = Enable the scrolling
ds $1
wRedStageStructureBackup:: ; 0xd7ad
; The ditto state on red stage is heavily reliant on this value being initialized to 0b100,
; A value of 0xff will cause this var to be ignored and treated as no changes.
ds $1
wLeftFlipperState:: ; 0xd7ae
ds $2
wLeftFlipperStateChange:: ; 0xd7b0
ds $2
wRightFlipperState:: ; 0xd7b2
ds $2
wRightFlipperStateChange:: ; 0xd7b4
ds $2
wPreviousLeftFlipperState:: ; 0xd7b6
ds $1
wPreviousRightFlipperState:: ; 0xd7b7
ds $1
wFlipperCollisionNormalAngle:: ; 0xd7b8
ds $1
wFlipperCollision:: ; 0xd7b9
ds $1
wFlipperXForce:: ; 0xd7ba
dw
wFlipperYForce:: ; 0xd7bc
dw
wFlippersDisabled:: ; 0xd7be
; 0 = enabled
; 1 = disabled
ds $1
wStageSong:: ; 0xd7bf
ds $1
wStageSongBank:: ; 0xd7c0
ds $1
wLoadingSavedGame:: ; 0xd7c1
; Set to 1 when the pinball game is being initialized from a saved game via the Titlescreen.
; 0 otherwise.
ds $1
wSavedGame:: ; 0xd7c2
; Set to 1 when there is a pinball game saved, ready to resume via the Titlescreen.
; 0 otherwise.
ds $1
wSubTileBallXPos:: ; 0xd7c3
ds $1
wSubTileBallYPos:: ; 0xd7c4
ds $1
wUpperLeftCollisionAttribute:: ; 0xd7c5
ds $1
wLowerLeftCollisionAttribute:: ; 0xd7c6
ds $1
wUpperRightCollisionAttribute:: ; 0xd7c7
ds $1
wLowerRightCollisionAttribute:: ; 0xd7c8
ds $1
wCollisionPointTests:: ; 0xd7c9
; When the ball is tested for stage collision, there are 16
; individual points around the center of the ball that are
; tested to see if they are inside a collision mask. This
; buffer holds the results of each of those tests. The order
; of the points is clockwise, starting directly 4 pixels right
; of the ball's center.
ds 16
wd7d9:: ; 0xd7d9
ds $10
wIsBallColliding:: ; 0xd7e9
; Set to non-zero when the pinball is colliding with something.
ds $1
wCollisionNormalAngle:: ; 0xd7ea
; The normal angle of the ball's collision. The coordinate system
; is rotate by 90 degrees compared to standard math.
; $00 = directly up on the Game Boy screen
; $40 = directly right on the Game Boy screen
; $80 = directly down on the Game Boy screen
; $C0 = directly left on the Game Boy screen
ds $1
wCollisionForceAmplification:: ; 0xd7eb
ds $1
wStageCollisionMapPointer:: ; 0xd7ec
ds $2
wStageCollisionMapBank:: ; 0xd7ee
ds $1
wStageCollisionMasksPointer:: ; 0xd7ef
ds $2
wStageCollisionMasksBank:: ; 0xd7f1
ds $1
wd7f2:: ; 0xd7f2
ds $1
wBallPositionTileOffset:: ; 0xd7f3
dw
wCurCollisionAttribute:: ; 0xd7f5
ds $1
wCurCollisionTileOffset:: ; 0xd7f6
ds $1
wd7f7:: ; 0xd7f7
ds $1
wNoCollisionApplied:: ; 0xd7f8
; Set to $FF when collision forces were NOT applied to the ball.
; Set to $00 otherwise.
ds $1
wInGameMenuIndex:: ; 0xd7f9
ds $1
wd7fa:: ; 0xd7fa
ds $1
wd7fb:: ; 0xd7fb
ds $1
wd7fc:: ; 0xd7fc
ds $1
wd7fd:: ; 0xd7fd
ds $1
wd7fe:: ; 0xd7fe
ds $2
wSFXTimer:: ; 0xd800
ds $1
wd801:: ; 0xd801
ds $1
wSpriteBufferSize:: ; 0xd802
ds $1
wRumblePattern:: ; 0xd803
; Holds the rumble pattern for the upcoming frames.
; This gets rotated to the right once per frame. If bit 0 is set, then it turns on rumble.
ds $1
wRumbleDuration:: ; 0xd804
; Number of frames to rumble the Gameboy. See wRumblePattern.
ds $1
wd805:: ; 0xd805 enables unused and odd PlaceString
ds $1
wd806:: ; 0xd806
ds $1
wd807:: ; 0xd807
ds $1
; These three bytes track different joypad states cummulatively, until they are manually cleared.
; They inherit from their similarly-named counterparts found in hram.asm. (See ReadJoyPad)
wJoypadStatesPersistent:: ; 0xd808
wJoypadStatePersistent::
ds $1
wNewlyPressedButtonsPersistent:: ; 0xd809
ds $1
wPressedButtonsPersistent:: ; 0xd80a
ds $1
ds $1 ; unused byte
wBGP:: ; 0xd80c
ds $1
wOBP0:: ; 0xd80d
ds $1
wOBP1:: ; 0xd80e
ds $1
wRNGSub:: ; 0xd80f
ds $1
wRNGModulus:: ; 0xd810 loaded by UpdateRNG, RNG related
ds $1
wRNGPointer:: ; 0xd811
ds $1
wRNGValues:: ; 0xd812
ds $36
wRNGSub2:: ; 0xd848
ds $1
wUpdateAudioEngineUsingTimerInterrupt:: ; 0xd849
; See ToggleAudioEngineUpdateMethod function for more in-depth explanation.
ds $1
wToggleAudioEngineUpdateMethod:: ; 0xd84a
; When this byte is set to 1, it toggles between the audio engine being updated by V-Blank vs. Timer Interrupt.
; See ToggleAudioEngineUpdateMethod function for more in-depth explanation.
ds $1
wd84b:: ; 0xd84b
ds $4
wd84f:: ; 0xd84f
ds $c
wCurrentSongBank:: ; 0xd85b
ds $2
wAudioEngineEnabled:: ; 0xd85d
; 1 = normal audio (music/sfx) engine is enabled
; 0 = disabled
ds $1
wd85e:: ; 0xd85e
ds $1
wd85f:: ; 0xd85f
ds $1
wd860:: ; 0xd860
ds $1
wd861:: ; 0xd861
ds $1
wd862:: ; 0xd862
ds $1
wd863:: ; 0xd863
ds $1
wd864:: ; 0xd864
ds $1
wd865:: ; 0xd865
ds $1
wd866:: ; 0xd866
ds $1
wd867:: ; 0xd867
ds $1
wd868:: ; 0xd868
ds $1
wd869:: ; 0xd869
ds $1
wd86a:: ; 0xd86a
ds $1
wd86b:: ; 0xd86b
ds $1
wd86c:: ; 0xd86c
ds $1
wd86d:: ; 0xd86d
ds $1
wd86e:: ; 0xd86e
ds $1d
wd88b:: ; 0xd88b
ds $12
wd89d:: ; 0xd89d
ds $a
wd8a7:: ; 0xd8a7
ds $1
wd8a8:: ; 0xd8a8
ds $1
wd8a9:: ; 0xd8a9
ds $1
wd8aa:: ; 0xd8aa
ds $1
wd8ab:: ; 0xd8ab
ds $1
wd8ac:: ; 0xd8ac
ds $1
wd8ad:: ; 0xd8ad
ds $1
wd8ae:: ; 0xd8ae
ds $1
wd8af:: ; 0xd8af
ds $1
wd8b0:: ; 0xd8b0
ds $1
wd8b1:: ; 0xd8b1
ds $1
wd8b2:: ; 0xd8b2
ds $1
wd8b3:: ; 0xd8b3
ds $1
wd8b4:: ; 0xd8b4
ds $1
wd8b5:: ; 0xd8b5
ds $1
wd8b6:: ; 0xd8b6
ds $1
wd8b7:: ; 0xd8b7
ds $1
wd8b8:: ; 0xd8b8
ds $1
wd8b9:: ; 0xd8b9
ds $1
wd8ba:: ; 0xd8ba
ds $1
wd8bb:: ; 0xd8bb
ds $1
wd8bc:: ; 0xd8bc
ds $1
wd8bd:: ; 0xd8bd
ds $1
wd8be:: ; 0xd8be
ds $1
wd8bf:: ; 0xd8bf
ds $1
wd8c0:: ; 0xd8c0
ds $1
wd8c1:: ; 0xd8c1
ds $1
wd8c2:: ; 0xd8c2
ds $1
wd8c3:: ; 0xd8c3
ds $1
wd8c4:: ; 0xd8c4
ds $1
wd8c5:: ; 0xd8c5
ds $1
wd8c6:: ; 0xd8c6
ds $1
wd8c7:: ; 0xd8c7
ds $1
wd8c8:: ; 0xd8c8
ds $2
wd8ca:: ; 0xd8ca
ds $1
wd8cb:: ; 0xd8cb
ds $1
wd8cc:: ; 0xd8cc
ds $1
wd8cd:: ; 0xd8cd
ds $1
wd8ce:: ; 0xd8ce
ds $1
wd8cf:: ; 0xd8cf
ds $1
wd8d0:: ; 0xd8d0
ds $1
wd8d1:: ; 0xd8d1
ds $1
wd8d2:: ; 0xd8d2
ds $1
wd8d3:: ; 0xd8d3
ds $1
wd8d4:: ; 0xd8d4
ds $1
wd8d5:: ; 0xd8d5
ds $1
wd8d6:: ; 0xd8d6
ds $1
wd8d7:: ; 0xd8d7
ds $1
wd8d8:: ; 0xd8d8
ds $3
wd8db:: ; 0xd8db
ds $1
wd8dc:: ; 0xd8dc
ds $1
wd8dd:: ; 0xd8dd
ds $1
wd8de:: ; 0xd8de
ds $2
wd8e0:: ; 0xd8e0
ds $1
wd8e1:: ; 0xd8e1
ds $1
wd8e2:: ; 0xd8e2
ds $1
wd8e3:: ; 0xd8e3
ds $1
wd8e4:: ; 0xd8e4
ds $1
wd8e5:: ; 0xd8e5
ds $1
wd8e6:: ; 0xd8e6
ds $1
wd8e7:: ; 0xd8e7
ds $1
wd8e8:: ; 0xd8e8
ds $1
wd8e9:: ; 0xd8e9
ds $1
wd8ea:: ; 0xd8ea
; IR status flags?
ds $1
wd8eb:: ; 0xd8eb
ds $1
wd8ec:: ; 0xd8ec
ds $1
wd8ed:: ; 0xd8ed
ds $1
wd8ee:: ; 0xd8ee
ds $1
wd8ef:: ; 0xd8ef
ds $1
wd8f0:: ; 0xd8f0
ds $1
wCurrentScreen:: ; 0xd8f1
ds $1
wScreenState:: ; 0xd8f2
ds $1
ds $3
wFieldSelectPressedButton:: ; 0xd8f6
; Holds which button was pressed on the field select screen. (A or B)
ds $1
ds $11
wd908:: ; 0xd908
; unused
ds $1
wTitleScreenCursorSelection:: ; 0xd909
ds $1
wTitleScreenGameStartCursorSelection:: ; 0xd90a
ds $2
wTitleScreenBlinkAnimationFrame:: ; 0xd90c
ds $1
wTitleScreenBlinkAnimationCounter:: ; 0xd90d
ds $1
wTitleScreenBouncingBallAnimationFrame:: ; 0xd90e
ds $1
wTitleScreenPokeballAnimationCounter:: ; 0xd90f
ds $1
wTitlescreenContinuePromptAnimationFrame:: ; 0xd910
ds $1
wTitlescreenContinuePromptAnimationTimer:: ; 0xd911
ds $1
wFieldSelectBlinkingBorderTimer:: ; 0xd912
ds $1
wSelectedFieldIndex:: ; 0xd913
ds $1
wFieldSelectBlinkingBorderFrame:: ; 0xd914
ds $1
wd915:: ; 0xd915
ds $1
wd916:: ; 0xd916
ds $1
wd917:: ; 0xd917
ds $1
wd918:: ; 0xd918
ds $1
wd919:: ; 0xd919
ds $1
wSoundTestCurrentBackgroundMusic:: ; 0xd91a
ds $1
wSoundTextCurrentSoundEffect:: ; 0xd91b
ds $1
wOptionsPsyduckAnimationFrame:: ; 0xd91c
ds $1
wOptionsPsyduckAnimationTimer:: ; 0xd91d
ds $1
wOptionsPikachuAnimationFrame:: ; 0xd91e
ds $1
wOptionsPikachuAnimationTimer:: ; 0xd91f
ds $1
wOptionsPokeballAnimationFrame:: ; 0xd920
ds $1
wOptionsPokeballAnimationTimer:: ; 0xd921
ds $1
wd922:: ; 0xd922
ds $14
wd936:: ; 0xd936
ds $8
wd93e:: ; 0xd93e
ds $1
wd93f:: ; 0xd93f
ds $8
wd947:: ; 0xd947
ds $1
wKeyConfigs::
wKeyConfigBallStart:: ; 0xd948
ds $2
wKeyConfigLeftFlipper:: ; 0xd94a
ds $2
wKeyConfigRightFlipper:: ; 0xd94c
ds $2
wKeyConfigLeftTilt:: ; 0xd94e
ds $2
wKeyConfigRightTilt:: ; 0xd950
ds $2
wKeyConfigUpperTilt:: ; 0xd952
ds $2
wKeyConfigMenu:: ; 0xd954
ds $2
wPokedexDescriptionPageFlag:: ; 0xd956
ds $1
wd957:: ; 0xd957
ds $1
wd958:: ; 0xd958
ds $1
wCurPokedexIndex:: ; 0xd959
ds $1
wPokedexOffset:: ; 0xd95a
ds $1
; Used as a counter to determine when to load the cursor sprite or not.
; Same for the blinking of the scroll bar.
wPokedexBlinkingCursorAndScrollBarCounter:: ; 0xd95b
ds $1
wd95c:: ; 0xd95c
ds $1
wPokedexWindowWasShifted:: ; 0xd95d
ds $1
wd95e:: ; 0xd95e
ds $1
; Used to indicate whether to play a sound when the cursor is moved in the pokedex.
wPokedexCursorWasMoved:: ; 0xd95f
ds $1
; Keeps track of whether or not the START button is pressed in the Pokedex screen.
; This is used to know whether or not to display the animated mon catch sprite.
; $0 = START is NOT currently pressed
; $FF = START is currently pressed
wPokedexStartButtonIsPressed:: ; 0xd960
ds $1
wd961:: ; 0xd961
ds $1
wPokedexFlags:: ; 0xd962
ds NUM_POKEMON
wNumPokemonSeen:: ; 0xd9f9
ds $2
wNumPokemonOwned:: ; 0xd9fb
ds $2
MACRO high_scores
\1Points:: ds 6
\1Name:: ds 3
\1Id:: ds 4
ENDM
wRedHighScores:: ; 0xd9fd
high_scores wRedHighScore1
high_scores wRedHighScore2
high_scores wRedHighScore3
high_scores wRedHighScore4
high_scores wRedHighScore5
wBlueHighScores:: ; 0xd9fd
high_scores wBlueHighScore1
high_scores wBlueHighScore2
high_scores wBlueHighScore3
high_scores wBlueHighScore4
high_scores wBlueHighScore5
wHighScoreIsEnteringName:: ; 0xda7f
; 1 during name entry; 0 otherwise
ds $1
wHighScoreNameColumn:: ; 0xda80
ds $1
wHighScoreNameRow:: ; 0xda81
ds $1
wHighScoreNameEntryAsteriskBlinkCounter:: ; 0xda82
ds $1
wHighScoresStage:: ; 0xda83
ds $1
wHighScoresArrowAnimationCounter:: ; 0xda84
ds $1
wHighScoresPrintSendSelection:: ; 0xda85
; 0 if print is selected, 1 if send is selected
ds $1
wda86:: ; 0xda86
ds $1
wSendHighScoresAnimation:: ; 0xda87
animation wSendHighScoresAnimation
wda8a:: ; 0xda8a
ds $2
wda8c:: ; 0xda8c
ds $3
wda8f:: ; 0xda8f
ds $3
wda92:: ; 0xda92
ds $3
wda95:: ; 0xda95
ds $3
wda98:: ; 0xda98
ds $3
wda9b:: ; 0xda9b
ds $3
wda9e:: ; 0xda9e
ds $3
wdaa1:: ; 0xdaa1
ds $1
wdaa2:: ; 0xdaa2
ds $1
wBootCheck:: ; 0xdaa3
; Used to do a single check during first VBLANK.
ds $1
; $25c bytes of free space
SECTION "Audio RAM", WRAMX
wdd00:: ; 0xdd00
ds $1
wChannel0:: ; 0xdd01
ds $32
wChannel1:: ; 0xdd33
ds $32
wChannel2:: ; 0xdd65
ds $32
wChannel3:: ; 0xdd97
ds $32
wChannel4:: ; 0xddc9
ds $32
wChannel5:: ; 0xddfb
ds $32
wChannel6:: ; 0xde2d
ds $32
wChannel7:: ; 0xde5f
ds $32
wde91:: ; 0xde91
ds $1
wde92:: ; 0xde92
ds $1
wde93:: ; 0xde93
ds $1
wde94:: ; 0xde94
ds $1
wde95:: ; 0xde95
ds $1
wde96:: ; 0xde96
ds $1
wde97:: ; 0xde97
ds $1
wde98:: ; 0xde98
ds $1
wde99:: ; 0xde99
ds $1
wde9a:: ; 0xde9a
ds $1
wde9b:: ; 0xde9b
ds $1
wde9c:: ; 0xde9c
ds $1
wde9d:: ; 0xde9d
ds $1
wde9e:: ; 0xde9e
ds $1
wde9f:: ; 0xde9f
ds $2
wdea1:: ; 0xdea1
ds $1
wdea2:: ; 0xdea2
ds $1
wdea3:: ; 0xdea3
ds $1
wdea4:: ; 0xdea4
ds $1
wdea5:: ; 0xdea5
ds $3
wdea8:: ; 0xdea8
ds $1
wdea9:: ; 0xdea9
ds $1
wdeaa:: ; 0xdeaa
ds $1
wdeab:: ; 0xdeab
ds $1
wdeac:: ; 0xdeac
ds $1
wdead:: ; 0xdead
ds $1
wdeae:: ; 0xdeae
ds $2
wMusicRAMEnd:: ; deb0
wdeb0:: ; 0xdeb0
ds $50
SECTION "Stack", WRAMX
ds $ff ;stack area
wStack:: ; 0xdfff
ds 1