TombEngine/TR5Main/Objects/TR3/Trap/train.cpp

153 lines
3.9 KiB
C++
Raw Normal View History

2020-09-20 10:11:10 -05:00
#include "framework.h"
2021-12-24 11:08:16 +03:00
#include "Objects/TR3/Trap/train.h"
#include "Game/animation.h"
2021-12-22 16:23:57 +03:00
#include "Game/camera.h"
2021-12-24 11:08:16 +03:00
#include "Game/control/control.h"
2021-12-22 16:23:57 +03:00
#include "Game/collision/collide_room.h"
#include "Game/collision/collide_item.h"
2021-12-24 11:08:16 +03:00
#include "Game/collision/floordata.h"
#include "Game/collision/sphere.h"
#include "Game/effects/effects.h"
#include "Game/items.h"
#include "Game/Lara/lara.h"
#include "Sound/sound.h"
#include "Specific/level.h"
#include "Specific/setup.h"
2021-09-25 11:27:47 +02:00
2020-09-20 10:07:15 -05:00
#define TRAIN_VEL 260
#define LARA_TRAIN_DEATH_ANIM 3;
long TrainTestHeight(ITEM_INFO *item, long x, long z, short *room_number)
{
2020-10-05 22:24:57 -03:00
float s, c;
2020-09-20 10:07:15 -05:00
PHD_VECTOR pos;
FLOOR_INFO *floor;
c = phd_cos(item->Position.yRot);
s = phd_sin(item->Position.yRot);
2020-09-20 10:07:15 -05:00
pos.x = item->Position.xPos + z * s + x * c;
pos.y = item->Position.yPos - z * phd_sin(item->Position.xRot) + x * phd_sin(item->Position.zRot);
pos.z = item->Position.zPos + z * c - x * s;
2020-09-20 10:07:15 -05:00
*room_number = item->RoomNumber;
2020-09-20 10:07:15 -05:00
floor = GetFloor(pos.x, pos.y, pos.z, room_number);
return GetFloorHeight(floor, pos.x, pos.y, pos.z);
}
void TrainControl(short trainNum)
{
ITEM_INFO *train;
2020-10-05 22:24:57 -03:00
long fh, rh;
2020-09-20 10:07:15 -05:00
FLOOR_INFO *floor;
short roomNum;
2020-10-05 22:24:57 -03:00
float s, c;
2020-09-20 10:07:15 -05:00
train = &g_Level.Items[trainNum];
if (!TriggerActive(train))
return;
if (train->ItemFlags[0] == 0)
train->ItemFlags[0] = train->ItemFlags[1] = TRAIN_VEL;
2020-09-20 10:07:15 -05:00
c = phd_cos(train->Position.yRot);
s = phd_sin(train->Position.yRot);
2020-09-20 10:07:15 -05:00
train->Position.xPos += train->ItemFlags[1] * s;
train->Position.zPos += train->ItemFlags[1] * c;
2020-09-20 10:07:15 -05:00
rh = TrainTestHeight(train, 0, 5120, &roomNum);
train->Position.yPos = fh = TrainTestHeight(train, 0, 0, &roomNum);
2020-09-20 10:07:15 -05:00
if (fh == NO_HEIGHT)
{
KillItem(trainNum);
return;
}
train->Position.yPos -= 32;// ?
2020-09-20 10:07:15 -05:00
roomNum = train->RoomNumber;
GetFloor(train->Position.xPos, train->Position.yPos, train->Position.zPos, &roomNum);
2020-09-20 10:07:15 -05:00
if (roomNum != train->RoomNumber)
2020-09-20 10:07:15 -05:00
ItemNewRoom(trainNum, roomNum);
train->Position.xRot = -(rh - fh) * 2;
2020-09-20 10:07:15 -05:00
TriggerDynamicLight(train->Position.xPos + 3072 * s, train->Position.yPos, train->Position.zPos + 3072 * c, 16, 31, 31, 31);
2020-09-20 10:07:15 -05:00
if (train->ItemFlags[1] != TRAIN_VEL)
2020-09-20 10:07:15 -05:00
{
if ((train->ItemFlags[1] -= 48) < 0)
train->ItemFlags[1] = 0;
2020-09-20 10:07:15 -05:00
if (!UseForcedFixedCamera)
{
ForcedFixedCamera.x = train->Position.xPos + 8192 * s;
ForcedFixedCamera.z = train->Position.zPos + 8192 * c;
2020-09-20 10:07:15 -05:00
roomNum = train->RoomNumber;
floor = GetFloor(ForcedFixedCamera.x, train->Position.yPos - 512, ForcedFixedCamera.z, &roomNum);
ForcedFixedCamera.y = GetFloorHeight(floor, ForcedFixedCamera.x, train->Position.yPos - 512, ForcedFixedCamera.z);
2020-09-20 10:07:15 -05:00
ForcedFixedCamera.roomNumber = roomNum;
UseForcedFixedCamera = 1;
}
}
else
SoundEffect(SFX_TR3_TUBE_LOOP, &train->Position, SFX_ALWAYS);
2020-09-20 10:07:15 -05:00
}
void TrainCollision(short trainNum, ITEM_INFO *larA, COLL_INFO *coll)
{
ITEM_INFO *train;
2020-10-05 22:24:57 -03:00
long x, z;
float s, c;
2020-09-20 10:07:15 -05:00
train = &g_Level.Items[trainNum];
2021-09-10 00:20:59 +03:00
if (!TestBoundsCollide(train, larA, coll->Setup.Radius))
2020-09-20 10:07:15 -05:00
return;
if (!TestCollision(train, larA))
return;
SoundEffect(SFX_TR3_LARA_GENERAL_DEATH, &larA->Position, SFX_ALWAYS);
SoundEffect(SFX_TR3_LARA_FALLDETH, &larA->Position, SFX_ALWAYS);
2020-09-20 10:07:15 -05:00
StopSoundEffect(SFX_TR3_TUBE_LOOP);
larA->AnimNumber = Objects[ID_LARA_EXTRA_ANIMS].animIndex + LARA_TRAIN_DEATH_ANIM;
larA->FrameNumber = g_Level.Anims[larA->AnimNumber].frameBase;
// larA->ActiveState = EXTRA_TRAINKILL;
// larA->TargetState = EXTRA_TRAINKILL;
larA->HitPoints = 0;
2020-09-20 10:07:15 -05:00
larA->Position.yRot = train->Position.yRot;
2020-09-20 10:07:15 -05:00
larA->VerticalVelocity = 0;
larA->Airborne = false;
larA->Velocity = 0;
2020-09-20 10:07:15 -05:00
AnimateItem(larA);
Lara.ExtraAnim = 1;
Lara.Control.HandStatus = HandStatus::Busy;
Lara.Control.WeaponControl.GunType = WEAPON_NONE;
2020-09-20 10:07:15 -05:00
Lara.hitDirection = -1;
Lara.Air = -1;
2020-09-20 10:07:15 -05:00
train->ItemFlags[1] = 160;
2020-09-20 10:07:15 -05:00
c = phd_cos(train->Position.yRot);
s = phd_sin(train->Position.yRot);
2020-09-20 10:07:15 -05:00
x = larA->Position.xPos + 256 * s;
z = larA->Position.zPos + 256 * c;
2020-09-20 10:07:15 -05:00
DoLotsOfBlood(x, larA->Position.yPos - 512, z, 1024, train->Position.yRot, larA->RoomNumber, 15);
2020-09-20 10:07:15 -05:00
}