diff --git a/TR5Main/Game/camera.h b/TR5Main/Game/camera.h index 7d814ba0d..4ffaeb6e8 100644 --- a/TR5Main/Game/camera.h +++ b/TR5Main/Game/camera.h @@ -16,7 +16,7 @@ #define FixedCamera ((void(__cdecl*)()) 0x0040E890) #define CalculateCamera ((void(__cdecl*)()) 0x0040ED30) #define BinocularCamera ((void(__cdecl*)()) 0x0040FC20) -#define RefreshCamera ((void(__cdecl*)(short,short*)) 0x004165E0) +//#define RefreshCamera ((void(__cdecl*)(short,short*)) 0x004165E0) #define CameraCollisionBounds ((int (__cdecl*)(GAME_VECTOR*,int,int)) 0x0040F5C0) #define do_new_cutscene_camera ((void(__cdecl*)()) 0x00421480) #define SaveD3DCameraMatrix ((void(__cdecl*)()) 0x00497280) diff --git a/TR5Main/Game/control.cpp b/TR5Main/Game/control.cpp index 7ce6bc0e7..f23160044 100644 --- a/TR5Main/Game/control.cpp +++ b/TR5Main/Game/control.cpp @@ -3484,6 +3484,58 @@ void RumbleScreen() } } +void RefreshCamera(short type, short* data) +{ + short trigger, value, targetOk; + + targetOk = 2; + + do + { + trigger = *(data++); + value = trigger & VALUE_BITS; + + switch (TRIG_BITS(trigger)) + { + case TO_CAMERA: + data++; + + if (value == Camera.last) + { + Camera.number = value; + + if ((Camera.timer < 0) + || (Camera.type == LOOK_CAMERA) + || (Camera.type == COMBAT_CAMERA)) + { + Camera.timer = -1; + targetOk = 0; + break; + } + Camera.type = FIXED_CAMERA; + targetOk = 1; + } + else + targetOk = 0; + break; + + case TO_TARGET: + if (Camera.type == LOOK_CAMERA || Camera.type == COMBAT_CAMERA) + break; + + Camera.item = &Items[value]; + break; + } + } while (!(trigger & END_BIT)); + + if (Camera.item) + if (!targetOk || (targetOk == 2 && Camera.item->lookedAt && Camera.item != Camera.lastItem)) + Camera.item = NULL; + + if (Camera.number == -1 && Camera.timer > 0) + Camera.timer = -1; +} + void Inject_Control() { INJECT(0x00416760, TestTriggers); diff --git a/TR5Main/Game/control.h b/TR5Main/Game/control.h index 7ee2ac02f..158ce3bbd 100644 --- a/TR5Main/Game/control.h +++ b/TR5Main/Game/control.h @@ -30,7 +30,7 @@ //#define RumbleScreen ((void (__cdecl*)()) 0x00442C90) #define ExplodeItemNode ((int (__cdecl*)(ITEM_INFO*, int, int, int)) 0x0041ABF0) //#define LavaBurn ((void (__cdecl*)(ITEM_INFO*)) 0x0048ADD0) -#define RefreshCamera ((void (__cdecl*)(short, short*)) 0x004165E0) +//#define RefreshCamera ((void (__cdecl*)(short, short*)) 0x004165E0) //#define DoFlipMap ((void (__cdecl*)(short)) 0x00418910) //#define PlaySoundTrack ((void (__cdecl*)(short, short)) 0x00418B90) //#define AlterFloorHeight ((void (__cdecl*)(ITEM_INFO*, int)) 0x004159F0) @@ -86,6 +86,7 @@ void AddRoomFlipItems(ROOM_INFO* r); void RemoveRoomFlipItems(ROOM_INFO* r); void PlaySoundTrack(short track, short flags); void RumbleScreen(); +void RefreshCamera(short type, short* data); unsigned __stdcall GameMain(void*); void Inject_Control();