summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2021-05-02 10:13:09 -0500
committerMarcus Huderle <huderlem@gmail.com>2021-05-02 10:13:09 -0500
commitcb19d09186a7beb582b4657ae5098543f0031893 (patch)
tree12692fc510b36c2371a0e30bf89981c3ff4b3a18 /engine
parent25773c589bad671338a439cec2015a59587a9fdc (diff)
Cleanup and correct some collision handling logic
Diffstat (limited to 'engine')
-rw-r--r--engine/pinball_game.asm49
-rw-r--r--engine/pinball_game/flippers.asm8
-rw-r--r--engine/pinball_game/object_collision/blue_stage_resolve_collision.asm10
-rw-r--r--engine/pinball_game/object_collision/diglett_bonus_object_collision.asm4
-rw-r--r--engine/pinball_game/object_collision/gengar_bonus_object_collision.asm12
-rw-r--r--engine/pinball_game/object_collision/meowth_bonus_object_collision.asm8
-rw-r--r--engine/pinball_game/object_collision/mewtwo_bonus_object_collision.asm2
-rw-r--r--engine/pinball_game/object_collision/object_collision.asm2
-rw-r--r--engine/pinball_game/object_collision/red_stage_resolve_collision.asm10
-rw-r--r--engine/pinball_game/object_collision/seel_bonus_object_collision.asm4
10 files changed, 57 insertions, 52 deletions
diff --git a/engine/pinball_game.asm b/engine/pinball_game.asm
index f094e82..86fd199 100644
--- a/engine/pinball_game.asm
+++ b/engine/pinball_game.asm
@@ -70,23 +70,23 @@ GameScreenFunction_HandleBallPhysics: ; 0xd909
; main loop for stage logic
xor a
ld [wFlipperCollision], a
- ld [wd7eb], a
+ ld [wSpinForceAmplification], a
call ApplyGravityToBall
call LimitBallVelocity
xor a
- ld [wd7e9], a
+ ld [wIsBallColliding], a
call HandleTilts
ld a, [wCurrentStage]
bit 0, a
- callba nz, HandleFlippers ; only perform flipper routines on the lower-half of stages
+ callba nz, HandleFlippers ; only perform flipper logic on the lower half of stages
ld a, [wFlipperCollision]
and a
- ld a, [wCollisionForceAngle]
+ ld a, [wCollisionNormalAngle]
push af
- call CheckObjectCollision ; collision stuff
+ call CheckStageCollision
pop af
jr z, .noFlipperCollision
- ld [wCollisionForceAngle], a
+ ld [wCollisionNormalAngle], a
.noFlipperCollision
call CheckGameObjectCollisions
call ResolveGameObjectCollisions
@@ -98,17 +98,20 @@ GameScreenFunction_HandleBallPhysics: ; 0xd909
callba HandleInGameMenu
jp z, SaveGame
.didntPressMenuKey
- ld a, [wd7e9] ; check for collision flag
+ ld a, [wIsBallColliding] ; check for collision flag
and a
- jr z, .skip_collision
+ jr z, .moveBallPosition
call ApplyTiltForces
call LoadBallVelocity ; bc = x velocity, de = y velocity
- ld a, [wCollisionForceAngle]
- call ApplyCollisionForce
- call ApplyTorque
+ ; First, rotate the velocity vector into a standardized coordinate
+ ; system where the normal angle points upwards.
+ ld a, [wCollisionNormalAngle]
+ call RotateVector
+ ; Apply the collision forces to the ball in the rotated coordinate system.
+ call ApplyCollisionForces
ld a, [wFlipperCollision]
and a
- jr z, .not_flippers_2
+ jr z, .noFlipperCollision2
; de -= *wFlipperYForce
ld hl, wFlipperYForce
ld a, [hli]
@@ -131,17 +134,19 @@ GameScreenFunction_HandleBallPhysics: ; 0xd909
ld a, b
adc h
ld b, a
- jr .next
+ jr .updateBallVelocity
-.not_flippers_2
- ld a, [wd7f8]
+.noFlipperCollision2
+ ld a, [wNoCollisionApplied]
and a
- jr nz, .skip_collision
-.next
- ld a, [wCollisionForceAngle]
- call NegateAngleAndApplyCollisionForce
+ jr nz, .moveBallPosition
+.updateBallVelocity
+ ; Rotate the velocity vector back to the regular coordinate system, and
+ ; set the ball's velocity to the resulting vector.
+ ld a, [wCollisionNormalAngle]
+ call NegateAngleAndRotateVector
call SetBallVelocity
-.skip_collision
+.moveBallPosition
call MoveBallPosition
callba CheckStageTransition
callba DrawSpritesForStage
@@ -176,9 +181,9 @@ GameScreenFunction_HandleBallLoss: ; 0xda36
ld [hNewlyPressedButtons], a
ld [hPressedButtons], a
ld [wFlipperCollision], a
- ld [wd7eb], a
+ ld [wSpinForceAmplification], a
xor a
- ld [wd7e9], a
+ ld [wIsBallColliding], a
ld [wPinballIsVisible], a
ld [wEnableBallGravityAndTilt], a
call HandleTilts
diff --git a/engine/pinball_game/flippers.asm b/engine/pinball_game/flippers.asm
index d71419a..4ecc0b1 100644
--- a/engine/pinball_game/flippers.asm
+++ b/engine/pinball_game/flippers.asm
@@ -601,7 +601,7 @@ HandleFlipperCollision: ; 0xe442
; This is called when the ball is colliding with either the
; right or left flipper.
ld a, $1
- ld [wd7e9], a
+ ld [wIsBallColliding], a
xor a
ld [wBallPositionPointerOffsetFromStageTopLeft], a
ld [wBallPositionPointerOffsetFromStageTopLeft + 1], a
@@ -638,9 +638,9 @@ HandleFlipperCollision: ; 0xe442
cpl ; invert the x collision attribute
inc a
.asm_e48b
- ld [wCollisionForceAngle], a
- ld a, $1
- ld [wd7eb], a
+ ld [wCollisionNormalAngle], a
+ ld a, 1
+ ld [wSpinForceAmplification], a
ld a, [wFlipperYForce + 1]
bit 7, a
ret z
diff --git a/engine/pinball_game/object_collision/blue_stage_resolve_collision.asm b/engine/pinball_game/object_collision/blue_stage_resolve_collision.asm
index 6b07d73..3bcc995 100644
--- a/engine/pinball_game/object_collision/blue_stage_resolve_collision.asm
+++ b/engine/pinball_game/object_collision/blue_stage_resolve_collision.asm
@@ -598,9 +598,9 @@ ApplyBumperCollision_BlueField: ; 0x1ce94
ld b, $0
ld hl, BumperCollisionAngleDeltas_BlueField
add hl, bc
- ld a, [wCollisionForceAngle]
+ ld a, [wCollisionNormalAngle]
add [hl]
- ld [wCollisionForceAngle], a
+ ld [wCollisionNormalAngle], a
lb de, $00, $0b
call PlaySoundEffect
ret
@@ -1808,10 +1808,10 @@ AddScorePsyduckOrPoliwag: ; 0x1de22
ret z
ld a, $55
ld [wRumblePattern], a
- ld a, $4
+ ld a, 4
ld [wRumbleDuration], a
- ld a, $2
- ld [wd7eb], a
+ ld a, 2
+ ld [wSpinForceAmplification], a
ld bc, FiveHundredPoints
callba AddBigBCD6FromQueueWithBallMultiplier
lb de, $00, $0f
diff --git a/engine/pinball_game/object_collision/diglett_bonus_object_collision.asm b/engine/pinball_game/object_collision/diglett_bonus_object_collision.asm
index 91e0f82..e9ad851 100644
--- a/engine/pinball_game/object_collision/diglett_bonus_object_collision.asm
+++ b/engine/pinball_game/object_collision/diglett_bonus_object_collision.asm
@@ -10,7 +10,7 @@ CheckDiglettBonusStageDiglettHeadsCollision: ; 0x19aba
ld a, [wd73b]
bit 7, a
jr nz, .asm_19b16
- ld a, [wd7e9]
+ ld a, [wIsBallColliding]
and a
ret z ; is a collision happening?
ld a, [wCurCollisionAttribute]
@@ -86,7 +86,7 @@ CheckDiglettBonusStageDugtrioCollision: ; 0x19b4b
ld a, [wd75f]
bit 7, a
jr nz, .asm_19b86
- ld a, [wd7e9]
+ ld a, [wIsBallColliding]
and a
ret z
ld a, [wCurCollisionAttribute]
diff --git a/engine/pinball_game/object_collision/gengar_bonus_object_collision.asm b/engine/pinball_game/object_collision/gengar_bonus_object_collision.asm
index adf048b..f436b4d 100644
--- a/engine/pinball_game/object_collision/gengar_bonus_object_collision.asm
+++ b/engine/pinball_game/object_collision/gengar_bonus_object_collision.asm
@@ -79,9 +79,9 @@ CheckSingleGastlyCollision: ; 0x1820d
bit 7, a
jr nz, .noCollision
sla a
- ld [wCollisionForceAngle], a
+ ld [wCollisionNormalAngle], a
ld a, $1
- ld [wd7e9], a
+ ld [wIsBallColliding], a
scf
ret
@@ -156,9 +156,9 @@ CheckSingleHaunterCollision: ; 0x18298
bit 7, a
jr nz, .noCollision
sla a
- ld [wCollisionForceAngle], a
+ ld [wCollisionNormalAngle], a
ld a, $1
- ld [wd7e9], a
+ ld [wIsBallColliding], a
scf
ret
@@ -219,9 +219,9 @@ CheckGiantGengarCollision: ; 0x18308
bit 7, a
jr nz, .noCollision
sla a
- ld [wCollisionForceAngle], a
+ ld [wCollisionNormalAngle], a
ld a, $1
- ld [wd7e9], a
+ ld [wIsBallColliding], a
scf
ret
diff --git a/engine/pinball_game/object_collision/meowth_bonus_object_collision.asm b/engine/pinball_game/object_collision/meowth_bonus_object_collision.asm
index 4fc6179..71e326f 100644
--- a/engine/pinball_game/object_collision/meowth_bonus_object_collision.asm
+++ b/engine/pinball_game/object_collision/meowth_bonus_object_collision.asm
@@ -57,9 +57,9 @@ CheckMeowthCollision: ; 0x24170
bit 7, a
jr nz, .noCollision
sla a
- ld [wCollisionForceAngle], a
+ ld [wCollisionNormalAngle], a
ld a, $1
- ld [wd7e9], a
+ ld [wIsBallColliding], a
ld a, [wd6ec]
cp $2
ret z
@@ -205,9 +205,9 @@ CheckJewelCollision: ; 0x24272
bit 7, a
jr nz, .noCollision
sla a
- ld [wCollisionForceAngle], a
+ ld [wCollisionNormalAngle], a
ld a, $1
- ld [wd7e9], a
+ ld [wIsBallColliding], a
scf
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
index 7b15498..d1bdd07 100644
--- a/engine/pinball_game/object_collision/mewtwo_bonus_object_collision.asm
+++ b/engine/pinball_game/object_collision/mewtwo_bonus_object_collision.asm
@@ -159,7 +159,7 @@ Func_19414: ; 0x19414
ld a, [wd6aa]
bit 7, a
jr nz, .asm_1944f
- ld a, [wd7e9]
+ ld a, [wIsBallColliding]
and a
ret z
ld a, [wCurCollisionAttribute]
diff --git a/engine/pinball_game/object_collision/object_collision.asm b/engine/pinball_game/object_collision/object_collision.asm
index 7e4c2ea..b80cddb 100644
--- a/engine/pinball_game/object_collision/object_collision.asm
+++ b/engine/pinball_game/object_collision/object_collision.asm
@@ -125,7 +125,7 @@ IsCollisionInList: ; 0x27da
ld c, [hl]
add hl, bc
.checkList
- ld a, [wd7e9]
+ ld a, [wIsBallColliding]
and a
ret z
ld a, [wCurCollisionAttribute]
diff --git a/engine/pinball_game/object_collision/red_stage_resolve_collision.asm b/engine/pinball_game/object_collision/red_stage_resolve_collision.asm
index 84867d6..d79411c 100644
--- a/engine/pinball_game/object_collision/red_stage_resolve_collision.asm
+++ b/engine/pinball_game/object_collision/red_stage_resolve_collision.asm
@@ -460,10 +460,10 @@ HitLeftDiglett3Times: ; 0x14947
AddScoreForHittingDiglett: ; 0x1496d
ld a, $55
ld [wRumblePattern], a
- ld a, $4
+ ld a, 4
ld [wRumbleDuration], a
- ld a, $2
- ld [wd7eb], a
+ ld a, 2
+ ld [wSpinForceAmplification], a
ld bc, FiveHundredPoints
callba AddBigBCD6FromQueueWithBallMultiplier
lb de, $00, $0f
@@ -1699,9 +1699,9 @@ ApplyBumperCollision_RedField: ; 0x15fda
ld b, $0
ld hl, BumperCollisionAngleDeltas_RedField
add hl, bc
- ld a, [wCollisionForceAngle]
+ ld a, [wCollisionNormalAngle]
add [hl]
- ld [wCollisionForceAngle], a
+ ld [wCollisionNormalAngle], a
lb de, $00, $0b
call PlaySoundEffect
ret
diff --git a/engine/pinball_game/object_collision/seel_bonus_object_collision.asm b/engine/pinball_game/object_collision/seel_bonus_object_collision.asm
index e702dd2..1bf1791 100644
--- a/engine/pinball_game/object_collision/seel_bonus_object_collision.asm
+++ b/engine/pinball_game/object_collision/seel_bonus_object_collision.asm
@@ -80,9 +80,9 @@ CheckSeelHeadCollision: ; 0x25c12
bit 7, a
jr nz, .noCollision
sla a
- ld [wCollisionForceAngle], a
+ ld [wCollisionNormalAngle], a
ld a, $1
- ld [wd7e9], a
+ ld [wIsBallColliding], a
scf
ret