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++) {