From a962a17f66db3372869044c79294255353b7ef83 Mon Sep 17 00:00:00 2001 From: Adngel <60930991+Adngel@users.noreply.github.com> Date: Sun, 3 Nov 2024 13:08:59 +0100 Subject: [PATCH] Adngel fix death camera (#1449) * Update function * Adding comments. * Function renamed Function renamed and conditionals separated for clarity. * Extracted Camera data modifications Extracted commands that changes camera data, from the camera code, and moved them into the objects coded to follow similar logic with other cases (like enemies that change these values from their control code). Leaving a simplified CalculateDeathCamera() function. * Update tr5_rollingball.cpp Not really needed, so I removed it to keep consistency with the other calls. Also edited values adding the .0f for same reasons. --- TombEngine/Game/camera.cpp | 24 +++++++++++++++++++ TombEngine/Game/camera.h | 1 + .../Objects/TR4/Trap/tr4_teethspike.cpp | 6 +++++ .../Objects/TR5/Object/tr5_rollingball.cpp | 10 ++++++-- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/TombEngine/Game/camera.cpp b/TombEngine/Game/camera.cpp index d03d35f7f..49414d5ff 100644 --- a/TombEngine/Game/camera.cpp +++ b/TombEngine/Game/camera.cpp @@ -1289,6 +1289,9 @@ void CalculateCamera(const CollisionInfo& coll) Camera.DisableInterpolation = (Camera.DisableInterpolation || Camera.lastType != Camera.type); Camera.lastType = Camera.type; + if (CalculateDeathCamera()) + return; + if (Camera.type != CameraType::Heavy || Camera.timer == -1) { Camera.type = CameraType::Chase; @@ -1304,6 +1307,27 @@ void CalculateCamera(const CollisionInfo& coll) } } +bool CalculateDeathCamera() +{ + // If player is alive, it's not a death camera. + if (LaraItem->HitPoints > 0) + return false; + + // If Lara is in a special death animation (from extra_anims) triggered by enemies. + if (LaraItem->Animation.AnimObjectID == ID_LARA_EXTRA_ANIMS) + return true; + + // Special death animations + if (LaraItem->Animation.AnimNumber == LA_SPIKE_DEATH || + LaraItem->Animation.AnimNumber == LA_BOULDER_DEATH || + LaraItem->Animation.AnimNumber == LA_TRAIN_OVERBOARD_DEATH) + { + return true; + } + + return false; +} + bool TestBoundsCollideCamera(const GameBoundingBox& bounds, const Pose& pose, short radius) { auto sphere = BoundingSphere(Camera.pos.ToVector3(), radius); diff --git a/TombEngine/Game/camera.h b/TombEngine/Game/camera.h index 59db6e4f8..5bf9429cb 100644 --- a/TombEngine/Game/camera.h +++ b/TombEngine/Game/camera.h @@ -105,6 +105,7 @@ void BinocularCamera(ItemInfo* item); void ConfirmCameraTargetPos(); void CalculateCamera(const CollisionInfo& coll); void RumbleScreen(); +bool CalculateDeathCamera(); bool TestBoundsCollideCamera(const GameBoundingBox& bounds, const Pose& pose, short radius); void ItemPushCamera(GameBoundingBox* bounds, Pose* pos, short radius); void ItemsCollideCamera(); diff --git a/TombEngine/Objects/TR4/Trap/tr4_teethspike.cpp b/TombEngine/Objects/TR4/Trap/tr4_teethspike.cpp index 0774e0666..a07bcac0d 100644 --- a/TombEngine/Objects/TR4/Trap/tr4_teethspike.cpp +++ b/TombEngine/Objects/TR4/Trap/tr4_teethspike.cpp @@ -1,6 +1,7 @@ #include "framework.h" #include "Objects/TR4/Trap/tr4_teethspike.h" +#include "Game/camera.h" #include "Game/collision/collide_item.h" #include "Game/collision/collide_room.h" #include "Game/collision/Point.h" @@ -161,6 +162,11 @@ namespace TEN::Entities::Traps { SetAnimation(LaraItem, LA_SPIKE_DEATH); LaraItem->Animation.IsAirborne = false; + + Camera.flags = CF_FOLLOW_CENTER; + Camera.targetAngle = ANGLE(-150.0f); + Camera.targetElevation = ANGLE(-25.0f); + Camera.targetDistance = BLOCK(2); } } } diff --git a/TombEngine/Objects/TR5/Object/tr5_rollingball.cpp b/TombEngine/Objects/TR5/Object/tr5_rollingball.cpp index 5c77a6512..fe7088ff1 100644 --- a/TombEngine/Objects/TR5/Object/tr5_rollingball.cpp +++ b/TombEngine/Objects/TR5/Object/tr5_rollingball.cpp @@ -41,6 +41,11 @@ void RollingBallCollision(short itemNumber, ItemInfo* laraItem, CollisionInfo* c !TestEnvironment(RoomEnvFlags::ENV_FLAG_WATER, laraItem)) { SetAnimation(laraItem, LA_BOULDER_DEATH); + + Camera.flags = CF_FOLLOW_CENTER; + Camera.targetAngle = ANGLE(170.0f); + Camera.targetElevation = ANGLE(-25.0f); + Camera.targetDistance = BLOCK(2); } } else @@ -364,8 +369,9 @@ void ClassicRollingBallCollision(short itemNum, ItemInfo* lara, CollisionInfo* c SetAnimation(lara, LA_BOULDER_DEATH); Camera.flags = CF_FOLLOW_CENTER; - Camera.targetAngle = ANGLE(170); - Camera.targetElevation = -ANGLE(25); + Camera.targetAngle = ANGLE(170.0f); + Camera.targetElevation = -ANGLE(-25.0f); + Camera.targetDistance = BLOCK(2); for (int i = 0; i < 15; i++) {