mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-10 20:46:47 +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))
|
||||
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);
|
||||
}
|
|
@ -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();
|
Loading…
Add table
Add a link
Reference in a new issue