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 | |
parent | 30c5ce5c2093eea360842b4701b36f1bf46c83be (diff) |
Move object collision routines into separate files
-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 | ||||
-rwxr-xr-x | home.asm | 200 | ||||
-rwxr-xr-x | main.asm | 928 |
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
@@ -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] @@ -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 |