summaryrefslogtreecommitdiff
path: root/main.asm
diff options
context:
space:
mode:
Diffstat (limited to 'main.asm')
-rwxr-xr-xmain.asm1618
1 files changed, 9 insertions, 1609 deletions
diff --git a/main.asm b/main.asm
index 5b520f7..dbc7e2b 100755
--- a/main.asm
+++ b/main.asm
@@ -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]