(Broken) Deleted Global Folder

- No more enums.h, constants.h, macro.h, etc...
- moved all structure in types.h to there respective file.
This commit is contained in:
TokyoSU 2020-05-30 15:55:23 +02:00
parent cd1d5f5482
commit b615a98c46
208 changed files with 5335 additions and 5544 deletions

View file

@ -1,7 +1,24 @@
#pragma once
#include "global.h"
#include "phd_global.h"
#include "items.h"
#include "level.h"
enum ZoneTypeEnum
typedef enum MOOD_TYPE
{
BORED_MOOD,
ATTACK_MOOD,
ESCAPE_MOOD,
STALK_MOOD
};
typedef enum TARGET_TYPE
{
NO_TARGET,
PRIME_TARGET,
SECONDARY_TARGET
};
typedef enum ZONE_TYPE
{
ZONE_NULL = -1, // default zone
ZONE_SKELLY = 0,
@ -19,7 +36,7 @@ enum ZoneTypeEnum
ZONE_APE, // only 2 click climb
};
struct BOX_NODE
typedef struct BOX_NODE
{
short exitBox;
unsigned short searchNumber;
@ -27,7 +44,7 @@ struct BOX_NODE
short boxNumber;
};
struct BOX_INFO
typedef struct BOX_INFO
{
unsigned char left;
unsigned char right;
@ -37,7 +54,7 @@ struct BOX_INFO
short overlapIndex;
};
struct AI_INFO
typedef struct AI_INFO
{
short zoneNumber;
short enemyZone;
@ -49,7 +66,7 @@ struct AI_INFO
short enemyFacing;
};
struct BITE_INFO
typedef struct BITE_INFO
{
int x;
int y;
@ -57,7 +74,7 @@ struct BITE_INFO
int meshNum;
};
struct LOT_INFO
typedef struct LOT_INFO
{
BOX_NODE* node;
short head;
@ -76,10 +93,10 @@ struct LOT_INFO
bool isJumping;
bool isMonkeying;
PHD_VECTOR target;
ZoneTypeEnum zone;
ZONE_TYPE zone;
};
struct CREATURE_INFO
typedef struct CREATURE_INFO
{
short jointRotation[4];
short maximumTurn;
@ -101,14 +118,59 @@ struct CREATURE_INFO
LOT_INFO LOT;
};
#define CreatureEffectFunction short(int x, int y, int z, short speed, short yRot, short roomNumber)
#define XZ_GET_SECTOR(room, x, z) (room->floor[((z) >> WALL_SHIFT) + ((x) >> WALL_SHIFT) * room->xSize])
constexpr auto UNIT_SHADOW = 256;
constexpr auto NO_SHADOW = 0;
constexpr auto DEFAULT_RADIUS = 10;
constexpr auto ROT_X = 0x0004;
constexpr auto ROT_Y = 0x0008;
constexpr auto ROT_Z = 0x0010;
constexpr auto BOX_BLOCKED = (1 << 14); // unpassable for other enemies, always set for movable blocks & closed doors
constexpr auto BOX_LAST = (1 << 15); // unpassable by large enemies (T-Rex, Centaur, etc), always set behind doors
constexpr auto TIMID = 0;
constexpr auto VIOLENT = 1;
constexpr auto ONESHOT = 0x100;
constexpr auto DATA_TYPE = 0x1F;
constexpr auto DATA_TILT = 0xF; // tile type (FLOOR_TYPE enum)
constexpr auto DATA_STATIC = 0xFF; // probably add static collision
constexpr auto END_BIT = 0x8000;
constexpr auto VALUE_BITS = 0x3FF;
constexpr auto CODE_BITS = 0x3E00;
constexpr auto REVERSE = 0x4000;
constexpr auto SWONESHOT = 0x40;
constexpr auto ATONESHOT = 0x80;
constexpr auto BLOCKABLE = 0x8000;
constexpr auto BLOCKED = 0x4000;
constexpr auto OVERLAP_INDEX = 0x3FFF;
constexpr auto SEARCH_NUMBER = 0x7FFF;
constexpr auto BLOCKED_SEARCH = 0x8000;
constexpr auto NO_BOX = 0x7FF;
constexpr auto BOX_JUMP = 0x800;
constexpr auto BOX_MONKEY = 0x2000;
constexpr auto BOX_NUMBER = 0x7FF;
constexpr auto BOX_END_BIT = 0x8000;
constexpr auto EXPAND_LEFT = 0x1;
constexpr auto EXPAND_RIGHT = 0x2;
constexpr auto EXPAND_TOP = 0x4;
constexpr auto EXPAND_BOTTOM = 0x8;
constexpr auto NO_FLYING = 0;
constexpr auto FLY_ZONE = 0x2000;
constexpr auto CLIP_LEFT = 0x1;
constexpr auto CLIP_RIGHT = 0x2;
constexpr auto CLIP_TOP = 0x4;
constexpr auto CLIP_BOTTOM = 0x8;
constexpr auto SECONDARY_CLIP = 0x10;
constexpr auto ALL_CLIP = (CLIP_LEFT | CLIP_RIGHT | CLIP_TOP | CLIP_BOTTOM);
constexpr auto SLOPE_DIF = 60;
extern int NumberBoxes;
extern BOX_INFO* Boxes;
extern int NumberOverlaps;
extern short* Overlaps;
extern short* Zones[ZONE_MAX][2];
#define CreatureEffectFunction short(int x, int y, int z, short speed, short yRot, short roomNumber)
void GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int violent);
void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent);
void FindAITargetObject(CREATURE_INFO* creature, short objectNumber);

View file

