TombEngine/TR5Main/Objects/TR3/Vehicles/biggun.cpp
2020-09-11 12:54:30 -05:00

242 lines
5.2 KiB
C++

#include "framework.h"
#include "biggun.h"
#include "items.h"
#include "level.h"
#include "collide.h"
#include "input.h"
#include "lara.h"
#include "lara_flare.h"
#include "sound.h"
#include "sphere.h"
#include "effect2.h"
#include "lara_struct.h"
#include "tomb4fx.h"
#include "draw.h"
int fireCount = 0;
void FireBigGun(ITEM_INFO *obj)
{
short itemNumber = CreateItem();
if (itemNumber != NO_ITEM)
{
BIGGUNINFO *gun = (BIGGUNINFO*)obj->data;
ITEM_INFO* item = &g_Level.Items[itemNumber];
item->objectNumber = ID_ROCKET;
item->roomNumber = LaraItem->roomNumber;
PHD_VECTOR pos;
pos.x = 0;
pos.y = 0;
pos.z = 520;
GetJointAbsPosition(obj, &pos, 2);
item->pos.xPos = pos.x;
item->pos.yPos = pos.y;
item->pos.zPos = pos.z;
InitialiseItem(itemNumber);
item->pos.xRot = -((gun->xRot - 32) * (ANGLE(1)));
item->pos.yRot = obj->pos.yRot;
item->pos.zRot = 0;
item->speed = 512 >> 5;
item->itemFlags[0] = 1;
AddActiveItem(itemNumber);
SmokeCountL = 32;
SmokeWeapon = WEAPON_ROCKET_LAUNCHER;
for (int i = 0; i < 5; i++)
TriggerGunSmoke(pos.x, pos.y, pos.z, 0, 0, 0, 1, WEAPON_ROCKET_LAUNCHER, 32);
SoundEffect(SFX_EXPLOSION1, 0, 0);
}
}
static int CanUseGun(ITEM_INFO *obj, ITEM_INFO *lara)
{
int dist;
long x, z;
if ((!(TrInput & IN_ACTION))
|| (Lara.gunStatus != LG_NO_ARMS)
|| (lara->gravityStatus))
return 0;
x = lara->pos.xPos - obj->pos.xPos;
z = lara->pos.zPos - obj->pos.zPos;
dist = SQUARE(x) + SQUARE(z);
if (dist > 30000)
return 0;
else
return 1;
}
void BigGunInitialise(short itemNum)
{
ITEM_INFO *obj;
BIGGUNINFO *gun;
obj = &g_Level.Items[itemNum];
gun = (BIGGUNINFO*)malloc(sizeof(BIGGUNINFO));
obj->data = malloc(sizeof(BIGGUNINFO));
gun->flags = 0;
fireCount = 0;
gun->yRot = 30;
gun->yRot = 0;
gun->startYRot = obj->pos.yRot;
}
void BigGunCollision(short itemNum, ITEM_INFO* lara, COLL_INFO* coll)
{
ITEM_INFO* obj;
BIGGUNINFO *gun;
if (lara->hitPoints <= 0 || Lara.Vehicle != NO_ITEM)
return;
obj = &g_Level.Items[itemNum];
if (CanUseGun(obj, lara))
{
Lara.Vehicle = itemNum;
if (Lara.gunType == WEAPON_FLARE)
{
CreateFlare(ID_FLARE_ITEM, 0);
undraw_flare_meshes();
Lara.flareControlLeft = false;
Lara.requestGunType = WEAPON_NONE;
Lara.gunType = WEAPON_NONE;
}
Lara.gunStatus = LG_HANDS_BUSY;
lara->pos.xPos = obj->pos.xPos;
lara->pos.xRot = obj->pos.xRot;
lara->pos.yPos = obj->pos.yPos;
lara->pos.yRot = obj->pos.yRot;
lara->pos.zPos = obj->pos.zPos;
lara->pos.zRot = obj->pos.zRot;
lara->animNumber = Objects[ID_BIGGUN_ANIMS].animIndex + 0;
lara->frameNumber = g_Level.Anims[Objects[ID_BIGGUN_ANIMS].animIndex].frameBase;
lara->currentAnimState = 0;
lara->goalAnimState = 0;
gun = (BIGGUNINFO*)obj->data;
gun->flags = 0;
gun->xRot = 30;
}
else
ObjectCollision(itemNum, lara, coll);
}
int BigGunControl(COLL_INFO *coll)
{
BIGGUNINFO *gun;
ITEM_INFO *obj;
ITEM_INFO *lara;
lara = LaraItem;
obj = &g_Level.Items[Lara.Vehicle];
gun = (BIGGUNINFO *)obj->data;
if (gun->flags & 1)
{
if ((lara->hitPoints <= 0) || (TrInput & IN_ROLL))
{
gun->flags = 2;
}
else if ((TrInput & IN_ACTION) && fireCount == 0)
{
FireBigGun(obj);
fireCount = 26;
}
else
{
if (TrInput & IN_LEFT)
gun->yRot -= 8;
else
if (TrInput & IN_RIGHT)
gun->yRot += 8;
if ((TrInput & IN_FORWARD) && (gun->xRot < 59))
gun->xRot++;
else if ((TrInput & IN_BACK) && (gun->xRot))
gun->xRot--;
}
}
if (gun->flags & 2)
{
if (gun->xRot < 30)
gun->xRot++;
else if (gun->xRot > 30)
gun->xRot--;
else
{
lara->animNumber = Objects[ID_BIGGUN_ANIMS].animIndex + 1;
lara->frameNumber = g_Level.Anims[Objects[ID_BIGGUN_ANIMS].animIndex + 1].frameBase;
lara->currentAnimState = 1;
lara->goalAnimState = 1;
gun->flags = 4;
}
}
switch (lara->currentAnimState)
{
case 0:
case 1:
AnimateItem(lara);
obj->animNumber = Objects[ID_BIGGUN].animIndex + (lara->animNumber - Objects[ID_BIGGUN_ANIMS].animIndex);
obj->frameNumber = g_Level.Anims[obj->animNumber].frameBase + (lara->frameNumber - g_Level.Anims[lara->animNumber].frameBase);
if ((gun->flags & 4) && lara->frameNumber == g_Level.Anims[lara->animNumber].frameEnd)
{
lara->animNumber = LA_STAND_SOLID;
lara->frameNumber = g_Level.Anims[lara->animNumber].frameBase;
lara->currentAnimState = LS_STOP;
lara->goalAnimState = LS_STOP;
Lara.Vehicle = NO_ITEM;
Lara.gunStatus = LG_NO_ARMS;
}
break;
case 2:
lara->animNumber = Objects[ID_BIGGUN_ANIMS].animIndex + 2;
lara->frameNumber = g_Level.Anims[Objects[ID_BIGGUN].animIndex + 2].frameBase + gun->xRot;
obj->animNumber = Objects[ID_BIGGUN].animIndex + (lara->animNumber - Objects[ID_BIGGUN_ANIMS].animIndex);
obj->frameNumber = g_Level.Anims[obj->animNumber].frameBase + (lara->frameNumber - g_Level.Anims[lara->animNumber].frameBase);
if (fireCount)
fireCount--;
gun->flags = 1;
break;
}
lara->pos.yRot = gun->startYRot + (gun->yRot * (ANGLE(1) >> 2));
obj->pos.yRot = gun->startYRot + (gun->yRot * (ANGLE(1) >> 2));
coll->enableSpaz = false;
coll->enableBaddiePush = false;
LaraBaddieCollision(lara, coll);
Camera.targetElevation = -ANGLE(15);
return 1;
}