Merge branch 'master' into scripting

This commit is contained in:
MontyTRC 2020-04-30 21:52:16 +02:00 committed by GitHub
commit 6b16828381
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
232 changed files with 11849 additions and 9250 deletions

View file

@ -14,9 +14,11 @@ Global
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{15AB0220-541C-4DA1-94EB-ED3C47E4582E}.Debug|x64.ActiveCfg = Debug|Win32
{15AB0220-541C-4DA1-94EB-ED3C47E4582E}.Debug|x64.Build.0 = Debug|Win32
{15AB0220-541C-4DA1-94EB-ED3C47E4582E}.Debug|x86.ActiveCfg = Debug|Win32
{15AB0220-541C-4DA1-94EB-ED3C47E4582E}.Debug|x86.Build.0 = Debug|Win32
{15AB0220-541C-4DA1-94EB-ED3C47E4582E}.Release|x64.ActiveCfg = Release|Win32
{15AB0220-541C-4DA1-94EB-ED3C47E4582E}.Release|x64.Build.0 = Release|Win32
{15AB0220-541C-4DA1-94EB-ED3C47E4582E}.Release|x86.ActiveCfg = Release|Win32
{15AB0220-541C-4DA1-94EB-ED3C47E4582E}.Release|x86.Build.0 = Release|Win32
EndGlobalSection

View file

@ -45,5 +45,4 @@ TARGET_TYPE CalculateTarget(PHD_VECTOR* target, ITEM_INFO* item, LOT_INFO* LOT);
int CreatureAnimation(short itemNumber, short angle, short tilt);
void AdjustStopperFlag(ITEM_INFO* item, int dir, int set);
void Inject_Box();

View file

@ -12,6 +12,7 @@
#include "camera.h"
#include "control.h"
#include "../Specific/setup.h"
#include "../Specific/level.h"
int NumberBoxes;
BOX_INFO* Boxes;
@ -19,8 +20,6 @@ int NumberOverlaps;
short* Overlaps;
short* Zones[5][2];
extern LaraExtraInfo g_LaraExtra;
#define ESCAPE_DIST (WALL_SIZE*5)
#define STALK_DIST (WALL_SIZE*3)
#define REACHED_GOAL_RADIUS 640
@ -62,7 +61,7 @@ int MoveCreature3DPos(PHD_3DPOS* srcpos, PHD_3DPOS* destpos, int velocity, short
x = destpos->xPos - srcpos->xPos;
y = destpos->yPos - srcpos->yPos;
z = destpos->zPos - srcpos->zPos;
distance = SQRT_ASM(SQUARE(x) + SQUARE(y) + SQUARE(z));
distance = sqrt(SQUARE(x) + SQUARE(y) + SQUARE(z));
if (velocity < distance)
{
@ -242,7 +241,7 @@ void CreatureKill(ITEM_INFO* item, int killAnim, int killState, short laraKillSt
AnimateItem(LaraItem);
g_LaraExtra.ExtraAnim = 1;
Lara.ExtraAnim = 1;
Lara.gunStatus = LG_HANDS_BUSY;
Lara.gunType = WEAPON_NONE;
Lara.hitDirection = -1;
@ -256,9 +255,9 @@ void CreatureKill(ITEM_INFO* item, int killAnim, int killState, short laraKillSt
// TODO: exist in TR5 but just commented in case.
/*
ForcedFixedCamera.x = item->pos.xPos + (SIN(item->pos.yRot) << 13) >> W2V_SHIFT;
ForcedFixedCamera.x = item->pos.xPos + (phd_sin(item->pos.yRot) << 13) >> W2V_SHIFT;
ForcedFixedCamera.y = item->pos.yPos - WALL_SIZE;
ForcedFixedCamera.z = item->pos.zPos + (COS(item->pos.yRot) << 13) >> W2V_SHIFT;
ForcedFixedCamera.z = item->pos.zPos + (phd_cos(item->pos.yRot) << 13) >> W2V_SHIFT;
ForcedFixedCamera.roomNumber = item->roomNumber;
UseForcedFixedCamera = true;
*/
@ -422,7 +421,7 @@ short CreatureTurn(ITEM_INFO* item, short maximumTurn)
x = creature->target.x - item->pos.xPos;
z = creature->target.z - item->pos.zPos;
angle = ATAN(z, x) - item->pos.yRot;
angle = phd_atan(z, x) - item->pos.yRot;
range = (item->speed << W2V_SHIFT) / maximumTurn;
distance = SQUARE(x) + SQUARE(z);
@ -452,16 +451,16 @@ short CreatureTurn(ITEM_INFO* item, short maximumTurn)
// "<< 11" is really needed ? it can cause problem i think since it TR3 code the "<< 11" is not there !
xAngle1 = item->pos.xPos + SIN(item->pos.yRot + ANGLE(45)) << 11 >> W2V_SHIFT;
zAngle1 = item->pos.zPos + COS(item->pos.yRot + ANGLE(45)) << 11 >> W2V_SHIFT;
xAngle1 = item->pos.xPos + phd_sin(item->pos.yRot + ANGLE(45)) << 11 >> W2V_SHIFT;
zAngle1 = item->pos.zPos + phd_cos(item->pos.yRot + ANGLE(45)) << 11 >> W2V_SHIFT;
floorIndex1 = XZ_GET_SECTOR(r, xAngle1 - r->x, zAngle1 - r->z).index;
xAngle2 = item->pos.xPos + SIN(item->pos.yRot - ANGLE(45)) << 11 >> W2V_SHIFT;
zAngle2 = item->pos.zPos + COS(item->pos.yRot - ANGLE(45)) << 11 >> W2V_SHIFT;
xAngle2 = item->pos.xPos + phd_sin(item->pos.yRot - ANGLE(45)) << 11 >> W2V_SHIFT;
zAngle2 = item->pos.zPos + phd_cos(item->pos.yRot - ANGLE(45)) << 11 >> W2V_SHIFT;
floorIndex2 = XZ_GET_SECTOR(r, xAngle2 - r->x, zAngle2 - r->z).index;
xAngle3 = item->pos.xPos + SIN(item->pos.yRot) << 11 >> W2V_SHIFT;
zAngle3 = item->pos.zPos + COS(item->pos.yRot) << 11 >> W2V_SHIFT;
xAngle3 = item->pos.xPos + phd_sin(item->pos.yRot) << 11 >> W2V_SHIFT;
zAngle3 = item->pos.zPos + phd_cos(item->pos.yRot) << 11 >> W2V_SHIFT;
floorIndex3 = XZ_GET_SECTOR(r, xAngle3 - r->x, zAngle3 - r->z).index;
if (floorIndex1 && !floorIndex2 && !floorIndex3)
@ -485,7 +484,7 @@ short CreatureTurn(ITEM_INFO* item, short maximumTurn)
xDist = creature->target.x - item->pos.xPos;
zDist = creature->target.z - item->pos.zPos;
angle = ATAN(zDist, xDist) - item->pos.yRot;
angle = phd_atan(zDist, xDist) - item->pos.yRot;
if (angle > FRONT_ARC || angle < -FRONT_ARC)
{
@ -778,7 +777,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
floor = GetFloor(item->pos.xPos, y, item->pos.zPos, &roomNumber);
item->floor = GetFloorHeight(floor, item->pos.xPos, y, item->pos.zPos);
angle = (item->speed) ? ATAN(item->speed, -dy) : 0;
angle = (item->speed) ? phd_atan(item->speed, -dy) : 0;
if (angle < -ANGLE(20))
angle = -ANGLE(20);
else if (angle > ANGLE(20))
@ -873,9 +872,9 @@ void CreatureDie(short itemNumber, int explode)
if (explode)
{
if (Objects[item->objectNumber].hitEffect)
ExplodingDeath2(itemNumber, ALL_MESHBITS, EXPLODE_HIT_EFFECT);
ExplodingDeath(itemNumber, ALL_MESHBITS, EXPLODE_HIT_EFFECT);
else
ExplodingDeath2(itemNumber, ALL_MESHBITS, EXPLODE_NORMAL);
ExplodingDeath(itemNumber, ALL_MESHBITS, EXPLODE_NORMAL);
KillItem(itemNumber);
}
@ -920,7 +919,7 @@ int BadFloor(int x, int y, int z, int boxHeight, int nextHeight, short roomNumbe
int CreatureCreature(short itemNumber)
{
ITEM_INFO* item, *linked;
OBJECT_INFO* obj;
ObjectInfo* obj;
ROOM_INFO* r;
int x, z, xDistance, zDistance, distance = 0;
short link, radius;
@ -948,7 +947,7 @@ int CreatureCreature(short itemNumber)
distance = zDistance + (xDistance >> 1);
if (distance < radius + Objects[linked->objectNumber].radius)
return ATAN(linked->pos.zPos - z, linked->pos.xPos - x) - item->pos.yRot;
return phd_atan(linked->pos.zPos - z, linked->pos.xPos - x) - item->pos.yRot;
}
link = linked->nextItem;
@ -1450,8 +1449,8 @@ void FindAITargetObject(CREATURE_INFO* creature, short objectNumber)
if (!(creature->aiTarget.flags & 0x20))
{
creature->aiTarget.pos.xPos += SIN(creature->aiTarget.pos.yRot) >> 4;
creature->aiTarget.pos.zPos += COS(creature->aiTarget.pos.yRot) >> 4;
creature->aiTarget.pos.xPos += phd_sin(creature->aiTarget.pos.yRot) >> 4;
creature->aiTarget.pos.zPos += phd_cos(creature->aiTarget.pos.yRot) >> 4;
}
}
}
@ -1464,7 +1463,7 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
CREATURE_INFO* creature;
ITEM_INFO* enemy;
OBJECT_INFO* obj;
ObjectInfo* obj;
ROOM_INFO* r;
short* zone, angle;
int x, y, z;
@ -1499,17 +1498,17 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
if (enemy == LaraItem)
{
x = (enemy->pos.xPos + (enemy->speed * PREDICTIVE_SCALE_FACTOR * SIN(Lara.moveAngle) >> W2V_SHIFT)) - (item->pos.xPos + (obj->pivotLength * SIN(item->pos.yRot) >> W2V_SHIFT));
z = (enemy->pos.zPos + (enemy->speed * PREDICTIVE_SCALE_FACTOR * COS(Lara.moveAngle) >> W2V_SHIFT)) - (item->pos.zPos + (obj->pivotLength * COS(item->pos.yRot) >> W2V_SHIFT));
x = (enemy->pos.xPos + (enemy->speed * PREDICTIVE_SCALE_FACTOR * phd_sin(Lara.moveAngle) >> W2V_SHIFT)) - (item->pos.xPos + (obj->pivotLength * phd_sin(item->pos.yRot) >> W2V_SHIFT));
z = (enemy->pos.zPos + (enemy->speed * PREDICTIVE_SCALE_FACTOR * phd_cos(Lara.moveAngle) >> W2V_SHIFT)) - (item->pos.zPos + (obj->pivotLength * phd_cos(item->pos.yRot) >> W2V_SHIFT));
}
else
{
x = (enemy->pos.xPos + (enemy->speed * PREDICTIVE_SCALE_FACTOR * SIN(enemy->pos.yRot) >> W2V_SHIFT)) - (item->pos.xPos + (obj->pivotLength * SIN(item->pos.yRot) >> W2V_SHIFT));
z = (enemy->pos.zPos + (enemy->speed * PREDICTIVE_SCALE_FACTOR * COS(enemy->pos.yRot) >> W2V_SHIFT)) - (item->pos.zPos + (obj->pivotLength * COS(item->pos.yRot) >> W2V_SHIFT));
x = (enemy->pos.xPos + (enemy->speed * PREDICTIVE_SCALE_FACTOR * phd_sin(enemy->pos.yRot) >> W2V_SHIFT)) - (item->pos.xPos + (obj->pivotLength * phd_sin(item->pos.yRot) >> W2V_SHIFT));
z = (enemy->pos.zPos + (enemy->speed * PREDICTIVE_SCALE_FACTOR * phd_cos(enemy->pos.yRot) >> W2V_SHIFT)) - (item->pos.zPos + (obj->pivotLength * phd_cos(item->pos.yRot) >> W2V_SHIFT));
}
y = item->pos.yPos - enemy->pos.yPos;
angle = ATAN(z, x);
angle = phd_atan(z, x);
if (x > 32000 || x < -32000 || z > 32000 || z < -32000)
{
@ -1544,9 +1543,9 @@ void CreatureAIInfo(ITEM_INFO* item, AI_INFO* info)
}
if (x > z)
info->xAngle = ATAN(x + (z >> 1), y);
info->xAngle = phd_atan(x + (z >> 1), y);
else
info->xAngle = ATAN(z + (x >> 1), y);
info->xAngle = phd_atan(z + (x >> 1), y);
info->ahead = (info->angle > -FRONT_ARC && info->angle < FRONT_ARC);
info->bite = (info->ahead && enemy->hitPoints > 0 && abs(enemy->pos.yPos - item->pos.yPos) <= (STEP_SIZE*2));
@ -1661,7 +1660,7 @@ void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent)
}
}
Unk_00EEFB6C = CalculateTarget(&creature->target, item, &creature->LOT);
/*Unk_00EEFB6C =*/ CalculateTarget(&creature->target, item, &creature->LOT);
}
void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int isViolent)
@ -2008,8 +2007,8 @@ void AdjustStopperFlag(ITEM_INFO* item, int dir, int set)
FLOOR_INFO* floor = &XZ_GET_SECTOR(r, x - r->x, z - r->z);
floor->stopper = set;
x = item->pos.xPos + ((1024 * SIN(dir)) >> W2V_SHIFT);
z = item->pos.zPos + ((1024 * COS(dir)) >> W2V_SHIFT);
x = item->pos.xPos + ((1024 * phd_sin(dir)) >> W2V_SHIFT);
z = item->pos.zPos + ((1024 * phd_cos(dir)) >> W2V_SHIFT);
short roomNumber = item->roomNumber;
GetFloor(x, item->pos.yPos, z, &roomNumber);
@ -2018,39 +2017,3 @@ void AdjustStopperFlag(ITEM_INFO* item, int dir, int set)
floor = &XZ_GET_SECTOR(r, x - r->x, z - r->z);
floor->stopper = set;
}
void Inject_Box()
{
INJECT(0x0040B5D0, CreatureVault);
INJECT(0x00408FD0, ValidBox);
INJECT(0x00408E20, TargetBox);
INJECT(0x00409770, StalkBox);
INJECT(0x00408EF0, EscapeBox);
INJECT(0x0040C2D0, SameZone);
INJECT(0x0040B820, CreatureKill);
INJECT(0x00409FB0, BadFloor);
INJECT(0x0040B550, CreatureEffect2);
INJECT(0x0040B4D0, CreatureEffect);
INJECT(0x0040C5A0, DropBaddyPickups);
INJECT(0x0040A090, CreatureDie);
INJECT(0x0040B240, CreatureJoint);
INJECT(0x0040B1B0, CreatureTilt);
INJECT(0x00409E20, CreatureCreature);
INJECT(0x00408630, CreatureActive);
//INJECT(0x0040AE90, CreatureTurn);
INJECT(0x0040C460, MoveCreature3DPos);
INJECT(0x004086C0, CreatureAIInfo);
INJECT(0x00409370, CreatureMood);
INJECT(0x004090A0, GetCreatureMood);
INJECT(0x0040BB10, AlertNearbyGuards);
INJECT(0x0040BA70, AlertAllGuards);
INJECT(0x00408B00, UpdateLOT);
INJECT(0x0040B400, CreatureUnderwater);
INJECT(0x0040B2C0, CreatureFloat);
INJECT(0x004098B0, CalculateTarget);
INJECT(0x0040A1D0, CreatureAnimation);
INJECT(0x00408550, InitialiseCreature);
INJECT(0x0040C070, FindAITargetObject);
INJECT(0x0040BBE0, AIGuard);
INJECT(0x0040BCC0, GetAITarget);
}

View file

@ -1,5 +1,9 @@
#include "bubble.h"
#include "../Specific/level.h"
#include "control.h"
using namespace std;
extern vector<BUBBLE_STRUCT> Bubbles = vector<BUBBLE_STRUCT>(MAX_BUBBLES);
void UpdateBubbles()
@ -92,9 +96,3 @@ void CreateBubble(PHD_VECTOR* pos, short roomNum, int unk1, int unk2, int flags,
bubble->roomNumber = roomNum;
}
}
void Inject_Bubble() {
INJECT(0x00483540, UpdateBubbles);
INJECT(0x004832C0, GetFreeBubble);
INJECT(0x00483350, CreateBubble);
}

View file

@ -4,13 +4,13 @@
#include <vector>
#include "../Global/types.h"
#include "../Global/constants.h"
#include "../Global/vars.h"
#include "effect2.h"
constexpr float MAX_BUBBLES = 256;
constexpr float MAX_BUBBLES = 256;
constexpr int BUBBLE_FLAG_BIG_SIZE = 0x1;
constexpr int BUBBLE_FLAG_CLUMP = 0x2;
constexpr int BUBBLE_FLAG_HIGH_AMPLITUDE = 0x4;
struct BUBBLE_STRUCT
{
DirectX::SimpleMath::Vector4 color;
@ -30,11 +30,9 @@ struct BUBBLE_STRUCT
int age;
bool active;
};
extern std::vector<BUBBLE_STRUCT> Bubbles;
void UpdateBubbles();
int GetFreeBubble();//8BEAC(<), 8DEF0(<) (F)
void CreateBubble(PHD_VECTOR* pos, short roomNum, int unk1, int unk2, int flags, int xv, int yv, int zv);//8BF14(<), 8DF58(<) (F)
void Inject_Bubble();

View file

@ -10,6 +10,11 @@
#include "lara.h"
#include "flmtorch.h"
#include "sphere.h"
#include "../Specific/level.h"
#include "collide.h"
#include "sound.h"
#include "savegame.h"
#include "../Specific/input.h"
struct OLD_CAMERA
{
@ -24,13 +29,11 @@ struct OLD_CAMERA
PHD_VECTOR target;
};
#define LfAspectCorrection VAR_U_(0x0055DA30, float)
#define LastTarget VAR_U_(0x00EEFA30, GAME_VECTOR)
#define InputBusy VAR_U_(0x00878C94, int)
#define SniperCamActive VAR_U_(0x0051CA1D, byte)
float LfAspectCorrection;
GAME_VECTOR LastTarget;
byte SniperCamActive;
extern int KeyTriggerActive;
extern LaraExtraInfo g_LaraExtra;
PHD_VECTOR CurrentCameraPosition;
SVECTOR CurrentCameraRotation;
@ -57,6 +60,10 @@ CAMERA_TYPE BinocularOldCamera;
int LaserSight;
int SniperCount;
int ExitingBinocular;
int PhdPerspective;
short CurrentFOV;
int GetLaraOnLOS;
int SniperOverlay;
void ActivateCamera()
{
@ -68,43 +75,20 @@ void LookAt(int posX, int posY, int posZ, int targetX, int targetY, int targetZ,
Vector3 position = Vector3(posX, posY, posZ);
Vector3 target = Vector3(targetX, targetY, targetZ);
Vector3 up = Vector3(0.0f, -1.0f, 0.0f);
float fov = TR_ANGLE_TO_RAD(CurrentFOV / 1.333333f);
float r = TR_ANGLE_TO_RAD(roll);
float fov = TO_RAD(CurrentFOV / 1.333333f);
float r = TO_RAD(roll);
// This should not be needed but it seems to solve our issues
if (posX == targetX && posY == targetY && posZ == targetZ)
return;
short angles[2];
phd_GetVectorAngles(targetX - posX, targetY - posY, targetZ - posZ, angles);
PHD_3DPOS pos;
pos.xPos = posX;
pos.yPos = posY;
pos.zPos = posZ;
pos.xRot = angles[1];
pos.yRot = angles[0];
pos.zRot = roll;
CurrentCameraPosition.x = posX;
CurrentCameraPosition.y = posY;
CurrentCameraPosition.z = posZ;
/*CurrentCameraRotation.vx = mGetAngle(0, 0, sqrt(roll), posY - targetY) >> 4;
CurrentCameraRotation.vy = mGetAngle(posZ, posX, targetZ, targetX) >> 4;
CurrentCameraRotation.vz = 0;*/
phd_GenerateW2V(&pos);
g_Renderer->UpdateCameraMatrices(posX, posY, posZ, targetX, targetY, targetZ, r, fov);
}
void AlterFOV(int value)
{
CurrentFOV = value;
PhdPerspective = PhdWidth / 2 * COS(CurrentFOV / 2) / SIN(CurrentFOV / 2);
LfAspectCorrection = 1.3333334f / (float)(PhdWidth / PhdHeight);
PhdPerspective = g_Renderer->ScreenWidth / 2 * phd_cos(CurrentFOV / 2) / phd_sin(CurrentFOV / 2);
}
int mgLOS(GAME_VECTOR* start, GAME_VECTOR* target, int push)
@ -364,10 +348,10 @@ void MoveCamera(GAME_VECTOR* ideal, int speed)
}
else
{
short angle = ATAN(Camera.target.z - Camera.pos.z, Camera.target.x - Camera.pos.x);
Camera.mikePos.x = Camera.pos.x + (PhdPerspective * SIN(angle) >> W2V_SHIFT);
short angle = phd_atan(Camera.target.z - Camera.pos.z, Camera.target.x - Camera.pos.x);
Camera.mikePos.x = Camera.pos.x + (PhdPerspective * phd_sin(angle) >> W2V_SHIFT);
Camera.mikePos.y = Camera.pos.y;
Camera.mikePos.z = Camera.pos.z + (PhdPerspective * COS(angle) >> W2V_SHIFT);
Camera.mikePos.z = Camera.pos.z + (PhdPerspective * phd_cos(angle) >> W2V_SHIFT);
Camera.oldType = Camera.type;
}
}
@ -387,7 +371,7 @@ void ChaseCamera(ITEM_INFO* item)
else if (Camera.actualElevation < -ANGLE(85))
Camera.actualElevation = -ANGLE(85);
int distance = Camera.targetDistance * COS(Camera.actualElevation) >> W2V_SHIFT;
int distance = Camera.targetDistance * phd_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)
@ -417,7 +401,7 @@ void ChaseCamera(ITEM_INFO* item)
for (int i = 0; i < 5; i++)
{
Ideals[i].y = Camera.target.y + (Camera.targetDistance * SIN(Camera.actualElevation) >> W2V_SHIFT);
Ideals[i].y = Camera.target.y + (Camera.targetDistance * phd_sin(Camera.actualElevation) >> W2V_SHIFT);
}
int farthest = 0x7FFFFFFF;
@ -437,8 +421,8 @@ void ChaseCamera(ITEM_INFO* item)
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].x = Camera.target.x - ((distance * phd_sin(angle)) >> W2V_SHIFT);
Ideals[i].z = Camera.target.z - ((distance * phd_cos(angle)) >> W2V_SHIFT);
Ideals[i].roomNumber = Camera.target.roomNumber;
if (mgLOS(&Camera.target, &Ideals[i], 200))
@ -531,7 +515,7 @@ void UpdateCameraElevation()
pos.z = pos1.z - pos.z;
pos.x = pos1.x - pos.x;
Camera.actualAngle = Camera.targetAngle + ATAN(pos.z, pos.x);
Camera.actualAngle = Camera.targetAngle + phd_atan(pos.z, pos.x);
}
else
{
@ -604,11 +588,11 @@ void CombatCamera(ITEM_INFO* item)
UpdateCameraElevation();
Camera.targetDistance = 1536;
int distance = Camera.targetDistance * COS(Camera.actualElevation) >> W2V_SHIFT;
int distance = Camera.targetDistance * phd_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);
Ideals[i].y = Camera.target.y + (Camera.targetDistance * phd_sin(Camera.actualElevation) >> W2V_SHIFT);
}
int farthest = 0x7FFFFFFF;
@ -628,8 +612,8 @@ void CombatCamera(ITEM_INFO* item)
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].x = Camera.target.x - ((distance * phd_sin(angle)) >> W2V_SHIFT);
Ideals[i].z = Camera.target.z - ((distance * phd_cos(angle)) >> W2V_SHIFT);
Ideals[i].roomNumber = Camera.target.roomNumber;
if (mgLOS(&Camera.target, &Ideals[i], 200))
@ -926,7 +910,7 @@ void LookCamera(ITEM_INFO* item)
pos.x = 0;
pos.y = 16;
pos.z = 64;
GetLaraJointPosition(&pos, LJ_HEAD);
GetLaraJointPosition(&pos, LM_HEAD);
short roomNumber = LaraItem->roomNumber;
FLOOR_INFO* floor = GetFloor(pos.x, pos.y, pos.z, &roomNumber);
@ -937,7 +921,7 @@ void LookCamera(ITEM_INFO* item)
pos.x = 0;
pos.y = 16;
pos.z = 0;
GetLaraJointPosition(&pos, LJ_HEAD);
GetLaraJointPosition(&pos, LM_HEAD);
roomNumber = LaraItem->roomNumber;
floor = GetFloor(pos.x, pos.y + 256, pos.z, &roomNumber);
@ -956,7 +940,7 @@ void LookCamera(ITEM_INFO* item)
pos.x = 0;
pos.y = 16;
pos.z = -64;
GetLaraJointPosition(&pos, LJ_HEAD);
GetLaraJointPosition(&pos, LM_HEAD);
}
}
@ -964,13 +948,13 @@ void LookCamera(ITEM_INFO* item)
pos2.x = 0;
pos2.y = 0;
pos2.z = -1024;
GetLaraJointPosition(&pos2, LJ_HEAD);
GetLaraJointPosition(&pos2, LM_HEAD);
PHD_VECTOR pos3;
pos3.x = 0;
pos3.y = 0;
pos3.z = 2048;
GetLaraJointPosition(&pos3, LJ_HEAD);
GetLaraJointPosition(&pos3, LM_HEAD);
int dx = (pos2.x - pos.x) >> 3;
int dy = (pos2.y - pos.y) >> 3;
@ -1143,9 +1127,9 @@ void LookCamera(ITEM_INFO* item)
}
else
{
Camera.actualAngle = ATAN(Camera.target.z - Camera.pos.z, Camera.target.x - Camera.pos.x);
Camera.mikePos.x = Camera.pos.x + ((PhdPerspective * SIN(Camera.actualAngle)) >> W2V_SHIFT);
Camera.mikePos.z = Camera.pos.z + ((PhdPerspective * COS(Camera.actualAngle)) >> W2V_SHIFT);
Camera.actualAngle = phd_atan(Camera.target.z - Camera.pos.z, Camera.target.x - Camera.pos.x);
Camera.mikePos.x = Camera.pos.x + ((PhdPerspective * phd_sin(Camera.actualAngle)) >> W2V_SHIFT);
Camera.mikePos.z = Camera.pos.z + ((PhdPerspective * phd_cos(Camera.actualAngle)) >> W2V_SHIFT);
Camera.mikePos.y = Camera.pos.y;
}
@ -1161,7 +1145,7 @@ void BounceCamera(ITEM_INFO* item, short bounce, short maxDistance)
{
int distance;
distance = SQRT_ASM(SQUARE(item->pos.xPos - Camera.pos.x) + SQUARE(item->pos.yPos - Camera.pos.y) + SQUARE(item->pos.zPos - Camera.pos.z));
distance = sqrt(SQUARE(item->pos.xPos - Camera.pos.x) + SQUARE(item->pos.yPos - Camera.pos.y) + SQUARE(item->pos.zPos - Camera.pos.z));
if (distance < maxDistance)
{
if (maxDistance == -1)
@ -1240,11 +1224,11 @@ void BinocularCamera(ITEM_INFO* item)
Camera.pos.z = z;
Camera.pos.roomNumber = roomNumber;
int l = 20736 * COS(headXrot) >> W2V_SHIFT;
int l = 20736 * phd_cos(headXrot) >> W2V_SHIFT;
int tx = x + (l * SIN(LaraItem->pos.yRot + headYrot) >> W2V_SHIFT);
int ty = y - (20736 * SIN(headXrot) >> W2V_SHIFT);
int tz = z + (l * COS(LaraItem->pos.yRot + headYrot) >> W2V_SHIFT);
int tx = x + (l * phd_sin(LaraItem->pos.yRot + headYrot) >> W2V_SHIFT);
int ty = y - (20736 * phd_sin(headXrot) >> W2V_SHIFT);
int tz = z + (l * phd_cos(LaraItem->pos.yRot + headYrot) >> W2V_SHIFT);
if (Camera.oldType == FIXED_CAMERA)
{
@ -1289,9 +1273,9 @@ void BinocularCamera(ITEM_INFO* item)
}
else
{
Camera.actualAngle = ATAN(Camera.target.z - Camera.pos.z, Camera.target.x - Camera.pos.x);
Camera.mikePos.x = Camera.pos.x + ((PhdPerspective * SIN(Camera.actualAngle)) >> W2V_SHIFT);
Camera.mikePos.z = Camera.pos.z + ((PhdPerspective * COS(Camera.actualAngle)) >> W2V_SHIFT);
Camera.actualAngle = phd_atan(Camera.target.z - Camera.pos.z, Camera.target.x - Camera.pos.x);
Camera.mikePos.x = Camera.pos.x + ((PhdPerspective * phd_sin(Camera.actualAngle)) >> W2V_SHIFT);
Camera.mikePos.z = Camera.pos.z + ((PhdPerspective * phd_cos(Camera.actualAngle)) >> W2V_SHIFT);
Camera.mikePos.y = Camera.pos.y;
}
@ -1370,11 +1354,11 @@ void BinocularCamera(ITEM_INFO* item)
}
else
{
if (g_LaraExtra.Weapons[WEAPON_HK].SelectedAmmo == WEAPON_AMMO1)
if (Lara.Weapons[WEAPON_HK].SelectedAmmo == WEAPON_AMMO1)
{
WeaponDelay = 12;
firing = 1;
if (g_LaraExtra.Weapons[WEAPON_HK].HasSilencer)
if (Lara.Weapons[WEAPON_HK].HasSilencer)
{
SoundEffect(SFX_HK_SILENCED, 0, 0);
}
@ -1384,7 +1368,7 @@ void BinocularCamera(ITEM_INFO* item)
SoundEffect(SFX_HK_FIRE, 0, 0);
}
}
else if (g_LaraExtra.Weapons[WEAPON_HK].SelectedAmmo == WEAPON_AMMO2)
else if (Lara.Weapons[WEAPON_HK].SelectedAmmo == WEAPON_AMMO2)
{
if (!LSHKTimer)
{
@ -1395,7 +1379,7 @@ void BinocularCamera(ITEM_INFO* item)
}
LSHKTimer = 4;
firing = 1;
if (g_LaraExtra.Weapons[WEAPON_HK].HasSilencer)
if (Lara.Weapons[WEAPON_HK].HasSilencer)
{
SoundEffect(SFX_HK_SILENCED, 0, 0);
}
@ -1409,7 +1393,7 @@ void BinocularCamera(ITEM_INFO* item)
{
Camera.bounce = -16 - (GetRandomControl() & 0x1F);
if (g_LaraExtra.Weapons[WEAPON_HK].HasSilencer)
if (Lara.Weapons[WEAPON_HK].HasSilencer)
{
SoundEffect(SFX_HK_SILENCED, 0, 0);
}
@ -1424,7 +1408,7 @@ void BinocularCamera(ITEM_INFO* item)
{
if (LSHKTimer)
{
if (g_LaraExtra.Weapons[WEAPON_HK].HasSilencer)
if (Lara.Weapons[WEAPON_HK].HasSilencer)
{
SoundEffect(SFX_HK_SILENCED, 0, 0);
}
@ -1438,7 +1422,7 @@ void BinocularCamera(ITEM_INFO* item)
{
LSHKTimer = 4;
firing = 1;
if (g_LaraExtra.Weapons[WEAPON_HK].HasSilencer)
if (Lara.Weapons[WEAPON_HK].HasSilencer)
{
SoundEffect(SFX_HK_SILENCED, 0, 0);
}
@ -1491,13 +1475,13 @@ void LaraTorch(PHD_VECTOR* src, PHD_VECTOR* target, int rot, int color)
if (!LOS(&pos1, &pos2))
{
int l = SQRT_ASM(SQUARE(pos1.x - pos2.x) + SQUARE(pos1.y - pos2.y) + SQUARE(pos1.z - pos2.z)) >> 8;
int l = sqrt(SQUARE(pos1.x - pos2.x) + SQUARE(pos1.y - pos2.y) + SQUARE(pos1.z - pos2.z)) * 256;
if (l + 8 > 31)
l = 31;
if (color - l >= 0)
TriggerDynamicLight(pos2.x, pos2.y, pos2.z, l + 8, color - l, color - l, (color - l) >> 1);
TriggerDynamicLight(pos2.x, pos2.y, pos2.z, l + 8, color - l, color - l, (color - l) * 2);
}
}
@ -1508,7 +1492,7 @@ void ConfirmCameraTargetPos()
pos.y = 0;
pos.z = 0;
GetJointAbsPosition(LaraItem, &pos, LJ_LHAND);
GetLaraJointPosition(&pos, LM_LHAND);
if (Camera.laraNode != -1)
{
@ -1543,7 +1527,8 @@ void ConfirmCameraTargetPos()
void CalculateCamera()
{
SniperOverlay = 0;
SniperCamActive = 0;
// FIXME
//SniperCamActive = 0;
CamOldPos.x = Camera.pos.x;
CamOldPos.y = Camera.pos.y;
@ -1612,7 +1597,7 @@ void CalculateCamera()
if (Camera.type == CINEMATIC_CAMERA)
{
Legacy_do_new_cutscene_camera();
//Legacy_do_new_cutscene_camera();
return;
}
@ -1641,9 +1626,9 @@ void CalculateCamera()
{
int dx = Camera.item->pos.xPos - item->pos.xPos;
int dz = Camera.item->pos.zPos - item->pos.zPos;
int shift = SQRT_ASM(SQUARE(dx) + SQUARE(dz));
short angle = ATAN(dz, dx) - item->pos.yRot;
short tilt = ATAN(shift, y - (bounds[2] + bounds[3]) / 2 - Camera.item->pos.yPos);
int shift = sqrt(SQUARE(dx) + SQUARE(dz));
short angle = phd_atan(dz, dx) - item->pos.yRot;
short tilt = phd_atan(shift, y - (bounds[2] + bounds[3]) / 2 - Camera.item->pos.yPos);
bounds = GetBoundsAccurate(Camera.item);
angle >>= 1;
tilt >>= 1;
@ -1721,7 +1706,7 @@ void CalculateCamera()
pos.x = 0;
pos.y = 0;
pos.z = 0;
GetLaraJointPosition(&pos, LJ_TORSO);
GetLaraJointPosition(&pos, LM_TORSO);
x = pos.x;
y = pos.y;
@ -1734,8 +1719,8 @@ void CalculateCamera()
else
{
int shift = (bounds[0] + bounds[1] + bounds[4] + bounds[5]) >> 2;
x = item->pos.xPos + (shift * SIN(item->pos.yRot) >> W2V_SHIFT);
z = item->pos.zPos + (shift * COS(item->pos.yRot) >> W2V_SHIFT);
x = item->pos.xPos + (shift * phd_sin(item->pos.yRot) >> W2V_SHIFT);
z = item->pos.zPos + (shift * phd_cos(item->pos.yRot) >> W2V_SHIFT);
Camera.target.x = x;
Camera.target.z = z;
@ -1810,20 +1795,3 @@ void CalculateCamera()
Camera.laraNode = -1;
}
}
void Inject_Camera()
{
INJECT(0x0048EDC0, AlterFOV);
INJECT(0x0048F760, LookAt);
INJECT(0x0040FA70, mgLOS);
INJECT(0x0040C7A0, MoveCamera);
INJECT(0x0040C690, InitialiseCamera);
INJECT(0x004107C0, UpdateCameraElevation);
INJECT(0x0040D150, ChaseCamera);
INJECT(0x0040D640, CombatCamera);
INJECT(0x0040F5C0, CameraCollisionBounds);
INJECT(0x0040E890, FixedCamera);
INJECT(0x0040DC10, LookCamera);
INJECT(0x0040FC20, BinocularCamera);
INJECT(0x0040ED30, CalculateCamera);
}

View file

@ -15,6 +15,10 @@ extern CAMERA_TYPE BinocularOldCamera;
extern int LaserSight;
extern int SniperCount;
extern int ExitingBinocular;
extern int PhdPerspective;
extern short CurrentFOV;
extern int GetLaraOnLOS;
extern int SniperOverlay;
void ActivateCamera();
void LookAt(int posX, int posY, int posZ, int targetX, int targetY, int targetZ, short roll);
@ -33,5 +37,3 @@ void BinocularCamera(ITEM_INFO* item);
void LaraTorch(PHD_VECTOR* src, PHD_VECTOR* target, int rot, int color);
void ConfirmCameraTargetPos();
void CalculateCamera();
void Inject_Camera();

View file

@ -10,6 +10,8 @@
#include "sphere.h"
#include "misc.h"
#include "../Specific/setup.h"
#include "../Specific/level.h"
#include "sound.h"
char LM[] = {
LJ_HIPS,
@ -31,6 +33,8 @@ char LM[] = {
int XFront, ZFront;
BOUNDING_BOX GlobalCollisionBounds;
ITEM_INFO* CollidedItems[1024];
MESH_INFO* CollidedMeshes[1024];
int CollideStaticObjects(COLL_INFO* coll, int x, int y, int z, short roomNumber, int hite)
{
@ -145,8 +149,8 @@ int GetCollidedObjects(ITEM_INFO* collidingItem, int radius, int onlyVisible, IT
{
if (collidingItem->pos.yPos <= mesh->y + staticMesh->yMaxc)
{
s = SIN(mesh->yRot);
c = COS(mesh->yRot);
s = phd_sin(mesh->yRot);
c = phd_cos(mesh->yRot);
rx = ((collidingItem->pos.xPos - mesh->x) * c - s * (collidingItem->pos.zPos - mesh->z)) >> W2V_SHIFT;
rz = ((collidingItem->pos.zPos - mesh->z) * c + s * (collidingItem->pos.xPos - mesh->x)) >> W2V_SHIFT;
@ -220,8 +224,8 @@ int GetCollidedObjects(ITEM_INFO* collidingItem, int radius, int onlyVisible, IT
&& collidingItem->pos.yPos + radius + 128 >= item->pos.yPos + framePtr[2]
&& collidingItem->pos.yPos - radius - 128 <= item->pos.yPos + framePtr[3])
{
int s = SIN(item->pos.yRot);
int c = COS(item->pos.yRot);
int s = phd_sin(item->pos.yRot);
int c = phd_cos(item->pos.yRot);
int rx = (dx * c - s * dz) >> W2V_SHIFT;
int rz = (dz * c + s * dx) >> W2V_SHIFT;
@ -269,8 +273,8 @@ int TestWithGlobalCollisionBounds(ITEM_INFO* item, ITEM_INFO* lara, COLL_INFO* c
if (item->pos.yPos + GlobalCollisionBounds.Y1 >= framePtr[4])
return false;
int s = SIN(item->pos.yRot);
int c = COS(item->pos.yRot);
int s = phd_sin(item->pos.yRot);
int c = phd_cos(item->pos.yRot);
int dx = lara->pos.xPos - item->pos.xPos;
int dz = lara->pos.zPos - item->pos.zPos;
@ -314,14 +318,14 @@ void TestForObjectOnLedge(ITEM_INFO* item, COLL_INFO* coll)//2A940(<), 2AB68(<)
s.y = -256;
s.z = 0;
GetLaraJointPosition((PHD_VECTOR*)&s, LJ_HEAD);
GetLaraJointPosition((PHD_VECTOR*)&s, LM_HEAD);
s.roomNumber = LaraItem->roomNumber;
GAME_VECTOR d;
d.x = 0;
d.x = (s.x + ((SIN(LaraItem->pos.yRot) << 1) + SIN(LaraItem->pos.yRot))) >> 4;
d.x = (s.x + ((phd_sin(LaraItem->pos.yRot) << 1) + phd_sin(LaraItem->pos.yRot))) >> 4;
d.y = s.y;
d.z = (s.z + ((COS(LaraItem->pos.yRot) << 1) + COS(LaraItem->pos.yRot))) >> 4;
d.z = (s.z + ((phd_cos(LaraItem->pos.yRot) << 1) + phd_cos(LaraItem->pos.yRot))) >> 4;
LOS(&s, &d);
@ -460,8 +464,8 @@ int TestBoundsCollideStatic(short* bounds, PHD_3DPOS* pos, int radius)
int c, s;
int x, z, dx, dz;
c = COS(pos->yRot);
s = SIN(pos->yRot);
c = phd_cos(pos->yRot);
s = phd_sin(pos->yRot);
x = LaraItem->pos.xPos - pos->xPos;
z = LaraItem->pos.zPos - pos->zPos;
dx = (c * x - s * z) >> W2V_SHIFT;
@ -487,8 +491,8 @@ int ItemPushLaraStatic(ITEM_INFO* item, short* bounds, PHD_3DPOS* pos, COLL_INFO
int left, right, top, bottom;
short oldFacing;
c = COS(pos->yRot);
s = SIN(pos->yRot);
c = phd_cos(pos->yRot);
s = phd_sin(pos->yRot);
dx = LaraItem->pos.xPos - pos->xPos;
dz = LaraItem->pos.zPos - pos->zPos;
rx = (c * dx - s * dz) >> W2V_SHIFT;
@ -528,7 +532,7 @@ int ItemPushLaraStatic(ITEM_INFO* item, short* bounds, PHD_3DPOS* pos, COLL_INFO
coll->badCeiling = 0;
oldFacing = coll->facing;
coll->facing = ATAN(item->pos.zPos - coll->old.z, item->pos.xPos - coll->old.x);
coll->facing = phd_atan(item->pos.zPos - coll->old.z, item->pos.xPos - coll->old.x);
GetCollisionInfo(coll, item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, LARA_HITE);
coll->facing = oldFacing;
@ -563,8 +567,8 @@ int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, cha
short* bounds;
short facing;
c = COS(item->pos.yRot);
s = SIN(item->pos.yRot);
c = phd_cos(item->pos.yRot);
s = phd_sin(item->pos.yRot);
dx = LaraItem->pos.xPos - item->pos.xPos;
dz = LaraItem->pos.zPos - item->pos.zPos;
rx = (c * dx - s * dz) >> W2V_SHIFT;
@ -621,7 +625,7 @@ int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, cha
dx -= (c * rx + s * rz) >> W2V_SHIFT;
dz -= (c * rz - s * rx) >> W2V_SHIFT;
Lara.hitDirection = (l->pos.yRot - ATAN(dz, dz) - ANGLE(135)) >> W2V_SHIFT;
Lara.hitDirection = (l->pos.yRot - phd_atan(dz, dz) - ANGLE(135)) >> W2V_SHIFT;
if (!Lara.hitFrame)
SoundEffect(SFX_LARA_INJURY_RND, &l->pos, 0);
@ -636,7 +640,7 @@ int ItemPushLara(ITEM_INFO* item, ITEM_INFO* l, COLL_INFO* coll, int spazon, cha
coll->badCeiling = 0;
facing = coll->facing;
coll->facing = ATAN(l->pos.zPos - coll->old.z, l->pos.xPos - coll->old.x);
coll->facing = phd_atan(l->pos.zPos - coll->old.z, l->pos.xPos - coll->old.x);
GetCollisionInfo(coll, l->pos.xPos, l->pos.yPos, l->pos.zPos, l->roomNumber, LARA_HITE);
coll->facing = facing;
@ -692,18 +696,17 @@ void AlignLaraPosition(PHD_VECTOR* vec, ITEM_INFO* item, ITEM_INFO* l)
l->pos.yRot = item->pos.yRot;
l->pos.zRot = item->pos.zRot;
phd_PushUnitMatrix();
phd_RotYXZ(item->pos.yRot, item->pos.xRot, item->pos.zRot);
Matrix matrix = Matrix::CreateFromYawPitchRoll(
TO_RAD(item->pos.yRot),
TO_RAD(item->pos.xRot),
TO_RAD(item->pos.zRot)
);
x = item->pos.xPos + ((MatrixPtr[M00] * vec->x + MatrixPtr[M01] * vec->y + MatrixPtr[M02] * vec->z) >> W2V_SHIFT);
y = item->pos.yPos + ((MatrixPtr[M10] * vec->x + MatrixPtr[M11] * vec->y + MatrixPtr[M12] * vec->z) >> W2V_SHIFT);
z = item->pos.zPos + ((MatrixPtr[M20] * vec->x + MatrixPtr[M21] * vec->y + MatrixPtr[M22] * vec->z) >> W2V_SHIFT);
Vector3 pos = Vector3::Transform(Vector3(vec->x, vec->y, vec->z), matrix);
phd_PopMatrix();
l->pos.xPos = x;
l->pos.yPos = y;
l->pos.zPos = z;
l->pos.xPos = item->pos.xPos + pos.x;
l->pos.yPos = item->pos.yPos + pos.y;
l->pos.zPos = item->pos.zPos + pos.z;
}
void TriggerLaraBlood()
@ -750,17 +753,19 @@ int TestLaraPosition(short* bounds, ITEM_INFO* item, ITEM_INFO* l)
if (zRotRel > bounds[11])
return FALSE;
phd_PushUnitMatrix();
phd_RotYXZ(item->pos.yRot, item->pos.xRot, item->pos.zRot);
Vector3 pos = Vector3(l->pos.xPos - item->pos.xPos, l->pos.yPos - item->pos.yPos, l->pos.zPos - item->pos.zPos);
x = l->pos.xPos - item->pos.xPos;
y = l->pos.yPos - item->pos.yPos;
z = l->pos.zPos - item->pos.zPos;
rx = (x * MatrixPtr[M00] + y * MatrixPtr[M10] + z * MatrixPtr[M20]) >> W2V_SHIFT;
ry = (x * MatrixPtr[M01] + y * MatrixPtr[M11] + z * MatrixPtr[M21]) >> W2V_SHIFT;
rz = (x * MatrixPtr[M02] + y * MatrixPtr[M12] + z * MatrixPtr[M22]) >> W2V_SHIFT;
Matrix matrix = Matrix::CreateFromYawPitchRoll(
TO_RAD(item->pos.yRot),
TO_RAD(item->pos.xRot),
TO_RAD(item->pos.zRot)
);
phd_PopMatrix();
pos = Vector3::Transform(pos, matrix);
rx = pos.x;
ry = pos.y;
rz = pos.z;
if (rx < bounds[0] || rx > bounds[1] || ry < bounds[2] || ry > bounds[3] || rz < bounds[4] || rz > bounds[5])
return FALSE;
@ -777,7 +782,7 @@ int Move3DPosTo3DPos(PHD_3DPOS* src, PHD_3DPOS* dest, int velocity, short angAdd
x = dest->xPos - src->xPos;
y = dest->yPos - src->yPos;
z = dest->zPos - src->zPos;
distance = SQRT_ASM(SQUARE(x) + SQUARE(y) + SQUARE(z));
distance = sqrt(SQUARE(x) + SQUARE(y) + SQUARE(z));
if (velocity < distance)
{
@ -896,14 +901,19 @@ int MoveLaraPosition(PHD_VECTOR* vec, ITEM_INFO* item, ITEM_INFO* l)
dest.yRot = item->pos.yRot;
dest.zRot = item->pos.zRot;
phd_PushUnitMatrix();
phd_RotYXZ(item->pos.yRot, item->pos.xRot, item->pos.zRot);
Vector3 pos = Vector3(vec->x, vec->y, vec->z);
dest.xPos = item->pos.xPos + ((MatrixPtr[M00] * vec->x + MatrixPtr[M01] * vec->y + MatrixPtr[M02] * vec->z) >> W2V_SHIFT);
dest.yPos = item->pos.yPos + ((MatrixPtr[M10] * vec->x + MatrixPtr[M11] * vec->y + MatrixPtr[M12] * vec->z) >> W2V_SHIFT);
dest.zPos = item->pos.zPos + ((MatrixPtr[M20] * vec->x + MatrixPtr[M21] * vec->y + MatrixPtr[M22] * vec->z) >> W2V_SHIFT);
Matrix matrix = Matrix::CreateFromYawPitchRoll(
TO_RAD(item->pos.yRot),
TO_RAD(item->pos.xRot),
TO_RAD(item->pos.zRot)
);
phd_PopMatrix();
pos = Vector3::Transform(pos, matrix);
dest.xPos = item->pos.xPos + pos.x;
dest.yPos = item->pos.yPos + pos.y;
dest.zPos = item->pos.zPos + pos.z;
if (item->objectNumber != ID_FLARE_ITEM && item->objectNumber != ID_BURNING_TORCH_ITEM)
return Move3DPosTo3DPos(&l->pos, &dest, LARA_VELOCITY, ANGLE(2));
@ -914,7 +924,7 @@ int MoveLaraPosition(PHD_VECTOR* vec, ITEM_INFO* item, ITEM_INFO* l)
if (abs(height - l->pos.yPos) <= CLICK(2))
{
if (SQRT_ASM(SQUARE(dest.xPos - l->pos.xPos) + SQUARE(dest.yPos - l->pos.yPos) + SQUARE(dest.zPos - l->pos.zPos)) < (STEP_SIZE/2))
if (sqrt(SQUARE(dest.xPos - l->pos.xPos) + SQUARE(dest.yPos - l->pos.yPos) + SQUARE(dest.zPos - l->pos.zPos)) < (STEP_SIZE/2))
return TRUE;
return Move3DPosTo3DPos(&l->pos, &dest, LARA_VELOCITY, ANGLE(2));
@ -944,8 +954,8 @@ int TestBoundsCollide(ITEM_INFO* item, ITEM_INFO* l, int radius)
{
if (item->pos.yPos + bounds[2] < l->pos.yPos + laraBounds[3])
{
c = COS(item->pos.yRot);
s = SIN(item->pos.yRot);
c = phd_cos(item->pos.yRot);
s = phd_sin(item->pos.yRot);
x = l->pos.xPos - item->pos.xPos;
z = l->pos.zPos - item->pos.zPos;
dx = (c * x - s * z) >> W2V_SHIFT;
@ -985,15 +995,15 @@ void CreatureCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
{
x = l->pos.xPos - item->pos.xPos;
z = l->pos.zPos - item->pos.zPos;
c = COS(item->pos.yRot);
s = SIN(item->pos.yRot);
c = phd_cos(item->pos.yRot);
s = phd_sin(item->pos.yRot);
frame = GetBestFrame(item);
rx = (frame[0] + frame[1]) / 2;
rz = (frame[4] + frame[5]) / 2;
if (frame[3] - frame[2] > STEP_SIZE)
{
int angle = (l->pos.yRot - ATAN(z - ((c * rx - s * rz) >> W2V_SHIFT), x - ((c * rx + s * rz) >> W2V_SHIFT)) - ANGLE(135)) >> W2V_SHIFT;
int angle = (l->pos.yRot - phd_atan(z - ((c * rx - s * rz) >> W2V_SHIFT), x - ((c * rx + s * rz) >> W2V_SHIFT)) - ANGLE(135)) >> W2V_SHIFT;
Lara.hitDirection = (short)angle;
// TODO: check if a second Lara.hitFrame++; is required there !
Lara.hitFrame++;
@ -1056,7 +1066,7 @@ void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNum
switch (coll->quadrant)
{
case 0:
XFront = (SIN(coll->facing) * coll->radius) >> (W2V_SHIFT);
XFront = (phd_sin(coll->facing) * coll->radius) >> (W2V_SHIFT);
ZFront = coll->radius;
xleft = -(coll->radius);
zleft = coll->radius;
@ -1066,7 +1076,7 @@ void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNum
case 1:
XFront = coll->radius;
ZFront = (COS(coll->facing) * coll->radius) >> (W2V_SHIFT);
ZFront = (phd_cos(coll->facing) * coll->radius) >> (W2V_SHIFT);
xleft = coll->radius;
zleft = coll->radius;
xright = coll->radius;
@ -1074,7 +1084,7 @@ void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNum
break;
case 2:
XFront = (SIN(coll->facing) * coll->radius) >> (W2V_SHIFT);
XFront = (phd_sin(coll->facing) * coll->radius) >> (W2V_SHIFT);
ZFront = -coll->radius;
xleft = coll->radius;
zleft = -(coll->radius);
@ -1084,7 +1094,7 @@ void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNum
case 3:
XFront = -(coll->radius);
ZFront = (COS(coll->facing) * coll->radius) >> (W2V_SHIFT);
ZFront = (phd_cos(coll->facing) * coll->radius) >> (W2V_SHIFT);
xleft = -(coll->radius);
zleft = -(coll->radius);
xright = -(coll->radius);
@ -1364,7 +1374,7 @@ void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNum
void LaraBaddieCollision(ITEM_INFO* l, COLL_INFO* coll)
{
ITEM_INFO* item;
OBJECT_INFO* obj;
ObjectInfo* obj;
l->hitStatus = false;
Lara.hitDirection = -1;
@ -1460,10 +1470,10 @@ void GenericSphereBoxCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
short oldRot = item->pos.yRot;
item->pos.yRot = 0;
GetSpheres(item, BaddieSpheres, 1);
GetSpheres(item, CreatureSpheres, SPHERES_SPACE_WORLD, Matrix::Identity);
item->pos.yRot = oldRot;
SPHERE* sphere = &BaddieSpheres[0];
SPHERE* sphere = &CreatureSpheres[0];
while (collided)
{
if (collided & 1)
@ -1509,11 +1519,3 @@ void GenericSphereBoxCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
}
}
}
void Inject_Collide()
{
INJECT(0x00411DB0, CollideStaticObjects);
INJECT(0x00413CF0, GetCollidedObjects);
INJECT(0x00410EF0, GetTiltType);
INJECT(0x00411100, GetCollisionInfo);
}

View file

@ -8,6 +8,8 @@
#define NO_BAD_NEG NO_HEIGHT
extern BOUNDING_BOX GlobalCollisionBounds;
extern ITEM_INFO* CollidedItems[1024];
extern MESH_INFO* CollidedMeshes[1024];
void GenericSphereBoxCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll);
int CollideStaticObjects(COLL_INFO* coll, int x, int y, int z, short roomNumber, int hite);
@ -33,5 +35,3 @@ int TestBoundsCollide(ITEM_INFO* item, ITEM_INFO* l, int radius);
void CreatureCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll);
void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNumber, int objectHeight);
void LaraBaddieCollision(ITEM_INFO* item, COLL_INFO* coll);
void Inject_Collide();

View file

@ -3,7 +3,6 @@
#include "..\Global\global.h"
#include "pickup.h"
#include "spotcam.h"
#include "Camera.h"
#include "Lara.h"
#include "hair.h"
@ -33,16 +32,39 @@
#include "..\Objects\oldobjects.h"
#include "footprint.h"
#include "..\Specific\roomload.h"
#include "..\Specific\level.h"
#include "..\Specific\input.h"
#include "..\Specific\init.h"
#include "..\Specific\winmain.h"
#include "../Specific/input.h"
#include <process.h>
#include <stdio.h>
#include "..\Renderer\Renderer11.h"
#include "../Specific/setup.h"
short ShatterSounds[18][10] =
{
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_WOOD, SFX_SMASH_WOOD, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_METAL, SFX_SMASH_METAL, SFX_SMASH_METAL, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_METAL, SFX_SMASH_METAL, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_METAL, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_METAL, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS },
{ SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS, SFX_SMASH_GLASS }
};
int KeyTriggerActive;
int number_los_rooms;
short los_rooms[20];
@ -65,8 +87,70 @@ short NextFxFree;
short NextItemActive;
short NextItemFree;
short* TriggerIndex;
string LuaMessage;
int DisableLaraControl = 0;
int WeatherType;
int LaraDrawType;
int NumberSoundSources;
OBJECT_VECTOR* SoundSources;
int NumAnimatedTextures;
short* AnimTextureRanges;
int nAnimUVRanges;
int Wibble = 0;
int SetDebounce = 0;
int CurrentAtmosphere;
short CurrentRoom;
int GameTimer;
short GlobalCounter;
byte LevelComplete;
short DelCutSeqPlayer;
int LastInventoryItem;
int TrackCameraInit;
short TorchRoom;
int InitialiseGame;
int RequiredStartPos;
int WeaponDelay;
int WeaponEnemyTimer;
int HeightType;
int HeavyTriggered;
short SkyPos1;
short SkyPos2;
signed char SkyVelocity1;
signed char SkyVelocity2;
CVECTOR SkyColor1;
CVECTOR SkyColor2;
int CutSeqNum;
int CutSeqTriggered;
int GlobalPlayingCutscene;
int CurrentLevel;
int SoundActive;
int DoTheGame;
int Unk_876C48;
int OnFloor;
int SmokeWindX;
int SmokeWindZ;
int OnObject;
int KillEverythingFlag;
int FlipTimer;
int FlipEffect;
int TriggerTimer;
int JustLoaded;
int PoisonFlags;
int OldLaraBusy;
int Infrared;
short FlashFadeR;
short FlashFadeG;
short FlashFadeB;
short FlashFader;
short IsRoomOutsideNo;
int TiltXOffset;
int TiltYOffset;
int FramesCount;
extern GameFlow* g_GameFlow;
extern GameScript* g_GameScript;
extern Inventory* g_Inventory;
@ -217,9 +301,9 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
else if (BinocularRange == 0)
{
if (Lara.gunStatus == LG_READY
&& ((Lara.gunType == WEAPON_REVOLVER && g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight)
&& ((Lara.gunType == WEAPON_REVOLVER && Lara.Weapons[WEAPON_REVOLVER].HasLasersight)
|| (Lara.gunType == WEAPON_HK)
|| (Lara.gunType == WEAPON_CROSSBOW && g_LaraExtra.Weapons[WEAPON_CROSSBOW].HasLasersight)))
|| (Lara.gunType == WEAPON_CROSSBOW && Lara.Weapons[WEAPON_CROSSBOW].HasLasersight)))
{
BinocularRange = 128;
BinocularOldCamera = Camera.oldType;
@ -342,7 +426,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
{
Lara.poisoned = 4096;
}
if ((gfLevelFlags & 0x80u) != 0 && !Lara.gassed)
if (/*(gfLevelFlags & 0x80u) != 0 &&*/ !Lara.gassed)
{
if (Lara.dpoisoned)
{
@ -432,13 +516,13 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
UpdateBats();
UpdateSpiders();
UpdateShockwaves();
Legacy_UpdateLightning();
//Legacy_UpdateLightning();
AnimateWaterfalls();
if (level->Rumble)
RumbleScreen();
SoundEffects();
//SoundEffects();
HealtBarTimer--;
@ -450,15 +534,11 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode)
unsigned __stdcall GameMain(void*)
{
DB_Log(2, "GameMain - DLL");
//DB_Log(2, "GameMain - DLL");
printf("GameMain\n");
// We still need legacy matrices because control routines use them
MatrixPtr = MatrixStack;
DxMatrixPtr = (byte*)malloc(48 * 40);
// Initialise legacy memory buffer and game timer
InitGameMalloc();
init_game_malloc();
TIME_Init();
// Do a fixed time title image
@ -478,12 +558,9 @@ unsigned __stdcall GameMain(void*)
GAME_STATUS DoTitle(int index)
{
DB_Log(2, "DoTitle - DLL");
//DB_Log(2, "DoTitle - DLL");
printf("DoTitle\n");
CreditsDone = false;
CanLoad = false;
// Load the level
S_LoadLevelFile(index);
@ -511,8 +588,6 @@ GAME_STATUS DoTitle(int index)
LastInventoryItem = -1;
DelCutSeqPlayer = 0;
TitleControlsLockedOut = false;
GameMode = 1;
// Initialise flyby cameras
InitSpotCamSequences();
@ -555,9 +630,6 @@ GAME_STATUS DoTitle(int index)
GAME_STATUS DoLevel(int index, int ambient, bool loadFromSavegame)
{
CreditsDone = false;
CanLoad = false;
// If not loading a savegame, then clear all the infos
if (!loadFromSavegame)
{
@ -616,7 +688,6 @@ GAME_STATUS DoLevel(int index, int ambient, bool loadFromSavegame)
LastInventoryItem = -1;
DelCutSeqPlayer = 0;
TitleControlsLockedOut = false;
g_Inventory->SetEnterObject(NO_ITEM);
g_Inventory->SetSelectedObject(NO_ITEM);
@ -632,13 +703,20 @@ GAME_STATUS DoLevel(int index, int ambient, bool loadFromSavegame)
InitialiseHair();
int nframes = 2;
// First control phase
g_Renderer->ResetAnimations();
GAME_STATUS result = ControlPhase(nframes, 0);
// Fade in screen
g_Renderer->FadeIn();
// The game loop, finally!
while (true)
{
nframes = DrawPhaseGame();
g_Renderer->ResetAnimations();
result = ControlPhase(nframes, 0);
if (result == GAME_STATUS_EXIT_TO_TITLE ||
@ -1240,8 +1318,8 @@ short GetDoor(FLOOR_INFO* floor)
void TranslateItem(ITEM_INFO* item, int x, int y, int z)
{
int c = COS(item->pos.yRot);
int s = SIN(item->pos.yRot);
int c = phd_cos(item->pos.yRot);
int s = phd_sin(item->pos.yRot);
item->pos.xPos += (c * x + s * z) >> W2V_SHIFT;
item->pos.yPos += y;
@ -1565,7 +1643,7 @@ int GetFloorHeight(FLOOR_INFO* floor, int x, int y, int z)
int xOff, yOff, trigger;
ITEM_INFO* item;
OBJECT_INFO* obj;
ObjectInfo* obj;
int tilts, t0, t1, t2, t3, t4, dx, dz, h1, h2;
do
@ -2115,15 +2193,15 @@ int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firi
item->hitPoints -= 30;
if (item->hitPoints < 0)
item->hitPoints = 0;
HitTarget(item, &target, WeaponsArray[Lara.gunType].damage, 0);
HitTarget(item, &target, Weapons[Lara.gunType].damage, 0);
}
else
{
angle = ATAN(LaraItem->pos.zPos - item->pos.zPos, LaraItem->pos.xPos - item->pos.xPos) - item->pos.yRot;
angle = phd_atan(LaraItem->pos.zPos - item->pos.zPos, LaraItem->pos.xPos - item->pos.xPos) - item->pos.yRot;
if (angle > -ANGLE(90) && angle < ANGLE(90))
{
item->hitPoints = 0;
HitTarget(item, &target, WeaponsArray[Lara.gunType].damage, 0);
HitTarget(item, &target, Weapons[Lara.gunType].damage, 0);
}
}
}
@ -2134,7 +2212,7 @@ int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firi
{
if (Objects[item->objectNumber].intelligent)
{
HitTarget(item, &target, WeaponsArray[Lara.gunType].damage, 0);
HitTarget(item, &target, Weapons[Lara.gunType].damage, 0);
}
else
{
@ -2165,7 +2243,7 @@ int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firi
item->hitStatus = true;
if (!Objects[item->objectNumber].undead)
{
item->hitPoints -= WeaponsArray[Lara.gunType].damage;
item->hitPoints -= Weapons[Lara.gunType].damage;
}
}
}
@ -2545,123 +2623,56 @@ int GetCeiling(FLOOR_INFO* floor, int x, int y, int z) // (F) (D)
int DoRayBox(GAME_VECTOR* start, GAME_VECTOR* end, short* box, PHD_3DPOS* itemOrStaticPos, PHD_VECTOR* hitPos, short closesItemNumber)
{
PHD_VECTOR p1, p2;
// Ray
FXMVECTOR rayStart = { start->x, start->y, start->z };
FXMVECTOR rayEnd = { end->x, end->y, end->z };
FXMVECTOR rayDir = { end->x - start->x, end->y - start->y, end->z - start->z };
XMVECTOR rayDirNormalized = XMVector3Normalize(rayDir);
p1.x = box[0] << 16;
p2.x = box[1] << 16;
p1.y = box[2] << 16;
p2.y = box[3] << 16;
p1.z = box[4] << 16;
p2.z = box[5] << 16;
// Create the bounding box for raw collision detection
Vector3 boxCentre = Vector3(itemOrStaticPos->xPos + (box[1] + box[0]) / 2.0f, itemOrStaticPos->yPos + (box[3] + box[2]) / 2.0f, itemOrStaticPos->zPos + (box[5] + box[4]) / 2.0f);
Vector3 boxExtent = Vector3((box[1] - box[0]) / 2.0f, (box[3] - box[2]) / 2.0f, (box[5] - box[4]) / 2.0f);
Quaternion rotation = Quaternion::CreateFromAxisAngle(Vector3::UnitY, TO_RAD(itemOrStaticPos->yRot));
BoundingOrientedBox obox = BoundingOrientedBox(boxCentre, boxExtent, rotation);
int dx2 = end->x - itemOrStaticPos->xPos;
int dy2 = end->y - itemOrStaticPos->yPos;
int dz2 = end->z - itemOrStaticPos->zPos;
// Get the collision with the bounding box
float distance;
bool collided = obox.Intersects(rayStart, rayDirNormalized, distance);
phd_PushUnitMatrix();
phd_RotY(-itemOrStaticPos->yRot);
int a1 = MatrixPtr[M00] * dx2 +
MatrixPtr[M01] * dy2 +
MatrixPtr[M02] * dz2;
int a2 = MatrixPtr[M10] * dx2 +
MatrixPtr[M11] * dy2 +
MatrixPtr[M12] * dz2;
int a3 = MatrixPtr[M20] * dx2 +
MatrixPtr[M21] * dy2 +
MatrixPtr[M22] * dz2;
int dx1 = start->x - itemOrStaticPos->xPos;
int dy1 = start->y - itemOrStaticPos->yPos;
int dz1 = start->z - itemOrStaticPos->zPos;
int b1 = MatrixPtr[M00] * dx1 +
MatrixPtr[M01] * dy1 +
MatrixPtr[M02] * dz1;
int b2 = MatrixPtr[M10] * dx1 +
MatrixPtr[M11] * dy1 +
MatrixPtr[M12] * dz1;
int b3 = MatrixPtr[M20] * dx1 +
MatrixPtr[M21] * dy1 +
MatrixPtr[M22] * dz1;
phd_PopMatrix();
PHD_VECTOR vec;
vec.x = ((a1 >> W2V_SHIFT) - (b1 >> W2V_SHIFT)) << 16;
vec.y = ((a2 >> W2V_SHIFT) - (b2 >> W2V_SHIFT)) << 16;
vec.z = ((a3 >> W2V_SHIFT) - (b3 >> W2V_SHIFT)) << 16;
NormaliseRopeVector(&vec);
PHD_VECTOR pb;
pb.x = b1 >> W2V_SHIFT << 16;
pb.y = b2 >> W2V_SHIFT << 16;
pb.z = b3 >> W2V_SHIFT << 16;
vec.x <<= 8;
vec.y <<= 8;
vec.z <<= 8;
if (!DoRayBox_sub_401523(&p1, &p2, &pb, &vec, hitPos))
// If no collision happened, then don't test spheres
if (!collided)
return 0;
if (hitPos->x < box[0]
|| hitPos->y < box[2]
|| hitPos->z < box[4]
|| hitPos->x > box[1]
|| hitPos->y > box[3]
|| hitPos->z > box[5])
return 0;
phd_PushUnitMatrix();
phd_RotY(itemOrStaticPos->yRot);
int c1 = MatrixPtr[M00] * hitPos->x +
MatrixPtr[M01] * hitPos->y +
MatrixPtr[M02] * hitPos->z;
int c2 = MatrixPtr[M10] * hitPos->x +
MatrixPtr[M11] * hitPos->y +
MatrixPtr[M12] * hitPos->z;
int c3 = MatrixPtr[M20] * hitPos->x +
MatrixPtr[M21] * hitPos->y +
MatrixPtr[M22] * hitPos->z;
hitPos->x = (c1 >> W2V_SHIFT);
hitPos->y = (c2 >> W2V_SHIFT);
hitPos->z = (c3 >> W2V_SHIFT);
phd_PopMatrix();
// Get the raw collision point
Vector3 collidedPoint = rayStart + distance * rayDirNormalized;
hitPos->x = collidedPoint.x - itemOrStaticPos->xPos;
hitPos->y = collidedPoint.y - itemOrStaticPos->yPos;
hitPos->z = collidedPoint.z - itemOrStaticPos->zPos;
// Now in the case of items we need to test single spheres
short* meshPtr = NULL;
int bit = 0;
int sp = -2;
int minDistance = 0x7FFFFFFF;
float minDistance = SECTOR(1024);
int action = TrInput & IN_ACTION;
if (closesItemNumber < 0)
{
// Static meshes don't require further tests
sp = -1;
minDistance = distance;
}
else
{
// For items instead we need to test spheres
ITEM_INFO* item = &Items[closesItemNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
GetSpheres(item, SphereList, 1);
ObjectInfo* obj = &Objects[item->objectNumber];
// Get the ransformed sphere of meshes
GetSpheres(item, CreatureSpheres, SPHERES_SPACE_WORLD, Matrix::Identity);
SPHERE spheres[34];
memcpy(spheres, SphereList, sizeof(SPHERE) * 34);
memcpy(spheres, CreatureSpheres, sizeof(SPHERE) * 34);
if (obj->nmeshes <= 0)
return 0;
@ -2669,39 +2680,22 @@ int DoRayBox(GAME_VECTOR* start, GAME_VECTOR* end, short* box, PHD_3DPOS* itemOr
for (int i = 0; i < obj->nmeshes; i++)
{
// If mesh is visibile...
if (item->meshBits & (1 << i))
{
SPHERE* sphere = &SphereList[i];
SPHERE* sphere = &CreatureSpheres[i];
if (item->meshBits & (1 << i))
// Create the bounding sphere and test it against the ray
BoundingSphere sph = BoundingSphere(Vector3(sphere->x, sphere->y, sphere->z), sphere->r);
float newDist;
if (sph.Intersects(rayStart, rayDirNormalized, newDist))
{
SPHERE* sphere = &SphereList[i];
int dx = end->x - start->x;
int dy = end->y - start->y;
int dz = end->z - start->z;
int d1 = dx * (sphere->x - start->x) + dy * (sphere->y - start->y) + dz * (sphere->z - start->z);
int d2 = SQUARE(dx) + SQUARE(dy) + SQUARE(dz);
if ((d1 < 0 && d2 < 0) || (d1 > 0 && d2 > 0) || abs(d1) <= abs(d2))
{
int l;
if (d2 >> 16)
l = d1 / (d2 >> 16);
else
l = 0;
int x = start->x + (l * dx >> 16);
int y = start->y + (l * dy >> 16);
int z = start->z + (l * dz >> 16);
int d = SQUARE(x - sphere->x) + SQUARE(y - sphere->y) + SQUARE(z - sphere->z);
if (d <= SQUARE(sphere->r))
{
int newDist = SQUARE(sphere->x - start->x) + SQUARE(sphere->y - start->y) + SQUARE(sphere->z - start->z);
// HACK: Core seems to take in account for distance not the real hit point but the centre of the sphere.
// This can work well for example for GUARDIAN because the head sphere is so big that would always be hit
// and eyes would not be destroyed.
newDist = sqrt(SQUARE(sphere->x - start->x) + SQUARE(sphere->y - start->y) + SQUARE(sphere->z - start->z));
// Test for min distance
if (newDist < minDistance)
{
minDistance = newDist;
@ -2712,42 +2706,37 @@ int DoRayBox(GAME_VECTOR* start, GAME_VECTOR* end, short* box, PHD_3DPOS* itemOr
}
}
}
}
}
if (sp < -1)
return 0;
}
printf("Bit: %d \n", bit);
int distance = SQUARE(hitPos->x + itemOrStaticPos->xPos - start->x)
+ SQUARE(hitPos->y + itemOrStaticPos->yPos - start->y)
+ SQUARE(hitPos->z + itemOrStaticPos->zPos - start->z);
if (distance >= ClosestDist)
return 0;
// Setup test result
ClosestCoord.x = hitPos->x + itemOrStaticPos->xPos;
ClosestCoord.y = hitPos->y + itemOrStaticPos->yPos;
ClosestCoord.z = hitPos->z + itemOrStaticPos->zPos;
ClosestDist = distance;
ClosestItem = closesItemNumber;
// If collided object is an item, then setup the shatter item data struct
if (sp >= 0)
{
ITEM_INFO* item = &Items[closesItemNumber];
GetSpheres(item, SphereList, 3);
GetSpheres(item, CreatureSpheres, SPHERES_SPACE_WORLD | SPHERES_SPACE_BONE_ORIGIN, Matrix::Identity);
ShatterItem.yRot = item->pos.yRot;
ShatterItem.meshp = meshPtr;
ShatterItem.sphere.x = SphereList[sp].x;
ShatterItem.sphere.y = SphereList[sp].y;
ShatterItem.sphere.z = SphereList[sp].z;
ShatterItem.sphere.x = CreatureSpheres[sp].x;
ShatterItem.sphere.y = CreatureSpheres[sp].y;
ShatterItem.sphere.z = CreatureSpheres[sp].z;
ShatterItem.bit = bit;
ShatterItem.flags = 0;
}
return 1;
}
@ -2920,11 +2909,15 @@ void AnimateItem(ITEM_INFO* item)
lateral >>= 16;
}
item->pos.xPos += item->speed * SIN(item->pos.yRot) >> W2V_SHIFT;
item->pos.zPos += item->speed * COS(item->pos.yRot) >> W2V_SHIFT;
item->pos.xPos += item->speed * phd_sin(item->pos.yRot) >> W2V_SHIFT;
item->pos.zPos += item->speed * phd_cos(item->pos.yRot) >> W2V_SHIFT;
item->pos.xPos += lateral * SIN(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
item->pos.zPos += lateral * COS(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
item->pos.xPos += lateral * phd_sin(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
item->pos.zPos += lateral * phd_cos(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
// Update matrices
short itemNumber = item - Items;
g_Renderer->UpdateItemAnimations(itemNumber, true);
}
void DoFlipMap(short group)
@ -3105,13 +3098,13 @@ int ExplodeItemNode(ITEM_INFO* item, int Node, int NoXZVel, int bits)
{
Num = -64;
}
GetSpheres(item, SphereList, 3);
GetSpheres(item, CreatureSpheres, SPHERES_SPACE_WORLD | SPHERES_SPACE_BONE_ORIGIN, Matrix::Identity);
ShatterItem.yRot = item->pos.yRot;
ShatterItem.bit = 1 << Node;
ShatterItem.meshp = Meshes[Objects[item->objectNumber].meshIndex + Node];
ShatterItem.sphere.x = SphereList[Node].x;
ShatterItem.sphere.y = SphereList[Node].y;
ShatterItem.sphere.z = SphereList[Node].z;
ShatterItem.sphere.x = CreatureSpheres[Node].x;
ShatterItem.sphere.y = CreatureSpheres[Node].y;
ShatterItem.sphere.z = CreatureSpheres[Node].z;
ShatterItem.il = (ITEM_LIGHT *) &item->legacyLightData;
ShatterItem.flags = item->objectNumber == ID_CROSSBOW_BOLT ? 0x400 : 0;
ShatterImpactData.impactDirection = Vector3(0, -1, 0);
@ -3269,18 +3262,72 @@ void InterpolateAngle(short angle, short* rotation, short* outAngle, int shift)
*rotation += deltaAngle >> shift;
}
void Inject_Control()
#define OutsideRoomTable VAR_U_(0x00EEF4AC, unsigned char*)
#define OutsideRoomOffsets ARRAY_(0x00EEF040, short, [27 * 27])
int IsRoomOutside(int x, int y, int z)
{
INJECT(0x00416760, TestTriggers);
INJECT(0x004167B0, TestTriggers);
INJECT(0x00415960, TranslateItem);
INJECT(0x00415B20, GetFloor);
INJECT(0x00417640, GetCeiling);
INJECT(0x004A7C10, GetRandomControl);
INJECT(0x004A7C40, GetRandomDraw);
INJECT(0x004A7C70, SeedRandomControl);
INJECT(0x004A7C90, SeedRandomDraw);
INJECT(0x00415300, AnimateItem);
INJECT(0x0041A170, GetTargetOnLOS);
INJECT(0x00415DA0, GetWaterHeight);
return 0;
short offset = OutsideRoomOffsets[((x >> 12) * 27) + (z >> 12)];
if (offset == -1)
return -2;
if (offset < 0)
{
ROOM_INFO* r = &Rooms[(offset & 0x7FFF)];
if ((y > r->maxceiling) && (y < r->minfloor)
&& ((z > (r->z + 1024)) && (z < (r->z + ((r->xSize - 1) * 1024))))
&& ((x > (r->x + 1024)) && (x < (r->x + ((r->ySize - 1) * 1024)))))
{
short roomNumber = offset & 0x7fff;
FLOOR_INFO* floor = GetFloor(x, y, z, &roomNumber);
int height = GetFloorHeight(floor, x, y, z);
if (height == NO_HEIGHT || y > height)
return -2;
height = GetCeiling(floor, x, y, z);
if (y < height)
return -2;
if (!(r->flags & (ENV_FLAG_WIND | ENV_FLAG_WATER)))
return -3;
IsRoomOutsideNo = offset & 0x7FFF;
return 1;
}
else
return -2;
}
else
{
unsigned char* s = &OutsideRoomTable[offset];
while (*s != 0xFF)
{
ROOM_INFO* r = &Rooms[*s];
if ((y > r->maxceiling && y < r->minfloor)
&& ((z > (r->z + 1024)) && (z < (r->z + ((r->xSize - 1) * 1024))))
&& ((x > (r->x + 1024)) && (x < (r->x + ((r->ySize - 1) * 1024)))))
{
short roomNumber = *s;
FLOOR_INFO* floor = GetFloor(x, y, z, &roomNumber);
int height = GetFloorHeight(floor, x, y, z);
if (height == NO_HEIGHT || y > height)
return -2;
height = GetCeiling(floor, x, y, z);
if (y < height)
return -2;
if (!(r->flags & (ENV_FLAG_WIND | ENV_FLAG_WATER)))
return -3;
IsRoomOutsideNo = *s;
return 1;
}
s++;
}
return -2;
}
}

View file

@ -2,8 +2,6 @@
#include "..\Global\global.h"
#define DoRayBox_sub_401523 ((int (__cdecl*)(PHD_VECTOR*, PHD_VECTOR*, PHD_VECTOR*, PHD_VECTOR*, PHD_VECTOR*)) 0x00401523)
#define TRIG_BITS(T) ((T & 0x3fff) >> 10)
extern int KeyTriggerActive;
@ -19,6 +17,65 @@ extern short NextFxFree;
extern short NextItemActive;
extern short NextItemFree;
extern short* TriggerIndex;
extern int DisableLaraControl;
extern int WeatherType;
extern int LaraDrawType;
extern int NumberSoundSources;
extern OBJECT_VECTOR* SoundSources;
extern int NumAnimatedTextures;
extern short* AnimTextureRanges;
extern int nAnimUVRanges;
extern int Wibble;
extern int SetDebounce;
extern int CurrentAtmosphere;
extern short ShatterSounds[18][10];
extern int CurrentAtmosphere;
extern short CurrentRoom;
extern int GameTimer;
extern short GlobalCounter;
extern byte LevelComplete;
extern short DelCutSeqPlayer;
extern int LastInventoryItem;
extern int TrackCameraInit;
extern short TorchRoom;
extern int InitialiseGame;
extern int RequiredStartPos;
extern int WeaponDelay;
extern int WeaponEnemyTimer;
extern int HeightType;
extern int HeavyTriggered;
extern short SkyPos1;
extern short SkyPos2;
extern signed char SkyVelocity1;
extern signed char SkyVelocity2;
extern CVECTOR SkyColor1;
extern CVECTOR SkyColor2;
extern int CutSeqNum;
extern int CutSeqTriggered;
extern int GlobalPlayingCutscene;
extern int CurrentLevel;
extern int SoundActive;
extern int DoTheGame;
extern int Unk_876C48;
extern int OnFloor;
extern int SmokeWindX;
extern int SmokeWindZ;
extern int OnObject;
extern int KillEverythingFlag;
extern int FlipTimer;
extern int FlipEffect;
extern int TriggerTimer;
extern int JustLoaded;
extern int PoisonFlags;
extern int OldLaraBusy;
extern int Infrared;
extern short FlashFadeR;
extern short FlashFadeG;
extern short FlashFadeB;
extern short FlashFader;
extern short IsRoomOutsideNo;
extern int TiltXOffset;
extern int TiltYOffset;
GAME_STATUS DoTitle(int index);
GAME_STATUS DoLevel(int index, int ambient, bool loadFromSavegame);
@ -63,6 +120,6 @@ int TriggerActive(ITEM_INFO* item);
int GetWaterHeight(int x, int y, int z, short roomNumber);
int is_object_in_room(short roomNumber, short objectNumber);
void InterpolateAngle(short angle, short* rotation, short* outAngle, int shift);
int IsRoomOutside(int x, int y, int z);
unsigned __stdcall GameMain(void*);
void Inject_Control();

View file

@ -1,6 +1,7 @@
#include "debris.h"
#include "../Specific/roomload.h"
#include "../Specific/level.h"
#include "../Specific/setup.h"
#include "control.h"
ShatterImpactInfo ShatterImpactData;
SHATTER_ITEM ShatterItem;
@ -18,11 +19,6 @@ DebrisFragment* GetFreeDebrisFragment()
return nullptr;
}
void Inject_Debris()
{
//INJECT(0x0041D6B0, ShatterObject);
}
void ShatterObject(SHATTER_ITEM* item, MESH_INFO* mesh, int num,short roomNumber,int noZXVel)
{
extern Renderer11* g_Renderer;
@ -51,7 +47,7 @@ void ShatterObject(SHATTER_ITEM* item, MESH_INFO* mesh, int num,short roomNumber
break;
}
if (!fragment->active) {
Matrix rotationMatrix = Matrix::CreateFromYawPitchRoll(TR_ANGLE_TO_RAD(yRot), 0, 0);
Matrix rotationMatrix = Matrix::CreateFromYawPitchRoll(TO_RAD(yRot), 0, 0);
RendererVertex vtx0 = meshVertices->at(fragmentsMesh->Buckets[bucket].Indices[i]);
RendererVertex vtx1 = meshVertices->at(fragmentsMesh->Buckets[bucket].Indices[i + 1]);
RendererVertex vtx2 = meshVertices->at(fragmentsMesh->Buckets[bucket].Indices[i + 2]);

View file

@ -40,4 +40,3 @@ void ShatterObject(SHATTER_ITEM* item, MESH_INFO* mesh, int num, short roomNumbe
DebrisFragment* GetFreeDebrisFragment();
Vector3 CalculateFragmentImpactVelocity(Vector3 fragmentWorldPosition, Vector3 impactDirection, Vector3 impactLocation);
void UpdateDebris();
void Inject_Debris();

View file

@ -1,6 +1,7 @@
#include "deltapak.h"
#include "..\Global\global.h"
#include <stdio.h>
#include "../Specific/level.h"
ITEM_INFO* FindItem(short objectNumber)
{
@ -8,7 +9,7 @@ ITEM_INFO* FindItem(short objectNumber)
printf("Called FindItem()\n");
#endif
DB_Log(0, "FindItem - DLL");
//DB_Log(0, "FindItem - DLL");
if (LevelItems > 0)
{
@ -21,8 +22,3 @@ ITEM_INFO* FindItem(short objectNumber)
return NULL;
}
void Inject_DeltaPak()
{
INJECT(0x00423470, FindItem);
}

View file

@ -1,5 +1,3 @@
#pragma once
#include "..\Global\global.h"
void Inject_DeltaPak();

View file

@ -10,6 +10,9 @@
#include "switch.h"
#include "misc.h"
#include "Box.h"
#include "../Specific/level.h"
#include "../Specific/input.h"
#include "sound.h"
PHD_VECTOR DoubleDoorPos = { 0, 0, 220 };
PHD_VECTOR PullDoorPos = { -201, 0, 322 };
@ -35,6 +38,7 @@ static short CrowbarDoorBounds[12] =
ITEM_INFO* ClosedDoors[32];
byte LiftDoor;
int DontUnlockBox;
extern byte SequenceUsed[6];
extern byte SequenceResults[3][3][3];
@ -709,7 +713,7 @@ void InitialiseDoor(short itemNumber)
if (item->objectNumber == ID_LIFT_DOORS1 || item->objectNumber == ID_LIFT_DOORS2)
item->itemFlags[0] = 4096;
DOOR_DATA * door = (DOOR_DATA*)GameMalloc(sizeof(DOOR_DATA));
DOOR_DATA * door = (DOOR_DATA*)game_malloc(sizeof(DOOR_DATA));
item->data = door;
door->opened = false;
@ -966,7 +970,7 @@ void ProcessClosedDoors()
{
if (!(item->inDrawRoom))
{
ItemNewRoom((item - Items) / sizeof(ITEM_INFO), item->drawRoom);
ItemNewRoom(item - Items, item->drawRoom);
item->roomNumber = roomNumber;
item->inDrawRoom = true;
}
@ -974,7 +978,7 @@ void ProcessClosedDoors()
else if (item->inDrawRoom)
{
item->roomNumber = item->drawRoom;
ItemNewRoom((item - Items) / sizeof(ITEM_INFO), roomNumber);
ItemNewRoom(item - Items, roomNumber);
item->inDrawRoom = false;
}
}
@ -1016,16 +1020,3 @@ void SteelDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll)
}
}
}
void Inject_Door()
{
INJECT(0x00429EC0, SequenceDoorControl);
INJECT(0x00429CF0, UnderwaterDoorCollision);
INJECT(0x00429B30, DoubleDoorCollision);
INJECT(0x004298D0, PushPullKickDoorCollision);
INJECT(0x00429840, PushPullKickDoorControl);
INJECT(0x00429550, DoorCollision);
INJECT(0x00429140, DoorControl);
INJECT(0x00428FD0, OpenThatDoor);
INJECT(0x00428EF0, ShutThatDoor);
}

View file

@ -19,5 +19,3 @@ void InitialiseClosedDoors();
void ProcessClosedDoors();
void GetClosedDoorNormal(ROOM_INFO* room, short** dptr, byte* n, int z, int x, int absX, int absZ);
void FillDoorPointers(DOOR_DATA* doorData, ITEM_INFO* item, short roomNumber, int dz, int dx);
void Inject_Door();

View file

@ -2,6 +2,7 @@
#include "Lara.h"
#include "..\Renderer\Renderer11.h"
#include "camera.h"
#include "../Specific/level.h"
BITE_INFO EnemyBites[9] =
{
@ -28,21 +29,12 @@ short InterpolatedBounds[6];
LARGE_INTEGER PerformanceCount;
double LdFreq;
double LdSync;
int GnFrameCounter;
int DrawPhaseGame()
{
// Control routines uses joints calculated here for getting Lara joint positions
CalcLaraMatrices(0);
phd_PushUnitMatrix();
CalcLaraMatrices(1);
// Calls my new rock & roll renderer :)
g_Renderer->Draw();
Camera.numberFrames = g_Renderer->SyncRenderer();
// We need to pop the matrix stack or the game will crash
phd_PopMatrix();
return Camera.numberFrames;
}
@ -163,7 +155,6 @@ bool TIME_Init()
int Sync()
{
int nFrames;
LARGE_INTEGER ct;
double dCounter;
@ -172,7 +163,7 @@ int Sync()
dCounter = (double)ct.LowPart + (double)ct.HighPart * (double)0xFFFFFFFF;
dCounter /= LdFreq;
nFrames = long(dCounter) - long(LdSync);
long nFrames = long(dCounter) - long(LdSync);
LdSync = dCounter;
@ -182,136 +173,18 @@ int Sync()
void DrawAnimatingItem(ITEM_INFO* item)
{
// TODO: to refactor
// Empty stub because actually we disable items draing when drawRoutine pointer is NULL in OBJECT_INFO
// Empty stub because actually we disable items drawing when drawRoutine pointer is NULL in ObjectInfo
}
void _InitInterpolate(void)
void GetLaraJointPosition(PHD_VECTOR* pos, int joint)
{
}
if (joint > 14)
joint = 14;
void _phd_PushMatrix(void)
{
}
Vector3 p = Vector3(pos->x, pos->y, pos->z);
g_Renderer->GetLaraAbsBonePosition(&p, joint);
void _phd_PushMatrix_I(void)
{
}
void _phd_PushUnitMatrix(void)
{
}
void _phd_RotYXZ(short ry, short rx, short rz)
{
}
void _phd_RotY(short ry)
{
}
void _phd_RotY_I(short ry)
{
}
void _phd_RotX(short rx)
{
}
void _phd_RotX_I(short rx)
{
}
void _phd_RotZ(short rz)
{
}
void _phd_RotZ_I(short rz)
{
}
void _phd_PutPolygons(void)
{
}
void _phd_PutPolygons_I(void)
{
}
void _phd_TranslateRel(int x, int y, int z)
{
}
void _phd_TranslateRel_I(int x, int y, int z)
{
}
void _phd_TranslateRel_ID(int x1, int y1, int z1, int x2, int y2, int z2)
{
}
void _phd_TranslateAbs(int x, int y, int z)
{
}
void _phd_RotYXZpack(short ry, short rx, short rz)
{
}
void _gar_RotYXZsuperpack(short** pproc, int skip)
{
}
void _gar_RotYXZsuperpack_I(short** pproc1, short** pproc2, int skip)
{
}
void _phd_ClipBoundingBox(short* frames)
{
}
void _phd_DxTranslateRel(int x, int y, int z)
{
}
void _phd_DxTranslateAbs(int x, int y, int z)
{
}
void _phd_DxRotY(short ry)
{
}
void _phd_DxRotX(short rx)
{
}
void _phd_DxRotZ(short rz)
{
}
void _phd_DxRotYXZ(short ry, short rx, short rz)
{
}
void _phd_DxRotYXZpack(int rangle)
{
}
void phd_PopMatrix(void)
{
MatrixPtr -= 12;
DxMatrixPtr -= 48;
}
void _phd_PopMatrix_I(void)
{
MatrixPtr -= 12;
DxMatrixPtr -= 48;
}
void Inject_Draw()
{
/*INJECT(GetBoundsAccurate, 0x0042CF80);
INJECT(GetBestFrame, 0x0042D020);
INJECT(Sync, 0x004D1A40);*/
pos->x = p.x;
pos->y = p.y;
pos->z = p.z;
}

View file

@ -2,56 +2,15 @@
#include "..\Global\global.h"
//#define GetBoundsAccurate ((short* (__cdecl*)(ITEM_INFO*)) 0x0042CF80)
//#define GetBestFrame ((short* (__cdecl*)(ITEM_INFO*)) 0x0042D020)
#define CalcLaraMatrices ((void (__cdecl*)(int)) 0x0041E120)
//#define Sync ((int (__cdecl*)()) 0x004D1A40)
#define IsRoomOutside ((int (__cdecl*)(int, int, int)) 0x00418E90)
#define sub_42B4C0 ((void (__cdecl*)(ITEM_INFO*,short*)) 0x0042B4C0)
#define InitInterpolate ((void(__cdecl*)(int,int)) 0x0042BE90)
#define phd_PushMatrix ((void(__cdecl*)(void)) 0x0048F9C0)
#define phd_PushMatrix_I ((void(__cdecl*)(void)) 0x0042BF50)
#define phd_PushUnitMatrix ((void (__cdecl*)()) 0x0048FA90)
#define phd_GetVectorAngles ((void(__cdecl*)(int, int, int, short*)) 0x004904B0)
#define phd_RotYXZ ((void(__cdecl*)(short, short, short)) 0x00490150)
#define phd_PutPolygons ((void(__cdecl*)(short*)) 0x004B3F00)
#define phd_PutPolygons_I ((void(__cdecl*)(short*)) 0x0042C3F0)
#define phd_TranslateRel ((void(__cdecl*)(int, int, int)) 0x0048FB20)
#define phd_TranslateRel_I ((void(__cdecl*)(int, int, int)) 0x0042C110)
#define phd_TranslateRel_ID ((void(__cdecl*)(int,int,int,int,int,int)) 0x0042C190)
#define phd_TranslateAbs ((void(__cdecl*)(int, int, int)) 0x004903F0)
#define phd_RotYXZpack ((void(__cdecl*)(int)) 0x0048FEB0)
#define gar_RotYXZsuperpack ((void(__cdecl*)(short**,int)) 0x0042C310)
#define gar_RotYXZsuperpack_I ((void(__cdecl*)(short**,short**,int)) 0x0042C290)
#define phd_ClipBoundingBox ((int(__cdecl*)(short*)) 0x004B7EB0) // int S_GetObjectBounds(frames[0])
#define phd_PopMatrix_I ((void(__cdecl*)(void)) 0x0042BF00)
#define phd_RotY ((void(__cdecl*)(short)) 0x0048FCD0)
#define phd_RotX ((void(__cdecl*)(short)) 0x0048FBE0)
#define phd_RotZ ((void(__cdecl*)(short)) 0x0048FDC0)
#define phd_RotY_I ((void(__cdecl*)(short)) 0x0042BFC0)
#define phd_RotX_I ((void(__cdecl*)(short)) 0x0042C030)
#define phd_RotZ_I ((void(__cdecl*)(short)) 0x0042C0A0)
#define phd_SetTrans ((void (__cdecl*)(int, int, int)) 0x0048FA40)
#define phd_RotBoundingBoxNoPersp ((void (__cdecl*)(short*, short*)) 0x0042E240)
#define phd_DxTranslateRel ((void(__cdecl*)(int, int, int)) 0x00490790)
#define phd_DxTranslateAbs ((void(__cdecl*)(int, int, int)) 0x00490610)
#define phd_DxRotX ((void(__cdecl*)(short)) 0x00490810)
#define phd_DxRotY ((void(__cdecl*)(short)) 0x004908E0)
#define phd_DxRotZ ((void(__cdecl*)(short)) 0x004909B0)
#define phd_DxRotYXZ ((void(__cdecl*)(int, int, int)) 0x00490AF0)
#define phd_DxRotYXZpack ((void(__cdecl*)(int)) 0x00490A80)
#define mGetAngle ((int(__cdecl*)(int, int, int, int)) 0x0048F290)
#define phd_GenerateW2V ((void(__cdecl*)(PHD_3DPOS*)) 0x0048F330)
extern Renderer11* g_Renderer;
extern BITE_INFO EnemyBites[9];
extern int LightningCount;
extern int LightningRand;
extern int StormTimer;
extern int dLightningRand;
extern byte SkyStormColor[3];
extern byte SkyStormColor2[3];
extern int GnFrameCounter;
int DrawPhaseGame();
int GetFrame_D2(ITEM_INFO* item, short* framePtr[], int* rate);
@ -62,44 +21,4 @@ int Sync();
bool TIME_Init();
bool TIME_Reset();
void DrawAnimatingItem(ITEM_INFO* item);
/* phd function (DX11 version) */
// TODO: phd_XX function after this lign is used with DX11 one, when it's finished, delete the #define one and delete this sign: "_" at the beginning of the new function. (delete the unused if needed)
void _InitInterpolate(void);
void _phd_PushMatrix(void);
void _phd_PushMatrix_I(void);
void _phd_PushUnitMatrix(void);
void _phd_RotYXZ(short ry, short rx, short rz);
void _phd_RotY(short ry);
void _phd_RotY_I(short ry);
void _phd_RotX(short rx);
void _phd_RotX_I(short rx);
void _phd_RotZ(short rz);
void _phd_RotZ_I(short rz);
void _phd_PutPolygons(void);
void _phd_PutPolygons_I(void);
void _phd_TranslateRel(int x, int y, int z);
void _phd_TranslateRel_I(int x, int y, int z);
void _phd_TranslateRel_ID(int x1, int y1, int z1, int x2, int y2, int z2);
void _phd_TranslateAbs(int x, int y, int z);
void _phd_RotYXZpack(short ry, short rx, short rz);
void _gar_RotYXZsuperpack(short** pproc, int skip);
void _gar_RotYXZsuperpack_I(short** pproc1, short** pproc2, int skip);
void _phd_ClipBoundingBox(short* frames);
void _phd_DxTranslateRel(int x, int y, int z);
void _phd_DxTranslateAbs(int x, int y, int z);
void _phd_DxRotY(short ry);
void _phd_DxRotX(short rx);
void _phd_DxRotZ(short rz);
void _phd_DxRotYXZ(short ry, short rx, short rz);
void _phd_DxRotYXZpack(int rangle);
void phd_PopMatrix(void);
void _phd_PopMatrix_I(void);
extern Renderer11* g_Renderer;
extern BITE_INFO EnemyBites[9];
void Inject_Draw();
void GetLaraJointPosition(PHD_VECTOR* pos, int joint);

View file

@ -3,8 +3,12 @@
#include "tomb4fx.h"
#include "traps.h"
#include "math.h"
#include "lara.h"
#include "effects.h"
#include "sound.h"
#include "..\Scripting\GameFlowScript.h"
#include "../Specific/setup.h"
#include "../Specific/level.h"
//long wibble;
//long SplashCount;
@ -1246,9 +1250,9 @@ void TriggerWaterfallMist(int x, int y, int z, int angle)
spark->life = spark->sLife = (GetRandomControl() & 3) + 6;
spark->fadeToBlack = spark->life - 4;
dl = ((dh + (GlobalCounter << 6)) % 1536) + (GetRandomControl() & 0x3F) - 32;
spark->x = dl * SIN(ang1) >> W2V_SHIFT + (GetRandomControl() & 0xF) + x - 8;
spark->x = dl * phd_sin(ang1) >> W2V_SHIFT + (GetRandomControl() & 0xF) + x - 8;
spark->y = (GetRandomControl() & 0xF) + y - 8;
spark->z = dl * COS(ang1) >> W2V_SHIFT + (GetRandomControl() & 0xF) + z - 8;
spark->z = dl * phd_cos(ang1) >> W2V_SHIFT + (GetRandomControl() & 0xF) + z - 8;
spark->xVel = 0;
spark->zVel = 0;
spark->friction = 0;
@ -1280,11 +1284,11 @@ void TriggerWaterfallMist(int x, int y, int z, int angle)
spark->life = spark->sLife = (GetRandomControl() & 3) + 6;
spark->fadeToBlack = spark->life - 1;
dl = GetRandomControl() % 1408 + 64;
spark->x = dl * SIN(ang1) >> W2V_SHIFT + (GetRandomControl() & 0x1F) + x - 16;
spark->x = dl * phd_sin(ang1) >> W2V_SHIFT + (GetRandomControl() & 0x1F) + x - 16;
spark->y = (GetRandomControl() & 0xF) + y - 8;
spark->xVel = 0;
spark->zVel = 0;
spark->z = dl * COS(ang1) >> W2V_SHIFT + (GetRandomControl() & 0x1F) + z - 16;
spark->z = dl * phd_cos(ang1) >> W2V_SHIFT + (GetRandomControl() & 0x1F) + z - 16;
spark->friction = 0;
spark->flags = 10;
spark->yVel = GetRandomControl() & 0x100 + (GetRandomControl() & 0x7F) + 128;
@ -1950,30 +1954,3 @@ void KillEverything()//338AC(<), 33DAC(<) (F)
{
KillEverythingFlag = 0;
}
void Inject_Effect2()
{
INJECT(0x00431240, TriggerDynamicLight);
INJECT(0x004820A0, TriggerGunSmoke);
INJECT(0x0042E6A0, DetatchSpark);
INJECT(0x0042E790, GetFreeSpark);
INJECT(0x0042E8B0, UpdateSparks);
INJECT(0x0042F060, TriggerRicochetSpark);
INJECT(0x0042F460, TriggerCyborgSpark);
INJECT(0x0042F610, TriggerExplosionSparks);
INJECT(0x0042FA10, TriggerExplosionSmokeEnd);
INJECT(0x0042FC20, TriggerExplosionSmoke);
INJECT(0x0042FE20, TriggerFireFlame);
INJECT(0x00430350, TriggerSuperJetFlame);
INJECT(0x00430620, SetupSplash);
INJECT(0x00430710, UpdateSplashes);
INJECT(0x00430910, SetupRipple);
INJECT(0x004309B0, TriggerUnderwaterBlood);
INJECT(0x00430A40, TriggerWaterfallMist);
INJECT(0x00430D90, TriggerDartSmoke);
INJECT(0x00431030, KillAllCurrentItems);
INJECT(0x00431240, TriggerDynamicLight);
INJECT(0x00431530, ClearDynamicLights);
INJECT(0x00432A30, WadeSplash);
INJECT(0x00432900, Splash);
}

View file

@ -2,8 +2,6 @@
#include <d3d11.h>
#include "..\Global\global.h"
#define ExplodingDeath ((void (__cdecl*)(short, int, int)) 0x00484080)
#define DrawLensFlare ((void (__cdecl*)(ITEM_INFO*)) 0x00485290)
#define RIPPLE_FLAG_BLOOD 0x80
#define RIPPLE_FLAG_RAND_POS 0x40
#define RIPPLE_FLAG_RAND_ROT 0x20
@ -71,4 +69,3 @@ void GrenadeExplosionEffects(int x, int y, int z, short roomNumber);
void TriggerMetalSparks(int x, int y, int z, int xv, int yv, int zv, int additional);
void WadeSplash(ITEM_INFO* item, int wh, int wd);
void Splash(ITEM_INFO* item);
void Inject_Effect2();

View file

@ -10,15 +10,18 @@
#include "sphere.h"
#include "footprint.h"
#include "..\Objects\oldobjects.h"
#include "..\Specific\roomload.h"
#include "..\Specific\level.h"
#include "debris.h"
#include "../Specific/setup.h"
#include "camera.h"
#include "savegame.h"
#include "sound.h"
int wf = 256;
extern std::deque<FOOTPRINT_STRUCT> footprints;
short FXType;
FX_INFO* Effects;
void(*effect_routines[59])(ITEM_INFO* item) =
{
@ -448,14 +451,14 @@ void ControlWaterfallMist(short itemNumber) // ControlWaterfallMist
if (item->pos.yRot == -ANGLE(180))
{
x = item->pos.xPos - (SIN(item->pos.yRot + ANGLE(180)) >> 3) + ((rcossin_tbl[2048] * wf) >> W2V_SHIFT);
z = item->pos.zPos - (COS(item->pos.yRot + ANGLE(180)) >> 3) + ((rcossin_tbl[2049] * wf) >> W2V_SHIFT);
x = item->pos.xPos - (phd_sin(item->pos.yRot + ANGLE(180)) >> 3) + ((rcossin_tbl[2048] * wf) >> W2V_SHIFT);
z = item->pos.zPos - (phd_cos(item->pos.yRot + ANGLE(180)) >> 3) + ((rcossin_tbl[2049] * wf) >> W2V_SHIFT);
}
else
{
//3934C
x = item->pos.xPos - (SIN(item->pos.yRot + ANGLE(180)) >> 3) + ((SIN(item->pos.yRot + ANGLE(90)) * wf) >> W2V_SHIFT);
z = item->pos.zPos - (COS(item->pos.yRot + ANGLE(180)) >> 3) + ((COS(item->pos.yRot + ANGLE(90)) * wf) >> W2V_SHIFT);
x = item->pos.xPos - (phd_sin(item->pos.yRot + ANGLE(180)) >> 3) + ((phd_sin(item->pos.yRot + ANGLE(90)) * wf) >> W2V_SHIFT);
z = item->pos.zPos - (phd_cos(item->pos.yRot + ANGLE(180)) >> 3) + ((phd_cos(item->pos.yRot + ANGLE(90)) * wf) >> W2V_SHIFT);
}
//393A0
@ -503,11 +506,13 @@ void Richochet(PHD_3DPOS* pos)
SoundEffect(SFX_LARA_RICOCHET, pos, 0);
}
void Inject_Effects()
void DoLotsOfBlood(int x, int y, int z, int speed, short direction, short roomNumber, int count)
{
INJECT(0x00432580, ItemNearLara);
INJECT(0x00478FE0, StopSoundEffect);
INJECT(0x00432760, DoBloodSplat);
INJECT(0x00402FB3, ClearSpidersPatch);
INJECT(0x00432710, Richochet);
for (int i = 0; i < count; i++)
{
DoBloodSplat(x + 256 - (GetRandomControl() * 512 / 0x8000),
y + 256 - (GetRandomControl() * 512 / 0x8000),
z + 256 - (GetRandomControl() * 512 / 0x8000),
speed, direction, roomNumber);
}
}

View file

@ -3,8 +3,7 @@
#include "..\Global\global.h"
#include "control.h"
#define DoLotsOfBlood ((void (__cdecl*)(int, int, int, short, short, short, int)) 0x00432800)
#define SoundEffects ((void (__cdecl*)()) 0x00432640)
extern FX_INFO* Effects;
int ItemNearLara(PHD_3DPOS* pos, int radius);
void StopSoundEffect(short sampleIndex);
@ -47,6 +46,4 @@ void TL_10(ITEM_INFO* item);
void TL_11(ITEM_INFO* item);
void TL_12(ITEM_INFO* item);
void Richochet(PHD_3DPOS* pos);
void Inject_Effects();
void DoLotsOfBlood(int x, int y, int z, int speed, short direction, short roomNumber, int count);

View file

@ -7,9 +7,12 @@
#include "collide.h"
#include "laramisc.h"
#include "switch.h"
#include "draw.h"
#include "items.h"
#include "..\Specific\roomload.h"
#include "..\Specific\level.h"
#include "../Specific/setup.h"
#include "../Specific/input.h"
#include "sound.h"
short FireBounds[12] =
{
@ -158,7 +161,7 @@ void DoFlameTorch() // (F) (D)
pos.y = 64;
pos.z = 256;
GetLaraJointPosition(&pos, LJ_LHAND);
GetLaraJointPosition(&pos, LM_LHAND);
TriggerDynamicLight(pos.x, pos.y, pos.z, 12 - (GetRandomControl() & 1), (GetRandomControl() & 0x3F) + 192, (GetRandomControl() & 0x1F) + 96, 0);
@ -203,8 +206,8 @@ void TorchControl(short itemNumber) // (F) (D)
item->pos.zRot = 0;
}
int xv = item->speed * SIN(item->pos.yRot) >> W2V_SHIFT;
int zv = item->speed * COS(item->pos.yRot) >> W2V_SHIFT;
int xv = item->speed * phd_sin(item->pos.yRot) >> W2V_SHIFT;
int zv = item->speed * phd_cos(item->pos.yRot) >> W2V_SHIFT;
item->pos.xPos += xv;
item->pos.zPos += zv;

View file

@ -1,9 +1,12 @@
#include "footprint.h"
#include "control.h"
#include "lara.h"
#include "draw.h"
#include "groundfx.h"
#include "../Specific/level.h"
std::deque<FOOTPRINT_STRUCT> footprints = deque<FOOTPRINT_STRUCT>();
bool CheckFootOnFloor(ITEM_INFO& const item, int mesh, PHD_3DPOS& outFootprintPosition){
int x = item.pos.xPos;
int y = item.pos.yPos;

View file

@ -4,6 +4,7 @@
#include "..\Specific\input.h"
#include "..\Global\global.h"
#include "../Specific/level.h"
#include <string>

View file

@ -2,8 +2,12 @@
#include "..\Global\global.h"
#include "draw.h"
#include "laramisc.h"
#include "lara.h"
#include "control.h"
#include "..\Scripting\GameFlowScript.h"
#include "../Specific/setup.h"
#include "sphere.h"
#include "../Specific/level.h"
int FirstHair[2];
HAIR_STRUCT Hairs[2][7];
@ -41,7 +45,7 @@ void InitialiseHair()
void HairControl(int cutscene, int ponytail, short* framePtr)
{
SPHERE sphere[5];
OBJECT_INFO* object = &Objects[ID_LARA];
ObjectInfo* object = &Objects[ID_LARA];
short* frame;
int spaz;
bool youngLara = g_GameFlow->GetLevel(CurrentLevel)->LaraType == LARA_YOUNG;
@ -94,85 +98,48 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
frame = framePtr;
}
phd_PushUnitMatrix();
*(MatrixPtr + M03) = LaraItem->pos.xPos << W2V_SHIFT;
*(MatrixPtr + M13) = LaraItem->pos.yPos << W2V_SHIFT;
*(MatrixPtr + M23) = LaraItem->pos.zPos << W2V_SHIFT;
phd_RotYXZ(LaraItem->pos.yRot, LaraItem->pos.xRot, LaraItem->pos.zRot);
short* rotation = frame + 9;
int* bone = Bones + object->boneIndex;
phd_TranslateRel((int) * (frame + 6), (int) * (frame + 7), (int) * (frame + 8));
gar_RotYXZsuperpack(&rotation, 0);
// Hips
phd_PushMatrix();
// Get Lara's spheres in absolute coords, for head, torso, hips and upper arms
short* objptr = Lara.meshPtrs[LM_HIPS];
phd_TranslateRel(*objptr, *(objptr + 1), *(objptr + 2));
sphere[0].x = *(MatrixPtr + M03) >> W2V_SHIFT;
sphere[0].y = *(MatrixPtr + M13) >> W2V_SHIFT;
sphere[0].z = *(MatrixPtr + M23) >> W2V_SHIFT;
PHD_VECTOR pos = { objptr[0], objptr[1], objptr[2] };
GetLaraJointPosition(&pos, LM_HIPS);
sphere[0].x = pos.x;
sphere[0].y = pos.y;
sphere[0].z = pos.z;
sphere[0].r = (int) *(objptr + 3);
phd_PopMatrix();
phd_TranslateRel(*(bone + 1 + 24), *(bone + 2 + 24), *(bone + 3 + 24));
gar_RotYXZsuperpack(&rotation, 6);
phd_RotYXZ(Lara.torsoYrot, Lara.torsoXrot, Lara.torsoZrot);
// Torso
phd_PushMatrix();
objptr = Lara.meshPtrs[LM_TORSO];
phd_TranslateRel(*objptr, *(objptr + 1), *(objptr + 2));
sphere[1].x = *(MatrixPtr + M03) >> W2V_SHIFT;
sphere[1].y = *(MatrixPtr + M13) >> W2V_SHIFT;
sphere[1].z = *(MatrixPtr + M23) >> W2V_SHIFT;
pos = { objptr[0], objptr[1], objptr[2] };
GetLaraJointPosition(&pos, LM_TORSO);
sphere[1].x = pos.x;
sphere[1].y = pos.y;
sphere[1].z = pos.z;
sphere[1].r = (int) * (objptr + 3);
if (youngLara)
sphere[1].r = sphere[1].r - ((sphere[1].r >> 2) + (sphere[1].r >> 3));
phd_PopMatrix();
phd_PushMatrix();
phd_TranslateRel(*(bone + 1 + 28), *(bone + 2 + 28), *(bone + 3 + 28));
gar_RotYXZsuperpack(&rotation, 0);
// Right arm
objptr = Lara.meshPtrs[LM_RINARM];
phd_TranslateRel(*objptr, *(objptr + 1), *(objptr + 2));
sphere[3].x = *(MatrixPtr + M03) >> W2V_SHIFT;
sphere[3].y = *(MatrixPtr + M13) >> W2V_SHIFT;
sphere[3].z = *(MatrixPtr + M23) >> W2V_SHIFT;
sphere[3].r = (int) * (objptr + 3) * 3 / 2; // 1.5 times sphere size gives better result
phd_PopMatrix();
phd_PushMatrix();
phd_TranslateRel(*(bone + 1 + 40), *(bone + 2 + 40), *(bone + 3 + 40));
gar_RotYXZsuperpack(&rotation, 2);
// Left arm
objptr = Lara.meshPtrs[LM_LINARM];
phd_TranslateRel(*objptr, *(objptr + 1), *(objptr + 2));
sphere[4].x = *(MatrixPtr + M03) >> W2V_SHIFT;
sphere[4].y = *(MatrixPtr + M13) >> W2V_SHIFT;
sphere[4].z = *(MatrixPtr + M23) >> W2V_SHIFT;
sphere[4].r = (int) * (objptr + 3) * 3 / 2;
phd_PopMatrix();
phd_TranslateRel(*(bone + 1 + 52), *(bone + 2 + 52), *(bone + 3 + 52));
gar_RotYXZsuperpack(&rotation, 2);
phd_RotYXZ(Lara.headYrot, Lara.headXrot, Lara.headZrot);
// Head
phd_PushMatrix();
objptr = Lara.meshPtrs[LM_HEAD];
phd_TranslateRel(*objptr, *(objptr + 1), *(objptr + 2));
sphere[2].x = *(MatrixPtr + M03) >> W2V_SHIFT;
sphere[2].y = *(MatrixPtr + M13) >> W2V_SHIFT;
sphere[2].z = *(MatrixPtr + M23) >> W2V_SHIFT;
pos = { objptr[0], objptr[1], objptr[2] };
GetLaraJointPosition(&pos, LM_HEAD);
sphere[2].x = pos.x;
sphere[2].y = pos.y;
sphere[2].z = pos.z;
sphere[2].r = (int) * (objptr + 3);
phd_PopMatrix();
objptr = Lara.meshPtrs[LM_RINARM];
pos = { objptr[0], objptr[1], objptr[2] };
GetLaraJointPosition(&pos, LM_RINARM);
sphere[3].x = pos.x;
sphere[3].y = pos.y;
sphere[3].z = pos.z;
sphere[3].r = (int) * (objptr + 3) * 3 / 2;
objptr = Lara.meshPtrs[LM_LINARM];
pos = { objptr[0], objptr[1], objptr[2] };
GetLaraJointPosition(&pos, LM_LINARM);
sphere[4].x = pos.x;
sphere[4].y = pos.y;
sphere[4].z = pos.z;
sphere[4].r = (int) * (objptr + 3) * 3 / 2;
if (youngLara)
{
@ -181,27 +148,27 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
sphere[1].z = (sphere[1].z + sphere[2].z) / 2;
}
Matrix world;
g_Renderer->GetBoneMatrix(Lara.itemNumber, LM_HEAD, &world);
if (ponytail)
{
phd_TranslateRel(44, -48, -50);
world = Matrix::CreateTranslation(44, -48, -50) * world;
}
else if (youngLara)
{
phd_TranslateRel(-52, -48, -50);
world = Matrix::CreateTranslation(-52, -48, -50) * world;
}
else
{
phd_TranslateRel(-4, -48, -48);
world = Matrix::CreateTranslation(-4, -48, -48) * world;
}
PHD_VECTOR pos;
pos.x = *(MatrixPtr + M03) >> W2V_SHIFT;
pos.y = *(MatrixPtr + M13) >> W2V_SHIFT;
pos.z = *(MatrixPtr + M23) >> W2V_SHIFT;
pos.x = world.Translation().x;
pos.y = world.Translation().y;
pos.z = world.Translation().z;
phd_PopMatrix();
bone = bone + Objects[ID_LARA_HAIR].boneIndex;
int* bone = Bones + Objects[ID_LARA_HAIR].boneIndex;
if (FirstHair[ponytail])
{
@ -213,20 +180,13 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
for (int i = 0; i < HAIR_SEGMENTS - 1; i++, bone += 4)
{
phd_PushUnitMatrix();
world = Matrix::CreateTranslation(Hairs[ponytail][i].pos.xPos, Hairs[ponytail][i].pos.yPos, Hairs[ponytail][i].pos.zPos);
world = Matrix::CreateFromYawPitchRoll(TO_RAD(Hairs[ponytail][i].pos.yRot), TO_RAD(Hairs[ponytail][i].pos.xRot), 0) * world;
world = Matrix::CreateTranslation(*(bone + 1), *(bone + 2), *(bone + 3)) * world;
*(MatrixPtr + M03) = Hairs[ponytail][i].pos.xPos << W2V_SHIFT;
*(MatrixPtr + M13) = Hairs[ponytail][i].pos.yPos << W2V_SHIFT;
*(MatrixPtr + M23) = Hairs[ponytail][i].pos.zPos << W2V_SHIFT;
phd_RotYXZ(Hairs[ponytail][i].pos.yRot, Hairs[ponytail][i].pos.xRot, 0);
phd_TranslateRel(*(bone + 1), *(bone + 2), *(bone + 3));
Hairs[ponytail][i + 1].pos.xPos = *(MatrixPtr + M03) >> W2V_SHIFT;
Hairs[ponytail][i + 1].pos.yPos = *(MatrixPtr + M13) >> W2V_SHIFT;
Hairs[ponytail][i + 1].pos.zPos = *(MatrixPtr + M23) >> W2V_SHIFT;
phd_PopMatrix();
Hairs[ponytail][i + 1].pos.xPos = world.Translation().x;
Hairs[ponytail][i + 1].pos.yPos = world.Translation().y;
Hairs[ponytail][i + 1].pos.zPos = world.Translation().z;
}
Wind = SmokeWindX = SmokeWindZ = 0;
@ -331,7 +291,7 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
if (distance < SQUARE(sphere[j].r))
{
distance = SQRT_ASM(distance);
distance = sqrt(distance);
if (distance == 0)
distance = 1;
@ -342,36 +302,25 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
}
}
int distance = SQRT_ASM(SQUARE(Hairs[ponytail][i].pos.zPos - Hairs[ponytail][i - 1].pos.zPos) + SQUARE(Hairs[ponytail][i].pos.xPos - Hairs[ponytail][i - 1].pos.xPos));
Hairs[ponytail][i - 1].pos.yRot = ATAN((Hairs[ponytail][i].pos.zPos - Hairs[ponytail][i - 1].pos.zPos), (Hairs[ponytail][i].pos.xPos - Hairs[ponytail][i - 1].pos.xPos));
Hairs[ponytail][i - 1].pos.xRot = -ATAN(distance, Hairs[ponytail][i].pos.yPos - Hairs[ponytail][i - 1].pos.yPos);
int distance = sqrt(SQUARE(Hairs[ponytail][i].pos.zPos - Hairs[ponytail][i - 1].pos.zPos) + SQUARE(Hairs[ponytail][i].pos.xPos - Hairs[ponytail][i - 1].pos.xPos));
Hairs[ponytail][i - 1].pos.yRot = phd_atan((Hairs[ponytail][i].pos.zPos - Hairs[ponytail][i - 1].pos.zPos), (Hairs[ponytail][i].pos.xPos - Hairs[ponytail][i - 1].pos.xPos));
Hairs[ponytail][i - 1].pos.xRot = -phd_atan(distance, Hairs[ponytail][i].pos.yPos - Hairs[ponytail][i - 1].pos.yPos);
phd_PushUnitMatrix();
*(MatrixPtr + M03) = Hairs[ponytail][i - 1].pos.xPos << W2V_SHIFT;
*(MatrixPtr + M13) = Hairs[ponytail][i - 1].pos.yPos << W2V_SHIFT;
*(MatrixPtr + M23) = Hairs[ponytail][i - 1].pos.zPos << W2V_SHIFT;
phd_RotYXZ(Hairs[ponytail][i - 1].pos.yRot, Hairs[ponytail][i - 1].pos.xRot, 0);
world = Matrix::CreateTranslation(Hairs[ponytail][i - 1].pos.xPos, Hairs[ponytail][i - 1].pos.yPos, Hairs[ponytail][i - 1].pos.zPos);
world = Matrix::CreateFromYawPitchRoll(TO_RAD(Hairs[ponytail][i - 1].pos.yRot), TO_RAD(Hairs[ponytail][i - 1].pos.xRot), 0) * world;
if (i == HAIR_SEGMENTS - 1)
phd_TranslateRel(*(bone - 3), *(bone - 2), *(bone - 1));
world = Matrix::CreateTranslation(*(bone - 3), *(bone - 2), *(bone - 1)) * world;
else
phd_TranslateRel(*(bone + 1), *(bone + 2), *(bone + 3));
world = Matrix::CreateTranslation(*(bone + 1), *(bone + 2), *(bone + 3)) * world;
Hairs[ponytail][i].pos.xPos = *(MatrixPtr + M03) >> W2V_SHIFT;
Hairs[ponytail][i].pos.yPos = *(MatrixPtr + M13) >> W2V_SHIFT;
Hairs[ponytail][i].pos.zPos = *(MatrixPtr + M23) >> W2V_SHIFT;
Hairs[ponytail][i].pos.xPos = world.Translation().x;
Hairs[ponytail][i].pos.yPos = world.Translation().y;
Hairs[ponytail][i].pos.zPos = world.Translation().z;
Hairs[ponytail][i].hvel.x = Hairs[ponytail][i].pos.xPos - Hairs[ponytail][0].hvel.x;
Hairs[ponytail][i].hvel.y = Hairs[ponytail][i].pos.yPos - Hairs[ponytail][0].hvel.y;
Hairs[ponytail][i].hvel.z = Hairs[ponytail][i].pos.zPos - Hairs[ponytail][0].hvel.z;
phd_PopMatrix();
}
}
}
void Inject_Hair()
{
}

View file

@ -6,5 +6,3 @@ extern HAIR_STRUCT Hairs[2][7];
void InitialiseHair();
void HairControl(int cutscene, int ponytail, short* framePtr);
void Inject_Hair();

View file

@ -3,6 +3,8 @@
#include "pickup.h"
#include "lara.h"
#include "camera.h"
#include "../Specific/level.h"
#include "control.h"
short PickupX;
short PickupY;
@ -18,7 +20,6 @@ int DashTimer = 0;
extern RendererHUDBar* g_HealthBar;
extern RendererHUDBar* g_DashBar;
extern RendererHUDBar* g_AirBar;
extern LaraExtraInfo g_LaraExtra;
void DrawHealthBarOverlay(int value)
{
@ -113,8 +114,8 @@ void UpdateAirBar(int flash)
if (Lara.air == 1800 || LaraItem->hitPoints <= 0)
return;
if ((g_LaraExtra.Vehicle == NO_ITEM)
|| (Items[g_LaraExtra.Vehicle].objectNumber != ID_UPV))
if ((Lara.Vehicle == NO_ITEM)
|| (Items[Lara.Vehicle].objectNumber != ID_UPV))
{
if ((Lara.waterStatus != LW_UNDERWATER)
&& (Lara.waterStatus != LW_SURFACE)
@ -248,8 +249,3 @@ int FlashIt()
}
return FlashState;
}
void Inject_Healt()
{
}

View file

@ -25,6 +25,3 @@ extern int HealtBarTimer;
extern int FlashState;
extern int PoisonFlag;
extern int DashTimer;
void Inject_Healt();

View file

@ -8,29 +8,31 @@
#include "savegame.h"
#include "Lara.h"
#include "camera.h"
#include "spotcam.h"
#include "..\Global\global.h"
#include "..\Specific\input.h"
#include "..\Specific\configuration.h"
#include "lara1gun.h"
#include "lara2gun.h"
#include "../Specific/level.h"
#include "../Specific/input.h"
Inventory* g_Inventory;
extern GameFlow* g_GameFlow;
extern LaraExtraInfo g_LaraExtra;
void CombinePuzzle(int action, short object)
{
if (action == INV_COMBINE_COMBINE)
{
g_LaraExtra.Puzzles[object - INV_OBJECT_PUZZLE1]++;
g_LaraExtra.PuzzlesCombo[object - INV_OBJECT_PUZZLE1_COMBO1]--;
g_LaraExtra.PuzzlesCombo[object - INV_OBJECT_PUZZLE1_COMBO1 + 1]--;
Lara.Puzzles[object - INV_OBJECT_PUZZLE1]++;
Lara.PuzzlesCombo[object - INV_OBJECT_PUZZLE1_COMBO1]--;
Lara.PuzzlesCombo[object - INV_OBJECT_PUZZLE1_COMBO1 + 1]--;
}
else
{
g_LaraExtra.Puzzles[object - INV_OBJECT_PUZZLE1]--;
g_LaraExtra.PuzzlesCombo[object - INV_OBJECT_PUZZLE1_COMBO1]++;
g_LaraExtra.PuzzlesCombo[object - INV_OBJECT_PUZZLE1_COMBO1 + 1]++;
Lara.Puzzles[object - INV_OBJECT_PUZZLE1]--;
Lara.PuzzlesCombo[object - INV_OBJECT_PUZZLE1_COMBO1]++;
Lara.PuzzlesCombo[object - INV_OBJECT_PUZZLE1_COMBO1 + 1]++;
}
}
@ -38,15 +40,15 @@ void CombineKey(int action, short object)
{
if (action == INV_COMBINE_COMBINE)
{
g_LaraExtra.Keys[object - INV_OBJECT_KEY1]++;
g_LaraExtra.KeysCombo[object - INV_OBJECT_KEY1_COMBO1]--;
g_LaraExtra.KeysCombo[object - INV_OBJECT_KEY1_COMBO1 + 1]--;
Lara.Keys[object - INV_OBJECT_KEY1]++;
Lara.KeysCombo[object - INV_OBJECT_KEY1_COMBO1]--;
Lara.KeysCombo[object - INV_OBJECT_KEY1_COMBO1 + 1]--;
}
else
{
g_LaraExtra.Keys[object - INV_OBJECT_KEY1]--;
g_LaraExtra.KeysCombo[object - INV_OBJECT_KEY1_COMBO1]++;
g_LaraExtra.KeysCombo[object - INV_OBJECT_KEY1_COMBO1 + 1]++;
Lara.Keys[object - INV_OBJECT_KEY1]--;
Lara.KeysCombo[object - INV_OBJECT_KEY1_COMBO1]++;
Lara.KeysCombo[object - INV_OBJECT_KEY1_COMBO1 + 1]++;
}
}
@ -54,15 +56,15 @@ void CombinePickup(int action, short object)
{
if (action == INV_COMBINE_COMBINE)
{
g_LaraExtra.Pickups[object - INV_OBJECT_PICKUP1]++;
g_LaraExtra.PickupsCombo[object - INV_OBJECT_PICKUP1_COMBO1]--;
g_LaraExtra.PickupsCombo[object - INV_OBJECT_PICKUP1_COMBO1 + 1] = false;
Lara.Pickups[object - INV_OBJECT_PICKUP1]++;
Lara.PickupsCombo[object - INV_OBJECT_PICKUP1_COMBO1]--;
Lara.PickupsCombo[object - INV_OBJECT_PICKUP1_COMBO1 + 1] = false;
}
else
{
g_LaraExtra.Pickups[object - INV_OBJECT_PICKUP1]--;
g_LaraExtra.PickupsCombo[object - INV_OBJECT_PICKUP1_COMBO1]++;
g_LaraExtra.PickupsCombo[object - INV_OBJECT_PICKUP1_COMBO1 + 1]++;
Lara.Pickups[object - INV_OBJECT_PICKUP1]--;
Lara.PickupsCombo[object - INV_OBJECT_PICKUP1_COMBO1]++;
Lara.PickupsCombo[object - INV_OBJECT_PICKUP1_COMBO1 + 1]++;
}
}
@ -70,15 +72,15 @@ void CombineExamine(int action, short object)
{
if (action == INV_COMBINE_COMBINE)
{
g_LaraExtra.Examines[object - INV_OBJECT_EXAMINE1]++;
g_LaraExtra.ExaminesCombo[object - INV_OBJECT_EXAMINE1_COMBO1]--;
g_LaraExtra.ExaminesCombo[object - INV_OBJECT_EXAMINE1_COMBO1 + 1]--;
Lara.Examines[object - INV_OBJECT_EXAMINE1]++;
Lara.ExaminesCombo[object - INV_OBJECT_EXAMINE1_COMBO1]--;
Lara.ExaminesCombo[object - INV_OBJECT_EXAMINE1_COMBO1 + 1]--;
}
else
{
g_LaraExtra.Examines[object - INV_OBJECT_EXAMINE1]--;
g_LaraExtra.ExaminesCombo[object - INV_OBJECT_EXAMINE1_COMBO1]++;
g_LaraExtra.ExaminesCombo[object - INV_OBJECT_EXAMINE1_COMBO1 + 1]++;
Lara.Examines[object - INV_OBJECT_EXAMINE1]--;
Lara.ExaminesCombo[object - INV_OBJECT_EXAMINE1_COMBO1]++;
Lara.ExaminesCombo[object - INV_OBJECT_EXAMINE1_COMBO1 + 1]++;
}
}
@ -86,13 +88,13 @@ void CombineRevolverLasersight(int action, short object)
{
if (action == INV_COMBINE_COMBINE)
{
g_LaraExtra.Lasersight = false;
g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight = true;
Lara.Lasersight = false;
Lara.Weapons[WEAPON_REVOLVER].HasLasersight = true;
}
else
{
g_LaraExtra.Lasersight = true;
g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight = false;
Lara.Lasersight = true;
Lara.Weapons[WEAPON_REVOLVER].HasLasersight = false;
}
if (Lara.gunStatus && Lara.gunType == WEAPON_REVOLVER)
@ -106,13 +108,13 @@ void CombineCrossbowLasersight(int action, short object)
{
if (action == INV_COMBINE_COMBINE)
{
g_LaraExtra.Lasersight = false;
g_LaraExtra.Weapons[WEAPON_CROSSBOW].HasLasersight = true;
Lara.Lasersight = false;
Lara.Weapons[WEAPON_CROSSBOW].HasLasersight = true;
}
else
{
g_LaraExtra.Lasersight = true;
g_LaraExtra.Weapons[WEAPON_CROSSBOW].HasLasersight = false;
Lara.Lasersight = true;
Lara.Weapons[WEAPON_CROSSBOW].HasLasersight = false;
}
if (Lara.gunStatus && Lara.gunType == WEAPON_CROSSBOW)
@ -122,11 +124,6 @@ void CombineCrossbowLasersight(int action, short object)
}
}
void Inject_Inventory()
{
}
Inventory::Inventory()
{
ZeroMemory(&m_objectsTable[0], sizeof(InventoryObjectDefinition) * INVENTORY_TABLE_SIZE);
@ -270,65 +267,65 @@ void Inventory::LoadObjects(bool isReload)
}
}
/*g_LaraExtra.Weapons[WEAPON_REVOLVER].Present = true;
g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[0] = 1000;
g_LaraExtra.Weapons[WEAPON_REVOLVER].SelectedAmmo = WEAPON_AMMO1;
g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight = true;
/*Lara.Weapons[WEAPON_REVOLVER].Present = true;
Lara.Weapons[WEAPON_REVOLVER].Ammo[0] = 1000;
Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = WEAPON_AMMO1;
Lara.Weapons[WEAPON_REVOLVER].HasLasersight = true;
// DEBUG
{
/*g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present = true;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[0] = 1000;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[1] = 1000;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].SelectedAmmo = WEAPON_AMMO1;
/*Lara.Weapons[WEAPON_SHOTGUN].Present = true;
Lara.Weapons[WEAPON_SHOTGUN].Ammo[0] = 1000;
Lara.Weapons[WEAPON_SHOTGUN].Ammo[1] = 1000;
Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = WEAPON_AMMO1;
g_LaraExtra.Weapons[WEAPON_REVOLVER].Present = true;
g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[0] = 1000;
g_LaraExtra.Weapons[WEAPON_REVOLVER].SelectedAmmo = WEAPON_AMMO1;
Lara.Weapons[WEAPON_REVOLVER].Present = true;
Lara.Weapons[WEAPON_REVOLVER].Ammo[0] = 1000;
Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = WEAPON_AMMO1;
Lara.laserSight = true;
/*g_LaraExtra.Weapons[WEAPON_CROSSBOW].Present = true;
g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[0] = 1000;
g_LaraExtra.Weapons[WEAPON_CROSSBOW].SelectedAmmo = WEAPON_AMMO1;
/*Lara.Weapons[WEAPON_CROSSBOW].Present = true;
Lara.Weapons[WEAPON_CROSSBOW].Ammo[0] = 1000;
Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = WEAPON_AMMO1;
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Present = true;
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] = 1000;
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = WEAPON_AMMO1;
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present = true;
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] = 1000;
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = WEAPON_AMMO1;
g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Present = true;
g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] = 1000;
Lara.Weapons[WEAPON_HARPOON_GUN].Present = true;
Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] = 1000;
}*/
// Now fill the rings
if (g_GameFlow->GetLevel(CurrentLevel)->LaraType != LARA_YOUNG)
{
// Pistols
if (g_LaraExtra.Weapons[WEAPON_PISTOLS].Present)
if (Lara.Weapons[WEAPON_PISTOLS].Present)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_PISTOLS);
// Uzi
if (g_LaraExtra.Weapons[WEAPON_UZI].Present)
if (Lara.Weapons[WEAPON_UZI].Present)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_UZIS);
else if (g_LaraExtra.Weapons[WEAPON_UZI].Ammo[0])
else if (Lara.Weapons[WEAPON_UZI].Ammo[0])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_UZI_AMMO);
// Revolver
if (g_LaraExtra.Weapons[WEAPON_REVOLVER].Present)
if (Lara.Weapons[WEAPON_REVOLVER].Present)
{
if (g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight)
if (Lara.Weapons[WEAPON_REVOLVER].HasLasersight)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_REVOLVER_LASER);
else
InsertObject(INV_RING_WEAPONS, INV_OBJECT_REVOLVER);
}
else
{
if (g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[0])
if (Lara.Weapons[WEAPON_REVOLVER].Ammo[0])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_REVOLVER_AMMO);
}
// Shotgun
if (g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present)
if (Lara.Weapons[WEAPON_SHOTGUN].Present)
{
InsertObject(INV_RING_WEAPONS, INV_OBJECT_SHOTGUN);
//if (Lara.shotgunTypeCarried & 0x10)
@ -336,138 +333,138 @@ void Inventory::LoadObjects(bool isReload)
}
else
{
if (g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[0])
if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[0])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_SHOTGUN_AMMO1);
if (g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[1])
if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[1])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_SHOTGUN_AMMO2);
}
// HK
if (g_LaraExtra.Weapons[WEAPON_HK].Present)
if (Lara.Weapons[WEAPON_HK].Present)
{
if (g_LaraExtra.Weapons[WEAPON_HK].HasSilencer)
if (Lara.Weapons[WEAPON_HK].HasSilencer)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_HK_LASER);
else
InsertObject(INV_RING_WEAPONS, INV_OBJECT_HK);
}
else if (g_LaraExtra.Weapons[WEAPON_HK].Ammo[0])
else if (Lara.Weapons[WEAPON_HK].Ammo[0])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_HK_AMMO1);
// Crossbow
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Present)
if (Lara.Weapons[WEAPON_CROSSBOW].Present)
{
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].HasLasersight)
if (Lara.Weapons[WEAPON_CROSSBOW].HasLasersight)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_CROSSBOW_LASER);
else
InsertObject(INV_RING_WEAPONS, INV_OBJECT_CROSSBOW);
}
else
{
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[0])
if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[0])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_CROSSBOW_AMMO1);
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[1])
if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[1])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_CROSSBOW_AMMO2);
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[2])
if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[2])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_CROSSBOW_AMMO3);
}
// Grenade launcher
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Present)
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_GRENADE_LAUNCHER);
else
{
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0])
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_GRENADE_AMMO1);
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[1])
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[1])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_GRENADE_AMMO2);
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[2])
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[2])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_GRENADE_AMMO3);
}
// Harpoon
if (g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Present)
if (Lara.Weapons[WEAPON_HARPOON_GUN].Present)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_HARPOON_GUN);
else if (g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0])
else if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_HARPOON_AMMO);
// Rocket launcher
if (g_LaraExtra.Weapons[WEAPON_ROCKET_LAUNCHER].Present)
if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_ROCKET_LAUNCHER);
else if (g_LaraExtra.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0])
else if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0])
InsertObject(INV_RING_WEAPONS, INV_OBJECT_ROCKET_AMMO);
// Lasersight
if (g_LaraExtra.Lasersight)
if (Lara.Lasersight)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_LASERSIGHT);
// Silencer
if (g_LaraExtra.Silencer)
if (Lara.Silencer)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_SILENCER);
// Binoculars
if (g_LaraExtra.Binoculars)
if (Lara.Binoculars)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_BINOCULARS);
// Flares
if (g_LaraExtra.NumFlares)
if (Lara.NumFlares)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_FLARES);
}
if (g_LaraExtra.NumSmallMedipacks)
if (Lara.NumSmallMedipacks)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_SMALL_MEDIPACK);
if (g_LaraExtra.NumLargeMedipacks)
if (Lara.NumLargeMedipacks)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_LARGE_MEDIPACK);
if (g_LaraExtra.Crowbar)
if (Lara.Crowbar)
InsertObject(INV_RING_WEAPONS, INV_OBJECT_CROWBAR);
int i;
for (i = 0; i < NUM_PUZZLES; i++)
{
if (g_LaraExtra.Puzzles[i])
if (Lara.Puzzles[i])
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PUZZLE1);
}
for (i = 0; i < NUM_PUZZLES * 2; i++)
{
if (g_LaraExtra.PuzzlesCombo[i])
if (Lara.PuzzlesCombo[i])
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PUZZLE1_COMBO1);
}
for (i = 0; i < NUM_KEYS; i++)
{
if (g_LaraExtra.Keys[i])
if (Lara.Keys[i])
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_KEY1);
}
for (i = 0; i < NUM_KEYS * 2; i++)
{
if (g_LaraExtra.KeysCombo[i])
if (Lara.KeysCombo[i])
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_KEY1_COMBO1);
}
for (i = 0; i < NUM_PICKUPS; i++)
{
if (g_LaraExtra.Pickups[i])
if (Lara.Pickups[i])
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PICKUP1);
}
for (i = 0; i < NUM_PICKUPS * 2; i++)
{
if (g_LaraExtra.PickupsCombo[i])
if (Lara.PickupsCombo[i])
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_PICKUP1_COMBO1);
}
for (i = 0; i < NUM_EXAMINES; i++)
{
if (g_LaraExtra.Examines[i])
if (Lara.Examines[i])
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_EXAMINE1);
}
for (i = 0; i < NUM_EXAMINES * 2; i++)
{
if (g_LaraExtra.ExaminesCombo[i])
if (Lara.ExaminesCombo[i])
InsertObject(INV_RING_PUZZLES, i + INV_OBJECT_EXAMINE1_COMBO1);
}
@ -480,10 +477,10 @@ void Inventory::LoadObjects(bool isReload)
if (Lara.bottle)
InsertObject(INV_RING_PUZZLES, INV_OBJECT_BOTTLE);
if (g_LaraExtra.Waterskin1.Present)
if (Lara.Waterskin1.Present)
InsertObject(INV_RING_PUZZLES, INV_OBJECT_WATERSKIN1);
if (g_LaraExtra.Waterskin2.Present)
if (Lara.Waterskin2.Present)
InsertObject(INV_RING_PUZZLES, INV_OBJECT_WATERSKIN2);
InventoryRing* ring = &m_rings[INV_RING_OPTIONS];
@ -623,7 +620,7 @@ int Inventory::DoInventory()
OpenRing(m_activeRing, true);
while (!ResetFlag)
while (true /*!ResetFlag*/)
{
SetDebounce = true;
S_UpdateInput();
@ -1285,34 +1282,34 @@ void Inventory::DoSelectAmmo()
switch (ring->objects[ring->currentObject].inventoryObject)
{
case INV_OBJECT_SHOTGUN:
if (g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[0] != 0)
if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[0] != 0)
ammoRing->objects[ammoRing->numObjects++].inventoryObject = INV_OBJECT_SHOTGUN_AMMO1;
if (g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[1] != 0)
if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[1] != 0)
ammoRing->objects[ammoRing->numObjects++].inventoryObject = INV_OBJECT_SHOTGUN_AMMO2;
ammoRing->selectedIndex = g_LaraExtra.Weapons[WEAPON_SHOTGUN].SelectedAmmo;
ammoRing->selectedIndex = Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo;
break;
case INV_OBJECT_GRENADE_LAUNCHER:
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] != 0)
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] != 0)
ammoRing->objects[ammoRing->numObjects++].inventoryObject = INV_OBJECT_GRENADE_AMMO1;
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[1] != 0)
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[1] != 0)
ammoRing->objects[ammoRing->numObjects++].inventoryObject = INV_OBJECT_GRENADE_AMMO2;
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[2] != 0)
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[2] != 0)
ammoRing->objects[ammoRing->numObjects++].inventoryObject = INV_OBJECT_GRENADE_AMMO3;
ammoRing->selectedIndex = g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo;
ammoRing->selectedIndex = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo;
break;
case INV_OBJECT_CROSSBOW:
case INV_OBJECT_CROSSBOW_LASER:
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[0] != 0)
if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[0] != 0)
ammoRing->objects[ammoRing->numObjects++].inventoryObject = INV_OBJECT_CROSSBOW_AMMO1;
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[1] != 0)
if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[1] != 0)
ammoRing->objects[ammoRing->numObjects++].inventoryObject = INV_OBJECT_CROSSBOW_AMMO2;
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[2] != 0)
if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[2] != 0)
ammoRing->objects[ammoRing->numObjects++].inventoryObject = INV_OBJECT_CROSSBOW_AMMO3;
ammoRing->selectedIndex = g_LaraExtra.Weapons[WEAPON_CROSSBOW].SelectedAmmo;
ammoRing->selectedIndex = Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo;
break;
}
@ -1396,16 +1393,16 @@ void Inventory::DoSelectAmmo()
switch (ring->objects[ring->currentObject].inventoryObject)
{
case INV_OBJECT_SHOTGUN:
g_LaraExtra.Weapons[WEAPON_SHOTGUN].SelectedAmmo = ring->selectedIndex;
Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = ring->selectedIndex;
break;
case INV_OBJECT_GRENADE_LAUNCHER:
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = ring->selectedIndex;
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = ring->selectedIndex;
break;
case INV_OBJECT_CROSSBOW:
case INV_OBJECT_CROSSBOW_LASER:
g_LaraExtra.Weapons[WEAPON_CROSSBOW].SelectedAmmo = ring->selectedIndex;
Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = ring->selectedIndex;
break;
}
@ -1446,8 +1443,8 @@ void Inventory::UseCurrentItem()
return;
}
if (g_LaraExtra.NumSmallMedipacks != -1)
g_LaraExtra.NumSmallMedipacks--;
if (Lara.NumSmallMedipacks != -1)
Lara.NumSmallMedipacks--;
Lara.dpoisoned = 0;
LaraItem->hitPoints += 500;
@ -1471,8 +1468,8 @@ void Inventory::UseCurrentItem()
return;
}
if (g_LaraExtra.NumLargeMedipacks != -1)
g_LaraExtra.NumLargeMedipacks--;
if (Lara.NumLargeMedipacks != -1)
Lara.NumLargeMedipacks--;
Lara.dpoisoned = 0;
LaraItem->hitPoints += 1000;
@ -1792,19 +1789,10 @@ bool Inventory::UpdateSceneAndDrawInventory()
if (CurrentLevel == 0 && g_GameFlow->TitleType == TITLE_FLYBY)
{
// Control routines uses joints calculated here for getting Lara joint positions
CalcLaraMatrices(0);
phd_PushUnitMatrix();
CalcLaraMatrices(1);
// Calls my new rock & roll renderer :)
g_Renderer->DumpGameScene();
g_Renderer->DrawInventory();
Camera.numberFrames = g_Renderer->SyncRenderer();
// We need to pop the matrix stack or the game will crash
phd_PopMatrix();
nframes = Camera.numberFrames;
ControlPhase(nframes, 0);
}
@ -1843,9 +1831,10 @@ int Inventory::DoTitleInventory()
int result = INV_RESULT_NONE;
while (!ResetFlag)
while (true /*!ResetFlag*/)
{
SetDebounce = true;
S_UpdateInput();
SetDebounce = false;
@ -2511,7 +2500,7 @@ void Inventory::DoControlsSettings()
bool closeObject = false;
// Copy configuration to a temporary object
memcpy(&ring->Configuration.KeyboardLayout, &KeyboardLayout1, NUM_CONTROLS);
memcpy(&ring->Configuration.KeyboardLayout, &KeyboardLayout[1], NUM_CONTROLS);
// Do the passport
while (true)
@ -2555,7 +2544,7 @@ void Inventory::DoControlsSettings()
if (ring->selectedIndex == NUM_CONTROLS)
{
memcpy(KeyboardLayout1, ring->Configuration.KeyboardLayout, NUM_CONTROLS);
memcpy(KeyboardLayout[1], ring->Configuration.KeyboardLayout, NUM_CONTROLS);
SaveConfiguration();
closeObject = true;
@ -2575,7 +2564,7 @@ void Inventory::DoControlsSettings()
}
// If RETURN is pressed, then wait for a new key
if (KeyMap[TR_KEY_RETURN] & 0x80)
if (KeyMap[DIK_RETURN] & 0x80)
{
SoundEffect(SFX_MENU_SELECT, NULL, 0);
@ -2608,13 +2597,13 @@ void Inventory::DoControlsSettings()
if (selectedKey && g_KeyNames[selectedKey])
{
// Can't rededefine special keys or the inventory will be not usable
if (!(selectedKey == TR_KEY_RETURN || selectedKey == TR_KEY_LEFT || selectedKey == TR_KEY_RIGHT ||
selectedKey == TR_KEY_UP || selectedKey == TR_KEY_DOWN))
if (!(selectedKey == DIK_RETURN || selectedKey == DIK_LEFT || selectedKey == DIK_RIGHT ||
selectedKey == DIK_UP || selectedKey == DIK_DOWN))
{
if (selectedKey != TR_KEY_ESCAPE)
if (selectedKey != DIK_ESCAPE)
{
KeyboardLayout1[ring->selectedIndex] = selectedKey;
CheckKeyConflicts();
KeyboardLayout[1][ring->selectedIndex] = selectedKey;
DefaultConflict();
ring->waitingForKey = false;
break;
}

View file

@ -3,6 +3,9 @@
#include "effect2.h"
#include <stdio.h>
#include "../Specific/setup.h"
#include "../Specific/level.h"
#include "lara.h"
#include "effects.h"
void ClearItem(short itemNum)
{
@ -272,7 +275,7 @@ short CreateNewEffect(short roomNum)
void InitialiseFXArray(int allocmem)
{
if (allocmem)
Effects = (FX_INFO*)GameMalloc(NUM_EFFECTS * sizeof(FX_INFO));
Effects = (FX_INFO*)game_malloc(NUM_EFFECTS * sizeof(FX_INFO));
FX_INFO* fx = Effects;
NextFxActive = NO_ITEM;
@ -375,13 +378,14 @@ void InitialiseItem(short itemNum)
}
else
{
item->meshBits = 0xFFFFFFFF;
item->meshBits = -1;
}
item->touchBits = 0;
item->afterDeath = false;
item->firedWeapon = 0;
item->data = NULL;
item->swapMeshFlags = 0;
if (item->flags & IFLAG_INVISIBLE)
{
@ -506,20 +510,3 @@ int FindItem(short objectNum)
return NO_ITEM;
}
void Inject_Items()
{
INJECT(0x00440840, CreateItem);
INJECT(0x00440D10, AddActiveItem);
INJECT(0x00440620, KillItem);
INJECT(0x00440DA0, ItemNewRoom);
INJECT(0x004412F0, EffectNewRoom);
INJECT(0x00441180, KillEffect);
INJECT(0x00441080, InitialiseFXArray);
INJECT(0x004410F0, CreateNewEffect);
INJECT(0x00440B60, RemoveActiveItem);
INJECT(0x00440C40, RemoveDrawnItem);
INJECT(0x004408B0, InitialiseItem);
INJECT(0x00408550, ClearItem);
INJECT(0x00440590, InitialiseItemArray);
}

View file

@ -21,5 +21,3 @@ void InitialiseItemArray(int numitems);
void KillItem(short itemNum);
ITEM_INFO* find_a_fucking_item(short objectNum);
int FindItem(short objectNum);
void Inject_Items();

View file

@ -21,6 +21,9 @@
#include "..\Objects\newobjects.h"
#include "..\Global\global.h"
#include "../Specific/level.h"
#include "../Specific/input.h"
#include "sound.h"
#include <stdio.h>
@ -39,8 +42,10 @@ extern Inventory* g_Inventory;
short elevation = 57346;
bool doJump = false;
short OldAngle = 1;
LaraExtraInfo g_LaraExtra;
int RopeSwing = 0;
LaraInfo Lara;
ITEM_INFO* LaraItem;
byte LaraNodeUnderwater[15];
void(*lara_control_routines[NUM_LARA_STATES + 1])(ITEM_INFO* item, COLL_INFO* coll) =
{
@ -344,7 +349,7 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll)
coll->radius = 100;
coll->trigger = 0;
if ((TrInput & IN_LOOK) && g_LaraExtra.ExtraAnim == 0 && Lara.look)
if ((TrInput & IN_LOOK) && Lara.ExtraAnim == 0 && Lara.look)
LookLeftRight();
else
ResetLook();
@ -352,9 +357,9 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll)
Lara.look = true;
// Process Vehicles
if (g_LaraExtra.Vehicle != NO_ITEM)
if (Lara.Vehicle != NO_ITEM)
{
switch (Items[g_LaraExtra.Vehicle].objectNumber)
switch (Items[Lara.Vehicle].objectNumber)
{
case ID_QUAD:
if (QuadBikeControl())
@ -412,13 +417,13 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll)
// Animate Lara
AnimateLara(item);
if (g_LaraExtra.ExtraAnim == 0)
if (Lara.ExtraAnim == 0)
{
// Check for collision with items
LaraBaddieCollision(item, coll);
// Handle Lara collision
if (g_LaraExtra.Vehicle == NO_ITEM)
if (Lara.Vehicle == NO_ITEM)
(*lara_collision_routines[item->currentAnimState])(item, coll);
}
@ -448,9 +453,9 @@ int UseSpecialItem(ITEM_INFO* item)
if (selectedObject != ID_WATERSKIN1_3 && selectedObject != ID_WATERSKIN2_5)
{
if (selectedObject >= ID_WATERSKIN2_EMPTY)
g_LaraExtra.Waterskin2.Quantity = 5;
Lara.Waterskin2.Quantity = 5;
else
g_LaraExtra.Waterskin1.Quantity = 3;
Lara.Waterskin1.Quantity = 3;
item->animNumber = ANIMATION_LARA_WATERSKIN_FILL;
}
@ -458,13 +463,13 @@ int UseSpecialItem(ITEM_INFO* item)
{
if (selectedObject >= ID_WATERSKIN2_EMPTY)
{
item->itemFlags[3] = g_LaraExtra.Waterskin2.Quantity;
g_LaraExtra.Waterskin2.Quantity = 1;
item->itemFlags[3] = Lara.Waterskin2.Quantity;
Lara.Waterskin2.Quantity = 1;
}
else
{
item->itemFlags[3] = g_LaraExtra.Waterskin1.Quantity;
g_LaraExtra.Waterskin1.Quantity = 1;
item->itemFlags[3] = Lara.Waterskin1.Quantity;
Lara.Waterskin1.Quantity = 1;
}
item->animNumber = ANIMATION_LARA_WATERSKIN_EMPTY;
@ -713,9 +718,9 @@ void lara_as_pbleapoff(ITEM_INFO* item, COLL_INFO* coll)//1D244, 1D3D8 (F)
if (item->frameNumber == Anims[item->animNumber].frameEnd)
{
item->pos.xPos += 700 * SIN(item->pos.yRot) >> W2V_SHIFT;
item->pos.xPos += 700 * phd_sin(item->pos.yRot) >> W2V_SHIFT;
item->pos.yPos -= 361;
item->pos.zPos += 700 * COS(item->pos.yRot) >> W2V_SHIFT;
item->pos.zPos += 700 * phd_cos(item->pos.yRot) >> W2V_SHIFT;
item->animNumber = ANIMATION_LARA_TRY_HANG_SOLID;
item->frameNumber = Anims[item->animNumber].frameBase;
@ -744,7 +749,7 @@ void lara_as_trfall(ITEM_INFO* item, COLL_INFO* coll)
pos.y = 0;
pos.z = 0;
GetLaraJointPosition(&pos, LJ_RFOOT);
GetLaraJointPosition(&pos, LM_RFOOT);
item->pos.xPos = pos.x;
item->pos.yPos = pos.y + 75;
@ -3826,8 +3831,8 @@ void lara_col_polestat(ITEM_INFO* item, COLL_INFO* coll)//16DFC, 16F30 (F)
}
else
{
item->pos.xPos -= (SIN(item->pos.yRot)) << 6 >> W2V_SHIFT;
item->pos.zPos -= (COS(item->pos.yRot)) << 6 >> W2V_SHIFT;
item->pos.xPos -= (phd_sin(item->pos.yRot)) << 6 >> W2V_SHIFT;
item->pos.zPos -= (phd_cos(item->pos.yRot)) << 6 >> W2V_SHIFT;
item->goalAnimState = STATE_LARA_FREEFALL;
}
}
@ -4885,13 +4890,13 @@ void lara_col_all4s(ITEM_INFO* item, COLL_INFO* coll)//14B40, 14C74 (F)
int x = item->pos.xPos;
int z = item->pos.zPos;
item->pos.xPos += 128 * SIN(item->pos.yRot - ANGLE(90)) >> W2V_SHIFT;
item->pos.zPos += 128 * COS(item->pos.yRot - ANGLE(90)) >> W2V_SHIFT;
item->pos.xPos += 128 * phd_sin(item->pos.yRot - ANGLE(90)) >> W2V_SHIFT;
item->pos.zPos += 128 * phd_cos(item->pos.yRot - ANGLE(90)) >> W2V_SHIFT;
heightl = LaraFloorFront(item, item->pos.yRot, -300);
item->pos.xPos += 256 * SIN(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
item->pos.zPos += 256 * COS(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
item->pos.xPos += 256 * phd_sin(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
item->pos.zPos += 256 * phd_cos(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
heightr = LaraFloorFront(item, item->pos.yRot, -300);
@ -4916,8 +4921,8 @@ void lara_col_all4s(ITEM_INFO* item, COLL_INFO* coll)//14B40, 14C74 (F)
int x = item->pos.xPos;
int z = item->pos.zPos;
item->pos.xPos -= 100 * SIN(coll->facing) >> W2V_SHIFT;
item->pos.zPos -= 100 * COS(coll->facing) >> W2V_SHIFT;
item->pos.xPos -= 100 * phd_sin(coll->facing) >> W2V_SHIFT;
item->pos.zPos -= 100 * phd_cos(coll->facing) >> W2V_SHIFT;
//tmp = GetCollidedObjects(item, 100, 1, wat, wat, 0);
//S_Warn("[lara_col_all4s] - Warning: Core Design function call shittery\n");
@ -5006,9 +5011,9 @@ void lara_as_all4s(ITEM_INFO* item, COLL_INFO* coll)//14970, 14A78 (F)
s.z = LaraItem->pos.zPos;
s.roomNumber = LaraItem->roomNumber;
d.x = s.x + (768 * SIN(LaraItem->pos.yRot) >> W2V_SHIFT);
d.x = s.x + (768 * phd_sin(LaraItem->pos.yRot) >> W2V_SHIFT);
d.y = s.y + 160;
d.z = s.z + (768 * COS(LaraItem->pos.yRot) >> W2V_SHIFT);
d.z = s.z + (768 * phd_cos(LaraItem->pos.yRot) >> W2V_SHIFT);
if (LOS(&s, &d))
{
@ -5682,8 +5687,8 @@ void LaraSlideEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12B18, 12BC8 (F)
break;
case CT_CLAMP:
item->pos.zPos -= (400 * COS(coll->facing)) >> W2V_SHIFT;
item->pos.xPos -= (400 * SIN(coll->facing)) >> W2V_SHIFT;
item->pos.zPos -= (400 * phd_cos(coll->facing)) >> W2V_SHIFT;
item->pos.xPos -= (400 * phd_sin(coll->facing)) >> W2V_SHIFT;
item->speed = 0;
@ -5746,8 +5751,8 @@ void LaraDeflectEdgeJump(ITEM_INFO* item, COLL_INFO* coll)//12904, 129B4 (F)
item->pos.yRot -= ANGLE(5);
break;
case CT_CLAMP:
item->pos.xPos -= (100 * 4 * SIN(coll->facing)) >> W2V_SHIFT;
item->pos.zPos -= (100 * 4 * COS(coll->facing)) >> W2V_SHIFT;
item->pos.xPos -= (100 * 4 * phd_sin(coll->facing)) >> W2V_SHIFT;
item->pos.zPos -= (100 * 4 * phd_cos(coll->facing)) >> W2V_SHIFT;
item->speed = 0;
coll->midFloor = 0;
@ -6087,9 +6092,9 @@ short LaraCeilingFront(ITEM_INFO* item, short ang, int dist, int h) // (F) (D)
{
short room = item->roomNumber;
int x = item->pos.xPos + ((dist * SIN(ang)) >> W2V_SHIFT);
int x = item->pos.xPos + ((dist * phd_sin(ang)) >> W2V_SHIFT);
int y = item->pos.yPos - h;
int z = item->pos.zPos + ((dist * COS(ang)) >> W2V_SHIFT);
int z = item->pos.zPos + ((dist * phd_cos(ang)) >> W2V_SHIFT);
int height = GetCeiling(GetFloor(x, y, z, &room), x, y, z);
@ -6103,9 +6108,9 @@ short LaraFloorFront(ITEM_INFO* item, short ang, int dist) // (F) (D)
{
short room = item->roomNumber;
int x = item->pos.xPos + ((dist * SIN(ang)) >> W2V_SHIFT);
int x = item->pos.xPos + ((dist * phd_sin(ang)) >> W2V_SHIFT);
int y = item->pos.yPos - 762;
int z = item->pos.zPos + ((dist * COS(ang)) >> W2V_SHIFT);
int z = item->pos.zPos + ((dist * phd_cos(ang)) >> W2V_SHIFT);
int height = GetFloorHeight(GetFloor(x, y, z, &room), x, y, z);
@ -6202,7 +6207,7 @@ int TestLaraVault(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
item->frameNumber = Anims[item->animNumber].frameBase;
item->goalAnimState = STATE_LARA_JUMP_UP;
item->currentAnimState = STATE_LARA_STOP;
Lara.calcFallSpeed = -3 - SQRT_ASM(-9600 - 12 * coll->frontFloor);
Lara.calcFallSpeed = -3 - sqrt(-9600 - 12 * coll->frontFloor);
AnimateLara(item);
}
else
@ -6646,9 +6651,3 @@ int LaraHangTest(ITEM_INFO* item, COLL_INFO* coll) // (F) (D)
}
return result;
}
void Inject_Lara()
{
//INJECT(0x00448010, lara_as_stop);
//INJECT(0x00442E70, LaraAboveWater);
}

View file

@ -15,12 +15,106 @@ typedef struct DiaryInfo {
bool Present;
};
typedef struct WaterskinInfo {
struct WaterskinInfo {
bool Present;
int Quantity;
};
typedef struct LaraExtraInfo {
struct LaraInfo {
short itemNumber;
short gunStatus;
short gunType;
short requestGunType;
short lastGunType;
short calcFallSpeed;
short waterStatus;
short climbStatus;
short poseCount;
short hitFrame;
short hitDirection;
short air;
short diveCount;
short deathCount;
short currentActive;
short currentXvel;
short currentYvel;
short currentZvel;
short spazEffectCount;
short flareAge;
short burnCount;
short weaponItem;
short backGun;
short flareFrame;
short poisoned;
short dpoisoned;
byte anxiety;
byte wet[15];
bool flareControlLeft;
bool unused1;
bool look;
bool burn;
bool keepDucked;
bool isMoving;
bool canMonkeySwing;
byte burnBlue;
bool gassed;
bool burnSmoke;
bool isDucked;
bool hasFired;
bool busy;
bool litTorch;
bool isClimbing;
bool fired;
int waterSurfaceDist;
PHD_VECTOR lastPos;
FX_INFO* spazEffect;
int meshEffects;
short* meshPtrs[15];
ITEM_INFO* target;
short targetAngles[2];
short turnRate;
short moveAngle;
short headYrot;
short headXrot;
short headZrot;
short torsoYrot;
short torsoXrot;
short torsoZrot;
LARA_ARM leftArm;
LARA_ARM rightArm;
unsigned short holster;
CREATURE_INFO* creature;
int cornerX;
int cornerZ;
byte ropeSegment;
byte ropeDirection;
short ropeArcFront;
short ropeArcBack;
short ropeLastX;
short ropeMaxXForward;
short ropeMaxXBackward;
int ropeDFrame;
int ropeFrame;
unsigned short ropeFrameRate;
unsigned short ropeY;
int ropePtr;
void* generalPtr;
int ropeOffset;
int ropeDownVel;
byte ropeFlag;
byte moveCount;
int ropeCount;
byte skelebob;
byte wetcloth;
byte bottle;
byte location;
byte highestLocation;
byte locationPad;
byte tightRopeOnCount;
byte tightRopeOff;
byte tightRopeFall;
byte chaffTimer;
short Vehicle;
short ExtraAnim;
bool mineL;
@ -49,9 +143,9 @@ typedef struct LaraExtraInfo {
int NumFlares;
};
extern LaraExtraInfo g_LaraExtra;
#define GetLaraJointPosition ((void (__cdecl*)(PHD_VECTOR*, int)) 0x0041E2A0)
extern LaraInfo Lara;
extern ITEM_INFO* LaraItem;
extern byte LaraNodeUnderwater[15];
extern void(*lara_control_routines[NUM_LARA_STATES + 1])(ITEM_INFO* item, COLL_INFO* coll);
extern void(*lara_collision_routines[NUM_LARA_STATES + 1])(ITEM_INFO* item, COLL_INFO* coll);
@ -234,11 +328,3 @@ void GetLaraCollisionInfo(ITEM_INFO* item, COLL_INFO* coll);
int TestLaraVault(ITEM_INFO* item, COLL_INFO* coll);
int TestLaraSlide(ITEM_INFO* item, COLL_INFO* coll);
void LaraClimbRope(ITEM_INFO* item, COLL_INFO* coll);
//int GetLaraJointPos(PHD_VECTOR* pos, int joint);
//void SetLaraUnderwaterNodes();
//void FireChaff();
//void GetLaraJointPosRot(PHD_VECTOR* pos, int a2, int a3, SVECTOR* a4);
//void DoSubsuitStuff();
void Inject_Lara();

View file

@ -20,19 +20,25 @@
#include "..\Global\global.h"
#include "..\Scripting\GameFlowScript.h"
#include "..\Specific\roomload.h"
#include "..\Specific\level.h"
#include "../Specific/setup.h"
#include "../Specific/input.h"
#include "savegame.h"
#include "sound.h"
#include "bubble.h"
extern LaraExtraInfo g_LaraExtra;
extern GameFlow* g_GameFlow;
int HKCounter = 0;
int HKTimer = 0;
int HKFlag = 0;
byte HKFlag2 = 0;
void FireHarpoon()
{
// If no ammo then exit
//if (g_LaraExtra.numHarpoonAmmos <= 0)
//if (Lara.numHarpoonAmmos <= 0)
// return;
// Create a new item for harpoon
@ -52,7 +58,7 @@ void FireHarpoon()
pos.z = dxPos.z = 77;
g_Renderer->GetLaraBonePosition(&dxPos, LM_RHAND);
GetLaraJointPosition((PHD_VECTOR*)&pos, LJ_RHAND);
GetLaraJointPosition((PHD_VECTOR*)&pos, LM_RHAND);
/*item->pos.xPos = pos.x = dxPos.x;
item->pos.yPos = pos.y = dxPos.y;
@ -68,9 +74,9 @@ void FireHarpoon()
{
find_target_point(Lara.target, &pos);
item->pos.yRot = ATAN(pos.z - item->pos.zPos, pos.x - item->pos.xPos);
int distance = SQRT_ASM(SQUARE(pos.z - item->pos.zPos) + SQUARE(pos.x - item->pos.xPos));
item->pos.xRot = -ATAN(distance, pos.y - item->pos.yPos);
item->pos.yRot = phd_atan(pos.z - item->pos.zPos, pos.x - item->pos.xPos);
int distance = sqrt(SQUARE(pos.z - item->pos.zPos) + SQUARE(pos.x - item->pos.xPos));
item->pos.xRot = -phd_atan(distance, pos.y - item->pos.yPos);
}
else
{
@ -80,8 +86,8 @@ void FireHarpoon()
item->pos.zRot = 0;
item->fallspeed = (short)(-HARPOON_SPEED * SIN(item->pos.xRot) >> W2V_SHIFT);
item->speed = (short)(HARPOON_SPEED * COS(item->pos.xRot) >> W2V_SHIFT);
item->fallspeed = (short)(-HARPOON_SPEED * phd_sin(item->pos.xRot) >> W2V_SHIFT);
item->speed = (short)(HARPOON_SPEED * phd_cos(item->pos.xRot) >> W2V_SHIFT);
item->hitPoints = HARPOON_TIME;
AddActiveItem(itemNumber);
@ -100,9 +106,9 @@ void ControlHarpoonBolt(short itemNumber)
int oldZ = item->pos.zPos;
short oldRoom = item->roomNumber;
item->pos.xPos += item->speed * SIN(item->pos.yRot) >> W2V_SHIFT;
item->pos.xPos += item->speed * phd_sin(item->pos.yRot) >> W2V_SHIFT;
item->pos.yPos += item->fallspeed;
item->pos.zPos += item->speed * COS(item->pos.yRot) >> W2V_SHIFT;
item->pos.zPos += item->speed * phd_cos(item->pos.yRot) >> W2V_SHIFT;
short roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
@ -134,8 +140,8 @@ void ControlHarpoonBolt(short itemNumber)
continue;
// get vector from target to bolt and check against x,z bounds
short c = COS(target->pos.yRot);
short s = SIN(target->pos.yRot);
short c = phd_cos(target->pos.yRot);
short s = phd_sin(target->pos.yRot);
int x = item->pos.xPos - target->pos.xPos;
int z = item->pos.zPos - target->pos.zPos;
@ -220,8 +226,8 @@ void ControlHarpoonBolt(short itemNumber)
item->pos.xRot -= ANGLE(1);
if (item->pos.xRot < -16384)
item->pos.xRot = -16384;
item->fallspeed = (short)(-HARPOON_SPEED * SIN(item->pos.xRot) >> W2V_SHIFT);
item->speed = (short)(HARPOON_SPEED * COS(item->pos.xRot) >> W2V_SHIFT);
item->fallspeed = (short)(-HARPOON_SPEED * phd_sin(item->pos.xRot) >> W2V_SHIFT);
item->speed = (short)(HARPOON_SPEED * phd_cos(item->pos.xRot) >> W2V_SHIFT);
}
else
{
@ -229,8 +235,8 @@ void ControlHarpoonBolt(short itemNumber)
if ((Wibble & 15) == 0)
CreateBubble((PHD_VECTOR*)&item->pos, item->roomNumber, 0, 0,BUBBLE_FLAG_CLUMP | BUBBLE_FLAG_HIGH_AMPLITUDE, 0, 0, 0); // CHECK
//TriggerRocketSmoke(item->pos.xPos, item->pos.yPos, item->pos.zPos, 64);
item->fallspeed = (short)(-(HARPOON_SPEED >> 1) * SIN(item->pos.xRot) >> W2V_SHIFT);
item->speed = (short)((HARPOON_SPEED >> 1) * COS(item->pos.xRot) >> W2V_SHIFT);
item->fallspeed = (short)(-(HARPOON_SPEED >> 1) * phd_sin(item->pos.xRot) >> W2V_SHIFT);
item->speed = (short)((HARPOON_SPEED >> 1) * phd_cos(item->pos.xRot) >> W2V_SHIFT);
}
}
@ -269,7 +275,7 @@ void FireGrenade()
jointPos.y = 276;
jointPos.z = 80;
GetLaraJointPosition(&jointPos, LJ_RHAND);
GetLaraJointPosition(&jointPos, LM_RHAND);
item->pos.xPos = x = jointPos.x;
item->pos.yPos = y = jointPos.y;
@ -289,7 +295,7 @@ void FireGrenade()
jointPos.y = 1204;
jointPos.z = 5;
GetLaraJointPosition(&jointPos, LJ_RHAND);
GetLaraJointPosition(&jointPos, LM_RHAND);
SmokeCountL = 32;
SmokeWeapon = WEAPON_GRENADE_LAUNCHER;
@ -314,7 +320,7 @@ void FireGrenade()
}
item->speed = GRENADE_SPEED;
item->fallspeed = (-512 * SIN(item->pos.xRot)) >> W2V_SHIFT;
item->fallspeed = (-512 * phd_sin(item->pos.xRot)) >> W2V_SHIFT;
item->currentAnimState = item->pos.xRot;
item->goalAnimState = item->pos.yRot;
item->requiredAnimState = 0;
@ -326,7 +332,7 @@ void FireGrenade()
if (*ammo != -1)
(*ammo)--;
item->itemFlags[0] = g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo;
item->itemFlags[0] = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo;
Savegame.Level.AmmoUsed++;
Savegame.Game.AmmoUsed++;
@ -393,7 +399,7 @@ void ControlGrenade(short itemNumber)
newGrenade->pos.yRot = GetRandomControl() * 2;
newGrenade->pos.zRot = 0;
newGrenade->speed = 64;
newGrenade->fallspeed = -64 * SIN(newGrenade->pos.xRot) >> W2V_SHIFT;
newGrenade->fallspeed = -64 * phd_sin(newGrenade->pos.xRot) >> W2V_SHIFT;
newGrenade->currentAnimState = newGrenade->pos.xRot;
newGrenade->goalAnimState = newGrenade->pos.yRot;
newGrenade->requiredAnimState = 0;
@ -458,8 +464,19 @@ void ControlGrenade(short itemNumber)
if (item->speed && aboveWater)
{
Matrix world = Matrix::CreateFromYawPitchRoll(
TO_RAD(item->pos.yRot - ANGLE(180)),
TO_RAD(item->pos.xRot),
TO_RAD(item->pos.zRot)
) * Matrix::CreateTranslation(0, 0, -64);
int wx = world.Translation().x;
int wy = world.Translation().y;
int wz = world.Translation().z;
// For now keep this legacy math
phd_PushUnitMatrix();
// PHD_MATH
/*phd_PushUnitMatrix();
MatrixPtr[M03] = 0;
MatrixPtr[M13] = 0;
@ -472,7 +489,7 @@ void ControlGrenade(short itemNumber)
int wy = (MatrixPtr[M13] >> W2V_SHIFT);
int wz = (MatrixPtr[M23] >> W2V_SHIFT);
phd_PopMatrix();
phd_PopMatrix();*/
TriggerRocketSmoke(wx + item->pos.xPos, wy + item->pos.yPos, wz + item->pos.zPos, -1);
}
@ -481,8 +498,8 @@ void ControlGrenade(short itemNumber)
XMMATRIX translation;
XMMATRIX rotation;
XMMATRIXRotationYawPitchRoll(&rotation, TR_ANGLE_TO_RAD(item->pos.yRot), TR_ANGLE_TO_RAD(item->pos.xRot),
TR_ANGLE_TO_RAD(item->pos.zRot));
XMMATRIXRotationYawPitchRoll(&rotation, TO_RAD(item->pos.yRot), TO_RAD(item->pos.xRot),
TO_RAD(item->pos.zRot));
XMMATRIXTranslation(&translation, 0, 0, -64);
XMMATRIXMultiply(&transform, &rotation, &translation);
@ -494,9 +511,9 @@ void ControlGrenade(short itemNumber)
TriggerRocketSmoke(wx + item->pos.xPos, wy + item->pos.yPos, wz + item->pos.zPos, -1);
*/
xv = ((item->speed * SIN(item->goalAnimState)) >> W2V_SHIFT);
xv = ((item->speed * phd_sin(item->goalAnimState)) >> W2V_SHIFT);
yv = item->fallspeed;
zv = ((item->speed * COS(item->goalAnimState)) >> W2V_SHIFT);
zv = ((item->speed * phd_cos(item->goalAnimState)) >> W2V_SHIFT);
item->pos.xPos += xv;
item->pos.yPos += yv;
@ -651,7 +668,7 @@ void ControlGrenade(short itemNumber)
ExplodeItemNode(currentItem, Objects[ID_SHOOT_SWITCH1].nmeshes - 1, 0, 64);
}
AddActiveItem((currentItem - Items) / sizeof(ITEM_INFO));
AddActiveItem((currentItem - Items));
currentItem->status = ITEM_ACTIVE;
currentItem->triggerFlags |= 0x3E40;
}
@ -662,7 +679,7 @@ void ControlGrenade(short itemNumber)
TriggerShockwave(&currentItem->pos, 48, 304, 64, 0, 96, 128, 24, 0, 0); // CHECK
currentItem->pos.yPos += 128;
ExplodeItemNode(currentItem, 0, 0, 128);
short currentItemNumber = (currentItem - Items) / sizeof(ITEM_INFO);
short currentItemNumber = (currentItem - Items);
SmashObject(currentItemNumber);
KillItem(currentItemNumber);
}
@ -852,7 +869,7 @@ void AnimateShotgun(int weaponType)
pos.z = 72;
}
GetLaraJointPosition(&pos, LJ_LOUTARM);
GetLaraJointPosition(&pos, LM_LOUTARM);
if (LaraItem->meshBits)
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, 0, SmokeWeapon, SmokeCountL);
@ -906,7 +923,7 @@ void AnimateShotgun(int weaponType)
if (weaponType == WEAPON_HARPOON_GUN)
{
FireHarpoon();
if (!(g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] & 3))
if (!(Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] & 3))
harpoonFired = true;
}
else if (weaponType == WEAPON_ROCKET_LAUNCHER)
@ -926,7 +943,7 @@ void AnimateShotgun(int weaponType)
FireHK(0);
HKFlag = 1;
if (g_LaraExtra.Weapons[WEAPON_HK].HasSilencer)
if (Lara.Weapons[WEAPON_HK].HasSilencer)
{
SoundEffect(14, 0, 0);
}
@ -945,7 +962,7 @@ void AnimateShotgun(int weaponType)
item->goalAnimState = 0;
}
if (item->goalAnimState != 2 && HKFlag && !(g_LaraExtra.Weapons[WEAPON_HK].HasSilencer))
if (item->goalAnimState != 2 && HKFlag && !(Lara.Weapons[WEAPON_HK].HasSilencer))
{
StopSoundEffect(68);
SoundEffect(69, &LaraItem->pos, 0);
@ -954,7 +971,7 @@ void AnimateShotgun(int weaponType)
}
else if (HKFlag)
{
if (g_LaraExtra.Weapons[WEAPON_HK].HasSilencer)
if (Lara.Weapons[WEAPON_HK].HasSilencer)
{
SoundEffect(14, 0, 0);
}
@ -985,7 +1002,7 @@ void AnimateShotgun(int weaponType)
if (weaponType == WEAPON_HARPOON_GUN)
{
FireHarpoon();
if (!(g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] & 3))
if (!(Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] & 3))
harpoonFired = true;
}
else if (weaponType == WEAPON_HK && (/*!(Lara.HKtypeCarried & 0x18) || */!HKTimer))
@ -993,7 +1010,7 @@ void AnimateShotgun(int weaponType)
FireHK(1);
HKFlag = 1;
item->goalAnimState = 8;
if (g_LaraExtra.Weapons[WEAPON_HK].HasSilencer)
if (Lara.Weapons[WEAPON_HK].HasSilencer)
{
SoundEffect(14, 0, 0);
}
@ -1013,7 +1030,7 @@ void AnimateShotgun(int weaponType)
else if (Lara.leftArm.lock)
item->goalAnimState = 6;
}
else if (item->goalAnimState != 8 && HKFlag && !(g_LaraExtra.Weapons[WEAPON_HK].HasSilencer))
else if (item->goalAnimState != 8 && HKFlag && !(Lara.Weapons[WEAPON_HK].HasSilencer))
{
StopSoundEffect(68);
SoundEffect(69, &LaraItem->pos, 0);
@ -1021,7 +1038,7 @@ void AnimateShotgun(int weaponType)
}
else if (HKFlag)
{
if (g_LaraExtra.Weapons[WEAPON_HK].HasSilencer)
if (Lara.Weapons[WEAPON_HK].HasSilencer)
{
SoundEffect(14, 0, 0);
}
@ -1070,9 +1087,9 @@ void ControlCrossbowBolt(short itemNumber)
land = true;
}
item->pos.xPos += ((item->speed * COS(item->pos.xRot) >> W2V_SHIFT) * SIN(item->pos.yRot)) >> W2V_SHIFT;
item->pos.yPos += item->speed * SIN(-item->pos.xRot) >> W2V_SHIFT;
item->pos.zPos += ((item->speed * COS(item->pos.xRot) >> W2V_SHIFT) * COS(item->pos.yRot)) >> W2V_SHIFT;
item->pos.xPos += ((item->speed * phd_cos(item->pos.xRot) >> W2V_SHIFT) * phd_sin(item->pos.yRot)) >> W2V_SHIFT;
item->pos.yPos += item->speed * phd_sin(-item->pos.xRot) >> W2V_SHIFT;
item->pos.zPos += ((item->speed * phd_cos(item->pos.xRot) >> W2V_SHIFT) * phd_cos(item->pos.yRot)) >> W2V_SHIFT;
roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
@ -1149,7 +1166,7 @@ void ControlCrossbowBolt(short itemNumber)
TriggerShockwave(&currentItem->pos, 48, 304, 96, 0, 96, 128, 24, 0, 0);
currentItem->pos.yPos += 128;
ExplodeItemNode(currentItem, 0, 0, 128);
short currentItemNumber = (currentItem - CollidedItems[0]) / sizeof(ITEM_INFO);
short currentItemNumber = (currentItem - CollidedItems[0]);
SmashObject(currentItemNumber);
KillItem(currentItemNumber);
}
@ -1280,9 +1297,9 @@ void RifleHandler(int weaponType)
if (weaponType == WEAPON_SHOTGUN || weaponType == WEAPON_HK)
{
TriggerDynamicLight(
LaraItem->pos.xPos + (SIN(LaraItem->pos.yRot) >> 4) + (byte)GetRandomControl() - 128,
LaraItem->pos.xPos + (phd_sin(LaraItem->pos.yRot) >> 4) + (byte)GetRandomControl() - 128,
LaraItem->pos.yPos + (GetRandomControl() & 0x7F) - 575,
LaraItem->pos.zPos + (COS(LaraItem->pos.yRot) >> 4) + (byte)GetRandomControl() - 128,
LaraItem->pos.zPos + (phd_cos(LaraItem->pos.yRot) >> 4) + (byte)GetRandomControl() - 128,
12,
(GetRandomControl() & 0x3F) + 192,
(GetRandomControl() & 0x1F) + 128,
@ -1297,7 +1314,7 @@ void RifleHandler(int weaponType)
pos.y = (GetRandomControl() & 0x7F) - 63;
pos.z = GetRandomControl() - 128;
GetLaraJointPosition(&pos, LJ_RHAND);
GetLaraJointPosition(&pos, LM_RHAND);
TriggerDynamicLight(pos.x, pos.y, pos.z, 12,
(GetRandomControl() & 0x3F) + 192,
@ -1344,7 +1361,7 @@ void FireCrossbow(PHD_3DPOS* pos)
jointPos.y = 228;
jointPos.z = 32;
GetLaraJointPosition(&jointPos, LJ_RHAND);
GetLaraJointPosition(&jointPos, LM_RHAND);
item->roomNumber = LaraItem->roomNumber;
@ -1382,7 +1399,7 @@ void FireCrossbow(PHD_3DPOS* pos)
AddActiveItem(itemNumber);
item->itemFlags[0] = g_LaraExtra.Weapons[WEAPON_CROSSBOW].SelectedAmmo;
item->itemFlags[0] = Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo;
SoundEffect(235, 0, 0);
@ -1401,7 +1418,7 @@ void DoGrenadeDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src)
{
dest->hitStatus = true;
OBJECT_INFO* obj = &Objects[dest->objectNumber];
ObjectInfo* obj = &Objects[dest->objectNumber];
if (!obj->undead)
{
HitTarget(dest, 0, 30, 1);
@ -1411,7 +1428,7 @@ void DoGrenadeDamageOnBaddie(ITEM_INFO* dest, ITEM_INFO* src)
if (src->hitPoints <= 0)
{
++Savegame.Level.Kills;
CreatureDie((dest - Items) / sizeof(ITEM_INFO), 1);
CreatureDie((dest - Items), 1);
}
}
}
@ -1505,13 +1522,13 @@ void CrossbowHitSwitchType78(ITEM_INFO* item1, ITEM_INFO* item2, signed int sear
{
if (search)
{
int numSpheres = GetSpheres(item2, SphereList, 1);
int numSpheres = GetSpheres(item2, CreatureSpheres, 1, Matrix::Identity);
int best = -1;
int bestDistance = 0x7FFFFFFF;
for (int i = 0; i < numSpheres; i++)
{
SPHERE* sphere = &SphereList[i];
SPHERE* sphere = &CreatureSpheres[i];
int dx = sphere->x - item1->pos.xPos;
int dy = sphere->y - item1->pos.yPos;
@ -1585,7 +1602,7 @@ void CrossbowHitSwitchType78(ITEM_INFO* item1, ITEM_INFO* item2, signed int sear
if (item2->objectNumber == ID_SHOOT_SWITCH1)
ExplodeItemNode(item2, Objects[ID_SHOOT_SWITCH1].nmeshes - 1, 0, 64);
AddActiveItem((item2 - Items) / sizeof(ITEM_INFO));
AddActiveItem((item2 - Items));
item2->flags |= 0x3E40;
item2->status = ITEM_ACTIVE;
}
@ -1594,11 +1611,11 @@ void CrossbowHitSwitchType78(ITEM_INFO* item1, ITEM_INFO* item2, signed int sear
void FireHK(int mode)
{
if (g_LaraExtra.Weapons[WEAPON_HK].SelectedAmmo == WEAPON_AMMO1)
if (Lara.Weapons[WEAPON_HK].SelectedAmmo == WEAPON_AMMO1)
{
HKTimer = 12;
}
else if (g_LaraExtra.Weapons[WEAPON_HK].SelectedAmmo == WEAPON_AMMO2)
else if (Lara.Weapons[WEAPON_HK].SelectedAmmo == WEAPON_AMMO2)
{
HKCounter++;
if (HKCounter == 5)
@ -1654,7 +1671,7 @@ void FireShotgun()
short loopAngles[2];
bool fired = false;
int value = (g_LaraExtra.Weapons[WEAPON_SHOTGUN].SelectedAmmo == WEAPON_AMMO1 ? 1820 : 5460);
int value = (Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo == WEAPON_AMMO1 ? 1820 : 5460);
for (int i = 0; i < 6; i++)
{
@ -1673,7 +1690,7 @@ void FireShotgun()
pos.y = 228;
pos.z = 32;
GetLaraJointPosition(&pos, LJ_RHAND);
GetLaraJointPosition(&pos, LM_RHAND);
PHD_VECTOR pos2;
@ -1685,7 +1702,7 @@ void FireShotgun()
pos.y = 1508;
pos.z = 32;
GetLaraJointPosition(&pos, LJ_RHAND);
GetLaraJointPosition(&pos, LM_RHAND);
SmokeCountL = 32;
SmokeWeapon = WEAPON_SHOTGUN;
@ -1724,8 +1741,3 @@ void ready_shotgun(int weaponType)
Lara.rightArm.frameBase = Objects[WeaponObject(weaponType)].frameBase;
Lara.leftArm.frameBase = Objects[WeaponObject(weaponType)].frameBase;
}
void Inject_Lara1Gun()
{
}

View file

@ -41,5 +41,3 @@ void FireHK(int mode);
void FireShotgun();
void CrossbowHitSwitchType78(ITEM_INFO* item1, ITEM_INFO* item2, signed int search);
void ready_shotgun(int weaponType);
void Inject_Lara1Gun();

View file

@ -3,10 +3,14 @@
#include "larafire.h"
#include "lara.h"
#include "effect2.h"
#include "draw.h"
#include "tomb4fx.h"
#include "..\Specific\roomload.h"
#include "..\Specific\level.h"
#include "..\Specific\setup.h"
#include "camera.h"
#include "../Specific/input.h"
#include "sound.h"
#include "savegame.h"
PISTOL_DEF PistolsTable[4] =
{
@ -51,7 +55,7 @@ void AnimatePistols(int weaponType)
break;
}
GetLaraJointPosition(&pos, LJ_LHAND);
GetLaraJointPosition(&pos, LM_LHAND);
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, (byte)0, SmokeWeapon, SmokeCountL);
}
@ -78,7 +82,7 @@ void AnimatePistols(int weaponType)
break;
}
GetLaraJointPosition(&pos, LJ_RHAND);
GetLaraJointPosition(&pos, LM_RHAND);
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, (byte)0, SmokeWeapon, SmokeCountR);
}
}
@ -290,7 +294,7 @@ void PistolHandler(int weaponType)
pos.y = (GetRandomControl() & 0x7F) - 63;
pos.z = (byte)GetRandomControl() - 128;
GetLaraJointPosition(&pos, Lara.leftArm.flash_gun != 0 ? LJ_LHAND : LJ_RHAND);
GetLaraJointPosition(&pos, Lara.leftArm.flash_gun != 0 ? LM_LHAND : LM_RHAND);
/*if (gfLevelFlags & 0x2000 && LaraItem->roomNumber == gfMirrorRoom)
{
v8 = GetRandomControl() & 0x3F;

View file

@ -6,6 +6,8 @@
#include "sphere.h"
#include "laramisc.h"
#include "camera.h"
#include "..\Specific\level.h"
#include "../Specific/input.h"
short LeftIntRightExtTab[4] = // offset 0xA0B7C
{

View file

@ -14,9 +14,12 @@
#include "draw.h"
#include "effect2.h"
#include "flmtorch.h"
#include "..\Specific\roomload.h"
#include "..\Specific\level.h"
#include "lot.h"
#include "../Specific/setup.h"
#include "../Specific/input.h"
#include "sound.h"
#include "savegame.h"
WEAPON_INFO Weapons[NUM_WEAPONS] =
{
@ -239,7 +242,6 @@ short HoldStates[] = {
};
extern GameFlow* g_GameFlow;
extern LaraExtraInfo g_LaraExtra;
bool MonksAttackLara;
ITEM_INFO* LastTargets[8];
ITEM_INFO* TargetList[8];
@ -356,10 +358,10 @@ void LaraGun() // (F) (D)
Lara.gunStatus = LG_UNDRAW_GUNS;
}
}
else if (g_LaraExtra.NumFlares)
else if (Lara.NumFlares)
{
if (g_LaraExtra.NumFlares != -1)
g_LaraExtra.NumFlares--;
if (Lara.NumFlares != -1)
Lara.NumFlares--;
Lara.requestGunType = WEAPON_FLARE;
}
}
@ -383,7 +385,7 @@ void LaraGun() // (F) (D)
}
else if (Lara.requestGunType == WEAPON_FLARE
#if 0
|| g_LaraExtra.Vehicle == NO_ITEM
|| Lara.Vehicle == NO_ITEM
&& (Lara.requestGunType == WEAPON_HARPOON_GUN
#endif
|| Lara.waterStatus == LW_ABOVE_WATER
@ -550,7 +552,7 @@ void LaraGun() // (F) (D)
#if 1
if (CheckForHoldingState(LaraItem->currentAnimState))
#else
if (g_LaraExtra.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState))
if (Lara.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState))
#endif
{
if (Lara.flareControlLeft)
@ -583,7 +585,7 @@ void LaraGun() // (F) (D)
if (CHECK_LARA_MESHES(ID_LARA_FLARE_ANIM, LM_LHAND))
{
#if 0
Lara.flareControlLeft = (g_LaraExtra.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState));
Lara.flareControlLeft = (Lara.Vehicle != NO_ITEM || CheckForHoldingState(LaraItem->currentAnimState));
#else
Lara.flareControlLeft = CheckForHoldingState(LaraItem->currentAnimState);
#endif
@ -597,7 +599,7 @@ void LaraGun() // (F) (D)
short* GetAmmo(int weaponType)
{
return &g_LaraExtra.Weapons[weaponType].Ammo[g_LaraExtra.Weapons[weaponType].SelectedAmmo];
return &Lara.Weapons[weaponType].Ammo[Lara.Weapons[weaponType].SelectedAmmo];
}
void InitialiseNewWeapon()
@ -657,7 +659,7 @@ int WeaponObjectMesh(int weaponType)
switch (weaponType)
{
case WEAPON_REVOLVER:
return (g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight == true ? ID_LARA_REVOLVER_LASER : ID_REVOLVER_ANIM);
return (Lara.Weapons[WEAPON_REVOLVER].HasLasersight == true ? ID_LARA_REVOLVER_LASER : ID_REVOLVER_ANIM);
case WEAPON_UZI:
return ID_UZI_ANIM;
@ -669,7 +671,7 @@ int WeaponObjectMesh(int weaponType)
return ID_HK_ANIM;
case WEAPON_CROSSBOW:
return (g_LaraExtra.Weapons[WEAPON_CROSSBOW].HasLasersight == true ? ID_LARA_CROSSBOW_LASER : ID_CROSSBOW_ANIM);
return (Lara.Weapons[WEAPON_CROSSBOW].HasLasersight == true ? ID_LARA_CROSSBOW_LASER : ID_CROSSBOW_ANIM);
case WEAPON_GRENADE_LAUNCHER:
return ID_GRENADE_ANIM;
@ -689,7 +691,7 @@ int WeaponObjectMesh(int weaponType)
void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag)
{
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
OBJECT_INFO* obj = &Objects[item->objectNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
item->hitStatus = true;
if (creature && item != LaraItem)
@ -745,7 +747,7 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
pos.xPos = 0;
pos.yPos = 0;
pos.zPos = 0;
GetLaraJointPosition((PHD_VECTOR*)&pos, LJ_RHAND);
GetLaraJointPosition((PHD_VECTOR*)&pos, LM_RHAND);
pos.xPos = src->pos.xPos;
pos.zPos = src->pos.zPos;
@ -754,22 +756,29 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
pos.yRot = angles[0] + (GetRandomControl() - 16384) * weapon->shotAccuracy / 65536;
pos.zRot = 0;
phd_GenerateW2V(&pos);
// Calculate ray from rotation angles
float x = sin(TO_RAD(pos.yRot)) * cos(TO_RAD(pos.xRot));
float y = -sin(TO_RAD(pos.xRot));
float z = cos(TO_RAD(pos.yRot)) * cos(TO_RAD(pos.xRot));
Vector3 direction = Vector3(x, y, z);
direction.Normalize();
Vector3 source = Vector3(pos.xPos, pos.yPos, pos.zPos);
Vector3 destination = source + direction * 1024.0f;
Ray ray = Ray(source, direction);
int num = GetSpheres(target, SphereList, 0);
int num = GetSpheres(target, CreatureSpheres, SPHERES_SPACE_WORLD, Matrix::Identity);
int best = -1;
int bestDistance = 0x7FFFFFFF;
float bestDistance = FLT_MAX;
for (int i = 0; i < num; i++)
{
SPHERE* sphere = &SphereList[i];
r = sphere->r;
if ((abs(sphere->x)) < r && (abs(sphere->y)) < r && sphere->z > r && SQUARE(sphere->x) + SQUARE(sphere->y) <= SQUARE(r))
BoundingSphere sphere = BoundingSphere(Vector3(CreatureSpheres[i].x, CreatureSpheres[i].y, CreatureSpheres[i].z), CreatureSpheres[i].r);
float distance;
if (ray.Intersects(sphere, distance))
{
if (sphere->z - r < bestDistance)
if (distance < bestDistance)
{
bestDistance = sphere->z - r;
bestDistance = distance;
best = i;
}
}
@ -790,9 +799,13 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
if (best < 0)
{
GAME_VECTOR vDest;
vDest.x = vSrc.x + (MatrixPtr[M20] * 5 >> 2);
/*vDest.x = vSrc.x + (MatrixPtr[M20] * 5 >> 2);
vDest.y = vSrc.y + (MatrixPtr[M21] * 5 >> 2);
vDest.z = vSrc.z + (MatrixPtr[M22] * 5 >> 2);
vDest.z = vSrc.z + (MatrixPtr[M22] * 5 >> 2);*/
vDest.x = destination.x;
vDest.y = destination.y;
vDest.z = destination.z;
GetTargetOnLOS(&vSrc, &vDest, 0, 1);
@ -803,9 +816,12 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
Savegame.Game.AmmoHits++;
GAME_VECTOR vDest;
vDest.x = vSrc.x + ((MatrixPtr[M20] * bestDistance) >> W2V_SHIFT);
vDest.y = vSrc.y + ((MatrixPtr[M21] * bestDistance) >> W2V_SHIFT);
vDest.z = vSrc.z + ((MatrixPtr[M22] * bestDistance) >> W2V_SHIFT);
destination = source + direction * bestDistance;
vDest.x = destination.x;
vDest.y = destination.y;
vDest.z = destination.z;
// TODO: enable it when the slot is created !
/*
@ -831,7 +847,7 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
{
z = target->pos.zPos - lara_item->pos.zPos;
x = target->pos.xPos - lara_item->pos.xPos;
angle = 0x8000 + ATAN(z, x) - target->pos.yRot;
angle = 0x8000 + phd_atan(z, x) - target->pos.yRot;
if ((target->currentAnimState > 1 && target->currentAnimState < 5) && angle < 0x4000 && angle > -0x4000)
{
@ -861,8 +877,8 @@ void find_target_point(ITEM_INFO* item, GAME_VECTOR* target) // (F) (D)
int y = bounds->MinY + (bounds->MaxY - bounds->MinY) / 3;
int z = (bounds->MinZ + bounds->MaxZ) / 2;
int c = COS(item->pos.yRot);
int s = SIN(item->pos.yRot);
int c = phd_cos(item->pos.yRot);
int s = phd_sin(item->pos.yRot);
target->x = item->pos.xPos + ((c * x + s * z) >> W2V_SHIFT);
target->y = item->pos.yPos + y;
@ -887,7 +903,7 @@ void LaraTargetInfo(WEAPON_INFO* weapon) // (F) (D)
pos.x = 0;
pos.y = 0;
pos.z = 0;
GetLaraJointPosition((PHD_VECTOR*)&pos, LJ_RHAND);
GetLaraJointPosition((PHD_VECTOR*)&pos, LM_RHAND);
pos.x = LaraItem->pos.xPos;
pos.z = LaraItem->pos.zPos;
@ -948,7 +964,7 @@ int CheckForHoldingState(int state) // (F) (D)
short* holdState = HoldStates;
#if 0
if (g_LaraExtra.ExtraAnim)
if (Lara.ExtraAnim)
return 0;
#endif
@ -1083,13 +1099,500 @@ void LaraGetNewTarget(WEAPON_INFO* winfo) // (F) (D)
LaraTargetInfo(winfo);
}
void Inject_LaraFire()
void DoProperDetection(short itemNumber, int x, int y, int z, int xv, int yv, int zv)
{
INJECT(0x00453490, AimWeapon);
INJECT(0x00453AE0, WeaponObject);
INJECT(0x00452430, LaraGun);
INJECT(0x004546C0, GetAmmo);
INJECT(0x00452B30, InitialiseNewWeapon);
INJECT(0x00453B50, WeaponObjectMesh);
//INJECT(0x00453A90, SmashItem);
int ceiling, height, oldtype, oldonobj, oldheight;
int bs, yang;
ITEM_INFO* item = &Items[itemNumber];
short roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(x, y, z, &roomNumber);
oldheight = GetFloorHeight(floor, x, y, z);
oldonobj = OnObject;
oldtype = HeightType;
roomNumber = item->roomNumber;
floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
height = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (item->pos.yPos >= height)
{
bs = 0;
if ((HeightType == BIG_SLOPE || HeightType == DIAGONAL) && oldheight < height)
{
yang = (long)((unsigned short)item->pos.yRot);
if (TiltYOffset < 0)
{
if (yang >= 0x8000)
bs = 1;
}
else if (TiltYOffset > 0)
{
if (yang <= 0x8000)
bs = 1;
}
if (TiltXOffset < 0)
{
if (yang >= 0x4000 && yang <= 0xc000)
bs = 1;
}
else if (TiltXOffset > 0)
{
if (yang <= 0x4000 || yang >= 0xc000)
bs = 1;
}
}
/* If last position of item was also below this floor height, we've hit a wall, else we've hit a floor */
if (y > (height + 32) && bs == 0 &&
(((x >> WALL_SHIFT) != (item->pos.xPos >> WALL_SHIFT)) ||
((z >> WALL_SHIFT) != (item->pos.zPos >> WALL_SHIFT))))
{
// Need to know which direction the wall is.
long xs;
if ((x & (~(WALL_SIZE - 1))) != (item->pos.xPos & (~(WALL_SIZE - 1))) && // X crossed boundary?
(z & (~(WALL_SIZE - 1))) != (item->pos.zPos & (~(WALL_SIZE - 1)))) // Z crossed boundary as well?
{
if (abs(x - item->pos.xPos) < abs(z - item->pos.zPos))
xs = 1; // X has travelled the shortest, so (maybe) hit first. (Seems to work ok).
else
xs = 0;
}
else
xs = 1;
if ((x & (~(WALL_SIZE - 1))) != (item->pos.xPos & (~(WALL_SIZE - 1))) && xs) // X crossed boundary?
{
if (xv <= 0) // Hit angle = 0xc000.
item->pos.yRot = 0x4000 + (0xc000 - item->pos.yRot);
else // Hit angle = 0x4000.
item->pos.yRot = 0xc000 + (0x4000 - item->pos.yRot);
}
else // Z crossed boundary.
item->pos.yRot = 0x8000 - item->pos.yRot;
item->speed >>= 1;
/* Put item back in its last position */
item->pos.xPos = x;
item->pos.yPos = y;
item->pos.zPos = z;
}
else if (HeightType == BIG_SLOPE || HeightType == DIAGONAL) // Hit a steep slope?
{
// Need to know which direction the slope is.
item->speed -= item->speed >> 2;
if (TiltYOffset < 0 && ((abs(TiltYOffset)) - (abs(TiltXOffset)) >= 2)) // Hit angle = 0x4000
{
if (((unsigned short)item->pos.yRot) > 0x8000)
{
item->pos.yRot = 0x4000 + (0xc000 - (unsigned short)item->pos.yRot - 1);
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
}
else
{
if (item->speed < 32)
{
item->speed -= TiltYOffset << 1;
if ((unsigned short)item->pos.yRot > 0x4000 && (unsigned short)item->pos.yRot < 0xc000)
{
item->pos.yRot -= 4096;
if ((unsigned short)item->pos.yRot < 0x4000)
item->pos.yRot = 0x4000;
}
else if ((unsigned short)item->pos.yRot < 0x4000)
{
item->pos.yRot += 4096;
if ((unsigned short)item->pos.yRot > 0x4000)
item->pos.yRot = 0x4000;
}
}
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
else
item->fallspeed = 0;
}
}
else if (TiltYOffset > 0 && ((abs(TiltYOffset)) - (abs(TiltXOffset)) >= 2)) // Hit angle = 0xc000
{
if (((unsigned short)item->pos.yRot) < 0x8000)
{
item->pos.yRot = 0xc000 + (0x4000 - (unsigned short)item->pos.yRot - 1);
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
}
else
{
if (item->speed < 32)
{
item->speed += TiltYOffset << 1;
if ((unsigned short)item->pos.yRot > 0xc000 || (unsigned short)item->pos.yRot < 0x4000)
{
item->pos.yRot -= 4096;
if ((unsigned short)item->pos.yRot < 0xc000)
item->pos.yRot = 0xc000;
}
else if ((unsigned short)item->pos.yRot < 0xc000)
{
item->pos.yRot += 4096;
if ((unsigned short)item->pos.yRot > 0xc000)
item->pos.yRot = 0xc000;
}
}
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
else
item->fallspeed = 0;
}
}
else if (TiltXOffset < 0 && ((abs(TiltXOffset)) - (abs(TiltYOffset)) >= 2)) // Hit angle = 0
{
if (((unsigned short)item->pos.yRot) > 0x4000 && ((unsigned short)item->pos.yRot) < 0xc000)
{
item->pos.yRot = (0x8000 - item->pos.yRot - 1);
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
}
else
{
if (item->speed < 32)
{
item->speed -= TiltXOffset << 1;
if ((unsigned short)item->pos.yRot < 0x8000)
{
item->pos.yRot -= 4096;
if ((unsigned short)item->pos.yRot > 0xf000)
item->pos.yRot = 0;
}
else if ((unsigned short)item->pos.yRot >= 0x8000)
{
item->pos.yRot += 4096;
if ((unsigned short)item->pos.yRot < 0x1000)
item->pos.yRot = 0;
}
}
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
else
item->fallspeed = 0;
}
}
else if (TiltXOffset > 0 && ((abs(TiltXOffset)) - (abs(TiltYOffset)) >= 2)) // Hit angle = 0x8000
{
if (((unsigned short)item->pos.yRot) > 0xc000 || ((unsigned short)item->pos.yRot) < 0x4000)
{
item->pos.yRot = (0x8000 - item->pos.yRot - 1);
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
}
else
{
if (item->speed < 32)
{
item->speed += TiltXOffset << 1;
if ((unsigned short)item->pos.yRot > 0x8000)
{
item->pos.yRot -= 4096;
if ((unsigned short)item->pos.yRot < 0x8000)
item->pos.yRot = 0x8000;
}
else if ((unsigned short)item->pos.yRot < 0x8000)
{
item->pos.yRot += 4096;
if ((unsigned short)item->pos.yRot > 0x8000)
item->pos.yRot = 0x8000;
}
}
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
else
item->fallspeed = 0;
}
}
else if (TiltYOffset < 0 && TiltXOffset < 0) // Hit angle = 0x2000
{
if (((unsigned short)item->pos.yRot) > 0x6000 && ((unsigned short)item->pos.yRot) < 0xe000)
{
item->pos.yRot = 0x2000 + (0xa000 - (unsigned short)item->pos.yRot - 1);
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
}
else
{
if (item->speed < 32)
{
item->speed += (-TiltYOffset) + (-TiltXOffset);
if ((unsigned short)item->pos.yRot > 0x2000 && (unsigned short)item->pos.yRot < 0xa000)
{
item->pos.yRot -= 4096;
if ((unsigned short)item->pos.yRot < 0x2000)
item->pos.yRot = 0x2000;
}
else if ((unsigned short)item->pos.yRot != 0x2000)
{
item->pos.yRot += 4096;
if ((unsigned short)item->pos.yRot > 0x2000)
item->pos.yRot = 0x2000;
}
}
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
else
item->fallspeed = 0;
}
}
else if (TiltYOffset < 0 && TiltXOffset > 0) // Hit angle = 0x6000
{
if (((unsigned short)item->pos.yRot) > 0xa000 || ((unsigned short)item->pos.yRot) < 0x2000)
{
item->pos.yRot = 0x6000 + (0xe000 - (unsigned short)item->pos.yRot - 1);
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
}
else
{
if (item->speed < 32)
{
item->speed += (-TiltYOffset) + TiltXOffset;
if ((unsigned short)item->pos.yRot < 0xe000 && (unsigned short)item->pos.yRot > 0x6000)
{
item->pos.yRot -= 4096;
if ((unsigned short)item->pos.yRot < 0x6000)
item->pos.yRot = 0x6000;
}
else if ((unsigned short)item->pos.yRot != 0x6000)
{
item->pos.yRot += 4096;
if ((unsigned short)item->pos.yRot > 0x6000)
item->pos.yRot = 0x6000;
}
}
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
else
item->fallspeed = 0;
}
}
else if (TiltYOffset > 0 && TiltXOffset > 0) // Hit angle = 0xa000
{
if (((unsigned short)item->pos.yRot) > 0xe000 || ((unsigned short)item->pos.yRot) < 0x6000)
{
item->pos.yRot = 0xa000 + (0x2000 - (unsigned short)item->pos.yRot - 1);
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
}
else
{
if (item->speed < 32)
{
item->speed += TiltYOffset + TiltXOffset;
if ((unsigned short)item->pos.yRot < 0x2000 || (unsigned short)item->pos.yRot > 0xa000)
{
item->pos.yRot -= 4096;
if ((unsigned short)item->pos.yRot < 0xa000)
item->pos.yRot = 0xa000;
}
else if ((unsigned short)item->pos.yRot != 0xa000)
{
item->pos.yRot += 4096;
if ((unsigned short)item->pos.yRot > 0xa000)
item->pos.yRot = 0xa000;
}
}
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
else
item->fallspeed = 0;
}
}
else if (TiltYOffset > 0 && TiltXOffset < 0) // Hit angle = 0xe000
{
if (((unsigned short)item->pos.yRot) > 0x2000 && ((unsigned short)item->pos.yRot) < 0xa000)
{
item->pos.yRot = 0xe000 + (0x6000 - (unsigned short)item->pos.yRot - 1);
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
}
else
{
if (item->speed < 32)
{
item->speed += TiltYOffset + (-TiltXOffset);
if ((unsigned short)item->pos.yRot < 0x6000 || (unsigned short)item->pos.yRot > 0xe000)
{
item->pos.yRot -= 4096;
if ((unsigned short)item->pos.yRot < 0xe000)
item->pos.yRot = 0xe000;
}
else if ((unsigned short)item->pos.yRot != 0xe000)
{
item->pos.yRot += 4096;
if ((unsigned short)item->pos.yRot > 0xe000)
item->pos.yRot = 0xe000;
}
}
if (item->fallspeed > 0)
item->fallspeed = -(item->fallspeed >> 1);
else
item->fallspeed = 0;
}
}
/* Put item back in its last position */
item->pos.xPos = x;
item->pos.yPos = y;
item->pos.zPos = z;
}
else
{
/* Hit the floor; bounce and slow down */
if (item->fallspeed > 0)
{
if (item->fallspeed > 16)
{
if (item->objectNumber == ID_GRENADE)
item->fallspeed = -(item->fallspeed - (item->fallspeed >> 1));
else
{
item->fallspeed = -(item->fallspeed >> 2);
if (item->fallspeed < -100)
item->fallspeed = -100;
}
}
else
{
/* Roll on floor */
item->fallspeed = 0;
if (item->objectNumber == ID_GRENADE)
{
item->requiredAnimState = 1;
item->pos.xRot = 0;
item->speed--;
}
else
item->speed -= 3;
if (item->speed < 0)
item->speed = 0;
}
}
item->pos.yPos = height;
}
}
else // Check for on top of object.
{
if (yv >= 0)
{
roomNumber = item->roomNumber;
floor = GetFloor(item->pos.xPos, y, item->pos.zPos, &roomNumber);
oldheight = GetFloorHeight(floor, item->pos.xPos, y, item->pos.zPos);
oldonobj = OnObject;
roomNumber = item->roomNumber;
floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
/* Bounce off floor */
if (item->pos.yPos >= oldheight && oldonobj) // If old and new pos above object then detect.
{
/* Hit the floor; bounce and slow down */
if (item->fallspeed > 0)
{
if (item->fallspeed > 16)
{
if (item->objectNumber == ID_GRENADE)
item->fallspeed = -(item->fallspeed - (item->fallspeed >> 1));
else
{
item->fallspeed = -(item->fallspeed >> 2);
if (item->fallspeed < -100)
item->fallspeed = -100;
}
}
else
{
/* Roll on floor */
item->fallspeed = 0;
if (item->objectNumber == ID_GRENADE)
{
item->requiredAnimState = 1;
item->pos.xRot = 0;
item->speed--;
}
else
item->speed -= 3;
if (item->speed < 0)
item->speed = 0;
}
}
item->pos.yPos = oldheight;
}
}
// else
{
/* Bounce off ceiling */
roomNumber = item->roomNumber;
floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
ceiling = GetCeiling(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (item->pos.yPos < ceiling)
{
if (y < ceiling &&
(((x >> WALL_SHIFT) != (item->pos.xPos >> WALL_SHIFT)) ||
((z >> WALL_SHIFT) != (item->pos.zPos >> WALL_SHIFT))))
{
// Need to know which direction the wall is.
if ((x & (~(WALL_SIZE - 1))) != (item->pos.xPos & (~(WALL_SIZE - 1)))) // X crossed boundary?
{
if (xv <= 0) // Hit angle = 0xc000.
item->pos.yRot = 0x4000 + (0xc000 - item->pos.yRot);
else // Hit angle = 0x4000.
item->pos.yRot = 0xc000 + (0x4000 - item->pos.yRot);
}
else // Z crossed boundary.
{
item->pos.yRot = 0x8000 - item->pos.yRot;
}
if (item->objectNumber == ID_GRENADE)
item->speed -= item->speed >> 3;
else
item->speed >>= 1;
/* Put item back in its last position */
item->pos.xPos = x;
item->pos.yPos = y;
item->pos.zPos = z;
}
else
item->pos.yPos = ceiling;
if (item->fallspeed < 0)
item->fallspeed = -item->fallspeed;
}
}
}
roomNumber = item->roomNumber;
floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
if (roomNumber != item->roomNumber)
ItemNewRoom(itemNumber, roomNumber);
}

View file

@ -2,8 +2,6 @@
#include "..\Global\global.h"
#define DoProperDetection ((void (__cdecl*)(short, int, int, int, int, int, int)) 0x00453BE0)
extern WEAPON_INFO Weapons[NUM_WEAPONS];
void SmashItem(short itemNum);
@ -19,5 +17,4 @@ void find_target_point(ITEM_INFO* item, GAME_VECTOR* target);
void LaraTargetInfo(WEAPON_INFO* weapon);
int CheckForHoldingState(int state);
void LaraGetNewTarget(WEAPON_INFO* winfo);
void Inject_LaraFire();
void DoProperDetection(short itemNumber, int x, int y, int z, int xv, int yv, int zv);

View file

@ -1,8 +1,9 @@
#include "laraflar.h"
#include "..\Global\global.h"
#include "..\Specific\roomload.h"
#include "..\Specific\level.h"
#include "..\Specific\setup.h"
#include "sound.h"
#include "draw.h"
#include "items.h"
@ -12,19 +13,15 @@
#include "collide.h"
#include "effect2.h"
extern LaraExtraInfo g_LaraExtra;
void FlareControl(short itemNumber) // (AF) (D)
{
ITEM_INFO* item = &Items[itemNumber];
#if 0
if (Rooms[item->roomNumber].flags & ENV_FLAG_SWAMP)
{
KillItem(itemNumber);
return;
}
#endif
if (item->fallspeed)
{
@ -41,8 +38,8 @@ void FlareControl(short itemNumber) // (AF) (D)
int oldY = item->pos.yPos;
int oldZ = item->pos.zPos;
int xv = item->speed * SIN(item->pos.yRot) >> W2V_SHIFT;
int zv = item->speed * COS(item->pos.yRot) >> W2V_SHIFT;
int xv = item->speed * phd_sin(item->pos.yRot) >> W2V_SHIFT;
int zv = item->speed * phd_cos(item->pos.yRot) >> W2V_SHIFT;
item->pos.xPos += xv;
item->pos.zPos += zv;
@ -117,7 +114,7 @@ void undraw_flare() // (F) (D)
#if 0
if (LaraItem->goalAnimState == STATE_LARA_STOP &&
g_LaraExtra.Vehicle == NO_ITEM)
Lara.Vehicle == NO_ITEM)
#else
if (LaraItem->goalAnimState == STATE_LARA_STOP)
#endif
@ -314,7 +311,7 @@ void CreateFlare(short objectNum, int thrown) // (F) (D)
pos.y = 32;
pos.z = 42;
GetLaraJointPosition(&pos, LJ_LHAND);
GetLaraJointPosition(&pos, LM_LHAND);
item->pos.xPos = pos.x;
item->pos.yPos = pos.y;
@ -327,8 +324,8 @@ void CreateFlare(short objectNum, int thrown) // (F) (D)
{
flag = true;
item->pos.yRot = LaraItem->pos.yRot + ANGLE(180);
item->pos.xPos = LaraItem->pos.xPos + (320 * SIN(item->pos.yRot) >> W2V_SHIFT);
item->pos.zPos = LaraItem->pos.zPos + (320 * COS(item->pos.yRot) >> W2V_SHIFT);
item->pos.xPos = LaraItem->pos.xPos + (320 * phd_sin(item->pos.yRot) >> W2V_SHIFT);
item->pos.zPos = LaraItem->pos.zPos + (320 * phd_cos(item->pos.yRot) >> W2V_SHIFT);
item->roomNumber = LaraItem->roomNumber;
}
else
@ -385,7 +382,7 @@ void DoFlareInHand(int flare_age) // (AF) (D)
pos.y = 32;
pos.z = 41;
GetLaraJointPosition(&pos, LJ_LHAND);
GetLaraJointPosition(&pos, LM_LHAND);
DoFlareLight(&pos, flare_age);
/* Hardcoded code */
@ -475,8 +472,3 @@ int DoFlareLight(PHD_VECTOR* pos, int age)//49708, 49B6C (F)
return 0;
}
}
void Inject_LaraFlar()
{
}

View file

@ -12,5 +12,3 @@ void CreateFlare(short object, int thrown);
void DrawFlareInAir(ITEM_INFO* item);
void DoFlareInHand(int flare_age);
int DoFlareLight(PHD_VECTOR* pos, int flare_age);
void Inject_LaraFlar();

View file

@ -1,6 +1,6 @@
#include "laramisc.h"
#include "..\Global\global.h"
#include "..\Specific\roomload.h"
#include "..\Specific\level.h"
#include "../Specific/setup.h"
#include "..\Scripting\GameFlowScript.h"
#include "effects.h"
@ -12,11 +12,15 @@
#include "healt.h"
#include "misc.h"
#include "rope.h"
#include "rope.h"
#include "draw.h"
#include "savegame.h"
#include "inventory.h"
#include "camera.h"
#include "../Specific/input.h"
#include "sound.h"
extern LaraExtraInfo g_LaraExtra;
extern GameFlow* g_GameFlow;
extern void(*effect_routines[59])(ITEM_INFO* item);
extern short FXType;
@ -31,11 +35,7 @@ void GetLaraDeadlyBounds() // (F) (D)
short tbounds[6];
bounds = GetBoundsAccurate(LaraItem);
phd_PushUnitMatrix();
phd_RotYXZ(LaraItem->pos.yRot, LaraItem->pos.xRot, LaraItem->pos.zRot);
phd_SetTrans(0, 0, 0);
phd_RotBoundingBoxNoPersp(bounds, tbounds);
phd_PopMatrix();
phd_RotBoundingBoxNoPersp(&LaraItem->pos, bounds, tbounds);
DeadlyBounds[0] = LaraItem->pos.xPos + tbounds[0];
DeadlyBounds[1] = LaraItem->pos.xPos + tbounds[1];
@ -77,27 +77,27 @@ void DelsGiveLaraItemsCheat() // (AF) (D)
int i;
if (Objects[ID_CROWBAR_ITEM].loaded)
g_LaraExtra.Crowbar = true;
Lara.Crowbar = true;
for (i = 0; i < 8; ++i)
{
if (Objects[ID_PUZZLE_ITEM1 + i].loaded)
g_LaraExtra.Puzzles[i] = 1;
g_LaraExtra.PuzzlesCombo[2 * i] = false;
g_LaraExtra.PuzzlesCombo[2 * i + 1] = false;
Lara.Puzzles[i] = 1;
Lara.PuzzlesCombo[2 * i] = false;
Lara.PuzzlesCombo[2 * i + 1] = false;
}
for (i = 0; i < 8; ++i)
{
if (Objects[ID_KEY_ITEM1 + i].loaded)
g_LaraExtra.Keys[i] = 1;
g_LaraExtra.KeysCombo[2 * i] = false;
g_LaraExtra.KeysCombo[2 * i + 1] = false;
Lara.Keys[i] = 1;
Lara.KeysCombo[2 * i] = false;
Lara.KeysCombo[2 * i + 1] = false;
}
for (i = 0; i < 3; ++i)
{
if (Objects[ID_PICKUP_ITEM1 + i].loaded)
g_LaraExtra.Pickups[i] = 1;
g_LaraExtra.PickupsCombo[2 * i] = false;
g_LaraExtra.PickupsCombo[2 * i + 1] = false;
Lara.Pickups[i] = 1;
Lara.PickupsCombo[2 * i] = false;
Lara.PickupsCombo[2 * i + 1] = false;
}
g_Inventory->LoadObjects(false);
@ -107,27 +107,27 @@ void DelsGiveLaraItemsCheat() // (AF) (D)
void LaraCheatGetStuff() // (F) (D)
{
g_LaraExtra.NumFlares = -1;
g_LaraExtra.NumSmallMedipacks = -1;
g_LaraExtra.NumLargeMedipacks = -1;
Lara.NumFlares = -1;
Lara.NumSmallMedipacks = -1;
Lara.NumLargeMedipacks = -1;
if (Objects[ID_CROWBAR_ITEM].loaded)
g_LaraExtra.Crowbar = true;
g_LaraExtra.Lasersight = true;
g_LaraExtra.Weapons[WEAPON_REVOLVER].Present = true;
g_LaraExtra.Weapons[WEAPON_REVOLVER].SelectedAmmo = WEAPON_AMMO1;
g_LaraExtra.Weapons[WEAPON_REVOLVER].HasLasersight = false;
g_LaraExtra.Weapons[WEAPON_REVOLVER].HasSilencer = false;
g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] = -1;
g_LaraExtra.Weapons[WEAPON_UZI].Present = true;
g_LaraExtra.Weapons[WEAPON_UZI].SelectedAmmo = WEAPON_AMMO1;
g_LaraExtra.Weapons[WEAPON_UZI].HasLasersight = false;
g_LaraExtra.Weapons[WEAPON_UZI].HasSilencer = false;
g_LaraExtra.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] = -1;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present = true;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].SelectedAmmo = WEAPON_AMMO1;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].HasLasersight = false;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].HasSilencer = false;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] = -1;
Lara.Crowbar = true;
Lara.Lasersight = true;
Lara.Weapons[WEAPON_REVOLVER].Present = true;
Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = WEAPON_AMMO1;
Lara.Weapons[WEAPON_REVOLVER].HasLasersight = false;
Lara.Weapons[WEAPON_REVOLVER].HasSilencer = false;
Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1] = -1;
Lara.Weapons[WEAPON_UZI].Present = true;
Lara.Weapons[WEAPON_UZI].SelectedAmmo = WEAPON_AMMO1;
Lara.Weapons[WEAPON_UZI].HasLasersight = false;
Lara.Weapons[WEAPON_UZI].HasSilencer = false;
Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1] = -1;
Lara.Weapons[WEAPON_SHOTGUN].Present = true;
Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = WEAPON_AMMO1;
Lara.Weapons[WEAPON_SHOTGUN].HasLasersight = false;
Lara.Weapons[WEAPON_SHOTGUN].HasSilencer = false;
Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1] = -1;
g_Inventory->LoadObjects(false);
}
@ -230,14 +230,14 @@ void LaraControl(short itemNumber) // (AF) (D)
Lara.waterSurfaceDist = -hfw;
#if 0
if (g_LaraExtra.Vehicle == NO_ITEM)
if (Lara.Vehicle == NO_ITEM)
#endif
WadeSplash(item, wh, wd);
short roomNumber;
#if 0
if (g_LaraExtra.Vehicle == NO_ITEM && g_LaraExtra.ExtraAnim == 0)
if (Lara.Vehicle == NO_ITEM && Lara.ExtraAnim == 0)
{
#endif
switch (Lara.waterStatus)
@ -601,7 +601,7 @@ void LaraControl(short itemNumber) // (AF) (D)
{
#if 0
/* lara is not equipped with any vehicle */
if (g_LaraExtra.Vehicle == NO_ITEM) // only for the upv !!
if (Lara.Vehicle == NO_ITEM) // only for the upv !!
{
#endif
Lara.air += 10;
@ -651,7 +651,7 @@ void LaraControl(short itemNumber) // (AF) (D)
break;
}
Savegame.Game.Distance += SQRT_ASM(
Savegame.Game.Distance += sqrt(
SQUARE(item->pos.xPos - oldX) +
SQUARE(item->pos.yPos - oldY) +
SQUARE(item->pos.zPos - oldZ));
@ -693,9 +693,9 @@ void LaraInitialiseMeshes() // (AF) (D)
{
Lara.backGun = WEAPON_HK;
}
else if (!g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present)
else if (!Lara.Weapons[WEAPON_SHOTGUN].Present)
{
if (g_LaraExtra.Weapons[WEAPON_HK].Present)
if (Lara.Weapons[WEAPON_HK].Present)
Lara.backGun = WEAPON_HK;
}
else
@ -723,18 +723,15 @@ void InitialiseLara(int restore)
if (restore)
{
LARA_INFO backup;
memcpy(&backup, &Lara, sizeof(LARA_INFO));
ZeroMemory(&Lara, sizeof(LARA_INFO));
memcpy(&Lara.Legacy_pistolsTypeCarried, &backup.Legacy_pistolsTypeCarried, 59);
LaraInfo backup;
memcpy(&backup, &Lara, sizeof(LaraInfo));
ZeroMemory(&Lara, sizeof(LaraInfo));
}
else
{
ZeroMemory(&Lara, sizeof(LARA_INFO));
ZeroMemory(&g_LaraExtra, sizeof(LaraExtraInfo));
g_LaraExtra.ExtraAnim = 0;
g_LaraExtra.Vehicle = NO_ITEM;
ZeroMemory(&Lara, sizeof(LaraInfo));
Lara.ExtraAnim = 0;
Lara.Vehicle = NO_ITEM;
}
Lara.look = true;
@ -768,24 +765,24 @@ void InitialiseLara(int restore)
if (gun == WEAPON_PISTOLS)
{
g_LaraExtra.Weapons[WEAPON_PISTOLS].Present = true;
g_LaraExtra.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1] = -1;
Lara.Weapons[WEAPON_PISTOLS].Present = true;
Lara.Weapons[WEAPON_PISTOLS].Ammo[WEAPON_AMMO1] = -1;
}
else if (gun == WEAPON_HK)
{
g_LaraExtra.Weapons[WEAPON_HK].Present = true;
g_LaraExtra.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] = 100;
Lara.Weapons[WEAPON_HK].Present = true;
Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1] = 100;
}
g_LaraExtra.Binoculars = true;
Lara.Binoculars = true;
if (!restore)
{
if (Objects[ID_FLARE_INV_ITEM].loaded)
g_LaraExtra.NumFlares = 3;
Lara.NumFlares = 3;
g_LaraExtra.NumSmallMedipacks = 3;
g_LaraExtra.NumLargeMedipacks = 1;
Lara.NumSmallMedipacks = 3;
Lara.NumLargeMedipacks = 1;
}
InitialiseLaraAnims(LaraItem);
@ -967,12 +964,15 @@ void AnimateLara(ITEM_INFO* item)
if (!Lara.isMoving) // TokyoSU: i dont know why but it's wreid, in TR3 only the 2 first line there is used and worked fine !
{
item->pos.xPos += item->speed * SIN(Lara.moveAngle) >> W2V_SHIFT;
item->pos.zPos += item->speed * COS(Lara.moveAngle) >> W2V_SHIFT;
item->pos.xPos += item->speed * phd_sin(Lara.moveAngle) >> W2V_SHIFT;
item->pos.zPos += item->speed * phd_cos(Lara.moveAngle) >> W2V_SHIFT;
item->pos.xPos += lateral * SIN(Lara.moveAngle + ANGLE(90)) >> W2V_SHIFT;
item->pos.zPos += lateral * COS(Lara.moveAngle + ANGLE(90)) >> W2V_SHIFT;
item->pos.xPos += lateral * phd_sin(Lara.moveAngle + ANGLE(90)) >> W2V_SHIFT;
item->pos.zPos += lateral * phd_cos(Lara.moveAngle + ANGLE(90)) >> W2V_SHIFT;
}
// Update matrices
g_Renderer->UpdateLaraAnimations(true);
}
void DelAlignLaraToRope(ITEM_INFO* item) // (F) (D)
@ -1012,11 +1012,11 @@ void DelAlignLaraToRope(ITEM_INFO* item) // (F) (D)
diff2.x = diff.x;
diff2.y = diff.y;
diff2.z = diff.z;
ScaleVector(&vec3, COS(ropeY), &vec3);
ScaleVector(&vec3, phd_cos(ropeY), &vec3);
ScaleVector(&diff2, DotProduct(&diff2, &vec2), &diff2);
ScaleVector(&diff2, 4096 - COS(ropeY), &diff2);
ScaleVector(&diff2, 4096 - phd_cos(ropeY), &diff2);
CrossProduct(&diff, &vec2, &vec4);
ScaleVector(&vec4, SIN(ropeY), &vec4);
ScaleVector(&vec4, phd_sin(ropeY), &vec4);
diff2.x += vec3.x;
diff2.y += vec3.y;
diff2.z += vec3.z;
@ -1048,12 +1048,18 @@ void DelAlignLaraToRope(ITEM_INFO* item) // (F) (D)
item->pos.xPos = rope->position.x + (rope->meshSegment[Lara.ropeSegment].x >> 16);
item->pos.yPos = rope->position.y + (rope->meshSegment[Lara.ropeSegment].y >> 16) + Lara.ropeOffset;
item->pos.zPos = rope->position.z + (rope->meshSegment[Lara.ropeSegment].z >> 16);
phd_PushUnitMatrix();
phd_RotYXZ(angle[1], angle[0], angle[2]);
item->pos.xPos += -112 * MatrixPtr[M02] >> W2V_SHIFT;
item->pos.yPos += -112 * MatrixPtr[M12] >> W2V_SHIFT;
item->pos.zPos += -112 * MatrixPtr[M22] >> W2V_SHIFT;
phd_PopMatrix();
Matrix rotMatrix = Matrix::CreateFromYawPitchRoll(
TO_DEGREES(angle[1]),
TO_DEGREES(angle[0]),
TO_DEGREES(angle[2])
);
// PHD_MATH!
item->pos.xPos += -112 * rotMatrix.m[0][2]; // MatrixPtr[M02] >> W2V_SHIFT;
item->pos.yPos += -112 * rotMatrix.m[1][2]; // MatrixPtr[M12] >> W2V_SHIFT;
item->pos.zPos += -112 * rotMatrix.m[2][2]; // MatrixPtr[M22] >> W2V_SHIFT;
item->pos.xRot = angle[0];
item->pos.yRot = angle[1];
item->pos.zRot = angle[2];

View file

@ -10,6 +10,8 @@
#include "laraswim.h"
#include "larafire.h"
#include "laramisc.h"
#include "..\Specific\level.h"
#include "../Specific/input.h"
extern void(*lara_control_routines[NUM_LARA_STATES + 1])(ITEM_INFO* item, COLL_INFO* coll);
extern void(*lara_collision_routines[NUM_LARA_STATES + 1])(ITEM_INFO* item, COLL_INFO* coll);
@ -270,8 +272,8 @@ void LaraSurface(ITEM_INFO* item, COLL_INFO* coll)//4D684, 4DAE8 (F)
AnimateLara(item);
item->pos.xPos += item->fallspeed * SIN(Lara.moveAngle) >> (W2V_SHIFT + 2);
item->pos.zPos += item->fallspeed * COS(Lara.moveAngle) >> (W2V_SHIFT + 2);
item->pos.xPos += item->fallspeed * phd_sin(Lara.moveAngle) >> (W2V_SHIFT + 2);
item->pos.zPos += item->fallspeed * phd_cos(Lara.moveAngle) >> (W2V_SHIFT + 2);
LaraBaddieCollision(item, coll);

View file

@ -15,8 +15,11 @@
#include "laramisc.h"
#include "draw.h"
#include "camera.h"
#include "..\Specific\level.h"
#include "../Specific/input.h"
#include "sound.h"
extern LaraExtraInfo g_LaraExtra;
SUBSUIT_INFO Subsuit;
byte SubHitCount = 0;
@ -28,8 +31,8 @@ void LaraWaterCurrent(COLL_INFO* coll) // (F) (D)
OBJECT_VECTOR* sink = &Camera.fixed[Lara.currentActive - 1];
short angle = mGetAngle(sink->x, sink->z, LaraItem->pos.xPos, LaraItem->pos.zPos);
Lara.currentXvel += ((sink->data * (SIN(angle - ANGLE(90)) / 4) >> 2) - Lara.currentXvel) >> 4;
Lara.currentZvel += ((sink->data * (COS(angle - ANGLE(90)) / 4) >> 2) - Lara.currentZvel) >> 4;
Lara.currentXvel += ((sink->data * (phd_sin(angle - ANGLE(90)) / 4) >> 2) - Lara.currentXvel) >> 4;
Lara.currentZvel += ((sink->data * (phd_cos(angle - ANGLE(90)) / 4) >> 2) - Lara.currentZvel) >> 4;
LaraItem->pos.yPos += (sink->y - LaraItem->pos.yPos) >> 4;
}
@ -63,7 +66,7 @@ void LaraWaterCurrent(COLL_INFO* coll) // (F) (D)
LaraItem->pos.zPos += Lara.currentZvel >> 8;
Lara.currentActive = 0;
coll->facing = ATAN(LaraItem->pos.zPos - coll->old.z, LaraItem->pos.xPos - coll->old.x);
coll->facing = phd_atan(LaraItem->pos.zPos - coll->old.z, LaraItem->pos.xPos - coll->old.x);
GetCollisionInfo(coll, LaraItem->pos.xPos, LaraItem->pos.yPos + 200, LaraItem->pos.zPos, LaraItem->roomNumber, 400);
@ -507,9 +510,9 @@ void LaraUnderWater(ITEM_INFO* item, COLL_INFO* coll)//4BFB4, 4C418 (F)
AnimateLara(item);
item->pos.xPos += COS(item->pos.xRot) * (item->fallspeed * SIN(item->pos.yRot) >> (W2V_SHIFT + 2)) >> W2V_SHIFT;
item->pos.yPos -= item->fallspeed * SIN(item->pos.xRot) >> (W2V_SHIFT + 2);
item->pos.zPos += COS(item->pos.xRot) * (item->fallspeed * COS(item->pos.yRot) >> (W2V_SHIFT + 2)) >> W2V_SHIFT;
item->pos.xPos += phd_cos(item->pos.xRot) * (item->fallspeed * phd_sin(item->pos.yRot) >> (W2V_SHIFT + 2)) >> W2V_SHIFT;
item->pos.yPos -= item->fallspeed * phd_sin(item->pos.xRot) >> (W2V_SHIFT + 2);
item->pos.zPos += phd_cos(item->pos.xRot) * (item->fallspeed * phd_cos(item->pos.yRot) >> (W2V_SHIFT + 2)) >> W2V_SHIFT;
LaraBaddieCollision(item, coll);
@ -679,7 +682,7 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
coll->facing = item->pos.yRot;
}
short height = 762 * SIN(item->pos.xRot) >> W2V_SHIFT;
short height = 762 * phd_sin(item->pos.xRot) >> W2V_SHIFT;
height = abs(height);
if (height < ((LaraDrawType == LARA_DIVESUIT) << 6) + 200)
@ -820,7 +823,7 @@ void LaraSwimCollision(ITEM_INFO* item, COLL_INFO* coll)//4B608, 4BA6C
}
}
if (Lara.waterStatus != LW_FLYCHEAT && g_LaraExtra.ExtraAnim == 0)
if (Lara.waterStatus != LW_FLYCHEAT && Lara.ExtraAnim == 0)
LaraTestWaterDepth(item, coll);
}

View file

@ -4,6 +4,8 @@
#include <stdio.h>
#include "../Specific/setup.h"
#include "camera.h"
#include "lara.h"
#include "..\Specific\level.h"
#define DEFAULT_FLY_UPDOWN_SPEED 16
#define DEFAULT_SWIM_UPDOWN_SPEED 32
@ -13,16 +15,16 @@ CREATURE_INFO* BaddieSlots;
void InitialiseLOTarray(int allocMem)
{
DB_Log(0, "InitialiseLOTarray - DLL");
//DB_Log(0, "InitialiseLOTarray - DLL");
if (allocMem)
BaddieSlots = (CREATURE_INFO*)GameMalloc(sizeof(CREATURE_INFO) * NUM_SLOTS);
BaddieSlots = (CREATURE_INFO*)game_malloc(sizeof(CREATURE_INFO) * NUM_SLOTS);
CREATURE_INFO* creature = BaddieSlots;
for (int i = 0; i < NUM_SLOTS; i++, creature++)
{
creature->itemNum = NO_ITEM;
creature->LOT.node = (BOX_NODE*)GameMalloc(sizeof(BOX_NODE) * NumberBoxes);
creature->LOT.node = (BOX_NODE*)game_malloc(sizeof(BOX_NODE) * NumberBoxes);
}
SlotsUsed = 0;
@ -107,7 +109,7 @@ void DisableBaddieAI(short itemNumber)
void InitialiseSlot(short itemNum, short slot)
{
ITEM_INFO* item = &Items[itemNum];
OBJECT_INFO* obj = &Objects[item->objectNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
CREATURE_INFO* creature = &BaddieSlots[slot];
item->data = creature;
@ -310,12 +312,3 @@ void CreateZone(ITEM_INFO* item)
}
}
}
void Inject_Lot()
{
INJECT(0x0045B0C0, InitialiseLOTarray);
INJECT(0x0045B1A0, EnableBaddieAI);
INJECT(0x0045B150, DisableBaddieAI);
INJECT(0x0045B740, ClearLOT);
INJECT(0x0045B5E0, CreateZone);
}

View file

@ -11,5 +11,3 @@ void InitialiseSlot(short itemNum, short slot);
void DisableBaddieAI(short itemNumber);
void ClearLOT(LOT_INFO* LOT);
void CreateZone(ITEM_INFO* item);
void Inject_Lot();

View file

@ -1,5 +1,6 @@
#include "misc.h"
#include "../Specific/setup.h"
#include "..\Specific\level.h"
#define CHK_ANY(var, flag) (var & flag) != 0
#define CHK_NOP(var, flag) !(var & flag)

View file

@ -1,11 +1,6 @@
#pragma once
#include "../Global/global.h"
#define cutseq_givelara_pistols ((void(__cdecl*)()) 0x00422680)
#define cutseq_removelara_pistols ((void(__cdecl*)()) 0x004226B0)
#define cutseq_givelara_hk ((void(__cdecl*)()) 0x004226E0)
#define cutseq_removelara_hk ((void(__cdecl*)()) 0x00422700)
enum LARA_MESH_MASK
{
LARA_ONLY_LEGS = (0 << 1),

View file

@ -8,8 +8,9 @@
#include "..\Game\tomb4fx.h"
#include <stdio.h>
#include "debris.h"
#include "../Specific/roomload.h"
#include "../Specific/level.h"
#include "../Specific/setup.h"
#include "lara.h"
#define SHARD_DAMAGE 30
#define ROCKET_DAMAGE 100
@ -31,9 +32,9 @@ void ShootAtLara(FX_INFO *fx)
bounds = GetBoundsAccurate(LaraItem);
y += bounds[3] + (bounds[2] - bounds[3]) * 3 / 4;
distance = SQRT_ASM(SQUARE(x) + SQUARE(z));
fx->pos.xRot = -ATAN(distance, y);
fx->pos.yRot = ATAN(z, x);
distance = sqrt(SQUARE(x) + SQUARE(z));
fx->pos.xRot = -phd_atan(distance, y);
fx->pos.yRot = phd_atan(z, x);
/* Random scatter (only a little bit else it's too hard to avoid) */
fx->pos.xRot += (GetRandomControl() - 0x4000) / 0x40;
@ -53,10 +54,10 @@ void ControlMissile(short fxNumber)
if (fx->objectNumber == ID_SCUBA_HARPOON && !(Rooms[fx->roomNumber].flags & 1) && fx->pos.xRot > -0x3000)
fx->pos.xRot -= ONE_DEGREE;
fx->pos.yPos += (fx->speed * SIN(-fx->pos.xRot) >> W2V_SHIFT);
speed = fx->speed * COS(fx->pos.xRot) >> W2V_SHIFT;
fx->pos.zPos += (speed * COS(fx->pos.yRot) >> W2V_SHIFT);
fx->pos.xPos += (speed * SIN(fx->pos.yRot) >> W2V_SHIFT);
fx->pos.yPos += (fx->speed * phd_sin(-fx->pos.xRot) >> W2V_SHIFT);
speed = fx->speed * phd_cos(fx->pos.xRot) >> W2V_SHIFT;
fx->pos.zPos += (speed * phd_cos(fx->pos.yRot) >> W2V_SHIFT);
fx->pos.xPos += (speed * phd_sin(fx->pos.yRot) >> W2V_SHIFT);
roomNumber = fx->roomNumber;
floor = GetFloor(fx->pos.xPos, fx->pos.yPos, fx->pos.zPos, &roomNumber);
@ -132,7 +133,7 @@ void ControlMissile(short fxNumber)
void ControlNatlaGun(short fx_number)
{
FX_INFO* fx, *newfx;
OBJECT_INFO* object;
ObjectInfo* object;
FLOOR_INFO* floor;
short roomNumber;
int x, y, z;
@ -146,8 +147,8 @@ void ControlNatlaGun(short fx_number)
/* If first frame, then start another explosion at next position */
if (fx->frameNumber == -1)
{
z = fx->pos.zPos + (fx->speed * COS(fx->pos.yRot) >> W2V_SHIFT);
x = fx->pos.xPos + (fx->speed * SIN(fx->pos.yRot) >> W2V_SHIFT);
z = fx->pos.zPos + (fx->speed * phd_cos(fx->pos.yRot) >> W2V_SHIFT);
x = fx->pos.xPos + (fx->speed * phd_sin(fx->pos.yRot) >> W2V_SHIFT);
y = fx->pos.yPos;
roomNumber = fx->roomNumber;
floor = GetFloor(x, y, z, &roomNumber);

View file

@ -2,9 +2,6 @@
#include "..\Global\global.h"
//#define TorpedoControl ((void (__cdecl*)(short)) 0x0045C9F0)
#define ControlEnemyMissile ((void (__cdecl*)(short)) 0x00431E70)
void ShootAtLara(FX_INFO* fx);
void ControlMissile(short fxNumber);
void ControlNatlaGun(short fx_number);

View file

@ -12,7 +12,13 @@
#include "switch.h"
#include "box.h"
#include "../Specific/setup.h"
#include "tomb4fx.h"
#include "..\Specific\level.h"
#include "../Specific/input.h"
#include "sound.h"
OBJECT_TEXTURE* WaterfallTextures[6];
float WaterfallY[6];
int lastWaterfallY = 0;
short TightRopeBounds[12] =
{
@ -34,7 +40,7 @@ short PoleBounds[12] = // offset 0xA1250
0xF8E4, 0x071C
};
extern LaraExtraInfo g_LaraExtra;
void InitialiseSmashObject(short itemNumber)
{
@ -64,7 +70,7 @@ void SmashObject(short itemNumber)
item->collidable = 0;
item->meshBits = 0xFFFE;
ExplodingDeath(itemNumber, -1, 257); //ExplodingDeath2
ExplodingDeath(itemNumber, -1, 257);
item->flags |= IFLAG_INVISIBLE;
@ -443,8 +449,8 @@ void ParallelBarsCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll)
pos2.y = -128;
pos2.z = 512;
GetLaraJointPosition(&pos1, LJ_LHAND);
GetLaraJointPosition(&pos2, LJ_RHAND);
GetLaraJointPosition(&pos1, LM_LHAND);
GetLaraJointPosition(&pos2, LM_RHAND);
if (l->pos.yRot & 0x4000)
l->pos.xPos += item->pos.xPos - ((pos1.x + pos2.x) >> 1);
@ -489,7 +495,7 @@ void ControlXRayMachine(short itemNumber)
if (Lara.skelebob)
{
if (g_LaraExtra.Weapons[WEAPON_HK].Present)
if (Lara.Weapons[WEAPON_HK].Present)
{
TestTriggersAtXYZ(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 1, 0);
item->itemFlags[0] = 666;
@ -600,7 +606,7 @@ void CutsceneRopeControl(short itemNumber)
dy = (pos2.y - pos1.y) * (pos2.y - pos1.y);
dz = (pos2.z - pos1.z) * (pos2.z - pos1.z);
item->itemFlags[1] = ((SQRT_ASM(dx + dy + dz) << 1) + SQRT_ASM(dx + dy + dz)) << 1;
item->itemFlags[1] = ((sqrt(dx + dy + dz) * 2) + sqrt(dx + dy + dz)) * 2;
item->pos.xRot = -4869;
}
@ -645,26 +651,90 @@ void InitialiseTightRope(short itemNumber)
}
}
void Inject_Objects()
void InitialiseAnimating(short itemNumber)
{
INJECT(0x00465FE0, TightRopeCollision);
INJECT(0x00465200, SmashObject);
/*INJECT(0x00465200, SmashObject);
INJECT(0x00465330, SmashObjectControl);
INJECT(0x00465350, BridgeFlatFloor);
INJECT(0x00465390, BridgeFlatCeiling);
INJECT(0x00465410, BridgeTilt1Floor);
INJECT(0x00465480, BridgeTilt1Ceiling);
INJECT(0x004654D0, BridgeTilt2Floor);
INJECT(0x00465540, BridgeTilt2Ceiling);
//INJECT(0x00465590, AnimatingControl);
INJECT(0x00465A30, PoleCollision);
INJECT(0x00465D00, ControlTriggerTriggerer);
INJECT(0x00465DF0, AnimateWaterfalls);
INJECT(0x00465F10, ControlWaterfall);
INJECT(0x004661C0, ParallelBarsCollision);
INJECT(0x00466420, ControlXRayMachine);
INJECT(0x00466720, CutsceneRopeControl);
INJECT(0x00466AA0, HybridCollision);*/
ITEM_INFO* item = &Items[itemNumber];
item->currentAnimState = 0;
item->animNumber = Objects[item->objectNumber].animIndex;
item->frameNumber = Anims[item->animNumber].frameBase;
}
void AnimatingControl(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
if (!TriggerActive(item))
return;
item->status = ITEM_ACTIVE;
AnimateItem(item);
if (item->frameNumber >= Anims[item->animNumber].frameEnd)
{
item->frameNumber = Anims[item->animNumber].frameBase;
RemoveActiveItem(itemNumber);
item->aiBits = 0;
item->status = ITEM_INACTIVE;
}
}
void HighObject2Control(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
if (!TriggerActive(item))
return;
if (!item->itemFlags[2])
{
int div = item->triggerFlags % 10 << 10;
int mod = item->triggerFlags / 10 << 10;
item->itemFlags[0] = GetRandomControl() % div;
item->itemFlags[1] = GetRandomControl() % mod;
item->itemFlags[2] = (GetRandomControl() & 0xF) + 15;
}
if (--item->itemFlags[2] < 15)
{
SPARKS* spark = &Sparks[GetFreeSpark()];
spark->on = 1;
spark->sR = -1;
spark->sB = 16;
spark->sG = (GetRandomControl() & 0x1F) + 48;
spark->dR = (GetRandomControl() & 0x3F) - 64;
spark->dB = 0;
spark->dG = (GetRandomControl() & 0x3F) + -128;
spark->fadeToBlack = 4;
spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 24;
spark->x = item->itemFlags[1] + (GetRandomControl() & 0x3F) + item->pos.xPos - 544;
spark->y = item->pos.yPos;
spark->z = item->itemFlags[0] + (GetRandomControl() & 0x3F) + item->pos.zPos - 544;
spark->xVel = (GetRandomControl() & 0x1FF) - 256;
spark->friction = 6;
spark->zVel = (GetRandomControl() & 0x1FF) - 256;
spark->rotAng = GetRandomControl() & 0xFFF;
spark->rotAdd = (GetRandomControl() & 0x3F) - 32;
spark->maxYvel = 0;
spark->yVel = -512 - (GetRandomControl() & 0x3FF);
spark->sSize = spark->size = (GetRandomControl() & 0xF) + 32;
spark->dSize = spark->size >> 2;
if (GetRandomControl() & 3)
{
spark->flags = SP_ROTATE | SP_DEF | SP_SCALE | SP_EXPDEF;
spark->scalar = 3;
spark->gravity = (GetRandomControl() & 0x3F) + 32;
}
else
{
spark->flags = SP_ROTATE | SP_DEF | SP_SCALE;
spark->def = Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATERDUST;
spark->scalar = 1;
spark->gravity = (GetRandomControl() & 0xF) + 64;
}
}
}

View file

@ -1,10 +1,9 @@
#pragma once
#include "..\Global\global.h"
#define InitialiseAnimating ((void (__cdecl*)(short)) 0x00440100)
#define AnimatingControl ((void (__cdecl*)(short)) 0x00465590)
extern OBJECT_TEXTURE* WaterfallTextures[6];
extern float WaterfallY[6];
//#define InitialiseSmashObject ((void (__cdecl*)(short)) 0x0043D7F0)
void SmashObject(short itemNumber);
void SmashObjectControl(short itemNumber);
void BridgeFlatFloor(ITEM_INFO* item, int x, int y, int z, int* height);
@ -19,19 +18,13 @@ void PoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll);
void ControlTriggerTriggerer(short itemNumber);
void AnimateWaterfalls();
void ControlWaterfall(short itemNumber);
//#define InitialiseTightRope ((void (__cdecl*)(short)) 0x0043ED30)
void TightRopeCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll);
void ParallelBarsCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll);
#define InitialiseXRayMachine ((void (__cdecl*)(short)) 0x0043FA20)
void ControlXRayMachine(short itemNumber);
void CutsceneRopeControl(short itemNumber);
void HybridCollision(short itemNum, ITEM_INFO* laraitem, COLL_INFO* coll);
//#define InitialiseRaisingBlock ((void (__cdecl*)(short)) 0x0043D730)
//#define RaisingBlockControl ((void (__cdecl*)(short)) 0x0048C3D0)
//#define InitialiseRaisingCog ((void (__cdecl*)(short)) 0x00440320)
//#define RaisingCogControl ((void (__cdecl*)(short)) 0x00406040)
#define HighObject2Control ((void (__cdecl*)(short)) 0x004070D0)
void InitialiseSmashObject(short itemNumber);
void InitialiseTightRope(short itemNumber);
void Inject_Objects();
void InitialiseAnimating(short itemNumber);
void AnimatingControl(short itemNumber);
void HighObject2Control(short itemNumber);

View file

@ -11,9 +11,9 @@ void TriggerAlertLight(int x, int y, int z, int r, int g, int b, int angle, shor
source.z = z;
GetFloor(x, y, z, &room);
source.roomNumber = room;
target.x = x + SIN(16 * angle);
target.x = x + phd_sin(16 * angle);
target.y = y;
target.z = z + COS(16 * angle);
target.z = z + phd_cos(16 * angle);
if (!LOS(&source, &target))
TriggerDynamicLight(target.x, target.y, target.z, falloff, r, g, b);
}

View file

@ -6,6 +6,8 @@
#include "control.h"
#include "sphere.h"
#include "debris.h"
#include "lara.h"
#include "sound.h"
#include "box.h"
int ShotLara(ITEM_INFO* item, AI_INFO* info, BITE_INFO* gun, short extra_rotation, int damage)
@ -18,7 +20,7 @@ int ShotLara(ITEM_INFO* item, AI_INFO* info, BITE_INFO* gun, short extra_rotatio
if (info->distance <= SQUARE(8192) && Targetable(item, info))
{
int distance = SIN(info->enemyFacing) * enemy->speed >> W2V_SHIFT * SQUARE(8192) / 300;
int distance = phd_sin(info->enemyFacing) * enemy->speed >> W2V_SHIFT * SQUARE(8192) / 300;
distance = info->distance + SQUARE(distance);
if (distance <= SQUARE(8192))
{
@ -102,7 +104,7 @@ short GunHit(int x, int y, int z, short speed, short yrot, short roomNumber)
pos.y = 0;
pos.z = 0;
GetJointAbsPosition(LaraItem, &pos, (25 * GetRandomControl()) >> 15);
GetLaraJointPosition(&pos, (25 * GetRandomControl()) >> 15);
DoBloodSplat(pos.x, pos.y, pos.z, (GetRandomControl() & 3) + 3, LaraItem->pos.yRot, LaraItem->roomNumber);
SoundEffect(SFX_LARA_INJURY_RND, &LaraItem->pos, 0);
@ -174,13 +176,3 @@ int TargetVisible(ITEM_INFO* item, AI_INFO* info)
return 0;
}
void Inject_People()
{
INJECT(0x00467610, ShotLara);
INJECT(0x00467530, GunMiss);
INJECT(0x004673D1, GunHit);
INJECT(0x00467420, GunShot);
INJECT(0x004672F0, Targetable);
INJECT(0x004671E0, TargetVisible);
}

View file

@ -8,5 +8,3 @@ short GunHit(int x, int y, int z, short speed, short yrot, short roomNumber);
short GunShot(int x, int y, int z, short speed, short yrot, short roomNumber);
int Targetable(ITEM_INFO* item, AI_INFO* info);
int TargetVisible(ITEM_INFO* item, AI_INFO* info);
void Inject_People();

View file

@ -19,6 +19,10 @@
#include "flmtorch.h"
#include "../Specific/setup.h"
#include "camera.h"
#include "..\Specific\level.h"
#include "../Specific/input.h"
#include "sound.h"
#include "savegame.h"
#include "..\Global\global.h"
@ -98,7 +102,7 @@ short RPickups[16];
PHD_VECTOR OldPickupPos;
extern int KeyTriggerActive;
extern LaraExtraInfo g_LaraExtra;
extern Inventory* g_Inventory;
void PickedUpObject(short objectNumber)
@ -106,273 +110,273 @@ void PickedUpObject(short objectNumber)
switch (objectNumber)
{
case ID_UZI_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_UZI].Present))
if (!(Lara.Weapons[WEAPON_UZI].Present))
{
g_LaraExtra.Weapons[WEAPON_UZI].Present = true;
g_LaraExtra.Weapons[WEAPON_UZI].SelectedAmmo = 0;
Lara.Weapons[WEAPON_UZI].Present = true;
Lara.Weapons[WEAPON_UZI].SelectedAmmo = 0;
}
if (g_LaraExtra.Weapons[WEAPON_UZI].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_UZI].Ammo[0] += 30;
if (Lara.Weapons[WEAPON_UZI].Ammo[0] != -1)
Lara.Weapons[WEAPON_UZI].Ammo[0] += 30;
break;
case ID_PISTOLS_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_PISTOLS].Present))
if (!(Lara.Weapons[WEAPON_PISTOLS].Present))
{
g_LaraExtra.Weapons[WEAPON_PISTOLS].Present = true;
g_LaraExtra.Weapons[WEAPON_PISTOLS].SelectedAmmo = 0;
Lara.Weapons[WEAPON_PISTOLS].Present = true;
Lara.Weapons[WEAPON_PISTOLS].SelectedAmmo = 0;
}
g_LaraExtra.Weapons[WEAPON_PISTOLS].Ammo[0] = -1;
Lara.Weapons[WEAPON_PISTOLS].Ammo[0] = -1;
break;
case ID_SHOTGUN_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present))
if (!(Lara.Weapons[WEAPON_SHOTGUN].Present))
{
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Present = true;
g_LaraExtra.Weapons[WEAPON_SHOTGUN].SelectedAmmo = 0;
Lara.Weapons[WEAPON_SHOTGUN].Present = true;
Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = 0;
}
if (g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[0] += 36;
if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[0] != -1)
Lara.Weapons[WEAPON_SHOTGUN].Ammo[0] += 36;
break;
case ID_REVOLVER_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_REVOLVER].Present))
if (!(Lara.Weapons[WEAPON_REVOLVER].Present))
{
g_LaraExtra.Weapons[WEAPON_REVOLVER].Present = true;
g_LaraExtra.Weapons[WEAPON_REVOLVER].SelectedAmmo = 0;
Lara.Weapons[WEAPON_REVOLVER].Present = true;
Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = 0;
}
if (g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[0] += 6;
if (Lara.Weapons[WEAPON_REVOLVER].Ammo[0] != -1)
Lara.Weapons[WEAPON_REVOLVER].Ammo[0] += 6;
break;
case ID_CROSSBOW_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_CROSSBOW].Present))
if (!(Lara.Weapons[WEAPON_CROSSBOW].Present))
{
g_LaraExtra.Weapons[WEAPON_CROSSBOW].Present = true;
g_LaraExtra.Weapons[WEAPON_CROSSBOW].SelectedAmmo = 0;
Lara.Weapons[WEAPON_CROSSBOW].Present = true;
Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = 0;
}
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[0] += 10;
if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[0] != -1)
Lara.Weapons[WEAPON_CROSSBOW].Ammo[0] += 10;
break;
case ID_HK_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_CROSSBOW].Present))
if (!(Lara.Weapons[WEAPON_CROSSBOW].Present))
{
g_LaraExtra.Weapons[WEAPON_HK].Present = true;
g_LaraExtra.Weapons[WEAPON_HK].SelectedAmmo = 0;
Lara.Weapons[WEAPON_HK].Present = true;
Lara.Weapons[WEAPON_HK].SelectedAmmo = 0;
}
if (g_LaraExtra.Weapons[WEAPON_HK].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_HK].Ammo[0] += 30;
if (Lara.Weapons[WEAPON_HK].Ammo[0] != -1)
Lara.Weapons[WEAPON_HK].Ammo[0] += 30;
break;
case ID_HARPOON_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Present))
if (!(Lara.Weapons[WEAPON_HARPOON_GUN].Present))
{
g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Present = true;
g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = 0;
Lara.Weapons[WEAPON_HARPOON_GUN].Present = true;
Lara.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = 0;
}
if (g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] += 10;
if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] != -1)
Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] += 10;
break;
case ID_GRENADE_GUN_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Present))
if (!(Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present))
{
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Present = true;
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = 0;
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present = true;
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = 0;
}
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] += 10;
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] != -1)
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] += 10;
break;
case ID_ROCKET_LAUNCHER_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_ROCKET_LAUNCHER].Present))
if (!(Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present))
{
g_LaraExtra.Weapons[WEAPON_ROCKET_LAUNCHER].Present = true;
g_LaraExtra.Weapons[WEAPON_ROCKET_LAUNCHER].SelectedAmmo = 0;
Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present = true;
Lara.Weapons[WEAPON_ROCKET_LAUNCHER].SelectedAmmo = 0;
}
if (g_LaraExtra.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] += 10;
if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] != -1)
Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] += 10;
break;
case ID_SHOTGUN_AMMO1_ITEM:
if (g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[0] += 36;
if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[0] != -1)
Lara.Weapons[WEAPON_SHOTGUN].Ammo[0] += 36;
break;
case ID_SHOTGUN_AMMO2_ITEM:
if (g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[1] != -1)
g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[1] += 36;
if (Lara.Weapons[WEAPON_SHOTGUN].Ammo[1] != -1)
Lara.Weapons[WEAPON_SHOTGUN].Ammo[1] += 36;
break;
case ID_HK_AMMO_ITEM:
if (g_LaraExtra.Weapons[WEAPON_HK].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_HK].Ammo[0] += 30;
if (Lara.Weapons[WEAPON_HK].Ammo[0] != -1)
Lara.Weapons[WEAPON_HK].Ammo[0] += 30;
break;
case ID_CROSSBOW_AMMO1_ITEM:
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[0] += 10;
if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[0] != -1)
Lara.Weapons[WEAPON_CROSSBOW].Ammo[0] += 10;
break;
case ID_CROSSBOW_AMMO2_ITEM:
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[1] != -1)
g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[1] += 10;
if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[1] != -1)
Lara.Weapons[WEAPON_CROSSBOW].Ammo[1] += 10;
break;
case ID_CROSSBOW_AMMO3_ITEM:
if (g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[2] != -1)
g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[2] += 10;
if (Lara.Weapons[WEAPON_CROSSBOW].Ammo[2] != -1)
Lara.Weapons[WEAPON_CROSSBOW].Ammo[2] += 10;
break;
case ID_GRENADE_AMMO1_ITEM:
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] += 10;
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] != -1)
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[0] += 10;
break;
case ID_GRENADE_AMMO2_ITEM:
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[1] != -1)
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[1] += 10;
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[1] != -1)
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[1] += 10;
break;
case ID_GRENADE_AMMO3_ITEM:
if (g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[2] != -1)
g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[2] += 10;
if (Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[2] != -1)
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[2] += 10;
break;
case ID_REVOLVER_AMMO_ITEM:
if (g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[0] += 6;
if (Lara.Weapons[WEAPON_REVOLVER].Ammo[0] != -1)
Lara.Weapons[WEAPON_REVOLVER].Ammo[0] += 6;
break;
case ID_ROCKET_LAUNCHER_AMMO_ITEM:
if (g_LaraExtra.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] += 10;
if (Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] != -1)
Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[0] += 10;
break;
case ID_HARPOON_AMMO_ITEM:
if (g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[0] += 10;
if (Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] != -1)
Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[0] += 10;
break;
case ID_UZI_AMMO_ITEM:
if (g_LaraExtra.Weapons[WEAPON_UZI].Ammo[0] != -1)
g_LaraExtra.Weapons[WEAPON_UZI].Ammo[0] += 30;
if (Lara.Weapons[WEAPON_UZI].Ammo[0] != -1)
Lara.Weapons[WEAPON_UZI].Ammo[0] += 30;
break;
case ID_FLARE_INV_ITEM:
if (g_LaraExtra.NumFlares != -1)
g_LaraExtra.NumFlares += 12;
if (Lara.NumFlares != -1)
Lara.NumFlares += 12;
break;
case ID_SILENCER_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_UZI].HasSilencer || g_LaraExtra.Weapons[WEAPON_PISTOLS].HasSilencer ||
g_LaraExtra.Weapons[WEAPON_SHOTGUN].HasSilencer || g_LaraExtra.Weapons[WEAPON_REVOLVER].HasSilencer ||
g_LaraExtra.Weapons[WEAPON_CROSSBOW].HasSilencer || g_LaraExtra.Weapons[WEAPON_HK].HasSilencer))
g_LaraExtra.Silencer = true;
if (!(Lara.Weapons[WEAPON_UZI].HasSilencer || Lara.Weapons[WEAPON_PISTOLS].HasSilencer ||
Lara.Weapons[WEAPON_SHOTGUN].HasSilencer || Lara.Weapons[WEAPON_REVOLVER].HasSilencer ||
Lara.Weapons[WEAPON_CROSSBOW].HasSilencer || Lara.Weapons[WEAPON_HK].HasSilencer))
Lara.Silencer = true;
break;
case ID_LASERSIGHT_ITEM:
if (!(g_LaraExtra.Weapons[WEAPON_UZI].HasSilencer || g_LaraExtra.Weapons[WEAPON_PISTOLS].HasSilencer ||
g_LaraExtra.Weapons[WEAPON_SHOTGUN].HasSilencer || g_LaraExtra.Weapons[WEAPON_REVOLVER].HasSilencer ||
g_LaraExtra.Weapons[WEAPON_CROSSBOW].HasSilencer || g_LaraExtra.Weapons[WEAPON_HK].HasSilencer))
g_LaraExtra.Lasersight = true;
if (!(Lara.Weapons[WEAPON_UZI].HasSilencer || Lara.Weapons[WEAPON_PISTOLS].HasSilencer ||
Lara.Weapons[WEAPON_SHOTGUN].HasSilencer || Lara.Weapons[WEAPON_REVOLVER].HasSilencer ||
Lara.Weapons[WEAPON_CROSSBOW].HasSilencer || Lara.Weapons[WEAPON_HK].HasSilencer))
Lara.Lasersight = true;
break;
case ID_BIGMEDI_ITEM:
if (g_LaraExtra.NumLargeMedipacks != -1)
g_LaraExtra.NumLargeMedipacks++;
if (Lara.NumLargeMedipacks != -1)
Lara.NumLargeMedipacks++;
break;
case ID_SMALLMEDI_ITEM:
if (g_LaraExtra.NumSmallMedipacks != -1)
g_LaraExtra.NumSmallMedipacks++;
if (Lara.NumSmallMedipacks != -1)
Lara.NumSmallMedipacks++;
break;
case ID_BINOCULARS_ITEM:
g_LaraExtra.Binoculars = true;
Lara.Binoculars = true;
break;
case ID_WATERSKIN1_EMPTY:
g_LaraExtra.Waterskin1.Present = true;
g_LaraExtra.Waterskin1.Quantity = 0;
Lara.Waterskin1.Present = true;
Lara.Waterskin1.Quantity = 0;
break;
case ID_WATERSKIN2_EMPTY:
g_LaraExtra.Waterskin2.Present = true;
g_LaraExtra.Waterskin2.Quantity = 0;
Lara.Waterskin2.Present = true;
Lara.Waterskin2.Quantity = 0;
break;
case ID_GOLDROSE_ITEM:
IsAtmospherePlaying = 0;
S_CDPlay(6, 0);
g_LaraExtra.Secrets++;
Lara.Secrets++;
Savegame.Level.Secrets++;
Savegame.Game.Secrets++;
break;
case ID_CROWBAR_ITEM:
g_LaraExtra.Crowbar = true;
Lara.Crowbar = true;
break;
case ID_DIARY_ITEM:
g_LaraExtra.Diary.Present = true;
Lara.Diary.Present = true;
break;
default:
if (objectNumber >= ID_PUZZLE_ITEM1 && objectNumber <= ID_PUZZLE_ITEM8)
g_LaraExtra.Puzzles[objectNumber - ID_PUZZLE_ITEM1]++;
Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1]++;
else if (objectNumber >= ID_PUZZLE_ITEM1_COMBO1 && objectNumber <= ID_PUZZLE_ITEM8_COMBO2)
g_LaraExtra.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1]++;
Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1]++;
else if (objectNumber >= ID_KEY_ITEM1 && objectNumber <= ID_KEY_ITEM8)
g_LaraExtra.Keys[objectNumber - ID_KEY_ITEM1]++;
Lara.Keys[objectNumber - ID_KEY_ITEM1]++;
else if (objectNumber >= ID_KEY_ITEM1_COMBO1 && objectNumber <= ID_KEY_ITEM8_COMBO2)
g_LaraExtra.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1]++;
Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1]++;
else if (objectNumber >= ID_PICKUP_ITEM1 && objectNumber <= ID_PICKUP_ITEM4)
g_LaraExtra.Pickups[objectNumber - ID_PICKUP_ITEM1]++;
Lara.Pickups[objectNumber - ID_PICKUP_ITEM1]++;
else if (objectNumber >= ID_PICKUP_ITEM1_COMBO1 && objectNumber <= ID_PICKUP_ITEM4_COMBO2)
g_LaraExtra.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1]++;
Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1]++;
else if (objectNumber >= ID_EXAMINE1 && objectNumber <= ID_EXAMINE3)
g_LaraExtra.Examines[objectNumber - ID_EXAMINE1] = 1;
Lara.Examines[objectNumber - ID_EXAMINE1] = 1;
else if (objectNumber >= ID_EXAMINE1_COMBO1 && objectNumber <= ID_EXAMINE3_COMBO2)
g_LaraExtra.ExaminesCombo[objectNumber - ID_EXAMINE1_COMBO1] = 1;
Lara.ExaminesCombo[objectNumber - ID_EXAMINE1_COMBO1] = 1;
}
g_Inventory->LoadObjects(false);
@ -381,28 +385,28 @@ void PickedUpObject(short objectNumber)
void RemoveObjectFromInventory(short objectNumber, int count)
{
if (objectNumber >= ID_PUZZLE_ITEM1 && objectNumber <= ID_PUZZLE_ITEM8)
g_LaraExtra.Puzzles[objectNumber - ID_PUZZLE_ITEM1] -= min(count, g_LaraExtra.Puzzles[objectNumber - ID_PUZZLE_ITEM1]);
Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1] -= min(count, Lara.Puzzles[objectNumber - ID_PUZZLE_ITEM1]);
else if (objectNumber >= ID_PUZZLE_ITEM1_COMBO1 && objectNumber <= ID_PUZZLE_ITEM8_COMBO2)
g_LaraExtra.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1] -= min(count, g_LaraExtra.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1]);
Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1] -= min(count, Lara.PuzzlesCombo[objectNumber - ID_PUZZLE_ITEM1_COMBO1]);
else if (objectNumber >= ID_KEY_ITEM1 && objectNumber <= ID_KEY_ITEM8)
g_LaraExtra.Keys[objectNumber - ID_KEY_ITEM1] -= min(count, g_LaraExtra.Keys[objectNumber - ID_KEY_ITEM1]);
Lara.Keys[objectNumber - ID_KEY_ITEM1] -= min(count, Lara.Keys[objectNumber - ID_KEY_ITEM1]);
else if (objectNumber >= ID_KEY_ITEM1_COMBO1 && objectNumber <= ID_KEY_ITEM8_COMBO2)
g_LaraExtra.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1] -= min(count, g_LaraExtra.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1]);
Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1] -= min(count, Lara.KeysCombo[objectNumber - ID_KEY_ITEM1_COMBO1]);
else if (objectNumber >= ID_PICKUP_ITEM1 && objectNumber <= ID_PICKUP_ITEM4)
g_LaraExtra.Pickups[objectNumber - ID_PICKUP_ITEM1] -= min(count, g_LaraExtra.Pickups[objectNumber - ID_PICKUP_ITEM1]);
Lara.Pickups[objectNumber - ID_PICKUP_ITEM1] -= min(count, Lara.Pickups[objectNumber - ID_PICKUP_ITEM1]);
else if (objectNumber >= ID_PICKUP_ITEM1_COMBO1 && objectNumber <= ID_PICKUP_ITEM4_COMBO2)
g_LaraExtra.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1] -= min(count, g_LaraExtra.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1]);
Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1] -= min(count, Lara.PickupsCombo[objectNumber - ID_PICKUP_ITEM1_COMBO1]);
else if (objectNumber >= ID_EXAMINE1 && objectNumber <= ID_EXAMINE3)
g_LaraExtra.Examines[objectNumber - ID_EXAMINE1] = 0;
Lara.Examines[objectNumber - ID_EXAMINE1] = 0;
else if (objectNumber >= ID_EXAMINE1_COMBO1 && objectNumber <= ID_EXAMINE3_COMBO2)
g_LaraExtra.PickupsCombo[objectNumber - ID_EXAMINE1_COMBO1] = 0;
Lara.PickupsCombo[objectNumber - ID_EXAMINE1_COMBO1] = 0;
g_Inventory->LoadObjects(false);
}
@ -1238,38 +1242,38 @@ void RegeneratePickups()
short ammo = 0;
if (item->objectNumber == ID_CROSSBOW_AMMO1_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1];
ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO1];
else if (item->objectNumber == ID_CROSSBOW_AMMO2_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2];
ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO2];
else if (item->objectNumber == ID_CROSSBOW_AMMO3_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3];
ammo = Lara.Weapons[WEAPON_CROSSBOW].Ammo[WEAPON_AMMO3];
else if(item->objectNumber == ID_GRENADE_AMMO1_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1];
ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO1];
else if (item->objectNumber == ID_GRENADE_AMMO2_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2];
ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO2];
else if (item->objectNumber == ID_GRENADE_AMMO3_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3];
ammo = Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Ammo[WEAPON_AMMO3];
else if (item->objectNumber == ID_HK_AMMO_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1];
ammo = Lara.Weapons[WEAPON_HK].Ammo[WEAPON_AMMO1];
else if (item->objectNumber == ID_UZI_AMMO_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1];
ammo = Lara.Weapons[WEAPON_UZI].Ammo[WEAPON_AMMO1];
else if (item->objectNumber == ID_HARPOON_AMMO_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1];
ammo = Lara.Weapons[WEAPON_HARPOON_GUN].Ammo[WEAPON_AMMO1];
else if (item->objectNumber == ID_ROCKET_LAUNCHER_AMMO_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1];
ammo = Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Ammo[WEAPON_AMMO1];
else if (item->objectNumber == ID_REVOLVER_AMMO_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1];
ammo = Lara.Weapons[WEAPON_REVOLVER].Ammo[WEAPON_AMMO1];
else if (item->objectNumber == ID_SHOTGUN_AMMO1_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1];
ammo = Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO1];
else if (item->objectNumber == ID_SHOTGUN_AMMO1_ITEM)
ammo = g_LaraExtra.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2];
ammo = Lara.Weapons[WEAPON_SHOTGUN].Ammo[WEAPON_AMMO2];
if (ammo == 0)
{
@ -1649,20 +1653,3 @@ void SearchObjectControl(short itemNumber)
}
}
}
void Inject_Pickup()
{
INJECT(0x0043A130, DrawAllPickups);
INJECT(0x00463B60, PickedUpObject);
INJECT(0x0043E260, InitialisePickup);
INJECT(0x004679D0, PickupControl);
INJECT(0x00467AF0, RegeneratePickups);
INJECT(0x00467C00, PickupCollision);
INJECT(0x00468770, FindPlinth);
INJECT(0x00468930, KeyHoleCollision);
INJECT(0x00468C00, PuzzleDoneCollision);
INJECT(0x00468C70, PuzzleHoleCollision);
INJECT(0x004693A0, PuzzleDone);
INJECT(0x00469550, KeyTrigger);
INJECT(0x004695E0, PickupTrigger);
}

View file

@ -2,10 +2,6 @@
#include "..\Global\global.h"
//#define PickupCollision ((void (__cdecl*)(short, ITEM_INFO*, COLL_INFO*)) 0x00467C00)
//#define InitialisePickup ((void (__cdecl*)(short)) 0x0043E260)
//#define PickupControl ((void (__cdecl*)(short)) 0x004679D0)
void InitialisePickup(short itemNumber);
void PickedUpObject(short objectNumber);
void RemoveObjectFromInventory(short objectNumber, int count);
@ -24,6 +20,3 @@ void PickupControl(short itemNum);
void InitialiseSearchObject(short itemNumber);
void SearchObjectCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* laracoll);
void SearchObjectControl(short itemNumber);
void Inject_Pickup();

View file

@ -1 +0,0 @@
#include "rat.h"

View file

@ -1,6 +0,0 @@
#pragma once
#include "..\Global\global.h"
//#define InitialiseLittleRats ((void (__cdecl*)(short)) 0x0046B220)
//#define ControlLittleRats ((void (__cdecl*)(short)) 0x0046AB30)

View file

@ -2,9 +2,15 @@
#include "..\Global\global.h"
#include "draw.h"
#include "laramisc.h"
#include "lara.h"
#include "..\Specific\level.h"
#include "../Specific/input.h"
#include "control.h"
PENDULUM CurrentPendulum;
PENDULUM AlternatePendulum;
ROPE_STRUCT Ropes[12];
int NumRopes;
void InitialiseRope(short itemNumber) // (F) (D)
{
@ -94,7 +100,7 @@ PHD_VECTOR* NormaliseRopeVector(PHD_VECTOR* vec) // (F) (D)
if (length < 0)
length = -length;
length = 65536 / SQRT_ASM(length);
length = 65536 / sqrt(length);
vec->x = (int64_t) length * vec->x >> 16;
vec->y = (int64_t) length * vec->y >> 16;
@ -135,11 +141,11 @@ void CrossProduct(PHD_VECTOR* u, PHD_VECTOR* v, PHD_VECTOR* destination) // (F)
void _0x0046D420(int* matrix, short* angle) // (F) (D)
{
angle[0] = ATAN(SQRT_ASM(SQUARE(matrix[M22]) + SQUARE(matrix[M02])), matrix[M12]);
angle[0] = phd_atan(sqrt(SQUARE(matrix[M22]) + SQUARE(matrix[M02])), matrix[M12]);
if (matrix[M12] >= 0 && angle[0] > 0 || matrix[M12] < 0 && angle[0] < 0)
angle[0] = -angle[0];
angle[1] = ATAN(matrix[M22], matrix[M02]);
angle[2] = ATAN(matrix[M00] * COS(angle[1]) - matrix[M20] * SIN(angle[1]), matrix[M21] * SIN(angle[1]) - matrix[M01] * COS(angle[1]));
angle[1] = phd_atan(matrix[M22], matrix[M02]);
angle[2] = phd_atan(matrix[M00] * phd_cos(angle[1]) - matrix[M20] * phd_sin(angle[1]), matrix[M21] * phd_sin(angle[1]) - matrix[M01] * phd_cos(angle[1]));
}
void RopeControl(short itemNumber) // (F) (D)
@ -172,7 +178,7 @@ void RopeCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) // (F) (D)
if (TrInput & IN_ACTION && Lara.gunStatus == LG_NO_ARMS && (l->currentAnimState == STATE_LARA_REACH || l->currentAnimState == STATE_LARA_JUMP_UP) && l->gravityStatus && l->fallspeed > 0 && rope->active)
{
frame = (ANIM_FRAME*) GetBoundsAccurate(l);
segment = _0x0046D200(rope, l->pos.xPos, l->pos.yPos + frame->MinY + 512, l->pos.zPos + (frame->MaxZ * COS(l->pos.yRot) >> W2V_SHIFT), l->currentAnimState == STATE_LARA_REACH ? 128 : 320);
segment = _0x0046D200(rope, l->pos.xPos, l->pos.yPos + frame->MinY + 512, l->pos.zPos + (frame->MaxZ * phd_cos(l->pos.yRot) >> W2V_SHIFT), l->currentAnimState == STATE_LARA_REACH ? 128 : 320);
if (segment >= 0)
{
if (l->currentAnimState == STATE_LARA_REACH)
@ -384,9 +390,9 @@ int _0x0046D200(ROPE_STRUCT* rope, int x, int y, int z, int radius) // (F) (D)
void ApplyVelocityToRope(int node, short angle, short n) // (F) (D)
{
SetPendulumVelocity(
(unsigned short) n * SIN(angle) >> 2,
(unsigned short) n * phd_sin(angle) >> 2,
0,
(unsigned short) n * COS(angle) >> 2); /* @ORIGINAL_BUG: casting n to unsigned short results in the rope glitch */
(unsigned short) n * phd_cos(angle) >> 2); /* @ORIGINAL_BUG: casting n to unsigned short results in the rope glitch */
}
void SetPendulumVelocity(int x, int y, int z) // (F) (D)
@ -431,7 +437,7 @@ void _0x0046E080(ROPE_STRUCT* rope, PENDULUM* pendulumPointer, PHD_VECTOR* ropeV
vec.x = pendulumPointer->Position.x + pendulumVelocity->x - rope->segment[0].x;
vec.y = pendulumPointer->Position.y + pendulumVelocity->y - rope->segment[0].y;
vec.z = pendulumPointer->Position.z + pendulumVelocity->z - rope->segment[0].z;
result = 65536 * SQRT_ASM(abs(SQUARE(vec.x >> 16) + SQUARE(vec.y >> 16) + SQUARE(vec.z >> 16))) - value;
result = 65536 * sqrt(abs(SQUARE(vec.x >> 16) + SQUARE(vec.y >> 16) + SQUARE(vec.z >> 16))) - value;
NormaliseRopeVector(&vec);
pendulumVelocity->x -= (int64_t) result * vec.x >> 16;
pendulumVelocity->y -= (int64_t) result * vec.y >> 16;
@ -446,7 +452,7 @@ void _0x0046DF00(PHD_VECTOR* segment, PHD_VECTOR* nextSegment, PHD_VECTOR* veloc
vec.x = nextSegment->x + nextVelocity->x - segment->x - velocity->x;
vec.y = nextSegment->y + nextVelocity->y - segment->y - velocity->y;
vec.z = nextSegment->z + nextVelocity->z - segment->z - velocity->z;
result = 65536 * SQRT_ASM(abs(SQUARE(vec.x >> 16) + SQUARE(vec.y >> 16) + SQUARE(vec.z >> 16))) - length >> 1;
result = (65536 * sqrt(abs(SQUARE(vec.x >> 16) + SQUARE(vec.y >> 16) + SQUARE(vec.z >> 16))) - length) / 2;
NormaliseRopeVector(&vec);
vec.x = (int64_t) result * vec.x >> 16;
vec.y = (int64_t) result * vec.y >> 16;

View file

@ -24,8 +24,8 @@ struct PENDULUM
};
extern PENDULUM CurrentPendulum;
#define CalculateRopePoints ((void (__cdecl*)(ROPE_STRUCT*)) 0x0046EC70)
extern ROPE_STRUCT Ropes[12];
extern int NumRopes;
void InitialiseRope(short itemNumber);
void PrepareRope(ROPE_STRUCT* rope, PHD_VECTOR* pos1, PHD_VECTOR* pos2, int length, ITEM_INFO* item);

View file

@ -12,7 +12,7 @@
#include "..\Objects\newobjects.h"
#include "..\Objects\oldobjects.h"
#include "..\Game\sound.h"
#include "..\Specific\roomload.h"
#include "..\Specific\level.h"
#include "../Specific/setup.h"
#include "camera.h"
@ -21,6 +21,7 @@ ChunkReader* SaveGame::m_reader;
ChunkWriter* SaveGame::m_writer;
vector<LuaVariable> SaveGame::m_luaVariables;
int SaveGame::LastSaveGame;
SAVEGAME_INFO Savegame;
ChunkId* SaveGame::m_chunkGameStatus;
ChunkId* SaveGame::m_chunkItems;
@ -118,7 +119,7 @@ void SaveGame::saveItems()
void SaveGame::saveItem(int itemNumber, int runtimeItem)
{
ITEM_INFO* item = &Items[itemNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
LEB128::Write(m_stream, itemNumber);
LEB128::Write(m_stream, runtimeItem);
@ -211,7 +212,7 @@ void SaveGame::saveGameStatus(int arg1, int arg2)
void SaveGame::saveLara(int arg1, int arg2)
{
// LARA_INFO struct dumped to savegame
LARA_INFO lara;
LaraInfo lara;
memcpy(&lara, &Lara, sizeof(Lara));
for (int i = 0; i < 15; i++)
@ -219,7 +220,7 @@ void SaveGame::saveLara(int arg1, int arg2)
lara.leftArm.frameBase = (short*)((char *)lara.leftArm.frameBase - (ptrdiff_t)Objects[ID_LARA].frameBase);
lara.rightArm.frameBase = (short*)((char *)lara.rightArm.frameBase - (ptrdiff_t)Objects[ID_LARA].frameBase);
lara.generalPtr = (char *)lara.generalPtr - (ptrdiff_t)MallocBuffer;
lara.generalPtr = (char *)lara.generalPtr - (ptrdiff_t)malloc_buffer;
m_stream->Write(reinterpret_cast<char*>(&lara), sizeof(Lara));
@ -239,50 +240,50 @@ void SaveGame::saveLara(int arg1, int arg2)
// Save carried puzzles, keys, pickups and examines
for (int i = 0; i < NUM_PUZZLES; i++)
{
if (g_LaraExtra.Puzzles[i] > 0)
m_writer->WriteChunk(m_chunkPuzzle, &savePuzzle, i, g_LaraExtra.Puzzles[i]);
if (Lara.Puzzles[i] > 0)
m_writer->WriteChunk(m_chunkPuzzle, &savePuzzle, i, Lara.Puzzles[i]);
}
for (int i = 0; i < NUM_PUZZLES * 2; i++)
{
if (g_LaraExtra.PuzzlesCombo[i] > 0)
m_writer->WriteChunk(m_chunkPuzzleCombo, &savePuzzle, i, g_LaraExtra.PuzzlesCombo[i]);
if (Lara.PuzzlesCombo[i] > 0)
m_writer->WriteChunk(m_chunkPuzzleCombo, &savePuzzle, i, Lara.PuzzlesCombo[i]);
}
for (int i = 0; i < NUM_KEYS; i++)
{
if (g_LaraExtra.Keys[i] > 0)
m_writer->WriteChunk(m_chunkKey, &savePuzzle, i, g_LaraExtra.Keys[i]);
if (Lara.Keys[i] > 0)
m_writer->WriteChunk(m_chunkKey, &savePuzzle, i, Lara.Keys[i]);
}
for (int i = 0; i < NUM_KEYS * 2; i++)
{
if (g_LaraExtra.KeysCombo[i] > 0)
m_writer->WriteChunk(m_chunkKeyCombo, &savePuzzle, i, g_LaraExtra.KeysCombo[i]);
if (Lara.KeysCombo[i] > 0)
m_writer->WriteChunk(m_chunkKeyCombo, &savePuzzle, i, Lara.KeysCombo[i]);
}
for (int i = 0; i < NUM_PICKUPS; i++)
{
if (g_LaraExtra.Pickups[i] > 0)
m_writer->WriteChunk(m_chunkPickup, &savePuzzle, i, g_LaraExtra.Pickups[i]);
if (Lara.Pickups[i] > 0)
m_writer->WriteChunk(m_chunkPickup, &savePuzzle, i, Lara.Pickups[i]);
}
for (int i = 0; i < NUM_PICKUPS * 2; i++)
{
if (g_LaraExtra.PickupsCombo[i] > 0)
m_writer->WriteChunk(m_chunkPickupCombo, &savePuzzle, i, g_LaraExtra.PickupsCombo[i]);
if (Lara.PickupsCombo[i] > 0)
m_writer->WriteChunk(m_chunkPickupCombo, &savePuzzle, i, Lara.PickupsCombo[i]);
}
for (int i = 0; i < NUM_EXAMINES; i++)
{
if (g_LaraExtra.Examines[i] > 0)
m_writer->WriteChunk(m_chunkExamine, &savePuzzle, i, g_LaraExtra.Examines[i]);
if (Lara.Examines[i] > 0)
m_writer->WriteChunk(m_chunkExamine, &savePuzzle, i, Lara.Examines[i]);
}
for (int i = 0; i < NUM_EXAMINES * 2; i++)
{
if (g_LaraExtra.ExaminesCombo[i] > 0)
m_writer->WriteChunk(m_chunkExamineCombo, &savePuzzle, i, g_LaraExtra.ExaminesCombo[i]);
if (Lara.ExaminesCombo[i] > 0)
m_writer->WriteChunk(m_chunkExamineCombo, &savePuzzle, i, Lara.ExaminesCombo[i]);
}
}
@ -300,19 +301,19 @@ void SaveGame::saveWeaponItem(int arg1, int arg2)
void SaveGame::saveLaraExtraInfo(int arg1, int arg2)
{
LEB128::Write(m_stream, (g_LaraExtra.Binoculars ? 1 : 0));
LEB128::Write(m_stream, (g_LaraExtra.Lasersight ? 1 : 0));
LEB128::Write(m_stream, (g_LaraExtra.Crowbar ? 1 : 0));
LEB128::Write(m_stream, (g_LaraExtra.Silencer ? 1 : 0));
LEB128::Write(m_stream, (g_LaraExtra.Torch ? 1 : 0));
LEB128::Write(m_stream, g_LaraExtra.Secrets);
LEB128::Write(m_stream, g_LaraExtra.ExtraAnim);
LEB128::Write(m_stream, g_LaraExtra.Vehicle);
LEB128::Write(m_stream, g_LaraExtra.mineL);
LEB128::Write(m_stream, g_LaraExtra.mineR);
LEB128::Write(m_stream, g_LaraExtra.NumFlares);
LEB128::Write(m_stream, g_LaraExtra.NumLargeMedipacks);
LEB128::Write(m_stream, g_LaraExtra.NumSmallMedipacks);
LEB128::Write(m_stream, (Lara.Binoculars ? 1 : 0));
LEB128::Write(m_stream, (Lara.Lasersight ? 1 : 0));
LEB128::Write(m_stream, (Lara.Crowbar ? 1 : 0));
LEB128::Write(m_stream, (Lara.Silencer ? 1 : 0));
LEB128::Write(m_stream, (Lara.Torch ? 1 : 0));
LEB128::Write(m_stream, Lara.Secrets);
LEB128::Write(m_stream, Lara.ExtraAnim);
LEB128::Write(m_stream, Lara.Vehicle);
LEB128::Write(m_stream, Lara.mineL);
LEB128::Write(m_stream, Lara.mineR);
LEB128::Write(m_stream, Lara.NumFlares);
LEB128::Write(m_stream, Lara.NumLargeMedipacks);
LEB128::Write(m_stream, Lara.NumSmallMedipacks);
}
void SaveGame::savePuzzle(int arg1, int arg2)
@ -323,7 +324,7 @@ void SaveGame::savePuzzle(int arg1, int arg2)
void SaveGame::saveWeaponInfo(int arg1, int arg2)
{
CarriedWeaponInfo* weapon = &g_LaraExtra.Weapons[arg1];
CarriedWeaponInfo* weapon = &Lara.Weapons[arg1];
LEB128::Write(m_stream, arg1);
LEB128::Write(m_stream, weapon->Present);
@ -505,10 +506,10 @@ bool SaveGame::readGameStatus()
bool SaveGame::readLara()
{
// Read dumped LARA_INFO struct
char* buffer = (char*)malloc(sizeof(LARA_INFO));
m_stream->Read(buffer, sizeof(LARA_INFO));
LARA_INFO* lara = reinterpret_cast<LARA_INFO*>(buffer);
memcpy(&Lara, lara, sizeof(LARA_INFO));
char* buffer = (char*)malloc(sizeof(LaraInfo));
m_stream->Read(buffer, sizeof(LaraInfo));
LaraInfo* lara = reinterpret_cast<LaraInfo*>(buffer);
memcpy(&Lara, lara, sizeof(LaraInfo));
free(buffer);
for (int i = 0; i < 15; i++)
@ -522,7 +523,7 @@ bool SaveGame::readLara()
Lara.target = NULL;
Lara.spazEffect = NULL;
Lara.generalPtr = ADD_PTR(Lara.generalPtr, char, MallocBuffer);
Lara.generalPtr = ADD_PTR(Lara.generalPtr, char, malloc_buffer);
Lara.weaponItem = NO_ITEM;
// Is Lara burning?
@ -559,7 +560,7 @@ bool SaveGame::readItem()
ITEM_INFO* item = &Items[itemNumber];
item->objectNumber = LEB128::ReadInt16(m_stream);
OBJECT_INFO* obj = &Objects[item->objectNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
// Runtime items must be initialised
// TODO: test test test!!!
@ -750,19 +751,19 @@ bool SaveGame::readLaraChunks(ChunkId* chunkId, int maxSize, int arg)
{
if (chunkId->EqualsTo(m_chunkLaraExtraInfo))
{
g_LaraExtra.Binoculars = LEB128::ReadByte(m_stream);
g_LaraExtra.Lasersight = LEB128::ReadByte(m_stream);
g_LaraExtra.Crowbar = LEB128::ReadByte(m_stream);
g_LaraExtra.Silencer = LEB128::ReadByte(m_stream);
g_LaraExtra.Torch = LEB128::ReadByte(m_stream);
g_LaraExtra.Secrets = LEB128::ReadInt32(m_stream);
g_LaraExtra.ExtraAnim = LEB128::ReadInt16(m_stream);
g_LaraExtra.Vehicle = LEB128::ReadInt16(m_stream);
g_LaraExtra.mineL = LEB128::ReadByte(m_stream);
g_LaraExtra.mineR = LEB128::ReadByte(m_stream);
g_LaraExtra.NumFlares = LEB128::ReadInt32(m_stream);
g_LaraExtra.NumLargeMedipacks = LEB128::ReadInt32(m_stream);
g_LaraExtra.NumSmallMedipacks = LEB128::ReadInt32(m_stream);
Lara.Binoculars = LEB128::ReadByte(m_stream);
Lara.Lasersight = LEB128::ReadByte(m_stream);
Lara.Crowbar = LEB128::ReadByte(m_stream);
Lara.Silencer = LEB128::ReadByte(m_stream);
Lara.Torch = LEB128::ReadByte(m_stream);
Lara.Secrets = LEB128::ReadInt32(m_stream);
Lara.ExtraAnim = LEB128::ReadInt16(m_stream);
Lara.Vehicle = LEB128::ReadInt16(m_stream);
Lara.mineL = LEB128::ReadByte(m_stream);
Lara.mineR = LEB128::ReadByte(m_stream);
Lara.NumFlares = LEB128::ReadInt32(m_stream);
Lara.NumLargeMedipacks = LEB128::ReadInt32(m_stream);
Lara.NumSmallMedipacks = LEB128::ReadInt32(m_stream);
return true;
}
@ -770,7 +771,7 @@ bool SaveGame::readLaraChunks(ChunkId* chunkId, int maxSize, int arg)
{
int id = LEB128::ReadInt32(m_stream);
CarriedWeaponInfo* weapon = &g_LaraExtra.Weapons[id];
CarriedWeaponInfo* weapon = &Lara.Weapons[id];
weapon->Present = LEB128::ReadByte(m_stream);
weapon->SelectedAmmo = LEB128::ReadByte(m_stream);
@ -784,49 +785,49 @@ bool SaveGame::readLaraChunks(ChunkId* chunkId, int maxSize, int arg)
{
int id = LEB128::ReadInt32(m_stream);
int quantity = LEB128::ReadInt32(m_stream);
g_LaraExtra.Puzzles[id] = quantity;
Lara.Puzzles[id] = quantity;
}
else if (chunkId->EqualsTo(m_chunkPuzzleCombo))
{
int id = LEB128::ReadInt32(m_stream);
int quantity = LEB128::ReadInt32(m_stream);
g_LaraExtra.PuzzlesCombo[id] = quantity;
Lara.PuzzlesCombo[id] = quantity;
}
else if (chunkId->EqualsTo(m_chunkKey))
{
int id = LEB128::ReadInt32(m_stream);
int quantity = LEB128::ReadInt32(m_stream);
g_LaraExtra.Keys[id] = quantity;
Lara.Keys[id] = quantity;
}
else if (chunkId->EqualsTo(m_chunkKeyCombo))
{
int id = LEB128::ReadInt32(m_stream);
int quantity = LEB128::ReadInt32(m_stream);
g_LaraExtra.KeysCombo[id] = quantity;
Lara.KeysCombo[id] = quantity;
}
else if (chunkId->EqualsTo(m_chunkPickup))
{
int id = LEB128::ReadInt32(m_stream);
int quantity = LEB128::ReadInt32(m_stream);
g_LaraExtra.Pickups[id] = quantity;
Lara.Pickups[id] = quantity;
}
else if (chunkId->EqualsTo(m_chunkPickupCombo))
{
int id = LEB128::ReadInt32(m_stream);
int quantity = LEB128::ReadInt32(m_stream);
g_LaraExtra.PickupsCombo[id] = quantity;
Lara.PickupsCombo[id] = quantity;
}
else if (chunkId->EqualsTo(m_chunkExamine))
{
int id = LEB128::ReadInt32(m_stream);
int quantity = LEB128::ReadInt32(m_stream);
g_LaraExtra.Examines[id] = quantity;
Lara.Examines[id] = quantity;
}
else if (chunkId->EqualsTo(m_chunkExamineCombo))
{
int id = LEB128::ReadInt32(m_stream);
int quantity = LEB128::ReadInt32(m_stream);
g_LaraExtra.ExaminesCombo[id] = quantity;
Lara.ExaminesCombo[id] = quantity;
}
else if (chunkId->EqualsTo(m_chunkWeaponItem))
{
@ -1025,7 +1026,7 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber)
{
EnableBaddieAI(itemNumber, 1);
OBJECT_INFO* obj = &Objects[item->objectNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
creature->jointRotation[0] = LEB128::ReadInt16(m_stream);
@ -1045,7 +1046,7 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber)
creature->mood = (MOOD_TYPE)LEB128::ReadInt32(m_stream);
ITEM_INFO* enemy = (ITEM_INFO*)LEB128::ReadLong(m_stream);
creature->enemy = ADD_PTR(enemy, ITEM_INFO, MallocBuffer);
creature->enemy = ADD_PTR(enemy, ITEM_INFO, malloc_buffer);
creature->aiTarget.objectNumber = LEB128::ReadInt16(m_stream);
creature->aiTarget.roomNumber = LEB128::ReadInt16(m_stream);
@ -1068,7 +1069,7 @@ bool SaveGame::readItemChunks(ChunkId* chunkId, int maxSize, int itemNumber)
}
else if (chunkId->EqualsTo(m_chunkItemQuadInfo))
{
QUAD_INFO* quadInfo = (QUAD_INFO*)GameMalloc(sizeof(QUAD_INFO));
QUAD_INFO* quadInfo = (QUAD_INFO*)game_malloc(sizeof(QUAD_INFO));
m_stream->ReadBytes(reinterpret_cast<byte*>(quadInfo), sizeof(QUAD_INFO));
if (item->objectNumber == ID_QUAD)
item->data = (void*)quadInfo;
@ -1129,7 +1130,7 @@ bool SaveGame::readStatistics()
void SaveGame::saveItemFlags(int arg1, int arg2)
{
ITEM_INFO* item = &Items[arg1];
OBJECT_INFO* obj = &Objects[item->objectNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
LEB128::Write(m_stream, item->flags);
LEB128::Write(m_stream, item->active);
@ -1153,10 +1154,10 @@ void SaveGame::saveItemFlags(int arg1, int arg2)
void SaveGame::saveItemIntelligentData(int arg1, int arg2)
{
ITEM_INFO* item = &Items[arg1];
OBJECT_INFO* obj = &Objects[item->objectNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
ITEM_INFO* enemy = (ITEM_INFO*)((char*)creature->enemy - (ptrdiff_t)MallocBuffer);
ITEM_INFO* enemy = (ITEM_INFO*)((char*)creature->enemy - (ptrdiff_t)malloc_buffer);
LEB128::Write(m_stream, creature->jointRotation[0]);
LEB128::Write(m_stream, creature->jointRotation[1]);

View file

@ -9,15 +9,11 @@
#include "..\Scripting\GameFlowScript.h"
#include "..\Scripting\GameLogicScript.h"
#define RestoreGame ((int (__cdecl*)()) 0x00472060)
#define ReadSavegame ((int (__cdecl*)(int)) 0x004A8E10)
#define CreateSavegame ((void (__cdecl*)()) 0x00470FA0)
#define WriteSavegame ((int (__cdecl*)(int)) 0x004A8BC0)
#define SAVEGAME_BUFFER_SIZE 1048576
extern GameFlow* g_GameFlow;
extern GameScript* g_GameScript;
extern SAVEGAME_INFO Savegame;
typedef struct SaveGameHeader
{

View file

@ -1,10 +1,16 @@
#include "sound.h"
#include "lara.h"
#include "camera.h"
#include "..\Specific\configuration.h"
#include "..\Specific\level.h""
#include "..\Specific\winmain.h"
HSTREAM BASS_3D_Mixdown;
HFX BASS_FXHandler[NUM_SOUND_FILTERS];
SoundTrackSlot BASS_Soundtrack[NUM_SOUND_TRACK_TYPES];
HSAMPLE SamplePointer[SOUND_MAX_SAMPLES];
SoundEffectSlot SoundSlot[SOUND_MAX_CHANNELS];
char TrackNamePrefix;
const BASS_BFX_FREEVERB BASS_ReverbTypes[NUM_REVERB_TYPES] = // Reverb presets
@ -21,6 +27,8 @@ short SampleLUT[SOUND_NEW_SOUNDMAP_MAX_SIZE];
short SoundMapSize;
int NumSamplesInfos;
SAMPLE_INFO* SampleInfo;
int GlobalMusicVolume;
int GlobalFXVolume;
bool Sound_LoadSample(char *pointer, int compSize, int uncompSize, int index) // Replaces DXCreateSampleADPCM()
{
@ -695,29 +703,7 @@ bool Sound_CheckBASSError(const char* message, bool verbose, ...)
return bassError != 0;
}
void Inject_Sound()
void SayNo()
{
INJECT(0x00479060, SOUND_Stop);
INJECT(0x004790A0, SOUND_Stop); // Seems no difference from SOUND_Stop
INJECT(0x00478FE0, StopSoundEffect);
INJECT(0x00478570, SoundEffect);
INJECT(0x004A3510, Sound_LoadSample); // DXCreateSampleADPCM
INJECT(0x004A3AA0, Sound_FreeSamples); // ReleaseDXSoundBuffers
INJECT(0x00492990, S_CDPlay); // Not really S_CDPlay, but parent singleton function
INJECT(0x00418BC0, S_CDPlayEx); // "S_CDPlayEx" called by CD trigger events
INJECT(0x004929E0, S_CDStop); // S_CDStop
//INJECT(0x004A3100, EmptySoundProc); // DXDSCreate
//INJECT(0x004A3190, EmptySoundProc); // DXCreateSample
//INJECT(0x004A3030, EmptySoundProc); // DXSetOutputFormat
//INJECT(0x004A2E30, EmptySoundProc); // SetSoundOutputFormat
//INJECT(0x004A3300, EmptySoundProc); // StreamOpen
//INJECT(0x004A3470, EmptySoundProc); // StreamClose
//INJECT(0x004931A0, EmptySoundProc); // ACMClose
//INJECT(0x00493490, EmptySoundProc); // ACMStream
//INJECT(0x00492DA0, EmptySoundProc); // ACMInit
//INJECT(0x00492C20, EmptySoundProc); // SetupNotifications
//INJECT(0x00493990, EmptySoundProc); // StartAddress
//INJECT(0x00492B60, EmptySoundProc); // fnCallback
}

View file

@ -2040,8 +2040,8 @@ extern short SampleLUT[SOUND_NEW_SOUNDMAP_MAX_SIZE];
extern short SoundMapSize;
extern int NumSamplesInfos;
extern SAMPLE_INFO* SampleInfo;
#define SayNo ((void (__cdecl*)()) 0x004790E0)
extern int GlobalMusicVolume;
extern int GlobalFXVolume;
long SoundEffect(int effectID, PHD_3DPOS* position, int env_flags);
void StopSoundEffect(short effectID);
@ -2051,6 +2051,7 @@ void SOUND_Stop();
void S_CDPlay(short index, unsigned int mode);
void S_CDPlayEx(short index, DWORD mask, DWORD unknown);
void S_CDStop();
void SayNo();
static void CALLBACK Sound_FinishOneshotTrack(HSYNC handle, DWORD channel, DWORD data, void* userData);
@ -2066,5 +2067,3 @@ float Sound_DistanceToListener(PHD_3DPOS *position);
float Sound_DistanceToListener(Vector3 position);
float Sound_Attenuate(float gain, float distance, float radius);
bool Sound_UpdateEffectPosition(int index, PHD_3DPOS *position, bool force = false);
void Inject_Sound();

View file

@ -1,114 +1,40 @@
#include "sphere.h"
#include "draw.h"
#include "../Specific/roomload.h"
#include "lara.h"
#include "../Specific/level.h"
#include "../Specific/setup.h"
int NumLaraSpheres;
bool GotLaraSpheres;
SPHERE LaraSpheres[34];
SPHERE BaddieSpheres[34];
SPHERE LaraSpheres[MAX_SPHERES];
SPHERE CreatureSpheres[MAX_SPHERES];
int GetSpheres(ITEM_INFO* item, SPHERE* ptr, char worldSpace)
int GetSpheres(ITEM_INFO* item, SPHERE* ptr, int worldSpace, Matrix local)
{
int x, y, z;
if (!item)
return 0;
if (worldSpace & 1)
BoundingSphere spheres[MAX_SPHERES];
short itemNumber = (item - Items);
int num = g_Renderer->GetSpheres(itemNumber, spheres, worldSpace, local);
for (int i = 0; i < MAX_SPHERES; i++)
{
x = item->pos.xPos;
y = item->pos.yPos;
z = item->pos.zPos;
phd_PushUnitMatrix();
MatrixPtr[M03] = 0;
MatrixPtr[M13] = 0;
MatrixPtr[M23] = 0;
}
else
{
x = 0;
y = 0;
z = 0;
phd_PushMatrix();
phd_TranslateAbs(item->pos.xPos, item->pos.yPos, item->pos.zPos);
ptr[i].x = spheres[i].Center.x;
ptr[i].y = spheres[i].Center.y;
ptr[i].z = spheres[i].Center.z;
ptr[i].r = spheres[i].Radius;
}
phd_RotYXZ(item->pos.yRot, item->pos.xRot, item->pos.zRot);
short* frame = GetBestFrame(item);
phd_TranslateRel(frame[6], frame[7], frame[8]);
short* rotation = frame + 9;
gar_RotYXZsuperpack(&rotation, 0);
OBJECT_INFO* obj = &Objects[item->objectNumber];
short** meshPtr = &Meshes[obj->meshIndex];
int* bone = &Bones[obj->boneIndex];
phd_PushMatrix();
short* objPtr = *(meshPtr++);
if (!(worldSpace & 2))
phd_TranslateRel(objPtr[0], objPtr[1], objPtr[2]);
ptr->x = x + (MatrixPtr[M03] >> W2V_SHIFT);
ptr->y = y + (MatrixPtr[M13] >> W2V_SHIFT);
ptr->z = z + (MatrixPtr[M23] >> W2V_SHIFT);
ptr->r = (int)objPtr[3];
ptr++;
phd_PopMatrix();
short* extraRotation = (short*)item->data;
for (int i = obj->nmeshes - 1; i > 0; i--, bone += 3)
{
int poppush = *(bone++);
if (poppush & 1)
phd_PopMatrix();
if (poppush & 2)
phd_PushMatrix();
phd_TranslateRel(*(bone), *(bone + 1), *(bone + 2));
gar_RotYXZsuperpack(&rotation, 0);
if ((poppush & (ROT_X | ROT_Y | ROT_Z)) && extraRotation)
{
if (poppush & ROT_Y)
phd_RotY(*(extraRotation++));
if (poppush & ROT_X)
phd_RotX(*(extraRotation++));
if (poppush & ROT_Z)
phd_RotZ(*(extraRotation++));
}
objPtr = *(meshPtr++);
phd_PushMatrix();
if (!(worldSpace & 2))
phd_TranslateRel(objPtr[0], objPtr[1], objPtr[2]);
ptr->x = x + (MatrixPtr[M03] >> W2V_SHIFT);
ptr->y = y + (MatrixPtr[M13] >> W2V_SHIFT);
ptr->z = z + (MatrixPtr[M23] >> W2V_SHIFT);
ptr->r = (int)objPtr[3];
ptr++;
phd_PopMatrix();
}
phd_PopMatrix();
return obj->nmeshes;
return num;
}
int TestCollision(ITEM_INFO* item, ITEM_INFO* l)
{
int flags = 0;
int num1 = GetSpheres(item, SphereList, 1);
int num1 = GetSpheres(item, CreatureSpheres, SPHERES_SPACE_WORLD, Matrix::Identity);
int num2 = 0;
if (l == LaraItem)
@ -119,7 +45,7 @@ int TestCollision(ITEM_INFO* item, ITEM_INFO* l)
}
else
{
num2 = GetSpheres(l, LaraSpheres, 1);
num2 = GetSpheres(l, LaraSpheres, SPHERES_SPACE_WORLD, Matrix::Identity);
NumLaraSpheres = num2;
if (l == LaraItem)
GotLaraSpheres = true;
@ -129,7 +55,7 @@ int TestCollision(ITEM_INFO* item, ITEM_INFO* l)
{
GotLaraSpheres = false;
num2 = GetSpheres(l, LaraSpheres, 1);
num2 = GetSpheres(l, LaraSpheres, SPHERES_SPACE_WORLD, Matrix::Identity);
NumLaraSpheres = num2;
if (l == LaraItem)
GotLaraSpheres = true;
@ -146,11 +72,11 @@ int TestCollision(ITEM_INFO* item, ITEM_INFO* l)
{
for (int i = 0; i < num1; i++)
{
SPHERE* ptr1 = &SphereList[i];
SPHERE* ptr1 = &CreatureSpheres[i];
int x1 = ptr1->x;
int y1 = ptr1->y;
int z1 = ptr1->z;
int x1 = item->pos.xPos + ptr1->x;
int y1 = item->pos.yPos + ptr1->y;
int z1 = item->pos.zPos + ptr1->z;
int r1 = ptr1->r;
if (r1 > 0)
@ -159,9 +85,9 @@ int TestCollision(ITEM_INFO* item, ITEM_INFO* l)
{
SPHERE* ptr2 = &LaraSpheres[j];
int x2 = ptr2->x;
int y2 = ptr2->y;
int z2 = ptr2->z;
int x2 = item->pos.xPos + ptr2->x;
int y2 = item->pos.yPos + ptr2->y;
int z2 = item->pos.zPos + ptr2->z;
int r2 = ptr2->r;
if (r2 > 0)
@ -188,118 +114,63 @@ int TestCollision(ITEM_INFO* item, ITEM_INFO* l)
}
}
void GetMatrixFromTrAngle(Matrix* matrix, short* frameptr, int index)
{
short* ptr = &frameptr[0];
ptr += 9;
for (int i = 0; i < index; i++)
{
ptr += ((*ptr & 0xc000) == 0 ? 2 : 1);
}
int rot0 = *ptr++;
int frameMode = (rot0 & 0xc000);
int rot1;
int rotX;
int rotY;
int rotZ;
switch (frameMode)
{
case 0:
rot1 = *ptr++;
rotX = ((rot0 & 0x3ff0) >> 4);
rotY = (((rot1 & 0xfc00) >> 10) | ((rot0 & 0xf) << 6) & 0x3ff);
rotZ = ((rot1) & 0x3ff);
*matrix = Matrix::CreateFromYawPitchRoll(rotY * (360.0f / 1024.0f) * RADIAN,
rotX * (360.0f / 1024.0f) * RADIAN,
rotZ * (360.0f / 1024.0f) * RADIAN);
break;
case 0x4000:
*matrix = Matrix::CreateRotationX((rot0 & 0xfff) * (360.0f / 4096.0f) * RADIAN);
break;
case 0x8000:
*matrix = Matrix::CreateRotationY((rot0 & 0xfff) * (360.0f / 4096.0f) * RADIAN);
break;
case 0xc000:
*matrix = Matrix::CreateRotationZ((rot0 & 0xfff) * (360.0f / 4096.0f) * RADIAN);
break;
}
}
void GetJointAbsPosition(ITEM_INFO* item, PHD_VECTOR* vec, int joint)
{
int* MatrixStash = MatrixPtr;
int* IMStash = IMptr;
byte* DxMatrixStash = DxMatrixPtr;
// Get the real item number
short itemNumber = item - Items;
OBJECT_INFO* obj = &Objects[item->objectNumber];
// Use matrices done in the renderer and transform the input vector
Vector3 p = Vector3(vec->x, vec->y, vec->z);
g_Renderer->GetItemAbsBonePosition(itemNumber, &p, joint);
int rate;
short* frmptr[2];
int frac = GetFrame_D2(item, frmptr, &rate);
phd_PushUnitMatrix();
phd_SetTrans(0, 0, 0);
phd_RotYXZ(item->pos.yRot, item->pos.xRot, item->pos.zRot);
short* extraRotation;
if (item->data)
extraRotation = (short*)item->data;
else
extraRotation = NullRotations;
int* bone = &Bones[obj->boneIndex];
if (!frac)
{
phd_TranslateRel((int) * (frmptr[0] + 6), (int) * (frmptr[0] + 7), (int) * (frmptr[0] + 8));
short* rotation1 = frmptr[0] + 9;
gar_RotYXZsuperpack(&rotation1, 0);
for (int i = 0; i < joint; i++, bone += 4)
{
int poppush = bone[0];
if (poppush & 1)
phd_PopMatrix();
if (poppush & 2)
phd_PushMatrix();
phd_TranslateRel(bone[1], bone[2], bone[3]);
gar_RotYXZsuperpack(&rotation1, 0);
if (poppush & (ROT_X | ROT_Y | ROT_Z))
{
if (poppush & ROT_Y)
phd_RotY(*(extraRotation++));
if (poppush & ROT_X)
phd_RotX(*(extraRotation++));
if (poppush & ROT_Z)
phd_RotZ(*(extraRotation++));
}
// Store the result
vec->x = p.x;
vec->y = p.y;
vec->z = p.z;
}
phd_TranslateRel(vec->x, vec->y, vec->z);
vec->x = (MatrixPtr[M03] >> W2V_SHIFT) + item->pos.xPos;
vec->y = (MatrixPtr[M13] >> W2V_SHIFT) + item->pos.yPos;
vec->z = (MatrixPtr[M23] >> W2V_SHIFT) + item->pos.zPos;
}
else
{
InitInterpolate2(frac, rate);
short* rotation1 = frmptr[0] + 9;
short* rotation2 = frmptr[1] + 9;
phd_TranslateRel_ID((int) * (frmptr[0] + 6), (int) * (frmptr[0] + 7), (int) * (frmptr[0] + 8),
(int) * (frmptr[1] + 6), (int) * (frmptr[1] + 7), (int) * (frmptr[1] + 8));
gar_RotYXZsuperpack_I(&rotation1, &rotation2, 0);
for (int i = 0; i < joint; i++, bone += 4)
{
int poppush = bone[0];
if (poppush & 1)
phd_PopMatrix_I();
if (poppush & 2)
phd_PushMatrix_I();
phd_TranslateRel_I(bone[1], bone[2], bone[3]);
gar_RotYXZsuperpack_I(&rotation1, &rotation2, 0);
if (poppush & (ROT_X | ROT_Y | ROT_Z))
{
if (poppush & ROT_Y)
phd_RotY_I(*(extraRotation++));
if (poppush & ROT_X)
phd_RotX_I(*(extraRotation++));
if (poppush & ROT_Z)
phd_RotZ_I(*(extraRotation++));
}
}
phd_TranslateRel_I(vec->x, vec->y, vec->z);
InterpolateMatrix();
vec->x = (MatrixPtr[M03] >> W2V_SHIFT) + item->pos.xPos;
vec->y = (MatrixPtr[M13] >> W2V_SHIFT) + item->pos.yPos;
vec->z = (MatrixPtr[M23] >> W2V_SHIFT) + item->pos.zPos;
}
MatrixPtr = MatrixStash;
IMptr = IMStash;
DxMatrixPtr = DxMatrixStash;
}
void Inject_Sphere()
{
INJECT(0x00479380, GetSpheres);
INJECT(0x00479170, TestCollision);
}

View file

@ -2,18 +2,17 @@
#include "..\Global\global.h"
//#define TestCollision ((int (__cdecl*)(ITEM_INFO*, ITEM_INFO*)) 0x00479170)
//#define GetJointAbsPosition ((int (__cdecl*)(ITEM_INFO*, PHD_VECTOR*, int)) 0x00479780)
//#define GetSpheres ((int (__cdecl*)(ITEM_INFO*, SPHERE*, int)) 0x00479380)
#define InterpolateMatrix ((int (__cdecl*)()) 0x0042C8F0)
#define InitInterpolate2 ((int (__cdecl*)(int, int)) 0x00479BB0)
#define SPHERES_SPACE_LOCAL 0
#define SPHERES_SPACE_WORLD 1
#define SPHERES_SPACE_BONE_ORIGIN 2
#define MAX_SPHERES 34
extern int NumLaraSpheres;
extern bool GotLaraSpheres;
extern SPHERE BaddieSpheres[34];
extern SPHERE LaraSpheres[MAX_SPHERES];
extern SPHERE CreatureSpheres[MAX_SPHERES];
int TestCollision(ITEM_INFO* item, ITEM_INFO* l);
int GetSpheres(ITEM_INFO* item, SPHERE* ptr, char worldSpace);
int GetSpheres(ITEM_INFO* item, SPHERE* ptr, int worldSpace, Matrix local);
void GetJointAbsPosition(ITEM_INFO* item, PHD_VECTOR* vec, int joint);
void Inject_Sphere();
void GetMatrixFromTrAngle(Matrix* matrix, short* frameptr, int index);

View file

@ -1,4 +0,0 @@
#pragma once
#include "..\Global\global.h"

View file

@ -6,6 +6,8 @@
#include "draw.h"
#include "tomb4fx.h"
#include "switch.h"
#include "lara.h"
#include "../Specific/input.h"
int LastSequence;
int SpotcamTimer;
@ -42,6 +44,11 @@ int LaraAir;
int CurrentSpotcamSequence;
SPOTCAM SpotCam[64];
int NumberSpotcams;
int CheckTrigger = 0;
int UseSpotCam = 0;
int SlowMotion;
int SpotcamDontDrawLara;
int SpotcamOverlay;
extern Renderer11* g_Renderer;
@ -467,7 +474,7 @@ void CalculateSpotCameras()
dy = SQUARE(cy - ly);
dz = SQUARE(cz - lz);
tlen = SQRT_ASM(dx + dy + dz);
tlen = sqrt(dx + dy + dz);
if (tlen <= clen)
{
@ -553,7 +560,7 @@ void CalculateSpotCameras()
dy = (Camera.pos.y - QuakeCam.epos.y);
dz = (Camera.pos.z - QuakeCam.epos.z);
if (SQRT_ASM(SQUARE(dx) * SQUARE(dy) * SQUARE(dz)) < QuakeCam.epos.boxNumber)
if (sqrt(SQUARE(dx) * SQUARE(dy) * SQUARE(dz)) < QuakeCam.epos.boxNumber)
{
dz = QuakeCam.spos.roomNumber + (((QuakeCam.epos.roomNumber - QuakeCam.spos.roomNumber) * -QuakeCam.epos.boxNumber) / QuakeCam.epos.boxNumber) >> 1;
dy = QuakeCam.spos.roomNumber + (((QuakeCam.epos.roomNumber - QuakeCam.spos.roomNumber) * -QuakeCam.epos.boxNumber) / QuakeCam.epos.boxNumber);
@ -639,7 +646,7 @@ void CalculateSpotCameras()
QuakeCam.epos.roomNumber = 0;
}
QuakeCam.epos.boxNumber = SQRT_ASM(((QuakeCam.spos.x - QuakeCam.epos.x) * (QuakeCam.spos.x - QuakeCam.epos.x)) + ((QuakeCam.spos.y - QuakeCam.epos.y) * (QuakeCam.spos.y - QuakeCam.epos.y) + ((QuakeCam.spos.z - QuakeCam.epos.z) * (QuakeCam.spos.z - QuakeCam.epos.z))));
QuakeCam.epos.boxNumber = sqrt(((QuakeCam.spos.x - QuakeCam.epos.x) * (QuakeCam.spos.x - QuakeCam.epos.x)) + ((QuakeCam.spos.y - QuakeCam.epos.y) * (QuakeCam.spos.y - QuakeCam.epos.y) + ((QuakeCam.spos.z - QuakeCam.epos.z) * (QuakeCam.spos.z - QuakeCam.epos.z))));
}
else
{
@ -899,9 +906,32 @@ void CalculateSpotCameras()
}
}
void Inject_Spotcam()
// It just works (tm)!
int Spline(int x, int* knots, int nk)
{
INJECT(0x0047A800, InitSpotCamSequences);
INJECT(0x0047A9D0, InitialiseSpotCam);
INJECT(0x0047B280, CalculateSpotCameras);
int64_t v3 = x * (int64_t)(nk - 3) << 16 >> 16;
int32_t v4 = (int32_t)v3 >> 16;
if ((int32_t)v3 >> 16 >= nk - 3)
v4 = nk - 4;
int32_t v5 = knots[v4];
int32_t v6 = knots[v4 + 2];
int32_t nka = knots[v4 + 3] >> 1;
int32_t v7 = knots[v4 + 1];
return (int32_t)(v7
+ (int64_t)(uint64_t)((int32_t)((~v5 >> 1)
+ (v6 >> 1)
+ (int64_t)(uint64_t)((int32_t)(v5
+ (int64_t)(uint64_t)(((~v5 >> 1)
+ nka
+ v7
+ (v7 >> 1)
- (v6 >> 1)
- v6)
* (int64_t)((int32_t)v3 - (v4 << 16)) >> 16)
- 2 * v7
+ 2 * v6
- (v7 >> 1)
- nka)
* (int64_t)((int32_t)v3 - (v4 << 16)) >> 16))
* (int64_t)((int32_t)v3 - (v4 << 16)) >> 16));
}

View file

@ -22,20 +22,16 @@ enum spotcam_flags
SCF_CAMERA_ONE_SHOT = (1 << 15), // 0x8000
};
//#define InitSpotCamSequences ((void (__cdecl*)()) 0x0047A800)
//#define CalculateSpotCameras ((void (__cdecl*)()) 0x0047B280)
//#define InitialiseSpotCam ((void (__cdecl*)(short)) 0x0047A9D0)
#define TriggerTitleSpotcam ((void (__cdecl*)(int)) 0x004284A0)
#define Spline ((int (__cdecl*)(int, int*, int)) 0x0047A890)
extern byte SpotCamRemap[16];
extern byte CameraCnt[16];
extern int LastSpotCam;
extern SPOTCAM SpotCam[64];
extern int NumberSpotcams;
extern int UseSpotCam;
extern int SpotcamDontDrawLara;
extern int SpotcamOverlay;
void InitSpotCamSequences();
void InitialiseSpotCam(short sequence);
void CalculateSpotCameras();
void Inject_Spotcam();
int Spline(int x, int* knots, int nk);

File diff suppressed because it is too large Load diff

View file

View file

@ -11,6 +11,9 @@
#include "sphere.h"
#include "camera.h"
#include "../Specific/setup.h"
#include "..\Specific\level.h"
#include "../Specific/input.h"
#include "sound.h"
byte SequenceUsed[6];
byte SequenceResults[3][3][3];
@ -258,7 +261,7 @@ void CogSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
item->status = ITEM_ACTIVE;
if (!door->opened)
{
AddActiveItem((target - Items) / sizeof(ITEM_INFO));
AddActiveItem((target - Items));
target->itemFlags[2] = target->pos.yPos;
target->status = ITEM_ACTIVE;
}
@ -469,7 +472,7 @@ void CrowbarSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
if (!(Lara.isMoving && g_Inventory->GetSelectedObject() != ID_CROWBAR_ITEM))
{
if (g_LaraExtra.Crowbar)
if (Lara.Crowbar)
g_Inventory->SetEnterObject(ID_CROWBAR_ITEM);
else
{
@ -523,7 +526,7 @@ void CrowbarSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
return;
}
if (g_LaraExtra.Crowbar)
if (Lara.Crowbar)
g_Inventory->SetEnterObject(ID_CROWBAR_ITEM);
else
{
@ -701,8 +704,8 @@ void TurnSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
item->animNumber = Objects[item->objectNumber].animIndex + 4;
item->frameNumber = Anims[item->animNumber].frameBase;
item->itemFlags[0] = 1;
ForcedFixedCamera.x = item->pos.xPos - (1024 * SIN(item->pos.yRot) >> W2V_SHIFT);
ForcedFixedCamera.z = item->pos.zPos - (1024 * COS(item->pos.yRot) >> W2V_SHIFT);
ForcedFixedCamera.x = item->pos.xPos - (1024 * phd_sin(item->pos.yRot) >> W2V_SHIFT);
ForcedFixedCamera.z = item->pos.zPos - (1024 * phd_cos(item->pos.yRot) >> W2V_SHIFT);
Lara.isMoving = 0;
Lara.headYrot = 0;
Lara.headXrot = 0;
@ -743,8 +746,8 @@ void TurnSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
flag = 1;
l->frameNumber = Anims[319].frameBase;
item->itemFlags[0] = 2;
ForcedFixedCamera.x = item->pos.xPos + (1024 * SIN(item->pos.yRot) >> W2V_SHIFT);
ForcedFixedCamera.z = item->pos.zPos + (1024 * COS(item->pos.yRot) >> W2V_SHIFT);
ForcedFixedCamera.x = item->pos.xPos + (1024 * phd_sin(item->pos.yRot) >> W2V_SHIFT);
ForcedFixedCamera.z = item->pos.zPos + (1024 * phd_cos(item->pos.yRot) >> W2V_SHIFT);
}
else
{
@ -971,9 +974,9 @@ void UnderwaterSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
AddActiveItem(itemNum);
ForcedFixedCamera.x = item->pos.xPos - 1024 * SIN(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
ForcedFixedCamera.x = item->pos.xPos - 1024 * phd_sin(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
ForcedFixedCamera.y = item->pos.yPos - 1024;
ForcedFixedCamera.z = item->pos.zPos - 1024 * COS(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
ForcedFixedCamera.z = item->pos.zPos - 1024 * phd_cos(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
ForcedFixedCamera.roomNumber = item->roomNumber;
return;
@ -1002,9 +1005,9 @@ void UnderwaterSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
AddActiveItem(itemNum);
ForcedFixedCamera.x = item->pos.xPos - 1024 * SIN(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
ForcedFixedCamera.x = item->pos.xPos - 1024 * phd_sin(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
ForcedFixedCamera.y = item->pos.yPos - 1024;
ForcedFixedCamera.z = item->pos.zPos - 1024 * COS(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
ForcedFixedCamera.z = item->pos.zPos - 1024 * phd_cos(item->pos.yRot + ANGLE(90)) >> W2V_SHIFT;
ForcedFixedCamera.roomNumber = item->roomNumber;
}
}
@ -1424,26 +1427,3 @@ void ShootSwitchCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll)
if (item->objectNumber == ID_SHOOT_SWITCH1 && !(item->meshBits & 1))
item->status = ITEM_INVISIBLE;
}
void Inject_Switch()
{
INJECT(0x0047FD20, CrowDoveSwitchCollision);
INJECT(0x0047FC80, CrowDoveSwitchControl);
INJECT(0x0047F990, CogSwitchCollision);
INJECT(0x0047F810, CogSwitchControl);
INJECT(0x0047F610, FullBlockSwitchCollision);
INJECT(0x0047F520, FullBlockSwitchControl);
INJECT(0x0047F190, CrowbarSwitchCollision);
INJECT(0x0047F050, JumpSwitchCollision);
INJECT(0x0047EE00, RailSwitchCollision);
INJECT(0x0047E950, TurnSwitchCollision);
INJECT(0x0047E650, TurnSwitchControl);
INJECT(0x0047E450, PulleyCollision);
INJECT(0x0047E220, UnderwaterSwitchCollision);
INJECT(0x0047E0C0, SwitchCollision2);
INJECT(0x0047DC70, SwitchCollision);
INJECT(0x0047D9D0, TestTriggersAtXYZ);
INJECT(0x0047D8C0, GetKeyTrigger);
INJECT(0x0047D7B0, GetSwitchTrigger);
INJECT(0x0047D670, SwitchTrigger);
}

View file

@ -1,12 +1,6 @@
#pragma once
#include "..\Global\global.h"
//#define InitialiseSwitch ((void (__cdecl*)(short)) 0x00440070)
//#define SequenceControl ((void (__cdecl*)(short)) 0x0047F520)
//#define SequenceCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x0047F610)
//#define LeverSwitchCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x0047EE00)
//#define InitialisePulleySwitch ((void (__cdecl*)(short)) 0x0043E1F0)
//#define InitialiseCrowDoveSwitch ((void (__cdecl*)(short)) 0x0043ECF0)
void CrowDoveSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll);
void CrowDoveSwitchControl(short itemNumber);
void CogSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll);
@ -35,5 +29,3 @@ void InitialiseShootSwitch(short itemNumber);
void ShootSwitchCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll);
extern int PulleyItemNumber;
void Inject_Switch();

View file

@ -5,8 +5,3 @@ void PrintString(int x, int y, int unk1, char* string, int unk2)
{
g_Renderer->PrintString(x, y, string, 0xFFFFFFFF, 0);
}
void Inject_Text()
{
INJECT(0x00480BC0, PrintString);
}

View file

@ -2,5 +2,3 @@
#include "draw.h"
void PrintString(int x, int y, int unk1, char* string, int unk2);
void Inject_Text();

View file

@ -5,6 +5,8 @@
#include "draw.h"
#include "items.h"
#include "../Specific/setup.h"
#include "..\Specific\level.h"
#include "sound.h"
#include "bubble.h"
char FlareTable[121] =
@ -834,7 +836,7 @@ void TriggerGunShell(short hand, short objNum, int weaponType)
break;
}
GetLaraJointPosition(&pos, LJ_RHAND);
GetLaraJointPosition(&pos, LM_RHAND);
}
else
{
@ -844,7 +846,7 @@ void TriggerGunShell(short hand, short objNum, int weaponType)
pos.y = 48;
pos.z = 40;
GetLaraJointPosition(&pos, LJ_LHAND);
GetLaraJointPosition(&pos, LM_LHAND);
}
else if (weaponType == WEAPON_UZI)
{
@ -852,7 +854,7 @@ void TriggerGunShell(short hand, short objNum, int weaponType)
pos.y = 35;
pos.z = 48;
GetLaraJointPosition(&pos, LJ_LHAND);
GetLaraJointPosition(&pos, LM_LHAND);
}
}
@ -949,9 +951,9 @@ void UpdateGunShells()
gs->pos.yRot += gs->speed * ANGLE(1);
gs->pos.zRot += ANGLE(23);
gs->pos.xPos += gs->speed * SIN(gs->dirXrot) >> W2V_SHIFT;
gs->pos.xPos += gs->speed * phd_sin(gs->dirXrot) >> W2V_SHIFT;
gs->pos.yPos += gs->fallspeed;
gs->pos.zPos += gs->speed * COS(gs->dirXrot) >> W2V_SHIFT;
gs->pos.zPos += gs->speed * phd_cos(gs->dirXrot) >> W2V_SHIFT;
FLOOR_INFO* floor = GetFloor(gs->pos.xPos, gs->pos.yPos, gs->pos.zPos, &gs->roomNumber);
if (Rooms[gs->roomNumber].flags & ENV_FLAG_WATER
@ -1057,14 +1059,14 @@ void LaraBubbles(ITEM_INFO* item)// (F)
pos.y = -192;
pos.z = -160;
GetLaraJointPosition(&pos, LJ_TORSO);
GetLaraJointPosition(&pos, LM_TORSO);
}
else
{
pos.y = -4;
pos.z = 64;
GetLaraJointPosition(&pos, LJ_HEAD);
GetLaraJointPosition(&pos, LM_HEAD);
}
num = (GetRandomControl() & 1) + 2;
@ -1199,20 +1201,27 @@ void TriggerLaraDrips()// (F)
}
}
int ExplodingDeath2(short itemNumber, int meshBits, short damage)
int ExplodingDeath(short itemNumber, int meshBits, short damage)
{
ITEM_INFO* item = &Items[itemNumber];
OBJECT_INFO* obj = &Objects[item->objectNumber];
ObjectInfo* obj = &Objects[item->objectNumber];
short* frame = GetBestFrame(item);
phd_PushUnitMatrix();
Matrix world = Matrix::CreateFromYawPitchRoll(
TO_RAD(item->pos.yRot),
TO_RAD(item->pos.xRot),
TO_RAD(item->pos.zRot)
);
// PHD_MATH:
/*phd_PushUnitMatrix();
MatrixPtr[M03] = 0;
MatrixPtr[M13] = 0;
MatrixPtr[M23] = 0;
phd_RotYXZ(item->pos.yPos, item->pos.xRot, item->pos.zRot);
phd_RotYXZ(item->pos.yRot, item->pos.xRot, item->pos.zRot);
phd_TranslateRel(frame[6], frame[7], frame[8]);
short* rotation = &frame[9];
@ -1227,13 +1236,15 @@ int ExplodingDeath2(short itemNumber, int meshBits, short damage)
{
if (damage & 0x100 || !(GetRandomControl() & 3))
{
Matrix boneMatrix = g_Renderer->GetBoneMatrix(item, 0);
int fxNumber = CreateNewEffect(item->roomNumber);
if (fxNumber != NO_ITEM)
{
FX_INFO* fx = &Effects[fxNumber];
fx->pos.xPos = item->pos.xPos + (MatrixPtr[M03] >> W2V_SHIFT);
fx->pos.yPos = item->pos.yPos + (MatrixPtr[M13] >> W2V_SHIFT);
fx->pos.zPos = item->pos.zPos + (MatrixPtr[M23] >> W2V_SHIFT);
fx->pos.xPos = item->pos.xPos + boneMatrix.Translation().x; // (MatrixPtr[M03] >> W2V_SHIFT);
fx->pos.yPos = item->pos.yPos + boneMatrix.Translation().y; // (MatrixPtr[M13] >> W2V_SHIFT);
fx->pos.zPos = item->pos.zPos + boneMatrix.Translation().z; // (MatrixPtr[M23] >> W2V_SHIFT);
fx->roomNumber = item->roomNumber;
fx->pos.yRot = 0;
fx->pos.zRot = 0;
@ -1285,42 +1296,20 @@ int ExplodingDeath2(short itemNumber, int meshBits, short damage)
for (int i = 1; i < obj->nmeshes; i++, bone += 3)
{
short popPush = *(bone++);
if (popPush & 1)
{
MatrixPtr -= 12;
DxMatrixPtr -= 48;
}
else if (popPush & 2)
{
phd_PushMatrix();
}
phd_TranslateRel(bone[0], bone[1], bone[2]);
gar_RotYXZsuperpack(&rotation, 0);
if (popPush & (ROT_X | ROT_Y | ROT_Z))
{
if (popPush & ROT_Y)
phd_RotY(*(extraRotation++));
if (popPush & ROT_X)
phd_RotX(*(extraRotation++));
if (popPush & ROT_Z)
phd_RotZ(*(extraRotation++));
}
bits <<= 1;
if (bits & meshBits && bits & item->meshBits && (damage & 0x100 || !(GetRandomControl() & 3)))
{
Matrix boneMatrix = g_Renderer->GetBoneMatrix(item, i);
Matrix matrix = boneMatrix * world;
int fxNumber = CreateNewEffect(item->roomNumber);
if (fxNumber != NO_ITEM)
{
FX_INFO* fx = &Effects[fxNumber];
fx->pos.xPos = item->pos.xPos + (MatrixPtr[3] >> 14);
fx->pos.yPos = item->pos.yPos + (MatrixPtr[7] >> 14);
fx->pos.zPos = item->pos.zPos + (MatrixPtr[11] >> 14);
fx->pos.xPos = item->pos.xPos + matrix.Translation().x; // (MatrixPtr[3] >> 14);
fx->pos.yPos = item->pos.yPos + matrix.Translation().y; // (MatrixPtr[7] >> 14);
fx->pos.zPos = item->pos.zPos + matrix.Translation().z; // (MatrixPtr[11] >> 14);
fx->roomNumber = item->roomNumber;
fx->pos.yRot = 0;
fx->pos.zRot = 0;
@ -1367,10 +1356,7 @@ int ExplodingDeath2(short itemNumber, int meshBits, short damage)
item->meshBits -= bits;
}
}
MatrixPtr -= 12;
DxMatrixPtr = (DxMatrixPtr - 48);
}*/
return (item->meshBits == 0);
}
@ -1433,9 +1419,9 @@ void TriggerShockwaveHitEffect(int x, int y, int z, byte r, byte g, byte b, shor
spark->life = spark->sLife = (GetRandomControl() & 3) + 16;
int speed = (GetRandomControl() & 0xF) + vel;
spark->xVel = speed * 16 * SIN(rot) >> W2V_SHIFT;
spark->xVel = speed * 16 * phd_sin(rot) >> W2V_SHIFT;
spark->yVel = -512 - (GetRandomControl() & 0x1FF);
spark->zVel = speed * 16 * COS(rot) >> W2V_SHIFT;
spark->zVel = speed * 16 * phd_cos(rot) >> W2V_SHIFT;
short angle;
if (GetRandomControl() & 1)
@ -1444,8 +1430,8 @@ void TriggerShockwaveHitEffect(int x, int y, int z, byte r, byte g, byte b, shor
angle = rot - ANGLE(90);
int shift = (GetRandomControl() & 0x1FF) - 256;
x += (shift * SIN(angle) >> W2V_SHIFT);
z += (shift * COS(angle) >> W2V_SHIFT);
x += (shift * phd_sin(angle) >> W2V_SHIFT);
z += (shift * phd_cos(angle) >> W2V_SHIFT);
spark->x = (GetRandomControl() & 0x1F) + x - 16;
spark->y = (GetRandomControl() & 0x1F) + y - 16;
@ -1491,7 +1477,7 @@ void UpdateShockwaves()
int dx = LaraItem->pos.xPos - sw->x;
int dz = LaraItem->pos.zPos - sw->z;
int distance = SQRT_ASM(SQUARE(dx) + SQUARE(dz));
int distance = sqrt(SQUARE(dx) + SQUARE(dz));
if (sw->y <= LaraItem->pos.yPos + frame[2]
|| sw->y >= LaraItem->pos.yPos + frame[3] + 256
@ -1502,7 +1488,7 @@ void UpdateShockwaves()
}
else
{
short angle = ATAN(dz, dx);
short angle = phd_atan(dz, dx);
TriggerShockwaveHitEffect(LaraItem->pos.xPos,
sw->y,
LaraItem->pos.zPos,
@ -1748,9 +1734,9 @@ void TriggerSmallSplash(int x, int y, int z, int num)
angle = GetRandomControl() << 3;
sptr->xVel = -SIN(angle) >> 5;
sptr->xVel = -phd_sin(angle) >> 5;
sptr->yVel = -640 - (GetRandomControl() & 0xFF);
sptr->zVel = COS(angle) >> 5;
sptr->zVel = phd_cos(angle) >> 5;
sptr->friction = 5;
sptr->flags = 0;
@ -1801,35 +1787,3 @@ ENERGY_ARC* TriggerEnergyArc(PHD_VECTOR* start, PHD_VECTOR* end, byte r, byte g,
return arc;
}
void Inject_Tomb4FX()
{
INJECT(0x004827E0, TriggerBlood);
INJECT(0x00431070, TriggerExplosionBubble);
INJECT(0x004812B0, GetFreeFireSpark);
INJECT(0x00481A00, TriggerGlobalStaticFlame);
INJECT(0x004816B0, TriggerGlobalFireSmoke);
INJECT(0x00481840, TriggerGlobalFireFlame);
INJECT(0x00481370, keep_those_fires_burning);
INJECT(0x00481B10, ClearFires);
INJECT(0x00481B10, AddFire);
INJECT(0x004813B0, UpdateFireSparks);
INJECT(0x00481D40, GetFreeSmokeSpark);
INJECT(0x00481DD0, UpdateSmoke);
INJECT(0x004820A0, TriggerGunSmoke);
INJECT(0x004823A0, TriggerShatterSmoke);
INJECT(0x00482580, GetFreeBlood);
INJECT(0x00482610, UpdateBlood);
INJECT(0x004829A0, GetFreeGunshell);
INJECT(0x00482A60, TriggerGunShell);
INJECT(0x00482D80, UpdateGunShells);
INJECT(0x00483180, AddWaterSparks);
INJECT(0x00483470, LaraBubbles);
INJECT(0x00483D00, GetFreeDrip);
INJECT(0x00483D90, UpdateDrips);
INJECT(0x00483F00, TriggerLaraDrips);
INJECT(0x00484080, ExplodingDeath2);
INJECT(0x00484640, GetFreeShockwave);
INJECT(0x00484670, TriggerShockwave);
INJECT(0x004849A0, UpdateShockwaves);
}

View file

@ -73,7 +73,7 @@ void UpdateBubbles();
int GetFreeDrip();
void UpdateDrips();
void TriggerLaraDrips();
int ExplodingDeath2(short itemNumber, int meshBits, short damage);
int ExplodingDeath(short itemNumber, int meshBits, short damage);
int GetFreeShockwave();
void TriggerShockwave(PHD_3DPOS* pos, short innerRad, short outerRad, int speed, char r, char g, char b, char life, short angle, short flags);
void TriggerShockwaveHitEffect(int x, int y, int z, int color, short rot, int vel);
@ -83,5 +83,3 @@ void SetFadeClip(short height, short speed);
void TriggerLightningGlow(int x, int y, int z, byte size, byte r, byte g, byte b);
ENERGY_ARC* TriggerEnergyArc(PHD_VECTOR* start, PHD_VECTOR* end, byte r, byte g, byte b, short segmentSize, short life, short amplitude, byte flags, byte type);
void UpdateEnergyArcs();
void Inject_Tomb4FX();

View file

@ -10,12 +10,19 @@
#include "sphere.h"
#include "camera.h"
#include "objlight.h"
#include "draw.h"
#include "..\Specific\level.h"
#include "../Specific/input.h"
#include "sound.h"
static short CeilingTrapDoorBounds[12] = {-256, 256, 0, 900, -768, -256, -1820, 1820, -5460, 5460, -1820, 1820};
static PHD_VECTOR CeilingTrapDoorPos = {0, 1056, -480};
static short FloorTrapDoorBounds[12] = {-256, 256, 0, 0, -1024, -256, -1820, 1820, -5460, 5460, -1820, 1820};
static PHD_VECTOR FloorTrapDoorPos = {0, 0, -655};
static short WreckingBallData[2] = {0, 0};
ITEM_INFO* WBItem;
short WBRoom;
byte Flame3xzoffs[16][2] =
{
{ 0x09, 0x09 },
@ -218,10 +225,10 @@ void FlameControl(short fxNumber)
GetLaraJointPosition((PHD_VECTOR*)&fx->pos, i);
if (Lara.BurnCount)
if (Lara.burnCount)
{
Lara.BurnCount--;
if (!Lara.BurnCount)
Lara.burnCount--;
if (!Lara.burnCount)
Lara.burnSmoke = true;
}
@ -335,9 +342,9 @@ void CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) /
item->goalAnimState = 1;
UseForcedFixedCamera = 1;
ForcedFixedCamera.x = item->pos.xPos - SIN(item->pos.yRot) / 16;
ForcedFixedCamera.x = item->pos.xPos - phd_sin(item->pos.yRot) / 16;
ForcedFixedCamera.y = item->pos.yPos + 1024;
ForcedFixedCamera.z = item->pos.zPos - COS(item->pos.yRot) / 16;
ForcedFixedCamera.z = item->pos.zPos - phd_cos(item->pos.yRot) / 16;
ForcedFixedCamera.roomNumber = item->roomNumber;
}
else
@ -376,11 +383,11 @@ void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) //
item->goalAnimState = 1;
UseForcedFixedCamera = 1;
ForcedFixedCamera.x = item->pos.xPos - SIN(item->pos.yRot) / 8;
ForcedFixedCamera.x = item->pos.xPos - phd_sin(item->pos.yRot) / 8;
ForcedFixedCamera.y = item->pos.yPos - 2048;
if (ForcedFixedCamera.y < Rooms[item->roomNumber].maxceiling)
ForcedFixedCamera.y = Rooms[item->roomNumber].maxceiling;
ForcedFixedCamera.z = item->pos.zPos - COS(item->pos.yRot) / 8;
ForcedFixedCamera.z = item->pos.zPos - phd_cos(item->pos.yRot) / 8;
ForcedFixedCamera.roomNumber = item->roomNumber;
}
else
@ -555,7 +562,7 @@ void FallingBlockControl(short itemNumber)
else
{
item->meshBits = -2;
ExplodingDeath2(itemNumber, -1, 15265);
ExplodingDeath(itemNumber, -1, 15265);
item->itemFlags[0]++;
}
}
@ -1110,9 +1117,9 @@ void FlameEmitter3Control(short itemNumber)
{
if (item->triggerFlags == 2 || item->triggerFlags == 4)
{
dest.x = item->pos.xPos + 2048 * SIN(item->pos.yRot - ANGLE(180)) >> W2V_SHIFT;
dest.x = item->pos.xPos + 2048 * phd_sin(item->pos.yRot - ANGLE(180)) >> W2V_SHIFT;
dest.y = item->pos.yPos;
dest.z = item->pos.zPos + 2048 * COS(item->pos.yRot - ANGLE(180)) >> W2V_SHIFT;
dest.z = item->pos.zPos + 2048 * phd_cos(item->pos.yRot - ANGLE(180)) >> W2V_SHIFT;
if (GetRandomControl() & 3)
{

View file

@ -2,60 +2,8 @@
#include "..\Global\global.h"
//#define ElectricityWiresControl ((void (__cdecl*)(short)) 0x00442610)
//#define InitialiseRomeHammer ((void (__cdecl*)(short)) 0x0043ECB0)
//#define InitialiseDeathSlide ((void (__cdecl*)(short)) 0x0041CC70)
//#define DeathSlideCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x0041CCE0)
//#define DeathSlideControl ((void (__cdecl*)(short)) 0x0041CE00)
//#define RollingBallCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x0048B6D0)
//#define RollingBallControl ((void (__cdecl*)(short)) 0x0048AE60)
//#define InitialiseTwoBlocksPlatform ((void (__cdecl*)(short)) 0x0043D5D0)
//#define TwoBlocksPlatformControl ((void (__cdecl*)(short)) 0x0048BBB0)
//#define TwoBlocksPlatformFloor ((void (__cdecl*)(ITEM_INFO*,int,int,int,int*)) 0x0048B9E0)
//#define TwoBlocksPlatformCeiling ((void (__cdecl*)(ITEM_INFO*,int,int,int,int*)) 0x0048BA50)
//#define KillAllTriggersControl ((void (__cdecl*)(short)) 0x00431030)
//#define FallingCeilingCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x004127C0)
//#define FallingCeilingControl ((void (__cdecl*)(short)) 0x004899D0)
//#define InitialiseFallingBlock ((void (__cdecl*)(short)) 0x0043D330)
//#define FallingBlockCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x00489750)
//#define FallingBlockControl ((void (__cdecl*)(short)) 0x00489820)
//#define FallingBlockFloor ((void (__cdecl*)(ITEM_INFO*,int,int,int,int*)) 0x00489910)
//#define FallingBlockCeiling ((void (__cdecl*)(ITEM_INFO*,int,int,int,int*)) 0x00489980)
//#define InitialisePushableBlock ((void (__cdecl*)(short)) 0x0045E720)
//#define PushableBlockControl ((void (__cdecl*)(short)) 0x0045EA30)
//#define PushableBlockCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x0045F570)
//#define DartEmitterControl ((void (__cdecl*)(short)) 0x00489B30)
#define DrawDart ((void (__cdecl*)(ITEM_INFO*)) 0x004CBB10)
//#define DartControl ((void (__cdecl*)(short)) 0x00489D60)
//#define InitialiseFlameEmitter ((void (__cdecl*)(short)) 0x0043D370)
//#define FlameEmitterCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x00433B40)
//#define FlameEmitterControl ((void (__cdecl*)(short)) 0x00489F70)
//#define InitialiseFlameEmitter2 ((void (__cdecl*)(short)) 0x0043D4E0)
//#define FlameEmitter2Control ((void (__cdecl*)(short)) 0x0048A3B0)
//#define FlameEmitter3Control ((void (__cdecl*)(short)) 0x0048A570)
//#define FlameControl ((void (__cdecl*)(short)) 0x0048AB80)
#define InitialiseRopeTrap ((void (__cdecl*)()) 0x0046EE40)
//#define GenSlot1Control ((void (__cdecl*)(short)) 0x00406580)
#define InitialiseGenSlot2 ((void (__cdecl*)(short)) 0x0043FD70)
#define GenSlot2Control ((void (__cdecl*)(short)) 0x00488710)
#define DrawGenSlot2 ((void (__cdecl*)(ITEM_INFO*)) 0x004CFF80)
//#define InitialiseGenSlot3 ((void (__cdecl*)(short)) 0x004402E0)
//#define InitialiseGenSlot4 ((void (__cdecl*)(short)) 0x00440440)
#define GenSlot4Control ((void (__cdecl*)(short)) 0x00486450)
//#define InitialiseHighObject1 ((void (__cdecl*)(short)) 0x0043FC30)
//#define HighObject1Control ((void (__cdecl*)(short)) 0x004067E0)
#define InitialisePortal ((void (__cdecl*)(short)) 0x0043FAA0)
#define PortalControl ((void (__cdecl*)(short)) 0x00401AEB)
#define DrawPortal ((void (__cdecl*)(ITEM_INFO*)) 0x004CFF80)
//#define InitialiseWreckingBall ((void (__cdecl*)(short)) 0x0043EF20)
//#define WreckingBallCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x00441D50)
//#define WreckingBallControl ((void (__cdecl*)(short)) 0x00441410)
#define DrawWreckingBall ((void (__cdecl*)(ITEM_INFO*)) 0x00441F50)
//#define InitialiseVentilator ((void (__cdecl*)(short)) 0x0043F3D0)
//#define VentilatorControl ((void (__cdecl*)(short)) 0x00405610)
//#define InitialiseTeethSpike ((void (__cdecl*)(short)) 0x0043FBC0)
//#define TeethSpikeControl ((void (__cdecl*)(short)) 0x0043FBC0)
//#define DrawScaledSpike ((void (__cdecl*)(ITEM_INFO*)) 0x0043FBC0)
extern ITEM_INFO* WBItem;
extern short WBRoom;
void LaraBurn();
void LavaBurn(ITEM_INFO* item);

View file

@ -1 +0,0 @@
#include "twogun.h"

View file

@ -1 +0,0 @@
#pragma once

View file

@ -38,7 +38,7 @@
#define ROT_Y 8
#define ROT_Z 16
// ExplodingDeath2() last argument flags
// ExplodingDeath() last argument flags
#define EXPLODE_HIT_EFFECT 258
#define EXPLODE_NORMAL 256

View file

@ -11,19 +11,13 @@ using namespace DirectX::SimpleMath;
#include "enums.h"
#include "objectslist.h"
#include "types.h"
#include "vars.h"
#include "math.h"
#include "macros.h"
#include "malloc.h"
#include "legacyfunctions.h"
#include "..\Scripting\GameLogicScript.h"
#include "..\Scripting\GameFlowScript.h"
#include "..\Renderer\Renderer11.h"
#define DB_Log ((HWND (__cdecl*)(short, const char*)) 0x004DEB10)
#pragma warning(disable:4996)
extern HMODULE g_DllHandle;

View file

@ -1,151 +0,0 @@
#pragma once
#include "types.h"
// BOX.CPP
#define Legacy_CreatureActive ((int (__cdecl*)(short)) 0x00408630)
#define Legacy_CreatureUnderwater ((void (__cdecl*)(ITEM_INFO*, int)) 0x0040B400)
#define Legacy_CreatureFloat ((int (__cdecl*)(short)) 0x0040B2C0)
#define Legacy_CreatureDie ((void (__cdecl*)(short, int)) 0x0040A090)
#define Legacy_CreatureAIInfo ((void (__cdecl*)(ITEM_INFO*, AI_INFO*)) 0x004086C0)
#define Legacy_CreatureMood ((void (__cdecl*)(ITEM_INFO*, AI_INFO*, int)) 0x00409370)
#define Legacy_GetCreatureMood ((void (__cdecl*)(ITEM_INFO*, AI_INFO*, int)) 0x004090A0)
#define Legacy_CreatureEffect ((short (__cdecl*)(ITEM_INFO*, BITE_INFO*, short(*)(int, int, int, short, short, short))) 0x0040B4D0)
#define Legacy_CreatureEffect2 ((short (__cdecl*)(ITEM_INFO*, BITE_INFO*, short, short, short(*)(int, int, int, short, short, short))) 0x0040B550)
#define Legacy_CreatureTilt ((void (__cdecl*)(ITEM_INFO*, short)) 0x0040B1B0)
#define Legacy_CreatureJoint ((void (__cdecl*)(ITEM_INFO*, short, short)) 0x0040B240)
#define Legacy_CreatureAnimation ((void (__cdecl*)(short, short, short)) 0x0040A1D0)
#define Legacy_InitialiseCreature ((void (__cdecl*)(short)) 0x00408550)
#define Legacy_CreatureKill ((void (__cdecl*)(ITEM_INFO*, int, int, int)) 0x0040B820)
#define Legacy_AlertAllGuards ((void (__cdecl*)(short)) 0x0040BA70)
#define Legacy_AlertNearbyGuards ((void (__cdecl*)(ITEM_INFO*)) 0x0040BB10)
#define Legacy_MoveCreature3DPos ((int(__cdecl*)(PHD_3DPOS*, PHD_3DPOS*, int, short, short)) 0x0040C460)
#define Legacy_CalculateTarget ((int(__cdecl*)(PHD_VECTOR*, ITEM_INFO*, LOT_INFO*)) 0x004098B0)
#define Legacy_ValidBox ((int(__cdecl*)(ITEM_INFO*, short, short)) 0x00408FD0)
#define Legacy_StalkBox ((int(__cdecl*)(ITEM_INFO*, ITEM_INFO*, short)) 0x00409770)
#define Legacy_TargetBox ((int(__cdecl*)(LOT_INFO*, short)) 0x00408E20)
#define Legacy_EscapeBox ((int(__cdecl*)(ITEM_INFO*, ITEM_INFO*, short)) 0x00408EF0)
#define Legacy_BadFloor ((int(__cdecl*)(int, int, int, int, int, short, LOT_INFO*)) 0x00409FB0)
#define Legacy_CreatureCreature ((int(__cdecl*)(short)) 0x00409E20)
#define Legacy_DropBaddyPickups ((int(__cdecl*)(ITEM_INFO*)) 0x0040C5A0)
#define Legacy_CreatureCollision ((void (__cdecl*)(short, ITEM_INFO*, COLL_INFO*)) 0x004124E0)
#define Legacy_CreatureTurn ((short (__cdecl*)(ITEM_INFO*, short)) 0x0040AE90)
#define Legacy_AIGuard ((short(__cdecl*)(CREATURE_INFO*)) 0x0040BBE0)
#define Legacy_GetAITarget ((void(__cdecl*)(CREATURE_INFO*)) 0x0040BCC0)
#define Legacy_FindAIObject ((int(__cdecl*)(CREATURE_INFO*,short)) 0x0040C070)
#define Legacy_SameZoneAIObject ((int(__cdecl*)(CREATURE_INFO*,short)) 0x0040C460)
// CAMERA.CPP
#define Legacy_InitialiseCamera ((void (__cdecl*)()) 0x0040C690)
#define Legacy_MoveCamera ((int(__cdecl*)(GAME_VECTOR*,int)) 0x0040C7A0)
#define Legacy_ChaseCamera ((int(__cdecl*)(ITEM_INFO*)) 0x0040D150)
#define Legacy_CombatCamera ((int(__cdecl*)(ITEM_INFO*)) 0x0040D640)
#define Legacy_LookCamera ((void(__cdecl*)(ITEM_INFO*)) 0x0040DC10)
#define Legacy_FixedCamera ((void(__cdecl*)()) 0x0040E890)
#define Legacy_CalculateCamera ((void(__cdecl*)()) 0x0040ED30)
#define Legacy_BinocularCamera ((void(__cdecl*)()) 0x0040FC20)
#define Legacy_RefreshCamera ((void(__cdecl*)(short,short*)) 0x004165E0)
#define Legacy_CameraCollisionBounds ((int (__cdecl*)(GAME_VECTOR*,int,int)) 0x0040F5C0)
#define Legacy_do_new_cutscene_camera ((void(__cdecl*)()) 0x00421480)
#define Legacy_SaveD3DCameraMatrix ((void(__cdecl*)()) 0x00497280)
#define Legacy_UnknownCamera ((void(__cdecl*)()) 0x004975D0)
// COLLIDE.CPP
#define Legacy_GenericSphereBoxCollision ((void (__cdecl*)(short, ITEM_INFO*, COLL_INFO*)) 0x00413A90)
// CONTROL.CPP
#define Legacy_GetCeiling ((int (__cdecl*)(FLOOR_INFO*, int, int, int)) 0x00417640)
#define Legacy_GetRandomControl ((int (__cdecl*)()) 0x004A7C10)
#define Legacy_AnimateItem ((void (__cdecl*)(ITEM_INFO*)) 0x00415300)
#define Legacy_GetChange ((int (__cdecl*)(ITEM_INFO*, ANIM_STRUCT*)) 0x00415890)
#define Legacy_KillMoveItems ((void (__cdecl*)()) 0x00414620)
#define Legacy_KillMoveEffects ((void (__cdecl*)()) 0x004146A0)
#define Legacy_ClearDynamics ((void (__cdecl*)()) 0x00431530)
#define Legacy_ClearFires ((void (__cdecl*)()) 0x00481B10)
#define Legacy_UpdateSparks ((void (__cdecl*)()) 0x0042E8B0)
#define Legacy_UpdateFireSparks ((void (__cdecl*)()) 0x004813B0)
#define Legacy_UpdateSmoke ((void (__cdecl*)()) 0x00481DD0)
#define Legacy_UpdateBlood ((void (__cdecl*)()) 0x00482610)
#define Legacy_UpdateBubbles ((void (__cdecl*)()) 0x00483540)
#define Legacy_UpdateSplashes ((void (__cdecl*)()) 0x00430710)
#define Legacy_UpdateDebris ((void (__cdecl*)()) 0x0041D500)
#define Legacy_UpdateDrips ((void (__cdecl*)()) 0x00483D90)
#define Legacy_UpdateGunShells ((void (__cdecl*)()) 0x00482D80)
#define Legacy_UpdateBats ((void (__cdecl*)()) 0x00407FD0)
#define Legacy_UpdateRats ((void (__cdecl*)()) 0x0046AC70)
#define Legacy_LavaBurn ((void (__cdecl*)(ITEM_INFO*)) 0x0048ADD0)
#define Legacy_RefreshCamera ((void (__cdecl*)(short, short*)) 0x004165E0)
#define Legacy_DoFlipMap ((void (__cdecl*)(short)) 0x00418910)
#define Legacy_PlaySoundTrack ((void (__cdecl*)(short, short)) 0x00418B90)
#define Legacy_AlterFloorHeight ((void (__cdecl*)(ITEM_INFO*, int)) 0x004159F0)
#define Legacy_ObjectOnLOS2 ((int (__cdecl*)(GAME_VECTOR*, GAME_VECTOR*, PHD_VECTOR*, BITE_INFO*)) 0x00419110)
#define Legacy_LOS ((int (__cdecl*)(GAME_VECTOR*, GAME_VECTOR*)) 0x00417CF0)
#define Legacy_GetTargetOnLOS ((int (__cdecl*)(GAME_VECTOR*, GAME_VECTOR*, int, int)) 0x0041A170)
#define Legacy_RumbleScreen ((void (__cdecl*)()) 0x00442C90)
#define Legacy_UpdateShockwaves ((void (__cdecl*)()) 0x004849A0)
#define Legacy_GetFloor ((FLOOR_INFO* (__cdecl*)(int, int, int, short*)) 0x00415B20)
#define Legacy_GetFloorHeight ((int (__cdecl*)(FLOOR_INFO*, int, int, int)) 0x00415FB0)
#define Legacy_GetWaterHeight ((int (__cdecl*)(int, int, int, short)) 0x00415DA0)
#define Legacy_UpdateSpiders ((void (__cdecl*)()) 0x0047A340)
#define Legacy_UpdateLightning ((void (__cdecl*)()) 0x00484CB0)
// DOOR.CPP
#define Legacy_InitialiseDoor ((void (__cdecl*)(short)) 0x0043DB60)
#define Legacy_DrawLiftDoor ((void (__cdecl*)(ITEM_INFO*)) 0x0045AAF0)
#define Legacy_DoubleDoorControl ((void (__cdecl*)(short)) 0x00429840)
#define Legacy_InitialiseSteelDoor ((void (__cdecl*)(short)) 0x0043F180)
#define Legacy_SteelDoorControl ((void (__cdecl*)(short)) 0x00486BE0)
#define Legacy_SteelDoorCollision ((void (__cdecl*)(short,ITEM_INFO*,COLL_INFO*)) 0x00487AD0)
// DRAW.CPP
#define Legacy_UpdateStorm ((void (__cdecl*)()) 0x0042A310)
// EFFECT2.CPP
#define Legacy_DetatchSpark ((SPARKS* (__cdecl*)(int, int)) 0x0042E6A0)
#define Legacy_AddWaterSparks ((void (__cdecl*)(int, int, int, int)) 0x00483180)
#define Legacy_TriggerUnderwaterExplosion ((void (__cdecl*)(ITEM_INFO*)) 0x0044F500)
#define Legacy_TriggerExplosionSparks ((void (__cdecl*)(int, int, int, int, int, int, short)) 0x0042F610)
#define Legacy_GetFreeSpark ((short (__cdecl*)()) 0x0042E790)
#define Legacy_GetFreeDrip ((short (__cdecl*)()) 0x00483D00)
#define Legacy_GetFreeSmokeSpark ((short (__cdecl*)()) 0x00481D40)
#define Legacy_TriggerDartSmoke ((void (__cdecl*)(int, int, int, int, int, int)) 0x00430D90)
#define Legacy_TriggerGunShell ((void (__cdecl*)(short, int, int)) 0x00482A60)
#define Legacy_TriggerLaraDrips ((void (__cdecl*)()) 0x00483F00)
#define Legacy_SetupRipple ((void (__cdecl*)(int, int, int, int, int)) 0x00430910)
#define Legacy_TriggerShockwave ((void (__cdecl*)(PHD_3DPOS*, int, int, int, int, int)) 0x00484670)
#define Legacy_TriggerExplosionBubbles ((void (__cdecl*)(int, int, int, short)) 0x00431070)
#define Legacy_AddFire ((void (__cdecl*)(int, int, int, byte, short, int)) 0x00481B40)
#define Legacy_ControlWaterfallMist ((void (__cdecl*)(short)) 0x00432CA0)
#define Legacy_TriggerRicochetSparks ((void (__cdecl*)(GAME_VECTOR*, short, int, int)) 0x0042F060)
// EFFECTS.CPP
#define Legacy_DoBloodSplat ((short (__cdecl*)(int, int, int, short, short, short)) 0x00432760)
#define Legacy_CreateBubble ((short (__cdecl*)(PHD_3DPOS*, short, int)) 0x0043C6C0);
#define Legacy_SetupRipple ((void (__cdecl*)(int, int, int, byte, byte)) 0x00430910);
// EFFECT2.CPP
#define Legacy_InitialiseSmokeEmitter ((void (__cdecl*)(short)) 0x0043D9D0)
#define Legacy_SmokeEmitterControl ((void (__cdecl*)(short)) 0x00431560)
// HEALT.CPP
#define Legacy_FlashIt ((int (__cdecl*)()) 0x00439C10)
#define Legacy_UpdateHealtBar ((void (__cdecl*)(int)) 0x00439E50)
#define Legacy_UpdateAirBar ((void (__cdecl*)(int)) 0x00439FC0)
// ITEMS.CPP
#define Legacy_ItemNewRoom ((void (__cdecl*)(short, short)) 0x00440DA0)
#define Legacy_EffectNewRoom ((void (__cdecl*)(short, short)) 0x004412F0)
#define Legacy_KillEffect ((void (__cdecl*)(short)) 0x00441180)
#define Legacy_CreateNewEffect ((short (__cdecl*)(short)) 0x004410F0)
#define Legacy_InitialiseFXArray ((void (__cdecl*)(int)) 0x00441080)
#define Legacy_AddActiveItem ((void (__cdecl*)(short)) 0x00440D10)
#define Legacy_RemoveActiveItem ((void (__cdecl*)(short)) 0x00440B60)
#define Legacy_RemoveDrawnItem ((void (__cdecl*)(short)) 0x00440C40)
#define Legacy_InitialiseItem ((void (__cdecl*)(short)) 0x004408B0)
#define Legacy_CreateItem ((short (__cdecl*)()) 0x00440840)
#define Legacy_KillItem ((void (__cdecl*)(short)) 0x00440620)
#define Legacy_ItemNearLara ((int (__cdecl*)(PHD_3DPOS*, int)) 0x00432580)
#define Legacy_TranslateItem ((void (__cdecl*)(ITEM_INFO*, int, int, int)) 0x00415960)
// LARA.CPP
#define Legacy_AnimateLara ((int (__cdecl*)(ITEM_INFO*)) 0x004563F0)

View file

@ -2,66 +2,42 @@
#include <stdlib.h>
#include "..\Global\global.h"
char* GameMalloc(int size)
{
//printf("Size: %d, MallocFree: %d\n", size, MallocFree);
return GameMallocReal(size);
}
char* malloc_buffer;
int malloc_size;
char* malloc_ptr;
int malloc_free;
int malloc_used;
/*
void InitGameMalloc()
char* game_malloc(int size)
{
char* buffer = (char*)malloc(GAME_BUFFER_SIZE);
MallocBuffer = buffer;
MallocSize = GAME_BUFFER_SIZE;
MallocPtr = buffer;
MallocFree = GAME_BUFFER_SIZE;
MallocUsed = 0;
}
char* ptr;
char* GameMalloc(int size)
size = (size + 3) & 0xfffffffc;
if (size <= malloc_free)
{
int memSize = (size + 3) & -4;
if (memSize > MallocFree)
{
DB_Log(0, "Out of memory");
return NULL;
}
else
{
char* ptr = MallocPtr;
MallocFree -= memSize;
MallocUsed += memSize;
MallocPtr += memSize;
memset(ptr, 0, 4 * (memSize >> 2));
ptr = malloc_ptr;
malloc_free -= size;
malloc_used += size;
malloc_ptr += size;
return ptr;
}
return 0;
}
void GameFree(int size)
void init_game_malloc()
{
int memSize = (size + 3) & -4;
MallocPtr -= memSize;
MallocFree += memSize;
MallocUsed -= memSize;
malloc_size = 1048576 * 128;
malloc_buffer = (char*)malloc(malloc_size);
malloc_ptr = malloc_buffer;
malloc_free = malloc_size;
malloc_used = 0;
}
void* Malloc(int size)
void game_free(int size, int type)
{
return malloc(size);
}
void Free(void* ptr)
{
free(ptr);
}*/
void Inject_Malloc()
{
INJECT(0x0040101E, GameMalloc);
/*INJECT(0x004A7CB0, InitGameMalloc);
INJECT(0x0040101E, GameMalloc);
INJECT(0x00403116, GameFree);
INJECT(0x004E2220, Malloc);
INJECT(0x004E2C90, Free);*/
size = (size + 3) & (~3);
malloc_ptr -= size;
malloc_free += size;
malloc_used -= size;
}

View file

@ -1,14 +1,11 @@
#pragma once
#define MallocBuffer VAR_U_(0x00E4B10C, char*)
#define MallocSize VAR_U_(0x00E4B058, int)
#define MallocPtr VAR_U_(0x00E4B0DC, char*)
#define MallocFree VAR_U_(0x00E4B0F4, int)
#define MallocUsed VAR_U_(0x00E4B0F0, int)
extern char* malloc_buffer;
extern int malloc_size;
extern char* malloc_ptr;
extern int malloc_free;
extern int malloc_used;
#define InitGameMalloc ((void (__cdecl*)()) 0x004A7CB0)
#define GameMallocReal ((char* (__cdecl*)(int)) 0x004A7D00)
char* GameMalloc(int size);
void Inject_Malloc();
char* game_malloc(int size);
void init_game_malloc();
void game_free(int size, int type);

File diff suppressed because it is too large Load diff

View file

@ -1,32 +1,40 @@
#pragma once
#include "vodoo.h"
#include "types.h"
#define PI 3.14159265358979323846f
#define RADIAN 0.01745329252f
#define rcossin_tbl ARRAY_(0x0050B46C, short, [8192])
#define SQUARE(x) ((x)*(x))
#define CLAMP(x, a, b) ((x)<(a)?(a):((x)>(b)?(b):(x)))
#define SIGN(x) ((0 < (x)) - ((x) < 0))
#define CLAMPADD(x, a, b) ((x)<(a)?((x)+(a)):((x)>(b)?((x)-(b)):0))
#define ONE_DEGREE 182
#define CLICK(x) ((x) * STEP_SIZE)
#define SECTOR(x) ((x) * WALL_SIZE)
#define SQRT_ASM ((int(__cdecl*)(int)) 0x0048F980)
#define ATAN ((int(__cdecl*)(int, int)) 0x0048F8A0)
#define SIN(x) (4 * rcossin_tbl[(int(x) >> 3) & 8190])
#define COS(x) (4 * rcossin_tbl[((int(x) >> 3) & 8190) + 1])
#define TO_DEGREES(x) ((x) / 65536.0f * 360.0f)
#define TO_RAD(x) ((x) / 65536.0f * 360.0f * RADIAN)
//#define ATAN ((int(__cdecl*)(int, int)) 0x0048F8A0)
short ANGLE(float angle);
float TR_ANGLE_TO_DEGREES(short angle);
float TR_ANGLE_TO_RAD(short angle);
extern short rcossin_tbl[8192];
int phd_sin(short a);
int phd_cos(short a);
float ANGLEF(short angle);
// returns a float between 0-1
const float frand();
const float frandMinMax(float min, float max);
const float lerp(float v0, float v1, float t);
int mGetAngle(int x1, int y1, int x2, int y2);
int phd_atan(int dz, int dx);
void phd_GetVectorAngles(int x, int y, int z, short* angles);
void phd_RotBoundingBoxNoPersp(PHD_3DPOS* pos, short* bounds, short* tbounds);

View file

@ -1,7 +1,6 @@
#pragma once
#include <Windows.h>
#include "enums.h"
#include <fixed_point.h>
#pragma pack(push, 1)
typedef struct vector_t
@ -283,132 +282,6 @@ typedef struct fx_info_t
short flag2; // size=0, offset=40
} FX_INFO;
typedef struct lara_info_t {
short itemNumber; // size=0, offset=0
short gunStatus; // size=0, offset=2
short gunType; // size=0, offset=4
short requestGunType; // size=0, offset=6
short lastGunType; // size=0, offset=8
short calcFallSpeed; // size=0, offset=10
short waterStatus; // size=0, offset=12
short climbStatus; // size=0, offset=14
short poseCount; // size=0, offset=16
short hitFrame; // size=0, offset=18
short hitDirection; // size=0, offset=20
short air; // size=0, offset=22
short diveCount; // size=0, offset=24
short deathCount; // size=0, offset=26
short currentActive; // size=0, offset=28
short currentXvel; // size=0, offset=30
short currentYvel; // size=0, offset=32
short currentZvel; // size=0, offset=34
short spazEffectCount; // size=0, offset=36
short flareAge; // size=0, offset=38
short BurnCount; // size=0, offset=40
short weaponItem; // size=0, offset=42
short backGun; // size=0, offset=44
short flareFrame; // size=0, offset=46
short poisoned; // size=0, offset=48
short dpoisoned; // size=0, offset=50
unsigned char anxiety; // size=0, offset=52
unsigned char wet[15]; // size=15, offset=53
unsigned short flareControlLeft : 1; // offset=68.0
unsigned short unused1 : 1; // offset=68.1
unsigned short look : 1; // offset=68.2
unsigned short burn : 1; // offset=68.3
unsigned short keepDucked : 1; // offset=68.4
unsigned short isMoving : 1; // offset=68.5
unsigned short canMonkeySwing : 1; // offset=68.6
unsigned short burnBlue : 2; // offset=68.7
unsigned short gassed : 1; // offset=69.1
unsigned short burnSmoke : 1; // offset=69.2
unsigned short isDucked : 1; // offset=69.3
unsigned short hasFired : 1; // offset=69.4
unsigned short busy : 1; // offset=69.5
unsigned short litTorch : 1; // offset=69.6
unsigned short isClimbing : 1; // offset=69.7
unsigned short fired : 1; // offset=70.0
int waterSurfaceDist; // size=0, offset=72
PHD_VECTOR lastPos; // size=12, offset=76
FX_INFO* spazEffect; // size=44, offset=88
int meshEffects; // size=0, offset=92
short* meshPtrs[15]; // size=60, offset=96
ITEM_INFO* target; // size=144, offset=156
short targetAngles[2]; // size=4, offset=160
short turnRate; // size=0, offset=164
short moveAngle; // size=0, offset=166
short headYrot; // size=0, offset=168
short headXrot; // size=0, offset=170
short headZrot; // size=0, offset=172
short torsoYrot; // size=0, offset=174
short torsoXrot; // size=0, offset=176
short torsoZrot; // size=0, offset=178
LARA_ARM leftArm; // size=20, offset=180
LARA_ARM rightArm; // size=20, offset=200
unsigned short holster; // size=0, offset=220
CREATURE_INFO* creature; // size=228, offset=224
int cornerX; // size=0, offset=228
int cornerZ; // size=0, offset=232
byte ropeSegment; // size=0, offset=236
byte ropeDirection; // size=0, offset=237
short ropeArcFront; // size=0, offset=238
short ropeArcBack; // size=0, offset=240
short ropeLastX; // size=0, offset=242
short ropeMaxXForward; // size=0, offset=244
short ropeMaxXBackward; // size=0, offset=246
int ropeDFrame; // size=0, offset=248
int ropeFrame; // size=0, offset=252
unsigned short ropeFrameRate; // size=0, offset=256
unsigned short ropeY; // size=0, offset=258
int ropePtr; // size=0, offset=260
void* generalPtr; // size=0, offset=264
int ropeOffset; // size=0, offset=268
int ropeDownVel; // size=0, offset=272
byte ropeFlag; // size=0, offset=276
byte moveCount; // size=0, offset=277
int ropeCount; // size=0, offset=280
byte skelebob; // size=0, offset=284
byte Legacy_pistolsTypeCarried; // size=0, offset=285
byte Legacy_uzisTypeCarried; // size=0, offset=286
byte Legacy_shotgunTypeCarried; // size=0, offset=287
byte Legacy_crossbowTypeCarried; // size=0, offset=288
byte Legacy_HKtypeCarried; // size=0, offset=289
byte Legacy_sixshooterTypeCarried; // size=0, offset=290
byte Legacy_laserSight; // size=0, offset=291
byte Legacy_silencer; // size=0, offset=292
byte Legacy_binoculars; // size=0, offset=293
byte Legacy_crowbar; // size=0, offset=294
byte Legacy_examine1; // size=0, offset=295
byte Legacy_examine2; // size=0, offset=296
byte Legacy_examine3; // size=0, offset=297
byte wetcloth; // size=0, offset=298
byte bottle; // size=0, offset=299
byte Legacy_puzzleItems[12]; // size=12, offset=300
unsigned short Legacy_puzzleItemsCombo; // size=0, offset=312
unsigned short Legacy_keyItems; // size=0, offset=314
unsigned short Legacy_keyItemsCombo; // size=0, offset=316
unsigned short Legacy_pickupItems; // size=0, offset=318
unsigned short Legacy_pickupItemsCombo; // size=0, offset=320
short Legacy_numSmallMedipack; // size=0, offset=322
short Legacy_numLargeMedipack; // size=0, offset=324
short Legacy_numFlares; // size=0, offset=326
short Legacy_numPistolsAmmo; // size=0, offset=328
short Legacy_numUziAmmo; // size=0, offset=330
short Legacy_numRevolverAmmo; // size=0, offset=332
short Legacy_numShotgunAmmo1; // size=0, offset=334
short Legacy_numShotgunAmmo2; // size=0, offset=336
short Legacy_numHKammo1; // size=0, offset=338
short Legacy_numCrossbowAmmo1; // size=0, offset=340
short Legacy_numCrossbowAmmo2; // size=0, offset=342
byte location; // size=0, offset=344
byte highestLocation; // size=0, offset=345
byte locationPad; // size=0, offset=346
unsigned char tightRopeOnCount; // size=0, offset=347
unsigned char tightRopeOff; // size=0, offset=348
unsigned char tightRopeFall; // size=0, offset=349
unsigned char chaffTimer; // size=0, offset=350
} LARA_INFO;
typedef struct coll_info_t
{
int midFloor; // size=0, offset=0
@ -467,43 +340,6 @@ typedef struct aiobject_t
short boxNumber; // size=0, offset=22
} AIOBJECT;
typedef struct object_info_t {
short nmeshes; // size=0, offset=0
short meshIndex; // size=0, offset=2
int boneIndex; // size=0, offset=4
short* frameBase; // size=0, offset=8
void(*initialise)(short itemNumber); // size=0, offset=12
void(*control)(short itemNumber); // size=0, offset=16
void(*floor)(ITEM_INFO* item, int x, int y, int z, int* height); // size=0, offset=20
void(*ceiling)(ITEM_INFO* item, int x, int y, int z, int* height); // size=0, offset=24
void(*drawRoutine)(ITEM_INFO* item); // size=0, offset=28
void(*collision)(short item_num, ITEM_INFO* laraitem, COLL_INFO* coll); // size=0, offset=32
short zoneType; // size=0, offset=36
short animIndex; // size=0, offset=38
short hitPoints; // size=0, offset=40
short pivotLength; // size=0, offset=42
short radius; // size=0, offset=44
short shadowSize; // size=0, offset=46
short biteOffset; // size=0, offset=48
unsigned short loaded : 1; // offset=50.0
unsigned short intelligent : 1; // offset=50.1
unsigned short nonLot : 1; // offset=50.2
unsigned short savePosition : 1; // offset=50.3
unsigned short saveHitpoints : 1; // offset=50.4
unsigned short saveFlags : 1; // offset=50.5
unsigned short saveAnim : 1; // offset=50.6
unsigned short semiTransparent : 1; // offset=50.7
unsigned short waterCreature : 1; // offset=51.0
unsigned short usingDrawAnimatingItem : 1; // offset=51.1
unsigned short hitEffect : 2; // offset=51.2
unsigned short undead : 1; // offset=51.4
unsigned short saveMesh : 1; // offset=51.5
unsigned short unknown : 2; // offset=51.6
void(*drawRoutineExtra)(ITEM_INFO* item); // size=0, offset=52
unsigned int explodableMeshbits; // size=0, offset=56
int meshSwapSlot;
} OBJECT_INFO;
typedef struct tr5_room_layer_t // 56 bytes
{
unsigned int NumLayerVertices; // Number of vertices in this layer (4 bytes)
@ -915,7 +751,6 @@ typedef struct savegame_info
unsigned char ControlOption; // size=0, offset=10
unsigned char VibrateOn; // size=0, offset=11
unsigned char AutoTarget; // size=0, offset=12
LARA_INFO Lara; // size=352, offset=16
STATS Level; // size=20, offset=368
STATS Game; // size=20, offset=388
short WeaponObject; // size=0, offset=408

View file

@ -1,209 +0,0 @@
#pragma once
#include "..\Game\sound.h"
//#define Camera VAR_U_(0x00EEF940, CAMERA_INFO)
//#define ForcedFixedCamera VAR_U_(0x00EEFA20, GAME_VECTOR)
//#define UseForcedFixedCamera VAR_U_(0x00EEFA50, char)
#define MallocBuffer VAR_U_(0x00E4B10C, char*)
#define MallocSize VAR_U_(0x00E4B058, int)
#define MallocPtr VAR_U_(0x00E4B0DC, char*)
#define MallocFree VAR_U_(0x00E4B0F4, int)
#define MallocUsed VAR_U_(0x00E4B0F0, int)
#define Items VAR_U_(0x00EEEFF0, ITEM_INFO*)
#define Effects VAR_U_(0x00E5C5E0, FX_INFO*)
#define nAIObjects VAR_U_(0x00E5B842, short)
#define LevelItems VAR_U_(0x0051CEB8, int)
#define AIObjects VAR_U_(0x00E5B844, AIOBJECT*)
#define Rooms VAR_U_(0x00875154, ROOM_INFO*)
#define Anims VAR_U_(0x00875158, ANIM_STRUCT*)
#define Bones VAR_U_(0x00875178, int*)
#define Changes VAR_U_(0x0087515C, CHANGE_STRUCT*)
#define Ranges VAR_U_(0x00875160, RANGE_STRUCT*)
#define Frames VAR_U_(0x00875174, short*)
#define Commands VAR_U_(0x0087517C, short*)
#define MeshesCount VAR_U_(0x00875140, int)
#define AnimationsCount VAR_U_(0x00875150, int)
#define FloorData VAR_U_(0x00875168, short*)
#define ObjectTextures VAR_U_(0x008751B0, OBJECT_TEXTURE*)
#define RoomLightsCount VAR_U_(0x0087B0EC, int)
#define NumberRooms VAR_U_(0x0087514C, short)
#define nAnimUVRanges VAR_U_(0x0087495C, int)
#define LevelFilePtr VAR_U_(0x00875164, FILE*)
//#define NumberCameras VAR_U_(0x00EEFAC0, int)
//#define Cameras VAR_U_(0x00EEF9A2, OBJECT_VECTOR*)
#define LaraItem VAR_U_(0x00E5BF08, ITEM_INFO*)
#define Lara VAR_U_(0x00E5BD60, LARA_INFO)
#define LaraDrawType VAR_U_(0x00EEEAD0, char)
#define Frames VAR_U_(0x00875174, short*)
#define SetDebounce VAR_U_(0x00EEEA38, int)
#define WindowsHandle VAR_U_(0x00D9AB3C, HWND)
#define SoundActive VAR_U_(0x0051D004, int)
#define DoTheGame VAR_U_(0x00876C40, int)
#define CurrentLevel VAR_U_(0x00E5C2D0, char)
#define CutSeqNum VAR_U_(0x0051CAA8, int)
#define CutSeqTriggered VAR_U_(0x0051CAAC, int)
#define GlobalPlayingCutscene VAR_U_(0x0051CAB0, int)
#define Wibble VAR_U_(0x0051CDF0, int)
#define DbInput VAR_U_(0x00878DAC, int)
#define TrInput VAR_U_(0x00878D98, int)
#define MatrixStack ARRAY_(0x0055D66C, int, [480])
#define MatrixPtr VAR_U_(0x00E4B0F8, int*)
#define IMptr VAR_U_(0x00E6D834, int*)
#define DxMatrixPtr VAR_U_(0x0055DA2C, byte*)
#define W2VMatrix ARRAY_(0x0055D26C, int, [16])
#define Unk_876C48 VAR_U_(0x00876C48, int)
#define Unk_007E7FE8 VAR_U_(0x007E7FE8, int)
#define SamplePointer ARRAY_(0x0086BEF0, HSAMPLE, [SOUND_MAX_SAMPLES])
#define SoundSlot ARRAY_(0x00E52430, SoundEffectSlot, [SOUND_MAX_CHANNELS])
#define TrackNamePrefix VAR_U_(0x00511828, char)
#define CurrentAtmosphere VAR_U_(0x00EEEB90, byte)
#define GlobalMusicVolume VAR_U_(0x00517B68, unsigned int)
#define GlobalFXVolume VAR_U_(0x00517B6C, unsigned int)
#define gfFilenameOffset VAR_U_(0x00E5C34C, short*)
#define gfFilenameWad VAR_U_(0x00E5C2CC, char*)
#define AllStrings VAR_U_(0x00E5C310, char*)
#define AllStringsOffsets VAR_U_(0x00E5C2B8, short*)
#define RenderLoadBar VAR_U_(0x008FBDC0, int)
#define WeatherType VAR_U_(0x00EEF4A0, byte)
#define CreditsDone VAR_U_(0x00E6D838, byte)
#define CanLoad VAR_U_(0x0051CE54, byte)
#define Savegame VAR_U_(0x00E52EB3, SAVEGAME_INFO)
#define LastInventoryItem VAR_U_(0x00508E14, int)
#define DelCutSeqPlayer VAR_U_(0x0051CE2C, short)
#define TitleControlsLockedOut VAR_U_(0x00E5C2A8, byte)
#define TrackCameraInit VAR_U_(0x0051D010, int)
#define CheckTrigger VAR_U_(0x0051D014, int)
#define UseSpotCam VAR_U_(0x0051D018, int)
#define DisableLaraControl VAR_U_(0x0051D01C, byte)
#define FramesCount VAR_U_(0x0051CA78, int)
#define GlobalCounter VAR_U_(0x0051CA58, short)
#define LevelComplete VAR_U_(0x00E5C2F0, byte)
#define ResetFlag VAR_U_(0x0051CA6C, int)
#define LegacyGameFlow VAR_U_(0x00E5C2BC, GAMEFLOW*)
#define GameMode VAR_U_(0x005082C0, byte)
#define nFrames VAR_U_(0x005082C4, int)
#define GameStatus VAR_U_(0x00E5C2B0, int)
#define EffectRoutines ARRAY_(0x00507964, EFFECT_ROUTINE, [MAX_EFFECTS])
#define CurrentFOV VAR_U_(0x00E4F504, short)
#define GameTimer VAR_U_(0x00E5C27C, int)
#define InventoryObjectsList ARRAY_(0x00508E38, INVOBJ, [100])
#define Friggrimmer VAR_U_(0x00E598F4, byte)
#define InventoryRings ARRAY_(0x00E59900, INVENTORYRING*, [2])
#define GnFrameCounter VAR_U_(0x00E4B0FC, int)
#define gfLevelFlags VAR_U_(0x00E5C2A0, int)
#define OptionAutoTarget VAR_U_(0x00D9AC30, int)
#define PhdLeft VAR_U_(0x0055D20C, int)
#define PhdTop VAR_U_(0x0051D0A8, int)
#define PhdRight VAR_U_(0x0055DA3C, int)
#define PhdBottom VAR_U_(0x0055D204, int)
#define PhdCentreX VAR_U_(0x0055D22C, int)
#define PhdCentreY VAR_U_(0x0055D230, int)
#define PhdZNear VAR_U_(0x0055D21C, int)
#define PhdZFar VAR_U_(0x0055D1F4, int)
#define PhdWindowPosX VAR_U_(0x0055D234, short)
#define PhdWindowPosY VAR_U_(0x0055D1E8, short)
#define PhdWindowXmax VAR_U_(0x0055D218, short)
#define PhdWindowYmax VAR_U_(0x0055D240, short)
#define CurrentRoom VAR_U_(0x00E6D754, short)
#define Unknown_00E6CAE8 VAR_U_(0x00E6CAE8, int)
#define Sprites VAR_U_(0x008751B4, SPRITE*)
#define GunFlashes ARRAY_(0x00E4D660, GUNFLASH_STRUCT, [MAX_GUNFLASH])
#define WBItem VAR_U_(0x00EEEACC, ITEM_INFO*)
#define WBRoom VAR_U_(0x00EEF044, short)
#define SkyPos1 VAR_U_(0x00E6E4B0, short)
#define SkyPos2 VAR_U_(0x00E6D73E, short)
#define SkyVelocity1 VAR_U_(0x00E5C276, signed char)
#define SkyVelocity2 VAR_U_(0x00E5C275, signed char)
#define SkyColor1 VAR_U_(0x00E5C2A4, CVECTOR)
#define SkyColor2 VAR_U_(0x00E5C280, CVECTOR)
//#define SkyStormColor ARRAY_(0x00E6CAF0, short, [3])
//#define SkyStormColor2 ARRAY_(0x00E6E4B8, short, [3])
//#define StormTimer VAR_U_(0x0051CD5C, short)
//#define Unk_00E6D74C VAR_U_(0x00E6D74C, short)
//#define Unk_00E6D73C VAR_U_(0x00E6D73C, short)
//#define Unk_00E6D74C VAR_U_(0x00E6D74C, short)
//#define Unk_00E6E4DC VAR_U_(0x00E6E4DC, short)
#define CurrentAtmosphere VAR_U_(0x00EEEB90, byte)
#define WeaponDelay VAR_U_(0x0051CA52, byte)
#define AnimatedTextureRanges VAR_U_(0x00D9ADA0, short*)
#define RequiredStartPos VAR_U_(0x00E5C2B4, byte)
#define InitialiseGame VAR_U_(0x005082C1, byte)
#define TorchRoom VAR_U_(0x00507AB0, short)
#define WeaponEnemyTimer VAR_U_(0x0080E016, byte)
#define HeightType VAR_U_(0x00EEEFF4, int)
#define HeavyTriggered VAR_U_(0x00EEEA34, byte)
#define FlipEffect VAR_U_(0x00506C60, int)
#define FlipTimer VAR_U_(0x0051CA68, int)
#define Unknown_00EEF99A VAR_U_(0x00EEF99A, byte)
#define TriggerTimer VAR_U_(0x0051CA5A, byte)
#define JustLoaded VAR_U_(0x0051D001, byte)
#define HKTimer VAR_U_(0x0051CEC9, int)
#define HKFlag VAR_U_(0x0051CECC, int)
#define HKFlag2 VAR_U_(0x0051CEC8, byte)
#define Ropes ARRAY_(0x00E54CC0, ROPE_STRUCT, [12])
#define NumRopes VAR_U_(0x0051CA60, int)
#define PhdWidth VAR_U_(0x0055D29C, int)
#define PhdHeight VAR_U_(0x0055D164, int)
#define PhdPerspective VAR_U_(0x0055D208, int)
#define PoisonFlags VAR_U_(0x00E5BF3E, byte)
//#define SniperCameraActive VAR_U_(0x0051CA1D, byte)
//#define BinocularRange VAR_U_(0x0051CA30, int)
//#define BinocularOn VAR_U_(0x0051CA34, int)
//#define BinocularOldCamera VAR_U_(0x0051CA38, CAMERA_TYPE)
//#define LaserSight VAR_U_(0x0051CA3C, int)
//#define SniperCount VAR_U_(0x0051CA1C, byte)
//#define ExitingBinocular VAR_U_(00051CA20, int)
#define OldLaraBusy VAR_U_(0x00E59898, byte)
#define Infrared VAR_U_(0x0051CA40, int)
#define SpotcamOverlay VAR_U_(0x0051D020, byte)
#define SpotcamDontDrawLara VAR_U_(0x0051D021, byte)
#define SniperOverlay VAR_U_(0x0051D022, byte)
#define TargetGraphicsMeshPointer VAR_U_(0x00E6E460, short*)
#define BinocularGraphicsMeshPtr VAR_U_(0x00E6D744, short*)
#define CollidedItems ARRAY_(0x00E88EA0, ITEM_INFO*, [1024])
#define CollidedMeshes ARRAY_(0x00E89EA0, MESH_INFO*, [1024])
#define FlashFadeR VAR_U_(0x0051D07A, short)
#define FlashFadeG VAR_U_(0x0051D07C, short)
#define FlashFadeB VAR_U_(0x0051D07E, short)
#define FlashFader VAR_U_(0x0051D080, short)
//#define GlobalCollisionBounds VAR_U_(0x00EEF910, BOUNDING_BOX)
#define SphereList ARRAY_(0x00E51FE0, SPHERE, [34])
#define IsRoomOutsideNo VAR_U_(0x007FE6C2, short)
#define App_Unk00D9AC2B VAR_U_(0x00D9AC2B, byte)
#define App_Unk00D9AC19 VAR_U_(0x00D9AC19, byte)
#define App_Unk00D9ABFD VAR_U_(0x00D9ABFD, int)
#define WaterfallTextures ARRAY_(0x00E59720, OBJECT_TEXTURE*, [6])
#define WaterfallY ARRAY_(0x00E59760, float, [6])
#define KeyboardLayout0 ARRAY_(0x00516C3C, short, [18])
#define KeyboardLayout1 ARRAY_(0x00516C60, short, [18])
#define KeyMap ARRAY_(0x0086BB8C, byte, [256])
#define ConflictingKeys ARRAY_(0x00878C4C, byte, [256])
#define NullRotations ARRAY_(0x0051CD68, short, [12])
// JeepBaddieCollision
#define Unk_0080DE1A VAR_U_(0x0080DE1A, short)
#define Unk_0080DDE8 VAR_U_(0x0080DDE8, int)
#define Unk_0080DE24 VAR_U_(0x0080DE24, short)
// End
#define Unk_00EEFB6C VAR_U_(0x00EEFB6C, short)
#define OnObject VAR_U_(0x00EEEAC8, int)
#define DontUnlockBox VAR_U_(0x0051CB40, byte)
#define TiltXOffset VAR_U_(0x00EEEAD4, int)
#define TiltYOffset VAR_U_(0x00EEEADC, int)
#define KillEverythingFlag VAR_U_(0x0051CDF4, int)
#define SmokeWindX VAR_U_(0x00E6C9E0, int)
#define SmokeWindZ VAR_U_(0x00E6C9E4, int)
#define LaraNodeUnderwater ARRAY_(0x00E862FE, byte, [15])
#define OnFloor VAR_U_(0x00EEEAC8, int)
#define SlowMotion VAR_U_(0x0051CA50, short)
#define ShatterSounds ARRAY_(0x00506BAC, unsigned char, [18][10])
#define TargetMesh VAR_U_(0x00EEFAF8, int)
#define WeaponsArray ARRAY_(0x005085B0, WEAPON_INFO, [9])
#define GetLaraOnLOS VAR_U_(0x0051CA64, char)
#define DebrisFlags VAR_U_(0x0051CA88, int)
extern bool MonksAttackLara;
// Remapped variables
extern int dword_874254;
extern int unk_87435C;

Binary file not shown.

Binary file not shown.

Binary file not shown.

64
TR5Main/Libs/zlib/ioapi.h Normal file
View file

@ -0,0 +1,64 @@
/* ioapi.h -- IO base function header for compress/uncompress .zip
files using zlib + zip or unzip API
Version 0.18 beta, Feb 26th, 2002
Copyright (C) 1998-2002 Gilles Vollant
*/
#ifndef _ZLIBIOAPI_H
#define _ZLIBIOAPI_H
#define ZLIB_FILEFUNC_SEEK_CUR (1)
#define ZLIB_FILEFUNC_SEEK_END (2)
#define ZLIB_FILEFUNC_SEEK_SET (0)
#define ZLIB_FILEFUNC_MODE_READ (1)
#define ZLIB_FILEFUNC_MODE_WRITE (2)
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
#define ZLIB_FILEFUNC_MODE_EXISTING (4)
#define ZLIB_FILEFUNC_MODE_CREATE (8)
#ifndef ZCALLBACK
#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK)
#define ZCALLBACK CALLBACK
#else
#define ZCALLBACK
#endif
#endif
typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
typedef long (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
typedef struct zlib_filefunc_def_s
{
open_file_func zopen_file;
read_file_func zread_file;
write_file_func zwrite_file;
tell_file_func ztell_file;
seek_file_func zseek_file;
close_file_func zclose_file;
testerror_file_func zerror_file;
voidpf opaque;
} zlib_filefunc_def;
void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))
#endif

View file

@ -0,0 +1,11 @@
dll16\zlib16.dll : The 16 bits DLL of ZLib 1.14
dll16\zlib16.lib : The 16 bits import library for the DLL of ZLib 1.14
dll32\zlib.dll : The 32 bits DLL of ZLib 1.14
dll32\zlib.lib : The 32 bits import library for the DLL of ZLib 1.14
static32\zlibstat.lib : The 32 bits statis library of zLib 1.14 for Visual C++
dll32\zlib_bor.lib : The 32 bits import library for the DLL of ZLib 1.14 for Borland C++
I also include a version of zconf.h which must replace the version from zlib114.zip
The zlib.h included is the same version than in zlib114.zip
I've also added unzip.h and zip.h (please visit http://www.winimage.com/zLibDll/unzip.html )

Binary file not shown.

300
TR5Main/Libs/zlib/unzip.h Normal file
View file

@ -0,0 +1,300 @@
/* unzip.h -- IO for uncompress .zip files using zlib
Version 0.18 beta, Feb 26th, 2002
Copyright (C) 1998-2002 Gilles Vollant
This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g
WinZip, InfoZip tools and compatible.
Encryption and multi volume ZipFile (span) are not supported.
Old compressions used by old PKZip 1.x are not supported
THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE
CAN CHANGE IN FUTURE VERSION !!
I WAIT FEEDBACK at mail info@winimage.com
Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution
Condition of use and distribution are the same than zlib :
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
/* for more info about .ZIP format, see
http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip
http://www.info-zip.org/pub/infozip/doc/
PkWare has also a specification at :
ftp://ftp.pkware.com/probdesc.zip
*/
#ifndef _unz_H
#define _unz_H
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _ZLIB_H
#include "zlib.h"
#endif
#ifndef _ZLIBIOAPI_H
#include "ioapi.h"
#endif
#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
/* like the STRICT of WIN32, we define a pointer that cannot be converted
from (void*) without cast */
typedef struct TagunzFile__ { int unused; } unzFile__;
typedef unzFile__ *unzFile;
#else
typedef voidp unzFile;
#endif
#define UNZ_OK (0)
#define UNZ_END_OF_LIST_OF_FILE (-100)
#define UNZ_ERRNO (Z_ERRNO)
#define UNZ_EOF (0)
#define UNZ_PARAMERROR (-102)
#define UNZ_BADZIPFILE (-103)
#define UNZ_INTERNALERROR (-104)
#define UNZ_CRCERROR (-105)
/* tm_unz contain date/time info */
typedef struct tm_unz_s
{
uInt tm_sec; /* seconds after the minute - [0,59] */
uInt tm_min; /* minutes after the hour - [0,59] */
uInt tm_hour; /* hours since midnight - [0,23] */
uInt tm_mday; /* day of the month - [1,31] */
uInt tm_mon; /* months since January - [0,11] */
uInt tm_year; /* years - [1980..2044] */
} tm_unz;
/* unz_global_info structure contain global data about the ZIPfile
These data comes from the end of central dir */
typedef struct unz_global_info_s
{
uLong number_entry; /* total number of entries in
the central dir on this disk */
uLong size_comment; /* size of the global comment of the zipfile */
} unz_global_info;
/* unz_file_info contain information about a file in the zipfile */
typedef struct unz_file_info_s
{
uLong version; /* version made by 2 bytes */
uLong version_needed; /* version needed to extract 2 bytes */
uLong flag; /* general purpose bit flag 2 bytes */
uLong compression_method; /* compression method 2 bytes */
uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
uLong crc; /* crc-32 4 bytes */
uLong compressed_size; /* compressed size 4 bytes */
uLong uncompressed_size; /* uncompressed size 4 bytes */
uLong size_filename; /* filename length 2 bytes */
uLong size_file_extra; /* extra field length 2 bytes */
uLong size_file_comment; /* file comment length 2 bytes */
uLong disk_num_start; /* disk number start 2 bytes */
uLong internal_fa; /* internal file attributes 2 bytes */
uLong external_fa; /* external file attributes 4 bytes */
tm_unz tmu_date;
} unz_file_info;
extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
const char* fileName2,
int iCaseSensitivity));
/*
Compare two filename (fileName1,fileName2).
If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
or strcasecmp)
If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
(like 1 on Unix, 2 on Windows)
*/
extern unzFile ZEXPORT unzOpen OF((const char *path));
/*
Open a Zip file. path contain the full pathname (by example,
on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
"zlib/zlib113.zip".
If the zipfile cannot be opened (file don't exist or in not valid), the
return value is NULL.
Else, the return value is a unzFile Handle, usable with other function
of this unzip package.
*/
extern unzFile ZEXPORT unzOpen2 OF((const char *path,
zlib_filefunc_def* pzlib_filefunc_def));
/*
Open a Zip file, like unzOpen, but provide a set of file low level API
for read/write the zip file (see ioapi.h)
*/
extern int ZEXPORT unzClose OF((unzFile file));
/*
Close a ZipFile opened with unzipOpen.
If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
return UNZ_OK if there is no problem. */
extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
unz_global_info *pglobal_info));
/*
Write info about the ZipFile in the *pglobal_info structure.
No preparation of the structure is needed
return UNZ_OK if there is no problem. */
extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
char *szComment,
uLong uSizeBuf));
/*
Get the global comment string of the ZipFile, in the szComment buffer.
uSizeBuf is the size of the szComment buffer.
return the number of byte copied or an error code <0
*/
/***************************************************************************/
/* Unzip package allow you browse the directory of the zipfile */
extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
/*
Set the current file of the zipfile to the first file.
return UNZ_OK if there is no problem
*/
extern int ZEXPORT unzGoToNextFile OF((unzFile file));
/*
Set the current file of the zipfile to the next file.
return UNZ_OK if there is no problem
return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
*/
extern int ZEXPORT unzLocateFile OF((unzFile file,
const char *szFileName,
int iCaseSensitivity));
/*
Try locate the file szFileName in the zipfile.
For the iCaseSensitivity signification, see unzStringFileNameCompare
return value :
UNZ_OK if the file is found. It becomes the current file.
UNZ_END_OF_LIST_OF_FILE if the file is not found
*/
extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
unz_file_info *pfile_info,
char *szFileName,
uLong fileNameBufferSize,
void *extraField,
uLong extraFieldBufferSize,
char *szComment,
uLong commentBufferSize));
/*
Get Info about the current file
if pfile_info!=NULL, the *pfile_info structure will contain somes info about
the current file
if szFileName!=NULL, the filemane string will be copied in szFileName
(fileNameBufferSize is the size of the buffer)
if extraField!=NULL, the extra field information will be copied in extraField
(extraFieldBufferSize is the size of the buffer).
This is the Central-header version of the extra field
if szComment!=NULL, the comment string of the file will be copied in szComment
(commentBufferSize is the size of the buffer)
*/
/***************************************************************************/
/* for reading the content of the current zipfile, you can open it, read data
from it, and close it (you can close it before reading all the file)
*/
extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
/*
Open for reading data the current file in the zipfile.
If there is no error, the return value is UNZ_OK.
*/
extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
int* method,
int* level,
int raw));
/*
Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
*method will receive method of compression, *level will receive level of
compression
note : you can set level parameter as NULL (if you did not want known level,
but you CANNOT set method parameter as NULL
*/
extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
/*
Close the file in zip opened with unzOpenCurrentFile
Return UNZ_CRCERROR if all the file was read but the CRC is not good
*/
extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
voidp buf,
unsigned len));
/*
Read bytes from the current file (opened by unzOpenCurrentFile)
buf contain buffer where data must be copied
len the size of buf.
return the number of byte copied if somes bytes are copied
return 0 if the end of file was reached
return <0 with error code if there is an error
(UNZ_ERRNO for IO error, or zLib error for uncompress error)
*/
extern z_off_t ZEXPORT unztell OF((unzFile file));
/*
Give the current position in uncompressed data
*/
extern int ZEXPORT unzeof OF((unzFile file));
/*
return 1 if the end of file was reached, 0 elsewhere
*/
extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
voidp buf,
unsigned len));
/*
Read extra field from the current file (opened by unzOpenCurrentFile)
This is the local-header version of the extra field (sometimes, there is
more info in the local-header version than in the central-header)
if buf==NULL, it return the size of the local extra field
if buf!=NULL, len is the size of the buffer, the extra header is copied in
buf.
the return value is the number of bytes copied in buf, or (if <0)
the error code
*/
#ifdef __cplusplus
}
#endif
#endif /* _unz_H */

Some files were not shown because too many files have changed in this diff Show more