TombEngine/TR5Main/Objects/TR3/Vehicles/minecart.cpp

941 lines
27 KiB
C++
Raw Normal View History

#include "framework.h"
2021-12-24 03:32:19 +03:00
#include "Objects/TR3/Vehicles/minecart.h"
2021-12-24 11:08:16 +03:00
#include "Game/animation.h"
#include "Game/camera.h"
#include "Game/collision/sphere.h"
2021-12-22 16:23:57 +03:00
#include "Game/collision/collide_item.h"
#include "Game/effects/effects.h"
#include "Game/items.h"
2021-12-24 11:08:16 +03:00
#include "Game/Lara/lara.h"
#include "Game/Lara/lara_flare.h"
2022-02-23 22:15:51 +11:00
#include "Game/Lara/lara_helpers.h"
2021-12-24 11:08:16 +03:00
#include "Objects/TR3/Vehicles/minecart_info.h"
#include "Sound/sound.h"
#include "Specific/input.h"
2021-12-22 16:23:57 +03:00
#include "Specific/level.h"
#include "Specific/setup.h"
2021-09-25 11:27:47 +02:00
using std::vector;
2022-02-28 21:02:19 +11:00
#define DISMOUNT_DISTANCE 330
#define CART_DEC -1536
#define CART_MIN_SPEED 2560
#define CART_MIN_VEL 32
#define TURN_DEATH_VEL 128
#define CART_FORWARD_GRADIENT -128
#define CART_BACK_GRADIENT 128
#define CART_JUMP_VELOCITY 64512
#define CART_GRAVITY (SECTOR(1) + 1)
#define CART_MAX_VERTICAL_VELOCITY 16128
#define TERMINAL_ANGLE SECTOR(4)
#define CART_RADIUS 100
#define CART_HEIGHT CLICK(3)
#define CART_NHITS 25
#define CART_ENTITY_RADIUS CLICK(1)
#define CART_IN_SWIPE IN_ACTION
#define CART_IN_DUCK IN_CROUCH
#define CART_IN_DISMOUNT IN_ROLL
#define CART_IN_BRAKE (IN_BACK | IN_JUMP)
#define CART_IN_LEFT IN_LEFT
#define CART_IN_RIGHT IN_RIGHT
2022-01-09 13:44:37 +11:00
enum MinecartState
{
2022-02-23 14:40:08 +11:00
CART_STATE_MOUNT,
CART_STATE_DISMOUNT,
CART_STATE_DISMOUNT_LEFT,
CART_STATE_DISMOUNT_RIGHT,
CART_STATE_IDLE,
CART_STATE_DUCK,
CART_STATE_MOVE,
CART_STATE_RIGHT,
CART_STATE_HARD_LEFT, // Unused.
CART_STATE_LEFT,
CART_STATE_HARD_RIGHT, // Unused.
CART_STATE_BRAKE,
CART_STATE_FORWARD,
CART_STATE_BACK,
CART_TURN_DEATH,
CART_FALL_DEATH,
CART_WALL_DEATH,
CART_STATE_HIT,
2022-02-23 22:15:51 +11:00
CART_STATE_SWIPE,
2022-02-23 14:40:08 +11:00
CART_STATE_BRAKING
};
2022-02-23 22:15:51 +11:00
enum MinecartAnim
{
CART_ANIM_MOUNT_LEFT = 0,
CART_ANIM_DISMOUNT_LEFT = 1,
CART_ANIM_DUCK_START = 2,
CART_ANIM_DUCK_CONTINUE = 3,
CART_ANIM_DUCK_END = 4,
CART_ANIM_PICK_UP_WRENCH = 5,
CART_ANIM_SWIPE_WRENCH = 6,
CART_ANIM_PUT_DOWN_WRENCH = 7,
CART_ANIM_LEAN_LEFT_START = 8,
CART_ANIM_LEAN_RIGHT_CONTINUE = 9,
CART_ANIM_BRAKE_DISENGAGE = 10, // Unused?
CART_ANIM_BRAKE_ENGAGE = 11, // Unused?
CART_ANIM_LEAN_RIGHT_START = 12,
CART_ANIM_LEAN_LEFT_CONTINUE = 13,
CART_ANIM_LEAN_RIGHT_BRAKE_ENGAGE = 14,
CART_ANIM_LEAN_LEFT_BRAKE_ENGAGE = 15,
CART_ANIM_LEAN_RIGHT_HARD_CONTINUE = 16, // Unused?
CART_ANIM_LEAN_LEFT_HARD_CONTINUE = 17, // Unused?
CART_ANIM_LEAN_RIGHT_HARD_START = 18, // Unused?
CART_ANIM_LEAN_RIGHT_HARD_END = 19, // Unused?
CART_ANIM_LEAN_LEFT_HARD_START = 20, // Unused?
CART_ANIM_LEAN_LEFT_HARD_END = 21, // Unused?
CART_ANIM_RIDE_FORWARD = 22,
CART_ANIM_WALL_DEATH = 23,
CART_ANIM_LEAN_FORWARD_START = 24,
CART_ANIM_LEAN_FORWARD_CONTINUE = 25,
CART_ANIM_LEAN_FORWARD_END = 26,
CART_ANIM_LEAN_BACK_START = 27,
CART_ANIM_LEAN_BACK_CONTINUE = 28,
CART_ANIM_LEAN_BACK_END = 29,
CART_ANIM_FALL_DEATH = 30, // Unused?
CART_ANIM_TURN_DEATH = 31, // Unused?
CART_ANIM_FALL_OUT_START = 32,
CART_ANIM_FALL_OUT_END = 33,
CART_ANIM_BONK_HEAD = 34,
CART_ANIM_LEAN_FORWARD_DUCK_START = 35,
CART_ANIM_LEAN_FORWARD_DUCK_CONTINUE = 36,
CART_ANIM_LEAN_FORWARD_DUCK_END = 37,
CART_ANIM_LEAN_BACK_DUCK_START = 38,
CART_ANIM_LEAN_BACK_DUCK_CONTINUE = 39,
CART_ANIM_LEAN_BACK_DUCK_END = 40,
CART_ANIM_LEAN_RIGHT_BRAKE_DISENGAGE = 41, // Unused?
CART_ANIM_LEAN_LEFT_BRAKE_DISENGAGE = 42, // Unused?
CART_ANIM_LEAN_RIGHT_END = 43,
CART_ANIM_LEAN_LEFT_END = 44,
CART_ANIM_IDLE = 45,
CART_ANIM_MOUNT_RIGHT = 46,
CART_ANIM_DISMOUNT_RIGHT = 47,
CART_ANIM_BRAKE = 48,
};
2022-02-20 00:43:58 +11:00
enum MinecartFlags
{
2022-02-20 00:43:58 +11:00
CART_FLAG_MESH = 1,
2022-02-23 14:40:08 +11:00
CART_FLAG_TURNING_LEFT = 2,
CART_FLAG_TURNING_RIGHT = 4,
2022-02-23 22:15:51 +11:00
CART_FLAG_RDIR = 8, // TODO
2022-02-20 00:43:58 +11:00
CART_FLAG_CONTROL = 16,
CART_FLAG_STOPPED = 32,
2022-02-23 14:40:08 +11:00
CART_FLAG_NO_ANIM = 64,
2022-02-20 00:43:58 +11:00
CART_FLAG_DEAD = 128
};
2022-02-23 14:40:08 +11:00
void InitialiseMineCart(short itemNumber)
{
2022-02-28 21:02:19 +11:00
auto* minecartItem = &g_Level.Items[itemNumber];
minecartItem->Data = MinecartInfo();
auto* minecart = (MinecartInfo*)minecartItem->Data;
minecart->Velocity = 0;
minecart->VerticalVelocity = 0;
minecart->Gradient = 0;
minecart->Flags = NULL;
2022-02-23 14:40:08 +11:00
}
2022-02-28 21:02:19 +11:00
static int TestMinecartHeight(ITEM_INFO* minecartItem, int xOffset, int zOffset)
2022-02-23 14:40:08 +11:00
{
2022-02-28 21:02:19 +11:00
float s = phd_sin(minecartItem->Position.yRot);
float c = phd_cos(minecartItem->Position.yRot);
2022-02-23 14:40:08 +11:00
PHD_VECTOR pos;
2022-02-28 21:02:19 +11:00
pos.x = minecartItem->Position.xPos + zOffset * s + xOffset * c;
pos.y = minecartItem->Position.yPos - zOffset * phd_sin(minecartItem->Position.xRot) + xOffset * phd_sin(minecartItem->Position.zRot);
pos.z = minecartItem->Position.zPos + zOffset * c - xOffset * s;
2022-02-28 21:02:19 +11:00
return GetCollisionResult(pos.x, pos.y, pos.z, minecartItem->RoomNumber).Position.Floor;
}
2022-02-28 21:02:19 +11:00
static short GetMinecartCollision(ITEM_INFO* minecartItem, short angle, int distance)
{
2022-02-28 21:02:19 +11:00
auto probe = GetCollisionResult(minecartItem, angle, distance, -LARA_HEIGHT);
2022-02-23 14:40:08 +11:00
if (probe.Position.Floor != NO_HEIGHT)
2022-02-28 21:02:19 +11:00
probe.Position.Floor -= minecartItem->Position.yPos;
2022-02-23 14:40:08 +11:00
return (short)probe.Position.Floor;
}
2022-02-28 21:02:19 +11:00
static bool GetInMineCart(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, COLL_INFO* coll)
{
2022-02-28 21:02:19 +11:00
auto* lara = GetLaraInfo(laraItem);
2022-02-23 22:15:51 +11:00
2022-02-28 21:02:19 +11:00
if (!(TrInput & CART_IN_SWIPE) || lara->Control.HandStatus != HandStatus::Free ||
2022-02-23 14:40:08 +11:00
laraItem->Airborne)
{
return false;
2022-02-23 14:40:08 +11:00
}
2022-02-28 21:02:19 +11:00
if (!TestBoundsCollide(minecartItem, laraItem, coll->Setup.Radius))
return false;
2022-02-28 21:02:19 +11:00
if (!TestCollision(minecartItem, laraItem))
2022-02-23 14:40:08 +11:00
return false;
2022-02-28 21:02:19 +11:00
int x = laraItem->Position.xPos - minecartItem->Position.xPos;
int z = laraItem->Position.zPos - minecartItem->Position.zPos;
2022-02-23 14:40:08 +11:00
int distance = pow(x, 2) + pow(z, 2);
if (distance > pow(CLICK(2), 2))
return false;
2022-02-28 21:02:19 +11:00
if (GetCollisionResult(minecartItem).Position.Floor < -32000)
return false;
return true;
}
2022-02-23 22:15:51 +11:00
static bool TestMinecartDismount(ITEM_INFO* laraItem, int direction)
{
2022-02-28 21:02:19 +11:00
auto* lara = GetLaraInfo(laraItem);
auto* minecartItem = &g_Level.Items[lara->Vehicle];
2022-02-23 22:15:51 +11:00
short angle;
if (direction < 0)
2022-02-28 21:02:19 +11:00
angle = minecartItem->Position.yRot + ANGLE(90.0f);
else
2022-02-28 21:02:19 +11:00
angle = minecartItem->Position.yRot - ANGLE(90.0f);
2022-02-28 21:02:19 +11:00
auto probe = GetCollisionResult(minecartItem, angle, -DISMOUNT_DISTANCE);
2022-02-23 22:15:51 +11:00
if (probe.Position.FloorSlope || probe.Position.Floor == NO_HEIGHT)
return false;
2022-02-28 21:02:19 +11:00
if (abs(probe.Position.Floor - minecartItem->Position.yPos) > CLICK(2))
return false;
2022-02-28 21:02:19 +11:00
if ((probe.Position.Ceiling - minecartItem->Position.yPos) > -LARA_HEIGHT ||
2022-02-23 22:15:51 +11:00
(probe.Position.Floor - probe.Position.Ceiling) < LARA_HEIGHT)
{
return false;
2022-02-23 22:15:51 +11:00
}
return true;
}
2022-02-28 21:02:19 +11:00
static void CartToEntityCollision(ITEM_INFO* laraItem, ITEM_INFO* minecartItem)
{
vector<short> roomsList;
2022-02-28 21:02:19 +11:00
roomsList.push_back(minecartItem->RoomNumber);
2022-02-28 21:02:19 +11:00
auto* room = &g_Level.Rooms[minecartItem->RoomNumber];
for (int i = 0; i < room->doors.size(); i++)
roomsList.push_back(room->doors[i].room);
for (int i = 0; i < roomsList.size(); i++)
{
2022-02-23 14:40:08 +11:00
short itemNumber = g_Level.Rooms[roomsList[i]].itemNumber;
2022-02-23 14:40:08 +11:00
while (itemNumber != NO_ITEM)
{
2022-02-23 14:40:08 +11:00
auto* item = &g_Level.Items[itemNumber];
2022-02-23 22:15:51 +11:00
if (item->Collidable &&
item->Status != ITEM_INVISIBLE &&
2022-02-28 21:02:19 +11:00
item != laraItem && item != minecartItem)
{
2022-02-23 14:40:08 +11:00
auto* object = &Objects[item->ObjectNumber];
2022-02-23 22:15:51 +11:00
if (object->collision &&
(object->intelligent || item->ObjectNumber == ID_ROLLINGBALL || item->ObjectNumber == ID_ANIMATING2))
{
2022-02-28 21:02:19 +11:00
int x = minecartItem->Position.xPos - item->Position.xPos;
int y = minecartItem->Position.yPos - item->Position.yPos;
int z = minecartItem->Position.zPos - item->Position.zPos;
if (x > -SECTOR(2) && x < SECTOR(2) &&
y > -SECTOR(2) && y < SECTOR(2) &&
z > -SECTOR(2) && z < SECTOR(2))
{
2022-02-23 22:15:51 +11:00
if (TestBoundsCollide(item, laraItem, CART_ENTITY_RADIUS))
{
if (item->ObjectNumber == ID_ANIMATING2)
{
2022-02-23 14:40:08 +11:00
if (item->FrameNumber == g_Level.Anims[item->AnimNumber].frameBase &&
2022-02-23 22:15:51 +11:00
(laraItem->ActiveState == CART_STATE_SWIPE &&
laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 6))
{
2022-02-23 22:15:51 +11:00
int frame = laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase;
2022-02-23 14:40:08 +11:00
if (frame >= 12 && frame <= 22)
{
SoundEffect(220, &item->Position, 2);
2021-09-15 16:58:53 +03:00
TestTriggers(item, true);
item->FrameNumber++;
}
}
}
else if (item->ObjectNumber == ID_ROLLINGBALL)
{
2021-03-24 12:49:36 -05:00
/*code, kill lara and stop both the boulder and the minecart*/
}
else
{
2022-02-28 21:02:19 +11:00
DoLotsOfBlood(item->Position.xPos, minecartItem->Position.yPos - CLICK(1), item->Position.zPos, GetRandomControl() & 3, minecartItem->Position.yRot, item->RoomNumber, 3);
item->HitPoints = 0;
}
}
}
}
}
2022-02-23 14:40:08 +11:00
itemNumber = item->NextItem;
}
}
}
2022-02-28 21:02:19 +11:00
static void MoveCart(ITEM_INFO* laraItem, ITEM_INFO* minecartItem)
{
2022-02-28 21:02:19 +11:00
auto* lara = GetLaraInfo(laraItem);
auto* minecart = (MinecartInfo*)minecartItem->Data;
2022-02-23 22:15:51 +11:00
2022-02-28 21:02:19 +11:00
if (minecart->StopDelay)
minecart->StopDelay--;
if ((lara->Control.Minecart.Left && lara->Control.Minecart.Right && !minecart->StopDelay) &&
2022-02-28 21:02:19 +11:00
(minecartItem->Position.xPos & 0x380 == 512 ||
minecartItem->Position.zRot & 0x380 == 512))
{
2022-02-28 21:02:19 +11:00
if (minecart->Velocity < 0xf000)
{
2022-02-28 21:02:19 +11:00
minecartItem->Velocity = 0;
minecart->Velocity = 0;
minecart->Flags |= CART_FLAG_STOPPED | CART_FLAG_CONTROL;
return;
}
else
2022-02-28 21:02:19 +11:00
minecart->StopDelay = 16;
}
if ((lara->Control.Minecart.Left || lara->Control.Minecart.Right) &&
!(lara->Control.Minecart.Left && lara->Control.Minecart.Right) &&
2022-02-28 21:02:19 +11:00
!minecart->StopDelay &&
!(minecart->Flags & (CART_FLAG_TURNING_LEFT | CART_FLAG_TURNING_RIGHT)))
{
2022-02-23 14:40:08 +11:00
short angle;
unsigned short rotation = (((unsigned short)minecartItem->Position.yRot) / ANGLE(90.0f)) | (lara->Control.Minecart.Left * 4);
2022-02-23 14:40:08 +11:00
switch (rotation)
{
case 0:
2022-02-28 21:02:19 +11:00
minecart->TurnX = (minecartItem->Position.xPos + 4096) & ~1023;
minecart->TurnZ = minecartItem->Position.zPos & ~1023;
break;
2022-02-23 22:15:51 +11:00
case 1:
2022-02-28 21:02:19 +11:00
minecart->TurnX = minecartItem->Position.xPos & ~1023;
minecart->TurnZ = (minecartItem->Position.zPos - 4096) | 1023;
break;
2022-02-23 22:15:51 +11:00
case 2:
2022-02-28 21:02:19 +11:00
minecart->TurnX = (minecartItem->Position.xPos - 4096) | 1023;
minecart->TurnZ = minecartItem->Position.zPos | 1023;
break;
2022-02-23 22:15:51 +11:00
case 3:
2022-02-28 21:02:19 +11:00
minecart->TurnX = minecartItem->Position.xPos | 1023;
minecart->TurnZ = (minecartItem->Position.zPos + 4096) & ~1023;
break;
case 4:
2022-02-28 21:02:19 +11:00
minecart->TurnX = (minecartItem->Position.xPos - 4096) | 1023;
minecart->TurnZ = minecartItem->Position.zPos & ~1023;
break;
2022-02-23 22:15:51 +11:00
case 5:
2022-02-28 21:02:19 +11:00
minecart->TurnX = minecartItem->Position.xPos & ~1023;
minecart->TurnZ = (minecartItem->Position.zPos + 4096) & ~1023;
break;
2022-02-23 22:15:51 +11:00
case 6:
2022-02-28 21:02:19 +11:00
minecart->TurnX = (minecartItem->Position.xPos + 4096) & ~1023;
minecart->TurnZ = minecartItem->Position.zPos | 1023;
break;
2022-02-23 22:15:51 +11:00
case 7:
2022-02-28 21:02:19 +11:00
minecart->TurnX = minecartItem->Position.xPos | 1023;
minecart->TurnZ = (minecartItem->Position.zPos - 4096) | 1023;
break;
}
2022-02-28 21:02:19 +11:00
angle = mGetAngle(minecartItem->Position.xPos, minecartItem->Position.zPos, minecart->TurnX, minecart->TurnZ) & 0x3fff;
2022-02-23 14:40:08 +11:00
if (rotation < 4)
{
2022-02-28 21:02:19 +11:00
minecart->TurnRot = minecartItem->Position.yRot;
minecart->TurnLen = angle;
}
else
{
2022-02-28 21:02:19 +11:00
minecart->TurnRot = minecartItem->Position.yRot;
2022-02-23 14:40:08 +11:00
if (angle)
2022-02-23 22:15:51 +11:00
angle = ANGLE(90.0f) - angle;
2022-02-28 21:02:19 +11:00
minecart->TurnLen = angle;
}
minecart->Flags |= (lara->Control.Minecart.Left) ? CART_FLAG_TURNING_LEFT : CART_FLAG_TURNING_RIGHT;
}
2022-02-28 21:02:19 +11:00
if (minecart->Velocity < CART_MIN_SPEED)
minecart->Velocity = CART_MIN_SPEED;
2022-02-28 21:02:19 +11:00
minecart->Velocity += -minecart->Gradient * 4;
2022-02-28 21:02:19 +11:00
minecart->Velocity /= 256; // TODO: Then why use the huge values in the first place??
if (minecartItem->Velocity < CART_MIN_VEL)
{
2022-02-28 21:02:19 +11:00
minecartItem->Velocity = CART_MIN_VEL;
StopSoundEffect(209);
2022-02-28 21:02:19 +11:00
if (minecart->VerticalVelocity)
StopSoundEffect(210);
else
2022-02-28 21:02:19 +11:00
SoundEffect(210, &minecartItem->Position, 2);
}
else
{
StopSoundEffect(210);
2022-02-28 21:02:19 +11:00
if (minecart->VerticalVelocity)
StopSoundEffect(209);
else
2022-02-28 21:02:19 +11:00
SoundEffect(209, &minecartItem->Position, (2 | 4) + 0x1000000 + (minecartItem->Velocity * 32768));
}
2022-02-28 21:02:19 +11:00
if (minecart->Flags & (CART_FLAG_TURNING_LEFT | CART_FLAG_TURNING_RIGHT))
{
2022-02-28 21:02:19 +11:00
minecart->TurnLen += minecartItem->Velocity * 3;
if (minecart->TurnLen > ANGLE(90.0f))
{
2022-02-28 21:02:19 +11:00
if (minecart->Flags & CART_FLAG_TURNING_LEFT)
minecartItem->Position.yRot = minecart->TurnRot - ANGLE(90.0f);
else
2022-02-28 21:02:19 +11:00
minecartItem->Position.yRot = minecart->TurnRot + ANGLE(90.0f);
2022-02-28 21:02:19 +11:00
minecart->Flags &= ~(CART_FLAG_TURNING_LEFT | CART_FLAG_TURNING_RIGHT);
}
else
{
2022-02-28 21:02:19 +11:00
if (minecart->Flags & CART_FLAG_TURNING_LEFT)
minecartItem->Position.yRot = minecart->TurnRot - minecart->TurnLen;
else
2022-02-28 21:02:19 +11:00
minecartItem->Position.yRot = minecart->TurnRot + minecart->TurnLen;
}
2022-02-28 21:02:19 +11:00
if (minecart->Flags & (CART_FLAG_TURNING_LEFT | CART_FLAG_TURNING_RIGHT))
{
2022-02-28 21:02:19 +11:00
unsigned short quadrant = ((unsigned short)minecartItem->Position.yRot) / ANGLE(90.0f);
unsigned short degree = minecartItem->Position.yRot & 16383;
2022-02-23 14:40:08 +11:00
float x, z;
switch (quadrant)
{
case 0:
2022-02-23 14:40:08 +11:00
x = -phd_cos(degree);
z = phd_sin(degree);
break;
2022-02-23 22:15:51 +11:00
case 1:
2022-02-23 14:40:08 +11:00
x = phd_sin(degree);
z = phd_cos(degree);
break;
2022-02-23 22:15:51 +11:00
case 2:
2022-02-23 14:40:08 +11:00
x = phd_cos(degree);
z = -phd_sin(degree);
break;
2022-02-23 22:15:51 +11:00
default:
2022-02-23 14:40:08 +11:00
x = -phd_sin(degree);
z = -phd_cos(degree);
break;
}
2022-02-28 21:02:19 +11:00
if (minecart->Flags & CART_FLAG_TURNING_LEFT)
{
x = -x;
z = -z;
}
2022-02-28 21:02:19 +11:00
minecartItem->Position.xPos = minecart->TurnX + x * 3584;
minecartItem->Position.zPos = minecart->TurnZ + z * 3584;
}
}
else
{
2022-02-28 21:02:19 +11:00
minecartItem->Position.xPos += minecartItem->Velocity * phd_sin(minecartItem->Position.yRot);
minecartItem->Position.zPos += minecartItem->Velocity * phd_cos(minecartItem->Position.yRot);
}
2022-02-28 21:02:19 +11:00
minecart->FloorHeightMiddle = TestMinecartHeight(minecartItem, 0, 0);
2022-02-28 21:02:19 +11:00
if (!minecart->VerticalVelocity)
{
2022-02-28 21:02:19 +11:00
minecart->FloorHeightFront = TestMinecartHeight(minecartItem, 0, CLICK(1));
minecart->Gradient = minecart->FloorHeightMiddle - minecart->FloorHeightFront;
minecartItem->Position.yPos = minecart->FloorHeightMiddle;
}
else
{
2022-02-28 21:02:19 +11:00
if (minecartItem->Position.yPos > minecart->FloorHeightMiddle)
{
2022-02-28 21:02:19 +11:00
if (minecart->VerticalVelocity > 0)
SoundEffect(202, &minecartItem->Position, 2);
2022-02-28 21:02:19 +11:00
minecartItem->Position.yPos = minecart->FloorHeightMiddle;
minecart->VerticalVelocity = 0;
}
else
{
2022-02-28 21:02:19 +11:00
minecart->VerticalVelocity += CART_GRAVITY;
if (minecart->VerticalVelocity > CART_MAX_VERTICAL_VELOCITY)
minecart->VerticalVelocity = CART_MAX_VERTICAL_VELOCITY;
2022-02-28 21:02:19 +11:00
minecartItem->Position.yPos += minecart->VerticalVelocity / 256;
}
}
2022-02-28 21:02:19 +11:00
minecartItem->Position.xRot = minecart->Gradient * 32;
2022-02-28 21:02:19 +11:00
if (minecart->Flags & (CART_FLAG_TURNING_LEFT | CART_FLAG_TURNING_RIGHT))
{
2022-02-28 21:02:19 +11:00
short val = minecartItem->Position.yRot & 16383;
if (minecart->Flags & CART_FLAG_TURNING_RIGHT)
minecartItem->Position.zRot = -(val * minecartItem->Velocity) / 512;
else
2022-02-28 21:02:19 +11:00
minecartItem->Position.zRot = ((ANGLE(90.0f) - val) * minecartItem->Velocity) / 512;
}
else
2022-02-28 21:02:19 +11:00
minecartItem->Position.zRot -= minecartItem->Position.zRot / 8;
}
2022-02-28 21:02:19 +11:00
static void DoUserInput(ITEM_INFO* minecartItem, ITEM_INFO* laraItem, MinecartInfo* minecart)
{
2022-02-28 21:02:19 +11:00
auto* lara = GetLaraInfo(laraItem);
2022-02-23 22:15:51 +11:00
short floorHeight;
2022-02-23 14:40:08 +11:00
switch (laraItem->ActiveState)
{
2022-02-23 14:40:08 +11:00
case CART_STATE_MOVE:
2022-02-23 22:15:51 +11:00
if (TrInput & CART_IN_SWIPE)
laraItem->TargetState = CART_STATE_SWIPE;
2022-02-23 14:40:08 +11:00
else if (TrInput & CART_IN_DUCK)
laraItem->TargetState = CART_STATE_DUCK;
else if (TrInput & CART_IN_BRAKE)
laraItem->TargetState = CART_STATE_BRAKE;
2022-02-28 21:02:19 +11:00
else if (minecart->Velocity == CART_MIN_VEL || minecart->Flags & CART_FLAG_STOPPED)
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_IDLE;
2022-02-28 21:02:19 +11:00
else if (minecart->Gradient < CART_FORWARD_GRADIENT)
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_FORWARD;
2022-02-28 21:02:19 +11:00
else if (minecart->Gradient > CART_BACK_GRADIENT)
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_BACK;
else if (TrInput & CART_IN_LEFT)
laraItem->TargetState = CART_STATE_LEFT;
else if (TrInput & CART_IN_RIGHT)
laraItem->TargetState = CART_STATE_RIGHT;
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_FORWARD:
2022-02-23 22:15:51 +11:00
if (TrInput & CART_IN_SWIPE)
laraItem->TargetState = CART_STATE_SWIPE;
2022-02-23 14:40:08 +11:00
else if (TrInput & CART_IN_DUCK)
laraItem->TargetState = CART_STATE_DUCK;
else if (TrInput & CART_IN_BRAKE)
laraItem->TargetState = CART_STATE_BRAKE;
2022-02-28 21:02:19 +11:00
else if (minecart->Gradient > CART_FORWARD_GRADIENT)
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_MOVE;
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_BACK:
2022-02-23 22:15:51 +11:00
if (TrInput & CART_IN_SWIPE)
laraItem->TargetState = CART_STATE_SWIPE;
2022-02-23 14:40:08 +11:00
else if (TrInput & CART_IN_DUCK)
laraItem->TargetState = CART_STATE_DUCK;
else if (TrInput & CART_IN_BRAKE)
laraItem->TargetState = CART_STATE_BRAKE;
2022-02-28 21:02:19 +11:00
else if (minecart->Gradient < CART_BACK_GRADIENT)
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_MOVE;
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_LEFT:
2022-02-23 22:15:51 +11:00
if (TrInput & CART_IN_SWIPE)
laraItem->TargetState = CART_STATE_SWIPE;
2022-02-23 14:40:08 +11:00
else if (TrInput & CART_IN_DUCK)
laraItem->TargetState = CART_STATE_DUCK;
else if (TrInput & CART_IN_BRAKE)
laraItem->TargetState = CART_STATE_BRAKE;
2022-02-23 14:40:08 +11:00
if (!(TrInput & CART_IN_LEFT))
laraItem->TargetState = CART_STATE_MOVE;
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_RIGHT:
2022-02-23 22:15:51 +11:00
if (TrInput & CART_IN_SWIPE)
laraItem->TargetState = CART_STATE_SWIPE;
2022-02-23 14:40:08 +11:00
else if (TrInput & CART_IN_DUCK)
laraItem->TargetState = CART_STATE_DUCK;
else if (TrInput & CART_IN_BRAKE)
laraItem->TargetState = CART_STATE_BRAKE;
if (!(TrInput & CART_IN_RIGHT))
laraItem->TargetState = CART_STATE_MOVE;
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_IDLE:
2022-02-28 21:02:19 +11:00
if (!(minecart->Flags & CART_FLAG_CONTROL))
{
2022-02-28 21:02:19 +11:00
SoundEffect(211, &minecartItem->Position, 2);
minecart->Flags |= CART_FLAG_CONTROL;
minecart->StopDelay = 64;
}
2022-02-28 21:02:19 +11:00
if (TrInput & CART_IN_DISMOUNT && minecart->Flags & CART_FLAG_STOPPED)
{
2022-02-23 22:15:51 +11:00
if (TrInput & CART_IN_LEFT && TestMinecartDismount(laraItem, -1))
{
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_DISMOUNT;
2022-02-28 21:02:19 +11:00
minecart->Flags &= ~CART_FLAG_RDIR;
}
2022-02-23 22:15:51 +11:00
else if (TrInput & CART_IN_RIGHT && TestMinecartDismount(laraItem, 1))
{
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_DISMOUNT;
2022-02-28 21:02:19 +11:00
minecart->Flags |= CART_FLAG_RDIR;
}
}
2022-02-23 14:40:08 +11:00
if (TrInput & CART_IN_DUCK)
laraItem->TargetState = CART_STATE_DUCK;
2022-02-28 21:02:19 +11:00
else if (minecart->Velocity > CART_MIN_VEL)
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_MOVE;
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_DUCK:
2022-02-23 22:15:51 +11:00
if (TrInput & CART_IN_SWIPE)
laraItem->TargetState = CART_STATE_SWIPE;
2022-02-23 14:40:08 +11:00
else if (TrInput & CART_IN_BRAKE)
laraItem->TargetState = CART_STATE_BRAKE;
else if (!(TrInput & CART_IN_DUCK))
laraItem->TargetState = CART_STATE_IDLE;
break;
2022-02-23 22:15:51 +11:00
case CART_STATE_SWIPE:
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_MOVE;
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_BRAKING:
if (TrInput & CART_IN_DUCK)
{
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_DUCK;
StopSoundEffect(219);
}
2022-02-28 21:02:19 +11:00
else if (!(TrInput & CART_IN_BRAKE) || minecart->Flags & CART_FLAG_STOPPED)
{
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_MOVE;
StopSoundEffect(219);
}
else
{
2022-02-28 21:02:19 +11:00
minecart->Velocity += CART_DEC;
2022-02-23 14:40:08 +11:00
SoundEffect(219, &laraItem->Position, 2);
}
2022-02-23 14:40:08 +11:00
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_BRAKE:
laraItem->TargetState = CART_STATE_BRAKING;
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_DISMOUNT:
if (laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 7)
{
2022-02-28 21:02:19 +11:00
if (laraItem->FrameNumber == GetFrameNumber(minecartItem, 20) &&
minecart->Flags & CART_FLAG_MESH)
{
lara->MeshPtrs[LM_RHAND] = Objects[ID_MINECART_LARA_ANIMS].meshIndex + LM_RHAND;
2022-02-28 21:02:19 +11:00
minecart->Flags &= ~CART_FLAG_MESH;
}
2022-02-28 21:02:19 +11:00
if (minecart->Flags & CART_FLAG_RDIR)
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_DISMOUNT_RIGHT;
else
2022-02-23 14:40:08 +11:00
laraItem->TargetState = CART_STATE_DISMOUNT_LEFT;
}
2022-02-23 14:40:08 +11:00
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_DISMOUNT_LEFT:
if (laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 1 &&
laraItem->FrameNumber == g_Level.Anims[laraItem->AnimNumber].frameEnd)
{
2022-02-23 22:15:51 +11:00
PHD_VECTOR pos = { 0, 640, 0 };
GetLaraJointPosition(&pos, LM_HIPS);
2022-02-23 14:40:08 +11:00
2022-02-23 22:15:51 +11:00
laraItem->Position.xPos = pos.x;
laraItem->Position.yPos = pos.y;
laraItem->Position.zPos = pos.z;
2022-02-23 14:40:08 +11:00
laraItem->Position.xRot = 0;
2022-02-23 22:15:51 +11:00
laraItem->Position.yRot = ANGLE(90.0f);
2022-02-23 14:40:08 +11:00
laraItem->Position.zRot = 0;
2022-02-28 21:02:19 +11:00
minecartItem->Position.yRot + ANGLE(90.0f);
2022-02-23 14:40:08 +11:00
SetAnimation(laraItem, LA_STAND_SOLID);
2022-02-28 21:02:19 +11:00
lara->Control.HandStatus = HandStatus::Free;
lara->Vehicle = NO_ITEM;
}
2022-02-23 14:40:08 +11:00
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_DISMOUNT_RIGHT:
if (laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 47 &&
laraItem->FrameNumber == g_Level.Anims[laraItem->AnimNumber].frameEnd)
{
2022-02-23 22:15:51 +11:00
PHD_VECTOR pos = { 0, 640, 0 };
GetLaraJointPosition(&pos, LM_HIPS);
2022-02-23 14:40:08 +11:00
2022-02-23 22:15:51 +11:00
laraItem->Position.xPos = pos.x;
laraItem->Position.yPos = pos.y;
laraItem->Position.zPos = pos.z;
2022-02-23 14:40:08 +11:00
laraItem->Position.xRot = 0;
2022-02-23 22:15:51 +11:00
laraItem->Position.yRot = ANGLE(90.0f);
2022-02-23 14:40:08 +11:00
laraItem->Position.zRot = 0;
2022-02-28 21:02:19 +11:00
minecartItem->Position.yRot + ANGLE(90.0f);
2022-02-23 14:40:08 +11:00
SetAnimation(laraItem, LA_STAND_SOLID);
2022-02-28 21:02:19 +11:00
lara->Control.HandStatus = HandStatus::Free;
lara->Vehicle = NO_ITEM;
}
2022-02-23 14:40:08 +11:00
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_MOUNT:
if (laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 5 &&
2022-02-28 21:02:19 +11:00
laraItem->FrameNumber == GetFrameNumber(minecartItem, 20) &&
!minecart->Flags & CART_FLAG_MESH)
{
auto temp = g_Level.Meshes[lara->MeshPtrs[LM_RHAND]];
lara->MeshPtrs[LM_RHAND] = Objects[ID_MINECART_LARA_ANIMS].meshIndex + LM_RHAND;
g_Level.Meshes[Objects[ID_MINECART_LARA_ANIMS].meshIndex + LM_RHAND] = temp;
2022-02-28 21:02:19 +11:00
minecart->Flags |= CART_FLAG_MESH;
}
break;
2022-02-23 14:40:08 +11:00
case CART_WALL_DEATH:
Camera.targetElevation = -ANGLE(25.0f);
Camera.targetDistance = SECTOR(4);
2022-02-23 14:40:08 +11:00
break;
case CART_TURN_DEATH:
Camera.targetElevation = -ANGLE(45.0f);
Camera.targetDistance = SECTOR(2);
2022-02-28 21:02:19 +11:00
floorHeight = GetMinecartCollision(minecartItem, minecartItem->Position.yRot, CLICK(2));
2022-02-23 14:40:08 +11:00
if (floorHeight > -CLICK(1) &&
floorHeight < CLICK(1))
{
2022-02-23 14:40:08 +11:00
if (Wibble & 7 == 0)
2022-02-28 21:02:19 +11:00
SoundEffect(SFX_TR3_QUAD_FRONT_IMPACT, &minecartItem->Position, 2);
2022-02-28 21:02:19 +11:00
minecartItem->Position.xPos += TURN_DEATH_VEL * phd_sin(minecartItem->Position.yRot);
minecartItem->Position.zPos += TURN_DEATH_VEL * phd_cos(minecartItem->Position.yRot);
}
else
{
2022-02-23 14:40:08 +11:00
if (laraItem->AnimNumber == Objects[ID_MINECART_LARA_ANIMS].animIndex + 30)
{
2022-02-28 21:02:19 +11:00
minecart->Flags |= CART_FLAG_NO_ANIM;
2022-02-23 14:40:08 +11:00
laraItem->HitPoints = -1;
}
}
2022-02-23 14:40:08 +11:00
break;
2022-02-23 14:40:08 +11:00
case CART_STATE_HIT:
if (laraItem->HitPoints <= 0 &&
2022-02-28 21:02:19 +11:00
laraItem->FrameNumber == GetFrameNumber(minecartItem, 34) + 28)
{
2022-02-28 21:02:19 +11:00
laraItem->FrameNumber = GetFrameNumber(minecartItem, 34) + 28;
minecartItem->Velocity = 0;
minecart->Flags = (minecart->Flags & ~CART_FLAG_CONTROL) | CART_FLAG_NO_ANIM;
minecart->Velocity = 0;
}
2022-02-23 14:40:08 +11:00
break;
}
2022-02-28 21:02:19 +11:00
if (lara->Vehicle != NO_ITEM &&
!(minecart->Flags & CART_FLAG_NO_ANIM))
{
2022-02-23 14:40:08 +11:00
AnimateItem(laraItem);
2022-02-28 21:02:19 +11:00
minecartItem->AnimNumber = Objects[ID_MINECART].animIndex + (laraItem->AnimNumber - Objects[ID_MINECART_LARA_ANIMS].animIndex);
minecartItem->FrameNumber = g_Level.Anims[minecartItem->AnimNumber].frameBase + (laraItem->FrameNumber - g_Level.Anims[laraItem->AnimNumber].frameBase);
}
2022-02-23 14:40:08 +11:00
if (laraItem->ActiveState != CART_TURN_DEATH &&
laraItem->ActiveState != CART_WALL_DEATH &&
laraItem->HitPoints > 0)
{
2022-02-28 21:02:19 +11:00
if (minecartItem->Position.zRot > TERMINAL_ANGLE ||
minecartItem->Position.zRot < -TERMINAL_ANGLE)
{
2022-02-23 14:40:08 +11:00
laraItem->AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + 31;
laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase;
laraItem->ActiveState = laraItem->TargetState = CART_TURN_DEATH;
2022-02-28 21:02:19 +11:00
minecartItem->Velocity = 0;
minecart->Flags = (minecart->Flags & ~CART_FLAG_CONTROL) | CART_FLAG_STOPPED | CART_FLAG_DEAD;
minecart->Velocity = 0;
return;
}
2022-02-28 21:02:19 +11:00
floorHeight = GetMinecartCollision(minecartItem, minecartItem->Position.yRot, CLICK(2));
2022-02-23 14:40:08 +11:00
if (floorHeight < -CLICK(2))
{
2022-02-23 14:40:08 +11:00
laraItem->AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + 23;
laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase;
laraItem->ActiveState = laraItem->TargetState = CART_WALL_DEATH;
laraItem->HitPoints = -1;
2022-02-28 21:02:19 +11:00
minecartItem->Velocity = 0;
minecart->Flags = (minecart->Flags & ~CART_FLAG_CONTROL) | (CART_FLAG_STOPPED | CART_FLAG_DEAD);
minecart->Velocity = 0;
return;
}
2022-02-23 14:40:08 +11:00
if (laraItem->ActiveState != CART_STATE_DUCK &&
laraItem->ActiveState != CART_STATE_HIT)
{
COLL_INFO coll;
2021-09-10 00:20:59 +03:00
coll.Setup.Radius = CART_RADIUS;
2022-02-28 21:02:19 +11:00
DoObjectCollision(minecartItem, &coll);
2021-09-10 00:18:47 +03:00
if (coll.HitStatic)
{
2022-02-23 14:40:08 +11:00
laraItem->AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + 34;
laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase;
laraItem->ActiveState = laraItem->TargetState = CART_STATE_HIT;
2022-02-28 21:02:19 +11:00
DoLotsOfBlood(laraItem->Position.xPos, laraItem->Position.yPos - CLICK(3), laraItem->Position.zPos, minecartItem->Velocity, minecartItem->Position.yRot, laraItem->RoomNumber, 3);
int hits = CART_NHITS * short(minecart->Velocity / 2048);
if (hits < 20)
hits = 20;
2022-02-23 14:40:08 +11:00
laraItem->HitPoints -= hits;
return;
}
}
2022-02-28 21:02:19 +11:00
if (floorHeight > CLICK(2.25f) && !minecart->VerticalVelocity)
minecart->VerticalVelocity = CART_JUMP_VELOCITY;
2022-02-28 21:02:19 +11:00
CartToEntityCollision(laraItem, minecartItem);
}
}
2022-02-23 14:40:08 +11:00
void MineCartCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll)
{
2022-02-28 21:02:19 +11:00
auto* lara = GetLaraInfo(laraItem);
2022-02-23 22:15:51 +11:00
2022-02-28 21:02:19 +11:00
if (laraItem->HitPoints < 0 || lara->Vehicle != NO_ITEM)
return;
2022-02-28 21:02:19 +11:00
auto* minecartItem = &g_Level.Items[itemNumber];
2022-02-28 21:02:19 +11:00
int mount = GetInMineCart(minecartItem, laraItem, coll);
2022-02-23 22:15:51 +11:00
if (mount)
{
2022-02-28 21:02:19 +11:00
lara->Vehicle = itemNumber;
if (lara->Control.Weapon.GunType == WEAPON_FLARE)
{
2022-02-23 22:15:51 +11:00
CreateFlare(laraItem, ID_FLARE_ITEM, FALSE);
2022-02-23 14:40:08 +11:00
UndrawFlareMeshes(laraItem);
2022-02-28 21:02:19 +11:00
lara->Flare.ControlLeft = false;
lara->Control.Weapon.RequestGunType = WEAPON_NONE;
lara->Control.Weapon.GunType = WEAPON_NONE;
}
2022-02-28 21:02:19 +11:00
lara->Control.HandStatus = HandStatus::Busy;
2022-02-28 21:02:19 +11:00
short angle = short(mGetAngle(minecartItem->Position.xPos, minecartItem->Position.zPos, laraItem->Position.xPos, laraItem->Position.zPos) - minecartItem->Position.yRot);
2022-02-23 14:40:08 +11:00
if (angle > -ANGLE(45.0f) && angle < ANGLE(135.0f))
2022-02-23 22:15:51 +11:00
laraItem->AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + CART_ANIM_MOUNT_RIGHT;
else
2022-02-23 22:15:51 +11:00
laraItem->AnimNumber = Objects[ID_MINECART_LARA_ANIMS].animIndex + CART_ANIM_MOUNT_LEFT;
2022-02-23 14:40:08 +11:00
laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase;
2022-02-23 22:15:51 +11:00
laraItem->TargetState = CART_STATE_MOUNT;
laraItem->ActiveState = CART_STATE_MOUNT;
2022-02-28 21:02:19 +11:00
laraItem->Position.xPos = minecartItem->Position.xPos;
laraItem->Position.yPos = minecartItem->Position.yPos;
laraItem->Position.zPos = minecartItem->Position.zPos;
laraItem->Position.xRot = minecartItem->Position.xRot;
laraItem->Position.yRot = minecartItem->Position.yRot;
laraItem->Position.zRot = minecartItem->Position.zRot;
}
else
2022-02-23 14:40:08 +11:00
ObjectCollision(itemNumber, laraItem, coll);
}
2022-02-23 22:15:51 +11:00
bool MineCartControl(ITEM_INFO* laraItem)
{
2022-02-28 21:02:19 +11:00
auto* lara = GetLaraInfo(laraItem);
auto* minecartItem = &g_Level.Items[lara->Vehicle];
2022-02-28 21:02:19 +11:00
if (!minecartItem->Data)
{
TENLog("Minecart data is nullptr!", LogLevel::Error);
2022-02-23 22:15:51 +11:00
return false;
}
2022-02-28 21:02:19 +11:00
auto* minecart = (MinecartInfo*)minecartItem->Data;
2022-02-28 21:02:19 +11:00
DoUserInput(minecartItem, laraItem, minecart);
2022-02-28 21:02:19 +11:00
if (minecart->Flags & CART_FLAG_CONTROL)
MoveCart(laraItem, minecartItem);
2022-02-28 21:02:19 +11:00
if (lara->Vehicle != NO_ITEM)
{
2022-02-28 21:02:19 +11:00
laraItem->Position.xPos = minecartItem->Position.xPos;
laraItem->Position.yPos = minecartItem->Position.yPos;
laraItem->Position.zPos = minecartItem->Position.zPos;
laraItem->Position.xRot = minecartItem->Position.xRot;
laraItem->Position.yRot = minecartItem->Position.yRot;
laraItem->Position.zRot = minecartItem->Position.zRot;
}
2022-02-28 21:02:19 +11:00
short probedRoomNumber = GetCollisionResult(minecartItem).RoomNumber;
if (probedRoomNumber != minecartItem->RoomNumber)
{
2022-02-28 21:02:19 +11:00
ItemNewRoom(lara->Vehicle, probedRoomNumber);
ItemNewRoom(lara->ItemNumber, probedRoomNumber);
}
2022-02-28 21:02:19 +11:00
TestTriggers(minecartItem, false);
2022-02-28 21:02:19 +11:00
if (!(minecart->Flags & CART_FLAG_DEAD))
{
2022-02-23 14:40:08 +11:00
Camera.targetElevation = -ANGLE(45.0f);
Camera.targetDistance = SECTOR(2);
}
2022-02-28 21:02:19 +11:00
return (lara->Vehicle == NO_ITEM) ? false : true;
Merge branch 'master' into item_data # Conflicts: # TR5Main/Game/Lara/lara.cpp # TR5Main/Game/Lara/lara_collide.cpp # TR5Main/Game/Lara/lara_monkey.cpp # TR5Main/Game/Lara/lara_struct.h # TR5Main/Game/Lara/lara_tests.cpp # TR5Main/Game/collide.h # TR5Main/Game/control.h # TR5Main/Game/effect.h # TR5Main/Game/effect2.cpp # TR5Main/Game/flipeffect.cpp # TR5Main/Game/floordata.h # TR5Main/Game/hair.cpp # TR5Main/Game/health.cpp # TR5Main/Game/items.cpp # TR5Main/Game/newinv2.cpp # TR5Main/Game/spotcam.cpp # TR5Main/Objects/Effects/tr4_bubbles.cpp # TR5Main/Objects/TR1/Entity/tr1_ape.cpp # TR5Main/Objects/TR1/Entity/tr1_bigrat.cpp # TR5Main/Objects/TR1/Entity/tr1_doppelganger.cpp # TR5Main/Objects/TR2/Entity/tr2_birdmonster.cpp # TR5Main/Objects/TR2/Entity/tr2_shark.cpp # TR5Main/Objects/TR2/Entity/tr2_spider.cpp # TR5Main/Objects/TR2/Entity/tr2_yeti.cpp # TR5Main/Objects/TR3/Entity/tr3_fishemitter.cpp # TR5Main/Objects/TR3/Entity/tr3_flamethrower.cpp # TR5Main/Objects/TR3/Entity/tr3_monkey.cpp # TR5Main/Objects/TR3/Entity/tr3_raptor.cpp # TR5Main/Objects/TR3/Entity/tr3_scuba.cpp # TR5Main/Objects/TR3/Entity/tr3_trex.cpp # TR5Main/Objects/TR3/Vehicles/kayak.cpp # TR5Main/Objects/TR3/Vehicles/minecart.cpp # TR5Main/Objects/TR4/Entity/tr4_bat.cpp # TR5Main/Objects/TR4/Entity/tr4_big_beetle.cpp # TR5Main/Objects/TR4/Entity/tr4_bigscorpion.cpp # TR5Main/Objects/TR4/Entity/tr4_demigod.cpp # TR5Main/Objects/TR4/Entity/tr4_dog.cpp # TR5Main/Objects/TR4/Entity/tr4_hammerhead.cpp # TR5Main/Objects/TR4/Entity/tr4_harpy.cpp # TR5Main/Objects/TR4/Entity/tr4_mutant.cpp # TR5Main/Objects/TR4/Entity/tr4_smallscorpion.cpp # TR5Main/Objects/TR4/Entity/tr4_troops.cpp # TR5Main/Objects/TR4/Entity/tr4_wildboar.cpp # TR5Main/Objects/TR4/Trap/tr4_joby_spikes.cpp # TR5Main/Objects/TR4/Vehicles/motorbike.cpp # TR5Main/Objects/TR5/Entity/tr5_doberman.cpp # TR5Main/Objects/TR5/Entity/tr5_imp.cpp # TR5Main/Objects/TR5/Entity/tr5_larson.cpp # TR5Main/Objects/TR5/Entity/tr5_lion.cpp # TR5Main/Objects/TR5/Entity/tr5_reaper.cpp # TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp # TR5Main/Objects/TR5/Object/tr5_rollingball.cpp # TR5Main/Objects/TR5/Trap/tr5_fallingceiling.cpp # TR5Main/Renderer/Renderer11Draw2D.cpp # TR5Main/Specific/input.cpp # TR5Main/Specific/level.cpp # TR5Main/TombEngine.vcxproj.filters
2021-08-31 17:37:15 +02:00
}