2020-06-04 11:00:08 +02:00
|
|
|
#include "framework.h"
|
|
|
|
#include "tr5_electricity.h"
|
2021-09-08 18:07:48 +03:00
|
|
|
#include "effects\effects.h"
|
2021-09-19 23:41:26 +03:00
|
|
|
#include "control/control.h"
|
2021-09-19 18:29:25 +03:00
|
|
|
#include "level.h"
|
2020-06-04 11:00:08 +02:00
|
|
|
#include "setup.h"
|
2021-09-16 05:06:03 +03:00
|
|
|
#include "animation.h"
|
2020-06-04 11:00:08 +02:00
|
|
|
#include "lara.h"
|
2020-08-16 16:01:58 -05:00
|
|
|
#include "lara_collide.h"
|
2021-09-08 18:19:06 +03:00
|
|
|
#include "Sound\sound.h"
|
2020-08-07 22:42:28 -03:00
|
|
|
#include "sphere.h"
|
|
|
|
#include "traps.h"
|
2021-09-22 05:51:25 +02:00
|
|
|
#include "Game/effects/lara_burn.h"
|
2021-09-25 16:00:30 +03:00
|
|
|
#include "items.h"
|
2021-09-25 11:27:47 +02:00
|
|
|
|
2021-09-22 05:51:25 +02:00
|
|
|
using namespace TEN::Effects::Fire;
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
void TriggerElectricityWiresSparks(int x, int z, byte objNum, byte node, int flags)
|
|
|
|
{
|
|
|
|
SPARKS* spark = &Sparks[GetFreeSpark()];
|
|
|
|
spark->on = true;
|
|
|
|
spark->sR = 255;
|
|
|
|
spark->sG = 255;
|
|
|
|
spark->sB = 255;
|
|
|
|
spark->dR = 0;
|
|
|
|
spark->dG = (GetRandomControl() & 0x7F) + 64;
|
|
|
|
spark->dB = 255;
|
|
|
|
|
|
|
|
if (flags)
|
|
|
|
{
|
|
|
|
spark->colFadeSpeed = 1;
|
|
|
|
spark->fadeToBlack = 0;
|
|
|
|
spark->life = spark->sLife = 4;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->colFadeSpeed = 3;
|
|
|
|
spark->fadeToBlack = 4;
|
|
|
|
spark->life = spark->sLife = 16;
|
|
|
|
}
|
|
|
|
|
|
|
|
spark->fxObj = objNum;
|
2021-09-25 16:03:28 -05:00
|
|
|
spark->transType = TransTypeEnum::COLADD;
|
2020-06-04 11:00:08 +02:00
|
|
|
spark->flags = SP_ITEM | SP_NODEATTACH | SP_SCALE | SP_DEF;
|
|
|
|
spark->nodeNumber = node;
|
|
|
|
spark->x = x;
|
|
|
|
spark->z = z;
|
|
|
|
spark->y = 0;
|
|
|
|
|
|
|
|
if (flags)
|
|
|
|
{
|
|
|
|
spark->xVel = 0;
|
|
|
|
spark->yVel = 0;
|
|
|
|
spark->zVel = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->xVel = (GetRandomControl() & 0x1FF) - 256;
|
|
|
|
spark->yVel = GetRandomControl() - 64;
|
|
|
|
spark->zVel = (GetRandomControl() & 0x1FF) - 256;
|
|
|
|
}
|
|
|
|
spark->friction = 51;
|
|
|
|
spark->maxYvel = 0;
|
|
|
|
spark->gravity = 0;
|
|
|
|
|
|
|
|
if (flags)
|
|
|
|
{
|
|
|
|
spark->scalar = 1;
|
|
|
|
spark->def = Objects[ID_DEFAULT_SPRITES].meshIndex + 11;
|
|
|
|
spark->size = spark->sSize = (GetRandomControl() & 0x1F) + 160;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->scalar = 0;
|
|
|
|
spark->def = Objects[ID_DEFAULT_SPRITES].meshIndex + 14;
|
|
|
|
spark->size = spark->sSize = (GetRandomControl() & 7) + 8;
|
|
|
|
}
|
|
|
|
|
2020-09-12 13:49:09 +02:00
|
|
|
spark->dSize = spark->size / 2;
|
2020-06-04 11:00:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void TriggerLaraElectricitySparks(int flame)
|
|
|
|
{
|
|
|
|
PHD_VECTOR pos;
|
|
|
|
pos.x = 0;
|
|
|
|
pos.y = 0;
|
|
|
|
pos.z = 0;
|
|
|
|
GetLaraJointPosition(&pos, GetRandomControl() % 15);
|
|
|
|
|
|
|
|
SPARKS* spark = &Sparks[GetFreeSpark()];
|
|
|
|
|
|
|
|
spark->on = 1;
|
|
|
|
spark->dR = 0;
|
|
|
|
spark->colFadeSpeed = 8;
|
|
|
|
byte color = (GetRandomControl() & 0x3F) - 64;
|
|
|
|
spark->sR = color;
|
|
|
|
spark->sB = color;
|
|
|
|
spark->sG = color;
|
|
|
|
spark->dB = color;
|
2020-10-17 13:23:01 -05:00
|
|
|
spark->dG = color / 2;
|
2021-09-25 16:03:28 -05:00
|
|
|
spark->transType = TransTypeEnum::COLADD;
|
2020-06-04 11:00:08 +02:00
|
|
|
spark->fadeToBlack = 4;
|
|
|
|
spark->life = 12;
|
|
|
|
spark->sLife = 12;
|
|
|
|
spark->x = pos.x;
|
|
|
|
spark->y = pos.y;
|
|
|
|
spark->z = pos.z;
|
|
|
|
spark->xVel = 2 * (GetRandomControl() & 0x1FF) - 512;
|
|
|
|
spark->yVel = 2 * (GetRandomControl() & 0x1FF) - 512;
|
|
|
|
spark->zVel = 2 * (GetRandomControl() & 0x1FF) - 512;
|
|
|
|
spark->friction = 51;
|
|
|
|
spark->maxYvel = 0;
|
|
|
|
spark->gravity = 0;
|
|
|
|
spark->flags = SP_NONE;
|
|
|
|
|
|
|
|
if (flame)
|
|
|
|
TriggerFireFlame(pos.x, pos.y, pos.z, -1, 254);
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool ElectricityWireCheckDeadlyBounds(PHD_VECTOR* pos, short delta)
|
|
|
|
{
|
|
|
|
if (pos->x + delta >= DeadlyBounds[0] && pos->x - delta <= DeadlyBounds[1]
|
|
|
|
&& pos->y + delta >= DeadlyBounds[2] && pos->y - delta <= DeadlyBounds[3]
|
|
|
|
&& pos->z + delta >= DeadlyBounds[4] && pos->z - delta <= DeadlyBounds[5])
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ElectricityWiresControl(short itemNumber)
|
|
|
|
{
|
|
|
|
bool flag = false;
|
|
|
|
int counter = 3;
|
|
|
|
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
if (item->itemFlags[0] > 2)
|
|
|
|
{
|
|
|
|
TriggerDynamicLight(
|
|
|
|
LaraItem->pos.xPos,
|
|
|
|
LaraItem->pos.yPos,
|
|
|
|
LaraItem->pos.zPos,
|
|
|
|
item->itemFlags[0],
|
|
|
|
0,
|
|
|
|
(GetRandomControl() & 0x1F) + 8 * item->itemFlags[0],
|
|
|
|
(GetRandomControl() & 0x1F) + 8 * item->itemFlags[0]);
|
|
|
|
|
|
|
|
item->itemFlags[0] -= 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (TriggerActive(item))
|
|
|
|
{
|
2021-05-26 06:04:32 +02:00
|
|
|
SoundEffect(SFX_TR5_ELECTRIC_WIRES, &item->pos, 0);
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
counter = (abs(LaraItem->pos.xPos - item->pos.xPos) > 2048)
|
|
|
|
+ (abs(LaraItem->pos.zPos - item->pos.zPos) > 2048)
|
|
|
|
+ (abs(LaraItem->pos.yPos - item->pos.yPos) > 4096);
|
|
|
|
|
|
|
|
int x = (GetRandomControl() & 0x1F) - 16;
|
|
|
|
int z = (GetRandomControl() & 0x1F) - 16;
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++)
|
|
|
|
{
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
TriggerElectricityWiresSparks(x, z, itemNumber, i + 2, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(GlobalCounter & 3))
|
|
|
|
{
|
|
|
|
TriggerElectricityWiresSparks(0, 0, itemNumber, 2, 1);
|
|
|
|
TriggerElectricityWiresSparks(0, 0, itemNumber, 3, 1);
|
|
|
|
TriggerElectricityWiresSparks(0, 0, itemNumber, 4, 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
flag = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
AnimateItem(item);
|
|
|
|
|
|
|
|
if (!Lara.burn && !flag && !counter)
|
|
|
|
{
|
|
|
|
GetLaraDeadlyBounds();
|
|
|
|
|
|
|
|
for (int i = 2; i < 28; i += 3)
|
|
|
|
{
|
|
|
|
PHD_VECTOR pos;
|
|
|
|
pos.x = 0;
|
|
|
|
pos.y = 0;
|
|
|
|
pos.z = 0;
|
|
|
|
|
|
|
|
GetJointAbsPosition(item, &pos, i);
|
|
|
|
|
|
|
|
if (ElectricityWireCheckDeadlyBounds(&pos, item->triggerFlags))
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 48; i++)
|
|
|
|
TriggerLaraElectricitySparks(0);
|
|
|
|
|
|
|
|
item->itemFlags[0] = 28;
|
|
|
|
LaraBurn();
|
|
|
|
Lara.burnBlue = 1;
|
|
|
|
Lara.burnCount = 48;
|
|
|
|
LaraItem->hitPoints = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int i = 8;
|
|
|
|
int j = 0;
|
|
|
|
counter = GlobalCounter % 3;
|
|
|
|
short roomNumber = item->roomNumber;
|
|
|
|
bool water = false;
|
|
|
|
|
|
|
|
for (int i = 8; i < 27; i += 9, j++)
|
|
|
|
{
|
|
|
|
PHD_VECTOR pos;
|
|
|
|
pos.x = 0;
|
|
|
|
pos.y = 0;
|
|
|
|
pos.z = 256;
|
|
|
|
GetJointAbsPosition(item, &pos, i);
|
|
|
|
|
|
|
|
if (GetRandomControl() & 1 && !flag)
|
|
|
|
{
|
2020-10-17 13:23:01 -05:00
|
|
|
TriggerDynamicLight(pos.x, pos.y, pos.z, 12, 0, ((GetRandomControl() & 0x3F) + 128) / 2, (GetRandomControl() & 0x3F) + 128);
|
2020-06-04 11:00:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
roomNumber = item->roomNumber;
|
|
|
|
GetFloor(pos.x, pos.y, pos.z, &roomNumber);
|
2020-07-21 09:56:47 +02:00
|
|
|
ROOM_INFO* r = &g_Level.Rooms[roomNumber];
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
if (r->flags & ENV_FLAG_WATER)
|
|
|
|
{
|
|
|
|
if (counter == j)
|
|
|
|
{
|
2020-09-21 15:20:51 +02:00
|
|
|
SetupRipple(pos.x, r->maxceiling, pos.z, (GetRandomControl() & 7) + 32, 16, Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_RIPPLES);
|
2020-06-04 11:00:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
water = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!flag && !Lara.burn)
|
|
|
|
{
|
|
|
|
if (water)
|
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
int flipNumber = g_Level.Rooms[roomNumber].flipNumber;
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
PHD_VECTOR pos1;
|
|
|
|
pos1.x = 0;
|
|
|
|
pos1.y = 0;
|
|
|
|
pos1.z = 0;
|
|
|
|
GetLaraJointPosition(&pos1, LM_LFOOT);
|
|
|
|
|
|
|
|
short roomNumber1 = LaraItem->roomNumber;
|
|
|
|
GetFloor(pos1.x, pos1.y, pos1.z, &roomNumber1);
|
|
|
|
|
|
|
|
PHD_VECTOR pos2;
|
|
|
|
pos2.x = 0;
|
|
|
|
pos2.y = 0;
|
|
|
|
pos2.z = 0;
|
|
|
|
GetLaraJointPosition(&pos2, LM_RFOOT);
|
|
|
|
|
|
|
|
short roomNumber2 = LaraItem->roomNumber;
|
|
|
|
GetFloor(pos2.x, pos2.y, pos2.z, &roomNumber2);
|
|
|
|
|
2020-07-21 09:56:47 +02:00
|
|
|
if (g_Level.Rooms[roomNumber1].flipNumber == flipNumber || g_Level.Rooms[roomNumber2].flipNumber == flipNumber)
|
2020-06-04 11:00:08 +02:00
|
|
|
{
|
|
|
|
if (LaraItem->hitPoints > 32)
|
|
|
|
{
|
2021-05-26 06:04:32 +02:00
|
|
|
SoundEffect(SFX_TR4_LARA_ELECTRIC_CRACKLES, &LaraItem->pos, 0);
|
2020-06-04 11:00:08 +02:00
|
|
|
TriggerLaraElectricitySparks(0);
|
|
|
|
TriggerLaraElectricitySparks(1);
|
|
|
|
TriggerDynamicLight(pos1.x, pos1.y, pos1.z, 8, 0, GetRandomControl() & 0x7F, (GetRandomControl() & 0x3F) + 128);
|
|
|
|
LaraItem->hitPoints -= 10;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
item->itemFlags[0] = 28;
|
|
|
|
LaraBurn();
|
|
|
|
Lara.burnBlue = 1;
|
|
|
|
Lara.burnCount = 48;
|
|
|
|
LaraItem->hitPoints = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|