diff --git a/TR5Main/Game/camera.cpp b/TR5Main/Game/camera.cpp index 133523489..54d8b8373 100644 --- a/TR5Main/Game/camera.cpp +++ b/TR5Main/Game/camera.cpp @@ -57,14 +57,12 @@ CAMERA_INFO Camera; GAME_VECTOR ForcedFixedCamera; int UseForcedFixedCamera; int NumberCameras; -int SniperCameraActive; int BinocularRange; int BinocularOn; CAMERA_TYPE BinocularOldCamera; int LaserSight; int PhdPerspective; short CurrentFOV; -int GetLaraOnLOS; int RumbleTimer = 0; int RumbleCounter = 0; diff --git a/TR5Main/Game/camera.h b/TR5Main/Game/camera.h index 261823405..d9c09a3d7 100644 --- a/TR5Main/Game/camera.h +++ b/TR5Main/Game/camera.h @@ -57,14 +57,12 @@ extern CAMERA_INFO Camera; extern GAME_VECTOR ForcedFixedCamera; extern int UseForcedFixedCamera; extern int NumberCameras; -extern int SniperCameraActive; extern int BinocularRange; extern int BinocularOn; extern CAMERA_TYPE BinocularOldCamera; extern int LaserSight; extern int PhdPerspective; extern short CurrentFOV; -extern int GetLaraOnLOS; void LookAt(CAMERA_INFO* cam, short roll); void AlterFOV(int value); diff --git a/TR5Main/Game/control/control.cpp b/TR5Main/Game/control/control.cpp index 42493f977..04ecafa8c 100644 --- a/TR5Main/Game/control/control.cpp +++ b/TR5Main/Game/control/control.cpp @@ -212,12 +212,12 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode) // Handle lasersight and binocular if (CurrentLevel != 0) { - if (!(TrInput & IN_LOOK) || SniperCameraActive || UseSpotCam || TrackCameraInit || + if (!(TrInput & IN_LOOK) || UseSpotCam || TrackCameraInit || ((LaraItem->currentAnimState != LS_STOP || LaraItem->animNumber != LA_STAND_IDLE) && (!Lara.isDucked || TrInput & IN_DUCK || LaraItem->animNumber != LA_CROUCH_IDLE || LaraItem->goalAnimState != LS_CROUCH_IDLE))) { if (BinocularRange == 0) { - if (SniperCameraActive || UseSpotCam || TrackCameraInit) + if (UseSpotCam || TrackCameraInit) TrInput &= ~IN_LOOK; } else diff --git a/TR5Main/Game/control/los.cpp b/TR5Main/Game/control/los.cpp index 0c0c07181..ec0d77e63 100644 --- a/TR5Main/Game/control/los.cpp +++ b/TR5Main/Game/control/los.cpp @@ -298,26 +298,19 @@ int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firi return hit; } -int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INFO** mesh) +int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INFO** mesh, GAME_OBJECT_ID priorityObject) { - int r, m; - ROOM_INFO* room; - short linknum; - ITEM_INFO* item; - PHD_3DPOS pos; - MESH_INFO* meshp; - BOUNDING_BOX* box; - ClosestItem = NO_LOS_ITEM; ClosestDist = SQUARE(end->x - start->x) + SQUARE(end->y - start->y) + SQUARE(end->z - start->z); - for (r = 0; r < NumberLosRooms; ++r) + for (int r = 0; r < NumberLosRooms; ++r) { - room = &g_Level.Rooms[LosRooms[r]]; + PHD_3DPOS pos; + auto room = &g_Level.Rooms[LosRooms[r]]; - for (m = 0; m < room->mesh.size(); m++) + for (int m = 0; m < room->mesh.size(); m++) { - meshp = &room->mesh[m]; + auto meshp = &room->mesh[m]; if (meshp->flags & StaticMeshFlags::SM_VISIBLE) { @@ -334,27 +327,32 @@ int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INF } } - for (linknum = room->itemNumber; linknum != NO_ITEM; linknum = g_Level.Items[linknum].nextItem) + for (short linknum = room->itemNumber; linknum != NO_ITEM; linknum = g_Level.Items[linknum].nextItem) { - item = &g_Level.Items[linknum]; + auto item = &g_Level.Items[linknum]; - if (item->status != ITEM_DEACTIVATED && item->status != ITEM_INVISIBLE - && (item->objectNumber != ID_LARA - && Objects[item->objectNumber].collision != NULL - || item->objectNumber == ID_LARA - && GetLaraOnLOS)) + if ((item->status == ITEM_DEACTIVATED) || (item->status == ITEM_INVISIBLE)) + continue; + + if ((priorityObject != GAME_OBJECT_ID::ID_NO_OBJECT) && (item->objectNumber != priorityObject)) + continue; + + if ((item->objectNumber != ID_LARA) && (Objects[item->objectNumber].collision == NULL)) + continue; + + if ((item->objectNumber == ID_LARA) && (priorityObject != ID_LARA)) + continue; + + auto box = GetBoundsAccurate(item); + + pos.xPos = item->pos.xPos; + pos.yPos = item->pos.yPos; + pos.zPos = item->pos.zPos; + pos.yRot = item->pos.yRot; + + if (DoRayBox(start, end, box, &pos, vec, linknum)) { - box = GetBoundsAccurate(item); - - pos.xPos = item->pos.xPos; - pos.yPos = item->pos.yPos; - pos.zPos = item->pos.zPos; - pos.yRot = item->pos.yRot; - - if (DoRayBox(start, end, box, &pos, vec, linknum)) - { - end->roomNumber = LosRooms[r]; - } + end->roomNumber = LosRooms[r]; } } } diff --git a/TR5Main/Game/control/los.h b/TR5Main/Game/control/los.h index 4a28eaef0..a23f7a416 100644 --- a/TR5Main/Game/control/los.h +++ b/TR5Main/Game/control/los.h @@ -1,6 +1,7 @@ #pragma once #include "room.h" -#include "Specific\phd_global.h" +#include "objectslist.h" +#include "Specific/phd_global.h" constexpr auto NO_LOS_ITEM = INT_MAX; @@ -9,5 +10,5 @@ int xLOS(GAME_VECTOR* start, GAME_VECTOR* end); int zLOS(GAME_VECTOR* start, GAME_VECTOR* end); int ClipTarget(GAME_VECTOR* start, GAME_VECTOR* target); int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firing); -int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INFO** mesh); +int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INFO** mesh, GAME_OBJECT_ID priorityObject = GAME_OBJECT_ID::ID_NO_OBJECT); int DoRayBox(GAME_VECTOR* start, GAME_VECTOR* end, BOUNDING_BOX* box, PHD_3DPOS* itemOrStaticPos, PHD_VECTOR* hitPos, short closesItemNumber); \ No newline at end of file diff --git a/TR5Main/Objects/TR5/Entity/tr5_gunship.cpp b/TR5Main/Objects/TR5/Entity/tr5_gunship.cpp index adb7244d0..98637c263 100644 --- a/TR5Main/Objects/TR5/Entity/tr5_gunship.cpp +++ b/TR5Main/Objects/TR5/Entity/tr5_gunship.cpp @@ -79,13 +79,9 @@ void ControlGunShip(short itemNumber) if (!(GlobalCounter & 1)) return AnimateItem(item); - GetLaraOnLOS = 1; - PHD_VECTOR hitPos; MESH_INFO* hitMesh = NULL; - int objOnLos = ObjectOnLOS2(&start, &end, &hitPos, &hitMesh); - - GetLaraOnLOS = 0; + int objOnLos = ObjectOnLOS2(&start, &end, &hitPos, &hitMesh, GAME_OBJECT_ID::ID_LARA); if (objOnLos == NO_LOS_ITEM || objOnLos < 0) { diff --git a/TR5Main/Objects/objectslist.h b/TR5Main/Objects/objectslist.h index 082ac55af..c33530617 100644 --- a/TR5Main/Objects/objectslist.h +++ b/TR5Main/Objects/objectslist.h @@ -2,6 +2,8 @@ enum GAME_OBJECT_ID : short { + ID_NO_OBJECT = -1, + /* Lara Primary Slot */ ID_LARA, ID_LARA_EXTRA_ANIMS,