diff options
author | Marcus Huderle <huderlem@gmail.com> | 2017-07-02 16:50:30 -0500 |
---|---|---|
committer | Marcus Huderle <huderlem@gmail.com> | 2017-07-02 16:50:30 -0500 |
commit | d73a1f172e520865f8d34a1f2c2ba068e934eb11 (patch) | |
tree | f4b453bb45c6729fa71761f6d7d38dcfe3936653 /engine | |
parent | 30c5ce5c2093eea360842b4701b36f1bf46c83be (diff) |
Move object collision routines into separate files
Diffstat (limited to 'engine')
-rwxr-xr-x | engine/pinball_game/object_collision/blue_stage_object_collision.asm (renamed from engine/collision/blue_stage_game_object_collision.asm) | 0 | ||||
-rwxr-xr-x | engine/pinball_game/object_collision/diglett_bonus_object_collision.asm | 116 | ||||
-rwxr-xr-x | engine/pinball_game/object_collision/gengar_bonus_object_collision.asm | 250 | ||||
-rwxr-xr-x | engine/pinball_game/object_collision/meowth_bonus_object_collision.asm | 268 | ||||
-rwxr-xr-x | engine/pinball_game/object_collision/mewtwo_bonus_object_collision.asm | 189 | ||||
-rwxr-xr-x | engine/pinball_game/object_collision/object_collision.asm | 198 | ||||
-rwxr-xr-x | engine/pinball_game/object_collision/red_stage_object_collision.asm (renamed from engine/collision/red_stage_game_object_collision.asm) | 0 | ||||
-rwxr-xr-x | engine/pinball_game/object_collision/seel_bonus_object_collision.asm | 91 |
8 files changed, 1112 insertions, 0 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
|