diff options
Diffstat (limited to 'engine')
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
|