summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2017-07-02 16:50:30 -0500
committerMarcus Huderle <huderlem@gmail.com>2017-07-02 16:50:30 -0500
commitd73a1f172e520865f8d34a1f2c2ba068e934eb11 (patch)
treef4b453bb45c6729fa71761f6d7d38dcfe3936653
parent30c5ce5c2093eea360842b4701b36f1bf46c83be (diff)
Move object collision routines into separate files
-rwxr-xr-xengine/pinball_game/object_collision/blue_stage_object_collision.asm (renamed from engine/collision/blue_stage_game_object_collision.asm)0
-rwxr-xr-xengine/pinball_game/object_collision/diglett_bonus_object_collision.asm116
-rwxr-xr-xengine/pinball_game/object_collision/gengar_bonus_object_collision.asm250
-rwxr-xr-xengine/pinball_game/object_collision/meowth_bonus_object_collision.asm268
-rwxr-xr-xengine/pinball_game/object_collision/mewtwo_bonus_object_collision.asm189
-rwxr-xr-xengine/pinball_game/object_collision/object_collision.asm198
-rwxr-xr-xengine/pinball_game/object_collision/red_stage_object_collision.asm (renamed from engine/collision/red_stage_game_object_collision.asm)0
-rwxr-xr-xengine/pinball_game/object_collision/seel_bonus_object_collision.asm91
-rwxr-xr-xhome.asm200
-rwxr-xr-xmain.asm928
10 files changed, 1120 insertions, 1120 deletions
diff --git a/engine/collision/blue_stage_game_object_collision.asm b/engine/pinball_game/object_collision/blue_stage_object_collision.asm
index d88c174..d88c174 100755
--- a/engine/collision/blue_stage_game_object_collision.asm
+++ b/engine/pinball_game/object_collision/blue_stage_object_collision.asm
diff --git a/engine/pinball_game/object_collision/diglett_bonus_object_collision.asm b/engine/pinball_game/object_collision/diglett_bonus_object_collision.asm
new file mode 100755
index 0000000..91e0f82
--- /dev/null
+++ b/engine/pinball_game/object_collision/diglett_bonus_object_collision.asm
@@ -0,0 +1,116 @@
+CheckDiglettBonusStageGameObjectCollisions: ; 0x19ab3
+ call CheckDiglettBonusStageDiglettHeadsCollision
+ call CheckDiglettBonusStageDugtrioCollision
+ ret
+
+CheckDiglettBonusStageDiglettHeadsCollision: ; 0x19aba
+ ld a, [wTriggeredGameObject]
+ inc a
+ jr nz, .asm_19b16
+ ld a, [wd73b]
+ bit 7, a
+ jr nz, .asm_19b16
+ ld a, [wd7e9]
+ and a
+ ret z ; is a collision happening?
+ ld a, [wCurCollisionAttribute]
+ sub $19
+ ret c ; is the pinball colliding with a Diglett head?
+ cp $33
+ ret nc
+ ld c, a
+ ld b, $0
+ ld hl, Data_19b18
+ add hl, bc
+ ld a, [hl]
+ cp $a
+ jr nc, .asm_19aed
+ ld a, [wBallXPos + 1]
+ cp $48
+ ld a, $11
+ jr nc, .asm_19af7
+ xor a
+ jr .asm_19af7
+
+.asm_19aed
+ ld a, [wBallXPos + 1]
+ cp $68
+ ld a, $11
+ jr nc, .asm_19af7
+ xor a
+.asm_19af7
+ add [hl]
+ ld [wTriggeredGameObjectIndex], a
+ add $0
+ ld [wTriggeredGameObject], a
+ ld b, a
+ ld hl, wd73b
+ ld [hl], $0
+ ld a, [wPreviousTriggeredGameObject]
+ cp b
+ jr z, .asm_19b16
+ ld a, [wTriggeredGameObjectIndex]
+ ld [hli], a
+ ld a, [wTriggeredGameObject]
+ ld [hl], a
+ scf
+ ret
+
+.asm_19b16
+ and a
+ ret
+
+Data_19b18:
+ db $01, $01, $01
+ db $02, $02, $02
+ db $03, $03, $03
+ db $04, $04, $04
+ db $05, $05, $05
+ db $06, $06, $06
+ db $07, $07, $07
+ db $08, $08, $08
+ db $09, $09, $09
+ db $0A, $0A, $0A
+ db $0B, $0B, $0B
+ db $0C, $0C, $0C
+ db $0D, $0D, $0D
+ db $0E, $0E, $0E
+ db $0F, $0F, $0F
+ db $10, $10, $10
+ db $11, $11, $11
+
+CheckDiglettBonusStageDugtrioCollision: ; 0x19b4b
+ ld a, [wTriggeredGameObject]
+ inc a
+ jr nz, .asm_19b86
+ ld a, [wd75f]
+ bit 7, a
+ jr nz, .asm_19b86
+ ld a, [wd7e9]
+ and a
+ ret z
+ ld a, [wCurCollisionAttribute]
+ sub $14
+ ret c
+ cp $5
+ ret nc
+ ld a, $1
+ ld [wTriggeredGameObjectIndex], a
+ add $1f
+ ld [wTriggeredGameObject], a
+ ld b, a
+ ld hl, wd75f
+ ld [hl], $0
+ ld a, [wPreviousTriggeredGameObject]
+ cp b
+ jr z, .asm_19b86
+ ld a, [wTriggeredGameObjectIndex]
+ ld [hli], a
+ ld a, [wTriggeredGameObject]
+ ld [hl], a
+ scf
+ ret
+
+.asm_19b86
+ and a
+ ret
diff --git a/engine/pinball_game/object_collision/gengar_bonus_object_collision.asm b/engine/pinball_game/object_collision/gengar_bonus_object_collision.asm
new file mode 100755
index 0000000..adf048b
--- /dev/null
+++ b/engine/pinball_game/object_collision/gengar_bonus_object_collision.asm
@@ -0,0 +1,250 @@
+CheckGengarBonusStageGameObjectCollisions: ; 0x181b1
+ call CheckGengarBonusStageGastlyCollision
+ call CheckGengarBonusStageHaunterCollision
+ call CheckGengarBonusStageGengarCollision
+ call GengarBonusStageGravestonesCollision
+ ret
+
+CheckGengarBonusStageGastlyCollision: ; 0x181be
+ ld a, [wd659]
+ and a
+ ret z
+ ld a, [wGastly1XPos + 1]
+ ld b, a
+ ld a, [wGastly1YPos + 1]
+ add $10
+ ld c, a
+ ld a, [wGastly1AnimationState]
+ call CheckSingleGastlyCollision
+ ld a, $1
+ jr c, .hitGastly
+ ld a, [wGastly2XPos + 1]
+ ld b, a
+ ld a, [wGastly2YPos + 1]
+ add $10
+ ld c, a
+ ld a, [wGastly2AnimationState]
+ call CheckSingleGastlyCollision
+ ld a, $2
+ jr c, .hitGastly
+ ld a, [wGastly3XPos + 1]
+ ld b, a
+ ld a, [wGastly3YPos + 1]
+ add $10
+ ld c, a
+ ld a, [wGastly3AnimationState]
+ call CheckSingleGastlyCollision
+ ld a, $3
+ ret nc
+.hitGastly
+ ld [wTriggeredGameObjectIndex], a
+ ld [wd657], a
+ add $4
+ ld [wTriggeredGameObject], a
+ ld [wd658], a
+ ret
+
+CheckSingleGastlyCollision: ; 0x1820d
+ cp $4
+ jr z, .noCollision
+ ld a, [wBallXPos + 1]
+ sub b
+ cp $20
+ jr nc, .noCollision
+ ld b, a
+ ld a, [wBallYPos + 1]
+ sub c
+ cp $20
+ jr nc, .noCollision
+ ld c, a
+ ld e, c
+ ld d, $0
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ ld l, b
+ ld h, $0
+ add hl, de
+ ld de, CircularCollisionAngles
+ add hl, de
+ ld a, BANK(CircularCollisionAngles)
+ call ReadByteFromBank
+ bit 7, a
+ jr nz, .noCollision
+ sla a
+ ld [wCollisionForceAngle], a
+ ld a, $1
+ ld [wd7e9], a
+ scf
+ ret
+
+.noCollision
+ and a
+ ret
+
+CheckGengarBonusStageHaunterCollision: ; 0x18259
+ ld a, [wd67e]
+ and a
+ ret z
+ ld a, [wHaunter1XPos + 1]
+ add $fe
+ ld b, a
+ ld a, [wHaunter1YPos + 1]
+ add $c
+ ld c, a
+ ld a, [wHaunter1AnimationState]
+ call CheckSingleHaunterCollision
+ ld a, $1
+ jr c, .hitHaunter
+ ld a, [wHaunter2XPos + 1]
+ add $fe
+ ld b, a
+ ld a, [wHaunter2YPos + 1]
+ add $c
+ ld c, a
+ ld a, [wHaunter2AnimationState]
+ call CheckSingleHaunterCollision
+ ld a, $2
+ ret nc
+.hitHaunter
+ ld [wTriggeredGameObjectIndex], a
+ ld [wd67c], a
+ add $7
+ ld [wTriggeredGameObject], a
+ ld [wd67d], a
+ ret
+
+CheckSingleHaunterCollision: ; 0x18298
+ cp $5
+ jr z, .noCollision
+ ld a, [wBallXPos + 1]
+ sub b
+ cp $20
+ jr nc, .noCollision
+ ld b, a
+ ld a, [wBallYPos + 1]
+ sub c
+ cp $28
+ jr nc, .noCollision
+ ld c, a
+ ld e, c
+ ld d, $0
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ ld l, b
+ ld h, $0
+ add hl, de
+ ld de, HaunterCollisionAngles
+ add hl, de
+ ld a, BANK(HaunterCollisionAngles)
+ call ReadByteFromBank
+ bit 7, a
+ jr nz, .noCollision
+ sla a
+ ld [wCollisionForceAngle], a
+ ld a, $1
+ ld [wd7e9], a
+ scf
+ ret
+
+.noCollision
+ and a
+ ret
+
+CheckGengarBonusStageGengarCollision: ; 0x182e4
+ ld a, [wd698]
+ and a
+ ret z
+ ld a, [wGengarXPos + 1]
+ ld b, a
+ ld a, [wGengarYPos + 1]
+ add $c
+ ld c, a
+ call CheckGiantGengarCollision
+ ld a, $1
+ ret nc
+ ld [wTriggeredGameObjectIndex], a
+ ld [wd696], a
+ add $9
+ ld [wTriggeredGameObject], a
+ ld [wd697], a
+ ret
+
+CheckGiantGengarCollision: ; 0x18308
+ ld a, [wBallXPos + 1]
+ sub b
+ cp $30
+ jr nc, .noCollision
+ ld b, a
+ ld a, [wBallYPos + 1]
+ sub c
+ cp $40
+ jr nc, .noCollision
+ ld c, a
+ ld a, c
+ sla a
+ add c
+ ld e, a
+ ld d, $0
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ ld l, b
+ ld h, $0
+ add hl, de
+ ld de, GengarCollisionAngles
+ add hl, de
+ ld a, BANK(GengarCollisionAngles)
+ call ReadByteFromBank
+ bit 7, a
+ jr nz, .noCollision
+ sla a
+ ld [wCollisionForceAngle], a
+ ld a, $1
+ ld [wd7e9], a
+ scf
+ ret
+
+.noCollision
+ and a
+ ret
+
+GengarBonusStageGravestonesCollision: ; 0x18350
+ ld de, GengarBonusStageGravestonesCollisionData
+ ld hl, GengarBonusStageGravestonesCollisionAttributes
+ ld bc, wWhichGravestone
+ and a
+ jp HandleGameObjectCollision
+
+GengarBonusStageGravestonesCollisionAttributes:
+ db $00 ; flat list
+ db $19, $1A, $1B, $1C, $27, $1D, $1E, $1F, $20
+ db $FF ; terminator
+
+GengarBonusStageGravestonesCollisionData:
+ db $11, $11
+ db $01, $24, $52
+ db $02, $44, $3A
+ db $03, $74, $5A
+ db $04, $7C, $32
+ db $FF ; terminator
diff --git a/engine/pinball_game/object_collision/meowth_bonus_object_collision.asm b/engine/pinball_game/object_collision/meowth_bonus_object_collision.asm
new file mode 100755
index 0000000..4fc6179
--- /dev/null
+++ b/engine/pinball_game/object_collision/meowth_bonus_object_collision.asm
@@ -0,0 +1,268 @@
+CheckMeowthBonusStageGameObjectCollisions: ; 0x2414d
+ call CheckMeowthBonusStageMeowthCollision
+ call CheckMeowthBonusStageJewelsCollision
+ call CheckMeowthBonusStageJewelsCollision2
+ ret
+
+CheckMeowthBonusStageMeowthCollision: ; 0x24157
+ ld a, [wd6e7]
+ cp $0
+ ret nz
+ ld a, [wMeowthXPosition]
+ add -9
+ ld b, a
+ ld a, [wMeowthYPosition]
+ add $6
+ ld c, a
+ call CheckMeowthCollision
+ ld a, $3
+ ret nc
+ ret
+
+CheckMeowthCollision: ; 0x24170
+ ld a, [wBallXPos + 1]
+ sub b
+ cp $30
+ jp nc, .noCollision
+ ld b, a
+ ld a, [wBallYPos + 1]
+ sub c
+ cp $28
+ jp nc, .noCollision
+ ld c, a
+ ld e, c
+ ld d, $0
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ ld h, d
+ ld l, e
+ sla e
+ rl d
+ add hl, de
+ ld d, h
+ ld e, l
+ sla e
+ rl d
+ ld l, b
+ ld h, $0
+ add hl, de
+ ld de, MeowthCollisionAngles
+ add hl, de
+ ld a, BANK(MeowthCollisionAngles)
+ call ReadByteFromBank
+ bit 7, a
+ jr nz, .noCollision
+ sla a
+ ld [wCollisionForceAngle], a
+ ld a, $1
+ ld [wd7e9], a
+ ld a, [wd6ec]
+ cp $2
+ ret z
+ cp $3
+ ret z
+ ld a, [wd713]
+ and a
+ ret nz
+ ld a, [wMeowthYMovement]
+ and a
+ jr z, .asm_241ed
+ ld a, [wMeowthYMovement]
+ cp $1
+ jr nz, .asm_241df
+ ld a, [wd70b]
+ cp $3
+ jr z, .asm_241eb
+ jr .asm_241e6
+
+.asm_241df
+ ld a, [wd70c]
+ cp $3
+ jr z, .asm_241eb
+.asm_241e6
+ ld a, $2
+ ld [wd6e7], a
+.asm_241eb
+ scf
+ ret
+
+.asm_241ed
+ ld a, [wMeowthYPosition]
+ cp $20
+ jr nz, .asm_241fd
+ ld a, [wd70b]
+ cp $3
+ jr z, .asm_24210
+ jr .asm_2420b
+
+.asm_241fd
+ ld a, [wMeowthYPosition]
+ cp $10
+ jr nz, .asm_24210
+ ld a, [wd70c]
+ cp $3
+ jr z, .asm_24210
+.asm_2420b
+ ld a, $1
+ ld [wd6e7], a
+.asm_24210
+ scf
+ ret
+
+.noCollision
+ and a
+ ret
+
+CheckMeowthBonusStageJewelsCollision: ; 0x24214
+ ld a, [wd717]
+ cp $2
+ jr nz, .asm_2422e
+ ld a, [wd71a]
+ sub $4
+ ld b, a
+ ld a, [wd727]
+ add $c
+ ld c, a
+ call CheckJewelCollision
+ ld a, $0
+ jr c, .asm_24260
+.asm_2422e
+ ld a, [wd718]
+ cp $2
+ jr nz, .asm_24248
+ ld a, [wd71b]
+ sub $4
+ ld b, a
+ ld a, [wd728]
+ add $c
+ ld c, a
+ call CheckJewelCollision
+ ld a, $1
+ jr c, .asm_24260
+.asm_24248
+ ld a, [wd719]
+ cp $2
+ ret nz
+ ld a, [wd71c]
+ sub $4
+ ld b, a
+ ld a, [wd729]
+ add $c
+ ld c, a
+ call CheckJewelCollision
+ ld a, $2
+ ret nc
+.asm_24260
+ ld b, $0
+ ld c, a
+ ld hl, wd717
+ add hl, bc
+ ld a, $3
+ ld [hl], a
+ ld hl, wd714
+ add hl, bc
+ ld a, $0
+ ld [hl], a
+ ret
+
+CheckJewelCollision: ; 0x24272
+ ld a, [wBallXPos + 1]
+ sub b
+ cp $18
+ jr nc, .noCollision
+ ld b, a
+ ld a, [wBallYPos + 1]
+ sub c
+ cp $18
+ jr nc, .noCollision
+ ld c, a
+ ld e, c
+ ld d, $0
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ ld h, d
+ ld l, e
+ sla e
+ rl d
+ add hl, de
+ ld d, h
+ ld e, l
+ ld l, b
+ ld h, $0
+ add hl, de
+ ld de, MeowthJewelCollisionAngles
+ add hl, de
+ ld a, BANK(MeowthJewelCollisionAngles)
+ call ReadByteFromBank
+ bit 7, a
+ jr nz, .noCollision
+ sla a
+ ld [wCollisionForceAngle], a
+ ld a, $1
+ ld [wd7e9], a
+ scf
+ ret
+
+.noCollision
+ and a
+ ret
+
+CheckMeowthBonusStageJewelsCollision2: ; 0x242bb
+ ld a, [wd721]
+ cp $2
+ jr nz, .asm_242d5
+ ld a, [wd724]
+ sub $4
+ ld b, a
+ ld a, [wd731]
+ add $c
+ ld c, a
+ call CheckJewelCollision
+ ld a, $0
+ jr c, .asm_24307
+.asm_242d5
+ ld a, [wd722]
+ cp $2
+ jr nz, .asm_242ef
+ ld a, [wd725]
+ sub $4
+ ld b, a
+ ld a, [wd732]
+ add $c
+ ld c, a
+ call CheckJewelCollision
+ ld a, $1
+ jr c, .asm_24307
+.asm_242ef
+ ld a, [wd723]
+ cp $2
+ ret nz
+ ld a, [wd726]
+ sub $4
+ ld b, a
+ ld a, [wd733]
+ add $c
+ ld c, a
+ call CheckJewelCollision
+ ld a, $2
+ ret nc
+.asm_24307
+ ld b, $0
+ ld c, a
+ ld hl, wd721
+ add hl, bc
+ ld a, $3
+ ld [hl], a
+ ld hl, wd71e
+ add hl, bc
+ ld a, $0
+ ld [hl], a
+ ret
diff --git a/engine/pinball_game/object_collision/mewtwo_bonus_object_collision.asm b/engine/pinball_game/object_collision/mewtwo_bonus_object_collision.asm
new file mode 100755
index 0000000..e6bbae5
--- /dev/null
+++ b/engine/pinball_game/object_collision/mewtwo_bonus_object_collision.asm
@@ -0,0 +1,189 @@
+CheckMewtwoBonusStageGameObjectCollisions: ; 0x19330
+ call Func_19414
+ call Func_19337
+ ret
+
+Func_19337: ; 0x19337
+ ld hl, wd6bb
+ ld bc, $0601
+.asm_1933d
+ push bc
+ push hl
+ ld a, [hli]
+ add $f8
+ ld b, a
+ ld a, [hld]
+ add $8
+ ld c, a
+ dec hl
+ dec hl
+ dec hl
+ ld a, [hl]
+ dec hl
+ dec hl
+ bit 0, [hl]
+ call nz, Func_1936f
+ pop hl
+ pop bc
+ ld a, c
+ jr c, .asm_19360
+ ld de, $0008
+ add hl, de
+ inc c
+ dec b
+ jr nz, .asm_1933d
+ ret
+
+.asm_19360
+ ld [wTriggeredGameObjectIndex], a
+ ld [wd6b4], a
+ add $0
+ ld [wTriggeredGameObject], a
+ ld [wd6b5], a
+ ret
+
+Func_1936f: ; 0x1936f
+ cp $b
+ jp z, Func_19412
+ ld a, [wBallXPos + 1]
+ sub b
+ cp $20
+ jp nc, Func_19412
+ ld b, a
+ ld a, [wBallYPos + 1]
+ sub c
+ cp $20
+ jp nc, Func_19412
+ ld c, a
+ ld e, a
+ ld d, $0
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ ld l, b
+ ld h, $0
+ add hl, de
+ sla l
+ rl h
+ sla l
+ rl h
+ ld de, BallPhysicsData_e4000
+ add hl, de
+ ld de, wBallXVelocity
+ ld a, BANK(BallPhysicsData_e4000)
+ call ReadByteFromBank
+ ld c, a
+ ld a, [de]
+ add c
+ ld [de], a
+ inc de
+ inc hl
+ ld a, BANK(BallPhysicsData_e4000)
+ call ReadByteFromBank
+ ld b, a
+ ld a, [de]
+ adc b
+ ld [de], a
+ inc de
+ inc hl
+ push bc
+ ld a, BANK(BallPhysicsData_e4000)
+ call ReadByteFromBank
+ ld c, a
+ ld a, [de]
+ add c
+ ld [de], a
+ inc de
+ inc hl
+ ld a, BANK(BallPhysicsData_e4000)
+ call ReadByteFromBank
+ ld b, a
+ ld a, [de]
+ adc b
+ ld [de], a
+ inc de
+ inc hl
+ bit 7, b
+ jr z, .asm_193ea
+ ld a, c
+ cpl
+ ld c, a
+ ld a, b
+ cpl
+ ld b, a
+ inc bc
+.asm_193ea
+ pop hl
+ bit 7, h
+ jr z, .asm_193f6
+ ld a, l
+ cpl
+ ld l, a
+ ld a, h
+ cpl
+ ld h, a
+ inc hl
+.asm_193f6
+ add hl, bc
+ sla l
+ rl h
+ ld a, h
+ cp $2
+ jr c, .asm_19410
+ ld a, [wd804]
+ and a
+ jr nz, .asm_19410
+ ld a, $5
+ ld [wd803], a
+ ld a, $8
+ ld [wd804], a
+.asm_19410
+ scf
+ ret
+
+Func_19412: ; 0x19312
+ and a
+ ret
+
+Func_19414: ; 0x19414
+ ld a, [wTriggeredGameObject]
+ inc a
+ jr nz, .asm_1944f
+ ld a, [wd6aa]
+ bit 7, a
+ jr nz, .asm_1944f
+ ld a, [wd7e9]
+ and a
+ ret z
+ ld a, [wCurCollisionAttribute]
+ sub $10
+ ret c
+ cp $c
+ ret nc
+ ld a, $1
+ ld [wTriggeredGameObjectIndex], a
+ add $6
+ ld [wTriggeredGameObject], a
+ ld b, a
+ ld hl, wd6aa
+ ld [hl], $0
+ ld a, [wPreviousTriggeredGameObject]
+ cp b
+ jr z, .asm_1944f
+ ld a, [wTriggeredGameObjectIndex]
+ ld [hli], a
+ ld a, [wTriggeredGameObject]
+ ld [hl], a
+ scf
+ ret
+
+.asm_1944f
+ and a
+ ret
diff --git a/engine/pinball_game/object_collision/object_collision.asm b/engine/pinball_game/object_collision/object_collision.asm
new file mode 100755
index 0000000..51e34ce
--- /dev/null
+++ b/engine/pinball_game/object_collision/object_collision.asm
@@ -0,0 +1,198 @@
+CheckGameObjectCollisions: ; 0x2720
+ ld a, $ff
+ ld [wTriggeredGameObject], a
+ call CheckGameObjectCollisions_
+ ld a, [wTriggeredGameObject]
+ ld [wPreviousTriggeredGameObject], a
+ ret
+
+CheckGameObjectCollisions_: ; 0x272f
+ ld a, [wCurrentStage]
+ call CallInFollowingTable
+GameObjectCollisions_CallTable: ; 0x2735
+ ; STAGE_RED_FIELD_TOP
+ padded_dab CheckRedStageTopGameObjectCollisions
+
+ ; STAGE_RED_FIELD_BOTTOM
+ padded_dab CheckRedStageBottomGameObjectCollisions
+
+ padded_dab DoNothing_18061
+
+ padded_dab CheckRedStageLaunchAlleyCollision_
+
+ ; STAGE_BLUE_FIELD_TOP
+ padded_dab CheckBlueStageTopGameObjectCollisions
+
+ ; STAGE_BLUE_FIELD_BOTTOM
+ padded_dab CheckBlueStageBottomGameObjectCollisions
+
+ ; STAGE_GENGAR_BONUS
+ padded_dab CheckGengarBonusStageGameObjectCollisions
+
+ ; STAGE_GENGAR_BONUS
+ padded_dab CheckGengarBonusStageGameObjectCollisions
+
+ ; STAGE_MEWTWO_BONUS
+ padded_dab CheckMewtwoBonusStageGameObjectCollisions
+
+ ; STAGE_MEWTWO_BONUS
+ padded_dab CheckMewtwoBonusStageGameObjectCollisions
+
+ ; STAGE_MEOWTH_BONUS
+ padded_dab CheckMeowthBonusStageGameObjectCollisions
+
+ ; STAGE_MEOWTH_BONUS
+ padded_dab CheckMeowthBonusStageGameObjectCollisions
+
+ ; STAGE_DIGLETT_BONUS
+ padded_dab CheckDiglettBonusStageGameObjectCollisions
+
+ ; STAGE_DIGLETT_BONUS
+ padded_dab CheckDiglettBonusStageGameObjectCollisions
+
+ ; STAGE_SEEL_BONUS
+ padded_dab CheckSeelBonusStageGameObjectCollisions
+
+ ; STAGE_SEEL_BONUS
+ padded_dab CheckSeelBonusStageGameObjectCollisions
+
+HandleGameObjectCollision: ; 0x2775
+; Handle collision checking for one set of game objects, such as the bumpers, Pikachu savers, etc.
+; Input: hl = pointer to collision attribute list for game objects
+; de = pointer to object collision struct
+; carry flag = unset to skip the collision attribute list check
+ ld a, [wTriggeredGameObject]
+ inc a
+ jr nz, .noTrigger
+ ld a, [bc]
+ bit 7, a
+ jr nz, .noTrigger
+ push bc
+ push de
+ call nc, IsCollisionInList
+ pop hl
+ call c, CheckGameObjectCollision
+ ld a, [wTriggeredGameObject]
+ ld b, a
+ pop hl
+ ld [hl], $0
+ jr nc, .noTrigger
+ ld a, [wPreviousTriggeredGameObject]
+ cp b
+ jr z, .noTrigger
+ ld a, [wTriggeredGameObjectIndex]
+ ld [hli], a
+ ld a, [wTriggeredGameObject]
+ ld [hl], a
+ scf
+ ret
+
+.noTrigger
+ and a
+ ret
+
+CheckGameObjectCollision: ; 0x27a4
+; Checks if any of the given game objects are colliding with the pinball.
+; Saves information about which game object was collided.
+; Sets carry flag if a game object was collided.
+; Input: hl = pointer to game object struct with the following format:
+; [x distance][y distance] (defines bounding box for the following list of objects)
+; [game object id][object x][object y] (terminate this list with $FF)
+ xor a
+ ld [wTriggeredGameObjectIndex], a
+ ld a, [hli] ; x distance threshold
+ ld d, a
+ ld a, [hli] ; y distance threshold
+ ld e, a
+ ld a, [wBallXPos + 1]
+ ld b, a
+ ld a, [wBallYPos + 1]
+ ld c, a
+.loop
+ ld a, [wTriggeredGameObjectIndex]
+ inc a
+ ld [wTriggeredGameObjectIndex], a
+ ld a, [hli]
+ ld [wTriggeredGameObject], a
+ cp $ff
+ ret z
+ ld a, [hli]
+ sub b
+ bit 7, a
+ jr z, .compareXDifference
+ cpl ; calculate absolute value of the difference
+ inc a
+.compareXDifference
+ cp d
+ ld a, [hli]
+ jr nc, .loop
+ sub c
+ bit 7, a
+ jr z, .compareYDifference
+ cpl ; calculate absolute value of the difference
+ inc a
+.compareYDifference
+ cp e
+ jr nc, .loop
+ scf
+ ret
+
+IsCollisionInList: ; 0x27da
+; Checks if the pinball's current collision attribute is in the given list.
+; Input: hl = pointer to list of collision attributes, terminated by $FF.
+; Output: Sets carry flag if the attribute is in the list.
+; First byte in list is 0 if the list is independent of the stage's current collision state (Red stage's
+; top section changes during gameply.)
+ ld a, [hli]
+ and a
+ jr z, .checkList
+ dec hl
+ ld a, [wStageCollisionState]
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld c, [hl]
+ add hl, bc
+.checkList
+ ld a, [wd7e9]
+ and a
+ ret z
+ ld a, [wCurCollisionAttribute]
+ ld b, a
+ ld c, -1 ; This saves the list offset in C, but the result isn't used by any callers of this routine.
+.loop
+ inc c
+ ld a, [hli]
+ cp $ff
+ ret z
+ cp b
+ jr nz, .loop
+ scf
+ ret
+
+PinballCollidesWithPoints: ; 0x27fd
+; Checks if pinball collides with any of the (x, y) points in the given list.
+; Saves the index of the collided point.
+; Input: hl = pointer to array of (x, y) points
+; Output: Saves index of collided point in wd578
+ ld a, [wBallXPos + 1]
+ ld b, a
+ ld a, [wBallYPos + 1]
+ ld c, a
+ ld d, $0
+.nextPoint
+ ld a, [hli]
+ and a
+ ret z
+ inc d
+ ld a, [hli]
+ sub b
+ cp $e8
+ ld a, [hli]
+ jr c, .nextPoint
+ sub c
+ cp $e8
+ jr c, .nextPoint
+ ld a, d
+ ld [wd578], a
+ ret
diff --git a/engine/collision/red_stage_game_object_collision.asm b/engine/pinball_game/object_collision/red_stage_object_collision.asm
index 341726d..341726d 100755
--- a/engine/collision/red_stage_game_object_collision.asm
+++ b/engine/pinball_game/object_collision/red_stage_object_collision.asm
diff --git a/engine/pinball_game/object_collision/seel_bonus_object_collision.asm b/engine/pinball_game/object_collision/seel_bonus_object_collision.asm
new file mode 100755
index 0000000..e702dd2
--- /dev/null
+++ b/engine/pinball_game/object_collision/seel_bonus_object_collision.asm
@@ -0,0 +1,91 @@
+CheckSeelBonusStageGameObjectCollisions: ; 0x25bbc
+ call CheckSeelBonusStageSeelHeadCollisions
+ ret
+
+CheckSeelBonusStageSeelHeadCollisions: ; 0x25bc0
+ ld a, [wd76c]
+ cp $0
+ jr nz, .seel2
+ ld a, [wd76e]
+ ld b, a
+ ld a, [wd770]
+ add $14
+ ld c, a
+ call CheckSeelHeadCollision
+ ld a, $0
+ jr c, .hitSeelHead
+.seel2
+ ld a, [wd776]
+ cp $0
+ jr nz, .seel3
+ ld a, [wd778]
+ ld b, a
+ ld a, [wd77a]
+ add $14
+ ld c, a
+ call CheckSeelHeadCollision
+ ld a, $1
+ jr c, .hitSeelHead
+.seel3
+ ld a, [wd780]
+ cp $0
+ jr nz, .done
+ ld a, [wd782]
+ ld b, a
+ ld a, [wd784]
+ add $14
+ ld c, a
+ call CheckSeelHeadCollision
+ ld a, $2
+ jr c, .hitSeelHead
+.done
+ ret
+
+.hitSeelHead
+ ld [wd768], a
+ ld a, $1
+ ld [wd767], a
+ ret
+
+CheckSeelHeadCollision: ; 0x25c12
+ ld a, [wBallXPos + 1]
+ sub b
+ cp $20
+ jr nc, .noCollision
+ ld b, a
+ ld a, [wBallYPos + 1]
+ sub c
+ cp $20
+ jr nc, .noCollision
+ ld c, a
+ ld e, c
+ ld d, $0
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ sla e
+ rl d
+ ld l, b
+ ld h, $0
+ add hl, de
+ ld de, CircularCollisionAngles
+ add hl, de
+ ld a, BANK(CircularCollisionAngles)
+ call ReadByteFromBank
+ bit 7, a
+ jr nz, .noCollision
+ sla a
+ ld [wCollisionForceAngle], a
+ ld a, $1
+ ld [wd7e9], a
+ scf
+ ret
+
+.noCollision
+ and a
+ ret
diff --git a/home.asm b/home.asm
index eaadda9..b7776b5 100755
--- a/home.asm
+++ b/home.asm
@@ -4992,205 +4992,7 @@ SubTileXPos_CollisionData7: ; 0x268e
db $18, $08, $03
INCLUDE "data/sine_table.asm"
-
-CheckGameObjectCollisions: ; 0x2720
- ld a, $ff
- ld [wTriggeredGameObject], a
- call CheckGameObjectCollisions_
- ld a, [wTriggeredGameObject]
- ld [wPreviousTriggeredGameObject], a
- ret
-
-CheckGameObjectCollisions_: ; 0x272f
- ld a, [wCurrentStage]
- call CallInFollowingTable
-GameObjectCollisions_CallTable: ; 0x2735
- ; STAGE_RED_FIELD_TOP
- padded_dab CheckRedStageTopGameObjectCollisions
-
- ; STAGE_RED_FIELD_BOTTOM
- padded_dab CheckRedStageBottomGameObjectCollisions
-
- padded_dab DoNothing_18061
-
- padded_dab CheckRedStageLaunchAlleyCollision_
-
- ; STAGE_BLUE_FIELD_TOP
- padded_dab CheckBlueStageTopGameObjectCollisions
-
- ; STAGE_BLUE_FIELD_BOTTOM
- padded_dab CheckBlueStageBottomGameObjectCollisions
-
- ; STAGE_GENGAR_BONUS
- padded_dab CheckGengarBonusStageGameObjectCollisions
-
- ; STAGE_GENGAR_BONUS
- padded_dab CheckGengarBonusStageGameObjectCollisions
-
- ; STAGE_MEWTWO_BONUS
- padded_dab CheckMewtwoBonusStageGameObjectCollisions
-
- ; STAGE_MEWTWO_BONUS
- padded_dab CheckMewtwoBonusStageGameObjectCollisions
-
- ; STAGE_MEOWTH_BONUS
- padded_dab CheckMeowthBonusStageGameObjectCollisions
-
- ; STAGE_MEOWTH_BONUS
- padded_dab CheckMeowthBonusStageGameObjectCollisions
-
- ; STAGE_DIGLETT_BONUS
- padded_dab CheckDiglettBonusStageGameObjectCollisions
-
- ; STAGE_DIGLETT_BONUS
- padded_dab CheckDiglettBonusStageGameObjectCollisions
-
- ; STAGE_SEEL_BONUS
- padded_dab CheckSeelBonusStageGameObjectCollisions
-
- ; STAGE_SEEL_BONUS
- padded_dab CheckSeelBonusStageGameObjectCollisions
-
-HandleGameObjectCollision: ; 0x2775
-; Handle collision checking for one set of game objects, such as the bumpers, Pikachu savers, etc.
-; Input: hl = pointer to collision attribute list for game objects
-; de = pointer to object collision struct
-; carry flag = unset to skip the collision attribute list check
- ld a, [wTriggeredGameObject]
- inc a
- jr nz, .noTrigger
- ld a, [bc]
- bit 7, a
- jr nz, .noTrigger
- push bc
- push de
- call nc, IsCollisionInList
- pop hl
- call c, CheckGameObjectCollision
- ld a, [wTriggeredGameObject]
- ld b, a
- pop hl
- ld [hl], $0
- jr nc, .noTrigger
- ld a, [wPreviousTriggeredGameObject]
- cp b
- jr z, .noTrigger
- ld a, [wTriggeredGameObjectIndex]
- ld [hli], a
- ld a, [wTriggeredGameObject]
- ld [hl], a
- scf
- ret
-
-.noTrigger
- and a
- ret
-
-CheckGameObjectCollision: ; 0x27a4
-; Checks if any of the given game objects are colliding with the pinball.
-; Saves information about which game object was collided.
-; Sets carry flag if a game object was collided.
-; Input: hl = pointer to game object struct with the following format:
-; [x distance][y distance] (defines bounding box for the following list of objects)
-; [game object id][object x][object y] (terminate this list with $FF)
- xor a
- ld [wTriggeredGameObjectIndex], a
- ld a, [hli] ; x distance threshold
- ld d, a
- ld a, [hli] ; y distance threshold
- ld e, a
- ld a, [wBallXPos + 1]
- ld b, a
- ld a, [wBallYPos + 1]
- ld c, a
-.loop
- ld a, [wTriggeredGameObjectIndex]
- inc a
- ld [wTriggeredGameObjectIndex], a
- ld a, [hli]
- ld [wTriggeredGameObject], a
- cp $ff
- ret z
- ld a, [hli]
- sub b
- bit 7, a
- jr z, .compareXDifference
- cpl ; calculate absolute value of the difference
- inc a
-.compareXDifference
- cp d
- ld a, [hli]
- jr nc, .loop
- sub c
- bit 7, a
- jr z, .compareYDifference
- cpl ; calculate absolute value of the difference
- inc a
-.compareYDifference
- cp e
- jr nc, .loop
- scf
- ret
-
-IsCollisionInList: ; 0x27da
-; Checks if the pinball's current collision attribute is in the given list.
-; Input: hl = pointer to list of collision attributes, terminated by $FF.
-; Output: Sets carry flag if the attribute is in the list.
-; First byte in list is 0 if the list is independent of the stage's current collision state (Red stage's
-; top section changes during gameply.)
- ld a, [hli]
- and a
- jr z, .checkList
- dec hl
- ld a, [wStageCollisionState]
- ld c, a
- ld b, $0
- add hl, bc
- ld c, [hl]
- add hl, bc
-.checkList
- ld a, [wd7e9]
- and a
- ret z
- ld a, [wCurCollisionAttribute]
- ld b, a
- ld c, -1 ; This saves the list offset in C, but the result isn't used by any callers of this routine.
-.loop
- inc c
- ld a, [hli]
- cp $ff
- ret z
- cp b
- jr nz, .loop
- scf
- ret
-
-PinballCollidesWithPoints: ; 0x27fd
-; Checks if pinball collides with any of the (x, y) points in the given list.
-; Saves the index of the collided point.
-; Input: hl = pointer to array of (x, y) points
-; Output: Saves index of collided point in wd578
- ld a, [wBallXPos + 1]
- ld b, a
- ld a, [wBallYPos + 1]
- ld c, a
- ld d, $0
-.nextPoint
- ld a, [hli]
- and a
- ret z
- inc d
- ld a, [hli]
- sub b
- cp $e8
- ld a, [hli]
- jr c, .nextPoint
- sub c
- cp $e8
- jr c, .nextPoint
- ld a, d
- ld [wd578], a
- ret
+INCLUDE "engine/pinball_game/object_collision/object_collision.asm"
Func_281c: ; 0x281c
ld a, [wCurrentStage]
diff --git a/main.asm b/main.asm
index 92d815e..f69a8ef 100755
--- a/main.asm
+++ b/main.asm
@@ -1385,7 +1385,7 @@ Data_13685: ; 0x13685
SECTION "bank5", ROMX, BANK[$5]
INCLUDE "engine/pinball_game/load_stage_data/load_red_field.asm"
-INCLUDE "engine/collision/red_stage_game_object_collision.asm"
+INCLUDE "engine/pinball_game/object_collision/red_stage_object_collision.asm"
Func_1460e: ; 0x1460e
call ResolveVoltorbCollision
@@ -10142,257 +10142,7 @@ INCLUDE "engine/pinball_game/draw_sprites/draw_unused_stage_sprites.asm"
INCLUDE "engine/pinball_game/stage_init/init_gengar_bonus.asm"
INCLUDE "engine/pinball_game/ball_init/ball_init_gengar_bonus.asm"
INCLUDE "engine/pinball_game/load_stage_data/load_gengar_bonus.asm"
-
-CheckGengarBonusStageGameObjectCollisions: ; 0x181b1
- call CheckGengarBonusStageGastlyCollision
- call CheckGengarBonusStageHaunterCollision
- call CheckGengarBonusStageGengarCollision
- call GengarBonusStageGravestonesCollision
- ret
-
-CheckGengarBonusStageGastlyCollision: ; 0x181be
- ld a, [wd659]
- and a
- ret z
- ld a, [wGastly1XPos + 1]
- ld b, a
- ld a, [wGastly1YPos + 1]
- add $10
- ld c, a
- ld a, [wGastly1AnimationState]
- call CheckSingleGastlyCollision
- ld a, $1
- jr c, .hitGastly
- ld a, [wGastly2XPos + 1]
- ld b, a
- ld a, [wGastly2YPos + 1]
- add $10
- ld c, a
- ld a, [wGastly2AnimationState]
- call CheckSingleGastlyCollision
- ld a, $2
- jr c, .hitGastly
- ld a, [wGastly3XPos + 1]
- ld b, a
- ld a, [wGastly3YPos + 1]
- add $10
- ld c, a
- ld a, [wGastly3AnimationState]
- call CheckSingleGastlyCollision
- ld a, $3
- ret nc
-.hitGastly
- ld [wTriggeredGameObjectIndex], a
- ld [wd657], a
- add $4
- ld [wTriggeredGameObject], a
- ld [wd658], a
- ret
-
-CheckSingleGastlyCollision: ; 0x1820d
- cp $4
- jr z, .noCollision
- ld a, [wBallXPos + 1]
- sub b
- cp $20
- jr nc, .noCollision
- ld b, a
- ld a, [wBallYPos + 1]
- sub c
- cp $20
- jr nc, .noCollision
- ld c, a
- ld e, c
- ld d, $0
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- ld l, b
- ld h, $0
- add hl, de
- ld de, CircularCollisionAngles
- add hl, de
- ld a, BANK(CircularCollisionAngles)
- call ReadByteFromBank
- bit 7, a
- jr nz, .noCollision
- sla a
- ld [wCollisionForceAngle], a
- ld a, $1
- ld [wd7e9], a
- scf
- ret
-
-.noCollision
- and a
- ret
-
-CheckGengarBonusStageHaunterCollision: ; 0x18259
- ld a, [wd67e]
- and a
- ret z
- ld a, [wHaunter1XPos + 1]
- add $fe
- ld b, a
- ld a, [wHaunter1YPos + 1]
- add $c
- ld c, a
- ld a, [wHaunter1AnimationState]
- call CheckSingleHaunterCollision
- ld a, $1
- jr c, .hitHaunter
- ld a, [wHaunter2XPos + 1]
- add $fe
- ld b, a
- ld a, [wHaunter2YPos + 1]
- add $c
- ld c, a
- ld a, [wHaunter2AnimationState]
- call CheckSingleHaunterCollision
- ld a, $2
- ret nc
-.hitHaunter
- ld [wTriggeredGameObjectIndex], a
- ld [wd67c], a
- add $7
- ld [wTriggeredGameObject], a
- ld [wd67d], a
- ret
-
-CheckSingleHaunterCollision: ; 0x18298
- cp $5
- jr z, .noCollision
- ld a, [wBallXPos + 1]
- sub b
- cp $20
- jr nc, .noCollision
- ld b, a
- ld a, [wBallYPos + 1]
- sub c
- cp $28
- jr nc, .noCollision
- ld c, a
- ld e, c
- ld d, $0
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- ld l, b
- ld h, $0
- add hl, de
- ld de, HaunterCollisionAngles
- add hl, de
- ld a, BANK(HaunterCollisionAngles)
- call ReadByteFromBank
- bit 7, a
- jr nz, .noCollision
- sla a
- ld [wCollisionForceAngle], a
- ld a, $1
- ld [wd7e9], a
- scf
- ret
-
-.noCollision
- and a
- ret
-
-CheckGengarBonusStageGengarCollision: ; 0x182e4
- ld a, [wd698]
- and a
- ret z
- ld a, [wGengarXPos + 1]
- ld b, a
- ld a, [wGengarYPos + 1]
- add $c
- ld c, a
- call CheckGiantGengarCollision
- ld a, $1
- ret nc
- ld [wTriggeredGameObjectIndex], a
- ld [wd696], a
- add $9
- ld [wTriggeredGameObject], a
- ld [wd697], a
- ret
-
-CheckGiantGengarCollision: ; 0x18308
- ld a, [wBallXPos + 1]
- sub b
- cp $30
- jr nc, .noCollision
- ld b, a
- ld a, [wBallYPos + 1]
- sub c
- cp $40
- jr nc, .noCollision
- ld c, a
- ld a, c
- sla a
- add c
- ld e, a
- ld d, $0
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- ld l, b
- ld h, $0
- add hl, de
- ld de, GengarCollisionAngles
- add hl, de
- ld a, BANK(GengarCollisionAngles)
- call ReadByteFromBank
- bit 7, a
- jr nz, .noCollision
- sla a
- ld [wCollisionForceAngle], a
- ld a, $1
- ld [wd7e9], a
- scf
- ret
-
-.noCollision
- and a
- ret
-
-GengarBonusStageGravestonesCollision: ; 0x18350
- ld de, GengarBonusStageGravestonesCollisionData
- ld hl, GengarBonusStageGravestonesCollisionAttributes
- ld bc, wWhichGravestone
- and a
- jp HandleGameObjectCollision
-
-GengarBonusStageGravestonesCollisionAttributes:
- db $00 ; flat list
- db $19, $1A, $1B, $1C, $27, $1D, $1E, $1F, $20
- db $FF ; terminator
-
-GengarBonusStageGravestonesCollisionData:
- db $11, $11
- db $01, $24, $52
- db $02, $44, $3A
- db $03, $74, $5A
- db $04, $7C, $32
- db $FF ; terminator
+INCLUDE "engine/pinball_game/object_collision/gengar_bonus_object_collision.asm"
Func_18377: ; 0x18377
call Func_18464
@@ -12282,196 +12032,7 @@ INCLUDE "engine/pinball_game/draw_sprites/draw_gengar_bonus_sprites.asm"
INCLUDE "engine/pinball_game/stage_init/init_mewtwo_bonus.asm"
INCLUDE "engine/pinball_game/ball_init/ball_init_mewtwo_bonus.asm"
INCLUDE "engine/pinball_game/load_stage_data/load_mewtwo_bonus.asm"
-
-CheckMewtwoBonusStageGameObjectCollisions: ; 0x19330
- call Func_19414
- call Func_19337
- ret
-
-Func_19337: ; 0x19337
- ld hl, wd6bb
- ld bc, $0601
-.asm_1933d
- push bc
- push hl
- ld a, [hli]
- add $f8
- ld b, a
- ld a, [hld]
- add $8
- ld c, a
- dec hl
- dec hl
- dec hl
- ld a, [hl]
- dec hl
- dec hl
- bit 0, [hl]
- call nz, Func_1936f
- pop hl
- pop bc
- ld a, c
- jr c, .asm_19360
- ld de, $0008
- add hl, de
- inc c
- dec b
- jr nz, .asm_1933d
- ret
-
-.asm_19360
- ld [wTriggeredGameObjectIndex], a
- ld [wd6b4], a
- add $0
- ld [wTriggeredGameObject], a
- ld [wd6b5], a
- ret
-
-Func_1936f: ; 0x1936f
- cp $b
- jp z, Func_19412
- ld a, [wBallXPos + 1]
- sub b
- cp $20
- jp nc, Func_19412
- ld b, a
- ld a, [wBallYPos + 1]
- sub c
- cp $20
- jp nc, Func_19412
- ld c, a
- ld e, a
- ld d, $0
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- ld l, b
- ld h, $0
- add hl, de
- sla l
- rl h
- sla l
- rl h
- ld de, BallPhysicsData_e4000
- add hl, de
- ld de, wBallXVelocity
- ld a, BANK(BallPhysicsData_e4000)
- call ReadByteFromBank
- ld c, a
- ld a, [de]
- add c
- ld [de], a
- inc de
- inc hl
- ld a, BANK(BallPhysicsData_e4000)
- call ReadByteFromBank
- ld b, a
- ld a, [de]
- adc b
- ld [de], a
- inc de
- inc hl
- push bc
- ld a, BANK(BallPhysicsData_e4000)
- call ReadByteFromBank
- ld c, a
- ld a, [de]
- add c
- ld [de], a
- inc de
- inc hl
- ld a, BANK(BallPhysicsData_e4000)
- call ReadByteFromBank
- ld b, a
- ld a, [de]
- adc b
- ld [de], a
- inc de
- inc hl
- bit 7, b
- jr z, .asm_193ea
- ld a, c
- cpl
- ld c, a
- ld a, b
- cpl
- ld b, a
- inc bc
-.asm_193ea
- pop hl
- bit 7, h
- jr z, .asm_193f6
- ld a, l
- cpl
- ld l, a
- ld a, h
- cpl
- ld h, a
- inc hl
-.asm_193f6
- add hl, bc
- sla l
- rl h
- ld a, h
- cp $2
- jr c, .asm_19410
- ld a, [wd804]
- and a
- jr nz, .asm_19410
- ld a, $5
- ld [wd803], a
- ld a, $8
- ld [wd804], a
-.asm_19410
- scf
- ret
-
-Func_19412: ; 0x19312
- and a
- ret
-
-Func_19414: ; 0x19414
- ld a, [wTriggeredGameObject]
- inc a
- jr nz, .asm_1944f
- ld a, [wd6aa]
- bit 7, a
- jr nz, .asm_1944f
- ld a, [wd7e9]
- and a
- ret z
- ld a, [wCurCollisionAttribute]
- sub $10
- ret c
- cp $c
- ret nc
- ld a, $1
- ld [wTriggeredGameObjectIndex], a
- add $6
- ld [wTriggeredGameObject], a
- ld b, a
- ld hl, wd6aa
- ld [hl], $0
- ld a, [wPreviousTriggeredGameObject]
- cp b
- jr z, .asm_1944f
- ld a, [wTriggeredGameObjectIndex]
- ld [hli], a
- ld a, [wTriggeredGameObject]
- ld [hl], a
- scf
- ret
-
-.asm_1944f
- and a
- ret
+INCLUDE "engine/pinball_game/object_collision/mewtwo_bonus_object_collision.asm"
Func_19451: ; 0x19451
call Func_19531
@@ -13228,123 +12789,7 @@ INCLUDE "engine/pinball_game/draw_sprites/draw_mewtwo_bonus_sprites.asm"
INCLUDE "engine/pinball_game/stage_init/init_diglett_bonus.asm"
INCLUDE "engine/pinball_game/ball_init/ball_init_diglett_bonus.asm"
INCLUDE "engine/pinball_game/load_stage_data/load_diglett_bonus.asm"
-
-CheckDiglettBonusStageGameObjectCollisions: ; 0x19ab3
- call CheckDiglettBonusStageDiglettHeadsCollision
- call CheckDiglettBonusStageDugtrioCollision
- ret
-
-CheckDiglettBonusStageDiglettHeadsCollision: ; 0x19aba
- ld a, [wTriggeredGameObject]
- inc a
- jr nz, .asm_19b16
- ld a, [wd73b]
- bit 7, a
- jr nz, .asm_19b16
- ld a, [wd7e9]
- and a
- ret z ; is a collision happening?
- ld a, [wCurCollisionAttribute]
- sub $19
- ret c ; is the pinball colliding with a Diglett head?
- cp $33
- ret nc
- ld c, a
- ld b, $0
- ld hl, Data_19b18
- add hl, bc
- ld a, [hl]
- cp $a
- jr nc, .asm_19aed
- ld a, [wBallXPos + 1]
- cp $48
- ld a, $11
- jr nc, .asm_19af7
- xor a
- jr .asm_19af7
-
-.asm_19aed
- ld a, [wBallXPos + 1]
- cp $68
- ld a, $11
- jr nc, .asm_19af7
- xor a
-.asm_19af7
- add [hl]
- ld [wTriggeredGameObjectIndex], a
- add $0
- ld [wTriggeredGameObject], a
- ld b, a
- ld hl, wd73b
- ld [hl], $0
- ld a, [wPreviousTriggeredGameObject]
- cp b
- jr z, .asm_19b16
- ld a, [wTriggeredGameObjectIndex]
- ld [hli], a
- ld a, [wTriggeredGameObject]
- ld [hl], a
- scf
- ret
-
-.asm_19b16
- and a
- ret
-
-Data_19b18:
- db $01, $01, $01
- db $02, $02, $02
- db $03, $03, $03
- db $04, $04, $04
- db $05, $05, $05
- db $06, $06, $06
- db $07, $07, $07
- db $08, $08, $08
- db $09, $09, $09
- db $0A, $0A, $0A
- db $0B, $0B, $0B
- db $0C, $0C, $0C
- db $0D, $0D, $0D
- db $0E, $0E, $0E
- db $0F, $0F, $0F
- db $10, $10, $10
- db $11, $11, $11
-
-CheckDiglettBonusStageDugtrioCollision: ; 0x19b4b
- ld a, [wTriggeredGameObject]
- inc a
- jr nz, .asm_19b86
- ld a, [wd75f]
- bit 7, a
- jr nz, .asm_19b86
- ld a, [wd7e9]
- and a
- ret z
- ld a, [wCurCollisionAttribute]
- sub $14
- ret c
- cp $5
- ret nc
- ld a, $1
- ld [wTriggeredGameObjectIndex], a
- add $1f
- ld [wTriggeredGameObject], a
- ld b, a
- ld hl, wd75f
- ld [hl], $0
- ld a, [wPreviousTriggeredGameObject]
- cp b
- jr z, .asm_19b86
- ld a, [wTriggeredGameObjectIndex]
- ld [hli], a
- ld a, [wTriggeredGameObject]
- ld [hl], a
- scf
- ret
-
-.asm_19b86
- and a
- ret
+INCLUDE "engine/pinball_game/object_collision/diglett_bonus_object_collision.asm"
Func_19b88: ; 0x19b88
call Func_19c52
@@ -14137,7 +13582,7 @@ SECTION "bank7", ROMX, BANK[$7]
INCLUDE "engine/pinball_game/stage_init/init_blue_field.asm"
INCLUDE "engine/pinball_game/ball_init/ball_init_blue_field.asm"
INCLUDE "engine/pinball_game/load_stage_data/load_blue_field.asm"
-INCLUDE "engine/collision/blue_stage_game_object_collision.asm"
+INCLUDE "engine/pinball_game/object_collision/blue_stage_object_collision.asm"
Func_1c715: ; 0x1c715
call ResolveShellderCollision
@@ -24318,275 +23763,7 @@ SECTION "bank9", ROMX, BANK[$9]
INCLUDE "engine/pinball_game/stage_init/init_meowth_bonus.asm"
INCLUDE "engine/pinball_game/ball_init/ball_init_meowth_bonus.asm"
INCLUDE "engine/pinball_game/load_stage_data/load_meowth_bonus.asm"
-
-CheckMeowthBonusStageGameObjectCollisions: ; 0x2414d
- call CheckMeowthBonusStageMeowthCollision
- call CheckMeowthBonusStageJewelsCollision
- call CheckMeowthBonusStageJewelsCollision2
- ret
-
-CheckMeowthBonusStageMeowthCollision: ; 0x24157
- ld a, [wd6e7]
- cp $0
- ret nz
- ld a, [wMeowthXPosition]
- add -9
- ld b, a
- ld a, [wMeowthYPosition]
- add $6
- ld c, a
- call CheckMeowthCollision
- ld a, $3
- ret nc
- ret
-
-CheckMeowthCollision: ; 0x24170
- ld a, [wBallXPos + 1]
- sub b
- cp $30
- jp nc, .noCollision
- ld b, a
- ld a, [wBallYPos + 1]
- sub c
- cp $28
- jp nc, .noCollision
- ld c, a
- ld e, c
- ld d, $0
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- ld h, d
- ld l, e
- sla e
- rl d
- add hl, de
- ld d, h
- ld e, l
- sla e
- rl d
- ld l, b
- ld h, $0
- add hl, de
- ld de, MeowthCollisionAngles
- add hl, de
- ld a, BANK(MeowthCollisionAngles)
- call ReadByteFromBank
- bit 7, a
- jr nz, .noCollision
- sla a
- ld [wCollisionForceAngle], a
- ld a, $1
- ld [wd7e9], a
- ld a, [wd6ec]
- cp $2
- ret z
- cp $3
- ret z
- ld a, [wd713]
- and a
- ret nz
- ld a, [wMeowthYMovement]
- and a
- jr z, .asm_241ed
- ld a, [wMeowthYMovement]
- cp $1
- jr nz, .asm_241df
- ld a, [wd70b]
- cp $3
- jr z, .asm_241eb
- jr .asm_241e6
-
-.asm_241df
- ld a, [wd70c]
- cp $3
- jr z, .asm_241eb
-.asm_241e6
- ld a, $2
- ld [wd6e7], a
-.asm_241eb
- scf
- ret
-
-.asm_241ed
- ld a, [wMeowthYPosition]
- cp $20
- jr nz, .asm_241fd
- ld a, [wd70b]
- cp $3
- jr z, .asm_24210
- jr .asm_2420b
-
-.asm_241fd
- ld a, [wMeowthYPosition]
- cp $10
- jr nz, .asm_24210
- ld a, [wd70c]
- cp $3
- jr z, .asm_24210
-.asm_2420b
- ld a, $1
- ld [wd6e7], a
-.asm_24210
- scf
- ret
-
-.noCollision
- and a
- ret
-
-CheckMeowthBonusStageJewelsCollision: ; 0x24214
- ld a, [wd717]
- cp $2
- jr nz, .asm_2422e
- ld a, [wd71a]
- sub $4
- ld b, a
- ld a, [wd727]
- add $c
- ld c, a
- call CheckJewelCollision
- ld a, $0
- jr c, .asm_24260
-.asm_2422e
- ld a, [wd718]
- cp $2
- jr nz, .asm_24248
- ld a, [wd71b]
- sub $4
- ld b, a
- ld a, [wd728]
- add $c
- ld c, a
- call CheckJewelCollision
- ld a, $1
- jr c, .asm_24260
-.asm_24248
- ld a, [wd719]
- cp $2
- ret nz
- ld a, [wd71c]
- sub $4
- ld b, a
- ld a, [wd729]
- add $c
- ld c, a
- call CheckJewelCollision
- ld a, $2
- ret nc
-.asm_24260
- ld b, $0
- ld c, a
- ld hl, wd717
- add hl, bc
- ld a, $3
- ld [hl], a
- ld hl, wd714
- add hl, bc
- ld a, $0
- ld [hl], a
- ret
-
-CheckJewelCollision: ; 0x24272
- ld a, [wBallXPos + 1]
- sub b
- cp $18
- jr nc, .noCollision
- ld b, a
- ld a, [wBallYPos + 1]
- sub c
- cp $18
- jr nc, .noCollision
- ld c, a
- ld e, c
- ld d, $0
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- ld h, d
- ld l, e
- sla e
- rl d
- add hl, de
- ld d, h
- ld e, l
- ld l, b
- ld h, $0
- add hl, de
- ld de, MeowthJewelCollisionAngles
- add hl, de
- ld a, BANK(MeowthJewelCollisionAngles)
- call ReadByteFromBank
- bit 7, a
- jr nz, .noCollision
- sla a
- ld [wCollisionForceAngle], a
- ld a, $1
- ld [wd7e9], a
- scf
- ret
-
-.noCollision
- and a
- ret
-
-CheckMeowthBonusStageJewelsCollision2: ; 0x242bb
- ld a, [wd721]
- cp $2
- jr nz, .asm_242d5
- ld a, [wd724]
- sub $4
- ld b, a
- ld a, [wd731]
- add $c
- ld c, a
- call CheckJewelCollision
- ld a, $0
- jr c, .asm_24307
-.asm_242d5
- ld a, [wd722]
- cp $2
- jr nz, .asm_242ef
- ld a, [wd725]
- sub $4
- ld b, a
- ld a, [wd732]
- add $c
- ld c, a
- call CheckJewelCollision
- ld a, $1
- jr c, .asm_24307
-.asm_242ef
- ld a, [wd723]
- cp $2
- ret nz
- ld a, [wd726]
- sub $4
- ld b, a
- ld a, [wd733]
- add $c
- ld c, a
- call CheckJewelCollision
- ld a, $2
- ret nc
-.asm_24307
- ld b, $0
- ld c, a
- ld hl, wd721
- add hl, bc
- ld a, $3
- ld [hl], a
- ld hl, wd71e
- add hl, bc
- ld a, $0
- ld [hl], a
- ret
+INCLUDE "engine/pinball_game/object_collision/meowth_bonus_object_collision.asm"
Func_24319: ; 0x2438f
ld a, [wd6f4]
@@ -28133,98 +27310,7 @@ INCLUDE "engine/pinball_game/draw_sprites/draw_meowth_bonus_sprites.asm"
INCLUDE "engine/pinball_game/stage_init/init_seel_bonus.asm"
INCLUDE "engine/pinball_game/ball_init/ball_init_seel_bonus.asm"
INCLUDE "engine/pinball_game/load_stage_data/load_seel_bonus.asm"
-
-CheckSeelBonusStageGameObjectCollisions: ; 0x25bbc
- call CheckSeelBonusStageSeelHeadCollisions
- ret
-
-CheckSeelBonusStageSeelHeadCollisions: ; 0x25bc0
- ld a, [wd76c]
- cp $0
- jr nz, .seel2
- ld a, [wd76e]
- ld b, a
- ld a, [wd770]
- add $14
- ld c, a
- call CheckSeelHeadCollision
- ld a, $0
- jr c, .hitSeelHead
-.seel2
- ld a, [wd776]
- cp $0
- jr nz, .seel3
- ld a, [wd778]
- ld b, a
- ld a, [wd77a]
- add $14
- ld c, a
- call CheckSeelHeadCollision
- ld a, $1
- jr c, .hitSeelHead
-.seel3
- ld a, [wd780]
- cp $0
- jr nz, .done
- ld a, [wd782]
- ld b, a
- ld a, [wd784]
- add $14
- ld c, a
- call CheckSeelHeadCollision
- ld a, $2
- jr c, .hitSeelHead
-.done
- ret
-
-.hitSeelHead
- ld [wd768], a
- ld a, $1
- ld [wd767], a
- ret
-
-CheckSeelHeadCollision: ; 0x25c12
- ld a, [wBallXPos + 1]
- sub b
- cp $20
- jr nc, .noCollision
- ld b, a
- ld a, [wBallYPos + 1]
- sub c
- cp $20
- jr nc, .noCollision
- ld c, a
- ld e, c
- ld d, $0
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- sla e
- rl d
- ld l, b
- ld h, $0
- add hl, de
- ld de, CircularCollisionAngles
- add hl, de
- ld a, BANK(CircularCollisionAngles)
- call ReadByteFromBank
- bit 7, a
- jr nz, .noCollision
- sla a
- ld [wCollisionForceAngle], a
- ld a, $1
- ld [wd7e9], a
- scf
- ret
-
-.noCollision
- and a
- ret
+INCLUDE "engine/pinball_game/object_collision/seel_bonus_object_collision.asm"
Func_25c5a: ; 0x25c5a
call Func_25da3