TombEngine/TR5Main/Objects/TR5/Trap/tr5_deathslide.cpp
2020-10-17 23:36:06 -05:00

137 lines
No EOL
3.3 KiB
C++

#include "framework.h"
#include "tr5_deathslide.h"
#include "input.h"
#include "trmath.h"
#include "lara.h"
#include "setup.h"
#include "sound.h"
OBJECT_COLLISION_BOUNDS DeathSlideBounds = { -256, 256, -100, 100, 256, 512, 0, 0, -ANGLE(25.0f), ANGLE(25.0f), 0, 0 };
PHD_VECTOR DeathSlidePosition(0, 0, 371);
void InitialiseDeathSlide(short itemNumber)
{
ITEM_INFO* item = &g_Level.Items[itemNumber];
GAME_VECTOR* pos = game_malloc<GAME_VECTOR>();
item->data = pos;
pos->x = item->pos.xPos;
pos->y = item->pos.yPos;
pos->z = item->pos.zPos;
pos->roomNumber = item->roomNumber;
}
void DeathSlideCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll)
{
if (!(TrInput & IN_ACTION) || l->gravityStatus || Lara.gunStatus != LG_NO_ARMS || l->currentAnimState != LS_STOP)
return;
ITEM_INFO* item = &g_Level.Items[itemNumber];
if (item->status != ITEM_NOT_ACTIVE)
return;
if (TestLaraPosition(&DeathSlideBounds, item, LaraItem))
{
AlignLaraPosition(&DeathSlidePosition, item, LaraItem);
Lara.gunStatus = LG_HANDS_BUSY;
l->goalAnimState = LS_ZIPLINE_RIDE;
do
AnimateItem(l);
while (l->currentAnimState != LS_GRABBING);
if (!item->active)
AddActiveItem(itemNumber);
item->status = ITEM_ACTIVE;
item->flags |= ONESHOT;
}
}
void ControlDeathSlide(short itemNumber)
{
ITEM_INFO* item = &g_Level.Items[itemNumber];
if (item->status == ITEM_ACTIVE)
{
if (!(item->flags & ONESHOT))
{
GAME_VECTOR* old = (GAME_VECTOR*)item->data;
item->pos.xPos = old->x;
item->pos.yPos = old->y;
item->pos.zPos = old->z;
if (old->roomNumber != item->roomNumber)
ItemNewRoom(itemNumber, old->roomNumber);
item->status = ITEM_NOT_ACTIVE;
item->currentAnimState = item->goalAnimState = 1;
item->animNumber = Objects[item->objectNumber].animIndex;
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
RemoveActiveItem(itemNumber);
return;
}
if (item->currentAnimState == 1)
{
AnimateItem(item);
return;
}
AnimateItem(item);
if (item->fallspeed < 100)
item->fallspeed += 5;
float c = phd_cos(item->pos.yRot);
float s = phd_sin(item->pos.yRot);
item->pos.zPos += item->fallspeed * c;
item->pos.xPos += item->fallspeed * s;
item->pos.yPos += item->fallspeed / 4;
short roomNumber = item->roomNumber;
GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
if (roomNumber != item->roomNumber)
ItemNewRoom(itemNumber, roomNumber);
if (LaraItem->currentAnimState == LS_ZIPLINE_RIDE)
{
LaraItem->pos.xPos = item->pos.xPos;
LaraItem->pos.yPos = item->pos.yPos;
LaraItem->pos.zPos = item->pos.zPos;
}
int x = item->pos.xPos + 1024 * s;
int y = item->pos.yPos + 64;
int z = item->pos.zPos + 1024 * c;
FLOOR_INFO* floor = GetFloor(x, y, z, &roomNumber);
if (GetFloorHeight(floor, x, y, z) <= y + 256 || GetCeiling(floor, x, y, z) >= y - 256)
{
if (LaraItem->currentAnimState == LS_ZIPLINE_RIDE)
{
LaraItem->goalAnimState = LS_JUMP_FORWARD;
AnimateLara(LaraItem);
LaraItem->gravityStatus = true;
LaraItem->speed = item->fallspeed;
LaraItem->fallspeed = item->fallspeed / 4;
}
// TODO: sounds
// Stop
SoundEffect(SFX_COGS_ROME, &item->pos, 0);
RemoveActiveItem(itemNumber);
item->status = ITEM_NOT_ACTIVE;
item->flags -= ONESHOT;
}
else
{
// Whizz
SoundEffect(SFX_GOD_HEAD_LASER_LOOPS, &item->pos, 0);
}
}
}