diff --git a/TR5Main/Game/camera.cpp b/TR5Main/Game/camera.cpp index 7f0281156..c144910de 100644 --- a/TR5Main/Game/camera.cpp +++ b/TR5Main/Game/camera.cpp @@ -360,7 +360,7 @@ void ChaseCamera(ITEM_INFO* item) else if (Camera.actualElevation < -ANGLE(85)) Camera.actualElevation = -ANGLE(85); - int distance = Camera.targetDistance * COS(Camera.targetElevation) >> W2V_SHIFT; + int distance = Camera.targetDistance * COS(Camera.actualElevation) >> W2V_SHIFT; GetFloor(Camera.target.x, Camera.target.y, Camera.target.z, &Camera.target.roomNumber); if (Rooms[Camera.target.roomNumber].flags & ENV_FLAG_SWAMP) @@ -449,6 +449,7 @@ void ChaseCamera(ITEM_INFO* item) temp[0].y = Ideals[i].y; temp[0].z = Ideals[i].z; temp[0].roomNumber = Ideals[i].roomNumber; + temp[1].x = Camera.pos.x; temp[1].y = Camera.pos.y; temp[1].z = Camera.pos.z; @@ -513,6 +514,168 @@ void UpdateCameraElevation() Camera.actualElevation += (Camera.targetElevation - Camera.actualElevation) >> 3; } +void CombatCamera(ITEM_INFO* item) +{ + Camera.target.x = item->pos.xPos; + Camera.target.z = item->pos.zPos; + + if (Lara.target) + { + Camera.targetAngle = Lara.targetAngles[0]; + Camera.targetElevation = Lara.targetAngles[1] + item->pos.xRot; + } + else + { + Camera.targetAngle = Lara.headYrot + Lara.torsoYrot; + Camera.targetElevation = Lara.headXrot + Lara.torsoXrot + item->pos.xRot - ANGLE(15); + } + + FLOOR_INFO* floor = GetFloor(Camera.target.x, Camera.target.y, Camera.target.z, &Camera.target.roomNumber); + int h = GetFloorHeight(floor, Camera.target.x, Camera.target.y, Camera.target.z); + int c = GetCeiling(floor, Camera.target.x, Camera.target.y, Camera.target.z); + + if (c + 64 > h - 64 && h != NO_HEIGHT && c != NO_HEIGHT) + { + Camera.target.y = (c + h) >> 1; + Camera.targetElevation = 0; + } + else if (Camera.target.y > h - 64 && h != NO_HEIGHT) + { + Camera.target.y = h - 64; + Camera.targetElevation = 0; + } + else if (Camera.target.y < c + 64 && c != NO_HEIGHT) + { + Camera.target.y = c + 64; + Camera.targetElevation = 0; + } + + GetFloor(Camera.target.x, Camera.target.y, Camera.target.z, &Camera.target.roomNumber); + + int wx = Camera.target.x; + int wy = Camera.target.y; + int wz = Camera.target.z; + + short roomNumber = Camera.target.roomNumber; + floor = GetFloor(Camera.target.x, Camera.target.y, Camera.target.z, &roomNumber); + h = GetFloorHeight(floor, wx, wy, wz); + c = GetCeiling(floor, wx, wy, wz); + + if (wy < c || wy > h || c >= h || h == NO_HEIGHT || c == NO_HEIGHT) + { + TargetSnaps++; + Camera.target.x = LastTarget.x; + Camera.target.y = LastTarget.y; + Camera.target.z = LastTarget.z; + Camera.target.roomNumber = LastTarget.roomNumber; + } + else + { + TargetSnaps = 0; + } + + UpdateCameraElevation(); + + Camera.targetDistance = 1536; + int distance = Camera.targetDistance * COS(Camera.actualElevation) >> W2V_SHIFT; + + for (int i = 0; i < 5; i++) + { + Ideals[i].y = Camera.target.y + (Camera.targetDistance * SIN(Camera.actualElevation) >> W2V_SHIFT); + } + + int farthest = 0x7FFFFFFF; + int farthestnum = 0; + GAME_VECTOR temp[2]; + + for (int i = 0; i < 5; i++) + { + short angle; + + if (i == 0) + { + angle = Camera.actualAngle; + } + else + { + angle = (i - 1) * ANGLE(90); + } + + Ideals[i].x = Camera.target.x - ((distance * SIN(angle)) >> W2V_SHIFT); + Ideals[i].z = Camera.target.z - ((distance * COS(angle)) >> W2V_SHIFT); + Ideals[i].roomNumber = Camera.target.roomNumber; + + if (mgLOS(&Camera.target, &Ideals[i], 200)) + { + temp[0].x = Ideals[i].x; + temp[0].y = Ideals[i].y; + temp[0].z = Ideals[i].z; + temp[0].roomNumber = Ideals[i].roomNumber; + + temp[1].x = Camera.pos.x; + temp[1].y = Camera.pos.y; + temp[1].z = Camera.pos.z; + temp[1].roomNumber = Camera.pos.roomNumber; + + if (i == 0 || mgLOS(&temp[0], &temp[1], 0)) + { + if (i == 0) + { + farthestnum = 0; + break; + } + + int dx = (Camera.pos.x - Ideals[i].x) * (Camera.pos.x - Ideals[i].x); + dx += (Camera.pos.z - Ideals[i].z) * (Camera.pos.z - Ideals[i].z); + if (dx < farthest) + { + farthest = dx; + farthestnum = i; + } + } + } + else if (i == 0) + { + temp[0].x = Ideals[i].x; + temp[0].y = Ideals[i].y; + temp[0].z = Ideals[i].z; + temp[0].roomNumber = Ideals[i].roomNumber; + + temp[1].x = Camera.pos.x; + temp[1].y = Camera.pos.y; + temp[1].z = Camera.pos.z; + temp[1].roomNumber = Camera.pos.roomNumber; + + if (i == 0 || mgLOS(&temp[0], &temp[1], 0)) + { + int dx = (Camera.target.x - Ideals[i].x) * (Camera.target.x - Ideals[i].x); + int dz = (Camera.target.z - Ideals[i].z) * (Camera.target.z - Ideals[i].z); + + if ((dx + dz) > 0x90000) + { + farthestnum = 0; + break; + } + } + } + } + + GAME_VECTOR ideal; + ideal.x = Ideals[farthestnum].x; + ideal.y = Ideals[farthestnum].y; + ideal.z = Ideals[farthestnum].z; + ideal.roomNumber = Ideals[farthestnum].roomNumber; + + CameraCollisionBounds(&ideal, 384, 1); + + if (Camera.oldType == FIXED_CAMERA) + { + Camera.speed = 1; + } + + MoveCamera(&ideal, Camera.speed); +} + void Inject_Camera() { INJECT(0x0048EDC0, AlterFOV); @@ -522,4 +685,5 @@ void Inject_Camera() INJECT(0x0040C690, InitialiseCamera); INJECT(0x004107C0, UpdateCameraElevation); INJECT(0x0040D150, ChaseCamera); + INJECT(0x0040D640, CombatCamera); } \ No newline at end of file diff --git a/TR5Main/Game/camera.h b/TR5Main/Game/camera.h index 7f648f7e4..c2a6a3a5a 100644 --- a/TR5Main/Game/camera.h +++ b/TR5Main/Game/camera.h @@ -11,7 +11,7 @@ //#define InitialiseCamera ((void (__cdecl*)()) 0x0040C690) //#define MoveCamera ((int(__cdecl*)(GAME_VECTOR*,int)) 0x0040C7A0) //#define ChaseCamera ((int(__cdecl*)(ITEM_INFO*)) 0x0040D150) -#define CombatCamera ((int(__cdecl*)(ITEM_INFO*)) 0x0040D640) +//#define CombatCamera ((int(__cdecl*)(ITEM_INFO*)) 0x0040D640) #define LookCamera ((void(__cdecl*)(ITEM_INFO*)) 0x0040DC10) #define FixedCamera ((void(__cdecl*)()) 0x0040E890) #define CalculateCamera ((void(__cdecl*)()) 0x0040ED30) @@ -32,5 +32,6 @@ void InitialiseCamera(); void MoveCamera(GAME_VECTOR* ideal, int speed); void ChaseCamera(ITEM_INFO* item); void UpdateCameraElevation(); +void CombatCamera(ITEM_INFO* item); void Inject_Camera(); \ No newline at end of file