@ -1,11 +1,7 @@
#include "framework.h"
#include "box.h"
#include "global.h"
#include "items.h"
#include "tomb4fx.h"
#include "lot.h"
#include "deltapak.h"
#include "items.h"
#include "Lara.h"
#include "draw.h"
#include "sphere.h"
@ -13,7 +9,8 @@
#include "camera.h"
#include "control.h"
#include "setup.h"
#include "level.h"
#include "trmath.h"
#include "objectslist.h"
int NumberBoxes;
BOX_INFO* Boxes;
@ -21,6 +18,7 @@ int NumberOverlaps;
short* Overlaps;
short* Zones[ZONE_MAX][2];
#define CHECK_CLICK(x) CLICK(x) / 2
#define ESCAPE_DIST SECTOR(5)
#define STALK_DIST SECTOR(3)
#define REACHED_GOAL_RADIUS 640
@ -335,7 +333,7 @@ void CreatureFloat(short itemNumber)
short roomNumber;
item = &Items[itemNumber];
item->hitPoints = -16384;
item->hitPoints = NOT_TARGETABLE;
item->pos.xRot = 0;
waterLevel = GetWaterHeight(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber);
@ -361,7 +359,7 @@ void CreatureFloat(short itemNumber)
{
item->pos.yPos = waterLevel;
item->collidable = false;
item->status = ITEM_DEACTIVATED;
item->status = ITEM_DESACTIVATED;
DisableBaddieAI(itemNumber);
RemoveActiveItem(itemNumber);
item->afterDeath = 1;
@ -537,7 +535,7 @@ int CreatureAnimation(short itemNumber, short angle, short tilt)
}
AnimateItem(item);
if (item->status == ITEM_DEACTIVATED)
if (item->status == ITEM_DESACTIVATED)
{
CreatureDie(itemNumber, FALSE);
return FALSE;

View file

@ -2,6 +2,8 @@
#include "bubble.h"
#include "level.h"
#include "control.h"
#include "trmath.h"
#include "objectslist.h"
extern vector<BUBBLE_STRUCT> Bubbles = vector<BUBBLE_STRUCT>(MAX_BUBBLES);
@ -56,16 +58,19 @@ int GetFreeBubble() //8BEAC(<), 8DEF0(<) (F)
{
int oldestAgeIndex = 0;
int oldestAge = 0;
for (int i = 0; i < MAX_BUBBLES; i++) {
for (int i = 0; i < MAX_BUBBLES; i++)
{
BUBBLE_STRUCT* bub = &Bubbles[i];
if (!bub->active) {
if (!bub->active)
return i;
}
if (oldestAge < bub->age) {
if (oldestAge < bub->age)
{
oldestAge = bub->age;
oldestAgeIndex = i;
}
}
//incase we dont find any non-active bubble, take the one with the oldest age
return oldestAgeIndex;
}

View file

@ -1,8 +1,4 @@
#pragma once
#include <d3d11.h>
#include <SimpleMath.h>
#include <vector>
#include "types.h"
#include "constants.h"
#include "effect2.h"
@ -13,14 +9,14 @@ constexpr int BUBBLE_FLAG_HIGH_AMPLITUDE = 0x4;
struct BUBBLE_STRUCT
{
DirectX::SimpleMath::Vector4 color;
DirectX::SimpleMath::Vector4 sourceColor;
DirectX::SimpleMath::Vector4 destinationColor;
DirectX::SimpleMath::Vector3 worldPositionCenter; // goes straight up
DirectX::SimpleMath::Vector3 worldPosition; // actual position with wave motion
DirectX::SimpleMath::Vector3 amplitude;
DirectX::SimpleMath::Vector3 wavePeriod;
DirectX::SimpleMath::Vector3 waveSpeed;
Vector4 color;
Vector4 sourceColor;
Vector4 destinationColor;
Vector3 worldPositionCenter; // goes straight up
Vector3 worldPosition; // actual position with wave motion
Vector3 amplitude;
Vector3 wavePeriod;
Vector3 waveSpeed;
float speed;
float size;
float destinationSize;

View file

@ -1,7 +1,53 @@
#pragma once
#include "phd_global.h"
#include "items.h"
#include "global.h"
#include <d3d9.h>
typedef enum CAMERA_TYPE
{
CHASE_CAMERA,
FIXED_CAMERA,
LOOK_CAMERA,
COMBAT_CAMERA,
CINEMATIC_CAMERA,
HEAVY_CAMERA
};
typedef struct CAMERA_INFO
{
GAME_VECTOR pos; // size=16, offset=0
GAME_VECTOR target; // size=16, offset=16
CAMERA_TYPE type; // size=4, offset=32
CAMERA_TYPE oldType; // size=4, offset=36
int shift; // size=0, offset=40
int flags; // size=0, offset=44
int fixedCamera; // size=0, offset=48
int numberFrames; // size=0, offset=52
int bounce; // size=0, offset=56
int underwater; // size=0, offset=60
int targetDistance; // size=0, offset=64
short targetAngle; // size=0, offset=68
short targetElevation; // size=0, offset=70
short actualElevation; // size=0, offset=72
short actualAngle; // size=0, offset=74
short laraNode; // size=0, offset=76
short box; // size=0, offset=78
short number; // size=0, offset=80
short last; // size=0, offset=82
short timer; // size=0, offset=84
short speed; // size=0, offset=86
short targetspeed; // size=0, offset=88
ITEM_INFO* item; // size=144, offset=92
ITEM_INFO* lastItem; // size=144, offset=96
OBJECT_VECTOR* fixed; // size=16, offset=100
int mikeAtLara; // size=0, offset=104
PHD_VECTOR mikePos; // size=12, offset=108
};
constexpr auto MAX_CAMERA = 18;
constexpr auto FOLLOW_CENTRE = 1;
constexpr auto NO_CHUNKY = 2;
constexpr auto CHASE_OBJECT = 3;
constexpr auto NO_MINY = 0xFFFFFF;
extern PHD_VECTOR CurrentCameraPosition;
extern CAMERA_INFO Camera;

View file

@ -7,8 +7,8 @@
#include "sphere.h"
#include "misc.h"
#include "setup.h"
#include "level.h"
#include "sound.h"
#include "trmath.h"
char LM[] =
{
@ -64,7 +64,7 @@ int CollideStaticObjects(COLL_INFO* coll, int x, int y, int z, short roomNumber,
for (int j = room->numMeshes; j > 0; j--, mesh++)
{
STATIC_INFO* sInfo = &StaticObjects[mesh->staticNumber];
StaticInfo* sInfo = &StaticObjects[mesh->staticNumber];
if ((sInfo->flags & 1)) // No collision
continue;
@ -139,7 +139,7 @@ int GetCollidedObjects(ITEM_INFO* collidingItem, int radius, int onlyVisible, IT
for (int j = 0; j < room->numMeshes; j++)
{
MESH_INFO* mesh = &room->mesh[j];
STATIC_INFO* staticMesh = &StaticObjects[mesh->staticNumber];
StaticInfo* staticMesh = &StaticObjects[mesh->staticNumber];
if (mesh->Flags & 1)
{

View file

@ -1,11 +1,22 @@
#pragma once
#include "global.h"
#include "phd_global.h"
#include "level.h"
// used by coll->badPos
#define NO_BAD_POS (-NO_HEIGHT)
// used by coll->badNeg
#define NO_BAD_NEG NO_HEIGHT
struct BOUNDING_BOX
{
short X1;
short X2;
short Y1;
short Y2;
short Z1;
short Z2;
};
struct COLL_FLOOR
{
int floor;
@ -87,8 +98,9 @@ struct COLL_INFO
};
extern BOUNDING_BOX GlobalCollisionBounds;
extern ITEM_INFO* CollidedItems[1024];
extern MESH_INFO* CollidedMeshes[1024];
constexpr auto MAX_ITEMS = 1024;
extern ITEM_INFO* CollidedItems[MAX_ITEMS];
extern MESH_INFO* CollidedMeshes[MAX_ITEMS];
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);

View file

@ -1,7 +1,7 @@
#include "framework.h"
#include "collide.h"
#include "control.h"
#include "global.h"
#include "pickup.h"
#include "camera.h"
#include "Lara.h"
@ -111,7 +111,7 @@ int InitialiseGame;
int RequiredStartPos;
int WeaponDelay;
int WeaponEnemyTimer;
int HeightType;
HEIGHT_TYPES HeightType;
int HeavyTriggered;
short SkyPos1;
short SkyPos2;
@ -1016,7 +1016,7 @@ void TestTriggers(short* data, int heavy, int HeavyFlags)
if (item->active && Objects[item->objectNumber].intelligent)
{
item->hitPoints = -16384;
item->hitPoints = NOT_TARGETABLE;
DisableBaddieAI(value);
KillItem(value);
}
@ -1037,7 +1037,7 @@ void TestTriggers(short* data, int heavy, int HeavyFlags)
{
if (Objects[item->objectNumber].intelligent)
{
if (item->status != ITEM_INACTIVE)
if (item->status != ITEM_NOT_ACTIVE)
{
if (item->status == ITEM_INVISIBLE)
{
@ -2134,7 +2134,6 @@ int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firi
flag = 0;
itemNumber = ObjectOnLOS2(src, dest, &vector, &mesh);
if (itemNumber != 999)
{
target.x = vector.x - (vector.x - src->x >> 5);
@ -2276,7 +2275,7 @@ int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firi
}
}
}
if (item->status != ITEM_DEACTIVATED)
if (item->status != ITEM_DESACTIVATED)
{
AddActiveItem(itemNumber);
item->status = ITEM_ACTIVE;
@ -2384,7 +2383,7 @@ int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INF
{
item = &Items[linknum];
if (item->status != ITEM_DEACTIVATED
if (item->status != ITEM_DESACTIVATED
&& item->status != ITEM_INVISIBLE
&& (item->objectNumber != ID_LARA && Objects[item->objectNumber].collision != NULL
|| item->objectNumber == ID_LARA && GetLaraOnLOS))
@ -2777,7 +2776,7 @@ void AnimateItem(ITEM_INFO* item)
case COMMAND_DEACTIVATE:
if (Objects[item->objectNumber].intelligent && !item->afterDeath)
item->afterDeath = 1;
item->status = ITEM_DEACTIVATED;
item->status = ITEM_DESACTIVATED;
break;
case COMMAND_SOUND_FX:
case COMMAND_EFFECT:
@ -2979,10 +2978,7 @@ void RemoveRoomFlipItems(ROOM_INFO* r)
{
ITEM_INFO* item = &Items[linkNum];
if (item->flags & 0x100
&& Objects[item->objectNumber].intelligent
&& item->hitPoints <= 0
&& item->hitPoints != -16384)
if (item->flags & 0x100 && Objects[item->objectNumber].intelligent && item->hitPoints <= 0 && item->hitPoints != NOT_TARGETABLE)
{
KillItem(linkNum);
}

View file

@ -1,13 +1,69 @@
#pragma once
#include "global.h"
#include "phd_global.h"
#include "items.h"
#include "room.h"
#define TRIG_BITS(T) ((T & 0x3fff) >> 10)
enum GAME_STATUS
{
GAME_STATUS_NONE,
GAME_STATUS_NEW_GAME,
GAME_STATUS_LOAD_GAME,
GAME_STATUS_SAVE_GAME,
GAME_STATUS_EXIT_TO_TITLE,
GAME_STATUS_EXIT_GAME,
GAME_STATUS_LARA_DEAD,
GAME_STATUS_LEVEL_COMPLETED
};
enum COLL_TYPE
{
CT_NONE = 0, // 0x00
CT_FRONT = (1 << 0), // 0x01
CT_LEFT = (1 << 1), // 0x02
CT_RIGHT = (1 << 2), // 0x04
CT_TOP = (1 << 3), // 0x08
CT_TOP_FRONT = (1 << 4), // 0x10
CT_CLAMP = (1 << 5) // 0x20
};
enum HEIGHT_TYPES
{
WALL,
SMALL_SLOPE,
BIG_SLOPE,
DIAGONAL,
SPLIT_TRI
};
enum HEADINGS
{
NORTH,
EAST,
SOUTH,
WEST
};
enum COMMAND_TYPES
{
COMMAND_NULL = 0,
COMMAND_MOVE_ORIGIN,
COMMAND_JUMP_VELOCITY,
COMMAND_ATTACK_READY,
COMMAND_DEACTIVATE,
COMMAND_SOUND_FX,
COMMAND_EFFECT
};
#define TRIG_BITS(T) ((T & 0x3FFF) >> 10)
extern int KeyTriggerActive;
extern byte IsAtmospherePlaying;
extern byte FlipStatus;
constexpr auto MAX_FLIPMAP = 255;
extern int FlipStats[MAX_FLIPMAP];
extern int FlipMap[MAX_FLIPMAP];
extern bool InItemControlLoop;
extern short ItemNewRoomNo;
extern short ItemNewRooms[512];
@ -41,7 +97,7 @@ extern int InitialiseGame;
extern int RequiredStartPos;
extern int WeaponDelay;
extern int WeaponEnemyTimer;
extern int HeightType;
extern HEIGHT_TYPES HeightType;
extern int HeavyTriggered;
extern short SkyPos1;
extern short SkyPos2;

View file

@ -3,12 +3,14 @@
#include "level.h"
#include "setup.h"
#include "control.h"
#include "trmath.h"
ShatterImpactInfo ShatterImpactData;
SHATTER_ITEM ShatterItem;
short SmashedMeshCount;
MESH_INFO* SmashedMesh[32];
short SmashedMeshRoom[32];
vector<DebrisFragment> DebrisFragments = vector<DebrisFragment>(MAX_DEBRIS);
DebrisFragment* GetFreeDebrisFragment()
{
@ -81,9 +83,8 @@ void ShatterObject(SHATTER_ITEM* item, MESH_INFO* mesh, int num,short roomNumber
}
}
vector<DebrisFragment> DebrisFragments = vector<DebrisFragment>(MAX_DEBRIS);
DirectX::SimpleMath::Vector3 CalculateFragmentImpactVelocity(Vector3 fragmentWorldPosition, Vector3 impactDirection, Vector3 impactLocation)
Vector3 CalculateFragmentImpactVelocity(Vector3 fragmentWorldPosition, Vector3 impactDirection, Vector3 impactLocation)
{
Vector3 radiusVector = (fragmentWorldPosition - impactLocation);
Vector3 radiusNormVec = radiusVector;
@ -99,26 +100,36 @@ DirectX::SimpleMath::Vector3 CalculateFragmentImpactVelocity(Vector3 fragmentWor
void UpdateDebris()
{
for (auto deb = DebrisFragments.begin(); deb != DebrisFragments.end(); deb++) {
if (deb->active) {
for (auto deb = DebrisFragments.begin(); deb != DebrisFragments.end(); deb++)
{
if (deb->active)
{
FLOOR_INFO* floor;
short roomNumber;
deb->velocity *= deb->linearDrag;
deb->velocity += deb->gravity;
deb->velocity = XMVector3ClampLength(deb->velocity, 0, deb->terminalVelocity);
deb->rotation *= Quaternion::CreateFromYawPitchRoll(deb->angularVelocity.x,deb->angularVelocity.y,deb->angularVelocity.z);
deb->worldPosition += deb->velocity;
deb->angularVelocity *= deb->angularDrag;
short room = deb->roomNumber;
const FLOOR_INFO* const floor = GetFloor(deb->worldPosition.x, deb->worldPosition.y, deb->worldPosition.z,&room);
if (deb->worldPosition.y < floor->ceiling) {
if (floor->skyRoom != NO_ROOM) {
roomNumber = deb->roomNumber;
floor = GetFloor(deb->worldPosition.x, deb->worldPosition.y, deb->worldPosition.z,&roomNumber);
if (deb->worldPosition.y < floor->ceiling)
{
if (floor->skyRoom != NO_ROOM)
deb->roomNumber = floor->skyRoom;
}
}
if (deb->worldPosition.y > floor->floor) {
if (floor->pitRoom != NO_ROOM) {
if (deb->worldPosition.y > floor->floor)
{
if (floor->pitRoom != NO_ROOM)
deb->roomNumber = floor->pitRoom;
}
if (deb->numBounces > 3) {
if (deb->numBounces > 3)
{
deb->active = false;
continue;
}

View file

@ -1,18 +1,50 @@
#pragma once
#include "sphere.h"
#include "Renderer11.h"
#include "global.h"
#define MAX_DEBRIS 256
struct ShatterImpactInfo {
typedef struct ILIGHT
{
short x;
short y;
short z;
short pad1;
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char pad;
};
typedef struct ITEM_LIGHT
{
ILIGHT light[4];
};
typedef struct SHATTER_ITEM
{
SPHERE sphere;
ITEM_LIGHT* il;
short* meshp;
int bit;
short yRot;
short flags;
};
typedef struct ShatterImpactInfo
{
Vector3 impactDirection;
Vector3 impactLocation;
};
struct DebrisMesh {
typedef struct DebrisMesh
{
RENDERER_BUCKETS bucket;
array<RendererVertex, 3> vertices;
};
struct DebrisFragment {
typedef struct DebrisFragment
{
DebrisMesh mesh;
Quaternion rotation;
Vector3 angularVelocity;
@ -29,6 +61,29 @@ struct DebrisFragment {
bool active;
};
typedef struct DEBRIS_STRUCT
{
void* textInfo;
int x;
int y;
int z;
short xyzOffsets1[3];
short dir;
short xyzOffsets2[3];
short speed;
short xyzOffsets3[3];
short yVel;
short gravity;
short roomNumber;
byte on;
byte xRot;
byte yRot;
byte r;
byte g;
byte b;
byte pad[22];
};
extern SHATTER_ITEM ShatterItem;
extern vector<DebrisFragment> DebrisFragments;
extern ShatterImpactInfo ShatterImpactData;

View file

@ -1,24 +0,0 @@
#include "framework.h"
#include "deltapak.h"
#include "global.h"
#include "level.h"
ITEM_INFO* FindItem(short objectNumber)
{
#ifdef _DEBUG
printf("Called FindItem()\n");
#endif
//DB_Log(0, "FindItem - DLL");
if (LevelItems > 0)
{
for (int i = 0; i < LevelItems; i++)
{
if (Items[i].objectNumber == objectNumber)
return &Items[i];
}
}
return NULL;
}

View file

@ -1,3 +0,0 @@
#pragma once
#include "global.h"

View file

@ -13,13 +13,14 @@
#include "level.h"
#include "input.h"
#include "sound.h"
#include "trmath.h"
PHD_VECTOR DoubleDoorPos = { 0, 0, 220 };
PHD_VECTOR PullDoorPos = { -201, 0, 322 };
PHD_VECTOR PushDoorPos = { 201, 0, -702 };
PHD_VECTOR KickDoorPos = { 0, 0, -917 };
PHD_VECTOR UnderwaterDoorPos = { -251, -540, -46 };
PHD_VECTOR CrowbarDoorPos = { -412, 0, 256 };
PHD_VECTOR DoubleDoorPos(0, 0, 220);
PHD_VECTOR PullDoorPos(-201, 0, 322);
PHD_VECTOR PushDoorPos(201, 0, -702);
PHD_VECTOR KickDoorPos(0, 0, -917);
PHD_VECTOR UnderwaterDoorPos(-251, -540, -46);
PHD_VECTOR CrowbarDoorPos(-412, 0, 256);
static short PushPullKickDoorBounds[12] =
{
@ -109,7 +110,7 @@ void UnderwaterDoorCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
&& !Lara.gunStatus
|| Lara.isMoving && Lara.generalPtr == (void*)itemNum)
{
l->pos.yRot ^= ANGLE(180);
l->pos.yRot ^= ANGLE(180.0f);
if (TestLaraPosition(UnderwaterDoorBounds, item, l))
{
@ -330,7 +331,7 @@ void DoorCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
ITEM_INFO* item = &Items[itemNum];
if (item->triggerFlags == 2
&& item->status == ITEM_INACTIVE && !item->gravityStatus // CHECK
&& item->status == ITEM_NOT_ACTIVE && !item->gravityStatus // CHECK
&& ((TrInput & IN_ACTION || g_Inventory->GetSelectedObject() == ID_CROWBAR_ITEM)
&& l->currentAnimState == STATE_LARA_STOP
&& l->animNumber == ANIMATION_LARA_STAY_IDLE

View file

@ -1,6 +1,32 @@
#pragma once
#include "global.h"
#include "items.h"
#include "collide.h"
#include "room.h"
typedef struct DOORPOS_DATA
{
FLOOR_INFO* floor;
FLOOR_INFO data;
short block;
};
typedef struct DOOR_DATA
{
DOORPOS_DATA d1;
DOORPOS_DATA d1flip;
DOORPOS_DATA d2;
DOORPOS_DATA d2flip;
short opened;
short* dptr1;
short* dptr2;
short* dptr3;
short* dptr4;
byte dn1;
byte dn2;
byte dn3;
byte dn4;
ITEM_INFO* item;
};
void SequenceDoorControl(short itemNumber);
void UnderwaterDoorCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll);

View file

@ -18,8 +18,6 @@ BITE_INFO EnemyBites[9] =
{ 0xA, 0xFFFFFFC4, 0xC8, 0xD }
};
Renderer11* g_Renderer;
int LightningCount;
int LightningRand;
int StormTimer;

View file

@ -1,9 +1,20 @@
#pragma once
#include "global.h"
#include "box.h"
extern Renderer11* g_Renderer;
struct ANIM_FRAME
{
short MinX;
short MaxX;
short MinY;
short MaxY;
short MinZ;
short MaxZ;
short OffsetX;
short OffsetY;
short OffsetZ;
unsigned short AngleSets[]; // Variable size
};
extern BITE_INFO EnemyBites[9];
extern int LightningCount;
extern int LightningRand;

View file

@ -1,6 +1,6 @@
#include "framework.h"
#include "effect.h"
#include "global.h"
#include "Lara.h"
#include "items.h"
#include "lot.h"
@ -402,7 +402,7 @@ void PoseidonSFX(ITEM_INFO* item)//395E0(<), 39AE0(<) (F)
void RubbleFX(ITEM_INFO* item)//39534(<), 39A34(<) (F)
{
int itemNumber = FindItem(ID_EARTHQUAKE);
int itemNumber = FindItemNumber(ID_EARTHQUAKE);
if (itemNumber != NO_ITEM)
{

View file

@ -1,7 +1,21 @@
#pragma once
#include "global.h"
#include "control.h"
struct FX_INFO
{
PHD_3DPOS pos;
short roomNumber;
short objectNumber;
short nextFx;
short nextActive;
short speed;
short fallspeed;
short frameNumber;
short counter;
short shade;
short flag1;
short flag2;
};
extern FX_INFO* Effects;
int ItemNearLara(PHD_3DPOS* pos, int radius);

View file

@ -1,39 +1,35 @@
#include "framework.h"
#include "effect2.h"
#include "draw.h"
#include "effect.h"
#include "lara.h"
#include "tomb4fx.h"
#include "traps.h"
#include "trmath.h"
#include "lara.h"
#include "effect.h"
#include "sound.h"
#include "GameFlowScript.h"
#include "setup.h"
#include "level.h"
//long wibble;
//long SplashCount;
//long KillEverythingFlag;
int NextSpark;
#include "objectslist.h"
#include "GameFlowScript.h"
unsigned char TES_extra_tab[] =
{
0x00, 0x04, 0x07, 0x0A, 0x00, 0x00
};
extern SMOKE_SPARKS SmokeSparks[MAX_SPARKS_SMOKE];
int NextSpark;
int DeadlyBounds[6];
SPLASH_STRUCT Splashes[MAX_SPLASH];
SPLASH_SETUP SplashSetup;
SPLASH_STRUCT Splashes[MAX_SPLASHES];
RIPPLE_STRUCT Ripples[MAX_RIPPLES];
DYNAMIC Dynamics[MAX_DYNAMICS];
SPLASH_SETUP SplashSetup;
SP_DYNAMIC SparkDynamics[8];
int SmokeWeapon;
int SmokeCountL;
int SmokeCountR;
//int SmokeWindX;
//int SmokeWindZ;
int SplashCount = 0;
SPARKS Sparks[MAX_SPARKS];
SP_DYNAMIC SparkDynamics[MAX_SPARKS_DYNAMICS];
int SmokeWeapon;
byte SmokeCountL;
byte SmokeCountR;
int SplashCount = 0;
PHD_VECTOR NodeVectors[MAX_NODE];
NODEOFFSET_INFO NodeOffsets[MAX_NODE] = {
{ -16, 40, 160, -14, false }, // TR5 offset 0
@ -63,19 +59,21 @@ NODEOFFSET_INFO NodeOffsets[MAX_NODE] = {
extern GameFlow* g_GameFlow;
void DetatchSpark(int num, int type)// (F) (D)
void DetatchSpark(int num, SpriteEnumFlag type)// (F) (D)
{
FX_INFO* fx;
ITEM_INFO* item;
SPARKS* sptr;
int lp;
sptr = &Sparks[0];
for (int lp = 0; lp < MAX_SPARKS; lp++, sptr++)
for (lp = 0; lp < MAX_SPARKS; lp++, sptr++)
{
if (sptr->on && (sptr->flags & type) && sptr->fxObj == num)
{
if (type == SP_FX)
switch (type)
{
case SP_FX:
if (sptr->flags & SP_USEFXOBJPOS)
{
sptr->on = FALSE;
@ -88,9 +86,8 @@ void DetatchSpark(int num, int type)// (F) (D)
sptr->z += fx->pos.zPos;
sptr->flags &= ~SP_FX;
}
}
else if (type == SP_ITEM)
{
break;
case SP_ITEM:
if (sptr->flags & SP_USEFXOBJPOS)
{
sptr->on = FALSE;
@ -103,6 +100,7 @@ void DetatchSpark(int num, int type)// (F) (D)
sptr->z += item->pos.zPos;
sptr->flags &= ~SP_ITEM;
}
break;
}
}
}
@ -405,7 +403,7 @@ void TriggerRicochetSpark(GAME_VECTOR* pos, short angle, int num, int unk)
spark->fadeToBlack = 4;
spark->life = 9;
spark->sLife = 9;
spark->transType = 2;
spark->transType = COLADD;
spark->x = pos->x;
spark->y = pos->y;
spark->z = pos->z;
@ -415,7 +413,7 @@ void TriggerRicochetSpark(GAME_VECTOR* pos, short angle, int num, int unk)
spark->zVel = rcossin_tbl[2 * ang + 1] >> 2;
spark->gravity = (random >> 7) & 0x1F;
spark->friction = 34;
spark->flags = 0;
spark->flags = SP_NONE;
spark->maxYvel = 0;
}
@ -433,7 +431,7 @@ void TriggerRicochetSpark(GAME_VECTOR* pos, short angle, int num, int unk)
spark->fadeToBlack = 0;
spark->life = 4;
spark->sLife = 4;
spark->transType = 2;
spark->transType = COLADD;
spark->x = pos->x;
spark->y = pos->y;
spark->z = pos->z;
@ -491,7 +489,7 @@ void TriggerRicochetSpark(GAME_VECTOR* pos, short angle, int num, int unk)
spark->xVel = 0;
spark->zVel = 0;
}
spark->transType = 2;
spark->transType = COLADD;
spark->friction = 0;
spark->flags = 26;
spark->rotAng = random >> 3;
@ -529,13 +527,13 @@ void TriggerCyborgSpark(int x, int y, int z, short xv, short yv, short zv)
spark->dB = -64 - ((random & 0x7F) + 64);
spark->life = 10;
spark->sLife = 10;
spark->transType = 2;
spark->transType = COLADD;
spark->friction = 34;
spark->scalar = 1;
spark->x = (random & 7) + x - 3;
spark->y = ((random >> 3) & 7) + y - 3;
spark->z = ((random >> 6) & 7) + z - 3;
spark->flags = 2;
spark->flags = SP_SCALE;
spark->xVel = (random >> 2) + xv - 128;
spark->yVel = (random >> 4) + yv - 128;
spark->zVel = (random >> 6) + zv - 128;
@ -572,7 +570,7 @@ void TriggerExplosionSparks(int x, int y, int z, int extraTrig, int dynamic, int
spark->colFadeSpeed = 7;
spark->dG = (GetRandomControl() & 0x1F) + 64;
spark->fadeToBlack = 8;
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 7) + 16;
spark->roomNumber = roomNumber;
}
@ -585,7 +583,7 @@ void TriggerExplosionSparks(int x, int y, int z, int extraTrig, int dynamic, int
spark->colFadeSpeed = 8;
spark->dG = (GetRandomControl() & 0x3F) + -128;
spark->fadeToBlack = 16;
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 7) + 24;
}
spark->extras = extraTrig | 8 * (TES_extra_tab[extraTrig] + (GetRandomControl() & 7) + 28);
@ -999,7 +997,7 @@ void TriggerSuperJetFlame(ITEM_INFO* item, int yvel, int deadly)//32EAC, 333AC (
sptr->dB = 32;
sptr->colFadeSpeed = 8;
sptr->fadeToBlack = 8;
sptr->transType = 2;
sptr->transType = COLADD;
sptr->life = sptr->sLife = (size >> 9) + (GetRandomControl() & 7) + 16;
sptr->x = (GetRandomControl() & 0x1F) + item->pos.xPos - 16;
sptr->y = (GetRandomControl() & 0x1F) + item->pos.yPos - 16;
@ -1053,7 +1051,7 @@ void SetupSplash(const SPLASH_SETUP* const setup)
constexpr size_t NUM_SPLASHES = 4;
int numSplashesSetup = 0;
float splashVelocity;
for (int i = 0; i < MAX_SPLASH; i++)
for (int i = 0; i < MAX_SPLASHES; i++)
{
SPLASH_STRUCT& splash = Splashes[i];
if (!splash.isActive)
@ -1129,7 +1127,7 @@ void SetupSplash(const SPLASH_SETUP* const setup)
void UpdateSplashes()
{
for (int i = 0; i < MAX_SPLASH; i++)
for (int i = 0; i < MAX_SPLASHES; i++)
{
SPLASH_STRUCT& splash = Splashes[i];
if (splash.isActive) {
@ -1269,7 +1267,7 @@ void TriggerWaterfallMist(int x, int y, int z, int angle)
spark->dG = 64;
spark->dB = 64;
spark->colFadeSpeed = 1;
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 6;
spark->fadeToBlack = spark->life - 4;
dl = ((dh + (GlobalCounter << 6)) % 1536) + (GetRandomControl() & 0x3F) - 32;
@ -1303,7 +1301,7 @@ void TriggerWaterfallMist(int x, int y, int z, int angle)
spark->dG = 96;
spark->dB = 96;
spark->colFadeSpeed = 1;
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 6;
spark->fadeToBlack = spark->life - 1;
dl = GetRandomControl() % 1408 + 64;
@ -1341,7 +1339,7 @@ void TriggerDartSmoke(int x, int y, int z, int xv, int zv, int hit)
spark->dB = 32;
spark->colFadeSpeed = 8;
spark->fadeToBlack = 4;
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 32;
spark->x = (GetRandomControl() & 0x1F) + x - 16;
spark->y = (GetRandomControl() & 0x1F) + y - 16;
@ -1503,7 +1501,7 @@ void TriggerRocketFlame(int x, int y, int z, int xv, int yv, int zv, int itemNum
sptr->colFadeSpeed = 12 + (GetRandomControl() & 3);
sptr->fadeToBlack = 12;
sptr->sLife = sptr->life = (GetRandomControl() & 3) + 28;
sptr->transType = 2;
sptr->transType = COLADD;
sptr->extras = 0;
sptr->dynamic = -1;
@ -1559,7 +1557,7 @@ void TriggerRocketSmoke(int x, int y, int z, int bodyPart)
sptr->colFadeSpeed = 4 + (GetRandomControl() & 3);
sptr->fadeToBlack = 12;
sptr->sLife = sptr->life = (GetRandomControl() & 3) + 20;
sptr->transType = 2;
sptr->transType = COLADD;
sptr->extras = 0;
sptr->dynamic = -1;
@ -1612,7 +1610,7 @@ void GrenadeExplosionEffects(int x, int y, int z, short roomNumber)
spark->dShade = -128;
spark->colFadeSpeed = 4;
spark->fadeToBlack = 16;
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 0xF) + 64;
spark->x = (GetRandomControl() & 0x1F) + x - 16;
spark->y = (GetRandomControl() & 0x1F) + y - 16;
@ -1718,7 +1716,7 @@ void GrenadeLauncherSpecialEffect1(int x, int y, int z, int flag1, int flag2)
spark->life = spark->sLife = (GetRandomControl() & 3) + 28;
}
spark->transType = 2;
spark->transType = COLADD;
if (flag1 != -1)
{
@ -1909,7 +1907,7 @@ void TriggerMetalSparks(int x, int y, int z, int xv, int yv, int zv, int additio
spark->colFadeSpeed = 3;
spark->fadeToBlack = 5;
spark->y = ((r >> 3) & 7) + y - 3;
spark->transType = 2;
spark->transType = COLADD;
spark->friction = 34;
spark->scalar = 1;
spark->z = ((r >> 6) & 7) + z - 3;
@ -1931,7 +1929,7 @@ void TriggerMetalSparks(int x, int y, int z, int xv, int yv, int zv, int additio
spark->sR = spark->dR >> 1;
spark->sG = spark->dG >> 1;
spark->fadeToBlack = 4;
spark->transType = 2;
spark->transType = COLADD;
spark->colFadeSpeed = (r & 3) + 8;
spark->sB = spark->dB >> 1;
spark->dR = 32;

View file

@ -1,14 +1,63 @@
#pragma once
#include <d3d11.h>
#include "global.h"
#include "phd_global.h"
#include "items.h"
#define MAX_NODE 23
#define RIPPLE_FLAG_BLOOD 0x80
#define RIPPLE_FLAG_RAND_POS 0x40
#define RIPPLE_FLAG_RAND_ROT 0x20
#define RIPPLE_FLAG_SHORT_LIFE 0x01
enum RIPPLE_TYPE
{
RIPPLE_FLAG_NONE = 0x0,
RIPPLE_FLAG_SHORT_LIFE = 0x1,
RIPPLE_FLAG_RAND_ROT = 0x20,
RIPPLE_FLAG_RAND_POS = 0x40,
RIPPLE_FLAG_BLOOD = 0x80
};
struct RIPPLE_STRUCT
enum SpriteEnumFlag
{
SP_NONE = 0x0000,
SP_FLAT = 0x0001,
SP_SCALE = 0x0002,
SP_BLOOD = 0x0004,
SP_DEF = 0x0008,
SP_ROTATE = 0x0010,
SP_EXPLOSION = 0x0020,
SP_FX = 0x0040,
SP_ITEM = 0x0080,
SP_WIND = 0x0100,
SP_EXPDEF = 0x0200,
SP_USEFXOBJPOS = 0x0400,
SP_UNDERWEXP = 0x0800,
SP_NODEATTACH = 0x1000,
SP_PLASMAEXP = 0x2000
};
enum TransTypeEnum
{
NOTRANS,
SEMITRANS,
COLADD,
COLSUB,
WEIRD
};
struct NODEOFFSET_INFO
{
short x;
short y;
short z;
char meshNum;
unsigned char gotIt;
};
typedef struct SPLASH_SETUP
{
float x;
float y;
float z;
float splashPower;
float innerRadius;
};
typedef struct RIPPLE_STRUCT
{
Vector4 currentColor;
Vector4 initialColor;
@ -24,27 +73,120 @@ struct RIPPLE_STRUCT
bool isBillboard; //used for Blood
};
struct SPLASH_SETUP
typedef struct SPARKS
{
int x;
int y;
int z;
short xVel;
short yVel;
short zVel;
short gravity;
short rotAng;
unsigned short flags; // SP_enum
unsigned char sSize;
unsigned char dSize;
unsigned char size;
unsigned char friction;
unsigned char scalar;
unsigned char def;
signed char rotAdd;
signed char maxYvel;
bool on;
byte sR;
byte sG;
byte sB;
byte dR;
byte dG;
byte dB;
byte r;
byte g;
byte b;
unsigned char colFadeSpeed;
unsigned char fadeToBlack;
unsigned char sLife;
unsigned char life;
TransTypeEnum transType;
unsigned char extras;
signed char dynamic;
unsigned char fxObj;
unsigned char roomNumber;
unsigned char nodeNumber;
};
typedef struct SPLASH_STRUCT
{
float x;
float y;
float z;
float splashPower;
float innerRadius;
float innerRad;
float innerRadVel;
float heightVel;
float heightSpeed;
float height;
float outerRad;
float outerRadVel;
float animationSpeed;
float animationPhase;
short spriteSequenceStart;
short spriteSequenceEnd;
unsigned short life;
bool isRipple;
bool isActive;
};
extern SPLASH_STRUCT Splashes[MAX_SPLASH];
extern RIPPLE_STRUCT Ripples[32];
typedef struct DYNAMIC
{
int x;
int y;
int z;
byte on;
byte r;
byte g;
byte b;
short falloff;
byte used;
byte pad1[1];
int FalloffScale;
};
typedef struct SP_DYNAMIC
{
byte On;
byte Falloff;
byte R;
byte G;
byte B;
byte Flags;
byte Pad[2];
};
constexpr auto SD_EXPLOSION = 1;
constexpr auto SD_UWEXPLOSION = 2;
#define MAX_NODE 23
#define MAX_DYNAMICS 64
#define MAX_SPARKS 1024
#define MAX_RIPPLES 32
#define MAX_SPLASHES 8
#define MAX_SPARKS_DYNAMICS 8
extern int NextSpark;
extern int DeadlyBounds[6];
extern SPARKS Sparks[1024];
extern SP_DYNAMIC SparkDynamics[8];
extern SPLASH_SETUP SplashSetup;
extern SPLASH_STRUCT Splashes[MAX_SPLASHES];
extern RIPPLE_STRUCT Ripples[MAX_RIPPLES];
extern DYNAMIC Dynamics[MAX_DYNAMICS];
extern SPARKS Sparks[MAX_SPARKS];
extern SP_DYNAMIC SparkDynamics[MAX_SPARKS_DYNAMICS];
extern int SmokeWeapon;
extern int SmokeCountL;
extern int SmokeCountR;
extern byte SmokeCountL;
extern byte SmokeCountR;
extern int SplashCount;
extern PHD_VECTOR NodeVectors[MAX_NODE];
extern NODEOFFSET_INFO NodeOffsets[MAX_NODE];
void DetatchSpark(int num, int type);
void DetatchSpark(int num, SpriteEnumFlag type);
int GetFreeSpark();
void UpdateSparks();
void TriggerRicochetSpark(GAME_VECTOR* pos, short angle, int num, int unk);

View file

@ -1,6 +1,6 @@
#include "framework.h"
#include "flmtorch.h"
#include "global.h"
#include "effect2.h"
#include "laraflar.h"
#include "lara.h"
@ -32,7 +32,7 @@ void TriggerTorchFlame(char fxObj, char node)
spark->dG = (GetRandomControl() & 0x3F) + -128;
spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 12;
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 7) + 24;
spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8;
@ -80,7 +80,7 @@ void DoFlameTorch() // (F) (D)
&& LaraItem->currentAnimState != STATE_LARA_JUMP_RIGHT
|| Lara.waterStatus == LW_UNDERWATER)
{
Lara.leftArm.lock = 1;
Lara.leftArm.lock = true;
Lara.leftArm.frameNumber = 1;
Lara.leftArm.animNumber = Objects[ID_LARA_TORCH_ANIM].animIndex + 1;
if (Lara.waterStatus == LW_UNDERWATER)
@ -92,7 +92,7 @@ void DoFlameTorch() // (F) (D)
case 1:
if (Lara.leftArm.frameNumber < 12 && LaraItem->gravityStatus)
{
Lara.leftArm.lock = 0;
Lara.leftArm.lock = false;
Lara.leftArm.frameNumber = 0;
Lara.leftArm.animNumber = Objects[ID_LARA_TORCH_ANIM].animIndex;
}
@ -103,7 +103,7 @@ void DoFlameTorch() // (F) (D)
{
Lara.litTorch = false;
Lara.flareControlLeft = false;
Lara.leftArm.lock = 0;
Lara.leftArm.lock = false;
Lara.gunType = Lara.lastGunType;
Lara.requestGunType = WEAPON_NONE;
Lara.gunStatus = LG_NO_ARMS;
@ -123,7 +123,7 @@ void DoFlameTorch() // (F) (D)
{
Lara.litTorch = false;
Lara.flareControlLeft = false;
Lara.leftArm.lock = 0;
Lara.leftArm.lock = false;
Lara.lastGunType = WEAPON_NONE;
Lara.gunType = WEAPON_NONE;
Lara.gunStatus = LG_NO_ARMS;
@ -137,7 +137,7 @@ void DoFlameTorch() // (F) (D)
case 3:
if (LaraItem->currentAnimState != STATE_LARA_MISC_CONTROL)
{
Lara.leftArm.lock = 0;
Lara.leftArm.lock = false;
Lara.leftArm.frameNumber = 0;
Lara.flareControlLeft = true;
Lara.litTorch = LaraItem->itemFlags[3] & 1;
@ -184,7 +184,7 @@ void GetFlameTorch() // (F) (D)
Lara.flareControlLeft = true;
Lara.leftArm.animNumber = Objects[ID_LARA_TORCH_ANIM].animIndex;
Lara.gunStatus = LG_READY;
Lara.leftArm.lock = 0;
Lara.leftArm.lock = false;
Lara.leftArm.frameNumber = 0;
Lara.leftArm.frameBase = Anims[Lara.leftArm.animNumber].framePtr;
LARA_MESHES(ID_LARA_TORCH_ANIM, LM_LHAND);
@ -237,7 +237,7 @@ void TorchControl(short itemNumber) // (F) (D)
}
else
{
STATIC_INFO* sobj = &StaticObjects[CollidedMeshes[0]->staticNumber];
StaticInfo* sobj = &StaticObjects[CollidedMeshes[0]->staticNumber];
PHD_3DPOS pos;
pos.xPos = CollidedMeshes[0]->x;
pos.yPos = CollidedMeshes[0]->y;

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "collide.h"
void TriggerTorchFlame(char fxObj, char node);

View file

@ -1,5 +1,5 @@
#pragma once
#include "types.h"
#include "items.h"
#include "trmath.h"
constexpr size_t MAX_FOOTPRINTS = 20;

View file

@ -3,7 +3,7 @@
#include "draw.h"
#include "savegame.h"
#include "input.h"
#include "global.h"
#include "level.h"
SavegameInfo g_SavegameInfos[MAX_SAVEGAMES];

View file

@ -15,6 +15,24 @@ typedef struct SavegameInfo
#define MAX_SAVEGAMES 16
struct GAMEFLOW
{
unsigned int CheatEnabled : 1;
unsigned int LoadSaveEnabled : 1;
unsigned int TitleEnabled : 1;
unsigned int PlayAnyLevel : 1;
unsigned int Language : 3;
unsigned int DemoDisc : 1;
unsigned int Unused : 24;
unsigned int InputTimeout;
unsigned char SecurityTag;
unsigned char nLevels;
unsigned char nFileNames;
unsigned char Pad;
unsigned short FileNameLen;
unsigned short ScriptLen;
};
extern SavegameInfo g_SavegameInfos[MAX_SAVEGAMES];
extern vector<string> g_NewStrings;
extern SaveGameHeader g_NewSavegameInfos[MAX_SAVEGAMES];

View file

@ -1,6 +1,6 @@
#include "framework.h"
#include "hair.h"
#include "global.h"
#include "draw.h"
#include "laramisc.h"
#include "lara.h"
@ -10,8 +10,8 @@
#include "sphere.h"
#include "level.h"
int FirstHair[2];
HAIR_STRUCT Hairs[2][7];
int FirstHair[HAIR_MAX];
HAIR_STRUCT Hairs[HAIR_MAX][HAIR_SEGMENTS];
int WindAngle;
int DWindAngle;
int Wind;
@ -20,11 +20,11 @@ extern GameFlow* g_GameFlow;
void InitialiseHair()
{
for (int h = 0; h < 2; h++)
for (int h = 0; h < HAIR_MAX; h++)
{
FirstHair[h] = 1;
int* bone = Bones + Objects[ID_LARA_HAIR].boneIndex;
int* bone = &Bones[Objects[ID_LARA_HAIR].boneIndex];
Hairs[h][0].pos.yRot = 0;
Hairs[h][0].pos.xRot = -0x4000;
@ -45,7 +45,7 @@ void InitialiseHair()
void HairControl(int cutscene, int ponytail, short* framePtr)
{
SPHERE sphere[5];
SPHERE sphere[HAIR_SPHERE];
ObjectInfo* object = &Objects[ID_LARA];
short* frame;
int spaz;
@ -106,7 +106,7 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
sphere[0].x = pos.x;
sphere[0].y = pos.y;
sphere[0].z = pos.z;
sphere[0].r = (int) *(objptr + 3);
sphere[0].r = (int) * (objptr + 3);
objptr = Lara.meshPtrs[LM_TORSO];
pos = { objptr[0], objptr[1], objptr[2] };
@ -169,7 +169,7 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
pos.y = world.Translation().y;
pos.z = world.Translation().z;
int* bone = Bones + Objects[ID_LARA_HAIR].boneIndex;
int* bone = &Bones[Objects[ID_LARA_HAIR].boneIndex];
if (FirstHair[ponytail])
{
@ -203,7 +203,9 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
int wh;
if (cutscene)
{
wh = NO_HEIGHT;
}
else
{
int x = LaraItem->pos.xPos + (frame[0] + frame[1]) / 2;
@ -247,7 +249,9 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
height = GetFloorHeight(floor, Hairs[ponytail][i].pos.xPos, Hairs[ponytail][i].pos.yPos, Hairs[ponytail][i].pos.zPos);
}
else
{
height = 32767;
}
Hairs[ponytail][i].pos.xPos += Hairs[ponytail][i].hvel.x * 3 / 4;
Hairs[ponytail][i].pos.yPos += Hairs[ponytail][i].hvel.y * 3 / 4;
@ -264,7 +268,9 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
case LW_ABOVE_WATER:
Hairs[ponytail][i].pos.yPos += 10;
if (wh != NO_HEIGHT && Hairs[ponytail][i].pos.yPos > wh)
{
Hairs[ponytail][i].pos.yPos = wh;
}
else if (Hairs[ponytail][i].pos.yPos > height)
{
Hairs[ponytail][i].pos.xPos = Hairs[ponytail][0].hvel.x;
@ -282,7 +288,7 @@ void HairControl(int cutscene, int ponytail, short* framePtr)
break;
}
for (int j = 0; j < 5; j++)
for (int j = 0; j < HAIR_SPHERE; j++)
{
int x = Hairs[ponytail][i].pos.xPos - sphere[j].x;
int y = Hairs[ponytail][i].pos.yPos - sphere[j].y;

View file

@ -1,7 +1,18 @@
#pragma once
#include "global.h"
extern HAIR_STRUCT Hairs[2][7];
#include "phd_global.h"
constexpr auto HAIR_MAX = 2; // HAIR_NORMAL = 0, HAIR_YOUNG = 1
constexpr auto HAIR_SEGMENTS = 7; // classic = 7, young = 14
constexpr auto HAIR_SPHERE = 5; // current hair max collision
struct HAIR_STRUCT
{
PHD_3DPOS pos;
PHD_VECTOR hvel;
PHD_VECTOR unknown;
};
extern HAIR_STRUCT Hairs[HAIR_MAX][HAIR_SEGMENTS];
void InitialiseHair();
void HairControl(int cutscene, int ponytail, short* framePtr);

View file

@ -1,9 +1,12 @@
#pragma once
#include "global.h"
#define MAX_COLLECTED_PICKUPS 32
typedef struct DISPLAY_PICKUP
{
short life;
short objectNumber;
};
void DrawHealthBarOverlay(int value);
void DrawHealthBar(float value);
void UpdateHealtBar(int flash);

View file

@ -9,7 +9,7 @@
#include "Lara.h"
#include "camera.h"
#include "spotcam.h"
#include "global.h"
#include "input.h"
#include "configuration.h"
#include "lara1gun.h"

View file

@ -161,6 +161,19 @@ enum INVENTORY_OBJECTS {
INVENTORY_TABLE_SIZE
};
typedef struct INVOBJ
{
short objectNumber;
short yOff;
short scale1;
short yRot;
short xRot;
short zRot;
short flags;
short objectName;
int meshBits;
};
// Focus state
#define INV_FOCUS_STATE_NONE 0
#define INV_FOCUS_STATE_POPUP 1
@ -243,13 +256,15 @@ enum INVENTORY_OBJECTS {
#define INV_NUM_COMBINATIONS 22
struct InventoryObject {
struct InventoryObject
{
int inventoryObject;
int rotation;
float scale;
};
struct InventoryRing {
struct InventoryRing
{
InventoryObject objects[NUM_INVENTORY_OBJECTS_PER_RING];
int numObjects;
int currentObject;
@ -273,7 +288,8 @@ struct InventoryRing {
int numActions = 3;
};
struct InventoryObjectDefinition {
struct InventoryObjectDefinition
{
short objectNumber;
short objectName;
int meshBits;
@ -293,7 +309,8 @@ struct InventoryObjectDefinition {
}
};
struct InventoryObjectCombination {
struct InventoryObjectCombination
{
short piece1;
short piece2;
short combinedObject;

View file

@ -1,6 +1,6 @@
#include "framework.h"
#include "global.h"
#include "items.h"
#include "constants.h"
#include "effect2.h"
#include "setup.h"
#include "level.h"
@ -30,7 +30,7 @@ void KillItem(short itemNum)
{
ITEM_INFO* item = &Items[itemNum];
DetatchSpark(itemNum, 128);
DetatchSpark(itemNum, SP_ITEM);
item->active = false;
item->reallyActive = false;
@ -52,7 +52,7 @@ void KillItem(short itemNum)
}
}
if (item->roomNumber != 255)
if (item->roomNumber != NO_ROOM)
{
if (Rooms[item->roomNumber].itemNumber == itemNum)
{
@ -99,7 +99,7 @@ void RemoveAllItemsInRoom(short roomNumber, short objectNumber)
if (item->objectNumber == objectNumber)
{
RemoveActiveItem(currentItemNum);
item->status = ITEM_INACTIVE;
item->status = ITEM_NOT_ACTIVE;
item->flags &= 0xC1;
}
@ -115,7 +115,7 @@ void AddActiveItem(short itemNumber)
if (Objects[item->objectNumber].control == NULL)
{
item->status = ITEM_INACTIVE;
item->status = ITEM_NOT_ACTIVE;
return;
}
@ -355,7 +355,7 @@ void InitialiseItem(short itemNum)
item->itemFlags[0] = 0;
item->active = false;
item->status = ITEM_INACTIVE;
item->status = ITEM_NOT_ACTIVE;
item->gravityStatus = false;
item->hitStatus = false;
item->collidable = true;
@ -467,7 +467,7 @@ short SpawnItem(ITEM_INFO* item, short objectNumber)
InitialiseItem(itemNumber);
spawn->status = ITEM_INACTIVE;
spawn->status = ITEM_NOT_ACTIVE;
spawn->shade = 0x4210;
}
@ -495,11 +495,11 @@ int GlobalItemReplace(short search, short replace)
ITEM_INFO* find_a_fucking_item(short objectNum)
{
int itemNumber = FindItem(objectNum);
int itemNumber = FindItemNumber(objectNum);
return (itemNumber != NO_ITEM ? &Items[itemNumber] : NULL);
}
int FindItem(short objectNum)
int FindItemNumber(short objectNum)
{
for (int i = 0; i < LevelItems; i++)
{
@ -510,3 +510,21 @@ int FindItem(short objectNum)
return NO_ITEM;
}
ITEM_INFO* FindItem(short objectNumber)
{
#ifdef _DEBUG
printf("Called FindItem()\n");
#endif
if (LevelItems > 0)
{
for (int i = 0; i < LevelItems; i++)
{
if (Items[i].objectNumber == objectNumber)
return &Items[i];
}
}
return NULL;
}

View file

@ -1,7 +1,89 @@
#pragma once
#include "global.h"
#include "control.h"
#include "phd_global.h"
typedef enum AIObjectType
{
NO_AI = 0x0000,
GUARD = 0x0001,
AMBUSH = 0x0002,
PATROL1 = 0x0004,
MODIFY = 0x0008,
FOLLOW = 0x0010,
PATROL2 = 0x0020,
ALL_AIOBJ = (GUARD | AMBUSH | PATROL1 | MODIFY | FOLLOW | PATROL2)
};
typedef enum ItemStatus
{
ITEM_ACTIVE,
ITEM_NOT_ACTIVE,
ITEM_DESACTIVATED,
ITEM_INVISIBLE
};
typedef enum ItemFlags
{
IFLAG_CLEAR_BODY = (1 << 7), // 0x0080
IFLAG_INVISIBLE = (1 << 8), // 0x0100
IFLAG_REVERSE = (1 << 14), // 0x4000
IFLAG_KILLED = (1 << 15), // 0x8000
IFLAG_ACTIVATION_MASK = 0x3E00 // bits 9-13
};
typedef struct ITEM_INFO
{
int floor;
DWORD touchBits;
DWORD meshBits;
short objectNumber;
short currentAnimState;
short goalAnimState;
short requiredAnimState;
short animNumber;
short frameNumber;
short roomNumber;
short nextItem;
short nextActive;
short speed;
short fallspeed;
short hitPoints;
unsigned short boxNumber;
short timer;
unsigned short flags; // ItemFlags enum
short shade;
short triggerFlags;
short carriedItem;
short afterDeath;
short firedWeapon;
short itemFlags[4];
void* data;
PHD_3DPOS pos;
byte legacyLightData[5528];
bool active;
short status; // ItemStatus enum
bool gravityStatus;
bool hitStatus;
bool collidable;
bool lookedAt;
bool dynamicLight;
bool poisoned;
byte aiBits; // AIObjectType enum
bool reallyActive;
bool inDrawRoom;
int swapMeshFlags;
short drawRoom;
short TOSSPAD;
};
// used by fx->shade !
#define RGB555(r, g, b) ((r << 7) & 0x7C00 | (g << 2) & 0x3E0 | (b >> 3) & 0x1F)
#define WHITE555 RGB555(255, 255, 255)
#define GRAY555 RGB555(128, 128, 128)
#define BLACK555 RGB555( 0, 0, 0)
constexpr auto NO_ITEM = -1;
constexpr auto ALL_MESHBITS = -1;
constexpr auto NOT_TARGETABLE = -16384;
#define NUM_ITEMS 1024
#define NUM_EFFECTS 1024
@ -20,4 +102,5 @@ void InitialiseItem(short itemNum);
void InitialiseItemArray(int numitems);
void KillItem(short itemNum);
ITEM_INFO* find_a_fucking_item(short objectNum);
int FindItem(short objectNum);
int FindItemNumber(short objectNumber);
ITEM_INFO* FindItem(short objectNumber);

View file

@ -17,7 +17,6 @@
#include "laraclmb.h"
#include "rope.h"
#include "health.h"
#include "newobjects.h"
#include "level.h"
#include "input.h"
#include "sound.h"
@ -1797,13 +1796,13 @@ void lara_as_pulley(ITEM_INFO* item, COLL_INFO* coll)//1B288, 1B3BC (F)
if (p->itemFlags[2])
{
p->itemFlags[2] = 0;
p->status = ITEM_DEACTIVATED;
p->status = ITEM_DESACTIVATED;
}
}
else
{
if (!p->itemFlags[1])
p->status = ITEM_DEACTIVATED;
p->status = ITEM_DESACTIVATED;
p->itemFlags[2] = 1;

View file

@ -1,13 +1,758 @@
#pragma once
#include "global.h"
#pragma once
#include "trmath.h"
#include "box.h"
#include "collide.h"
#include "objectslist.h"
#include "Renderer11.h"
#define NUM_PUZZLES (ID_PUZZLE_ITEM16 - ID_PUZZLE_ITEM1 + 1)
#define NUM_KEYS (ID_KEY_ITEM16 - ID_KEY_ITEM1 + 1)
#define NUM_PICKUPS (ID_PICKUP_ITEM16 - ID_PICKUP_ITEM1 + 1)
#define NUM_EXAMINES (ID_EXAMINE8 - ID_EXAMINE1 + 1)
#pragma region state_and_animation
enum LARA_STATE
{
STATE_LARA_WALK_FORWARD = 0,
STATE_LARA_RUN_FORWARD = 1,
STATE_LARA_STOP = 2,
STATE_LARA_JUMP_FORWARD = 3,
STATE_LARA_POSE = 4,
STATE_LARA_RUN_BACK = 5,
STATE_LARA_TURN_RIGHT_SLOW = 6,
STATE_LARA_TURN_LEFT_SLOW = 7,
STATE_LARA_DEATH = 8,
STATE_LARA_FREEFALL = 9,
STATE_LARA_HANG = 10,
STATE_LARA_REACH = 11,
STATE_LARA_SPLAT = 12,
STATE_LARA_UNDERWATER_STOP = 13,
STATE_LARA_GRAB_TO_FALL = 14,
STATE_LARA_JUMP_PREPARE = 15,
STATE_LARA_WALK_BACK = 16,
STATE_LARA_UNDERWATER_FORWARD = 17,
STATE_LARA_UNDERWATER_INERTIA = 18,
STATE_LARA_GRABBING = 19,
STATE_LARA_TURN_FAST = 20,
STATE_LARA_WALK_RIGHT = 21,
STATE_LARA_WALK_LEFT = 22,
STATE_LARA_ROLL_BACKWARD = 23,
STATE_LARA_SLIDE_FORWARD = 24,
STATE_LARA_JUMP_BACK = 25,
STATE_LARA_JUMP_LEFT = 26,
STATE_LARA_JUMP_RIGHT = 27,
STATE_LARA_JUMP_UP = 28,
STATE_LARA_FALL_BACKWARD = 29,
STATE_LARA_SHIMMY_LEFT = 30,
STATE_LARA_SHIMMY_RIGHT = 31,
STATE_LARA_SLIDE_BACK = 32,
STATE_LARA_ONWATER_STOP = 33,
STATE_LARA_ONWATER_FORWARD = 34,
STATE_LARA_UNDERWATER_DIVING = 35,
STATE_LARA_PUSHABLE_PUSH = 36,
STATE_LARA_PUSHABLE_PULL = 37,
STATE_LARA_PUSHABLE_GRAB = 38,
STATE_LARA_PICKUP = 39,
STATE_LARA_SWITCH_DOWN = 40,
STATE_LARA_SWITCH_UP = 41,
STATE_LARA_INSERT_KEY = 42,
STATE_LARA_INSERT_PUZZLE = 43,
STATE_LARA_WATER_DEATH = 44,
STATE_LARA_ROLL_FORWARD = 45,
STATE_LARA_BOULDER_DEATH = 46,
STATE_LARA_ONWATER_BACK = 47,
STATE_LARA_ONWATER_LEFT = 48,
STATE_LARA_ONWATER_RIGHT = 49,
STATE_LARA_USE_MIDAS = 50,
STATE_LARA_DIE_MIDAS = 51,
STATE_LARA_SWANDIVE_BEGIN = 52,
STATE_LARA_SWANDIVE_END = 53,
STATE_LARA_HANDSTAND = 54,
STATE_LARA_ONWATER_EXIT = 55,
STATE_LARA_LADDER_IDLE = 56,
STATE_LARA_LADDER_UP = 57,
STATE_LARA_LADDER_LEFT = 58,
STATE_LARA_LADDER_END = 59,
STATE_LARA_LADDER_RIGHT = 60,
STATE_LARA_LADDER_DOWN = 61,
STATE_LARA_NULL_62 = 62,
STATE_LARA_NULL_63 = 63,
STATE_LARA_NULL_64 = 64,
STATE_LARA_WADE_FORWARD = 65,
STATE_LARA_UNDERWATER_TURNAROUND = 66,
STATE_LARA_FLARE_PICKUP = 67,
STATE_LARA_JUMP_ROLL = 68,
STATE_LARA_NULL_69 = 69,
STATE_LARA_ZIPLINE_RIDE = 70,
STATE_LARA_CROUCH_IDLE = 71,
STATE_LARA_CROUCH_ROLL = 72,
STATE_LARA_SPRINT = 73,
STATE_LARA_SPRINT_ROLL = 74,
STATE_LARA_MONKEYSWING_IDLE = 75,
STATE_LARA_MONKEYSWING_FORWARD = 76,
STATE_LARA_MONKEYSWING_LEFT = 77,
STATE_LARA_MONKEYSWING_RIGHT = 78,
STATE_LARA_MONKEYSWING_TURNAROUND = 79,
STATE_LARA_CRAWL_IDLE = 80,
STATE_LARA_CRAWL_FORWARD = 81,
STATE_LARA_MONKEYSWING_TURN_LEFT = 82,
STATE_LARA_MONKEYSWING_TURN_RIGHT = 83,
STATE_LARA_CRAWL_TURN_LEFT = 84,
STATE_LARA_CRAWL_TURN_RIGHT = 85,
STATE_LARA_CRAWL_BACK = 86,
STATE_LARA_CLIMB_TO_CRAWL = 87,
STATE_LARA_CRAWL_TO_CLIMB = 88,
STATE_LARA_MISC_CONTROL = 89,
STATE_LARA_ROPE_TURN_LEFT = 90,
STATE_LARA_ROPE_TURN_RIGHT = 91,
STATE_LARA_GIANT_BUTTON_PUSH = 92,
STATE_LARA_TRAPDOOR_FLOOR_OPEN = 93,
STATE_LARA_FREEFALL_BIS = 94,
STATE_LARA_ROUND_HANDLE = 95,
STATE_LARA_COGWHEEL = 96,
STATE_LARA_LEVERSWITCH_PUSH = 97,
STATE_LARA_HOLE = 98,
STATE_LARA_POLE_IDLE = 99,
STATE_LARA_POLE_UP = 100,
STATE_LARA_POLE_DOWN = 101,
STATE_LARA_POLE_TURN_LEFT = 102,
STATE_LARA_POLE_TURN_RIGHT = 103,
STATE_LARA_PULLEY = 104,
STATE_LARA_CROUCH_TURN_LEFT = 105,
STATE_LARA_CROUCH_TURN_RIGHT = 106,
STATE_LARA_CLIMB_CORNER_LEFT_OUTER = 107,
STATE_LARA_CLIMB_CORNER_RIGHT_OUTER = 108,
STATE_LARA_CLIMB_CORNER_LEFT_INNER = 109,
STATE_LARA_CLIMB_CORNER_RIGHT_INNER = 110,
STATE_LARA_ROPE_IDLE = 111,
STATE_LARA_ROPE_CLIMB_UP = 112,
STATE_LARA_ROPE_CLIMB_DOWN = 113,
STATE_LARA_ROPE_SWING = 114,
STATE_LARA_LADDER_TO_HANDS = 115,
STATE_LARA_POSITION_CORRECTOR = 116,
STATE_LARA_DOUBLEDOORS_PUSH = 117,
STATE_LARA_DOZY = 118,
STATE_LARA_TIGHTROPE_IDLE = 119,
STATE_LARA_TIGHTROPE_TURNAROUND = 120,
STATE_LARA_TIGHTROPE_FORWARD = 121,
STATE_LARA_TIGHTROPE_BALANCING_LEFT = 122,
STATE_LARA_TIGHTROPE_BALANCING_RIGHT = 123,
STATE_LARA_TIGHTROPE_ENTER = 124,
STATE_LARA_TIGHTROPE_EXIT = 125,
STATE_LARA_DOVESWITCH = 126,
STATE_LARA_TIGHTROPE_RESTORE_BALANCE = 127,
STATE_LARA_BARS_SWING = 128,
STATE_LARA_BARS_JUMP = 129,
STATE_LARA_UNKNOWN_130 = 130,
STATE_LARA_RADIO_LISTENING = 131,
STATE_LARA_RADIO_OFF = 132,
STATE_LARA_UNKNOWN_133 = 133,
STATE_LARA_UNKNOWN_134 = 134,
STATE_LARA_UNKNOWN_135 = 135,
STATE_LARA_UNUSED16 = 136,
STATE_LARA_PICKUP_FROM_CHEST = 137,
STATE_LARA_UNKNOWN_138 = 138,
STATE_LARA_HANG_FEET = 139,
STATE_LARA_HANG_FEET_SHIMMYR = 140,
STATE_LARA_HANG_FEET_SHIMMYL = 141,
STATE_LARA_HANG_FEET_INCORNERR = 142,
STATE_LARA_HANG_FEET_INCORNERL = 143,
STATE_LARA_HANG_FEET_OUTCORNERR = 144,
STATE_LARA_HANG_FEET_OUTCORNERL = 145,
NUM_LARA_STATES
};
enum LARA_ANIM
{
ANIMATION_LARA_RUN = 0, // Run
ANIMATION_LARA_WALK_FORWARD = 1, // Walk
ANIMATION_LARA_END_WALK_RIGHT = 2, // Walk > stand (right foot moved first)
ANIMATION_LARA_END_WALK_LEFT = 3, // Walk > stand (left foot moved first)
ANIMATION_LARA_WALK_TO_RUN_RIGHT = 4, // Walk > Run (right foot moved first)
ANIMATION_LARA_WALK_TO_RUN_LEFT = 5, // Walk > Run (left foot moved first)
ANIMATION_LARA_STAY_TO_RUN = 6, // Stand > run
ANIMATION_LARA_RUN_TO_WALK_RIGHT = 7, // Run > walk (left foot first)
ANIMATION_LARA_RUN_TO_STAY_LEFT = 8, // Run > stand (left food first)
ANIMATION_LARA_RUN_TO_WALK_LEFT = 9, // Run > walk (right foot first)
ANIMATION_LARA_RUN_TO_STAY_RIGHT = 10, // Run > stand (right foot first)
ANIMATION_LARA_STAY_SOLID = 11, // Stand still (used as a link between many standing animations)
ANIMATION_LARA_TURN_RIGHT_SLOW = 12, // Turn right on the spot, small turn
ANIMATION_LARA_TURN_LEFT_SLOW = 13, // Turn left on the spot, small turn
ANIMATION_LARA_LANDING_FORWARD_BOTH = 14, // Forward jump/fall (less than 7 clicks high) > land (to a standstill), first part > ANIMATION_LARA_LANDING_FORWARD_BOTH_CONTINUE
ANIMATION_LARA_LANDING_FORWARD_BOTH_CONTINUE = 15, // Land (after jump/fall less that 7 clicks high), second part > stand still (from ANIMATION_LARA_LANDING_FORWARD_BOTH)
ANIMATION_LARA_JUMPING_FORWARD_RIGHT = 16, // Run > take off for forward jump (right foot first) > ANIMATION_LARA_START_FLY_FORWARD_RIGHT
ANIMATION_LARA_START_FLY_FORWARD_RIGHT = 17, // Running take off for forward jump (left foot first) > forward jump
ANIMATION_LARA_JUMPING_FORWARD_LEFT = 18, // Run > take off for forward jump (left foot first) > ANIMATION_LARA_START_FLY_FORWARD_LEFT
ANIMATION_LARA_START_FLY_FORWARD_LEFT = 19, // Running take off for forward jump (right foot first) > forward jump
ANIMATION_LARA_WALK_FORWARD_BEGIN = 20, // Stand > walk forwards, first part > ANIMATION_LARA_WALK_FORWARD_BEGIN_CONTINUE
ANIMATION_LARA_WALK_FORWARD_BEGIN_CONTINUE = 21, // Walk forwards, second part > walk (from ANIMATION_LARA_WALK_FORWARD_BEGIN)
ANIMATION_LARA_START_FREE_FALL = 22, // Jump > fall
ANIMATION_LARA_FREE_FALL_LONG = 23, // Fall
ANIMATION_LARA_LANDING_HARD = 24, // Jump/fall (more than 7 clicks) > crouching landing > stand
ANIMATION_LARA_LANDING_DEATH = 25, // Fall > die (break neck)
ANIMATION_LARA_STAY_TO_GRAB = 26, // Stand > take off for upward jump to grab
ANIMATION_LARA_STAY_TO_GRAB_CONTINUE = 27, // Jump upwards to grab
ANIMATION_LARA_TRY_HANG_VERTICAL = 28, // Jump upwards
ANIMATION_LARA_BEGIN_HANGING_VERTICAL = 29, // Grab (after upward jump to grab) > hang by the hands
ANIMATION_LARA_STOP_HANG_VERTICAL = 30, // Hang by the hands > fall
ANIMATION_LARA_LANDING_LIGHT = 31, // Land after upward jump > stand
ANIMATION_LARA_SMASH_JUMP = 32, // Jump > hit something while in the air, first part > ANIMATION_LARA_SMASH_JUMP_CONTINUE
ANIMATION_LARA_SMASH_JUMP_CONTINUE = 33, // Hit something while in the air, second part > fall (from ANIMATION_LARA_SMASH_JUMP)
ANIMATION_LARA_FREE_FALL_FORWARD = 34, // Downward curve during long jump, first part (not used?) > ANIMATION_LARA_FREE_FALL_MIDDLE
ANIMATION_LARA_FREE_FALL_MIDDLE = 35, // Downward curve during long jump, second part (not used?) (from ANIMATION_LARA_FREE_FALL_FORWARD)
ANIMATION_LARA_FREE_FALL_LONG_NO_HURT = 36, // Downward curve during long jump > fall
ANIMATION_LARA_HANG_TO_RELEASE = 37, // Hang by the hands > fall (great fall) (not used?)
ANIMATION_LARA_STOP_WALK_BACK_RIGHT = 38, // Walk backwards > stand (right foot moved first)
ANIMATION_LARA_STOP_WALK_BACK_LEFT = 39, // Walk backwards > stand (left foot moved first)
ANIMATION_LARA_WALK_BACK = 40, // Walk backwards
ANIMATION_LARA_START_WALK_BACK = 41, // Stand > walk backwards
ANIMATION_LARA_CLIMB_3CLICK = 42, // Climb block (3 clicks high)
ANIMATION_LARA_CLIMB_3CLICK_END_RUNNING = 43, // Stand (after jumping to a higher point) > run (not used?)
ANIMATION_LARA_ROTATE_RIGHT = 44, // Turn right on the spot, large turn
ANIMATION_LARA_JUMPING_FORWARD_TO_FREEFALL = 45, // Jump forwards > fall (?)
ANIMATION_LARA_FLY_FORWARD_TRY_TO_HANG = 46, // Forward jump trying to grab > land (not used?)
ANIMATION_LARA_ROLL_ALTERNATE = 47, // Roll (not used?)
ANIMATION_LARA_ROLL_END_ALTERNATE = 48, // Roll > stand (not used?)
ANIMATION_LARA_FREE_FALL_NO_HURT = 49, // Jump forwards > fall (at earlier stage of jump) (not used?)
ANIMATION_LARA_CLIMB_2CLICK = 50, // Climb block (2 clicks high)
ANIMATION_LARA_CLIMB_2CLICK_END = 51, // Climb block (2 clicks high) > stand
ANIMATION_LARA_CLIMB_2CLICK_END_RUNNING = 52, // Stand (after climbing block 2 clicks high) > run
ANIMATION_LARA_WALL_SMASH_LEFT = 53, // Run > hit wall (left foot first) > stand
ANIMATION_LARA_WALL_SMASH_RIGHT = 54, // Run > hit wall (right foot first) > stand
ANIMATION_LARA_RUN_UP_STEP_RIGHT = 55, // Ascend block (1 click high) running (left foot first)
ANIMATION_LARA_RUN_UP_STEP_LEFT = 56, // Ascend block (1 click high) running (right foot first)
ANIMATION_LARA_WALK_UP_STEP_RIGHT = 57, // Ascend block (1 click high) walking (left foot first)
ANIMATION_LARA_WALK_UP_STEP_LEFT = 58, // Ascend block (1 click high) walking (right foot first)
ANIMATION_LARA_WALK_DOWN_LEFT = 59, // Descend block (1 click high) walking (right foot moved first)
ANIMATION_LARA_WALK_DOWN_RIGHT = 60, // Descend block (1 click high) walking (left foot moved first)
ANIMATION_LARA_WALK_DOWN_BACK_LEFT = 61, // Descend block (1 click high) walking backwards (left foot moved first)
ANIMATION_LARA_WALK_DOWN_BACK_RIGHT = 62, // Descend block (1 click high) walking backwards (right foot moved first)
ANIMATION_LARA_PULL_SWITCH_DOWN = 63, // Activate (lower) horizontal switch
ANIMATION_LARA_PULL_SWITCH_UP = 64, // Deactivate (raise) horizontal switch
ANIMATION_LARA_WALK_LEFT = 65, // Sidestep left
ANIMATION_LARA_WALK_LEFT_END = 66, // Sidestep left > stand
ANIMATION_LARA_WALK_RIGHT = 67, // Sidestep right
ANIMATION_LARA_WALK_RIGHT_END = 68, // Sidestep right > stand
ANIMATION_LARA_ROTATE_LEFT = 69, // Turn left on the spot, large turn
ANIMATION_LARA_SLIDE_FORWARD = 70, // Slide forwards down steep slope (3 clicks high)
ANIMATION_LARA_SLIDE_FORWARD_END = 71, // Slide forwards down steep slope (3 clicks high) > stumbling landing, first part > ANIMATION_LARA_SLIDE_FORWARD_STOP
ANIMATION_LARA_SLIDE_FORWARD_STOP = 72, // Stumbling landing (after sliding forwards down slope), second part > stand (from ANIMATION_LARA_SLIDE_FORWARD_END)
ANIMATION_LARA_STAY_JUMP_SIDES = 73, // Stand > take off for jump in all directions
ANIMATION_LARA_JUMP_BACK_BEGIN = 74, // Take off for backward jump
ANIMATION_LARA_JUMP_BACK = 75, // Jump backwards
ANIMATION_LARA_JUMP_FORWARD_BEGIN = 76, // Standing take off for forward jump
ANIMATION_LARA_CONTINUE_FLY_FORWARD = 77, // Jump forwards
ANIMATION_LARA_JUMP_LEFT_BEGIN = 78, // Take off for sideways jump left
ANIMATION_LARA_JUMP_LEFT = 79, // Jump sideways left
ANIMATION_LARA_JUMP_RIGHT_BEGIN = 80, // Take off for sideways jump right
ANIMATION_LARA_JUMP_RIGHT = 81, // Jump sideways right
ANIMATION_LARA_LANDING_MIDDLE = 82, // Crouching landing after jump in all directions > stand
ANIMATION_LARA_FORWARD_TO_FREE_FALL = 83, // Jump backwards > fall
ANIMATION_LARA_LEFT_TO_FREE_FALL = 84, // Jump sideways left > fall
ANIMATION_LARA_RIGHT_TO_FREE_FALL = 85, // Jump sideways right > fall
ANIMATION_LARA_UNDERWATER_SWIM_FORWARD = 86, // Float-swim in deepsea suit (Deepsea Dive)
ANIMATION_LARA_UNDERWATER_SWIM_SOLID = 87, // Motionless underwater (driven only by momentum) in deepsea suit (used as a link between swimming animations) (Deepsea Dive)
ANIMATION_LARA_RUN_BACK_BEGIN = 88, // Stand > take off for backward hop
ANIMATION_LARA_RUN_BACK = 89, // Hop backwards
ANIMATION_LARA_RUN_BACK_END = 90, // Hop backwards > stand
ANIMATION_LARA_TRY_HANG_VERTICAL_BEGIN = 91, // Take off for upward jump
ANIMATION_LARA_LANDING_FROM_RUN = 92, // Jump forwards > running landing > run
ANIMATION_LARA_FREE_FALL_BACK = 93, // Downward curve during long jump, second part (with less momentum than ANIMATION_LARA_FREE_FALL_MIDDLE?) - not used?
ANIMATION_LARA_FLY_FORWARD_TRY_HANG = 94, // Jump forwards (at late stage during jump) > grab
ANIMATION_LARA_TRY_HANG_SOLID = 95, // Grab during forward jump
ANIMATION_LARA_HANG_IDLE = 96, // Grab in mid-air > hang by the hands at wall
ANIMATION_LARA_CLIMB_ON = 97, // Hang by the hands > pull up > stand
ANIMATION_LARA_FREE_FALL_TO_LONG = 98, // Failed attempt to grab during forward jump > fall
ANIMATION_LARA_FALL_CROUCHING_LANDING = 99, // Fall > crouching landing
ANIMATION_LARA_FREE_FALL_TO_SIDE_LANDING = 100, // Downward curve during long jump > grab~
ANIMATION_LARA_FREE_FALL_TO_SIDE_LANDING_ALTERNATE = 101, // Downward curve during long jump (with less momentum than ANIMATION_LARA_FREE_FALL_TO_SIDE_LANDING) > grab (not used?)
ANIMATION_LARA_CLIMB_ON_END = 102, // Pull up (after hanging by the hands) > stand
ANIMATION_LARA_STAY_IDLE = 103, // Stand still (breathing)
ANIMATION_LARA_START_SLIDE_BACKWARD = 104, // Land on steep slope (3 clicks high) > slide backwards down
ANIMATION_LARA_SLIDE_BACKWARD = 105, // Slide backwards down steep slope (3 clicks high)
ANIMATION_LARA_SLIDE_BACKWARD_END = 106, // Slide backwards down steep slope (3 clicks high) > stumbling landing > stand
ANIMATION_LARA_UNDERWATER_SWIM_TO_IDLE = 107, // Stop swimming underwater in deepsea suit (at start or end of float-swimming animation) > drift underwater (Deepsea Dive)
ANIMATION_LARA_UNDERWATER_IDLE = 108, // Drift underwater in deepsea suit (Deepsea Dive)
ANIMATION_LARA_UNDERWARER_IDLE_TO_SWIM = 109, // Drift underwater in deepsea suit > swim underwater (Deepsea Dive)
ANIMATION_LARA_ONWATER_IDLE = 110, // Tread water on water surface
ANIMATION_LARA_CLIMB_OUT_OF_WATER = 111, // Pull out of water (onto ledge 1 click above the water surface) > stand
ANIMATION_LARA_FREE_FALL_TO_UNDERWATER = 112, // Fall/jump into water > swim underwater
ANIMATION_LARA_ONWATER_DIVE_ALTERNATE = 113, // Tread water on water surface > dive > swim underwater (not used?)
ANIMATION_LARA_UNDERWATER_TO_ONWATER = 114, // Swim underwater > break water surface > tread water on water surface (?)
ANIMATION_LARA_ONWATER_DIVE = 115, // Swim forwards on water surface > dive > swim underwater
ANIMATION_LARA_ONWATER_SWIM_FORWARD = 116, // Swim forwards on water surface
ANIMATION_LARA_ONWATER_SWIM_FORWARD_TO_IDLE = 117, // Swim forwards on water surface > tread water on water surface
ANIMATION_LARA_ONWATER_IDLE_TO_SWIM = 118, // Tread water on water surface > swim forwards on water surface
ANIMATION_LARA_FREE_FALL_TO_UNDERWATER_ALTERNATE = 119, // Fall/jump into water > swim underwater (not used?)
ANIMATION_LARA_START_OBJECT_MOVING = 120, // Stand > ready to push/pull pushable
ANIMATION_LARA_STOP_OBJECT_MOVING = 121, // Ready to push/pull pushable > stand
ANIMATION_LARA_OBJECT_PULL = 122, // Pull pushable
ANIMATION_LARA_OBJECT_PUSH = 123, // Push pushable
ANIMATION_LARA_UNDERWATER_DEATH = 124, // Drown/die underwater – with convulsions (Deepsea Dive)
ANIMATION_LARA_AH_FORWARD = 125, // Jerk backwards hurt (standing)
ANIMATION_LARA_AH_BACKWARD = 126, // Jerk forwards hurt (standing)
ANIMATION_LARA_AH_LEFT = 127, // Jerk right hurt (standing)
ANIMATION_LARA_AH_RIGHT = 128, // Jerk left hurt (standing)
ANIMATION_LARA_UNDERWATER_SWITCH = 129, // Pull underwater switch at wall
ANIMATION_LARA_UNDERWATER_PICKUP = 130, // Swimming pickup in deepsea suit (right hand) (Deepsea Dive)
ANIMATION_LARA_USE_KEY = 131, // Use key
ANIMATION_LARA_ONWATER_DEATH = 132, // Die on the water surface (less dramatic than ANIMATION_LARA_UNDERWATER_DEATH)
ANIMATION_LARA_RUN_TO_DIE = 133, // Run > die
ANIMATION_LARA_USE_PUZZLE = 134, // Insert puzzle item
ANIMATION_LARA_PICKUP = 135, // Standing pickup from floor (right hand)
ANIMATION_LARA_CLIMB_LEFT = 136, // Shimmy left
ANIMATION_LARA_CLIMB_RIGHT = 137, // Shimmy right
ANIMATION_LARA_STAY_TO_DEATH = 138, // Stand > die
ANIMATION_LARA_SQUASH_BOULDER = 139, // Crushed by boulder
ANIMATION_LARA_ONWATER_IDLE_TO_SWIM_BACK = 140, // Tread water on water surface > swim backwards on water surface
ANIMATION_LARA_ONWATER_SWIM_BACK = 141, // Swim backwards on water surface
ANIMATION_LARA_ONWATER_SWIM_BACK_TO_IDLE = 142, // Swim backwards on water surface > tread water on water surface
ANIMATION_LARA_ONWATER_SWIM_LEFT = 143, // Swim sideways left on water surface
ANIMATION_LARA_ONWATER_SWIM_RIGHT = 144, // Swim sideways right on water surface
ANIMATION_LARA_JUMP_TO_DEATH = 145, // Land after jump/fall > die (?)
ANIMATION_LARA_ROLL_BEGIN = 146, // Stand > roll, first part > ANIMATION_LARA_ROLL_CONTINUE
ANIMATION_LARA_ROLL_CONTINUE = 147, // Roll, second part (from ANIMATION_LARA_ROLL_BEGIN) > ANIMATION_LARA_ROLL_END
ANIMATION_LARA_ROLL_END = 148, // Roll, third part > stand (from ANIMATION_LARA_ROLL_CONTINUE)
ANIMATION_LARA_SPIKED = 149, // Impaled on spikes
ANIMATION_LARA_OSCILLATE_HANG_ON = 150, // Grab in mid-air > hang by the hands in free air (swinging forth and back)
ANIMATION_LARA_LANDING_ROLL = 151, // Swan dive > rolling landing
ANIMATION_LARA_FISH_TO_UNDERWATER1 = 152, // Swan dive > shoot through water at sloped angle (at early stage in swan dive)
ANIMATION_LARA_FREE_FALL_FISH = 153, // Swan dive > dive headfirst
ANIMATION_LARA_FISH_TO_UNDERWATER2 = 154, // Swan dive > shoot through water vertically (at later stage in swan dive)
ANIMATION_LARA_FREE_FALL_FISH_TO_DEATH = 155, // Swan dive > die (break neck)
ANIMATION_LARA_START_FLY_LIKE_FISH_LEFT = 156, // Run > swan dive (right foot first)
ANIMATION_LARA_START_FLY_LIKE_FISH_RIGHT = 157, // Run > swan dive (left foot first)
ANIMATION_LARA_FREE_FALL_FISH_START = 158, // Swan dive
ANIMATION_LARA_CLIMB_ON2 = 159, // Hang by the hands > hand stand > stand
ANIMATION_LARA_STAND_TO_LADDER = 160, // Stand in water or under low ceiling > ascend ladder (without the jump and grab)
ANIMATION_LARA_LADDER_UP = 161, // Ascend ladder
ANIMATION_LARA_LADDER_UP_STOP_RIGHT = 162, // Ascend ladder > hang still on ladder (right foot higher)
ANIMATION_LARA_LADDER_UP_STOP_LEFT = 163, // Ascend ladder > hang still on ladder (left foot higher)
ANIMATION_LARA_LADDER_IDLE = 164, // Hang still on ladder
ANIMATION_LARA_LADDER_UP_START = 165, // Hang still on ladder > ascend ladder
ANIMATION_LARA_LADDER_DOWN_STOP_LEFT = 166, // Descend ladder > hang still on ladder (left foot higher)
ANIMATION_LARA_LADDER_DOWN_STOP_RIGHT = 167, // Descend ladder > hang still on ladder (right foot higher)
ANIMATION_LARA_LADDER_DOWN = 168, // Descend ladder
ANIMATION_LARA_LADDER_DOWN_START = 169, // Hang still on ladder > descend ladder
ANIMATION_LARA_LADDER_RIGHT = 170, // Climb sideways right on ladder
ANIMATION_LARA_LADDER_LEFT = 171, // Climb sideways left on ladder
ANIMATION_LARA_LADDER_HANG = 172, // Hang by the hands on ladder
ANIMATION_LARA_LADDER_HANG_TO_IDLE = 173, // Hang by the hands on ladder > gain footing on ladder
ANIMATION_LARA_LADDER_TO_STAND = 174, // Hang still on ladder > pull up > stand
ANIMATION_LARA_UNKNOWN_175 = 175, // ??? > stand still
ANIMATION_LARA_ONWATER_TO_WADE_SHALLOW = 176, // Swim forwards on water surface > wade (the depth change is very small) (?)
ANIMATION_LARA_WADE = 177, // Wade
ANIMATION_LARA_RUN_TO_WADE_LEFT = 178, // Run > wade (left foot first)
ANIMATION_LARA_RUN_TO_WADE_RIGHT = 179, // Run > wade (right foot first)
ANIMATION_LARA_WADE_TO_RUN_LEFT = 180, // Wade > run (left foot first)
ANIMATION_LARA_WADE_TO_RUN_RIGHT = 181, // Wade > run (right foot first)
ANIMATION_LARA_LADDER_BACKFLIP_START = 182, // Hang still on ladder > jump backwards off ladder, first part > ANIMATION_LARA_LADDER_BACKFLIP_END
ANIMATION_LARA_LADDER_BACKFLIP_END = 183, // Jump backwards off ladder, second part > jump backwards (from ANIMATION_LARA_LADDER_BACKFLIP_START)
ANIMATION_LARA_WADE_TO_STAY_RIGHT = 184, // Wade > stand (right foot first)
ANIMATION_LARA_WADE_TO_STAY_LEFT = 185, // Wade > stand (left foot first)
ANIMATION_LARA_STAY_TO_WADE = 186, // Stand > wade
ANIMATION_LARA_LADDER_UP_HANDS = 187, // Hang by the hands on ladder > ascend ladder with the the hands only
ANIMATION_LARA_LADDER_DOWN_HANDS = 188, // Hang by the hands on ladder > descend ladder with the hands only
ANIMATION_LARA_FLARE_THROW = 189, // Throw flare away (standing)
ANIMATION_LARA_ONWATER_TO_WADE_DEEP = 190, // Swim forwards on water surface > wade (the depth transition is greater) (?)
ANIMATION_LARA_ONWATER_TO_LAND_LOW = 191, // Pull out of water (onto ledge even with the water surface) > stand
ANIMATION_LARA_UNDERWATER_TO_WADE = 192, // Swim underwater > stand in shallow water
ANIMATION_LARA_ONWATER_TO_WADE = 193, // Tread water on water surface > stand in shallow water
ANIMATION_LARA_LADDER_TO_HANDS_DOWN = 194, // Hang still on ladder > descend ladder > hang by the hands
ANIMATION_LARA_SWITCH_SMALL_DOWN = 195, // Activate horizontal lever switch (electrical switch)
ANIMATION_LARA_SWITCH_SMALL_UP = 196, // Deactivate horizontal lever switch (electrical switch)
ANIMATION_LARA_BUTTON_PUSH = 197, // Push small button
ANIMATION_LARA_UNDERWATER_SWIM_TO_STILL_HUDDLE = 198, // Stop swimming underwater in deepsea suit (in middle stage of float-swimming animation) > drift underwater (Deepsea Dive)
ANIMATION_LARA_UNDERWATER_SWIM_TO_STILL_SPRAWL = 199, // Stop swimming underwater in deepsea suit (in late stage of float-swimming animation) > drift underwater (Deepsea Dive)
ANIMATION_LARA_UNDERWATER_SWIM_TO_STILL_MEDIUM = 200, // Stop swimming underwater in deepsea suit (in early stage of float-swimming animation) > drift underwater (Deepsea Dive)
ANIMATION_LARA_LADDER_TO_HANDS_RIGHT = 201, // Climb sideways right on ladder > hang by the hands
ANIMATION_LARA_LADDER_TO_HANDS_LEFT = 202, // Climb sideways left on ladder > hang by the hands
ANIMATION_LARA_UNDERWATER_ROLL_BEGIN = 203, // Roll underwater, first part > ANIMATION_LARA_UNDERWATER_ROLL_END
ANIMATION_LARA_FLARE_PICKUP = 204, // Pick up flare from floor while standing (left hand)
ANIMATION_LARA_UNDERWATER_ROLL_END = 205, // Roll underwater, second part > drift underwater (from ANIMATION_LARA_UNDERWATER_ROLL_BEGIN)
ANIMATION_LARA_UNDERWATER_FLARE_PICKUP = 206, // Pick up flare while swimming in deepsea suit (left hand) (Russia-levels)
ANIMATION_LARA_RUNNING_JUMP_ROLL_BEGIN = 207, // Jump forwards with backtwist (after running takeoff), first part > ANIMATION_LARA_RUNNING_JUMP_ROLL_END
ANIMATION_LARA_SOMERSAULT = 208, // Somersault during swan dive
ANIMATION_LARA_RUNNING_JUMP_ROLL_END = 209, // Jump forwards with backtwist (after running takeoff), second part (from ANIMATION_LARA_RUNNING_JUMP_ROLL_BEGIN)
ANIMATION_LARA_STANDING_JUMP_ROLL_BEGIN = 210, // Jump forwards with backtwist (after standing takeoff), first part > ANIMATION_LARA_STANDING_JUMP_ROLL_END
ANIMATION_LARA_STANDING_JUMP_ROLL_END = 211, // Jump forwards with backtwist (after standing takeoff), second part (from ANIMATION_LARA_STANDING_JUMP_ROLL_BEGIN)
ANIMATION_LARA_BACKWARDS_JUMP_ROLL_BEGIN = 212, // Jump backwards with forward twist, first part > ANIMATION_LARA_BACKWARDS_JUMP_ROLL_END
ANIMATION_LARA_BACKWARDS_JUMP_ROLL_END = 213, // Jump backwards with forward twist, second part (from ANIMATION_LARA_BACKWARDS_JUMP_ROLL_BEGIN)
ANIMATION_LARA_TR345_ZIPLINE_GRAB = 214, // Stand > grab zipline
ANIMATION_LARA_TR345_ZIPLINE_RIDE = 215, // Ride zipline
ANIMATION_LARA_TR345_ZIPLINE_FALL = 216, // Fall off zipline
ANIMATION_LARA_TR345_STAND_TO_CROUCH = 217, // Stand > crouch
ANIMATION_LARA_CROUCH_ROLL_FORWARD_BEGIN = 218, // Crouch with right elbow on knee > take off for crouched roll (not used)
ANIMATION_LARA_CROUCH_ROLL_FORWARD_CONTINUE = 219, // Crouched roll (not used)
ANIMATION_LARA_CROUCH_ROLL_FORWARD_END = 220, // Crouched roll > crouch
ANIMATION_LARA_CROUCH_TO_STAND = 221, // Crouch > stand
ANIMATION_LARA_CROUCH_IDLE = 222, // Crouch
ANIMATION_LARA_SPRINT = 223, // Sprint
ANIMATION_LARA_RUN_TO_SPRINT_LEFT = 224, // Run > sprint (left foot first)
ANIMATION_LARA_RUN_TO_SPRINT_RIGHT = 225, // Run > sprint (right foot first)
ANIMATION_LARA_SPRINT_SLIDE_STAND_RIGHT = 226, // Sprint > skidding halt > stand (right foot first)
ANIMATION_LARA_SPRINT_SLIDE_STAND_RIGHT_BETA = 227, // ??? > stand (right foot first) (not used)
ANIMATION_LARA_SPRINT_SLIDE_STAND_LEFT = 228, // Sprint > skidding halt > stand (left foot first)
ANIMATION_LARA_SPRINT_SLIDE_STAND_LEFT_BETA = 229, // ??? > stand (left foot first) (not used)
ANIMATION_LARA_SPRINT_TO_ROLL_LEFT = 230, // Sprint > take off for sprinting roll (left foot first) > ANIMATION_LARA_SPRINT_ROLL_LEFT_TO_RUN
ANIMATION_LARA_SPRINT_TO_ROLL_LEFT_BETA = 231, // Stumbling takeoff for sprinting roll (not used) (?)
ANIMATION_LARA_SPRINT_ROLL_LEFT_TO_RUN = 232, // Sprinting roll > run (from ANIMATION_LARA_SPRINT_TO_ROLL_LEFT)
ANIMATION_LARA_MONKEY_GRAB = 233, // Grab monkey-bars during jump
ANIMATION_LARA_MONKEY_IDLE = 234, // Hang still by the hands in free air (from monkey-bars or wafer thin ledge)
ANIMATION_LARA_MONKEY_FALL = 235, // Hang still by the hands in free air (from monkey-bars or wafer thin ledge) > fall
ANIMATION_LARA_MONKEY_FORWARD = 236, // Monkey-swing forwards
ANIMATION_LARA_MONKEY_STOP_LEFT = 237, // Monkey-swing forwards > hang still from monkey-bars (left hand first)
ANIMATION_LARA_MONKEY_STOP_RIGHT = 238, // Monkey-swing forwards > hang still from monkey-bars (right hand first)
ANIMATION_LARA_MONKEY_IDLE_TO_FORWARD_LEFT = 239, // Hang still from monkey-bars > monkey-swing forwards (left hand moved first)
ANIMATION_LARA_SPRINT_TO_ROLL_ALTERNATE_BEGIN = 240, // Sprint > take off for sprinting roll, first part (not used) (?) > ANIMATION_LARA_SPRINT_TO_ROLL_ALTERNATE_CONTINUE
ANIMATION_LARA_SPRINT_TO_ROLL_ALTERNATE_CONTINUE = 241, // Take off for sprinting roll, second part (not used) (?) (from ANIMATION_LARA_SPRINT_TO_ROLL_ALTERNATE_BEGIN) > ANIMATION_LARA_SPRINT_TO_ROLL_ALTERNATE_END
ANIMATION_LARA_SPRINT_TO_ROLL_ALTERNATE_END = 242, // Sprinting roll > run (not used) (?)
ANIMATION_LARA_SPRINT_TO_RUN_LEFT = 243, // Sprint > run (left foot first)
ANIMATION_LARA_SPRINT_TO_RUN_RIGHT = 244, // Sprint > run (right foot first)
ANIMATION_LARA_CROUCH_PREPARE = 245, // 'Springy' crouch (used as a link to and from crouching animations)
ANIMATION_LARA_SLIDE_FORWARD_TO_RUN = 246, // Slide forwards down steep slope (3 clicks high) > stumbling landing > run
ANIMATION_LARA_CROUCH_ROLL_FORWARD_BEGIN_ALTERNATE = 247, // Crouch > take off for crouching roll (not used)
ANIMATION_LARA_JUMP_FORWARD_BEGIN_TO_GRAB = 248, // Jump forwards > grab (at early stage during jump)
ANIMATION_LARA_JUMP_FORWARD_END_TO_GRAB = 249, // Jump forwards > grab (at middle stage during jump)
ANIMATION_LARA_RUN_TO_GRAB_RIGHT = 250, // Grab during running takeoff (right foot first) (?)
ANIMATION_LARA_RUN_TO_GRAB_LEFT = 251, // Grab during running takeoff (left foot first) (?)
ANIMATION_LARA_MONKEY_IDLE_TO_FORWARD_RIGHT = 252, // Hang still from monkey-bars > monkey-swing forwards (right hand moved first)
ANIMATION_LARA_MONKEY_STRAFE_LEFT = 253, // Shimmy left
ANIMATION_LARA_MONKEY_STRAFE_LEFT_END = 254, // Shimmy (left) > hang still by the hands (?)
ANIMATION_LARA_MONKEY_STRAFE_RIGHT = 255, // Shimmy right
ANIMATION_LARA_MONKEY_STRAFE_RIGHT_END = 256, // Shimmy (right) > hang still by the hands (not used) (?)
ANIMATION_LARA_MONKEY_TURN_AROUND = 257, // Turn around at the spot while hanging from monkey-bars (not used) (?)
ANIMATION_LARA_CROUCH_TO_CRAWL_BEGIN = 258, // Crouch > crawl position, first part > ANIMATION_LARA_CROUCH_TO_CRAWL_CONTINUE
ANIMATION_LARA_CRAWL_TO_CROUCH_BEGIN = 259, // Crawl position > crouch, first part > ANIMATION_LARA_CRAWL_TO_CROUCH_END
ANIMATION_LARA_CRAWL_FORWARD = 260, // Crawl forwards
ANIMATION_LARA_CRAWL_IDLE_TO_FORWARD = 261, // Crawl position > crawl forwards
ANIMATION_LARA_CRAWL_FORWARD_TO_IDLE_BEGIN_RIGHT = 262, // Crawl forwards > crawl position, first part (right foot first) > ANIMATION_LARA_CRAWL_FORWARD_TO_IDLE_END_RIGHT
ANIMATION_LARA_CRAWL_IDLE = 263, // Crawl position
ANIMATION_LARA_CROUCH_TO_CRAWL_END = 264, // Crouch > crawl position, third part (from ANIMATION_LARA_CROUCH_TO_CRAWL_CONTINUE)
ANIMATION_LARA_CROUCH_IDLE_SMASH = 265, // 'Slightly springy' crouch (not used?)
ANIMATION_LARA_CRAWL_FORWARD_TO_IDLE_END_RIGHT = 266, // Crawl forwards > crawl position, second part (from ANIMATION_LARA_CRAWL_FORWARD_TO_IDLE_BEGIN_RIGHT)
ANIMATION_LARA_CRAWL_FORWARD_TO_IDLE_BEGIN_LEFT = 267, // Crawl forwards > crawl position, first part (left foot first) > ANIMATION_LARA_CRAWL_FORWARD_TO_IDLE_END_LEFT
ANIMATION_LARA_CRAWL_FORWARD_TO_IDLE_END_LEFT = 268, // Crawl forwards > crawl positon, second part (from ANIMATION_LARA_CRAWL_FORWARD_TO_IDLE_BEGIN_LEFT)
ANIMATION_LARA_CRAWL_TURN_LEFT = 269, // Crawl position > turn left crawling
ANIMATION_LARA_CRAWL_TURN_RIGHT = 270, // Crawl position > turn right crawling
ANIMATION_LARA_MONKEY_TURN_LEFT = 271, // Hang still from monkey-bars > turn left hanging from monkey-bars
ANIMATION_LARA_MONKEY_TURN_RIGHT = 272, // Hang still from monkey-bars > turn right hanging from monkey-bars
ANIMATION_LARA_CROUCH_TO_CRAWL_CONTINUE = 273, // Crouch > crawl position, second part (from ANIMATION_LARA_CROUCH_TO_CRAWL_BEGIN) > ANIMATION_LARA_CROUCH_TO_CRAWL_END
ANIMATION_LARA_CRAWL_TO_CROUCH_END = 274, // Crawl position > crouch, second part (from ANIMATION_LARA_CRAWL_TO_CROUCH_BEGIN)
ANIMATION_LARA_CRAWL_IDLE_TO_BACKWARD = 275, // Crawl > crawl backwards
ANIMATION_LARA_CRAWL_BACKWARD = 276, // Crawl backwards
ANIMATION_LARA_CRAWL_BACKWARD_TO_IDLE_BEGIN_RIGHT = 277, // Crawl backwards > crawl position, first part (right foot moved first) > ANIMATION_LARA_CRAWL_BACKWARD_TO_IDLE_END_RIGHT
ANIMATION_LARA_CRAWL_BACKWARD_TO_IDLE_END_RIGHT = 278, // Crawl backwards > crawl position, second part (from ANIMATION_LARA_CRAWL_BACKWARD_TO_IDLE_BEGIN_RIGHT)
ANIMATION_LARA_CRAWL_BACKWARD_TO_IDLE_BEGIN_LEFT = 279, // Crawl backwards > crawl position, first part (left foot moved first) > ANIMATION_LARA_CRAWL_BACKWARD_TO_IDLE_END_LEFT
ANIMATION_LARA_CRAWL_BACKWARD_TO_IDLE_END_LEFT = 280, // Crawl backwards > crawl position, second part (from ANIMATION_LARA_CRAWL_BACKWARD_TO_IDLE_BEGIN_LEFT)
ANIMATION_LARA_CRAWL_TURN_LEFT_END = 281, // Turn left crawling > crawl position
ANIMATION_LARA_CRAWL_TURN_RIGHT_END = 282, // Turn right crawling > crawl position
ANIMATION_LARA_MONKEY_TURN_LEFT_EARLY_END = 283, // Turn left hanging from monkey-bars > hang still from monkey-bars (at early stage during turn)
ANIMATION_LARA_MONKEY_TURN_LEFT_LATE_END = 284, // Turn left hanging from monkey-bars > hang still from monkey-bars (at late stage during turn)
ANIMATION_LARA_MONKEY_TURN_RIGHT_EARLY_END = 285, // Turn right hanging from monkey-bars > hang still from monkey-bars (early stage during turn)
ANIMATION_LARA_MONKEY_TURN_RIGHT_LATE_END = 286, // Turn right hanging from monkey-bars > hang still from monkey-bars (at late stage during turn)
ANIMATION_LARA_HANG_TO_CROUCH_BEGIN = 287, // Hang by the hands > pull up > crouch, first part > ANIMATION_LARA_HANG_TO_CROUCH_END
ANIMATION_LARA_HANG_TO_CROUCH_END = 288, // Crouch, second part (after pulling up from hanging by the hands) (from ANIMATION_LARA_HANG_TO_CROUCH_BEGIN)
ANIMATION_LARA_CRAWL_TO_HANG_BEGIN = 289, // Crawl position > climb down > hang by the hands, first part >ANIMATION_LARA_CRAWL_TO_HANG_CONTINUE
ANIMATION_LARA_CRAWL_TO_HANG_CONTINUE = 290, // Hang by the hands, second part (after climbing down from crawl position) (from ANIMATION_LARA_CRAWL_TO_HANG_BEGIN) > ANIMATION_LARA_CRAWL_TO_HANG_END
ANIMATION_LARA_CROUCH_PICKUP = 291, // Crouching pickup (right hand)
ANIMATION_LARA_CRAWL_PICKUP = 292, // Crawling pickup (not used)
ANIMATION_LARA_CROUCH_SMASH_FORWARD = 293, // Jerk forwards hurt (chrouching)
ANIMATION_LARA_CROUCH_SMASH_BACKWARD = 294, // Jerk backwards hurt (chrouching)
ANIMATION_LARA_CROUCH_SMASH_RIGHT = 295, // Jerk right hurt (chrouching)
ANIMATION_LARA_CROUCH_SMASH_LEFT = 296, // Jerk left hurt (chrouching)
ANIMATION_LARA_CRAWL_SMASH_FORWARD = 297, // Jerk forwards hurt (crawling)
ANIMATION_LARA_CRAWL_SMASH_BACKWARD = 298, // Jerk backwards hurt (crawling)
ANIMATION_LARA_CRAWL_SMASH_RIGHT = 299, // Jerk right hurt (crawling)
ANIMATION_LARA_CRAWL_SMASH_LEFT = 300, // Jerk left hurt (crawling)
ANIMATION_LARA_CRAWL_DEATH = 301, // Crawl > die
ANIMATION_LARA_CRAWL_TO_HANG_END = 302, // Hang by the hands (after climbing down from crawl position), third part (from ANIMATION_LARA_CRAWL_TO_HANG_CONTINUE)
ANIMATION_LARA_CROUCH_ABORT = 303, // About to crouch > stand (cancelling a stand > crouch command)
ANIMATION_LARA_RUN_TO_CROUCH_LEFT_BEGIN = 304, // Run > crouch, first part (left foot first) > ANIMATION_LARA_RUN_TO_CROUCH_LEFT_END
ANIMATION_LARA_RUN_TO_CROUCH_RIGHT_BEGIN = 305, // Run > crouch, first part (right foot first) > ANIMATION_LARA_RUN_TO_CROUCH_RIGHT_END
ANIMATION_LARA_RUN_TO_CROUCH_LEFT_END = 306, // Crouch, second part (after running) > crouch (from ANIMATION_LARA_RUN_TO_CROUCH_LEFT_BEGIN)
ANIMATION_LARA_RUN_TO_CROUCH_RIGHT_END = 307, // Crouch, second part (after running) > crouch (from ANIMATION_LARA_RUN_TO_CROUCH_RIGHT_BEGIN)
ANIMATION_LARA_SPRINT_TO_ROLL_RIGHT = 308, // Sprint > take off for sprinting roll (right foot first) > ANIMATION_LARA_SPRINT_ROLL_RIGHT_TO_RUN
ANIMATION_LARA_SPRINT_ROLL_RIGHT_TO_RUN = 309, // Sprinting roll > run (from ANIMATION_LARA_SPRINT_TO_ROLL_RIGHT)
ANIMATION_LARA_SPRINT_TO_CROUCH_LEFT = 310, // Sprint > small roll > crouch (left foot first)
ANIMATION_LARA_SPRINT_TO_CROUCH_RIGHT = 311, // Sprint > small roll > crouch (right foot first)
ANIMATION_LARA_CROUCH_PICKUP_FLARE = 312, // Pick up flare while crouching (left hand)
ANIMATION_LARA_DOOR_OPEN_FORWARD = 313, // Use doorknob to open door and push it open
ANIMATION_LARA_DOOR_OPEN_BACK = 314, // Use doorknob to open door and pull it open
ANIMATION_LARA_DOOR_KICK = 315, // Kick door open
ANIMATION_LARA_GIANT_BUTTON_PUSH = 316, // Push Sequence button
ANIMATION_LARA_FLOOR_TRAPDOOR_OPEN = 317, // Open trapdoor in floor
ANIMATION_LARA_CEILING_TRAPDOOR_OPEN = 318, // Grab (after upward jump) and open trapdoor in ceiling*
ANIMATION_LARA_ROUND_HANDLE_GRAB_CLOCKWISE = 319, // Stand > grab turn handle (clockwise)
ANIMATION_LARA_ROUND_HANDLE_GRAB_COUNTERCLOCKWISE = 320, // Stand > grab turn handle (counter-clockwise)
ANIMATION_LARA_COGWHEEL_PULL = 321, // Pull cog wheel
ANIMATION_LARA_COGWHEEL_GRAB = 322, // Stand > grab cog wheel
ANIMATION_LARA_COGWHEEL_UNGRAB = 323, // Let go of cog wheel > stand
ANIMATION_LARA_LEVERSWITCH_PUSH = 324, // Use lever switch
ANIMATION_LARA_HOLE_GRAB = 325, // Use hole-in-wall switch/pickup
ANIMATION_LARA_STAY_TO_POLE_GRAB = 326, // Stand > climb onto vertical pole
ANIMATION_LARA_POLE_JUMP = 327, // Jump off vertical pole
ANIMATION_LARA_POLE_IDLE = 328, // Hang still on vertical pole
ANIMATION_LARA_POLE_CLIMB_UP = 329, // Climb vertical pole
ANIMATION_LARA_POLE_FALL = 330, // Hang still on vertical pole > fall
ANIMATION_LARA_JUMP_FORWARD_TO_POLE_GRAB = 331, // Jump forwards > grab and climb onto vertical pole
ANIMATION_LARA_POLE_TURN_LEFT_BEGIN = 332, // Hang still on vertical pole > turn clockwise on vertical pole
ANIMATION_LARA_POLE_TURN_RIGHT_BEGIN = 333, // Hang still on vertical pole > turn counter-clockwise on vertical pole
ANIMATION_LARA_POLE_IDLE_TO_CLIMB_DOWN = 334, // Hang still on vertical pole > slide down vertical pole
ANIMATION_LARA_POLE_CLIMB_DOWN = 335, // Slide down vertical pole
ANIMATION_LARA_POLE_CLIMB_DOWN_TO_IDLE = 336, // Slide down vertical pole > hang still on vertical pole
ANIMATION_LARA_JUMP_UP_TO_POLE_GRAB = 337, // Jump upwards > grab and climb onto vertical pole
ANIMATION_LARA_POLE_CLIMB_UP_INBETWEEN = 338, // Climb vertical pole > hang still on vertical pole
ANIMATION_LARA_PULLEY_GRAB = 339, // Stand > grab pulley
ANIMATION_LARA_PULLEY_PULL = 340, // Pull pulley
ANIMATION_LARA_PULLEY_UNGRAB = 341, // Let go of pulley
ANIMATION_LARA_POLE_GRAB_TO_STAY = 342, // Hang still on vertical pole > put feet on floor > stand
ANIMATION_LARA_POLE_TURN_LEFT = 343, // Turn clockwise on vertical pole (not used?)
ANIMATION_LARA_POLE_TURN_LEFT_END = 344, // Turn clockwise on vertical pole > hang still on vertical pole
ANIMATION_LARA_POLE_TURN_RIGHT = 345, // Turn counter-clockwise on vertical pole (not used?)
ANIMATION_LARA_POLE_TURN_RIGHT_END = 346, // Turn counter-clockwise on vertical pole > hang still on vertical pole
ANIMATION_LARA_ROUND_HANDLE_PUSH_RIGHT_BEGIN = 347, // Push turn handle (clockwise), first part > ANIMATION_LARA_ROUND_HANDLE_PUSH_RIGHT_CONTINUE
ANIMATION_LARA_ROUND_HANDLE_PUSH_RIGHT_CONTINUE = 348, // Push turn handle (clockwise), second part (from ANIMATION_LARA_ROUND_HANDLE_PUSH_RIGHT_BEGIN)
ANIMATION_LARA_ROUND_HANDLE_PUSH_RIGHT_END = 349, // Push turn handle (clockwise) > stand
ANIMATION_LARA_ROUND_HANDLE_PUSH_LEFT_BEGIN = 350, // Push turn handle (counter-clockwise), first part > ANIMATION_LARA_ROUND_HANDLE_PUSH_LEFT_BEGIN
ANIMATION_LARA_ROUND_HANDLE_PUSH_LEFT_CONTINUE = 351, // Push turn handle (counter-clockwise), second part (from ANIMATION_LARA_ROUND_HANDLE_PUSH_RIGHT_END)
ANIMATION_LARA_ROUND_HANDLE_PUSH_LEFT_END = 352, // Push turn handle (counter-clockwise) > stand
ANIMATION_LARA_CROUCH_TURN_LEFT = 353, // Crouch > turn left crouching
ANIMATION_LARA_CROUCH_TURN_RIGHT = 354, // Crouch > turn right crouching
ANIMATION_LARA_HANG_AROUND_LEFT_OUTER_BEGIN = 355, // Shimmy around left outer corner, first part > ANIMATION_LARA_HANG_AROUND_LEFT_OUTER_END
ANIMATION_LARA_HANG_AROUND_LEFT_OUTER_END = 356, // Shimmy around left outer corner, second part (from ANIMATION_LARA_HANG_AROUND_LEFT_OUTER_BEGIN)
ANIMATION_LARA_HANG_AROUND_RIGHT_OUTER_BEGIN = 357, // Shimmy around right outer corner, first part > ANIMATION_LARA_HANG_AROUND_RIGHT_OUTER_END
ANIMATION_LARA_HANG_AROUND_RIGHT_OUTER_END = 358, // Shimmy around right outer corner, second part (from ANIMATION_LARA_HANG_AROUND_RIGHT_OUTER_BEGIN)
ANIMATION_LARA_HANG_AROUND_LEFT_INNER_BEGIN = 359, // Shimmy around left inner corner, first part > ANIMATION_LARA_HANG_AROUND_LEFT_INNER_END
ANIMATION_LARA_HANG_AROUND_LEFT_INNER_END = 360, // Shimmy around left inner corner, second part (from ANIMATION_LARA_HANG_AROUND_LEFT_INNER_BEGIN)
ANIMATION_LARA_HANG_AROUND_RIGHT_INNER_BEGIN = 361, // Shimmy around right inner corner, first part > ANIMATION_LARA_HANG_AROUND_RIGHT_INNER_END
ANIMATION_LARA_HANG_AROUND_RIGHT_INNER_END = 362, // Shimmy around right inner corner, second part (from ANIMATION_LARA_HANG_AROUND_RIGHT_INNER_BEGIN)
ANIMATION_LARA_LADDER_AROUND_LEFT_OUTER_BEGIN = 363, // Climb sideways on ladder around left outer corner, first part > ANIMATION_LARA_LADDER_AROUND_LEFT_OUTER_END
ANIMATION_LARA_LADDER_AROUND_LEFT_OUTER_END = 364, // Climb sideways on ladder around left outer corner, second part (from ANIMATION_LARA_LADDER_AROUND_LEFT_OUTER_BEGIN)
ANIMATION_LARA_LADDER_AROUND_RIGHT_OUTER_BEGIN = 365, // Climb sideways on ladder around right outer corner, first part > ANIMATION_LARA_LADDER_AROUND_RIGHT_OUTER_END
ANIMATION_LARA_LADDER_AROUND_RIGHT_OUTER_END = 366, // Climb sideways on ladder around right outer corner, second part (from ANIMATION_LARA_LADDER_AROUND_RIGHT_OUTER_BEGIN)
ANIMATION_LARA_LADDER_AROUND_LEFT_INNER_BEGIN = 367, // Climb sideways on ladder around left inner corner, first part > ANIMATION_LARA_LADDER_AROUND_LEFT_INNER_END
ANIMATION_LARA_LADDER_AROUND_LEFT_INNER_END = 368, // Climb sideways on ladder around left inner corner, second part (from ANIMATION_LARA_LADDER_AROUND_LEFT_INNER_BEGIN)
ANIMATION_LARA_LADDER_AROUND_RIGHT_INNER_BEGIN = 369, // Climb sideways on ladder around right inner corner, first part > ANIMATION_LARA_LADDER_AROUND_RIGHT_INNER_END
ANIMATION_LARA_LADDER_AROUND_RIGHT_INNER_END = 370, // Climb sideways on ladder around right inner corner, second part (from ANIMATION_LARA_LADDER_AROUND_RIGHT_INNER_BEGIN)
ANIMATION_LARA_MONKEY_TO_ROPE_BEGIN = 371, // Hang from monkey-bars/jump upwards > grab rope (?)
ANIMATION_LARA_TRAIN_DEATH = 372, // Fall off train > die
ANIMATION_LARA_MONKEY_TO_ROPE_END = 373, // Loose momentum on rope > wrap legs around rope > hang still on rope
ANIMATION_LARA_ROPE_IDLE = 374, // Hang still on rope
ANIMATION_LARA_ROPE_DOWN_BEGIN = 375, // Hang still on rope > slide down rope
ANIMATION_LARA_ROPE_UP = 376, // Climb rope
ANIMATION_LARA_ROPE_IDLE_TO_SWING_SOFT = 377, // Hang still on rope > begin to swing with still some momentum left (no kick necessary)(?)
ANIMATION_LARA_ROPE_GRAB_TO_FALL = 378, // Have just grabbed rope > fall (?)
ANIMATION_LARA_ROPE_JUMP_TO_GRAB = 379, // Jump forwards > grab rope
ANIMATION_LARA_ROPE_IDLE_TO_BACKFLIP = 380, // Somersault from rope to ledge? (not used)
ANIMATION_LARA_ROPE_SWING_TO_FALL_SEMIFRONT = 381, // Swing on rope > fall (when Lara is in the fore end of the swing - haft past four o'clock)(?)
ANIMATION_LARA_ROPE_SWING_TO_FALL_MIDDLE = 382, // Swing on rope> fall (when Lara is in the middle of the swing) (?)
ANIMATION_LARA_ROPE_SWING_TO_FALL_BACK = 383, // Swing on rope > fall (when Lara is in the back end of the swing) (?)
ANIMATION_LARA_ROPE_DOWN = 384, // Slide down rope
ANIMATION_LARA_ROPE_DOWN_TO_IDLE = 385, // Slide down rope > hang still on rope
ANIMATION_LARA_ROPE_SWING_TO_TRY_HANG_BACK = 386, // Swing on rope > jump off to grab ledge (when Lara is in the back end of the swing)
ANIMATION_LARA_ROPE_IDLE_TO_SWING = 387, // Hang still on rope > give a kick to gain momentum to swing (begin to swing)
ANIMATION_LARA_ROPE_IDLE_TO_SWING_SEMIMIDDLE = 388, // Swing on rope> fall (when Lara is just before the middle of the swing - 7 o'clock) (?)
ANIMATION_LARA_ROPE_IDLE_TO_SWING_HALFMIDDLE = 389, // Swing on rope> fall (when Lara is just before the middle of the swing - half past six o'clock) (?)
ANIMATION_LARA_ROPE_SWING_TO_FALL_FRONT = 390, // Swing on rope > fall (when Lara is in the fore end of the swing - 5 o'clock) (?)
ANIMATION_LARA_ROPE_GRAB_TO_FALL_ALTERNATE = 391, // Have just grabbed rope > fall (same animation as ANIMATION_LARA_ROPE_GRAB_TO_FALL?) (?)
ANIMATION_LARA_ROPE_TURN_CLOCKWISE = 392, // Turn clockwise on rope
ANIMATION_LARA_ROPE_TURN_COUNTER_CLOCKWISE = 393, // Turn counter-clockwise on rope
ANIMATION_LARA_ROPE_SWING_FORWARD_SEMIHARD = 394, // Swing forwards on rope with much momentum
ANIMATION_LARA_ROPE_LADDER_TO_HANDS_DOWN_ALTERNATE = 395, // Hang still on ladder > abandon footing > hang by the hands alone (not used) (?)
ANIMATION_LARA_ROPE_SWING_BACK_CONTINUE = 396, // Swing backwards on rope, second part (from ANIMATION_LARA_ROPE_SWING_BACK_BEGIN) > ANIMATION_LARA_ROPE_SWING_BACK_END
ANIMATION_LARA_ROPE_SWING_BACK_END = 397, // Swing backwards on rope, third part (from ANIMATION_LARA_ROPE_SWING_BACK_CONTINUE)
ANIMATION_LARA_ROPE_SWING_BACK_BEGIN = 398, // Swing backwards on rope, first part > ANIMATION_LARA_ROPE_SWING_BACK_CONTINUE
ANIMATION_LARA_ROPE_SWING_FORWARD_SOFT = 399, // Swing forwards on rope with little momentum (?)
ANIMATION_LARA_WATERSKIN_EMPTY = 400, // Empty waterskin
ANIMATION_LARA_WATERSKIN_FILL = 401, // Fill waterskin
ANIMATION_LARA_WATERSKIN_POUR_ON_SCALE = 402, // Pour waterskin on scale
ANIMATION_LARA_DOOR_OPEN_CROWBAR = 403, // Open door with crowbar
ANIMATION_LARA_ROPE_SWING_FORWARD_HARD = 404, // Reach fore end of swing on rope with very much momentum
ANIMATION_LARA_ROPE_CHANGE_ROPE = 405, // Swing on rope and grab a new rope? (not used?)
ANIMATION_LARA_ROPE_SWING_TO_TRY_HANG_FRONT2 = 406, // Swing on rope > jump off to grab ledge (when Lara is in the fore end of the swing - 4 o'clock)
ANIMATION_LARA_ROPE_SWING_TO_TRY_HANG_MIDDLE = 407, // Swing on rope > jump off to grab ledge (when Lara is right in the middle of the swing)
ANIMATION_LARA_ROPE_SWING_BLOCK = 408, // Swing forth and back with almost no momentum (Lara is too high on the rope?)
ANIMATION_LARA_ROPE_SWING_TO_TRY_HANG_SEMIMIDDLE = 409, // Swing on rope > jump off to grab ledge (when Lara is just before the middle of the swing)
ANIMATION_LARA_ROPE_SWING_TO_TRY_HANG_FRONT3 = 410, // Swing on rope > jump off to grab ledge (when Lara is in the fore end of the swing - 5 o'clock)
ANIMATION_LARA_ROPE_SWING_TO_TRY_HANG_FRONT1 = 411, // Swing on rope > jump off to grab ledge (when Lara is in the fore end of the swing - 3 o'clock)
ANIMATION_LARA_DOUBLEDOORS_PUSH = 412, // Push double doors
ANIMATION_LARA_BIG_BUTTON_PUSH = 413, // Push big button
ANIMATION_LARA_JUMPSWITCH = 414, // Pull jumpswitch
ANIMATION_LARA_UNDERWATER_PULLEY = 415, // Pull underwater switch in the ceiling
ANIMATION_LARA_UNDERWATER_DOOR_OPEN = 416, // Open underwater_door
ANIMATION_LARA_PUSHABLE_PUSH_TO_STAND = 417, // Push pushable > stand
ANIMATION_LARA_PUSHABLE_PULL_TO_STAND = 418, // Pull pushable > stand
ANIMATION_LARA_CROWBAR_USE_ON_WALL = 419, // Use crowbar to get puzzle item from wall
ANIMATION_LARA_CROWBAR_USE_ON_FLOOR = 420, // Use crowbar to activate broken leverswitch (Desert Railroad)
ANIMATION_LARA_CRAWL_JUMP_DOWN = 421, // Roll forwards out of crawlspace (not used)
ANIMATION_LARA_HARP_PLAY = 422, // Play harp (The Lost Library)
ANIMATION_LARA_PUT_TRIDENT = 423, // Place trident on Poseidon statue (Temple of Poseidon)
ANIMATION_LARA_PICKUP_PEDESTAL_HIGH = 424, // Standing pickup from high pedestal (Lara's height)
ANIMATION_LARA_PICKUP_PEDESTAL_LOW = 425, // Standing pickup from low pedestal (waist-height)
ANIMATION_LARA_ROTATE_SENET = 426, // Play game of senet (Tomb of Semerkhet)
ANIMATION_LARA_TORCH_LIGHT_1 = 427, // Light torch with flame 0-1 clicks high
ANIMATION_LARA_TORCH_LIGHT_2 = 428, // Light torch with flame 2-3 clicks high
ANIMATION_LARA_TORCH_LIGHT_3 = 429, // Light torch with flame 4-5 clicks high
ANIMATION_LARA_TORCH_LIGHT_4 = 430, // Light torch with flame 6-7 clicks high
ANIMATION_LARA_TORCH_LIGHT_5 = 431, // Light torch with flame higher than 7 clicks
ANIMATION_LARA_DETONATOR_USE = 432, // use mine detector
ANIMATION_LARA_CORRECT_POSITION_FRONT = 433, // Small steps forward to correct Lara's position (hardcoded, used to put line up Lara in front of switches and puzzles)
ANIMATION_LARA_CORRECT_POSITION_LEFT = 434, // Small steps to the left to corrcts Lara's position
ANIMATION_LARA_CORRECT_POSITION_RIGHT = 435, // Small steps to the right to correct Lara's position
ANIMATION_LARA_CROWBAR_USE_ON_FLOOR_FAIL = 436, // Use crowbar to break train link? (not used)
ANIMATION_LARA_USE_KEYCARD = 437, // Use swipe card
ANIMATION_LARA_DEATH_BLOWUP = 438, // Blown up by mine
ANIMATION_LARA_PICKUP_SARCOPHAGUS = 439, // Pickup from sarcophagus
ANIMATION_LARA_DRAG = 440, // Dragging dead body (City of the Dead)
ANIMATION_LARA_BINOCULARS = 441, // Look through binoculars (not used)
ANIMATION_LARA_DEATH_BIG_SCORPION = 442, // Picked up and tossed away by big scorpion
ANIMATION_LARA_ELEVATOR_RECOVER = 443, // Lara painfully gets to her feet after fall in elevator (VCI-levels)
ANIMATION_LARA_BEETLE_PUT = 444, // Wind up beetle > put beetle on floor
ANIMATION_LARA_DOZY = 445, // DOZY Animation
ANIMATION_LARA_TIGHTROPE_WALK = 446, // Walk on tightrope
ANIMATION_LARA_TIGHTROPE_WALK_TO_STAND = 447, // Walk on tightrope > stand on tightrope
ANIMATION_LARA_TIGHTROPE_STAND = 448, // Stand on tightrope
ANIMATION_LARA_TIGHTROPE_WALK_TO_STAND_CAREFUL = 449, // Walk on tightrope > tread carefully > stand on tightrope
ANIMATION_LARA_TIGHTROPE_STAND_TO_WALK = 450, // Stand on tightrope > walk on tightrope
ANIMATION_LARA_TIGHTROPE_TURN = 451, // Turn around on tightrope
ANIMATION_LARA_TIGHTROPE_LOOSE_LEFT = 452, // Stand on tightrope > loose balance and lean left
ANIMATION_LARA_TIGHTROPE_RECOVER_LEFT = 453, // Lean left on tightrope > regain balance and stand on tightrope
ANIMATION_LARA_TIGHTROPE_FALL_LEFT = 454, // Fall off tightrope (to the left)
ANIMATION_LARA_TIGHTROPE_LOOSE_RIGHT = 455, // Stand on tightrope > loose balance and lean right
ANIMATION_LARA_TIGHTROPE_RECOVER_RIGHT = 456, // Lean right on tightrope > regain balance and stand on tightrope
ANIMATION_LARA_TIGHTROPE_FALL_RIGHT = 457, // Fall off tightrope (to the right)
ANIMATION_LARA_TIGHTROPE_START = 458, // Stand > walk out on tightrope
ANIMATION_LARA_TIGHTROPE_FINISH = 459, // Walk off tightrope > stand
ANIMATION_LARA_DOVESWITCH_TURN = 460, // Examine and turn doveswitch (Rome-levels)
ANIMATION_LARA_BARS_GRAB = 461, // Jump forwards > grab horizontal pole
ANIMATION_LARA_BARS_SWING = 462, // Swing around horizontal pole
ANIMATION_LARA_BARS_JUMP = 463, // Jump off horizontal pole
ANIMATION_LARA_LOOT_CABINET = 464, // Open cabinet and search it
ANIMATION_LARA_LOOT_DRAWER = 465, // Open drawer and search it
ANIMATION_LARA_LOOT_SHELF = 466, // Search shelves
ANIMATION_LARA_RADIO_BEGIN = 467, // Stand > put hand to headgear to listen (VCI-levels)
ANIMATION_LARA_RADIO_IDLE = 468, // Hold hand on headgear and listen (VCI-levels)
ANIMATION_LARA_RADIO_END = 469, // Remove hand from headgear > stand (VCI-levels)
ANIMATION_LARA_VALVE_TURN = 470, // Turn valve wheel
ANIMATION_LARA_CROWBAR_USE_ON_WALL2 = 471, // Pull object off wall (to use as crowbar)
ANIMATION_LARA_LOOT_CHEST = 472, // Kneel to open box and pick up item (VCI-levels)
ANIMATION_LARA_LADDER_TO_CROUCH = 473, // Climb wall > pull up in crawlspace
ANIMATION_LARA_1CLICK_CRAWL_VAULT = 474, // 1 click crawlspace vault
ANIMATION_LARA_2CLICK_CRAWL_VAULT = 475, // 2 click crawlspace vault
ANIMATION_LARA_3CLICK_CRAWL_VAULT = 476, // 3 click crawlspace vault
ANIMATION_LARA_1CLICK_CRAWL_EXIT = 477, // 1 click crawlspace exit
ANIMATION_LARA_2CLICK_CRAWL_EXIT = 478, // 2 click crawlspace exit
ANIMATION_LARA_1CLICK_CRAWL_TO_CRAWL_UP = 479, // maneuver up 1 click in crawlspace
ANIMATION_LARA_1CLICK_CRAWL_TO_CRAWL_DOWN = 480, // maneuver down 1 click in crawlspace
ANIMATION_LARA_CLIMB_OUT_OF_WATER_TO_2CLICK = 481, // climb out of water to 2click crawlspace
ANIMATION_LARA_ONWATER_TO_LAND_LOW_TO_2CLICK = 482, // climb out of onwater to 2click crawlspace
ANIMATION_LARA_WATER_TO_SUBMERGED_CRAWL = 483, // wade out of water to submerged crawlspace
ANIMATION_LARA_HANG_FEET = 484, // hang with feet supporting her
ANIMATION_LARA_HANG_FEET_SHIMMYR = 485, // shimmy right with feet on wall
ANIMATION_LARA_HANG_FEET_SHIMMYL = 486, // shimmy left with feet on wall
ANIMATION_LARA_HANG_FEET_CLIMB = 487, // feet hang -> climb
ANIMATION_LARA_HANG_FEET_IDLE = 488, // hang feet idle anim for shimmies/climbups
ANIMATION_LARA_HANG_FEET_CLIMB_TO_CROUCH = 489, // hang feet crouch climb
ANIMATION_LARA_HANG_FEET_IN_RCORNER = 490, // hang feet shimmy around inner right corner
ANIMATION_LARA_HANG_FEET_IN_LCORNER = 491, // hang feet shimmy around inner left corner
ANIMATION_LARA_HANG_FEET_OUT_RCORNER = 492, // hang feet shimmy around outer right corner
ANIMATION_LARA_HANG_FEET_OUT_LCORNER = 493, // hang feet shimmy around outer left corner
NUM_LARA_ANIMS
};
#pragma endregion
typedef enum LARA_WATER_STATUS
{
LW_ABOVE_WATER,
LW_UNDERWATER,
LW_SURFACE,
LW_FLYCHEAT,
LW_WADE
};
typedef enum LARA_GUN_STATUS
{
LG_NO_ARMS,
LG_HANDS_BUSY,
LG_DRAW_GUNS,
LG_UNDRAW_GUNS,
LG_READY,
LG_SPECIAL
};
typedef enum WeaponAmmoType
{
WEAPON_AMMO1,
WEAPON_AMMO2,
WEAPON_AMMO3,
MAX_AMMOTYPE
};
typedef enum LARA_MESHES
{
LM_HIPS,
LM_LTHIGH,
LM_LSHIN,
LM_LFOOT,
LM_RTHIGH,
LM_RSHIN,
LM_RFOOT,
LM_TORSO,
LM_RINARM,
LM_ROUTARM,
LM_RHAND,
LM_LINARM,
LM_LOUTARM,
LM_LHAND,
LM_HEAD,
NUM_LARA_MESHES
};
typedef enum LARA_WEAPON_TYPE
{
WEAPON_NONE,
WEAPON_PISTOLS,
WEAPON_REVOLVER,
WEAPON_UZI,
WEAPON_SHOTGUN,
WEAPON_HK,
WEAPON_CROSSBOW,
WEAPON_FLARE,
WEAPON_TORCH,
WEAPON_GRENADE_LAUNCHER,
WEAPON_HARPOON_GUN,
WEAPON_ROCKET_LAUNCHER,
WEAPON_SNOWMOBILE,
NUM_WEAPONS
};
typedef enum LARA_WEAPON_TYPE_CARRIED
{
WTYPE_MISSING = 0x0,
WTYPE_PRESENT = 0x1,
WTYPE_SILENCER = 0x2,
WTYPE_LASERSIGHT = 0x4,
WTYPE_AMMO_1 = 0x8,
WTYPE_AMMO_2 = 0x10,
WTYPE_AMMO_3 = 0x20,
WTYPE_MASK_AMMO = WTYPE_AMMO_1 | WTYPE_AMMO_2 | WTYPE_AMMO_3,
};
typedef enum LARA_CLOTH_TYPES
{
CLOTH_MISSING,
CLOTH_DRY,
CLOTH_WET
};
typedef struct CarriedWeaponInfo
{
bool Present;
short Ammo[3];
byte SelectedAmmo;
short Ammo[MAX_AMMOTYPE];
int SelectedAmmo; // WeaponAmmoType_enum
bool HasLasersight;
bool HasSilencer;
};
@ -17,21 +762,33 @@ typedef struct DiaryInfo
bool Present;
};
struct WaterskinInfo
typedef struct WaterskinInfo
{
bool Present;
int Quantity;
};
struct LaraInfo
typedef struct LARA_ARM
{
short* frameBase;
short frameNumber;
short animNumber;
bool lock;
short yRot;
short xRot;
short zRot;
short flash_gun;
};
typedef struct LaraInfo
{
short itemNumber;
short gunStatus;
short gunType;
short requestGunType;
short lastGunType;
short gunStatus; // LG_enum
short gunType; // WEAPON_enum
short requestGunType; // WEAPON_enum
short lastGunType; // WEAPON_enum
short calcFallSpeed;
short waterStatus;
short waterStatus; // LW_enum
short climbStatus;
short poseCount;
short hitFrame;
@ -150,10 +907,28 @@ struct LaraInfo
int NumFlares;
};
#define FRONT_ARC ANGLE(90.0f)
#define LARA_LEAN_RATE ANGLE(1.5f)
#define LARA_LEAN_MAX ANGLE(11.0f)
#define LARA_TURN_RATE ANGLE(2.25f)
#define LARA_JUMP_TURN ANGLE(3.0f)
#define LARA_SLOW_TURN ANGLE(4.0f)
#define LARA_MED_TURN ANGLE(6.0f)
#define LARA_FAST_TURN ANGLE(8.0f)
constexpr auto LARA_HITE = 762; // the size of lara (from the floor to the top of the head)
constexpr auto LARA_FREEFALL_SPEED = 131;
constexpr auto LARA_RAD = 100;
constexpr auto LARA_VELOCITY = 12;
extern LaraInfo Lara;
extern ITEM_INFO* LaraItem;
extern byte LaraNodeUnderwater[NUM_LARA_MESHES];
#define LARA_MESHES(slot, mesh) Lara.meshPtrs[mesh] = MESHES(slot, mesh)
#define CHECK_LARA_MESHES(slot, mesh) Lara.meshPtrs[mesh] == MESHES(slot, mesh)
#define INIT_LARA_MESHES(mesh, to, from) Lara.meshPtrs[mesh] = LARA_MESHES(to, mesh) = LARA_MESHES(from, mesh)
#define LaraRoutineFunction void(ITEM_INFO* item, COLL_INFO* coll)
extern function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1];
extern function<LaraRoutineFunction> lara_collision_routines[NUM_LARA_STATES + 1];

View file

@ -1,6 +1,6 @@
#include "framework.h"
#include "lara1gun.h"
#include "global.h"
#include "items.h"
#include "Lara.h"
#include "larafire.h"
@ -57,7 +57,7 @@ void FireHarpoon()
pos.z = dxPos.z = 77;
g_Renderer->GetLaraBonePosition(&dxPos, LM_RHAND);
GetLaraJointPosition((PHD_VECTOR*)&pos, LM_RHAND);
GetLaraJointPosition(&PHD_VECTOR(pos.x, pos.y, pos.z), LM_RHAND);
/*item->pos.xPos = pos.x = dxPos.x;
item->pos.yPos = pos.y = dxPos.y;
@ -339,6 +339,15 @@ void FireGrenade()
}
}
enum GRENADE_TYPE
{
GRENADE_NORMAL,
GRENADE_SUPER,
GRENADE_FLASH,
GRENADE_ULTRA,
GRENADE_FLAGS
};
void ControlGrenade(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
@ -523,7 +532,7 @@ void ControlGrenade(short itemNumber)
int ceiling;
short roomNumber;
if (item->itemFlags[0] == WEAPON_AMMO4)
if (item->itemFlags[0] == GRENADE_ULTRA)
{
roomNumber = item->roomNumber;
@ -574,7 +583,7 @@ void ControlGrenade(short itemNumber)
item->hitPoints = 1;*/
}
if (item->itemFlags[0] == WEAPON_AMMO4)
if (item->itemFlags[0] == GRENADE_ULTRA)
GrenadeLauncherSpecialEffect1(item->pos.xPos, item->pos.yPos, item->pos.zPos, -1, 1);
// Time to explode?
@ -599,7 +608,7 @@ void ControlGrenade(short itemNumber)
}
}
if (!(item->itemFlags[0] == WEAPON_AMMO3 && explode))
if (!(item->itemFlags[0] == GRENADE_FLASH && explode))
{
int n = 0;
bool foundCollidedObjects = false;
@ -615,7 +624,7 @@ void ControlGrenade(short itemNumber)
foundCollidedObjects = true;
if (item->itemFlags[0] != WEAPON_AMMO3 || explode)
if (item->itemFlags[0] != GRENADE_FLASH || explode)
{
if (CollidedItems[0])
{
@ -723,9 +732,9 @@ void ControlGrenade(short itemNumber)
} while (n < 2);
}
if (explode || (item->itemFlags[0] == WEAPON_AMMO3 && explode))
if (explode || (item->itemFlags[0] == GRENADE_FLASH && explode))
{
if (item->itemFlags[0] == WEAPON_AMMO3)
if (item->itemFlags[0] == GRENADE_FLASH)
{
FlashFader = 32;
FlashFadeR = 255;
@ -761,10 +770,10 @@ void ControlGrenade(short itemNumber)
SoundEffect(105, &item->pos, PITCH_SHIFT | 0x1800000);
SoundEffect(106, &item->pos, 0);
if (item->itemFlags[0] != WEAPON_AMMO1 && item->itemFlags[0] != 4)
if (item->itemFlags[0] != GRENADE_NORMAL && item->itemFlags[0] != 4)
{
item->meshBits = 0;
item->itemFlags[1] = (item->itemFlags[0] != WEAPON_AMMO2 ? 16 : 4);
item->itemFlags[1] = (item->itemFlags[0] != GRENADE_SUPER ? 16 : 4);
return;
}
@ -1062,6 +1071,13 @@ void AnimateShotgun(int weaponType)
Lara.leftArm.animNumber = Lara.rightArm.animNumber = item->animNumber;
}
enum CROSSBOW_TYPE
{
CROSSBOW_NORMAL,
CROSSBOW_POISON,
CROSSBOW_EXPLODE
};
void ControlCrossbowBolt(short itemNumber)
{
ITEM_INFO* item = &Items[itemNumber];
@ -1079,7 +1095,7 @@ void ControlCrossbowBolt(short itemNumber)
if (item->speed > 64)
item->speed -= (item->speed >> 4);
if (GlobalCounter & 1)
CreateBubble((PHD_VECTOR*)&item->pos, roomNumber, 4, 7, 0, 0, 0, 0);
CreateBubble(&PHD_VECTOR(item->pos.xPos, item->pos.yPos, item->pos.zPos), roomNumber, 4, 7, 0, 0, 0, 0);
}
else
{
@ -1102,16 +1118,18 @@ void ControlCrossbowBolt(short itemNumber)
item->pos.zPos = oldZ;
// If ammos are normal, then just shatter the bolt and quit
if (item->itemFlags[0] != WEAPON_AMMO3)
if (item->itemFlags[0] != CROSSBOW_EXPLODE)
{
ExplodeItemNode(item, 0, 0, 256);
ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL);
KillItem(itemNumber);
return;
}
else
{
// Otherwise, bolt must explode
explode = true;
}
}
// Has bolt changed room?
if (item->roomNumber != roomNumber)
@ -1139,7 +1157,7 @@ void ControlCrossbowBolt(short itemNumber)
foundCollidedObjects = true;
if (item->itemFlags[0] != WEAPON_AMMO3 || explode)
if (item->itemFlags[0] != CROSSBOW_EXPLODE || explode)
{
if (CollidedItems[0])
{
@ -1154,16 +1172,14 @@ void ControlCrossbowBolt(short itemNumber)
if (item->objectNumber < ID_SMASH_OBJECT1 || item->objectNumber > ID_SMASH_OBJECT8)
{
if (currentItem->objectNumber == ID_SHOOT_SWITCH1 || currentItem->objectNumber == ID_SHOOT_SWITCH2)
CrossbowHitSwitchType78(item, currentItem, 0);
DoCrossbowDamage(item, currentItem, 0);
else if (Objects[item->objectNumber].hitEffect)
DoGrenadeDamageOnBaddie(currentItem, item);
}
else
{
TriggerExplosionSparks(currentItem->pos.xPos, currentItem->pos.yPos, currentItem->pos.zPos, 3, -2, 0, currentItem->roomNumber);
currentItem->pos.yPos -= 128;
TriggerShockwave(&currentItem->pos, 48, 304, 96, 0, 96, 128, 24, 0, 0);
currentItem->pos.yPos += 128;
TriggerShockwave(&PHD_3DPOS(currentItem->pos.xPos, currentItem->pos.yPos - 128, currentItem->pos.zPos), 48, 304, 96, 0, 96, 128, 24, 0, 0);
ExplodeItemNode(currentItem, 0, 0, 128);
short currentItemNumber = (currentItem - CollidedItems[0]);
SmashObject(currentItemNumber);
@ -1173,14 +1189,14 @@ void ControlCrossbowBolt(short itemNumber)
else if (currentItem->objectNumber == ID_SHOOT_SWITCH1 || currentItem->objectNumber == ID_SHOOT_SWITCH2)
{
// Special case for ID_SWITCH_TYPE7 and ID_SWITCH_TYPE8
CrossbowHitSwitchType78(item, currentItem, 1);
DoCrossbowDamage(item, currentItem, 1);
}
else if (Objects[currentItem->objectNumber].hitEffect)
{
HitTarget(currentItem, (GAME_VECTOR*)&item->pos, Weapons[WEAPON_CROSSBOW].damage, 0);
HitTarget(currentItem, &GAME_VECTOR(item->pos.xPos, item->pos.yPos, item->pos.zPos), Weapons[WEAPON_CROSSBOW].damage, 0);
// Poisoned ammos
if (item->itemFlags[0] == WEAPON_AMMO2 && !Objects[currentItem->objectNumber].explodableMeshbits)
if (item->itemFlags[0] == CROSSBOW_POISON && !Objects[currentItem->objectNumber].explodableMeshbits)
item->poisoned = true;
}
@ -1197,16 +1213,14 @@ void ControlCrossbowBolt(short itemNumber)
do
{
if (currentMesh->staticNumber >= 50 && currentMesh->staticNumber < 58)
if (currentMesh->staticNumber >= 50 && currentMesh->staticNumber < 58) // SHATTER
{
if (explode)
{
TriggerExplosionSparks(currentMesh->x, currentMesh->y, currentMesh->z, 3, -2, 0, item->roomNumber);
currentMesh->y -= 128;
TriggerShockwave((PHD_3DPOS*)&currentMesh, 40, 176, 64, 0, 96, 128, 16, 0, 0);
currentMesh->y += 128;
TriggerShockwave(&PHD_3DPOS(currentMesh->x, currentMesh->y - 128, currentMesh->z, 0, currentMesh->yRot, 0), 40, 176, 64, 0, 96, 128, 16, 0, 0);
}
ShatterObject((SHATTER_ITEM*)item, NULL, -128, item->roomNumber, 0);
ShatterObject((SHATTER_ITEM*)item, NULL, -128, item->roomNumber, 0); // TODO: this wont work !!
SmashedMeshRoom[SmashedMeshCount] = item->roomNumber;
SmashedMesh[SmashedMeshCount] = currentMesh;
SmashedMeshCount++;
@ -1231,16 +1245,17 @@ void ControlCrossbowBolt(short itemNumber)
{
if (foundCollidedObjects)
{
ExplodeItemNode(item, 0, 0, 256);
ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL);
KillItem(itemNumber);
}
return;
}
// At this point, for sure bolt must explode
if (Rooms[item->roomNumber].flags & ENV_FLAG_WATER)
{
TriggerUnderwaterExplosion(item);
}
else
{
TriggerShockwave(&item->pos, 48, 304, 96, 0, 96, 128, 24, 0, 0);
@ -1252,12 +1267,12 @@ void ControlCrossbowBolt(short itemNumber)
AlertNearbyGuards(item);
SoundEffect(105, &item->pos, PITCH_SHIFT | 0x1800000);
SoundEffect(106, &item->pos, 0);
SoundEffect(SFX_EXPLOSION1, &item->pos, PITCH_SHIFT | 0x1800000);
SoundEffect(SFX_EXPLOSION2, &item->pos, 0);
if (foundCollidedObjects || explode)
{
ExplodeItemNode(item, 0, 0, 256);
ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL);
KillItem(itemNumber);
}
@ -1476,12 +1491,12 @@ void undraw_shotgun(int weapon)
AnimateItem(item);
if (item->status == ITEM_DEACTIVATED)
if (item->status == ITEM_DESACTIVATED)
{
Lara.gunStatus = LG_NO_ARMS;
Lara.target = NULL;
Lara.rightArm.lock = 0;
Lara.leftArm.lock = 0;
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
KillItem(Lara.weaponItem);
@ -1514,7 +1529,7 @@ void draw_shotgun_meshes(int weaponType)
LARA_MESHES(WeaponObjectMesh(weaponType), LM_RHAND);
}
void CrossbowHitSwitchType78(ITEM_INFO* item1, ITEM_INFO* item2, signed int search)
void DoCrossbowDamage(ITEM_INFO* item1, ITEM_INFO* item2, signed int search)
{
/*v4 = item2;
if (!(item2->flags & 0x40))
@ -1674,10 +1689,10 @@ void FireShotgun()
for (int i = 0; i < 6; i++)
{
loopAngles[0] = angles[0] + value * (GetRandomControl() - ANGLE(90)) / 0x10000;
loopAngles[1] = angles[1] + value * (GetRandomControl() - ANGLE(90)) / 0x10000;
loopAngles[0] = angles[0] + value * (GetRandomControl() - 0x4000) / 0x10000;
loopAngles[1] = angles[1] + value * (GetRandomControl() - 0x4000) / 0x10000;
if (FireWeapon(WEAPON_SHOTGUN, Lara.target, LaraItem, loopAngles))
if (FireWeapon(WEAPON_SHOTGUN, Lara.target, LaraItem, loopAngles) == FW_MAYBEHIT)
fired = true;
}
@ -1706,12 +1721,10 @@ void FireShotgun()
SmokeCountL = 32;
SmokeWeapon = WEAPON_SHOTGUN;
if (LaraItem->meshBits)
if (LaraItem->meshBits != 0)
{
for (int i = 0; i < 7; i++)
{
TriggerGunSmoke(pos2.x, pos2.y, pos2.z, pos.x - pos2.x, pos.y - pos2.y, pos.z - pos2.z, 1, SmokeWeapon, 32);
}
TriggerGunSmoke(pos2.x, pos2.y, pos2.z, pos.x - pos2.x, pos.y - pos2.y, pos.z - pos2.z, 1, SmokeWeapon, SmokeCountL);
}
Lara.rightArm.flash_gun = Weapons[WEAPON_SHOTGUN].flashTime;

View file

@ -1,26 +1,24 @@
#pragma once
#include "items.h"
#include "trmath.h"
#include "global.h"
#define HARPOON_DRAW_ANIM 1
#define ROCKET_DRAW_ANIM 0
#define PELLET_SCATTER ANGLE(20)
#define HARPOON_SPEED 256
#define HARPOON_TIME 256
#define ROCKET_SPEED 512
#define GRENADE_SPEED 128
#define MAX_GRENADE_FALLSPEED 128
#define GRENADE_YOFF 180
#define GRENADE_ZOFF 80
#define GRENADE_BLAST_RADIUS (WALL_SIZE * 2)
#define CROSSBOW_DAMAGE 5
#define CROSSBOW_AMMO1 1
#define CROSSBOW_AMMO2 2
#define CROSSBOW_AMMO3 2
#define CROSSBOW_HIT_RADIUS 128
#define CROSSBOW_EXPLODE_RADIUS 2048
#define GRENADE_EXPLODE_RADIUS 2048
#define PELLET_SCATTER ANGLE(20.0f)
constexpr auto HARPOON_DRAW_ANIM = 1;
constexpr auto ROCKET_DRAW_ANIM = 0;
constexpr auto HARPOON_SPEED = 256;
constexpr auto HARPOON_TIME = 256;
constexpr auto ROCKET_SPEED = 512;
constexpr auto GRENADE_SPEED = 128;
constexpr auto MAX_GRENADE_FALLSPEED = 128;
constexpr auto GRENADE_YOFF = 180;
constexpr auto GRENADE_ZOFF = 80;
constexpr auto CROSSBOW_DAMAGE = 5;
constexpr auto CROSSBOW_AMMO1 = 1;
constexpr auto CROSSBOW_AMMO2 = 2;
constexpr auto CROSSBOW_AMMO3 = 2;
constexpr auto CROSSBOW_HIT_RADIUS = 128;
constexpr auto CROSSBOW_EXPLODE_RADIUS = SECTOR(2);
constexpr auto GRENADE_EXPLODE_RADIUS = SECTOR(2);
void FireGrenade();
void ControlGrenade(short itemNumber);
@ -39,5 +37,5 @@ void undraw_shotgun(int weapon);
void draw_shotgun_meshes(int weaponType);
void FireHK(int mode);
void FireShotgun();
void CrossbowHitSwitchType78(ITEM_INFO* item1, ITEM_INFO* item2, signed int search);
void DoCrossbowDamage(ITEM_INFO* item1, ITEM_INFO* item2, signed int search);
void ready_shotgun(int weaponType);

View file

@ -12,6 +12,14 @@
#include "sound.h"
#include "savegame.h"
struct PISTOL_DEF
{
short objectNum;
char draw1Anim2;
char draw1Anim;
char draw2Anim;
char recoilAnim;
};
PISTOL_DEF PistolsTable[4] =
{
{ ID_LARA, 0, 0, 0, 0 },
@ -56,7 +64,7 @@ void AnimatePistols(int weaponType)
}
GetLaraJointPosition(&pos, LM_LHAND);
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, (byte)0, SmokeWeapon, SmokeCountL);
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, 0, SmokeWeapon, SmokeCountL);
}
if (SmokeCountR)
@ -83,7 +91,7 @@ void AnimatePistols(int weaponType)
}
GetLaraJointPosition(&pos, LM_RHAND);
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, (byte)0, SmokeWeapon, SmokeCountR);
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, 0, SmokeWeapon, SmokeCountR);
}
}
@ -103,7 +111,7 @@ void AnimatePistols(int weaponType)
angleRight[0] = Lara.rightArm.yRot + LaraItem->pos.yRot;
angleRight[1] = Lara.rightArm.xRot;
if (FireWeapon(weaponType, Lara.target, LaraItem, angleRight))
if (FireWeapon(weaponType, Lara.target, LaraItem, angleRight) != FW_NOAMMO)
{
SmokeCountR = 28;
SmokeWeapon = weaponType;
@ -173,7 +181,7 @@ void AnimatePistols(int weaponType)
angleLeft[0] = Lara.leftArm.yRot + LaraItem->pos.yRot;
angleLeft[1] = Lara.leftArm.xRot;
if (FireWeapon(weaponType, Lara.target, LaraItem, angleLeft))
if (FireWeapon(weaponType, Lara.target, LaraItem, angleLeft) != FW_NOAMMO)
{
if (weaponType == WEAPON_REVOLVER)
{
@ -367,8 +375,8 @@ void ready_pistols(int weaponType)
Lara.rightArm.frameNumber = 0;
Lara.leftArm.frameNumber = 0;
Lara.target = NULL;
Lara.rightArm.lock = 0;
Lara.leftArm.lock = 0;
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
Lara.rightArm.frameBase = Objects[WeaponObject(weaponType)].frameBase;
Lara.leftArm.frameBase = Objects[WeaponObject(weaponType)].frameBase;
}
@ -443,8 +451,8 @@ void undraw_pistols(int weaponType)
Lara.leftArm.frameNumber = 0;
Lara.rightArm.frameNumber = 0;
Lara.target = NULL;
Lara.rightArm.lock = 0;
Lara.leftArm.lock = 0;
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
}
if (!(TrInput & IN_LOOK))

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
void AnimatePistols(int weaponType);
void PistolHandler(int weaponType);

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "collide.h"
short GetClimbTrigger(int x, int y, int z, short roomNumber);

View file

@ -1,12 +1,10 @@
#include "framework.h"
#include "larafire.h"
#include "items.h"
#include "Lara.h"
#include "laraflar.h"
#include "lara1gun.h"
#include "lara2gun.h"
#include "camera.h"
#include "GameFlowScript.h"
#include "objects.h"
#include "effect.h"
#include "sphere.h"
@ -19,6 +17,7 @@
#include "input.h"
#include "sound.h"
#include "savegame.h"
#include "GameFlowScript.h"
WEAPON_INFO Weapons[NUM_WEAPONS] =
{
@ -317,9 +316,7 @@ void SmashItem(short itemNum) // (F) (D)
{
ITEM_INFO* item = &Items[itemNum];
if (item->objectNumber >= ID_SMASH_OBJECT1 && item->objectNumber <= ID_SMASH_OBJECT8)
{
SmashObject(itemNum);
}
}
void LaraGun() // (F) (D)
@ -696,7 +693,7 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag)
if (creature && item != LaraItem)
creature->hurtByLara = true;
if (hitPos)
if (hitPos != nullptr)
{
if (obj->hitEffect)
{
@ -715,7 +712,8 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag)
}
}
}
if (!obj->undead || flag || item->hitPoints == -16384)
if (!obj->undead || flag || item->hitPoints == NOT_TARGETABLE)
{
if (item->hitPoints > 0 && item->hitPoints <= damage)
++Savegame.Level.Kills;
@ -723,50 +721,42 @@ void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag)
}
}
int DetectCrouchWhenFiring(ITEM_INFO* src, WEAPON_INFO* weapon)
{
if (src->currentAnimState == STATE_LARA_CROUCH_IDLE || src->currentAnimState == STATE_LARA_CROUCH_TURN_LEFT || src->currentAnimState == STATE_LARA_CROUCH_TURN_RIGHT)
return STEP_SIZE;
else
return int(weapon->gunHeight);
}
int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles) // (F) (D)
FIREWEAPON_TYPE FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles) // (F) (D)
{
short* ammo = GetAmmo(weaponType);
if (!*ammo)
return 0;
return FW_NOAMMO;
if (*ammo != -1)
(*ammo)--;
WEAPON_INFO* weapon = &Weapons[weaponType];
int r;
PHD_3DPOS pos;
pos.xPos = 0;
pos.yPos = 0;
pos.zPos = 0;
GetLaraJointPosition((PHD_VECTOR*)&pos, LM_RHAND);
PHD_VECTOR pos;
pos.x = 0;
pos.y = 0;
pos.z = 0;
GetLaraJointPosition(&pos, LM_RHAND);
pos.xPos = src->pos.xPos;
pos.zPos = src->pos.zPos;
pos.xRot = angles[1] + (GetRandomControl() - 16384) * weapon->shotAccuracy / 65536;
pos.yRot = angles[0] + (GetRandomControl() - 16384) * weapon->shotAccuracy / 65536;
pos.zRot = 0;
pos.x = src->pos.xPos;
pos.z = src->pos.zPos;
PHD_3DPOS rotation;
rotation.xRot = angles[1] + (GetRandomControl() - 0x4000) * weapon->shotAccuracy / 0x10000;
rotation.yRot = angles[0] + (GetRandomControl() - 0x4000) * weapon->shotAccuracy / 0x10000;
rotation.zRot = 0;
// 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));
float x = sin(TO_RAD(rotation.yRot)) * cos(TO_RAD(rotation.xRot));
float y = -sin(TO_RAD(rotation.xRot));
float z = cos(TO_RAD(rotation.yRot)) * cos(TO_RAD(rotation.xRot));
Vector3 direction = Vector3(x, y, z);
direction.Normalize();
Vector3 source = Vector3(pos.xPos, pos.yPos, pos.zPos);
Vector3 destination = source + direction * 1024.0f;
Vector3 source = Vector3(pos.x, pos.y, pos.z);
Vector3 destination = source + direction * float(weapon->targetDist);
Ray ray = Ray(source, direction);
int num = GetSpheres(target, CreatureSpheres, SPHERES_SPACE_WORLD, Matrix::Identity);
int best = -1;
int best = NO_ITEM;
float bestDistance = FLT_MAX;
for (int i = 0; i < num; i++)
@ -787,34 +777,29 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
Lara.fired = true;
GAME_VECTOR vSrc;
vSrc.x = pos.xPos;
vSrc.y = pos.yPos;
vSrc.z = pos.zPos;
vSrc.x = pos.x;
vSrc.y = pos.y;
vSrc.z = pos.z;
short roomNumber = src->roomNumber;
GetFloor(pos.xPos, pos.yPos, pos.zPos, &roomNumber);
GetFloor(pos.x, pos.y, pos.z, &roomNumber);
vSrc.roomNumber = roomNumber;
if (best < 0)
{
GAME_VECTOR vDest;
vDest.x = destination.x;
vDest.y = destination.y;
vDest.z = destination.z;
GetTargetOnLOS(&vSrc, &vDest, 0, 1);
return -1;
GetTargetOnLOS(&vSrc, &vDest, FALSE, TRUE);
return FW_MISS;
}
else
{
Savegame.Game.AmmoHits++;
GAME_VECTOR vDest;
destination = source + direction * bestDistance;
GAME_VECTOR vDest;
vDest.x = destination.x;
vDest.y = destination.y;
vDest.z = destination.z;
@ -857,11 +842,11 @@ int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles)
}
else
{*/
if (!GetTargetOnLOS(&vSrc, &vDest, 0, 1))
HitTarget(target, &vDest, weapon->damage, 0);
if (!GetTargetOnLOS(&vSrc, &vDest, FALSE, TRUE))
HitTarget(target, &vDest, weapon->damage, NULL);
//}
return 1;
return FW_MAYBEHIT;
}
}
@ -887,42 +872,43 @@ void LaraTargetInfo(WEAPON_INFO* weapon) // (F) (D)
{
if (!Lara.target)
{
Lara.rightArm.lock = 0;
Lara.leftArm.lock = 0;
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
Lara.targetAngles[1] = 0;
Lara.targetAngles[0] = 0;
return;
}
GAME_VECTOR pos;
PHD_VECTOR pos;
pos.x = 0;
pos.y = 0;
pos.z = 0;
GetLaraJointPosition((PHD_VECTOR*)&pos, LM_RHAND);
GetLaraJointPosition(&pos, LM_RHAND);
pos.x = LaraItem->pos.xPos;
pos.z = LaraItem->pos.zPos;
pos.roomNumber = LaraItem->roomNumber;
GAME_VECTOR src;
src.x = LaraItem->pos.xPos;
src.y = pos.y;
src.z = LaraItem->pos.zPos;
src.roomNumber = LaraItem->roomNumber;
GAME_VECTOR targetPoint;
find_target_point(Lara.target, &targetPoint);
short angles[2];
phd_GetVectorAngles(targetPoint.x - pos.x, targetPoint.y - pos.y, targetPoint.z - pos.z, angles);
phd_GetVectorAngles(targetPoint.x - src.x, targetPoint.y - src.y, targetPoint.z - src.z, angles);
angles[0] -= LaraItem->pos.yRot;
angles[1] -= LaraItem->pos.xRot;
if (LOS(&pos, &targetPoint))
if (LOS(&src, &targetPoint))
{
if (angles[0] >= weapon->lockAngles[0]
&& angles[0] <= weapon->lockAngles[1]
&& angles[1] >= weapon->lockAngles[2]
&& angles[1] <= weapon->lockAngles[3])
{
Lara.rightArm.lock = 1;
Lara.leftArm.lock = 1;
Lara.rightArm.lock = true;
Lara.leftArm.lock = true;
}
else
{
@ -932,7 +918,7 @@ void LaraTargetInfo(WEAPON_INFO* weapon) // (F) (D)
angles[0] > weapon->leftAngles[1] ||
angles[1] < weapon->leftAngles[2] ||
angles[1] > weapon->leftAngles[3]))
Lara.leftArm.lock = 0;
Lara.leftArm.lock = false;
}
if (Lara.rightArm.lock)
@ -941,37 +927,36 @@ void LaraTargetInfo(WEAPON_INFO* weapon) // (F) (D)
angles[0] > weapon->rightAngles[1] ||
angles[1] < weapon->rightAngles[2] ||
angles[1] > weapon->rightAngles[3]))
Lara.rightArm.lock = 0;
Lara.rightArm.lock = false;
}
}
}
else
{
Lara.rightArm.lock = 0;
Lara.leftArm.lock = 0;
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
}
Lara.targetAngles[0] = angles[0];
Lara.targetAngles[1] = angles[1];
}
int CheckForHoldingState(int state) // (F) (D)
bool CheckForHoldingState(int state) // (F) (D)
{
short* holdState = HoldStates;
#if 0
if (Lara.ExtraAnim)
return 0;
if (Lara.ExtraAnim != NO_ITEM)
return false;
#endif
short* holdState = HoldStates;
while (*holdState >= 0)
{
if (state == *holdState)
return 1;
return true;
holdState++;
}
return 0;
return false;
}
void LaraGetNewTarget(WEAPON_INFO* winfo) // (F) (D)
@ -988,10 +973,15 @@ void LaraGetNewTarget(WEAPON_INFO* winfo) // (F) (D)
return;
}
bestItem = NULL;
bestYrot = 0x7FFF;
bestDistance = 0x7FFFFFFF;
bestYrot = MAXSHORT;
bestDistance = MAXINT;
PHD_VECTOR handpos;
handpos.x = 0;
handpos.y = 0;
handpos.z = 0;
GetLaraJointPosition(&handpos, LM_RHAND);
source.x = LaraItem->pos.xPos;
source.y = LaraItem->pos.yPos - 650;
source.y = LaraItem->pos.yPos - handpos.y;
source.z = LaraItem->pos.zPos;
source.roomNumber = LaraItem->roomNumber;
maxDistance = winfo->targetDist;
@ -1034,6 +1024,7 @@ void LaraGetNewTarget(WEAPON_INFO* winfo) // (F) (D)
}
}
}
TargetList[targets] = NULL;
if (!TargetList[0])
{
@ -1086,12 +1077,14 @@ void LaraGetNewTarget(WEAPON_INFO* winfo) // (F) (D)
}
}
}
if (Lara.target != LastTargets[0])
{
for (slot = 7; slot > 0; --slot)
LastTargets[slot] = LastTargets[slot - 1];
LastTargets[0] = Lara.target;
}
LaraTargetInfo(winfo);
}

View file

@ -1,7 +1,28 @@
#pragma once
#include "lara.h"
#include "global.h"
typedef enum FIREWEAPON_TYPE
{
FW_MISS = -1,
FW_NOAMMO = 0,
FW_MAYBEHIT = 1
};
typedef struct WEAPON_INFO
{
short lockAngles[4];
short leftAngles[4];
short rightAngles[4];
short aimSpeed;
short shotAccuracy;
short gunHeight;
short targetDist;
byte damage;
byte recoilFrame;
byte flashTime;
byte drawFrame;
short sampleNum;
};
extern WEAPON_INFO Weapons[NUM_WEAPONS];
void SmashItem(short itemNum);
@ -12,9 +33,9 @@ void InitialiseNewWeapon();
int WeaponObjectMesh(int weaponType);
void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm);
void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag);
int FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles);
FIREWEAPON_TYPE FireWeapon(int weaponType, ITEM_INFO* target, ITEM_INFO* src, short* angles);
void find_target_point(ITEM_INFO* item, GAME_VECTOR* target);
void LaraTargetInfo(WEAPON_INFO* weapon);
int CheckForHoldingState(int state);
bool CheckForHoldingState(int state);
void LaraGetNewTarget(WEAPON_INFO* winfo);
void DoProperDetection(short itemNumber, int x, int y, int z, int xv, int yv, int zv);

View file

@ -88,8 +88,8 @@ void ready_flare() // (F) (D)
Lara.rightArm.zRot = 0;
Lara.rightArm.yRot = 0;
Lara.rightArm.xRot = 0;
Lara.rightArm.lock = 0;
Lara.leftArm.lock = 0;
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
Lara.target = NULL;
}
@ -138,8 +138,8 @@ void undraw_flare() // (F) (D)
InitialiseNewWeapon();
Lara.target = NULL;
Lara.rightArm.lock = 0;
Lara.leftArm.lock = 0;
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
LaraItem->animNumber = ANIMATION_LARA_STAY_SOLID;
Lara.flareFrame = Anims[LaraItem->animNumber].frameBase;
LaraItem->frameNumber = Anims[LaraItem->animNumber].frameBase;
@ -196,8 +196,8 @@ void undraw_flare() // (F) (D)
Lara.flareControlLeft = false;
Lara.target = NULL;
Lara.rightArm.lock = 0;
Lara.leftArm.lock = 0;
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
Lara.flareFrame = 0;
}
else if (frame2 < 21)

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
void FlareControl(short item_number);
void ready_flare();

View file

@ -1,6 +1,6 @@
#include "framework.h"
#include "laramisc.h"
#include "global.h"
#include "level.h"
#include "setup.h"
#include "GameFlowScript.h"
@ -707,8 +707,8 @@ void LaraInitialiseMeshes() // (AF) (D)
Lara.leftArm.frameNumber = 0;
Lara.rightArm.frameNumber = 0;
Lara.target = NULL;
Lara.rightArm.lock = 0;
Lara.leftArm.lock = 0;
Lara.rightArm.lock = false;
Lara.leftArm.lock = false;
}
void InitialiseLara(int restore)

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "collide.h"
extern COLL_INFO coll;

View file

@ -1,6 +1,6 @@
#pragma once
#include "global.h"
#include "Lara.h"
void _cdecl lara_col_surftread(ITEM_INFO* item, COLL_INFO* coll);

View file

@ -16,6 +16,14 @@
#include "input.h"
#include "sound.h"
typedef struct SUBSUIT_INFO
{
short XRot;
short dXRot;
short XRotVel;
short Vel[2];
short YVel;
};
SUBSUIT_INFO Subsuit;
byte SubHitCount = 0;

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "collide.h"
void LaraWaterCurrent(COLL_INFO* coll);

View file

@ -1,8 +1,7 @@
#pragma once
#include "global.h"
#include "box.h"
constexpr auto NUM_SLOTS = 32;
extern int SlotsUsed;
extern CREATURE_INFO* BaddieSlots;

View file

@ -1,6 +1,6 @@
#include "framework.h"
#include "malloc.h"
#include "global.h"
char* malloc_buffer;
int malloc_size;

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "box.h"
#define CHK_ANY(var, flag) (var & flag) != 0

View file

@ -1,6 +1,6 @@
#pragma once
#include "global.h"
void ShootAtLara(FX_INFO* fx);
void ControlMissile(short fxNumber);

View file

@ -634,7 +634,7 @@ void AnimatingControl(short itemNumber)
item->frameNumber = Anims[item->animNumber].frameBase;
RemoveActiveItem(itemNumber);
item->aiBits = 0;
item->status = ITEM_INACTIVE;
item->status = ITEM_NOT_ACTIVE;
}
}

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "collide.h"
extern OBJECT_TEXTURE* WaterfallTextures[6];

View file

@ -962,7 +962,107 @@ typedef enum GAME_OBJECT_ID
ID_NUMBER_OBJECTS, // NEED TO BE AT THE END !!!!
};
#define NUM_PUZZLES (ID_PUZZLE_ITEM16 - ID_PUZZLE_ITEM1 + 1)
#define NUM_KEYS (ID_KEY_ITEM16 - ID_KEY_ITEM1 + 1)
#define NUM_PICKUPS (ID_PICKUP_ITEM16 - ID_PICKUP_ITEM1 + 1)
#define NUM_EXAMINES (ID_EXAMINE8 - ID_EXAMINE1 + 1)
typedef enum SPRITE_TYPES
{
SPR_FIRE0,
SPR_FIRE1,
SPR_FIRE2,
SPR_FIRE3,
SPR_SPLASH1,
SPR_SPLASH2,
SPR_SPLASH3,
SPR_SPLASH4,
SPR_SPLASH,
SPR_RIPPLES,
SPR_LENSFLARE,
SPR_LENSFLARE_LIGHT,
SPR_BULLETIMPACT,
SPR_BUBBLES,
SPR_UNDERWATERDUST,
SPR_BLOOD,
SPR_EMPTY1,
SPR_UNKNOWN1,
SPR_EMPTY2,
SPR_BACKGROUND,
SPR_GUI_UPLEFT,
SPR_GUI_UPRIGHT,
SPR_GUI_DOWNLEFT,
SPR_GUI_DOWNRIGHT,
SPR_GUI_DOWN,
SPR_GUI_UP,
SPR_GUI_LEFT,
SPR_GUI_RIGHT,
SPR_LIGHTHING
};
typedef enum FLOOR_TYPES
{
FLOOR_TYPE,
DOOR_TYPE,
TILT_TYPE,
ROOF_TYPE,
TRIGGER_TYPE,
LAVA_TYPE,
CLIMB_TYPE,
SPLIT1,
SPLIT2,
SPLIT3,
SPLIT4,
NOCOLF1T,
NOCOLF1B,
NOCOLF2T,
NOCOLF2B,
NOCOLC1T,
NOCOLC1B,
NOCOLC2T,
NOCOLC2B,
MONKEY_TYPE,
TRIGTRIGGER_TYPE,
MINER_TYPE
};
typedef enum TRIGGER_TYPES
{
TRIGGER,
PAD,
SWITCH,
KEY,
PICKUP,
HEAVY,
ANTIPAD,
COMBAT,
DUMMY,
ANTITRIGGER,
HEAVYSWITCH,
HEAVYANTITRIGGER,
MONKEY,
SKELETON_T,
TIGHTROPE_T,
CRAWLDUCK_T,
CLIMB_T,
};
typedef enum TRIGOBJECTS_TYPES
{
TO_OBJECT,
TO_CAMERA,
TO_SINK,
TO_FLIPMAP,
TO_FLIPON,
TO_FLIPOFF,
TO_TARGET,
TO_FINISH,
TO_CD,
TO_FLIPEFFECT,
TO_SECRET,
TO_LUA_SCRIPT,
TO_FLYBY,
TO_CUTSCENE
};
typedef enum FLOORDATA_MASKS
{
FD_MASK_FUNCTION = 0x1F,
FD_MASK_SUBFUNCTION = 0x7F00,
FD_MASK_END_DATA = 0x8000
};

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "box.h"
int ShotLara(ITEM_INFO* item, AI_INFO* info, BITE_INFO* gun, short extra_rotation, int damage);

227
TR5Main/Game/phd_global.h Normal file
View file

@ -0,0 +1,227 @@
#pragma once
typedef struct PHD_VECTOR
{
int x;
int y;
int z;
PHD_VECTOR()
{
this->x = 0;
this->y = 0;
this->z = 0;
}
PHD_VECTOR(int xpos, int ypos, int zpos)
{
this->x = xpos;
this->y = ypos;
this->z = zpos;
}
};
typedef struct PHD_3DPOS
{
int xPos;
int yPos;
int zPos;
short xRot;
short yRot;
short zRot;
PHD_3DPOS()
{
this->xPos = 0;
this->yPos = 0;
this->zPos = 0;
this->xRot = 0;
this->yRot = 0;
this->zRot = 0;
}
PHD_3DPOS(int x, int y, int z)
{
this->xPos = x;
this->yPos = y;
this->zPos = z;
this->xRot = 0;
this->yRot = 0;
this->zRot = 0;
}
PHD_3DPOS(short xrot, short yrot, short zrot)
{
this->xPos = 0;
this->yPos = 0;
this->zPos = 0;
this->xRot = xrot;
this->yRot = yrot;
this->zRot = zrot;
}
PHD_3DPOS(int x, int y, int z, short xrot, short yrot, short zrot)
{
this->xPos = x;
this->yPos = y;
this->zPos = z;
this->xRot = xrot;
this->yRot = yrot;
this->zRot = zrot;
}
};
typedef struct GAME_VECTOR
{
int x;
int y;
int z;
short roomNumber;
short boxNumber;
GAME_VECTOR()
{
this->x = 0;
this->y = 0;
this->z = 0;
this->roomNumber = 0;
this->boxNumber = 0;
}
GAME_VECTOR(int xpos, int ypos, int zpos)
{
this->x = xpos;
this->y = ypos;
this->z = zpos;
this->roomNumber = 0;
this->boxNumber = 0;
}
GAME_VECTOR(int xpos, int ypos, int zpos, short roomNumber)
{
this->x = xpos;
this->y = ypos;
this->z = zpos;
this->roomNumber = roomNumber;
this->boxNumber = 0;
}
GAME_VECTOR(int xpos, int ypos, int zpos, short roomNumber, short boxNumber)
{
this->x = xpos;
this->y = ypos;
this->z = zpos;
this->roomNumber = roomNumber;
this->boxNumber = boxNumber;
}
};
typedef struct OBJECT_VECTOR
{
int x;
int y;
int z;
short data;
short flags;
OBJECT_VECTOR()
{
this->x = 0;
this->y = 0;
this->z = 0;
this->data = NULL;
this->flags = NULL;
}
OBJECT_VECTOR(int xpos, int ypos, int zpos)
{
this->x = xpos;
this->y = ypos;
this->z = zpos;
this->data = NULL;
this->flags = NULL;
}
OBJECT_VECTOR(int xpos, int ypos, int zpos, short newdata)
{
this->x = xpos;
this->y = ypos;
this->z = zpos;
this->data = newdata;
this->flags = NULL;
}
OBJECT_VECTOR(int xpos, int ypos, int zpos, short flags, bool isFlags) // use isFlags to use flag instead of newdata !
{
UNREFERENCED_PARAMETER(isFlags);
this->x = xpos;
this->y = ypos;
this->z = zpos;
this->data = NULL;
this->flags = flags;
}
OBJECT_VECTOR(int xpos, int ypos, int zpos, short newdata, short newflags)
{
this->x = xpos;
this->y = ypos;
this->z = zpos;
this->data = newdata;
this->flags = newflags;
}
};
typedef struct VECTOR
{
int vx;
int vy;
int vz;
int pad;
};
typedef struct SVECTOR
{
short vx;
short vy;
short vz;
short pad;
};
typedef struct CVECTOR
{
byte r;
byte g;
byte b;
byte cd;
};
typedef struct TR_VERTEX
{
int x;
int y;
int z;
};
typedef enum MATRIX_ARRAY_VALUE
{
M00, M01, M02, M03,
M10, M11, M12, M13,
M20, M21, M22, M23
};
typedef struct MATRIX3D
{
short m00;
short m01;
short m02;
short m10;
short m11;
short m12;
short m20;
short m21;
short m22;
short pad;
int tx;
int ty;
int tz;
};

View file

@ -1,5 +1,6 @@
#include "framework.h"
#include "pickup.h"
#include "phd_global.h"
#include "lara.h"
#include "draw.h"
#include "inventory.h"
@ -29,43 +30,43 @@ static short PickUpBounds[12] = // offset 0xA1338
0xFF00, 0x0100, 0xFF38, 0x00C8, 0xFF00, 0x0100, 0xF8E4, 0x071C, 0x0000, 0x0000,
0x0000, 0x0000
};
static PHD_VECTOR PickUpPosition = { 0, 0, 0xFFFFFF9C }; // offset 0xA1350
static PHD_VECTOR PickUpPosition(0, 0, -100); // offset 0xA1350
static short HiddenPickUpBounds[12] = // offset 0xA135C
{
0xFF00, 0x0100, 0xFF9C, 0x0064, 0xFCE0, 0xFF00, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0x0000, 0x0000
};
static PHD_VECTOR HiddenPickUpPosition = { 0, 0, 0xFFFFFD4E }; // offset 0xA1374
static PHD_VECTOR HiddenPickUpPosition(0, 0, -690); // offset 0xA1374
static short CrowbarPickUpBounds[12] = // offset 0xA1380
{
0xFF00, 0x0100, 0xFF9C, 0x0064, 0x00C8, 0x0200, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0x0000, 0x0000
};
static PHD_VECTOR CrowbarPickUpPosition = { 0, 0, 0xD7 }; // offset 0xA1398
static PHD_VECTOR CrowbarPickUpPosition(0, 0, 215); // offset 0xA1398
static short JobyCrowPickUpBounds[12] = // offset 0xA13A4
{
0xFE00, 0x0000, 0xFF9C, 0x0064, 0x0000, 0x0200, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0x0000, 0x0000
};
static PHD_VECTOR JobyCrowPickUpPosition = { 0xFFFFFF20, 0, 0xF0 }; // offset 0xA13BC
static PHD_VECTOR JobyCrowPickUpPosition(-224, 0, 240); // offset 0xA13BC
static short PlinthPickUpBounds[12] = // offset 0xA13C8
{
0xFF00, 0x0100, 0xFD80, 0x0280, 0xFE01, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0x0000, 0x0000
};
static PHD_VECTOR PlinthPickUpPosition = { 0, 0, 0xFFFFFE34 }; // offset 0xA13E0
static PHD_VECTOR PlinthPickUpPosition(0, 0, -460); // offset 0xA13E0
static short PickUpBoundsUW[12] = // offset 0xA13EC
{
0xFE00, 0x0200, 0xFE00, 0x0200, 0xFE00, 0x0200, 0xE002, 0x1FFE, 0xE002, 0x1FFE,
0xE002, 0x1FFE
};
static PHD_VECTOR PickUpPositionUW = { 0, 0xFFFFFF38, 0xFFFFFEA2 }; // offset 0xA1404
static PHD_VECTOR PickUpPositionUW(0, -200, -350); // offset 0xA1404
static short KeyHoleBounds[12] = // offset 0xA1410
{
0xFF00, 0x0100, 0x0000, 0x0000, 0x0000, 0x019C, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0xF8E4, 0x071C
};
static PHD_VECTOR KeyHolePosition = { 0, 0, 0x138 }; // offset 0xA1428
static PHD_VECTOR KeyHolePosition(0, 0, 312); // offset 0xA1428
static short PuzzleBounds[12] = // offset 0xA1434
{
0x0000, 0x0000, 0xFF00, 0x0100, 0x0000, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
@ -76,7 +77,7 @@ static short SOBounds[12] = // offset 0xA144C
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0xF8E4, 0x071C
};
static PHD_VECTOR SOPos = { 0, 0, 0 }; // offset 0xA1464
static PHD_VECTOR SOPos(0, 0, 0); // offset 0xA1464
short SearchCollectFrames[4] =
{
0x00B4, 0x0064, 0x0099, 0x0053
@ -108,7 +109,7 @@ void PickedUpObject(short objectNumber)
switch (objectNumber)
{
case ID_UZI_ITEM:
if (!(Lara.Weapons[WEAPON_UZI].Present))
if (!Lara.Weapons[WEAPON_UZI].Present)
{
Lara.Weapons[WEAPON_UZI].Present = true;
Lara.Weapons[WEAPON_UZI].SelectedAmmo = 0;
@ -120,7 +121,7 @@ void PickedUpObject(short objectNumber)
break;
case ID_PISTOLS_ITEM:
if (!(Lara.Weapons[WEAPON_PISTOLS].Present))
if (!Lara.Weapons[WEAPON_PISTOLS].Present)
{
Lara.Weapons[WEAPON_PISTOLS].Present = true;
Lara.Weapons[WEAPON_PISTOLS].SelectedAmmo = 0;
@ -131,7 +132,7 @@ void PickedUpObject(short objectNumber)
break;
case ID_SHOTGUN_ITEM:
if (!(Lara.Weapons[WEAPON_SHOTGUN].Present))
if (!Lara.Weapons[WEAPON_SHOTGUN].Present)
{
Lara.Weapons[WEAPON_SHOTGUN].Present = true;
Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = 0;
@ -143,7 +144,7 @@ void PickedUpObject(short objectNumber)
break;
case ID_REVOLVER_ITEM:
if (!(Lara.Weapons[WEAPON_REVOLVER].Present))
if (!Lara.Weapons[WEAPON_REVOLVER].Present)
{
Lara.Weapons[WEAPON_REVOLVER].Present = true;
Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = 0;
@ -155,7 +156,7 @@ void PickedUpObject(short objectNumber)
break;
case ID_CROSSBOW_ITEM:
if (!(Lara.Weapons[WEAPON_CROSSBOW].Present))
if (!Lara.Weapons[WEAPON_CROSSBOW].Present)
{
Lara.Weapons[WEAPON_CROSSBOW].Present = true;
Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = 0;
@ -167,7 +168,7 @@ void PickedUpObject(short objectNumber)
break;
case ID_HK_ITEM:
if (!(Lara.Weapons[WEAPON_CROSSBOW].Present))
if (!Lara.Weapons[WEAPON_CROSSBOW].Present)
{
Lara.Weapons[WEAPON_HK].Present = true;
Lara.Weapons[WEAPON_HK].SelectedAmmo = 0;
@ -179,7 +180,7 @@ void PickedUpObject(short objectNumber)
break;
case ID_HARPOON_ITEM:
if (!(Lara.Weapons[WEAPON_HARPOON_GUN].Present))
if (!Lara.Weapons[WEAPON_HARPOON_GUN].Present)
{
Lara.Weapons[WEAPON_HARPOON_GUN].Present = true;
Lara.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = 0;
@ -191,7 +192,7 @@ void PickedUpObject(short objectNumber)
break;
case ID_GRENADE_GUN_ITEM:
if (!(Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present))
if (!Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present)
{
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].Present = true;
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = 0;
@ -203,7 +204,7 @@ void PickedUpObject(short objectNumber)
break;
case ID_ROCKET_LAUNCHER_ITEM:
if (!(Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present))
if (!Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present)
{
Lara.Weapons[WEAPON_ROCKET_LAUNCHER].Present = true;
Lara.Weapons[WEAPON_ROCKET_LAUNCHER].SelectedAmmo = 0;
@ -337,7 +338,7 @@ void PickedUpObject(short objectNumber)
case ID_GOLDROSE_ITEM:
IsAtmospherePlaying = 0;
S_CDPlay(6, 0);
S_CDPlay(6, FALSE);
Lara.Secrets++;
Savegame.Level.Secrets++;
Savegame.Game.Secrets++;
@ -462,7 +463,7 @@ int KeyTrigger(short itemNum)
oldkey = KeyTriggerActive;
if (!oldkey)
item->status = ITEM_DEACTIVATED;
item->status = ITEM_DESACTIVATED;
KeyTriggerActive = false;
@ -702,7 +703,7 @@ void KeyHoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
{
if (!Lara.isMoving)
{
if (item->status != ITEM_INACTIVE)
if (item->status != ITEM_NOT_ACTIVE)
return;
if (g_Inventory->GetSelectedObject() == NO_ITEM)
{
@ -1275,7 +1276,7 @@ void RegeneratePickups()
if (ammo == 0)
{
item->status = ITEM_INACTIVE;
item->status = ITEM_NOT_ACTIVE;
}
}
}
@ -1337,7 +1338,7 @@ short* FindPlinth(ITEM_INFO* item)
if (item->pos.xPos == mesh->x && item->pos.zPos == mesh->z)
{
short* frame = GetBestFrame(item);
STATIC_INFO* s = &StaticObjects[mesh->staticNumber];
StaticInfo* s = &StaticObjects[mesh->staticNumber];
if (frame[0] <= s->xMaxc && frame[1] >= s->xMinc && frame[4] <= s->zMaxc && frame[5] >= s->zMinc && (s->xMinc || s->xMaxc))
{
found = mesh->staticNumber;
@ -1400,7 +1401,7 @@ void PuzzleDone(ITEM_INFO* item, short itemNum)
{
FlipMap(Items[i].triggerFlags - 7);
flipmap[Items[i].triggerFlags - 7] ^= IFLAG_ACTIVATION_MASK;
Items[i].status = ITEM_INACTIVE;
Items[i].status = ITEM_NOT_ACTIVE;
Items[i].flags |= 0x20;
}
}
@ -1493,7 +1494,7 @@ void SearchObjectCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* lar
item = &Items[itemNumber];
objNumber = (item->objectNumber - ID_SEARCH_OBJECT1) / 2;
if (TrInput & IN_ACTION && laraitem->currentAnimState == STATE_LARA_STOP && laraitem->animNumber == ANIMATION_LARA_STAY_IDLE && Lara.gunStatus == LG_NO_ARMS && (item->status == ITEM_INACTIVE && item->objectNumber != ID_SEARCH_OBJECT4 || !item->itemFlags[0])
if (TrInput & IN_ACTION && laraitem->currentAnimState == STATE_LARA_STOP && laraitem->animNumber == ANIMATION_LARA_STAY_IDLE && Lara.gunStatus == LG_NO_ARMS && (item->status == ITEM_NOT_ACTIVE && item->objectNumber != ID_SEARCH_OBJECT4 || !item->itemFlags[0])
|| Lara.isMoving && Lara.generalPtr == (void *) itemNumber)
{
bounds = GetBoundsAccurate(item);
@ -1602,7 +1603,7 @@ void SearchObjectControl(short itemNumber)
if (Objects[item2->objectNumber].isPickup)
{
if (FlipStats[0])
item2->status = ITEM_INACTIVE;
item2->status = ITEM_NOT_ACTIVE;
else
item2->status = ITEM_INVISIBLE;
}
@ -1638,7 +1639,7 @@ void SearchObjectControl(short itemNumber)
}
if (item->status == ITEM_DEACTIVATED)
if (item->status == ITEM_DESACTIVATED)
{
if (item->objectNumber == ID_SEARCH_OBJECT4)
{
@ -1648,7 +1649,7 @@ void SearchObjectControl(short itemNumber)
else
{
RemoveActiveItem(itemNumber);
item->status = ITEM_INACTIVE;
item->status = ITEM_NOT_ACTIVE;
}
}
}

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "collide.h"
void InitialisePickup(short itemNumber);

227
TR5Main/Game/room.h Normal file
View file

@ -0,0 +1,227 @@
#pragma once
typedef struct tr5_room_layer
{
unsigned int NumLayerVertices; // Number of vertices in this layer (4 bytes)
unsigned short UnknownL1;
unsigned short NumLayerRectangles; // Number of rectangles in this layer (2 bytes)
unsigned short NumLayerTriangles; // Number of triangles in this layer (2 bytes)
unsigned short UnknownL2;
unsigned short Filler; // Always 0
unsigned short Filler2; // Always 0
/// The following 6 floats define the bounding box for the layer
float LayerBoundingBoxX1;
float LayerBoundingBoxY1;
float LayerBoundingBoxZ1;
float LayerBoundingBoxX2;
float LayerBoundingBoxY2;
float LayerBoundingBoxZ2;
unsigned int Filler3; // Always 0 (4 bytes)
void* VerticesOffset;
void* PolyOffset;
void* PolyOffset2;
};
typedef struct tr5_vertex
{
float x;
float y;
float z;
};
typedef struct tr5_room_vertex
{
tr5_vertex Vertex; // Vertex is now floating-point
tr5_vertex Normal;
DWORD Colour; // 32-bit colour
};
typedef struct tr4_mesh_face3 // 10 bytes
{
short Vertices[3];
short Texture;
short Effects; // TR4-5 ONLY: alpha blending and environment mapping strength
};
typedef struct tr4_mesh_face4 // 12 bytes
{
short Vertices[4];
short Texture;
short Effects;
};
typedef struct tr_room_portal // 32 bytes
{
short AdjoiningRoom; // Which room this portal leads to
TR_VERTEX Normal;
TR_VERTEX Vertices[4];
};
typedef struct tr_room_sector // 8 bytes
{
unsigned short FDindex; // Index into FloorData[]
unsigned short BoxIndex; // Index into Boxes[] (-1 if none)
unsigned char RoomBelow; // 255 is none
signed char Floor; // Absolute height of floor
unsigned char RoomAbove; // 255 if none
signed char Ceiling; // Absolute height of ceiling
};
typedef struct tr5_room_light
{
float x, y, z; // Position of light, in world coordinates
float r, g, b; // Colour of the light
int Separator; // Dummy value = 0xCDCDCDCD
float In; // Cosine of the IN value for light / size of IN value
float Out; // Cosine of the OUT value for light / size of OUT value
float RadIn; // (IN radians) * 2
float RadOut; // (OUT radians) * 2
float Range; // Range of light
float dx, dy, dz; // Direction - used only by sun and spot lights
int x2, y2, z2; // Same as position, only in integer.
int dx2, dy2, dz2; // Same as direction, only in integer.
byte LightType;
byte Filler[3]; // Dummy values = 3 x 0xCD
};
typedef struct MESH_INFO
{
int x;
int y;
int z;
short yRot;
short shade;
short Flags;
short staticNumber;
};
typedef struct LIGHTINFO
{
int x; // size=0, offset=0
int y; // size=0, offset=4
int z; // size=0, offset=8
unsigned char Type; // size=0, offset=12
unsigned char r; // size=0, offset=13
unsigned char g; // size=0, offset=14
unsigned char b; // size=0, offset=15
short nx; // size=0, offset=16
short ny; // size=0, offset=18
short nz; // size=0, offset=20
short Intensity; // size=0, offset=22
unsigned char Inner; // size=0, offset=24
unsigned char Outer; // size=0, offset=25
short FalloffScale; // size=0, offset=26
short Length; // size=0, offset=28
short Cutoff; // size=0, offset=30
};
typedef struct FLOOR_INFO
{
unsigned short index;
unsigned short fx : 4;
unsigned short box : 11;
unsigned short stopper : 1;
unsigned char pitRoom;
signed char floor;
unsigned char skyRoom;
signed char ceiling;
};
typedef enum RoomEnumFlag
{
ENV_FLAG_WATER = 0x0001,
ENV_FLAG_SWAMP = 0x0004,
ENV_FLAG_OUTSIDE = 0x0008,
ENV_FLAG_DYNAMIC_LIT = 0x0010,
ENV_FLAG_WIND = 0x0020,
ENV_FLAG_NOT_NEAR_OUTSIDE = 0x0040,
ENV_FLAG_NO_LENSFLARE = 0x0080, // Was quicksand in TR3.
ENV_FLAG_MIST = 0x0100,
ENV_FLAG_CAUSTICS = 0x0200,
ENV_FLAG_UNKNOWN3 = 0x0400
};
typedef struct ROOM_INFO
{
short* data;
short* door;
FLOOR_INFO* floor;
void* something;
MESH_INFO* mesh;
int x;
int y;
int z;
int minfloor;
int maxceiling;
short xSize;
short ySize;
CVECTOR ambient;
short numLights;
short numMeshes;
unsigned char reverbType;
unsigned char flipNumber;
byte meshEffect;
byte boundActive;
short left;
short right;
short top;
short bottom;
short testLeft;
short testRight;
short testTop;
short testBottom;
short itemNumber;
short fxNumber;
short flippedRoom;
unsigned short flags; // ENV_FLAG_enum
unsigned int Unknown1;
unsigned int Unknown2; // Always 0
unsigned int Unknown3; // Always 0
unsigned int Separator; // 0xCDCDCDCD
unsigned short Unknown4;
unsigned short Unknown5;
float RoomX;
float RoomY;
float RoomZ;
unsigned int Separator1[4]; // Always 0xCDCDCDCD
unsigned int Separator2; // 0 for normal rooms and 0xCDCDCDCD for null rooms
unsigned int Separator3; // Always 0xCDCDCDCD
unsigned int NumRoomTriangles;
unsigned int NumRoomRectangles;
tr5_room_light* light; // Always 0
unsigned int LightDataSize;
unsigned int NumLights2; // Always same as NumLights
unsigned int Unknown6;
int RoomYTop;
int RoomYBottom;
unsigned int NumLayers;
tr5_room_layer* LayerOffset;
tr5_room_vertex* VerticesOffset;
void* PolyOffset;
void* PolyOffset2; // Same as PolyOffset
int NumVertices;
int Separator5[4]; // Always 0xCDCDCDCD
};
typedef struct ANIM_STRUCT
{
short* framePtr;
short interpolation;
short currentAnimState;
int velocity;
int acceleration;
int Xvelocity;
int Xacceleration;
short frameBase;
short frameEnd;
short jumpAnimNum;
short jumpFrameNum;
short numberChanges;
short changeIndex;
short numberCommands;
short commandIndex;
};
constexpr auto NUM_ROOMS = 1024;
constexpr auto NO_ROOM = 0xFF;
constexpr auto NO_HEIGHT = (-0x7F00);

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "collide.h"
struct ROPE_STRUCT

View file

@ -9,7 +9,6 @@
#include "spotcam.h"
#include "traps.h"
#include "laramisc.h"
#include "newobjects.h"
#include "oldobjects.h"
#include "sound.h"
#include "level.h"
@ -25,7 +24,6 @@ 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;
@ -579,7 +577,7 @@ bool SaveGame::readItem()
m_reader->ReadChunks(&readItemChunks, itemNumber);
DisableBaddieAI(itemNumber);
KillItem(itemNumber);
item->status = ITEM_DEACTIVATED;
item->status = ITEM_DESACTIVATED;
item->flags |= ONESHOT;
item->afterDeath = 128;
}
@ -593,7 +591,7 @@ bool SaveGame::readItem()
}
// Some post-processing things
if (obj->isPuzzleHole && (item->status == ITEM_DEACTIVATED || item->status == ITEM_ACTIVE))
if (obj->isPuzzleHole && (item->status == ITEM_DESACTIVATED || item->status == ITEM_ACTIVE))
item->objectNumber += NUM_PUZZLES;
if (item->objectNumber >= ID_SMASH_OBJECT1 && item->objectNumber <= ID_SMASH_OBJECT8 && (item->flags & ONESHOT))
@ -771,7 +769,6 @@ bool SaveGame::readLaraChunks(ChunkId* chunkId, int maxSize, int arg)
else if (chunkId->EqualsTo(m_chunkWeaponInfo))
{
int id = LEB128::ReadInt32(m_stream);
CarriedWeaponInfo* weapon = &Lara.Weapons[id];
weapon->Present = LEB128::ReadByte(m_stream);

View file

@ -1,6 +1,4 @@
#pragma once
#include "global.h"
#include "ChunkId.h"
#include "ChunkReader.h"
#include "ChunkWriter.h"
@ -13,7 +11,6 @@
extern GameFlow* g_GameFlow;
extern GameScript* g_GameScript;
extern SAVEGAME_INFO Savegame;
typedef struct SaveGameHeader
{

View file

@ -1,7 +1,13 @@
#pragma once
#include "global.h"
#include "control.h"
enum SFX_TYPES
{
SFX_LANDANDWATER = 0,
SFX_LANDONLY = (1 << 14),
SFX_WATERONLY = (2 << 14)
};
typedef enum audio_tracks
{
CDA_XA1_TL_10B, // TO CLIMB OUT, SWIM TO THE EDGE AND PRESS 'ACTION'.
@ -1961,7 +1967,7 @@ typedef enum sound_effects
#define SOUND_XFADETIME_HIJACKSOUND 50
#define SOUND_BGM_DAMP_COEFFICIENT 0.6f
struct SoundEffectSlot
typedef struct SoundEffectSlot
{
short state;
short effectID;
@ -1970,13 +1976,13 @@ struct SoundEffectSlot
Vector3 origin;
};
struct SoundTrackSlot
typedef struct SoundTrackSlot
{
HSTREAM channel;
short trackID;
};
enum sound_track_types
typedef enum sound_track_types
{
SOUND_TRACK_ONESHOT,
SOUND_TRACK_BGM,
@ -1984,7 +1990,7 @@ enum sound_track_types
NUM_SOUND_TRACK_TYPES
};
enum sound_filters
typedef enum sound_filters
{
SOUND_FILTER_REVERB,
SOUND_FILTER_COMPRESSOR,
@ -1993,14 +1999,14 @@ enum sound_filters
NUM_SOUND_FILTERS
};
enum sound_states
typedef enum sound_states
{
SOUND_STATE_IDLE,
SOUND_STATE_ENDING,
SOUND_STATE_ENDED
};
enum sound_flags
typedef enum sound_flags
{
SOUND_NORMAL,
SOUND_WAIT,
@ -2008,7 +2014,7 @@ enum sound_flags
SOUND_LOOPED
};
enum reverb_type
typedef enum reverb_type
{
RVB_OUTSIDE, // 0x00 no reverberation
RVB_SMALL_ROOM, // 0x01 little reverberation
@ -2019,7 +2025,17 @@ enum reverb_type
NUM_REVERB_TYPES
};
struct AudioTrack
typedef struct SAMPLE_INFO
{
short number;
byte volume;
byte radius;
byte randomness;
signed char pitch;
short flags;
};
typedef struct AudioTrack
{
char* Name;
byte Mask;

View file

@ -4,6 +4,8 @@
#include "lara.h"
#include "level.h"
#include "setup.h"
#include "Renderer11.h"
#include "trmath.h"
int NumLaraSpheres;
bool GotLaraSpheres;
@ -98,7 +100,6 @@ int TestCollision(ITEM_INFO* item, ITEM_INFO* l)
int dz = z1 - z2;
int r = r1 + r2;
if (SQUARE(dx) + SQUARE(dy) + SQUARE(dz) < SQUARE(r))
{
l->touchBits |= (1 << j);

View file

@ -1,12 +1,19 @@
#pragma once
#include "global.h"
#include "items.h"
#define SPHERES_SPACE_LOCAL 0
#define SPHERES_SPACE_WORLD 1
#define SPHERES_SPACE_BONE_ORIGIN 2
#define MAX_SPHERES 34
typedef struct SPHERE
{
int x;
int y;
int z;
int r;
};
extern int NumLaraSpheres;
extern bool GotLaraSpheres;
extern SPHERE LaraSpheres[MAX_SPHERES];

View file

@ -49,8 +49,6 @@ int SlowMotion;
int SpotcamDontDrawLara;
int SpotcamOverlay;
extern Renderer11* g_Renderer;
void InitSpotCamSequences()
{
int s, cc, n, ce;

View file

@ -1,6 +1,30 @@
#pragma once
#include "phd_global.h"
#include "global.h"
struct QUAKE_CAMERA
{
GAME_VECTOR spos;
GAME_VECTOR epos;
};
typedef struct SPOTCAM
{
int x;
int y;
int z;
int tx;
int ty;
int tz;
unsigned char sequence;
unsigned char camera;
short fov;
short roll;
short timer;
short speed;
short flags;
short roomNumber;
short pad;
};
enum spotcam_flags
{

View file

@ -42,12 +42,6 @@ short TurnSwitchBoundsC[12] = // offset 0xA14FC
0xF8E4, 0x071C
};
PHD_VECTOR TurnSwitchPosA = { 650, 0, -138 }; // offset 0xA1514
PHD_VECTOR CogSwitchPos = { 0, 0, -856 }; // offset 0xA1520
short CogSwitchBounds[12] = // offset 0xA152C
{
0xFE00, 0x0200, 0x0000, 0x0000, 0xFA00, 0xFE00, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0xF8E4, 0x071C
};
PHD_VECTOR RailSwitchPos = { 0, 0, -550 }; // offset 0xA1544
short RailSwitchBounds[12] = // offset 0xA1550
{
@ -205,125 +199,6 @@ void CrowDoveSwitchControl(short itemNumber)
}
}
void CogSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
{
ITEM_INFO* item = &Items[itemNum];
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &item->roomNumber);
GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (!TriggerIndex)
{
ObjectCollision(itemNum, l, coll);
return;
}
short* trigger = TriggerIndex;
for (int i = *TriggerIndex; (i & 0x1F) != 4; trigger++)
{
if (i < 0)
break;
i = trigger[1];
}
ITEM_INFO* target = &Items[trigger[3] & 0x3FF];
DOOR_DATA* door = (DOOR_DATA*)target->data;
if (item->status == ITEM_INACTIVE)
{
if (!(item->flags & 0x100)
&& (TrInput & IN_ACTION
&& !Lara.gunStatus
&& !(item->status && item->gravityStatus)
&& l->currentAnimState == STATE_LARA_STOP
&& l->animNumber == ANIMATION_LARA_STAY_IDLE
|| Lara.isMoving && Lara.generalPtr == (void*)itemNum))
{
if (TestLaraPosition(CogSwitchBounds, item, l))
{
if (MoveLaraPosition(&CogSwitchPos, item, l))
{
Lara.isMoving = false;
Lara.headYrot = 0;
Lara.headXrot = 0;
Lara.torsoYrot = 0;
Lara.torsoXrot = 0;
Lara.gunStatus = LG_HANDS_BUSY;
Lara.generalPtr = target;
l->animNumber = ANIMATION_LARA_COGWHEEL_GRAB;
l->goalAnimState = STATE_LARA_COGWHEEL;
l->currentAnimState = STATE_LARA_COGWHEEL;
l->frameNumber = Anims[l->animNumber].frameBase;
AddActiveItem(itemNum);
item->goalAnimState = 1;
item->status = ITEM_ACTIVE;
if (!door->opened)
{
AddActiveItem((target - Items));
target->itemFlags[2] = target->pos.yPos;
target->status = ITEM_ACTIVE;
}
}
else
{
Lara.generalPtr = (void*)itemNum;
}
return;
}
if (Lara.isMoving && Lara.generalPtr == (void*)itemNum)
{
Lara.isMoving = false;
Lara.gunStatus = LG_NO_ARMS;
}
}
ObjectCollision(itemNum, l, coll);
}
}
void CogSwitchControl(short itemNum)
{
ITEM_INFO* item = &Items[itemNum];
AnimateItem(item);
if (item->currentAnimState == 1)
{
if (item->goalAnimState == 1 && !(TrInput & IN_ACTION))
{
LaraItem->goalAnimState = STATE_LARA_STOP;
item->goalAnimState = 0;
}
if (LaraItem->animNumber == ANIMATION_LARA_COGWHEEL_PULL)
{
if (LaraItem->frameNumber == (Anims[ANIMATION_LARA_COGWHEEL_PULL].frameBase + 10))
{
ITEM_INFO* it = (ITEM_INFO*)Lara.generalPtr;
it->itemFlags[0] = 40;
Lara.generalPtr = it;
SoundEffect(SFX_STONE_SCRAPE_FAST, &it->pos, 0);
}
}
}
else
{
if (item->frameNumber == Anims[item->animNumber].frameEnd)
{
item->currentAnimState = 0;
item->status = ITEM_INACTIVE;
RemoveActiveItem(itemNum);
LaraItem->animNumber = ANIMATION_LARA_STAY_SOLID;
LaraItem->frameNumber = Anims[LaraItem->animNumber].frameBase;
LaraItem->goalAnimState = STATE_LARA_STOP;
LaraItem->currentAnimState = STATE_LARA_STOP;
Lara.gunStatus = LG_NO_ARMS;
}
}
}
void FullBlockSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
{
ITEM_INFO* item = &Items[itemNum];
@ -389,7 +264,7 @@ void FullBlockSwitchControl(short itemNumber)
{
item->itemFlags[0] = 0;
item->goalAnimState = 1;
item->status = ITEM_INACTIVE;
item->status = ITEM_NOT_ACTIVE;
if (++CurrentSequence >= 7u)
CurrentSequence = 0;
}
@ -876,7 +751,7 @@ void TurnSwitchControl(short itemNum)
l->frameNumber = Anims[l->animNumber].frameBase;
item->animNumber = Objects[item->objectNumber].animIndex;
item->frameNumber = Anims[item->animNumber].frameBase;
item->status = ITEM_INACTIVE;
item->status = ITEM_NOT_ACTIVE;
RemoveActiveItem(itemNum);
@ -1019,7 +894,7 @@ void SwitchCollision2(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
if (TrInput & IN_ACTION)
{
if (item->status == ITEM_INACTIVE && Lara.waterStatus == LW_UNDERWATER && !Lara.gunStatus && l->currentAnimState == STATE_LARA_UNDERWATER_STOP)
if (item->status == ITEM_NOT_ACTIVE && Lara.waterStatus == LW_UNDERWATER && !Lara.gunStatus && l->currentAnimState == STATE_LARA_UNDERWATER_STOP)
{
if (TestLaraPosition(Switch2Bounds, item, l))
{
@ -1054,7 +929,7 @@ void SwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
&& l->currentAnimState == STATE_LARA_STOP
&& l->animNumber == ANIMATION_LARA_STAY_IDLE
&& !Lara.gunStatus
&& item->status == ITEM_INACTIVE
&& item->status == ITEM_NOT_ACTIVE
&& !(item->flags & 0x100)
&& item->triggerFlags >= 0
|| Lara.isMoving && Lara.generalPtr == (void*)itemNum)
@ -1347,7 +1222,7 @@ int GetSwitchTrigger(ITEM_INFO* item, short* itemNos, int AttatchedToSwitch)
int SwitchTrigger(short itemNum, short timer)
{
ITEM_INFO* item = &Items[itemNum];
if (item->status == ITEM_DEACTIVATED)
if (item->status == ITEM_DESACTIVATED)
{
if ((!item->currentAnimState && item->objectNumber != ID_JUMP_SWITCH || item->currentAnimState == 1 && item->objectNumber == ID_JUMP_SWITCH) && timer > 0)
{
@ -1361,7 +1236,7 @@ int SwitchTrigger(short itemNum, short timer)
{
RemoveActiveItem(itemNum);
item->status = ITEM_INACTIVE;
item->status = ITEM_NOT_ACTIVE;
if (!item->itemFlags[0] == 0)
item->flags |= 0x100;
if (item->currentAnimState != 1)

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "collide.h"
extern int PulleyItemNumber;

View file

@ -1,14 +1,14 @@
#include "framework.h"
#include "tomb4fx.h"
#include "global.h"
#include "lara.h"
#include "effect2.h"
#include "draw.h"
#include "items.h"
#include "setup.h"
#include "level.h"
#include "sound.h"
#include "bubble.h"
#include "trmath.h"
#include "GameFlowScript.h"
char FlareTable[121] =
{
@ -46,11 +46,7 @@ BLOOD_STRUCT Blood[MAX_SPARKS_BLOOD];
DRIP_STRUCT Drips[MAX_DRIPS];
SHOCKWAVE_STRUCT ShockWaves[MAX_SHOCKWAVE];
FIRE_LIST Fires[MAX_FIRE_LIST];
ENERGY_ARC EnergyArcs[MAX_ENERGY_ARCS];
extern int NextSpark;
extern SPARKS Sparks[MAX_SPARKS];
extern Renderer11* g_Renderer;
ENERGY_ARC EnergyArcs[MAX_ENERGYARCS];
int GetFreeFireSpark()
{
@ -117,7 +113,7 @@ void TriggerGlobalStaticFlame()
spark->xVel = 0;
spark->yVel = 0;
spark->zVel = 0;
spark->flags = 0;
spark->flags = SP_NONE;
spark->dSize = spark->sSize = spark->size = (GetRandomControl() & 0x1F) + -128;
}
@ -154,7 +150,7 @@ void TriggerGlobalFireSmoke()
}
else
{
spark->flags = 0;
spark->flags = SP_NONE;
}
spark->gravity = -16 - (GetRandomControl() & 0xF);
@ -197,7 +193,7 @@ void TriggerGlobalFireFlame()
}
else
{
spark->flags = 0;
spark->flags = SP_NONE;
}
spark->sSize = spark->size = (GetRandomControl() & 0x1F) + 128;
@ -332,7 +328,7 @@ void UpdateFireSparks()
void UpdateEnergyArcs()
{
for (int i = 0; i < MAX_ENERGY_ARCS; i++)
for (int i = 0; i < MAX_ENERGYARCS; i++)
{
ENERGY_ARC* arc = &EnergyArcs[i];
@ -488,7 +484,7 @@ byte TriggerGunSmoke_SubFunction(int weaponType)
case WEAPON_HK:
case WEAPON_ROCKET_LAUNCHER:
case WEAPON_GRENADE_LAUNCHER:
return 0x18; //(12) Rocket and Grenade value for TriggerGunSmoke in TR3 have the value 12 ! (the HK is not included there)
return 24; //(12) Rocket and Grenade value for TriggerGunSmoke in TR3 have the value 12 ! (the HK is not included there)
// other weapon
default:
@ -515,7 +511,7 @@ void TriggerGunSmoke(int x, int y, int z, short xv, short yv, short zv, byte ini
spark->dShade = 64;
}
spark->transType = 2;
spark->transType = COLADD;
spark->x = x + (GetRandomControl() & 31) - 16;
spark->y = y + (GetRandomControl() & 31) - 16;
spark->z = z + (GetRandomControl() & 31) - 16;
@ -556,7 +552,7 @@ void TriggerGunSmoke(int x, int y, int z, short xv, short yv, short zv, byte ini
}
else
{
spark->flags = 0;
spark->flags = SP_NONE;
}
float gravity = frand() * 1.25f;
spark->gravity = gravity;
@ -596,7 +592,7 @@ void TriggerShatterSmoke(int x, int y, int z)
spark->colFadeSpeed = 4;
spark->dShade = (GetRandomControl() & 0x1F) + 64;
spark->fadeToBlack = 24 - (GetRandomControl() & 7);
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 7) + 48;
spark->x = (GetRandomControl() & 0x1F) + x - 16;
spark->y = (GetRandomControl() & 0x1F) + y - 16;
@ -621,7 +617,7 @@ void TriggerShatterSmoke(int x, int y, int z)
}
else
{
spark->flags = 0;
spark->flags = SP_NONE;
}
spark->gravity = -4 - (GetRandomControl() & 3);
@ -1027,13 +1023,13 @@ void AddWaterSparks(int x, int y, int z, int num)
spark->fadeToBlack = 8;
spark->life = 24;
spark->sLife = 24;
spark->transType = 2;
spark->transType = COLADD;
int random = GetRandomControl();
spark->xVel = -rcossin_tbl[2 * random] >> 5;
spark->yVel = -640 - GetRandomControl();
spark->zVel = rcossin_tbl[2 * random & 0xFFF + 1] >> 5;
spark->friction = 5;
spark->flags = 0;
spark->flags = SP_NONE;
spark->x = x + (spark->xVel >> 3);
spark->y = y - (spark->yVel >> 5);
spark->z = z + (spark->zVel >> 3);
@ -1042,10 +1038,6 @@ void AddWaterSparks(int x, int y, int z, int num)
}
}
void LaraBubbles(ITEM_INFO* item)// (F)
{
PHD_VECTOR pos;
@ -1524,7 +1516,7 @@ void TriggerExplosionBubble(int x, int y, int z, short roomNum)// (F)
spark->sB = 0;
spark->colFadeSpeed = 8;
spark->fadeToBlack = 12;
spark->transType = 2;
spark->transType = COLADD;
spark->x = x;
spark->y = y;
spark->z = z;
@ -1581,7 +1573,7 @@ void TriggerExplosionBubble(int x, int y, int z, short roomNum)// (F)
spark->fadeToBlack = 64;
spark->life = spark->sLife = (GetRandomControl() & 0x1F) + 96;
if (unk)
spark->transType = 2;
spark->transType = COLADD;
else
spark->transType = 3;
spark->x = (GetRandomControl() & 0x1F) + x - 16;
@ -1646,7 +1638,7 @@ void TriggerLightningGlow(int x, int y, int z, byte size, byte r, byte g, byte b
spark->dR = r;
spark->sR = r;
spark->colFadeSpeed = 2;
spark->transType = 2;
spark->transType = COLADD;
spark->on = 1;
spark->dB = b;
spark->sB = b;
@ -1681,7 +1673,7 @@ void TriggerFenceSparks(int x, int y, int z, int kill, int crane)//(F)
spark->life = (GetRandomControl() & 7) + 24;
spark->sLife = (GetRandomControl() & 7) + 24;
spark->transType = 2;
spark->transType = COLADD;
spark->dynamic = -1;
spark->x = x;
@ -1701,7 +1693,7 @@ void TriggerFenceSparks(int x, int y, int z, int kill, int crane)//(F)
spark->friction = 4;
}
spark->flags = 0;
spark->flags = SP_NONE;
spark->gravity = (GetRandomControl() & 0xF) + ((crane << 4) + 16);
spark->maxYvel = 0;
}
@ -1731,7 +1723,7 @@ void TriggerSmallSplash(int x, int y, int z, int num)
sptr->life = 24;
sptr->sLife = 24;
sptr->transType = 2;
sptr->transType = COLADD;
angle = GetRandomControl() << 3;
@ -1755,7 +1747,7 @@ ENERGY_ARC* TriggerEnergyArc(PHD_VECTOR* start, PHD_VECTOR* end, byte r, byte g,
{
ENERGY_ARC* arc = NULL;
for (int i = 0; i < 16; i++)
for (int i = 0; i < MAX_ENERGYARCS; i++)
{
arc = &EnergyArcs[i];
if (arc->life == 0)

View file

@ -1,31 +1,185 @@
#pragma once
#include "types.h"
#include "constants.h"
#include "phd_global.h"
#include "items.h"
struct ENERGY_ARC
typedef struct ENERGY_ARC
{
PHD_VECTOR pos1; // 0
PHD_VECTOR pos1;
PHD_VECTOR pos2;
PHD_VECTOR pos3; // 24
PHD_VECTOR pos4; // 36
byte r; // 48
byte g; // 49
byte b; // 50
short sLife; // 52
short life; // 51
PHD_VECTOR pos3;
PHD_VECTOR pos4;
byte r;
byte g;
byte b;
short sLife;
short life;
short amplitude;
short segmentSize; // 64
short sAmplitude; // 53
byte type; // 61
byte flags; // 62
signed char direction; // 63
short segmentSize;
short sAmplitude;
byte type;
byte flags;
signed char direction;
short rotation;
short filler;
};
typedef struct SMOKE_SPARKS
{
int x;
int y;
int z;
short xVel;
short yVel;
short zVel;
short gravity;
short rotAng;
short flags;
byte sSize;
byte dSize;
byte size;
byte friction;
byte scalar;
byte def;
signed char rotAdd;
signed char maxYvel;
byte on;
byte sShade;
byte dShade;
byte shade;
byte colFadeSpeed;
byte fadeToBlack;
signed char sLife;
signed char life;
byte transType;
byte fxObj;
byte nodeNumber;
byte mirror;
};
typedef struct GUNFLASH_STRUCT
{
MATRIX3D matrix;
short on;
};
typedef struct SHOCKWAVE_STRUCT
{
int x;
int y;
int z;
short innerRad;
short outerRad;
short xRot;
short flags;
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char life;
short speed;
short temp;
};
typedef struct GUNSHELL_STRUCT
{
PHD_3DPOS pos;
short fallspeed;
short roomNumber;
short speed;
short counter;
short dirXrot;
short objectNumber;
};
typedef struct DRIP_STRUCT
{
int x;
int y;
int z;
byte on;
byte r;
byte g;
byte b;
short yVel;
byte gravity;
byte life;
short roomNumber;
byte outside;
byte pad;
};
typedef struct FIRE_LIST
{
int x;
int y;
int z;
byte on;
byte size;
short roomNumber;
};
typedef struct FIRE_SPARKS
{
short x;
short y;
short z;
short xVel;
short yVel;
short zVel;
short gravity;
short rotAng;
short flags;
unsigned char sSize;
unsigned char dSize;
unsigned char size;
unsigned char friction;
unsigned char scalar;
unsigned char def;
signed char rotAdd;
signed char maxYvel;
unsigned char on;
unsigned char sR;
unsigned char sG;
unsigned char sB;
unsigned char dR;
unsigned char dG;
unsigned char dB;
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char colFadeSpeed;
unsigned char fadeToBlack;
unsigned char sLife;
unsigned char life;
};
typedef struct BLOOD_STRUCT
{
int x;
int y;
int z;
short xVel;
short yVel;
short zVel;
short gravity;
short rotAng;
unsigned char sSize;
unsigned char dSize;
unsigned char size;
unsigned char friction;
byte rotAdd;
unsigned char on;
unsigned char sShade;
unsigned char dShade;
unsigned char shade;
unsigned char colFadeSpeed;
unsigned char fadeToBlack;
byte sLife;
byte life;
byte pad;
};
#define ENERGY_ARC_STRAIGHT_LINE 0
#define ENERGY_ARC_CIRCLE 1
#define ENERGY_ARC_NO_RANDOMIZE 1
extern int LaserSightX;
@ -42,8 +196,26 @@ extern int NextBlood;
extern int NextSpider;
extern int NextGunShell;
#define MAX_SPARKS_FIRE 20
#define MAX_FIRE_LIST 32
#define MAX_SPARKS_SMOKE 32
#define MAX_SPARKS_BLOOD 32
#define MAX_GUNFLASH 4
#define MAX_GUNSHELL 24
#define MAX_DRIPS 32
#define MAX_SHOCKWAVE 16
#define MAX_ENERGYARCS 32
extern GUNFLASH_STRUCT Gunflashes[MAX_GUNFLASH];
extern FIRE_SPARKS FireSparks[MAX_SPARKS_FIRE];
extern SMOKE_SPARKS SmokeSparks[MAX_SPARKS_SMOKE];
extern GUNSHELL_STRUCT Gunshells[MAX_GUNSHELL];
extern BLOOD_STRUCT Blood[MAX_SPARKS_BLOOD];
extern DRIP_STRUCT Drips[MAX_DRIPS];
extern SHOCKWAVE_STRUCT ShockWaves[MAX_SHOCKWAVE];
extern FIRE_LIST Fires[MAX_FIRE_LIST];
extern ENERGY_ARC EnergyArcs[MAX_ENERGYARCS];
extern SMOKE_SPARKS SmokeSparks[MAX_SPARKS_SMOKE];
extern ENERGY_ARC EnergyArcs[MAX_ENERGY_ARCS];
void TriggerBlood(int x, int y, int z, int unk, int num);
void TriggerExplosionBubble(int x, int y, int z, short roomNum);
@ -73,7 +245,11 @@ void UpdateBubbles();
int GetFreeDrip();
void UpdateDrips();
void TriggerLaraDrips();
int ExplodingDeath(short itemNumber, int meshBits, short flags);
constexpr auto EXPLODE_HIT_EFFECT = 258;
constexpr auto EXPLODE_NORMAL = 256;
int ExplodingDeath(short itemNumber, int meshBits, short flags); // EXPLODE_ flags
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);

View file

@ -1,6 +1,6 @@
#include "framework.h"
#include "traps.h"
#include "global.h"
#include "items.h"
#include "effect2.h"
#include "tomb4fx.h"
@ -323,7 +323,7 @@ void CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) /
l->pos.yRot += ANGLE(180);
result2 = TestLaraPosition(CeilingTrapDoorBounds, item, l);
l->pos.yRot += ANGLE(180);
if (TrInput & IN_ACTION && item->status != ITEM_DEACTIVATED && l->currentAnimState == STATE_LARA_JUMP_UP && l->gravityStatus && Lara.gunStatus == LG_NO_ARMS && (result || result2))
if (TrInput & IN_ACTION && item->status != ITEM_DESACTIVATED && l->currentAnimState == STATE_LARA_JUMP_UP && l->gravityStatus && Lara.gunStatus == LG_NO_ARMS && (result || result2))
{
AlignLaraPosition(&CeilingTrapDoorPos, item, l);
if (result2)
@ -363,7 +363,7 @@ void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) //
ITEM_INFO* item;
item = &Items[itemNumber];
if (TrInput & IN_ACTION && item->status != ITEM_DEACTIVATED && l->currentAnimState == STATE_LARA_STOP && l->animNumber == ANIMATION_LARA_STAY_IDLE && Lara.gunStatus == LG_NO_ARMS
if (TrInput & IN_ACTION && item->status != ITEM_DESACTIVATED && l->currentAnimState == STATE_LARA_STOP && l->animNumber == ANIMATION_LARA_STAY_IDLE && Lara.gunStatus == LG_NO_ARMS
|| Lara.isMoving && Lara.generalPtr == (void *) itemNumber)
{
if (TestLaraPosition(FloorTrapDoorBounds, item, l))

View file

@ -1,5 +1,5 @@
#pragma once
#include "global.h"
#include "collide.h"
extern ITEM_INFO* WBItem;

View file

@ -1,6 +1,5 @@
#include "framework.h"
#include "trmath.h"
#include "types.h"
#include <cmath>
// LUT for cos and sin

View file

@ -1,17 +1,26 @@
#pragma once
#include "phd_global.h"
#include "vodoo.h"
#include "types.h"
constexpr auto PI = 3.14159265358979323846f;
constexpr auto RADIAN = 0.01745329252f;
constexpr auto ONE_DEGREE = 182;
constexpr auto PREDICTIVE_SCALE_FACTOR = 14;
constexpr auto W2V_SHIFT = 14; // Shift scale of View.Frame to World.Frame
constexpr auto NODE_SHIFT = 15;
constexpr auto W2V_SCALE = (1 << W2V_SHIFT); // Scale of View Frame to World Frame
constexpr auto WALL_SHIFT = 10;
constexpr auto STEP_SIZE = 256;
constexpr auto WALL_SIZE = 1024;
constexpr auto STEPUP_HEIGHT = ((STEP_SIZE * 3) / 2);
constexpr auto BAD_JUMP_CEILING = ((STEP_SIZE * 3) / 4);
#define PI 3.14159265358979323846f
#define RADIAN 0.01745329252f
#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 HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))
short ANGLE(float angle);
float TO_DEGREES(short angle);
@ -21,7 +30,6 @@ 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();

View file

@ -1,196 +0,0 @@
#pragma once
#define HAIR_SEGMENTS 7 // only classic lara (young lara have more segments !)
#define DOUBLE_HAIR_SEGMENTS 14
#define TEXTURE_PAGE (256 * 256)
#define PREDICTIVE_SCALE_FACTOR 14
#define W2V_SHIFT 14 // Shift scale of View.Frame to World.Frame
#define NODE_SHIFT 15
#define W2V_SCALE (1 << W2V_SHIFT) // Scale of View Frame to World Frame
#define WALL_SHIFT 10
#define STEP_SIZE 256
#define WALL_SIZE 1024
/// obj->hitEffect flag
#define HIT_NONE 0
#define HIT_BLOOD 1
#define HIT_SMOKE 2
#define HIT_FRAGMENT 3
#define GUARD 1
#define AMBUSH 2
#define PATROL1 4
#define MODIFY 8
#define FOLLOW 16
#define PATROL2 32
#define ALL_AIOBJ (GUARD|AMBUSH|PATROL1|MODIFY|FOLLOW|PATROL2)
#define BOX_BLOCKED (1 << 14) // unpassable for other enemies, always set for movable blocks & closed doors
#define BOX_LAST (1 << 15) // unpassable by large enemies (T-Rex, Centaur, etc), always set behind doors
#define GRAVITY 6
#define SWAMP_GRAVITY 2
#define NUM_SPRITES 256
#define UNIT_SHADOW 256
#define NO_SHADOW 0
#define DEFAULT_RADIUS 10
#define ROT_X 4
#define ROT_Y 8
#define ROT_Z 16
// ExplodingDeath() last argument flags
#define EXPLODE_HIT_EFFECT 258
#define EXPLODE_NORMAL 256
#define FRONT_ARC ANGLE(90)
#define NO_ITEM -1
#define ALL_MESHBITS -1
#define GAME_BUFFER_SIZE 128 * 1000000
#define MAX_FLIPMAP 255
#define NUM_SLOTS 32
#define NUM_ITEMS 1023
#define NUM_ROOMS 1024
#define NUM_ANIMATED_SETS 1024
#define DRAW_DISTANCE 200 * 1024.0f
#define NUM_STATICS 1000
#define MAX_LIGHTS 100
#define MAX_LIGHTS_DRAW 16384
#define MAX_DYNAMIC_LIGHTS 16384
#define MAX_STATICS 1000
#define MAX_DRAW_STATICS 16384
#define MAX_BONES 32
#define MAX_SPRITES 16384
#define MAX_SPARKS 1024
#define MAX_SPARKS_FIRE 20
#define MAX_FIRE_LIST 32
#define MAX_SPARKS_SMOKE 32
#define MAX_SPARKS_BLOOD 32
#define MAX_ENERGY_ARCS 256
#define MAX_GUNSHELL 24
#define MAX_GUNFLASH 4
#define MAX_DRIPS 32
#define MAX_DYNAMICS 64
constexpr auto MAX_SPLASH = 8;
#define MAX_RIPPLES 32
#define MAX_CAMERA 18
#define MAX_SHOCKWAVE 16
#define MAX_EFFECTS 100
#define MAX_DEBRIS 256
#define NO_ROOM 0xFF
#define NO_HEIGHT (-0x7F00)
#define NUM_PICKUPS 64
#define TIMID 0
#define VIOLENT 1
#define LARA_HITE 762
// Room flags
#define ENV_FLAG_WATER 0x0001
#define ENV_FLAG_SWAMP 0x0004
#define ENV_FLAG_OUTSIDE 0x0008
#define ENV_FLAG_DYNAMIC_LIT 0x0010
#define ENV_FLAG_WIND 0x0020
#define ENV_FLAG_NOT_NEAR_OUTSIDE 0x0040
#define ENV_FLAG_NO_LENSFLARE 0x0080 // Was quicksand in TR3.
#define ENV_FLAG_MIST 0x0100
#define ENV_FLAG_CAUSTICS 0x0200
#define ENV_FLAG_UNKNOWN3 0x0400
// From TR3, we need to check
#define SP_FLAT 1
#define SP_SCALE 2
#define SP_BLOOD 4
#define SP_DEF 8
#define SP_ROTATE 16
#define SP_EXPLOSION 32
#define SP_FX 64
#define SP_ITEM 128
#define SP_WIND 256
#define SP_EXPDEF 512
#define SP_USEFXOBJPOS 1024
#define SP_UNDERWEXP 2048
#define SP_NODEATTACH 4096
#define SP_PLASMAEXP 8192
#define SD_EXPLOSION 1
#define SD_UWEXPLOSION 2
#define SEMITRANS 1
#define COLADD 2
#define COLSUB 3
#define WEIRD 4
#define ONESHOT 0x100
#define DATA_TYPE 0x1F
#define DATA_TILT 0xF // tile type (FLOOR_TYPE enum)
#define DATA_STATIC 0xFF // probably add static collision
#define END_BIT 0x8000
#define VALUE_BITS 0x3FF
#define CODE_BITS 0x3e00
#define REVERSE 0x4000
#define SWONESHOT 0x40
#define ATONESHOT 0x80
#define NUM_DEBRIS 256
#define WEAPON_AMMO1 0
#define WEAPON_AMMO2 1
#define WEAPON_AMMO3 2
#define WEAPON_AMMO4 3
#define BLOCKABLE 0x8000
#define BLOCKED 0x4000
#define OVERLAP_INDEX 0x3FFF
#define SEARCH_NUMBER 0x7FFF
#define BLOCKED_SEARCH 0x8000
#define FOLLOW_CENTRE 1
#define NO_CHUNKY 2
#define CHASE_OBJECT 3
#define NO_MINY 0xFFFFFF
#define NO_BOX 0x7FF
#define BOX_JUMP 0x800
#define BOX_MONKEY 0x2000
#define BOX_NUMBER 0x7FF
#define BOX_END_BIT 0x8000
#define EXPAND_LEFT 0x1
#define EXPAND_RIGHT 0x2
#define EXPAND_TOP 0x4
#define EXPAND_BOTTOM 0x8
#define NO_FLYING 0
#define FLY_ZONE 0x2000
#define CLIP_LEFT 1
#define CLIP_RIGHT 2
#define CLIP_TOP 4
#define CLIP_BOTTOM 8
#define ALL_CLIP (CLIP_LEFT|CLIP_RIGHT|CLIP_TOP|CLIP_BOTTOM)
#define SECONDARY_CLIP 16
#define SLOPE_DIF 60
#define LARA_FREEFALL_SPEED 131
#define LARA_LEAN_RATE ANGLE(1.5)
#define LARA_LEAN_MAX ANGLE(11)
#define LARA_TURN_RATE ANGLE(2.25)
#define LARA_JUMP_TURN ANGLE(3)
#define LARA_SLOW_TURN ANGLE(4)
#define LARA_MED_TURN ANGLE(6)
#define LARA_FAST_TURN ANGLE(8)
#define STEPUP_HEIGHT ((STEP_SIZE*3)/2)
#define BAD_JUMP_CEILING ((STEP_SIZE*3)/4)
#define LARA_RAD 100
#define LARA_VELOCITY 12

File diff suppressed because it is too large Load diff

View file

@ -1,13 +0,0 @@
#pragma once
#include "vodoo.h"
#include "constants.h"
#include "enums.h"
#include "objectslist.h"
#include "types.h"
#include "trmath.h"
#include "macros.h"
#include "malloc.h"
#include "GameLogicScript.h"
#include "GameFlowScript.h"
#include "Renderer11.h"

View file

@ -1,29 +0,0 @@
#pragma once
#define RGB555(r, g, b) ((r << 7) & 0x7C00 | (g << 2) & 0x3E0 | (b >> 3) & 0x1F)
#define RED5(rgb) (((rgb >> 10) & 0x1F) << 3)
#define GREEN5(rgb) (((rgb >> 5) & 0x1F) << 3)
#define BLUE5(rgb) ((rgb & 0x1F) << 3)
#define WHITE555 RGB555(255, 255, 255)
#define GRAY555 RGB555(128, 128, 128)
#define BLACK555 RGB555( 0, 0, 0)
#define XZ_GET_SECTOR(room, x, z) (room->floor[((z) >> WALL_SHIFT) + ((x) >> WALL_SHIFT) * room->xSize])
#define ADD_PTR(p, t, n) p = (t*)((char*)(p) + (ptrdiff_t)(n));
///#define ZONE(A) (((A) >> (WALL_SIZE - 2)) - 1)
#define ZONE(A) FlipStatus + 2 * A
#define CHECK_CLICK(x) CLICK(x) / 2
#define RED(rgb) (((rgb) >> 16) & 0xFF)
#define GREEN(rgb) (((rgb) >> 8) & 0xFF)
#define BLUE(rgb) ((rgb) & 0xFF)
#define ALPHA(rgb) (((rgb) >> 24) & 0xFF)
#define MESHES(slot, mesh) Meshes[Objects[slot].meshIndex + mesh]
#define MESH_BITS(x) (1 << x)
#define LARA_MESHES(slot, mesh) Lara.meshPtrs[mesh] = MESHES(slot, mesh)
#define CHECK_LARA_MESHES(slot, mesh) Lara.meshPtrs[mesh] == MESHES(slot, mesh)
#define INIT_LARA_MESHES(mesh, to, from) Lara.meshPtrs[mesh] = LARA_MESHES(to, mesh) = LARA_MESHES(from, mesh)
#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))

File diff suppressed because it is too large Load diff

View file

@ -1,19 +0,0 @@
#pragma once
#include <Windows.h>
#pragma pack(push, 1)
typedef struct {
BYTE opCode; // must be 0xE9;
DWORD offset; // jump offset
} JMP;
#pragma pack(pop)
#define INJECT(from,to) { \
((JMP*)(from))->opCode = 0xE9; \
((JMP*)(from))->offset = (DWORD)(to) - ((DWORD)(from) + sizeof(JMP)); \
}
#define VAR_U_(address, type) (*(type*)(address)) // uninitialized variable
#define VAR_I_(address, type, value) (*(type*)(address)) // initialized variable (value is just for info)
#define ARRAY_(address, type, length) (*(type(*)length)(address)) // array (can be multidimensional)

View file

@ -1,5 +1,5 @@
#include "framework.h"
#include "newobjects.h"
#include "tr4_bubbles.h"
#include "effect2.h"
#include "debris.h"
#include "items.h"
@ -30,7 +30,7 @@ void BubblesEffect1(short fxNum, short xVel, short yVel, short zVel)
spark->dG = spark->dB + 64;
spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 16;
spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8;
@ -84,7 +84,7 @@ void BubblesEffect2(short fxNum, short xVel, short yVel, short zVel)
spark->dG = spark->dR = (GetRandomControl() & 0x7F) + 32;
spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 16;
spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8;
@ -132,7 +132,7 @@ void BubblesEffect3(short fxNum, short xVel, short yVel, short zVel)
spark->dG = spark->dG >> 1;
spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 8;
spark->transType = 2;
spark->transType = COLADD;
spark->dynamic = -1;
spark->life = spark->sLife = (GetRandomControl() & 7) + 32;
spark->y = 0;
@ -196,7 +196,7 @@ void BubblesEffect4(short fxNum, short xVel, short yVel, short zVel)
}
spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
spark->transType = 2;
spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 16;
spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8;
@ -224,7 +224,7 @@ void BubblesEffect4(short fxNum, short xVel, short yVel, short zVel)
}
}
int BubblesShatterFunction(FX_INFO* fx, int param1, int param2)
void BubblesShatterFunction(FX_INFO* fx, int param1, int param2)
{
ShatterItem.yRot = fx->pos.yRot;
ShatterItem.meshp = Meshes[fx->frameNumber];
@ -234,8 +234,6 @@ int BubblesShatterFunction(FX_INFO* fx, int param1, int param2)
ShatterItem.bit = 0;
ShatterItem.flags = fx->flag2 & 0x400;
ShatterObject(&ShatterItem, 0, param2, fx->roomNumber, param1);
return 1;
}
void BubblesControl(short fxNum)
@ -245,17 +243,17 @@ void BubblesControl(short fxNum)
short angles[2];
phd_GetVectorAngles(
LaraItem->pos.xPos - fx->pos.xPos,
LaraItem->pos.yPos - fx->pos.yPos - 256,
LaraItem->pos.yPos - fx->pos.yPos - STEP_SIZE,
LaraItem->pos.zPos - fx->pos.zPos,
angles);
int unk1 = 0; // v44
int unk2 = 0; // v3
int maxRotation = 0;
int maxSpeed = 0;
if (fx->flag1 == 1)
{
unk1 = 512;
unk2 = 256;
maxRotation = 512;
maxSpeed = 256;
}
else
{
@ -265,16 +263,16 @@ void BubblesControl(short fxNum)
{
fx->counter--;
}
unk1 = 256;
maxRotation = 256;
}
else
{
unk1 = 768;
maxRotation = 768;
}
unk2 = 192;
maxSpeed = 192;
}
if (fx->speed < unk2)
if (fx->speed < maxSpeed)
{
if (fx->flag1 == 6)
{
@ -286,29 +284,27 @@ void BubblesControl(short fxNum)
}
int dy = angles[0] - fx->pos.yRot;
if (abs(dy) > ANGLE(180))
if (abs(dy) > ANGLE(180.0f))
{
dy = -dy;
}
int dx = angles[1] - fx->pos.xRot;
if (abs(dx) > ANGLE(180))
{
if (abs(dx) > ANGLE(180.0f))
dx = -dx;
}
dy >>= 3;
dx >>= 3;
if (dy < -unk1)
dy = -unk1;
else if (dy > unk1)
dy = unk1;
if (dy < -maxRotation)
dy = -maxRotation;
else if (dy > maxRotation)
dy = maxRotation;
if (dx < -unk1)
dx = -unk1;
else if (dx > unk1)
dx = unk1;
if (dx < -maxRotation)
dx = -maxRotation;
else if (dx > maxRotation)
dx = maxRotation;
if (fx->flag1 != 4 && (fx->flag1 != 6 || !fx->counter))
{
@ -319,9 +315,7 @@ void BubblesControl(short fxNum)
fx->pos.zRot += 16 * fx->speed;
if (fx->flag1 == 6)
{
fx->pos.zRot += 16 * fx->speed;
}
int oldX = fx->pos.xPos;
int oldY = fx->pos.yPos;
@ -344,21 +338,11 @@ void BubblesControl(short fxNum)
fx->pos.zPos = oldZ;
if (fx->flag1 != 6)
{
BubblesShatterFunction(fx, 0, -32);
}
if (fx->flag1 == 1)
{
TriggerShockwave(
(PHD_3DPOS*)&fx->pos,
32,
160,
64,
64, 128, 00,
24,
(((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
TriggerShockwave(&fx->pos, 32, 160, 64, 64, 128, 00, 24, (((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->roomNumber);
}
else
@ -436,10 +420,9 @@ void BubblesControl(short fxNum)
if (fx->flag1 == 1)
{
TriggerShockwave((PHD_3DPOS*)fx, 48, 240, 64, 64, 128, 0, 24, 0, 0);
TriggerShockwave(&fx->pos, 48, 240, 64, 64, 128, 0, 24, 0, 0);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->roomNumber);
LaraBurn();
//Lara.gassed = true; BYTE1(Lara_Flags) |= 2u;
}
else if (fx->flag1)
{
@ -447,42 +430,34 @@ void BubblesControl(short fxNum)
{
case 3:
case 4:
TriggerShockwave((PHD_3DPOS*)fx, 32, 160, 64, 128, 64, 0, 16, 0, 1);
TriggerShockwave(&fx->pos, 32, 160, 64, 128, 64, 0, 16, 0, 1);
break;
case 5:
TriggerShockwave((PHD_3DPOS*)fx, 32, 160, 64, 0, 96, 128, 16, 0, 2);
TriggerShockwave(&fx->pos, 32, 160, 64, 0, 96, 128, 16, 0, 2);
break;
case 2:
TriggerShockwave((PHD_3DPOS*)fx, 32, 160, 64, 0, 128, 128, 16, 0, 2);
TriggerShockwave(&fx->pos, 32, 160, 64, 0, 128, 128, 16, 0, 2);
break;
case 6:
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->roomNumber);
TriggerShockwave((PHD_3DPOS*)fx, 48, 240, 64, 0, 96, 128, 24, 0, 0);
TriggerShockwave(&fx->pos, 48, 240, 64, 0, 96, 128, 24, 0, 0);
fx->pos.yPos -= 128;
TriggerShockwave((PHD_3DPOS*)fx, 48, 240, 48, 0, 112, 128, 16, 0, 0);
TriggerShockwave(&fx->pos, 48, 240, 48, 0, 112, 128, 16, 0, 0);
fx->pos.yPos += 256;
TriggerShockwave((PHD_3DPOS*)fx, 48, 240, 48, 0, 112, 128, 16, 0, 0);
TriggerShockwave(&fx->pos, 48, 240, 48, 0, 112, 128, 16, 0, 0);
LaraBurn();
break;
}
}
else
{
TriggerShockwave(
(PHD_3DPOS*)fx,
24,
88,
48,
64, 128, 0, 16,
(((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
TriggerShockwave( &fx->pos, 24, 88, 48, 64, 128, 0, 16, (((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
}
}
else
{
if (roomNumber != fx->roomNumber)
{
EffectNewRoom(fxNum, roomNumber);
}
int dx = oldX - fx->pos.xPos;
int dy = oldY - fx->pos.yPos;
@ -499,14 +474,10 @@ void BubblesControl(short fxNum)
else if (fx->flag1 < 3 || fx->flag1 > 5)
{
if (fx->flag1 == 2)
{
BubblesEffect2(fxNum, 16 * dx, 16 * dy, 16 * dz);
}
else if (fx->flag1 == 6)
{
BubblesEffect3(fxNum, 16 * dx, 16 * dy, 16 * dz);
}
}
else
{
BubblesEffect4(fxNum, 16 * dx, 16 * dy, 16 * dz);

View file

@ -0,0 +1,3 @@
#pragma once
void BubblesControl(short fxNum);

View file

@ -1,5 +1,5 @@
#include "framework.h"
#include "newobjects.h"
#include "tr1_doppelganger.h"
#include "box.h"
#include "items.h"
#include "larafire.h"

View file

@ -1,5 +1,5 @@
#include "framework.h"
#include "newobjects.h"
#include "tr1_natla.h"
#include "box.h"
#include "people.h"
#include "items.h"

View file

@ -1,5 +1,5 @@
#include "framework.h"
#include "newobjects.h"
#include "tr1_natla_mutant.h"
#include "box.h"
#include "effect2.h"
#include "items.h"
@ -214,7 +214,7 @@ void NatlaEvilControl(short itemNum)
CreatureAnimation(itemNum, 0, 0);
/* Explode on death and set off heavy trigger into the bargain */
if (item->status == ITEM_DEACTIVATED)
if (item->status == ITEM_DESACTIVATED)
{
SoundEffect(171, &item->pos, NULL);
ExplodingDeath(itemNum, 0xffffffff, ABORT_PART_DAMAGE);
@ -224,6 +224,6 @@ void NatlaEvilControl(short itemNum)
TestTriggers(TriggerIndex, TRUE, 0);
KillItem(itemNum);
item->status = ITEM_DEACTIVATED;
item->status = ITEM_DESACTIVATED;
}
}

View file

@ -1,5 +1,5 @@
#include "framework.h"
#include "newobjects.h"
#include "tr1_wolf.h"
#include "items.h"
#include "box.h"
#include "effect.h"

View file

@ -322,9 +322,9 @@ void DragonControl(short backNum)
// all over
DisableBaddieAI(itemNum);
KillItem(backNum);
back->status = ITEM_DEACTIVATED;
back->status = ITEM_DESACTIVATED;
KillItem(itemNum);
item->status = ITEM_DEACTIVATED;
item->status = ITEM_DESACTIVATED;
return;
}
else if (dragon->flags < -100)

View file

@ -1,5 +1,5 @@
#pragma once
#include "types.h"
#include "items.h"
#include "collide.h"
void DragonCollision(short itemNum, ITEM_INFO* laraitem, COLL_INFO* coll);

View file

@ -232,7 +232,7 @@ void SkidManControl(short riderNum)
rider->animNumber = item->animNumber + (Objects[ID_SNOWMOBILE_DRIVER].animIndex - Objects[ID_SNOWMOBILE_GUN].animIndex);
rider->frameNumber = item->frameNumber + (Anims[rider->animNumber].frameBase - Anims[item->animNumber].frameBase);
}
else if (rider->status == ITEM_DEACTIVATED && item->speed == 0 && item->fallspeed == 0)
else if (rider->status == ITEM_DESACTIVATED && item->speed == 0 && item->fallspeed == 0)
{
/* If rider has reached end of his death animation, turn his skidoo into one that Lara can ride */
RemoveActiveItem(riderNum);
@ -242,7 +242,7 @@ void SkidManControl(short riderNum)
DisableBaddieAI(item_number);
item->objectNumber = ID_SNOWMOBILE;
item->status = ITEM_DEACTIVATED;
item->status = ITEM_DESACTIVATED;
InitialiseSkidoo(item_number);
((SKIDOO_INFO*)item->data)->armed = true;

View file

@ -1,5 +1,5 @@
#pragma once
#include "types.h"
#include "items.h"
#include "collide.h"
void InitialiseSkidman(short itemNum);

View file

@ -47,7 +47,7 @@ void InitialiseSpearGuardian(short itemNum)
item->frameNumber = anim->frameBase;
item->currentAnimState = anim->currentAnimState;
//item->status = ITEM_INACTIVE;
//item->status = ITEM_NOT_ACTIVE;
//item->meshBits = 0;
}
@ -82,7 +82,7 @@ void SpearGuardianControl(short itemNum)
item->objectNumber = ID_SPEAR_GUARDIAN;
DisableBaddieAI(itemNum);
KillItem(itemNum);
item->status = ITEM_DEACTIVATED;
item->status = ITEM_DESACTIVATED;
item->flags |= ONESHOT;
*/
}

View file

@ -21,7 +21,7 @@ void InitialiseSwordGuardian(short itemNum)
ClearItem(itemNum);
//item->status = ITEM_INACTIVE;
//item->status = ITEM_NOT_ACTIVE;
//item->meshBits = 0;
}
@ -66,7 +66,7 @@ void SwordGuardianControl(short itemNum)
//item->objectNumber = ID_SWAT;
DisableBaddieAI(itemNum);
KillItem(itemNum);
//item->status = ITEM_DEACTIVATED;
//item->status = ITEM_DESACTIVATED;
//item->flags |= ONESHOT;
item->currentAnimState = 12;
@ -80,7 +80,7 @@ void SwordGuardianControl(short itemNum)
item->objectNumber = ID_SWAT;
DisableBaddieAI(itemNum);
KillItem(itemNum);
item->status = ITEM_DEACTIVATED;
item->status = ITEM_DESACTIVATED;
item->flags |= ONESHOT;
}
*/

View file

@ -1,5 +1,5 @@
#pragma once
#include "types.h"
#include "items.h"
#include "collide.h"
void InitialiseBoat(short itemNum);

View file

@ -196,7 +196,7 @@ static void SkidooExplode(ITEM_INFO* skidoo)
ExplodingDeath(Lara.Vehicle, -1, 256);
KillItem(Lara.Vehicle);
skidoo->status = ITEM_DEACTIVATED;
skidoo->status = ITEM_DESACTIVATED;
SoundEffect(SFX_EXPLOSION1, 0, 0);
SoundEffect(SFX_EXPLOSION2, 0, 0);
Lara.Vehicle = NO_ITEM;

View file

@ -1,5 +1,5 @@
#pragma once
#include "types.h"
#include "items.h"
#include "collide.h"
typedef struct SKIDOO_INFO

View file

@ -1,5 +1,5 @@
#pragma once
#include "types.h"
#include "items.h"
void SetupShoal(int shoalNumber);
void ControlFish(short itemNumber);

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