From 7a2ab3fc1dc428a5405b29680de22013ce0d7da8 Mon Sep 17 00:00:00 2001 From: lahm86 <33758420+lahm86@users.noreply.github.com> Date: Sat, 1 Feb 2025 12:46:17 +0000 Subject: [PATCH] camera: create in-game cinematic invoker utility This introduces a utility function for invoking an in-game cinematic to reduce some code repetition. --- src/libtrx/game/camera/cinematic.c | 11 +++++++++++ src/libtrx/include/libtrx/game/camera/cinematic.h | 3 +++ src/tr1/game/objects/general/scion1.c | 6 +----- src/tr1/game/objects/general/scion4.c | 6 +----- src/tr1/game/objects/traps/midas_touch.c | 6 +----- src/tr2/game/lara/control.c | 6 +----- src/tr2/game/objects/creatures/dragon.c | 6 +----- src/tr2/game/objects/general/final_level_counter.c | 6 +----- 8 files changed, 20 insertions(+), 30 deletions(-) diff --git a/src/libtrx/game/camera/cinematic.c b/src/libtrx/game/camera/cinematic.c index ab281df5c..02b747842 100644 --- a/src/libtrx/game/camera/cinematic.c +++ b/src/libtrx/game/camera/cinematic.c @@ -1,4 +1,5 @@ #include "game/camera/types.h" +#include "game/camera/vars.h" #include "game/game_buf.h" static CINE_FRAME *m_CineFrames = NULL; @@ -30,3 +31,13 @@ CINE_DATA *Camera_GetCineData(void) { return &m_CineData; } + +void Camera_InvokeCinematic( + const ITEM *const item, const int32_t frame_idx, const int16_t extra_y_rot) +{ + g_Camera.type = CAM_CINEMATIC; + m_CineData.frame_idx = frame_idx; + m_CineData.position.pos = item->pos; + m_CineData.position.rot = item->rot; + m_CineData.position.rot.y += extra_y_rot; +} diff --git a/src/libtrx/include/libtrx/game/camera/cinematic.h b/src/libtrx/include/libtrx/game/camera/cinematic.h index fe5d4a533..a382117c9 100644 --- a/src/libtrx/include/libtrx/game/camera/cinematic.h +++ b/src/libtrx/include/libtrx/game/camera/cinematic.h @@ -1,8 +1,11 @@ #pragma once +#include "../items/types.h" #include "./types.h" void Camera_InitialiseCineFrames(int32_t num_frames); CINE_FRAME *Camera_GetCineFrame(int32_t frame_idx); CINE_FRAME *Camera_GetCurrentCineFrame(void); CINE_DATA *Camera_GetCineData(void); +void Camera_InvokeCinematic( + const ITEM *item, int32_t frame_idx, int16_t extra_y_rot); diff --git a/src/tr1/game/objects/general/scion1.c b/src/tr1/game/objects/general/scion1.c index af26a3992..b31d52128 100644 --- a/src/tr1/game/objects/general/scion1.c +++ b/src/tr1/game/objects/general/scion1.c @@ -76,11 +76,7 @@ void Scion1_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll) Item_SwitchToObjAnim( lara_item, EXTRA_ANIM_PEDESTAL_SCION, 0, O_LARA_EXTRA); g_Lara.gun_status = LGS_HANDS_BUSY; - g_Camera.type = CAM_CINEMATIC; - CINE_DATA *const cine_data = Camera_GetCineData(); - cine_data->frame_idx = 0; - cine_data->position.pos = lara_item->pos; - cine_data->position.rot.y = lara_item->rot.y; + Camera_InvokeCinematic(lara_item, 0, 0); } cleanup: item->rot.x = rotx; diff --git a/src/tr1/game/objects/general/scion4.c b/src/tr1/game/objects/general/scion4.c index 4f652d485..9fd4f28df 100644 --- a/src/tr1/game/objects/general/scion4.c +++ b/src/tr1/game/objects/general/scion4.c @@ -64,11 +64,7 @@ void Scion4_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll) Item_SwitchToObjAnim( lara_item, EXTRA_ANIM_HOLDER_SCION, 0, O_LARA_EXTRA); g_Lara.gun_status = LGS_HANDS_BUSY; - g_Camera.type = CAM_CINEMATIC; - CINE_DATA *const cine_data = Camera_GetCineData(); - cine_data->frame_idx = 0; - cine_data->position.pos = lara_item->pos; - cine_data->position.rot.y = lara_item->rot.y - DEG_90; + Camera_InvokeCinematic(lara_item, 0, -DEG_90); } cleanup: item->rot.x = rotx; diff --git a/src/tr1/game/objects/traps/midas_touch.c b/src/tr1/game/objects/traps/midas_touch.c index 362b66f7f..0ee87d299 100644 --- a/src/tr1/game/objects/traps/midas_touch.c +++ b/src/tr1/game/objects/traps/midas_touch.c @@ -92,11 +92,7 @@ void MidasTouch_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll) g_Lara.air = -1; g_Lara.gun_status = LGS_HANDS_BUSY; g_Lara.gun_type = LGT_UNARMED; - g_Camera.type = CAM_CINEMATIC; - CINE_DATA *const cine_data = Camera_GetCineData(); - cine_data->frame_idx = 0; - cine_data->position.pos = lara_item->pos; - cine_data->position.rot.y = lara_item->rot.y; + Camera_InvokeCinematic(lara_item, 0, 0); return; } diff --git a/src/tr2/game/lara/control.c b/src/tr2/game/lara/control.c index 845e958b9..7bb72b174 100644 --- a/src/tr2/game/lara/control.c +++ b/src/tr2/game/lara/control.c @@ -824,11 +824,7 @@ void Lara_Initialise(const GF_LEVEL *const level) item->goal_anim_state = g_GF_LaraStartAnim; Lara_Animate(item); g_Lara.extra_anim = 1; - g_Camera.type = CAM_CINEMATIC; - CINE_DATA *const cine_data = Camera_GetCineData(); - cine_data->frame_idx = 0; - cine_data->position.pos = item->pos; - cine_data->position.rot = item->rot; + Camera_InvokeCinematic(item, 0, 0); } else if ((g_Rooms[item->room_num].flags & RF_UNDERWATER)) { g_Lara.water_status = LWS_UNDERWATER; item->fall_speed = 0; diff --git a/src/tr2/game/objects/creatures/dragon.c b/src/tr2/game/objects/creatures/dragon.c index 6deb9bb3e..5320d2a12 100644 --- a/src/tr2/game/objects/creatures/dragon.c +++ b/src/tr2/game/objects/creatures/dragon.c @@ -118,11 +118,7 @@ static void M_PullDagger(ITEM *const lara_item, ITEM *const dragon_back_item) Lara_SwapSingleMesh(LM_HAND_R, O_LARA_EXTRA); - g_Camera.type = CAM_CINEMATIC; - CINE_DATA *const cine_data = Camera_GetCineData(); - cine_data->frame_idx = 0; - cine_data->position.pos = lara_item->pos; - cine_data->position.rot = lara_item->rot; + Camera_InvokeCinematic(lara_item, 0, 0); M_MarkDragonDead(dragon_back_item); } diff --git a/src/tr2/game/objects/general/final_level_counter.c b/src/tr2/game/objects/general/final_level_counter.c index 751d5bb92..b7fae68b4 100644 --- a/src/tr2/game/objects/general/final_level_counter.c +++ b/src/tr2/game/objects/general/final_level_counter.c @@ -78,11 +78,7 @@ static void M_PrepareCutscene(const int16_t item_num) ITEM *const item = &g_Items[item_num]; Creature_Kill(item, 0, 0, LA_EXTRA_FINAL_ANIM); - g_Camera.type = CAM_CINEMATIC; - CINE_DATA *const cine_data = Camera_GetCineData(); - cine_data->frame_idx = 428; - cine_data->position.pos = item->pos; - cine_data->position.rot = item->rot; + Camera_InvokeCinematic(item, 428, 0); } void FinalLevelCounter_Setup(void)