diff options
Diffstat (limited to 'main.asm')
-rwxr-xr-x | main.asm | 1618 |
1 files changed, 9 insertions, 1609 deletions
@@ -1676,369 +1676,6 @@ INCLUDE "engine/high_scores_screen.asm" INCLUDE "engine/field_select_screen.asm" INCLUDE "engine/pinball_game.asm" -GameScreenFunction_LoadGFX: ; 0xd861 - xor a - ld [wd908], a - callba InitializeStage - call FillBottomMessageBufferWithBlackTile - ld a, $1 - ld [wd85d], a - ld [wd4aa], a - ld hl, wScreenState - inc [hl] - ret - -GameScreenFunction_StartBall: ; 0xd87f - ld a, $67 - ld [hLCDC], a - ld a, $e4 - ld [wBGP], a - ld a, $e1 - ld [wOBP0], a - ld a, $e4 - ld [wOBP1], a - ld a, [wSCX] - ld [hSCX], a - xor a - ld [hSCY], a - ld a, $7 - ld [hWX], a - ld a, $83 - ld [hLYC], a - ld [hLastLYC], a - ld a, $ff - ld [hLCDCMask], a - ld hl, hSTAT - set 6, [hl] - ld hl, rIE - set 1, [hl] - ld a, $1 - ld [hHBlankRoutine], a - callba InitBallForStage - callba LoadStageCollisionAttributes - callba LoadStageData - callba Func_ed5e - call ClearOAMBuffer - callba DrawSpritesForStage - ld a, [wd849] - and a - call nz, Func_e5d - ld a, $1 - ld [wd4aa], a - xor a - ld [wd7c1], a - call Func_b66 - call Func_588 - call Func_bbe - ld hl, wScreenState - inc [hl] - ret - -GameScreenFunction_HandleBallPhysics: ; 0xd909 -; main loop for stage logic - xor a - ld [wFlipperCollision], a - ld [wd7eb], a - call ApplyGravityToBall - call LimitBallVelocity - xor a - ld [wd7e9], a - call HandleTilts - ld a, [wCurrentStage] - bit 0, a - callba nz, HandleFlippers ; only perform flipper routines on the lower-half of stages - ld a, [wFlipperCollision] - and a - ld a, [wCollisionForceAngle] - push af - call CheckObjectCollision ; collision stuff - pop af - jr z, .noFlipperCollision - ld [wCollisionForceAngle], a -.noFlipperCollision - call CheckGameObjectCollisions - call Func_281c ; not collision-related - ld hl, wKeyConfigMenu - call IsKeyPressed - jr z, .didntPressMenuKey - lb de, $03, $4c - call PlaySoundEffect - callba HandleInGameMenu - jp z, SaveGame -.didntPressMenuKey - ld a, [wd7e9] ; check for collision flag - and a - jr z, .skip_collision - call ApplyTiltForces - call LoadBallVelocity ; bc = x velocity, de = y velocity - ld a, [wCollisionForceAngle] - call ApplyCollisionForce - call ApplyTorque - ld a, [wFlipperCollision] - and a - jr z, .not_flippers_2 - ; de -= *wFlipperYForce - ld hl, wFlipperYForce - ld a, [hli] - ld h, [hl] - ld l, a - ld a, e - sub l - ld e, a - ld a, d - sbc h - ld d, a - ; bc += *wFlipperXForce - ld hl, wFlipperXForce - ld a, [hli] - ld h, [hl] - ld l, a - ld a, c - add l - ld c, a - ld a, b - adc h - ld b, a - jr .next - -.not_flippers_2 - ld a, [wd7f8] - and a - jr nz, .skip_collision -.next - ld a, [wCollisionForceAngle] - call NegateAngleAndApplyCollisionForce - call SetBallVelocity -.skip_collision - call MoveBallPosition - callba CheckStageTransition - callba DrawSpritesForStage - call Func_33e3 - ld a, [wd5cb] - and a - jr nz, .asm_d9e9 - callba Func_85c7 - callba Func_8650 - callba Func_8645 - call Func_dba9 - call Func_dc7c - call Func_dcb4 -.asm_d9e9 - ld a, [wd57d] - and a - callba nz, Func_86a4 - ld a, [wd4ae] - and a - ret z - xor a - ld [wd4ae], a - ld hl, wScreenState - inc [hl] - ret - -SaveGame: ; 0xda05 - ld de, $0000 - call PlaySong - ld bc, $0004 - call AdvanceFrames - call Func_cb5 - ld a, [wd849] - and a - call nz, Func_e5d - call Func_576 - ld hl, hSTAT - res 6, [hl] - ld hl, rIE - res 1, [hl] - xor a - ld [wd4aa], a - ld a, SCREEN_TITLESCREEN - ld [wCurrentScreen], a - xor a - ld [wScreenState], a - ret - -GameScreenFunction_HandleBallLoss: ; 0xda36 - xor a - ld [hJoypadState], a - ld [hNewlyPressedButtons], a - ld [hPressedButtons], a - ld [wFlipperCollision], a - ld [wd7eb], a - xor a - ld [wd7e9], a - ld [wd548], a - ld [wd549], a - call HandleTilts - ld a, [wCurrentStage] - bit 0, a - callba nz, HandleFlippers - callba DrawSpritesForStage - call Func_33e3 - callba Func_85c7 - ld a, [wd5ca] - and a - ret nz - ld a, [wd4c9] - and a - jr z, .asm_daa9 - ld a, [wd49c] - cp $2 - jr z, .asm_daa9 - call Func_f533 - ld a, [wd49c] - and a - jr z, .asm_daa9 - ld a, $2 - ld [wd49c], a - ld [wd4aa], a - call FillBottomMessageBufferWithBlackTile - call Func_30db - ld hl, wd5dc - ld de, ShootAgainText - call LoadTextHeader - ret - -.asm_daa9 - xor a - ld [wd49c], a - ld hl, wScreenState - inc [hl] - ret - -GameScreenFunction_EndBall: ; 0xdab2 - xor a - ld [wd803], a - ld a, [wGameOver] - and a - jp nz, TransitionToHighScoresScreen - ld a, [wd495] - and a - jr nz, .asm_dae6 - ld a, [wd496] - and a - jr nz, .asm_db28 - call Func_cb5 - ld a, [wd849] - and a - call z, Func_e5d - call Func_576 - ld hl, hSTAT - res 6, [hl] - ld hl, rIE - res 1, [hl] - ld a, $1 - ld [wScreenState], a - ret - -.asm_dae6 - ld de, $0000 - call PlaySong - ld bc, $0004 - call AdvanceFrames - call Func_cb5 - ld a, [wd849] - and a - call nz, Func_e5d - call Func_576 - ld hl, hSTAT - res 6, [hl] - ld hl, rIE - res 1, [hl] - ld a, [wCurrentStage] - ld [wd4ad], a - ld a, [wStageCollisionState] - ld [wd4b0], a - ld a, [wd497] - ld [wCurrentStage], a - xor a - ld [wd496], a - ld [wd495], a - ld a, $0 - ld [wScreenState], a - ret - -.asm_db28 - ld de, $0000 - call PlaySong - ld bc, $0004 - call AdvanceFrames - call Func_cb5 - ld a, [wd849] - and a - call nz, Func_e5d - call Func_576 - ld hl, hSTAT - res 6, [hl] - ld hl, rIE - res 1, [hl] - ld a, [wd4ad] - ld [wCurrentStage], a - ld a, [wd4b0] - ld [wStageCollisionState], a - ld a, $1 - ld [wScreenState], a - ret - -TransitionToHighScoresScreen: ; 0xdb5d - xor a - ld [wGameOver], a - ld de, $0000 - call PlaySong - ld bc, $0004 - call AdvanceFrames - call Func_cb5 - call Func_576 - ld hl, hSTAT - res 6, [hl] - ld hl, rIE - res 1, [hl] - xor a - ld [wd4aa], a - ld a, [wCurrentStage] - ld c, a - ld b, $0 - ld hl, HighScoresStageMapping - add hl, bc - ld a, [hl] - ld [wHighScoresStage], a - ld a, SCREEN_HIGH_SCORES - ld [wCurrentScreen], a - xor a - ld [wScreenState], a - ret - -HighScoresStageMapping: ; 0xdb99 -; Determines which stage the high scores screen will start in, -; based on the map the player ended in. -; See wHighScoresStage for more info. - db $00 ; STAGE_RED_FIELD_TOP - db $00 ; STAGE_RED_FIELD_BOTTOM - db $00 - db $00 - db $01 ; STAGE_BLUE_FIELD_TOP - db $01 ; STAGE_BLUE_FIELD_BOTTOM - db $00 ; STAGE_GENGAR_BONUS - db $00 ; STAGE_GENGAR_BONUS - db $00 ; STAGE_MEWTWO_BONUS - db $00 ; STAGE_MEWTWO_BONUS - db $00 ; STAGE_MEOWTH_BONUS - db $00 ; STAGE_MEOWTH_BONUS - db $00 ; STAGE_DIGLETT_BONUS - db $00 ; STAGE_DIGLETT_BONUS - db $00 ; STAGE_SEEL_BONUS - db $00 ; STAGE_SEEL_BONUS - -Func_dba9: ; 0xdba9 - ld a, $85 - ld [wBottomMessageBuffer + $44], a - ld a, [wd49d] - xor $3 - inc a - add $86 - ld [wBottomMessageBuffer + $45], a - ret - Start20SecondSaverTimer: ; 0xdbba ld a, $1 ld [wBallSaverIconOn], a @@ -2104,40 +1741,7 @@ RestoreBallSaverAfterCatchEmMode: ; 0xdc00 callba Func_14707 ret -HandleBallLoss: ; 0xdc49 - ld a, [wCurrentStage] - rst JumpTable ; calls JumpToFuncInTable -CallTable_dc4d: ; 0xdc4d - ; STAGE_RED_FIELD_TOP - dw RedField_HandleBallLoss - ; STAGE_RED_FIELD_BOTTOM - dw RedField_HandleBallLoss - dw Func_de4e - dw Func_de4e - ; STAGE_BLUE_FIELD_TOP - dw BlueField_HandleBallLoss - ; STAGE_BLUE_FIELD_TOP - dw BlueField_HandleBallLoss - ; STAGE_GENGAR_BONUS - dw Func_df1a - ; STAGE_GENGAR_BONUS - dw Func_df1a - ; STAGE_MEWTWO_BONUS - dw Func_df7e - ; STAGE_MEWTWO_BONUS - dw Func_df7e - ; STAGE_MEOWTH_BONUS - dw Func_dfe2 - ; STAGE_MEOWTH_BONUS - dw Func_dfe2 - ; STAGE_DIGLETT_BONUS - dw Func_e056 - ; STAGE_DIGLETT_BONUS - dw Func_e056 - ; STAGE_SEEL_BONUS - dw Func_e08b - ; STAGE_SEEL_BONUS - dw Func_e08b +INCLUDE "engine/pinball_game/ball_loss/ball_loss.asm" Func_dc6d: ; 0xdc6d push de @@ -2285,1218 +1889,14 @@ Func_dd62: ; 0xdd62 call LoadOrCopyVRAMData ret -RedField_HandleBallLoss: ; 0xdd76 - ld a, [wBallSaverTimerFrames] - ld hl, wBallSaverTimerSeconds - or [hl] - jr z, .rip - ld a, [wNumTimesBallSavedTextWillDisplay] - bit 7, a - jr nz, .skip_save_text - dec a - ld [wNumTimesBallSavedTextWillDisplay], a - push af - ld de, BallSavedText - call Func_dc6d - pop af - jr nz, .skip_save_text - ld a, $1 - ld [wBallSaverTimerFrames], a - ld [wBallSaverTimerSeconds], a -.skip_save_text - lb de, $15, $02 - call PlaySoundEffect - ret - -.rip - ld de, $0000 - call PlaySong - ld bc, $001e - call AdvanceFrames - lb de, $25, $24 - call PlaySoundEffect - call Start20SecondSaverTimer - ld a, $1 - ld [wd4c9], a - xor a - ld [wd4de], a - ld [wd4df], a - call Func_ddfd - ld a, [wd49b] - and a - jr z, .asm_dddd - dec a - ld [wd49b], a - ld a, $1 - ld [wd49c], a - ld de, EndOfBallBonusText - call Func_dc6d - ret - -.asm_dddd - ld a, [wd49d] - ld hl, wd49e - cp [hl] - jr z, .asm_ddf1 - inc a - ld [wd49d], a - ld de, EndOfBallBonusText - call Func_dc6d - ret - -.asm_ddf1 - ld de, EndOfBallBonusText - call Func_dc6d - ld a, $1 - ld [wGameOver], a - ret - -Func_ddfd: ; 0xddfd - ld a, [wInSpecialMode] - and a - ret z - ld a, [wSpecialMode] - and a - jr nz, .asm_de14 - callba Func_10157 - jr .asm_de40 - -.asm_de14 - cp $1 - jr nz, .asm_de2d - xor a - ld [wd604], a - ld a, $1e - ld [wd607], a - callba Func_10ac8 - jr .asm_de40 - -.asm_de2d - xor a - ld [wd604], a - ld a, $1e - ld [wd607], a - callba Func_3022b -.asm_de40 - ld a, [wd7ad] - ld c, a - ld a, [wStageCollisionState] - and $1 - or c - ld [wStageCollisionState], a - ret - -Func_de4e: ; 0xde4e - ret - -BlueField_HandleBallLoss: ; 0xde4f - ld a, [wBallSaverTimerFrames] - ld hl, wBallSaverTimerSeconds - or [hl] - jr z, .rip - ld a, [wNumTimesBallSavedTextWillDisplay] - bit 7, a - jr nz, .skip_save_text - dec a - ld [wNumTimesBallSavedTextWillDisplay], a - push af - ld de, BallSavedText - call Func_dc6d - pop af - jr nz, .skip_save_text - ld a, $1 - ld [wBallSaverTimerFrames], a - ld [wBallSaverTimerSeconds], a -.skip_save_text - lb de, $15, $02 - call PlaySoundEffect - ret - -.rip - ld de, $0000 - call PlaySong - ld bc, $001e - call AdvanceFrames - lb de, $25, $24 - call PlaySoundEffect - call Start20SecondSaverTimer - ld a, $1 - ld [wd4c9], a - xor a - ld [wd4de], a - ld [wd4df], a - call Func_ded6 - ld a, [wd49b] - and a - jr z, .asm_deb6 - dec a - ld [wd49b], a - ld a, $1 - ld [wd49c], a - ld de, EndOfBallBonusText - call Func_dc6d - ret - -.asm_deb6 - ld a, [wd49d] - ld hl, wd49e - cp [hl] - jr z, .asm_deca - inc a - ld [wd49d], a - ld de, EndOfBallBonusText - call Func_dc6d - ret - -.asm_deca - ld de, EndOfBallBonusText - call Func_dc6d - ld a, $1 - ld [wGameOver], a - ret - -Func_ded6: ; 0xded6 - ld a, [wInSpecialMode] - and a - ret z - ld a, [wSpecialMode] - and a - jr nz, .asm_deec - callba Func_10157 - ret - -.asm_deec - cp $1 - jr nz, .asm_df05 - ld a, $0 - ld [wd604], a - ld a, $1e - ld [wd607], a - callba Func_10ac8 - ret - -.asm_df05 - ld a, $0 - ld [wd604], a - ld a, $1e - ld [wd607], a - callba Func_3022b - ret - -Func_df1a: ; 0xdf1a - ld a, [wd4ad] - ld hl, wCurrentStage - cp [hl] - ret z - ld a, [wd6a8] - and a - jr nz, .asm_df57 - ld a, [wd6a2] - cp $5 - jr c, .asm_df50 - xor a - ld [wd4ae], a - ld a, [wd6a7] - and a - ret nz - ld [wd548], a - ld [wd549], a - ld [wBallSpin], a - ld [wBallRotation], a - ld hl, wBallXVelocity - ld [hli], a - ld [hli], a - ld [hli], a - ld [hli], a - ld a, $1 - ld [wd6a7], a -.asm_df50 - lb de, $00, $02 - call PlaySoundEffect - ret - -.asm_df57 - xor a - ld [wd495], a - ld a, $1 - ld [wd496], a - ld a, $2 - ld [wd4c8], a - xor a - ld [wd7ac], a - ld a, [wd49a] - and a - ret nz - call FillBottomMessageBufferWithBlackTile - call Func_30db - ld hl, wd5dc - ld de, EndGengarStageText - call LoadTextHeader - ret - -Func_df7e: ; 0xdf7e - ld a, [wd4ad] - ld hl, wCurrentStage - cp [hl] - ret z - ld a, [wd6b3] - and a - jr nz, .asm_dfbb - ld a, [wd6b1] - cp $8 - jr c, .asm_dfb4 - xor a - ld [wd4ae], a - ld a, [wd6b2] - and a - ret nz - ld [wd548], a - ld [wd549], a - ld [wBallSpin], a - ld [wBallRotation], a - ld hl, wBallXVelocity - ld [hli], a - ld [hli], a - ld [hli], a - ld [hli], a - ld a, $1 - ld [wd6b2], a -.asm_dfb4 - lb de, $00, $0b - call PlaySoundEffect - ret - -.asm_dfbb - xor a - ld [wd495], a - ld a, $1 - ld [wd496], a - ld a, $2 - ld [wd4c8], a - xor a - ld [wd7ac], a - ld a, [wd49a] - and a - ret nz - call FillBottomMessageBufferWithBlackTile - call Func_30db - ld hl, wd5dc - ld de, EndMewtwoStageText - call LoadTextHeader - ret - -Func_dfe2: ; 0xdfe2 - xor a - ld [wd64e], a - ld a, [wd7be] - and a - jr z, .asm_dff2 - ld a, [wd49a] - and a - jr z, .asm_e00f -.asm_dff2 - ld a, [wMeowthStageScore] - cp $14 - jr nc, .asm_e00f - cp $5 - jr c, .asm_e001 - sub $4 - jr .asm_e002 - -.asm_e001 - xor a -.asm_e002 - ld [wMeowthStageScore], a - callba Func_24fa3 -.asm_e00f - ld a, [wd4ad] - ld hl, wCurrentStage - cp [hl] - ret z - ld a, [wd712] - cp $0 - jr nz, .asm_e025 - lb de, $00, $02 - call PlaySoundEffect - ret - -.asm_e025 - xor a - ld [wd57e], a - ld [wd57d], a - xor a - ld [wd495], a - ld a, $1 - ld [wd496], a - ld a, $2 - ld [wd4c8], a - xor a - ld [wd7ac], a - ld [wd712], a - ld a, [wd49a] - and a - ret nz - call FillBottomMessageBufferWithBlackTile - call Func_30db - ld hl, wd5dc - ld de, EndMeowthStageText - call LoadTextHeader - ret - -Func_e056: ; 0xe056 - ld a, [wd4ad] - ld hl, wCurrentStage - cp [hl] - ret z - lb de, $00, $0b - call PlaySoundEffect - xor a - ld [wd495], a - ld a, $1 - ld [wd496], a - ld a, $2 - ld [wd4c8], a - xor a - ld [wd7ac], a - ld a, [wd49a] - and a - ret nz - call FillBottomMessageBufferWithBlackTile - call Func_30db - ld hl, wd5dc - ld de, EndDiglettStageText - call LoadTextHeader - ret - -Func_e08b: ; 0xe08b - xor a - ld [wd64e], a - ld a, [wd7be] - and a - jr z, .asm_e09b - ld a, [wd49a] - and a - jr z, .asm_e0b8 -.asm_e09b - ld a, [wd793] - cp $14 - jr nc, .asm_e0b8 - cp $5 - jr c, .asm_e0aa - sub $4 - jr .asm_e0ab - -.asm_e0aa - xor a -.asm_e0ab - ld [wd793], a - callba Func_262f4 -.asm_e0b8 - ld a, [wd4ad] - ld hl, wCurrentStage - cp [hl] - ret z - ld a, [wd794] - cp $0 - jr nz, .asm_e0c8 - ret - -.asm_e0c8 - lb de, $00, $02 - call PlaySoundEffect - xor a - ld [wd57d], a - ld [wd57d], a - ld [wd495], a - ld a, $1 - ld [wd496], a - ld a, $2 - ld [wd4c8], a - xor a - ld [wd7ac], a - ld [wd794], a - ld a, [wd49a] - and a - ret nz - call FillBottomMessageBufferWithBlackTile - call Func_30db - ld hl, wd5dc - ld de, EndSeelStageText - call LoadTextHeader - ret - -HandleFlippers: ; 0xe0fe - xor a - ld [wFlipperCollision], a - ld [hFlipperYCollisionAttribute], a - ld [wFlipperXForce], a - ld [wFlipperXForce + 1], a - call Func_e118 - call CheckFlipperCollision - ld a, [wFlipperCollision] - and a - call nz, HandleFlipperCollision - ret - -Func_e118: ; 0xe118 - call PlayFlipperSoundIfPressed - ld a, [wd7af] - ld [wLeftFlipperAnimationState], a - ld a, [wd7b3] - ld [wRightFlipperAnimationState], a - ld hl, wKeyConfigLeftFlipper - call IsKeyPressed2 - ld hl, -$0333 - jr z, .asm_e13b - ld a, [wd7be] - and a - jr nz, .asm_e13b - ld hl, $0333 -.asm_e13b - ld a, [wd7af] - and a - jr nz, .asm_e145 - bit 7, h - jr nz, .asm_e14d -.asm_e145 - cp $f - jr nz, .asm_e150 - bit 7, h - jr nz, .asm_e150 -.asm_e14d - ld hl, $0000 -.asm_e150 - ld a, l - ld [wd7b0], a - ld a, h - ld [wd7b1], a - ld a, [wd7ae] - ld c, a - ld a, [wd7af] - ld b, a - add hl, bc - bit 7, h - jr nz, .asm_e16f - ld a, h - cp $10 - jr c, .asm_e172 - ld hl, $0f00 - jr .asm_e172 - -.asm_e16f - ld hl, $0000 -.asm_e172 - ld a, l - ld [wd7ae], a - ld a, h - ld [wd7af], a - ld hl, wKeyConfigRightFlipper - call IsKeyPressed2 - ld hl, -$0333 - jr z, .asm_e18e - ld a, [wd7be] - and a - jr nz, .asm_e18e - ld hl, $0333 -.asm_e18e - ld a, [wd7b3] - and a - jr nz, .asm_e198 - bit 7, h - jr nz, .asm_e1a0 -.asm_e198 - cp $f - jr nz, .asm_e1a3 - bit 7, h - jr nz, .asm_e1a3 -.asm_e1a0 - ld hl, $0000 -.asm_e1a3 - ld a, l - ld [wd7b4], a - ld a, h - ld [wd7b5], a - ld a, [wd7b2] - ld c, a - ld a, [wd7b3] - ld b, a - add hl, bc - bit 7, h - jr nz, .asm_e1c2 - ld a, h - cp $10 - jr c, .asm_e1c5 - ld hl, $0f00 - jr .asm_e1c5 - -.asm_e1c2 - ld hl, $0000 -.asm_e1c5 - ld a, l - ld [wd7b2], a - ld a, h - ld [wd7b3], a - ret - -PlayFlipperSoundIfPressed: ; 0xe1ce - ld a, [wd7be] - and a - ret nz - ld hl, wKeyConfigLeftFlipper - call IsKeyPressed - jr z, .asm_e1e2 - lb de, $00, $0c - call PlaySoundEffect - ret - -.asm_e1e2 - ld hl, wKeyConfigRightFlipper - call IsKeyPressed - ret z - lb de, $00, $0c - call PlaySoundEffect - ret - -CheckFlipperCollision: ; 0xe1f0 - ld a, [wBallXPos + 1] - cp $50 ; which half of the screen is the ball in? - jp nc, CheckRightFlipperCollision ; right half of screen - ; fall through -CheckLeftFlipperCollision: - ld hl, wBallXPos - ld c, $ba - ld a, [hli] - ld [$ff00+c], a - inc c - ld a, [hli] - ld [$ff00+c], a - inc c - ld a, [hli] - ld [$ff00+c], a - inc c - ld a, [hli] - ld [$ff00+c], a - inc c - ld a, [wLeftFlipperAnimationState] - ld [$ffc2], a - ld a, [wd7af] - ld [$ffc3], a - call ReadFlipperCollisionAttributes - ld a, [wFlipperCollision] - and a - ret z - ld a, [wd7b0] - ld [$ffc0], a - ld a, [wd7b1] - ld [$ffc1], a - ret - -CheckRightFlipperCollision: ; 0xe226 -; ball is in right half of screen - ld hl, wBallXPos - ld c, $ba - ld a, [hli] - sub $1 - cpl - ld [$ff00+c], a - inc c - ld a, [hli] - sbc $a0 - cpl - ld [$ff00+c], a - inc c - ld a, [hli] - ld [$ff00+c], a - inc c - ld a, [hli] - ld [$ff00+c], a - inc c - ld a, [wRightFlipperAnimationState] - ld [$ffc2], a - ld a, [wd7b3] - ld [$ffc3], a - call ReadFlipperCollisionAttributes - ld a, [wFlipperCollision] - and a - ret z - ; collision with flipper occurred - ld a, [wd7b4] - ld [$ffc0], a - ld a, [wd7b5] - ld [$ffc1], a - ret - -ReadFlipperCollisionAttributes: ; 0xe25a - ld a, [$ffbb] ; ball x-position high byte - sub $2b ; check if ball is in x-position range of flippers - ret c - cp $30 - ret nc - ; ball is in x-position range of flippers - ld [$ffbb], a ; x offset of flipper horizontal range - ld a, [$ffbd] ; ball y-position high byte - sub $7b ; check if ball is in y-position range of flippers - ret c - cp $20 - ret nc - ; ball is in potential collision with flippers - ld [$ffbd], a ; y offset of flipper vertical range - ld a, [$ffc2] ; flipper animation state -.asm_e270 - push af - ld l, $0 - ld h, a ; multiply a by 0x600 - sla a - sla h - sla h - add h - ld h, a ; hl = a * 0x600 (this is the length of the flipper collision attributes) - ld a, [$ffbb] ; x offset of flipper horizontal range - ld c, a - ld b, $0 - sla c - rl b - sla c - rl b - sla c - rl b - sla c - rl b - sla c - rl b ; bc = (x offset of flipper horizontal range) * 32 - ; Each row of the flipper collision attributes is 32 bytes long. - add hl, bc ; hl points to the start of the row in the flipper collisoin attributes - ld a, [$ffbd] ; y offset of flipper vertical range - ld c, a - ld b, $0 - add hl, bc ; hl points to the attribute byte in the flipper collision attributes - ld d, h - ld e, l ; de points to the attribute byte in the flipper collision attributes - ld a, h - cp $40 - jr nc, .secondBank - add $40 - ld h, a - ld a, Bank(FlipperHorizontalCollisionAttributes) - jr .readAttributeByte - -.secondBank - ld a, Bank(FlipperHorizontalCollisionAttributes2) -.readAttributeByte - call ReadByteFromBank - ld b, a - and a - jr nz, .collision - ; no collision - pop af ; a = flipper animation state(?) - ld hl, $ffc3 - cp [hl] - ret z - jr c, .asm_e2be - dec a - jr .asm_e270 - -.asm_e2be - inc a - jr .asm_e270 - -.collision - pop af ; a = flipper animation state(?) - ld a, b ; a = collision attribute - ld [hFlipperYCollisionAttribute], a - ld h, d - ld l, e - ld a, h - cp $20 - jr nc, .asm_e2d3 - add $60 - ld h, a - ld a, Bank(FlipperVerticalCollisionAttributes) - jr .asm_e2d8 - -.asm_e2d3 - add $20 - ld h, a - ld a, Bank(FlipperVerticalCollisionAttributes2) -.asm_e2d8 - call ReadByteFromBank - ld [wFlipperXCollisionAttribute], a - ld a, $1 - ld [wFlipperCollision], a - ret - -Func_e2e4: - ld a, c - or b - or l - or h - or e - or d - jr nz, .asm_e2f3 - ld a, [$ffba] - ld e, a - ld a, [$ffbb] - ld d, a - ret - -.asm_e2f3 - ld a, d - xor h - push af - bit 7, d - jr z, .asm_e301 - ld a, e - cpl - ld e, a - ld a, d - cpl - ld d, a - inc de -.asm_e301 - bit 7, h - jr z, .asm_e317 - ld a, c - cpl - ld c, a - ld a, b - cpl - ld b, a - ld a, l - cpl - ld l, a - ld a, h - cpl - ld h, a - inc bc - ld a, b - or c - jr nz, .asm_e317 - inc hl -.asm_e317 - push bc - ld c, $11 - ld a, d - or e - jr nz, .asm_e324 - pop bc - ld de, $7fff - jr .asm_e36a - -.asm_e324 - bit 7, d - jr nz, .asm_e32f - sla e - rl d - inc c - jr .asm_e324 - -.asm_e32f - ld a, c - ld [$ff8c], a - pop bc - xor a - ld [$ff8d], a - ld [$ff8e], a -.asm_e338 - jr c, .asm_e344 - ld a, d - cp h - jr nz, .asm_e342 - ld a, e - cp l - jr z, .asm_e344 -.asm_e342 - jr nc, .asm_e34b -.asm_e344 - ld a, l - sub e - ld l, a - ld a, h - sbc d - ld h, a - scf -.asm_e34b - ld a, [$ff8d] - rla - ld [$ff8d], a - ld a, [$ff8e] - rla - ld [$ff8e], a - sla c - rl b - rl l - rl h - ld a, [$ff8c] - dec a - ld [$ff8c], a - jr nz, .asm_e338 - ld a, [$ff8d] - ld e, a - ld a, [$ff8e] - ld d, a -.asm_e36a - pop af - bit 7, a - ret z - ld a, e - sub $1 - cpl - ld e, a - ld a, d - sbc $0 - cpl - ld d, a - ret - -Func_e379: ; 0xe379 - ld a, b - xor d - ld [$ffbe], a - bit 7, b - jr z, .asm_e388 - ld a, c - cpl - ld c, a - ld a, b - cpl - ld b, a - inc bc -.asm_e388 - bit 7, d - jr z, .asm_e393 - ld a, e - cpl - ld e, a - ld a, d - cpl - ld d, a - inc de -.asm_e393 - push bc - push de - ld c, d - call Func_e410 - pop de - pop bc - push hl - push bc - push de - ld c, e - call Func_e410 - pop de - pop bc - push hl - push bc - push de - ld b, d - call Func_e410 - pop de - pop bc - push hl - ld b, e - call Func_e410 - ld c, l - ld l, h - xor a - ld h, a - pop de - add hl, de - rl a - pop de - add hl, de - jr nc, .asm_e3bf - inc a -.asm_e3bf - ld b, l -Data_e3c0: - ld l, h - ld h, a - pop de - add hl, de - ld a, [$ffbe] - bit 7, a - ret z - ld a, c - sub $1 - cpl - ld c, a - ld a, b - sbc $0 - cpl - ld b, a - ld a, l - sbc $0 - cpl - ld l, a - ld a, h - sbc $0 - cpl - ld h, a - ret - -Func_e3de: - push bc - push de - ld c, d - call Func_e410 - pop de - pop bc - push hl - push bc - push de - ld c, e - call Func_e410 - pop de - pop bc - push hl - push bc - push de - ld b, d - call Func_e410 - pop de - pop bc - push hl - ld b, e - call Func_e410 - ld c, l - ld l, h - xor a - ld h, a - pop de - add hl, de - rl a - pop de - add hl, de - jr nc, .asm_e40a - inc a -.asm_e40a - ld b, l - ld l, h - ld h, a - pop de - add hl, de - ret - -Func_e410: ; 0xe410 - ld a, b - cp c - jr nc, .asm_e416 - ld b, c - ld c, a -.asm_e416 - ld h, $3e - ld l, c - ld e, [hl] - inc h - ld d, [hl] - ld l, b - ld a, [hl] - dec h - ld l, [hl] - ld h, a - add hl, de - push af - ld d, $3e - ld a, b - sub c - ld e, a - ld a, [de] - ld c, a - inc d - ld a, [de] - ld b, a - ld a, l - sub c - ld l, a - ld a, h - sbc b - ld h, a - jr nc, .asm_e43c - pop af - ccf - rr h - rr l - ret - -.asm_e43c - pop af - rr h - rr l - ret - -HandleFlipperCollision: ; 0xe442 -; This is called when the ball is colliding with either the -; right or left flipper. - ld a, $1 - ld [wd7e9], a - xor a - ld [wBallPositionPointerOffsetFromStageTopLeft], a - ld [wBallPositionPointerOffsetFromStageTopLeft + 1], a - ld [wCurCollisionAttribute], a - ld [wd7f6], a - ld [wd7f7], a - ld a, [hFlipperYCollisionAttribute] - sla a - ld c, a - ld b, $0 - ld hl, Data_e538 - add hl, bc - ld a, [hli] - ld c, a - ld a, [hl] - ld b, a - ld a, [$ffc0] - ld e, a - ld a, [$ffc1] - ld d, a - sla e - rl d - sla e - rl d ; multiplied de by 4 - call Func_e379 - ld a, b - ld [wFlipperYForce], a - ld a, l - ld [wFlipperYForce + 1], a - ld a, [wBallXPos + 1] - cp $50 ; which flipper did the ball hit? - ld a, [wFlipperXCollisionAttribute] - jr c, .asm_e48b - cpl ; invert the x collision attribute - inc a -.asm_e48b - ld [wCollisionForceAngle], a - ld a, $1 - ld [wd7eb], a - ld a, [wFlipperYForce + 1] - bit 7, a - ret z - xor a - ld [wFlipperYForce], a - ld [wFlipperYForce + 1], a - ret - -DrawFlippers: ; 0xe4a1 - ld a, [wCurrentStage] - and a - ret z - ld hl, FlippersOAMPixelOffsetData - ld a, [hSCX] - ld d, a - ld a, [hSCY] - ld e, a - ld a, [hli] - sub d - ld b, a - ld a, [hli] - sub e - ld c, a - push hl - ld hl, LeftFlipperOAMIds - ld a, [wd7af] - ld e, a - ld d, $0 - add hl, de - ld a, [hl] - cp $b - jr nz, .asm_e4d6 - ld a, [hGameBoyColorFlag] - and a - jr nz, .asm_e4d4 - ld a, [wd7be] - and a - jr z, .asm_e4d4 - ld a, $18 - jr .asm_e4d6 - -.asm_e4d4 - ld a, $b -.asm_e4d6 - call LoadOAMData - pop hl - ld a, [hSCX] - ld d, a - ld a, [hSCY] - ld e, a - ld a, [hli] - sub d - ld b, a - ld a, [hli] - sub e - ld c, a - ld hl, RightFlipperOAMIds - ld a, [wd7b3] - ld e, a - ld d, $0 - add hl, de - ld a, [hl] - cp $8 - jr nz, .asm_e506 - ld a, [hGameBoyColorFlag] - and a - jr nz, .asm_e504 - ld a, [wd7be] - and a - jr z, .asm_e504 - ld a, $17 - jr .asm_e506 - -.asm_e504 - ld a, $8 -.asm_e506 - call LoadOAMData - ret - -FlippersOAMPixelOffsetData: -; flipper oam pixel offsets - dw $7b38 ; left flipper - dw $7b68 ; right flipper - -LeftFlipperOAMIds: -; TODO: Don't know how exactly these are used, but it is used by the animation -; when the flipper is activated and rotates upward to hit the pinball. - db $0b, $0b, $0b, $0b, $0b, $0b, $0b - db $0c, $0c, $0c, $0c, $0c, $0c, $0c - db $0d, $0d, $0d, $0d, $0d, $0d, $0d - -RightFlipperOAMIds: - db $08, $08, $08, $08, $08, $08, $08 - db $09, $09, $09, $09, $09, $09, $09 - db $0A, $0A, $0A, $0A, $0A, $0A, $0A - -Data_e538: ; 0xe538 - dw $0000 - dw $000C - dw $001C - dw $0030 - dw $0038 - dw $0048 - dw $005C - dw $006C - dw $0070 - dw $0080 - dw $0094 - dw $00A4 - dw $00B4 - dw $00C4 - dw $00D4 - dw $00E4 - dw $00F8 - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC - dw $00FC +INCLUDE "engine/pinball_game/ball_loss/ball_loss_red_field.asm" +INCLUDE "engine/pinball_game/ball_loss/ball_loss_blue_field.asm" +INCLUDE "engine/pinball_game/ball_loss/ball_loss_gengar_bonus.asm" +INCLUDE "engine/pinball_game/ball_loss/ball_loss_mewtwo_bonus.asm" +INCLUDE "engine/pinball_game/ball_loss/ball_loss_meowth_bonus.asm" +INCLUDE "engine/pinball_game/ball_loss/ball_loss_diglett_bonus.asm" +INCLUDE "engine/pinball_game/ball_loss/ball_loss_seel_bonus.asm" +INCLUDE "engine/pinball_game/flippers.asm" LoadStageCollisionAttributes: ; 0xe578 ld a, [wCurrentStage] |