mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-11 21:16:55 +03:00
Decompiled CombatCamera()
This commit is contained in:
parent
2b0e42a193
commit
119cfc36ea
2 changed files with 167 additions and 2 deletions
|
@ -360,7 +360,7 @@ void ChaseCamera(ITEM_INFO* item)
|
||||||
else if (Camera.actualElevation < -ANGLE(85))
|
else if (Camera.actualElevation < -ANGLE(85))
|
||||||
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);
|
GetFloor(Camera.target.x, Camera.target.y, Camera.target.z, &Camera.target.roomNumber);
|
||||||
if (Rooms[Camera.target.roomNumber].flags & ENV_FLAG_SWAMP)
|
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].y = Ideals[i].y;
|
||||||
temp[0].z = Ideals[i].z;
|
temp[0].z = Ideals[i].z;
|
||||||
temp[0].roomNumber = Ideals[i].roomNumber;
|
temp[0].roomNumber = Ideals[i].roomNumber;
|
||||||
|
|
||||||
temp[1].x = Camera.pos.x;
|
temp[1].x = Camera.pos.x;
|
||||||
temp[1].y = Camera.pos.y;
|
temp[1].y = Camera.pos.y;
|
||||||
temp[1].z = Camera.pos.z;
|
temp[1].z = Camera.pos.z;
|
||||||
|
@ -513,6 +514,168 @@ void UpdateCameraElevation()
|
||||||
Camera.actualElevation += (Camera.targetElevation - Camera.actualElevation) >> 3;
|
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()
|
void Inject_Camera()
|
||||||
{
|
{
|
||||||
INJECT(0x0048EDC0, AlterFOV);
|
INJECT(0x0048EDC0, AlterFOV);
|
||||||
|
@ -522,4 +685,5 @@ void Inject_Camera()
|
||||||
INJECT(0x0040C690, InitialiseCamera);
|
INJECT(0x0040C690, InitialiseCamera);
|
||||||
INJECT(0x004107C0, UpdateCameraElevation);
|
INJECT(0x004107C0, UpdateCameraElevation);
|
||||||
INJECT(0x0040D150, ChaseCamera);
|
INJECT(0x0040D150, ChaseCamera);
|
||||||
|
INJECT(0x0040D640, CombatCamera);
|
||||||
}
|
}
|
|
@ -11,7 +11,7 @@
|
||||||
//#define InitialiseCamera ((void (__cdecl*)()) 0x0040C690)
|
//#define InitialiseCamera ((void (__cdecl*)()) 0x0040C690)
|
||||||
//#define MoveCamera ((int(__cdecl*)(GAME_VECTOR*,int)) 0x0040C7A0)
|
//#define MoveCamera ((int(__cdecl*)(GAME_VECTOR*,int)) 0x0040C7A0)
|
||||||
//#define ChaseCamera ((int(__cdecl*)(ITEM_INFO*)) 0x0040D150)
|
//#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 LookCamera ((void(__cdecl*)(ITEM_INFO*)) 0x0040DC10)
|
||||||
#define FixedCamera ((void(__cdecl*)()) 0x0040E890)
|
#define FixedCamera ((void(__cdecl*)()) 0x0040E890)
|
||||||
#define CalculateCamera ((void(__cdecl*)()) 0x0040ED30)
|
#define CalculateCamera ((void(__cdecl*)()) 0x0040ED30)
|
||||||
|
@ -32,5 +32,6 @@ void InitialiseCamera();
|
||||||
void MoveCamera(GAME_VECTOR* ideal, int speed);
|
void MoveCamera(GAME_VECTOR* ideal, int speed);
|
||||||
void ChaseCamera(ITEM_INFO* item);
|
void ChaseCamera(ITEM_INFO* item);
|
||||||
void UpdateCameraElevation();
|
void UpdateCameraElevation();
|
||||||
|
void CombatCamera(ITEM_INFO* item);
|
||||||
|
|
||||||
void Inject_Camera();
|
void Inject_Camera();
|
Loading…
Add table
Add a link
Reference in a new issue