Decompiled CombatCamera()

This commit is contained in:
Montagna Marco 2020-04-09 06:51:52 +02:00
parent 2b0e42a193
commit 119cfc36ea
2 changed files with 167 additions and 2 deletions

View file

@ -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);
}

View file

@ -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();