(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 #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_NULL = -1, // default zone
ZONE_SKELLY = 0, ZONE_SKELLY = 0,
@ -19,7 +36,7 @@ enum ZoneTypeEnum
ZONE_APE, // only 2 click climb ZONE_APE, // only 2 click climb
}; };
struct BOX_NODE typedef struct BOX_NODE
{ {
short exitBox; short exitBox;
unsigned short searchNumber; unsigned short searchNumber;
@ -27,7 +44,7 @@ struct BOX_NODE
short boxNumber; short boxNumber;
}; };
struct BOX_INFO typedef struct BOX_INFO
{ {
unsigned char left; unsigned char left;
unsigned char right; unsigned char right;
@ -37,7 +54,7 @@ struct BOX_INFO
short overlapIndex; short overlapIndex;
}; };
struct AI_INFO typedef struct AI_INFO
{ {
short zoneNumber; short zoneNumber;
short enemyZone; short enemyZone;
@ -49,7 +66,7 @@ struct AI_INFO
short enemyFacing; short enemyFacing;
}; };
struct BITE_INFO typedef struct BITE_INFO
{ {
int x; int x;
int y; int y;
@ -57,7 +74,7 @@ struct BITE_INFO
int meshNum; int meshNum;
}; };
struct LOT_INFO typedef struct LOT_INFO
{ {
BOX_NODE* node; BOX_NODE* node;
short head; short head;
@ -76,10 +93,10 @@ struct LOT_INFO
bool isJumping; bool isJumping;
bool isMonkeying; bool isMonkeying;
PHD_VECTOR target; PHD_VECTOR target;
ZoneTypeEnum zone; ZONE_TYPE zone;
}; };
struct CREATURE_INFO typedef struct CREATURE_INFO
{ {
short jointRotation[4]; short jointRotation[4];
short maximumTurn; short maximumTurn;
@ -101,14 +118,59 @@ struct CREATURE_INFO
LOT_INFO LOT; 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 int NumberBoxes;
extern BOX_INFO* Boxes; extern BOX_INFO* Boxes;
extern int NumberOverlaps; extern int NumberOverlaps;
extern short* Overlaps; extern short* Overlaps;
extern short* Zones[ZONE_MAX][2]; 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 GetCreatureMood(ITEM_INFO* item, AI_INFO* info, int violent);
void CreatureMood(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); void FindAITargetObject(CREATURE_INFO* creature, short objectNumber);

View file

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

View file

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

View file

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

View file

@ -1,7 +1,53 @@
#pragma once #pragma once
#include "phd_global.h"
#include "items.h"
#include "global.h" typedef enum CAMERA_TYPE
#include <d3d9.h> {
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 PHD_VECTOR CurrentCameraPosition;
extern CAMERA_INFO Camera; extern CAMERA_INFO Camera;

View file

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

View file

@ -1,11 +1,22 @@
#pragma once #pragma once
#include "global.h" #include "phd_global.h"
#include "level.h"
// used by coll->badPos // used by coll->badPos
#define NO_BAD_POS (-NO_HEIGHT) #define NO_BAD_POS (-NO_HEIGHT)
// used by coll->badNeg // used by coll->badNeg
#define NO_BAD_NEG NO_HEIGHT #define NO_BAD_NEG NO_HEIGHT
struct BOUNDING_BOX
{
short X1;
short X2;
short Y1;
short Y2;
short Z1;
short Z2;
};
struct COLL_FLOOR struct COLL_FLOOR
{ {
int floor; int floor;
@ -87,8 +98,9 @@ struct COLL_INFO
}; };
extern BOUNDING_BOX GlobalCollisionBounds; extern BOUNDING_BOX GlobalCollisionBounds;
extern ITEM_INFO* CollidedItems[1024]; constexpr auto MAX_ITEMS = 1024;
extern MESH_INFO* CollidedMeshes[1024]; extern ITEM_INFO* CollidedItems[MAX_ITEMS];
extern MESH_INFO* CollidedMeshes[MAX_ITEMS];
void GenericSphereBoxCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll); 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); 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 "framework.h"
#include "collide.h" #include "collide.h"
#include "control.h" #include "control.h"
#include "global.h"
#include "pickup.h" #include "pickup.h"
#include "camera.h" #include "camera.h"
#include "Lara.h" #include "Lara.h"
@ -111,7 +111,7 @@ int InitialiseGame;
int RequiredStartPos; int RequiredStartPos;
int WeaponDelay; int WeaponDelay;
int WeaponEnemyTimer; int WeaponEnemyTimer;
int HeightType; HEIGHT_TYPES HeightType;
int HeavyTriggered; int HeavyTriggered;
short SkyPos1; short SkyPos1;
short SkyPos2; short SkyPos2;
@ -1016,7 +1016,7 @@ void TestTriggers(short* data, int heavy, int HeavyFlags)
if (item->active && Objects[item->objectNumber].intelligent) if (item->active && Objects[item->objectNumber].intelligent)
{ {
item->hitPoints = -16384; item->hitPoints = NOT_TARGETABLE;
DisableBaddieAI(value); DisableBaddieAI(value);
KillItem(value); KillItem(value);
} }
@ -1037,7 +1037,7 @@ void TestTriggers(short* data, int heavy, int HeavyFlags)
{ {
if (Objects[item->objectNumber].intelligent) if (Objects[item->objectNumber].intelligent)
{ {
if (item->status != ITEM_INACTIVE) if (item->status != ITEM_NOT_ACTIVE)
{ {
if (item->status == ITEM_INVISIBLE) if (item->status == ITEM_INVISIBLE)
{ {
@ -2134,7 +2134,6 @@ int GetTargetOnLOS(GAME_VECTOR* src, GAME_VECTOR* dest, int DrawTarget, int firi
flag = 0; flag = 0;
itemNumber = ObjectOnLOS2(src, dest, &vector, &mesh); itemNumber = ObjectOnLOS2(src, dest, &vector, &mesh);
if (itemNumber != 999) if (itemNumber != 999)
{ {
target.x = vector.x - (vector.x - src->x >> 5); 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); AddActiveItem(itemNumber);
item->status = ITEM_ACTIVE; item->status = ITEM_ACTIVE;
@ -2384,7 +2383,7 @@ int ObjectOnLOS2(GAME_VECTOR* start, GAME_VECTOR* end, PHD_VECTOR* vec, MESH_INF
{ {
item = &Items[linknum]; item = &Items[linknum];
if (item->status != ITEM_DEACTIVATED if (item->status != ITEM_DESACTIVATED
&& item->status != ITEM_INVISIBLE && item->status != ITEM_INVISIBLE
&& (item->objectNumber != ID_LARA && Objects[item->objectNumber].collision != NULL && (item->objectNumber != ID_LARA && Objects[item->objectNumber].collision != NULL
|| item->objectNumber == ID_LARA && GetLaraOnLOS)) || item->objectNumber == ID_LARA && GetLaraOnLOS))
@ -2777,7 +2776,7 @@ void AnimateItem(ITEM_INFO* item)
case COMMAND_DEACTIVATE: case COMMAND_DEACTIVATE:
if (Objects[item->objectNumber].intelligent && !item->afterDeath) if (Objects[item->objectNumber].intelligent && !item->afterDeath)
item->afterDeath = 1; item->afterDeath = 1;
item->status = ITEM_DEACTIVATED; item->status = ITEM_DESACTIVATED;
break; break;
case COMMAND_SOUND_FX: case COMMAND_SOUND_FX:
case COMMAND_EFFECT: case COMMAND_EFFECT:
@ -2979,10 +2978,7 @@ void RemoveRoomFlipItems(ROOM_INFO* r)
{ {
ITEM_INFO* item = &Items[linkNum]; ITEM_INFO* item = &Items[linkNum];
if (item->flags & 0x100 if (item->flags & 0x100 && Objects[item->objectNumber].intelligent && item->hitPoints <= 0 && item->hitPoints != NOT_TARGETABLE)
&& Objects[item->objectNumber].intelligent
&& item->hitPoints <= 0
&& item->hitPoints != -16384)
{ {
KillItem(linkNum); KillItem(linkNum);
} }

View file

@ -1,13 +1,69 @@
#pragma once #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 int KeyTriggerActive;
extern byte IsAtmospherePlaying; extern byte IsAtmospherePlaying;
extern byte FlipStatus; extern byte FlipStatus;
constexpr auto MAX_FLIPMAP = 255;
extern int FlipStats[MAX_FLIPMAP]; extern int FlipStats[MAX_FLIPMAP];
extern int FlipMap[MAX_FLIPMAP]; extern int FlipMap[MAX_FLIPMAP];
extern bool InItemControlLoop; extern bool InItemControlLoop;
extern short ItemNewRoomNo; extern short ItemNewRoomNo;
extern short ItemNewRooms[512]; extern short ItemNewRooms[512];
@ -41,7 +97,7 @@ extern int InitialiseGame;
extern int RequiredStartPos; extern int RequiredStartPos;
extern int WeaponDelay; extern int WeaponDelay;
extern int WeaponEnemyTimer; extern int WeaponEnemyTimer;
extern int HeightType; extern HEIGHT_TYPES HeightType;
extern int HeavyTriggered; extern int HeavyTriggered;
extern short SkyPos1; extern short SkyPos1;
extern short SkyPos2; extern short SkyPos2;

View file

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

View file

@ -1,18 +1,50 @@
#pragma once #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 impactDirection;
Vector3 impactLocation; Vector3 impactLocation;
}; };
struct DebrisMesh { typedef struct DebrisMesh
{
RENDERER_BUCKETS bucket; RENDERER_BUCKETS bucket;
array<RendererVertex, 3> vertices; array<RendererVertex, 3> vertices;
}; };
struct DebrisFragment { typedef struct DebrisFragment
{
DebrisMesh mesh; DebrisMesh mesh;
Quaternion rotation; Quaternion rotation;
Vector3 angularVelocity; Vector3 angularVelocity;
@ -29,6 +61,29 @@ struct DebrisFragment {
bool active; 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 SHATTER_ITEM ShatterItem;
extern vector<DebrisFragment> DebrisFragments; extern vector<DebrisFragment> DebrisFragments;
extern ShatterImpactInfo ShatterImpactData; 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 "level.h"
#include "input.h" #include "input.h"
#include "sound.h" #include "sound.h"
#include "trmath.h"
PHD_VECTOR DoubleDoorPos = { 0, 0, 220 }; PHD_VECTOR DoubleDoorPos(0, 0, 220);
PHD_VECTOR PullDoorPos = { -201, 0, 322 }; PHD_VECTOR PullDoorPos(-201, 0, 322);
PHD_VECTOR PushDoorPos = { 201, 0, -702 }; PHD_VECTOR PushDoorPos(201, 0, -702);
PHD_VECTOR KickDoorPos = { 0, 0, -917 }; PHD_VECTOR KickDoorPos(0, 0, -917);
PHD_VECTOR UnderwaterDoorPos = { -251, -540, -46 }; PHD_VECTOR UnderwaterDoorPos(-251, -540, -46);
PHD_VECTOR CrowbarDoorPos = { -412, 0, 256 }; PHD_VECTOR CrowbarDoorPos(-412, 0, 256);
static short PushPullKickDoorBounds[12] = static short PushPullKickDoorBounds[12] =
{ {
@ -109,7 +110,7 @@ void UnderwaterDoorCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
&& !Lara.gunStatus && !Lara.gunStatus
|| Lara.isMoving && Lara.generalPtr == (void*)itemNum) || Lara.isMoving && Lara.generalPtr == (void*)itemNum)
{ {
l->pos.yRot ^= ANGLE(180); l->pos.yRot ^= ANGLE(180.0f);
if (TestLaraPosition(UnderwaterDoorBounds, item, l)) if (TestLaraPosition(UnderwaterDoorBounds, item, l))
{ {
@ -330,7 +331,7 @@ void DoorCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
ITEM_INFO* item = &Items[itemNum]; ITEM_INFO* item = &Items[itemNum];
if (item->triggerFlags == 2 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) && ((TrInput & IN_ACTION || g_Inventory->GetSelectedObject() == ID_CROWBAR_ITEM)
&& l->currentAnimState == STATE_LARA_STOP && l->currentAnimState == STATE_LARA_STOP
&& l->animNumber == ANIMATION_LARA_STAY_IDLE && l->animNumber == ANIMATION_LARA_STAY_IDLE

View file

@ -1,6 +1,32 @@
#pragma once #pragma once
#include "global.h" #include "items.h"
#include "collide.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 SequenceDoorControl(short itemNumber);
void UnderwaterDoorCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll); void UnderwaterDoorCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll);

View file

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

View file

@ -1,9 +1,20 @@
#pragma once #pragma once
#include "global.h"
#include "box.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 BITE_INFO EnemyBites[9];
extern int LightningCount; extern int LightningCount;
extern int LightningRand; extern int LightningRand;

View file

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

View file

@ -1,7 +1,21 @@
#pragma once #pragma once
#include "global.h"
#include "control.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; extern FX_INFO* Effects;
int ItemNearLara(PHD_3DPOS* pos, int radius); int ItemNearLara(PHD_3DPOS* pos, int radius);

View file

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

View file

@ -1,14 +1,63 @@
#pragma once #pragma once
#include <d3d11.h> #include "phd_global.h"
#include "global.h" #include "items.h"
#define MAX_NODE 23 enum RIPPLE_TYPE
#define RIPPLE_FLAG_BLOOD 0x80 {
#define RIPPLE_FLAG_RAND_POS 0x40 RIPPLE_FLAG_NONE = 0x0,
#define RIPPLE_FLAG_RAND_ROT 0x20 RIPPLE_FLAG_SHORT_LIFE = 0x1,
#define RIPPLE_FLAG_SHORT_LIFE 0x01 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 currentColor;
Vector4 initialColor; Vector4 initialColor;
@ -24,27 +73,120 @@ struct RIPPLE_STRUCT
bool isBillboard; //used for Blood 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 x;
float y; float y;
float z; float z;
float splashPower; float innerRad;
float innerRadius; 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 int DeadlyBounds[6];
extern SPARKS Sparks[1024];
extern SP_DYNAMIC SparkDynamics[8];
extern SPLASH_SETUP SplashSetup; 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 SmokeWeapon;
extern int SmokeCountL; extern byte SmokeCountL;
extern int SmokeCountR; extern byte SmokeCountR;
extern int SplashCount;
extern PHD_VECTOR NodeVectors[MAX_NODE]; extern PHD_VECTOR NodeVectors[MAX_NODE];
extern NODEOFFSET_INFO NodeOffsets[MAX_NODE]; extern NODEOFFSET_INFO NodeOffsets[MAX_NODE];
void DetatchSpark(int num, int type); void DetatchSpark(int num, SpriteEnumFlag type);
int GetFreeSpark(); int GetFreeSpark();
void UpdateSparks(); void UpdateSparks();
void TriggerRicochetSpark(GAME_VECTOR* pos, short angle, int num, int unk); void TriggerRicochetSpark(GAME_VECTOR* pos, short angle, int num, int unk);

View file

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

View file

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

View file

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

View file

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

View file

@ -15,6 +15,24 @@ typedef struct SavegameInfo
#define MAX_SAVEGAMES 16 #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 SavegameInfo g_SavegameInfos[MAX_SAVEGAMES];
extern vector<string> g_NewStrings; extern vector<string> g_NewStrings;
extern SaveGameHeader g_NewSavegameInfos[MAX_SAVEGAMES]; extern SaveGameHeader g_NewSavegameInfos[MAX_SAVEGAMES];

View file

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

View file

@ -1,7 +1,18 @@
#pragma once #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 InitialiseHair();
void HairControl(int cutscene, int ponytail, short* framePtr); void HairControl(int cutscene, int ponytail, short* framePtr);

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
#include "framework.h" #include "framework.h"
#include "global.h"
#include "items.h" #include "items.h"
#include "constants.h"
#include "effect2.h" #include "effect2.h"
#include "setup.h" #include "setup.h"
#include "level.h" #include "level.h"
@ -30,7 +30,7 @@ void KillItem(short itemNum)
{ {
ITEM_INFO* item = &Items[itemNum]; ITEM_INFO* item = &Items[itemNum];
DetatchSpark(itemNum, 128); DetatchSpark(itemNum, SP_ITEM);
item->active = false; item->active = false;
item->reallyActive = 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) if (Rooms[item->roomNumber].itemNumber == itemNum)
{ {
@ -99,7 +99,7 @@ void RemoveAllItemsInRoom(short roomNumber, short objectNumber)
if (item->objectNumber == objectNumber) if (item->objectNumber == objectNumber)
{ {
RemoveActiveItem(currentItemNum); RemoveActiveItem(currentItemNum);
item->status = ITEM_INACTIVE; item->status = ITEM_NOT_ACTIVE;
item->flags &= 0xC1; item->flags &= 0xC1;
} }
@ -115,7 +115,7 @@ void AddActiveItem(short itemNumber)
if (Objects[item->objectNumber].control == NULL) if (Objects[item->objectNumber].control == NULL)
{ {
item->status = ITEM_INACTIVE; item->status = ITEM_NOT_ACTIVE;
return; return;
} }
@ -355,7 +355,7 @@ void InitialiseItem(short itemNum)
item->itemFlags[0] = 0; item->itemFlags[0] = 0;
item->active = false; item->active = false;
item->status = ITEM_INACTIVE; item->status = ITEM_NOT_ACTIVE;
item->gravityStatus = false; item->gravityStatus = false;
item->hitStatus = false; item->hitStatus = false;
item->collidable = true; item->collidable = true;
@ -467,7 +467,7 @@ short SpawnItem(ITEM_INFO* item, short objectNumber)
InitialiseItem(itemNumber); InitialiseItem(itemNumber);
spawn->status = ITEM_INACTIVE; spawn->status = ITEM_NOT_ACTIVE;
spawn->shade = 0x4210; spawn->shade = 0x4210;
} }
@ -495,11 +495,11 @@ int GlobalItemReplace(short search, short replace)
ITEM_INFO* find_a_fucking_item(short objectNum) ITEM_INFO* find_a_fucking_item(short objectNum)
{ {
int itemNumber = FindItem(objectNum); int itemNumber = FindItemNumber(objectNum);
return (itemNumber != NO_ITEM ? &Items[itemNumber] : NULL); return (itemNumber != NO_ITEM ? &Items[itemNumber] : NULL);
} }
int FindItem(short objectNum) int FindItemNumber(short objectNum)
{ {
for (int i = 0; i < LevelItems; i++) for (int i = 0; i < LevelItems; i++)
{ {
@ -510,3 +510,21 @@ int FindItem(short objectNum)
return NO_ITEM; 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 #pragma once
#include "global.h" #include "phd_global.h"
#include "control.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_ITEMS 1024
#define NUM_EFFECTS 1024 #define NUM_EFFECTS 1024
@ -20,4 +102,5 @@ void InitialiseItem(short itemNum);
void InitialiseItemArray(int numitems); void InitialiseItemArray(int numitems);
void KillItem(short itemNum); void KillItem(short itemNum);
ITEM_INFO* find_a_fucking_item(short objectNum); 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 "laraclmb.h"
#include "rope.h" #include "rope.h"
#include "health.h" #include "health.h"
#include "newobjects.h"
#include "level.h" #include "level.h"
#include "input.h" #include "input.h"
#include "sound.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]) if (p->itemFlags[2])
{ {
p->itemFlags[2] = 0; p->itemFlags[2] = 0;
p->status = ITEM_DEACTIVATED; p->status = ITEM_DESACTIVATED;
} }
} }
else else
{ {
if (!p->itemFlags[1]) if (!p->itemFlags[1])
p->status = ITEM_DEACTIVATED; p->status = ITEM_DESACTIVATED;
p->itemFlags[2] = 1; p->itemFlags[2] = 1;

View file

@ -1,13 +1,758 @@
#pragma once #pragma once
#include "global.h" #include "trmath.h"
#include "box.h" #include "box.h"
#include "collide.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 typedef struct CarriedWeaponInfo
{ {
bool Present; bool Present;
short Ammo[3]; short Ammo[MAX_AMMOTYPE];
byte SelectedAmmo; int SelectedAmmo; // WeaponAmmoType_enum
bool HasLasersight; bool HasLasersight;
bool HasSilencer; bool HasSilencer;
}; };
@ -17,21 +762,33 @@ typedef struct DiaryInfo
bool Present; bool Present;
}; };
struct WaterskinInfo typedef struct WaterskinInfo
{ {
bool Present; bool Present;
int Quantity; 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 itemNumber;
short gunStatus; short gunStatus; // LG_enum
short gunType; short gunType; // WEAPON_enum
short requestGunType; short requestGunType; // WEAPON_enum
short lastGunType; short lastGunType; // WEAPON_enum
short calcFallSpeed; short calcFallSpeed;
short waterStatus; short waterStatus; // LW_enum
short climbStatus; short climbStatus;
short poseCount; short poseCount;
short hitFrame; short hitFrame;
@ -150,10 +907,28 @@ struct LaraInfo
int NumFlares; 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 LaraInfo Lara;
extern ITEM_INFO* LaraItem; extern ITEM_INFO* LaraItem;
extern byte LaraNodeUnderwater[NUM_LARA_MESHES]; 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) #define LaraRoutineFunction void(ITEM_INFO* item, COLL_INFO* coll)
extern function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1]; extern function<LaraRoutineFunction> lara_control_routines[NUM_LARA_STATES + 1];
extern function<LaraRoutineFunction> lara_collision_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 "framework.h"
#include "lara1gun.h" #include "lara1gun.h"
#include "global.h"
#include "items.h" #include "items.h"
#include "Lara.h" #include "Lara.h"
#include "larafire.h" #include "larafire.h"
@ -57,7 +57,7 @@ void FireHarpoon()
pos.z = dxPos.z = 77; pos.z = dxPos.z = 77;
g_Renderer->GetLaraBonePosition(&dxPos, LM_RHAND); 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.xPos = pos.x = dxPos.x;
item->pos.yPos = pos.y = dxPos.y; 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) void ControlGrenade(short itemNumber)
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
@ -523,7 +532,7 @@ void ControlGrenade(short itemNumber)
int ceiling; int ceiling;
short roomNumber; short roomNumber;
if (item->itemFlags[0] == WEAPON_AMMO4) if (item->itemFlags[0] == GRENADE_ULTRA)
{ {
roomNumber = item->roomNumber; roomNumber = item->roomNumber;
@ -574,7 +583,7 @@ void ControlGrenade(short itemNumber)
item->hitPoints = 1;*/ 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); GrenadeLauncherSpecialEffect1(item->pos.xPos, item->pos.yPos, item->pos.zPos, -1, 1);
// Time to explode? // 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; int n = 0;
bool foundCollidedObjects = false; bool foundCollidedObjects = false;
@ -615,7 +624,7 @@ void ControlGrenade(short itemNumber)
foundCollidedObjects = true; foundCollidedObjects = true;
if (item->itemFlags[0] != WEAPON_AMMO3 || explode) if (item->itemFlags[0] != GRENADE_FLASH || explode)
{ {
if (CollidedItems[0]) if (CollidedItems[0])
{ {
@ -723,9 +732,9 @@ void ControlGrenade(short itemNumber)
} while (n < 2); } 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 = 32;
FlashFadeR = 255; FlashFadeR = 255;
@ -761,10 +770,10 @@ void ControlGrenade(short itemNumber)
SoundEffect(105, &item->pos, PITCH_SHIFT | 0x1800000); SoundEffect(105, &item->pos, PITCH_SHIFT | 0x1800000);
SoundEffect(106, &item->pos, 0); 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->meshBits = 0;
item->itemFlags[1] = (item->itemFlags[0] != WEAPON_AMMO2 ? 16 : 4); item->itemFlags[1] = (item->itemFlags[0] != GRENADE_SUPER ? 16 : 4);
return; return;
} }
@ -1062,6 +1071,13 @@ void AnimateShotgun(int weaponType)
Lara.leftArm.animNumber = Lara.rightArm.animNumber = item->animNumber; Lara.leftArm.animNumber = Lara.rightArm.animNumber = item->animNumber;
} }
enum CROSSBOW_TYPE
{
CROSSBOW_NORMAL,
CROSSBOW_POISON,
CROSSBOW_EXPLODE
};
void ControlCrossbowBolt(short itemNumber) void ControlCrossbowBolt(short itemNumber)
{ {
ITEM_INFO* item = &Items[itemNumber]; ITEM_INFO* item = &Items[itemNumber];
@ -1079,7 +1095,7 @@ void ControlCrossbowBolt(short itemNumber)
if (item->speed > 64) if (item->speed > 64)
item->speed -= (item->speed >> 4); item->speed -= (item->speed >> 4);
if (GlobalCounter & 1) 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 else
{ {
@ -1102,16 +1118,18 @@ void ControlCrossbowBolt(short itemNumber)
item->pos.zPos = oldZ; item->pos.zPos = oldZ;
// If ammos are normal, then just shatter the bolt and quit // 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); KillItem(itemNumber);
return; return;
} }
else
{
// Otherwise, bolt must explode // Otherwise, bolt must explode
explode = true; explode = true;
} }
}
// Has bolt changed room? // Has bolt changed room?
if (item->roomNumber != roomNumber) if (item->roomNumber != roomNumber)
@ -1139,7 +1157,7 @@ void ControlCrossbowBolt(short itemNumber)
foundCollidedObjects = true; foundCollidedObjects = true;
if (item->itemFlags[0] != WEAPON_AMMO3 || explode) if (item->itemFlags[0] != CROSSBOW_EXPLODE || explode)
{ {
if (CollidedItems[0]) if (CollidedItems[0])
{ {
@ -1154,16 +1172,14 @@ void ControlCrossbowBolt(short itemNumber)
if (item->objectNumber < ID_SMASH_OBJECT1 || item->objectNumber > ID_SMASH_OBJECT8) if (item->objectNumber < ID_SMASH_OBJECT1 || item->objectNumber > ID_SMASH_OBJECT8)
{ {
if (currentItem->objectNumber == ID_SHOOT_SWITCH1 || currentItem->objectNumber == ID_SHOOT_SWITCH2) 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) else if (Objects[item->objectNumber].hitEffect)
DoGrenadeDamageOnBaddie(currentItem, item); DoGrenadeDamageOnBaddie(currentItem, item);
} }
else else
{ {
TriggerExplosionSparks(currentItem->pos.xPos, currentItem->pos.yPos, currentItem->pos.zPos, 3, -2, 0, currentItem->roomNumber); TriggerExplosionSparks(currentItem->pos.xPos, currentItem->pos.yPos, currentItem->pos.zPos, 3, -2, 0, currentItem->roomNumber);
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);
TriggerShockwave(&currentItem->pos, 48, 304, 96, 0, 96, 128, 24, 0, 0);
currentItem->pos.yPos += 128;
ExplodeItemNode(currentItem, 0, 0, 128); ExplodeItemNode(currentItem, 0, 0, 128);
short currentItemNumber = (currentItem - CollidedItems[0]); short currentItemNumber = (currentItem - CollidedItems[0]);
SmashObject(currentItemNumber); SmashObject(currentItemNumber);
@ -1173,14 +1189,14 @@ void ControlCrossbowBolt(short itemNumber)
else if (currentItem->objectNumber == ID_SHOOT_SWITCH1 || currentItem->objectNumber == ID_SHOOT_SWITCH2) else if (currentItem->objectNumber == ID_SHOOT_SWITCH1 || currentItem->objectNumber == ID_SHOOT_SWITCH2)
{ {
// Special case for ID_SWITCH_TYPE7 and ID_SWITCH_TYPE8 // Special case for ID_SWITCH_TYPE7 and ID_SWITCH_TYPE8
CrossbowHitSwitchType78(item, currentItem, 1); DoCrossbowDamage(item, currentItem, 1);
} }
else if (Objects[currentItem->objectNumber].hitEffect) 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 // 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; item->poisoned = true;
} }
@ -1197,16 +1213,14 @@ void ControlCrossbowBolt(short itemNumber)
do do
{ {
if (currentMesh->staticNumber >= 50 && currentMesh->staticNumber < 58) if (currentMesh->staticNumber >= 50 && currentMesh->staticNumber < 58) // SHATTER
{ {
if (explode) if (explode)
{ {
TriggerExplosionSparks(currentMesh->x, currentMesh->y, currentMesh->z, 3, -2, 0, item->roomNumber); TriggerExplosionSparks(currentMesh->x, currentMesh->y, currentMesh->z, 3, -2, 0, item->roomNumber);
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);
TriggerShockwave((PHD_3DPOS*)&currentMesh, 40, 176, 64, 0, 96, 128, 16, 0, 0);
currentMesh->y += 128;
} }
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; SmashedMeshRoom[SmashedMeshCount] = item->roomNumber;
SmashedMesh[SmashedMeshCount] = currentMesh; SmashedMesh[SmashedMeshCount] = currentMesh;
SmashedMeshCount++; SmashedMeshCount++;
@ -1231,16 +1245,17 @@ void ControlCrossbowBolt(short itemNumber)
{ {
if (foundCollidedObjects) if (foundCollidedObjects)
{ {
ExplodeItemNode(item, 0, 0, 256); ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL);
KillItem(itemNumber); KillItem(itemNumber);
} }
return; return;
} }
// At this point, for sure bolt must explode // At this point, for sure bolt must explode
if (Rooms[item->roomNumber].flags & ENV_FLAG_WATER) if (Rooms[item->roomNumber].flags & ENV_FLAG_WATER)
{
TriggerUnderwaterExplosion(item); TriggerUnderwaterExplosion(item);
}
else else
{ {
TriggerShockwave(&item->pos, 48, 304, 96, 0, 96, 128, 24, 0, 0); TriggerShockwave(&item->pos, 48, 304, 96, 0, 96, 128, 24, 0, 0);
@ -1252,12 +1267,12 @@ void ControlCrossbowBolt(short itemNumber)
AlertNearbyGuards(item); AlertNearbyGuards(item);
SoundEffect(105, &item->pos, PITCH_SHIFT | 0x1800000); SoundEffect(SFX_EXPLOSION1, &item->pos, PITCH_SHIFT | 0x1800000);
SoundEffect(106, &item->pos, 0); SoundEffect(SFX_EXPLOSION2, &item->pos, 0);
if (foundCollidedObjects || explode) if (foundCollidedObjects || explode)
{ {
ExplodeItemNode(item, 0, 0, 256); ExplodeItemNode(item, 0, 0, EXPLODE_NORMAL);
KillItem(itemNumber); KillItem(itemNumber);
} }
@ -1476,12 +1491,12 @@ void undraw_shotgun(int weapon)
AnimateItem(item); AnimateItem(item);
if (item->status == ITEM_DEACTIVATED) if (item->status == ITEM_DESACTIVATED)
{ {
Lara.gunStatus = LG_NO_ARMS; Lara.gunStatus = LG_NO_ARMS;
Lara.target = NULL; Lara.target = NULL;
Lara.rightArm.lock = 0; Lara.rightArm.lock = false;
Lara.leftArm.lock = 0; Lara.leftArm.lock = false;
KillItem(Lara.weaponItem); KillItem(Lara.weaponItem);
@ -1514,7 +1529,7 @@ void draw_shotgun_meshes(int weaponType)
LARA_MESHES(WeaponObjectMesh(weaponType), LM_RHAND); 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; /*v4 = item2;
if (!(item2->flags & 0x40)) if (!(item2->flags & 0x40))
@ -1674,10 +1689,10 @@ void FireShotgun()
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
loopAngles[0] = angles[0] + value * (GetRandomControl() - ANGLE(90)) / 0x10000; loopAngles[0] = angles[0] + value * (GetRandomControl() - 0x4000) / 0x10000;
loopAngles[1] = angles[1] + value * (GetRandomControl() - ANGLE(90)) / 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; fired = true;
} }
@ -1706,12 +1721,10 @@ void FireShotgun()
SmokeCountL = 32; SmokeCountL = 32;
SmokeWeapon = WEAPON_SHOTGUN; SmokeWeapon = WEAPON_SHOTGUN;
if (LaraItem->meshBits) if (LaraItem->meshBits != 0)
{ {
for (int i = 0; i < 7; i++) 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, SmokeCountL);
TriggerGunSmoke(pos2.x, pos2.y, pos2.z, pos.x - pos2.x, pos.y - pos2.y, pos.z - pos2.z, 1, SmokeWeapon, 32);
}
} }
Lara.rightArm.flash_gun = Weapons[WEAPON_SHOTGUN].flashTime; Lara.rightArm.flash_gun = Weapons[WEAPON_SHOTGUN].flashTime;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,7 +1,28 @@
#pragma once #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]; extern WEAPON_INFO Weapons[NUM_WEAPONS];
void SmashItem(short itemNum); void SmashItem(short itemNum);
@ -12,9 +33,9 @@ void InitialiseNewWeapon();
int WeaponObjectMesh(int weaponType); int WeaponObjectMesh(int weaponType);
void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm); void AimWeapon(WEAPON_INFO* winfo, LARA_ARM* arm);
void HitTarget(ITEM_INFO* item, GAME_VECTOR* hitPos, int damage, int flag); 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 find_target_point(ITEM_INFO* item, GAME_VECTOR* target);
void LaraTargetInfo(WEAPON_INFO* weapon); void LaraTargetInfo(WEAPON_INFO* weapon);
int CheckForHoldingState(int state); bool CheckForHoldingState(int state);
void LaraGetNewTarget(WEAPON_INFO* winfo); void LaraGetNewTarget(WEAPON_INFO* winfo);
void DoProperDetection(short itemNumber, int x, int y, int z, int xv, int yv, int zv); 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.zRot = 0;
Lara.rightArm.yRot = 0; Lara.rightArm.yRot = 0;
Lara.rightArm.xRot = 0; Lara.rightArm.xRot = 0;
Lara.rightArm.lock = 0; Lara.rightArm.lock = false;
Lara.leftArm.lock = 0; Lara.leftArm.lock = false;
Lara.target = NULL; Lara.target = NULL;
} }
@ -138,8 +138,8 @@ void undraw_flare() // (F) (D)
InitialiseNewWeapon(); InitialiseNewWeapon();
Lara.target = NULL; Lara.target = NULL;
Lara.rightArm.lock = 0; Lara.rightArm.lock = false;
Lara.leftArm.lock = 0; Lara.leftArm.lock = false;
LaraItem->animNumber = ANIMATION_LARA_STAY_SOLID; LaraItem->animNumber = ANIMATION_LARA_STAY_SOLID;
Lara.flareFrame = Anims[LaraItem->animNumber].frameBase; Lara.flareFrame = Anims[LaraItem->animNumber].frameBase;
LaraItem->frameNumber = Anims[LaraItem->animNumber].frameBase; LaraItem->frameNumber = Anims[LaraItem->animNumber].frameBase;
@ -196,8 +196,8 @@ void undraw_flare() // (F) (D)
Lara.flareControlLeft = false; Lara.flareControlLeft = false;
Lara.target = NULL; Lara.target = NULL;
Lara.rightArm.lock = 0; Lara.rightArm.lock = false;
Lara.leftArm.lock = 0; Lara.leftArm.lock = false;
Lara.flareFrame = 0; Lara.flareFrame = 0;
} }
else if (frame2 < 21) else if (frame2 < 21)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,5 +1,5 @@
#pragma once #pragma once
#include "global.h"
#include "collide.h" #include "collide.h"
extern OBJECT_TEXTURE* WaterfallTextures[6]; 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 !!!! ID_NUMBER_OBJECTS, // NEED TO BE AT THE END !!!!
}; };
#define NUM_PUZZLES (ID_PUZZLE_ITEM16 - ID_PUZZLE_ITEM1 + 1) typedef enum SPRITE_TYPES
#define NUM_KEYS (ID_KEY_ITEM16 - ID_KEY_ITEM1 + 1) {
#define NUM_PICKUPS (ID_PICKUP_ITEM16 - ID_PICKUP_ITEM1 + 1) SPR_FIRE0,
#define NUM_EXAMINES (ID_EXAMINE8 - ID_EXAMINE1 + 1) 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 #pragma once
#include "global.h"
#include "box.h" #include "box.h"
int ShotLara(ITEM_INFO* item, AI_INFO* info, BITE_INFO* gun, short extra_rotation, int damage); 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 "framework.h"
#include "pickup.h" #include "pickup.h"
#include "phd_global.h"
#include "lara.h" #include "lara.h"
#include "draw.h" #include "draw.h"
#include "inventory.h" #include "inventory.h"
@ -29,43 +30,43 @@ static short PickUpBounds[12] = // offset 0xA1338
0xFF00, 0x0100, 0xFF38, 0x00C8, 0xFF00, 0x0100, 0xF8E4, 0x071C, 0x0000, 0x0000, 0xFF00, 0x0100, 0xFF38, 0x00C8, 0xFF00, 0x0100, 0xF8E4, 0x071C, 0x0000, 0x0000,
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 static short HiddenPickUpBounds[12] = // offset 0xA135C
{ {
0xFF00, 0x0100, 0xFF9C, 0x0064, 0xFCE0, 0xFF00, 0xF8E4, 0x071C, 0xEAAC, 0x1554, 0xFF00, 0x0100, 0xFF9C, 0x0064, 0xFCE0, 0xFF00, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0x0000, 0x0000 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 static short CrowbarPickUpBounds[12] = // offset 0xA1380
{ {
0xFF00, 0x0100, 0xFF9C, 0x0064, 0x00C8, 0x0200, 0xF8E4, 0x071C, 0xEAAC, 0x1554, 0xFF00, 0x0100, 0xFF9C, 0x0064, 0x00C8, 0x0200, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0x0000, 0x0000 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 static short JobyCrowPickUpBounds[12] = // offset 0xA13A4
{ {
0xFE00, 0x0000, 0xFF9C, 0x0064, 0x0000, 0x0200, 0xF8E4, 0x071C, 0xEAAC, 0x1554, 0xFE00, 0x0000, 0xFF9C, 0x0064, 0x0000, 0x0200, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0x0000, 0x0000 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 static short PlinthPickUpBounds[12] = // offset 0xA13C8
{ {
0xFF00, 0x0100, 0xFD80, 0x0280, 0xFE01, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554, 0xFF00, 0x0100, 0xFD80, 0x0280, 0xFE01, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0x0000, 0x0000 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 static short PickUpBoundsUW[12] = // offset 0xA13EC
{ {
0xFE00, 0x0200, 0xFE00, 0x0200, 0xFE00, 0x0200, 0xE002, 0x1FFE, 0xE002, 0x1FFE, 0xFE00, 0x0200, 0xFE00, 0x0200, 0xFE00, 0x0200, 0xE002, 0x1FFE, 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 static short KeyHoleBounds[12] = // offset 0xA1410
{ {
0xFF00, 0x0100, 0x0000, 0x0000, 0x0000, 0x019C, 0xF8E4, 0x071C, 0xEAAC, 0x1554, 0xFF00, 0x0100, 0x0000, 0x0000, 0x0000, 0x019C, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0xF8E4, 0x071C 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 static short PuzzleBounds[12] = // offset 0xA1434
{ {
0x0000, 0x0000, 0xFF00, 0x0100, 0x0000, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554, 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, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xF8E4, 0x071C, 0xEAAC, 0x1554,
0xF8E4, 0x071C 0xF8E4, 0x071C
}; };
static PHD_VECTOR SOPos = { 0, 0, 0 }; // offset 0xA1464 static PHD_VECTOR SOPos(0, 0, 0); // offset 0xA1464
short SearchCollectFrames[4] = short SearchCollectFrames[4] =
{ {
0x00B4, 0x0064, 0x0099, 0x0053 0x00B4, 0x0064, 0x0099, 0x0053
@ -108,7 +109,7 @@ void PickedUpObject(short objectNumber)
switch (objectNumber) switch (objectNumber)
{ {
case ID_UZI_ITEM: 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].Present = true;
Lara.Weapons[WEAPON_UZI].SelectedAmmo = 0; Lara.Weapons[WEAPON_UZI].SelectedAmmo = 0;
@ -120,7 +121,7 @@ void PickedUpObject(short objectNumber)
break; break;
case ID_PISTOLS_ITEM: 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].Present = true;
Lara.Weapons[WEAPON_PISTOLS].SelectedAmmo = 0; Lara.Weapons[WEAPON_PISTOLS].SelectedAmmo = 0;
@ -131,7 +132,7 @@ void PickedUpObject(short objectNumber)
break; break;
case ID_SHOTGUN_ITEM: 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].Present = true;
Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = 0; Lara.Weapons[WEAPON_SHOTGUN].SelectedAmmo = 0;
@ -143,7 +144,7 @@ void PickedUpObject(short objectNumber)
break; break;
case ID_REVOLVER_ITEM: 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].Present = true;
Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = 0; Lara.Weapons[WEAPON_REVOLVER].SelectedAmmo = 0;
@ -155,7 +156,7 @@ void PickedUpObject(short objectNumber)
break; break;
case ID_CROSSBOW_ITEM: 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].Present = true;
Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = 0; Lara.Weapons[WEAPON_CROSSBOW].SelectedAmmo = 0;
@ -167,7 +168,7 @@ void PickedUpObject(short objectNumber)
break; break;
case ID_HK_ITEM: 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].Present = true;
Lara.Weapons[WEAPON_HK].SelectedAmmo = 0; Lara.Weapons[WEAPON_HK].SelectedAmmo = 0;
@ -179,7 +180,7 @@ void PickedUpObject(short objectNumber)
break; break;
case ID_HARPOON_ITEM: 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].Present = true;
Lara.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = 0; Lara.Weapons[WEAPON_HARPOON_GUN].SelectedAmmo = 0;
@ -191,7 +192,7 @@ void PickedUpObject(short objectNumber)
break; break;
case ID_GRENADE_GUN_ITEM: 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].Present = true;
Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = 0; Lara.Weapons[WEAPON_GRENADE_LAUNCHER].SelectedAmmo = 0;
@ -203,7 +204,7 @@ void PickedUpObject(short objectNumber)
break; break;
case ID_ROCKET_LAUNCHER_ITEM: 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].Present = true;
Lara.Weapons[WEAPON_ROCKET_LAUNCHER].SelectedAmmo = 0; Lara.Weapons[WEAPON_ROCKET_LAUNCHER].SelectedAmmo = 0;
@ -337,7 +338,7 @@ void PickedUpObject(short objectNumber)
case ID_GOLDROSE_ITEM: case ID_GOLDROSE_ITEM:
IsAtmospherePlaying = 0; IsAtmospherePlaying = 0;
S_CDPlay(6, 0); S_CDPlay(6, FALSE);
Lara.Secrets++; Lara.Secrets++;
Savegame.Level.Secrets++; Savegame.Level.Secrets++;
Savegame.Game.Secrets++; Savegame.Game.Secrets++;
@ -462,7 +463,7 @@ int KeyTrigger(short itemNum)
oldkey = KeyTriggerActive; oldkey = KeyTriggerActive;
if (!oldkey) if (!oldkey)
item->status = ITEM_DEACTIVATED; item->status = ITEM_DESACTIVATED;
KeyTriggerActive = false; KeyTriggerActive = false;
@ -702,7 +703,7 @@ void KeyHoleCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
{ {
if (!Lara.isMoving) if (!Lara.isMoving)
{ {
if (item->status != ITEM_INACTIVE) if (item->status != ITEM_NOT_ACTIVE)
return; return;
if (g_Inventory->GetSelectedObject() == NO_ITEM) if (g_Inventory->GetSelectedObject() == NO_ITEM)
{ {
@ -1275,7 +1276,7 @@ void RegeneratePickups()
if (ammo == 0) 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) if (item->pos.xPos == mesh->x && item->pos.zPos == mesh->z)
{ {
short* frame = GetBestFrame(item); 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)) if (frame[0] <= s->xMaxc && frame[1] >= s->xMinc && frame[4] <= s->zMaxc && frame[5] >= s->zMinc && (s->xMinc || s->xMaxc))
{ {
found = mesh->staticNumber; found = mesh->staticNumber;
@ -1400,7 +1401,7 @@ void PuzzleDone(ITEM_INFO* item, short itemNum)
{ {
FlipMap(Items[i].triggerFlags - 7); FlipMap(Items[i].triggerFlags - 7);
flipmap[Items[i].triggerFlags - 7] ^= IFLAG_ACTIVATION_MASK; flipmap[Items[i].triggerFlags - 7] ^= IFLAG_ACTIVATION_MASK;
Items[i].status = ITEM_INACTIVE; Items[i].status = ITEM_NOT_ACTIVE;
Items[i].flags |= 0x20; Items[i].flags |= 0x20;
} }
} }
@ -1493,7 +1494,7 @@ void SearchObjectCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* lar
item = &Items[itemNumber]; item = &Items[itemNumber];
objNumber = (item->objectNumber - ID_SEARCH_OBJECT1) / 2; 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) || Lara.isMoving && Lara.generalPtr == (void *) itemNumber)
{ {
bounds = GetBoundsAccurate(item); bounds = GetBoundsAccurate(item);
@ -1602,7 +1603,7 @@ void SearchObjectControl(short itemNumber)
if (Objects[item2->objectNumber].isPickup) if (Objects[item2->objectNumber].isPickup)
{ {
if (FlipStats[0]) if (FlipStats[0])
item2->status = ITEM_INACTIVE; item2->status = ITEM_NOT_ACTIVE;
else else
item2->status = ITEM_INVISIBLE; 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) if (item->objectNumber == ID_SEARCH_OBJECT4)
{ {
@ -1648,7 +1649,7 @@ void SearchObjectControl(short itemNumber)
else else
{ {
RemoveActiveItem(itemNumber); RemoveActiveItem(itemNumber);
item->status = ITEM_INACTIVE; item->status = ITEM_NOT_ACTIVE;
} }
} }
} }

View file

@ -1,5 +1,5 @@
#pragma once #pragma once
#include "global.h"
#include "collide.h" #include "collide.h"
void InitialisePickup(short itemNumber); 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 #pragma once
#include "global.h"
#include "collide.h" #include "collide.h"
struct ROPE_STRUCT struct ROPE_STRUCT

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,30 @@
#pragma once #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 enum spotcam_flags
{ {

View file

@ -42,12 +42,6 @@ short TurnSwitchBoundsC[12] = // offset 0xA14FC
0xF8E4, 0x071C 0xF8E4, 0x071C
}; };
PHD_VECTOR TurnSwitchPosA = { 650, 0, -138 }; // offset 0xA1514 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 PHD_VECTOR RailSwitchPos = { 0, 0, -550 }; // offset 0xA1544
short RailSwitchBounds[12] = // offset 0xA1550 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) void FullBlockSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
{ {
ITEM_INFO* item = &Items[itemNum]; ITEM_INFO* item = &Items[itemNum];
@ -389,7 +264,7 @@ void FullBlockSwitchControl(short itemNumber)
{ {
item->itemFlags[0] = 0; item->itemFlags[0] = 0;
item->goalAnimState = 1; item->goalAnimState = 1;
item->status = ITEM_INACTIVE; item->status = ITEM_NOT_ACTIVE;
if (++CurrentSequence >= 7u) if (++CurrentSequence >= 7u)
CurrentSequence = 0; CurrentSequence = 0;
} }
@ -876,7 +751,7 @@ void TurnSwitchControl(short itemNum)
l->frameNumber = Anims[l->animNumber].frameBase; l->frameNumber = Anims[l->animNumber].frameBase;
item->animNumber = Objects[item->objectNumber].animIndex; item->animNumber = Objects[item->objectNumber].animIndex;
item->frameNumber = Anims[item->animNumber].frameBase; item->frameNumber = Anims[item->animNumber].frameBase;
item->status = ITEM_INACTIVE; item->status = ITEM_NOT_ACTIVE;
RemoveActiveItem(itemNum); RemoveActiveItem(itemNum);
@ -1019,7 +894,7 @@ void SwitchCollision2(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
if (TrInput & IN_ACTION) 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)) 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->currentAnimState == STATE_LARA_STOP
&& l->animNumber == ANIMATION_LARA_STAY_IDLE && l->animNumber == ANIMATION_LARA_STAY_IDLE
&& !Lara.gunStatus && !Lara.gunStatus
&& item->status == ITEM_INACTIVE && item->status == ITEM_NOT_ACTIVE
&& !(item->flags & 0x100) && !(item->flags & 0x100)
&& item->triggerFlags >= 0 && item->triggerFlags >= 0
|| Lara.isMoving && Lara.generalPtr == (void*)itemNum) || 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) int SwitchTrigger(short itemNum, short timer)
{ {
ITEM_INFO* item = &Items[itemNum]; 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) 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); RemoveActiveItem(itemNum);
item->status = ITEM_INACTIVE; item->status = ITEM_NOT_ACTIVE;
if (!item->itemFlags[0] == 0) if (!item->itemFlags[0] == 0)
item->flags |= 0x100; item->flags |= 0x100;
if (item->currentAnimState != 1) if (item->currentAnimState != 1)

View file

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

View file

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

View file

@ -1,31 +1,185 @@
#pragma once #pragma once
#include "types.h" #include "phd_global.h"
#include "constants.h" #include "items.h"
struct ENERGY_ARC typedef struct ENERGY_ARC
{ {
PHD_VECTOR pos1; // 0 PHD_VECTOR pos1;
PHD_VECTOR pos2; PHD_VECTOR pos2;
PHD_VECTOR pos3; // 24 PHD_VECTOR pos3;
PHD_VECTOR pos4; // 36 PHD_VECTOR pos4;
byte r; // 48 byte r;
byte g; // 49 byte g;
byte b; // 50 byte b;
short sLife; // 52 short sLife;
short life; // 51 short life;
short amplitude; short amplitude;
short segmentSize; // 64 short segmentSize;
short sAmplitude; // 53 short sAmplitude;
byte type; // 61 byte type;
byte flags; // 62 byte flags;
signed char direction; // 63 signed char direction;
short rotation; short rotation;
short filler; 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_STRAIGHT_LINE 0
#define ENERGY_ARC_CIRCLE 1 #define ENERGY_ARC_CIRCLE 1
#define ENERGY_ARC_NO_RANDOMIZE 1 #define ENERGY_ARC_NO_RANDOMIZE 1
extern int LaserSightX; extern int LaserSightX;
@ -42,8 +196,26 @@ extern int NextBlood;
extern int NextSpider; extern int NextSpider;
extern int NextGunShell; 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 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 TriggerBlood(int x, int y, int z, int unk, int num);
void TriggerExplosionBubble(int x, int y, int z, short roomNum); void TriggerExplosionBubble(int x, int y, int z, short roomNum);
@ -73,7 +245,11 @@ void UpdateBubbles();
int GetFreeDrip(); int GetFreeDrip();
void UpdateDrips(); void UpdateDrips();
void TriggerLaraDrips(); 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(); 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 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); void TriggerShockwaveHitEffect(int x, int y, int z, int color, short rot, int vel);

View file

@ -1,6 +1,6 @@
#include "framework.h" #include "framework.h"
#include "traps.h" #include "traps.h"
#include "global.h"
#include "items.h" #include "items.h"
#include "effect2.h" #include "effect2.h"
#include "tomb4fx.h" #include "tomb4fx.h"
@ -323,7 +323,7 @@ void CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) /
l->pos.yRot += ANGLE(180); l->pos.yRot += ANGLE(180);
result2 = TestLaraPosition(CeilingTrapDoorBounds, item, l); result2 = TestLaraPosition(CeilingTrapDoorBounds, item, l);
l->pos.yRot += ANGLE(180); 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); AlignLaraPosition(&CeilingTrapDoorPos, item, l);
if (result2) if (result2)
@ -363,7 +363,7 @@ void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll) //
ITEM_INFO* item; ITEM_INFO* item;
item = &Items[itemNumber]; 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) || Lara.isMoving && Lara.generalPtr == (void *) itemNumber)
{ {
if (TestLaraPosition(FloorTrapDoorBounds, item, l)) if (TestLaraPosition(FloorTrapDoorBounds, item, l))

View file

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

View file

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

View file

@ -1,17 +1,26 @@
#pragma once #pragma once
#include "phd_global.h"
#include "vodoo.h" constexpr auto PI = 3.14159265358979323846f;
#include "types.h" 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 SQUARE(x) ((x)*(x))
#define CLAMP(x, a, b) ((x)<(a)?(a):((x)>(b)?(b):(x))) #define CLAMP(x, a, b) ((x)<(a)?(a):((x)>(b)?(b):(x)))
#define SIGN(x) ((0 < (x)) - ((x) < 0)) #define SIGN(x) ((0 < (x)) - ((x) < 0))
#define CLAMPADD(x, a, b) ((x)<(a)?((x)+(a)):((x)>(b)?((x)-(b)):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 CLICK(x) ((x) * STEP_SIZE)
#define SECTOR(x) ((x) * WALL_SIZE) #define SECTOR(x) ((x) * WALL_SIZE)
#define HIDWORD(l) ((DWORD)(((DWORDLONG)(l)>>32)&0xFFFFFFFF))
short ANGLE(float angle); short ANGLE(float angle);
float TO_DEGREES(short angle); float TO_DEGREES(short angle);
@ -21,7 +30,6 @@ extern short rcossin_tbl[8192];
int phd_sin(short a); int phd_sin(short a);
int phd_cos(short a); int phd_cos(short a);
float ANGLEF(short angle);
// returns a float between 0-1 // returns a float between 0-1
const float frand(); 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 "framework.h"
#include "newobjects.h" #include "tr4_bubbles.h"
#include "effect2.h" #include "effect2.h"
#include "debris.h" #include "debris.h"
#include "items.h" #include "items.h"
@ -30,7 +30,7 @@ void BubblesEffect1(short fxNum, short xVel, short yVel, short zVel)
spark->dG = spark->dB + 64; spark->dG = spark->dB + 64;
spark->fadeToBlack = 8; spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 4; spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
spark->transType = 2; spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 16; spark->life = spark->sLife = (GetRandomControl() & 3) + 16;
spark->y = 0; spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8; 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->dG = spark->dR = (GetRandomControl() & 0x7F) + 32;
spark->fadeToBlack = 8; spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 4; spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
spark->transType = 2; spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 16; spark->life = spark->sLife = (GetRandomControl() & 3) + 16;
spark->y = 0; spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8; 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->dG = spark->dG >> 1;
spark->fadeToBlack = 8; spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 8; spark->colFadeSpeed = (GetRandomControl() & 3) + 8;
spark->transType = 2; spark->transType = COLADD;
spark->dynamic = -1; spark->dynamic = -1;
spark->life = spark->sLife = (GetRandomControl() & 7) + 32; spark->life = spark->sLife = (GetRandomControl() & 7) + 32;
spark->y = 0; spark->y = 0;
@ -196,7 +196,7 @@ void BubblesEffect4(short fxNum, short xVel, short yVel, short zVel)
} }
spark->fadeToBlack = 8; spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 4; spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
spark->transType = 2; spark->transType = COLADD;
spark->life = spark->sLife = (GetRandomControl() & 3) + 16; spark->life = spark->sLife = (GetRandomControl() & 3) + 16;
spark->y = 0; spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8; 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.yRot = fx->pos.yRot;
ShatterItem.meshp = Meshes[fx->frameNumber]; ShatterItem.meshp = Meshes[fx->frameNumber];
@ -234,8 +234,6 @@ int BubblesShatterFunction(FX_INFO* fx, int param1, int param2)
ShatterItem.bit = 0; ShatterItem.bit = 0;
ShatterItem.flags = fx->flag2 & 0x400; ShatterItem.flags = fx->flag2 & 0x400;
ShatterObject(&ShatterItem, 0, param2, fx->roomNumber, param1); ShatterObject(&ShatterItem, 0, param2, fx->roomNumber, param1);
return 1;
} }
void BubblesControl(short fxNum) void BubblesControl(short fxNum)
@ -245,17 +243,17 @@ void BubblesControl(short fxNum)
short angles[2]; short angles[2];
phd_GetVectorAngles( phd_GetVectorAngles(
LaraItem->pos.xPos - fx->pos.xPos, 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, LaraItem->pos.zPos - fx->pos.zPos,
angles); angles);
int unk1 = 0; // v44 int maxRotation = 0;
int unk2 = 0; // v3 int maxSpeed = 0;
if (fx->flag1 == 1) if (fx->flag1 == 1)
{ {
unk1 = 512; maxRotation = 512;
unk2 = 256; maxSpeed = 256;
} }
else else
{ {
@ -265,16 +263,16 @@ void BubblesControl(short fxNum)
{ {
fx->counter--; fx->counter--;
} }
unk1 = 256; maxRotation = 256;
} }
else else
{ {
unk1 = 768; maxRotation = 768;
} }
unk2 = 192; maxSpeed = 192;
} }
if (fx->speed < unk2) if (fx->speed < maxSpeed)
{ {
if (fx->flag1 == 6) if (fx->flag1 == 6)
{ {
@ -286,29 +284,27 @@ void BubblesControl(short fxNum)
} }
int dy = angles[0] - fx->pos.yRot; int dy = angles[0] - fx->pos.yRot;
if (abs(dy) > ANGLE(180)) if (abs(dy) > ANGLE(180.0f))
{ {
dy = -dy; dy = -dy;
} }
int dx = angles[1] - fx->pos.xRot; int dx = angles[1] - fx->pos.xRot;
if (abs(dx) > ANGLE(180)) if (abs(dx) > ANGLE(180.0f))
{
dx = -dx; dx = -dx;
}
dy >>= 3; dy >>= 3;
dx >>= 3; dx >>= 3;
if (dy < -unk1) if (dy < -maxRotation)
dy = -unk1; dy = -maxRotation;
else if (dy > unk1) else if (dy > maxRotation)
dy = unk1; dy = maxRotation;
if (dx < -unk1) if (dx < -maxRotation)
dx = -unk1; dx = -maxRotation;
else if (dx > unk1) else if (dx > maxRotation)
dx = unk1; dx = maxRotation;
if (fx->flag1 != 4 && (fx->flag1 != 6 || !fx->counter)) if (fx->flag1 != 4 && (fx->flag1 != 6 || !fx->counter))
{ {
@ -319,9 +315,7 @@ void BubblesControl(short fxNum)
fx->pos.zRot += 16 * fx->speed; fx->pos.zRot += 16 * fx->speed;
if (fx->flag1 == 6) if (fx->flag1 == 6)
{
fx->pos.zRot += 16 * fx->speed; fx->pos.zRot += 16 * fx->speed;
}
int oldX = fx->pos.xPos; int oldX = fx->pos.xPos;
int oldY = fx->pos.yPos; int oldY = fx->pos.yPos;
@ -344,21 +338,11 @@ void BubblesControl(short fxNum)
fx->pos.zPos = oldZ; fx->pos.zPos = oldZ;
if (fx->flag1 != 6) if (fx->flag1 != 6)
{
BubblesShatterFunction(fx, 0, -32); BubblesShatterFunction(fx, 0, -32);
}
if (fx->flag1 == 1) if (fx->flag1 == 1)
{ {
TriggerShockwave( TriggerShockwave(&fx->pos, 32, 160, 64, 64, 128, 00, 24, (((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
(PHD_3DPOS*)&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); TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->roomNumber);
} }
else else
@ -436,10 +420,9 @@ void BubblesControl(short fxNum)
if (fx->flag1 == 1) 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); TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->roomNumber);
LaraBurn(); LaraBurn();
//Lara.gassed = true; BYTE1(Lara_Flags) |= 2u;
} }
else if (fx->flag1) else if (fx->flag1)
{ {
@ -447,42 +430,34 @@ void BubblesControl(short fxNum)
{ {
case 3: case 3:
case 4: 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; break;
case 5: 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; break;
case 2: 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; break;
case 6: case 6:
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->roomNumber); 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; 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; 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(); LaraBurn();
break; break;
} }
} }
else else
{ {
TriggerShockwave( TriggerShockwave( &fx->pos, 24, 88, 48, 64, 128, 0, 16, (((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
(PHD_3DPOS*)fx,
24,
88,
48,
64, 128, 0, 16,
(((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
} }
} }
else else
{ {
if (roomNumber != fx->roomNumber) if (roomNumber != fx->roomNumber)
{
EffectNewRoom(fxNum, roomNumber); EffectNewRoom(fxNum, roomNumber);
}
int dx = oldX - fx->pos.xPos; int dx = oldX - fx->pos.xPos;
int dy = oldY - fx->pos.yPos; int dy = oldY - fx->pos.yPos;
@ -499,14 +474,10 @@ void BubblesControl(short fxNum)
else if (fx->flag1 < 3 || fx->flag1 > 5) else if (fx->flag1 < 3 || fx->flag1 > 5)
{ {
if (fx->flag1 == 2) if (fx->flag1 == 2)
{
BubblesEffect2(fxNum, 16 * dx, 16 * dy, 16 * dz); BubblesEffect2(fxNum, 16 * dx, 16 * dy, 16 * dz);
}
else if (fx->flag1 == 6) else if (fx->flag1 == 6)
{
BubblesEffect3(fxNum, 16 * dx, 16 * dy, 16 * dz); BubblesEffect3(fxNum, 16 * dx, 16 * dy, 16 * dz);
} }
}
else else
{ {
BubblesEffect4(fxNum, 16 * dx, 16 * dy, 16 * dz); 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 "framework.h"
#include "newobjects.h" #include "tr1_doppelganger.h"
#include "box.h" #include "box.h"
#include "items.h" #include "items.h"
#include "larafire.h" #include "larafire.h"

View file

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

View file

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

View file

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

View file

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

View file

@ -1,5 +1,5 @@
#pragma once #pragma once
#include "types.h" #include "items.h"
#include "collide.h" #include "collide.h"
void DragonCollision(short itemNum, ITEM_INFO* laraitem, COLL_INFO* coll); 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->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); 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 */ /* If rider has reached end of his death animation, turn his skidoo into one that Lara can ride */
RemoveActiveItem(riderNum); RemoveActiveItem(riderNum);
@ -242,7 +242,7 @@ void SkidManControl(short riderNum)
DisableBaddieAI(item_number); DisableBaddieAI(item_number);
item->objectNumber = ID_SNOWMOBILE; item->objectNumber = ID_SNOWMOBILE;
item->status = ITEM_DEACTIVATED; item->status = ITEM_DESACTIVATED;
InitialiseSkidoo(item_number); InitialiseSkidoo(item_number);
((SKIDOO_INFO*)item->data)->armed = true; ((SKIDOO_INFO*)item->data)->armed = true;

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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