2020-05-23 14:26:06 +02:00
|
|
|
#include "framework.h"
|
|
|
|
#include "chaffFX.h"
|
2021-09-08 18:07:48 +03:00
|
|
|
#include "effects\bubble.h"
|
|
|
|
#include "effects\tomb4fx.h"
|
2021-09-19 23:41:26 +03:00
|
|
|
#include "control/control.h"
|
2020-05-23 14:26:06 +02:00
|
|
|
#include "lara.h"
|
2021-09-16 05:06:03 +03:00
|
|
|
#include "animation.h"
|
2020-05-28 22:17:55 +02:00
|
|
|
#include "level.h"
|
2020-05-28 16:48:36 +02:00
|
|
|
#include "smoke.h"
|
2020-05-28 22:17:55 +02:00
|
|
|
#include "spark.h"
|
2021-09-08 18:31:35 +03:00
|
|
|
#include "Specific\prng.h"
|
2021-09-25 16:00:30 +03:00
|
|
|
#include "items.h"
|
2021-09-25 11:27:47 +02:00
|
|
|
|
2020-05-23 14:26:06 +02:00
|
|
|
#define MAX_TRIGGER_RANGE 0x4000
|
2021-08-30 18:03:21 +03:00
|
|
|
using namespace TEN::Math::Random;
|
2020-05-23 14:26:06 +02:00
|
|
|
|
|
|
|
void TriggerChaffEffects(int flareAge)
|
|
|
|
{
|
|
|
|
PHD_VECTOR vect;
|
|
|
|
vect.x = 8;
|
|
|
|
vect.y = 36;
|
|
|
|
vect.z = 32;
|
|
|
|
GetLaraJointPosition(&vect, LM_LHAND);
|
|
|
|
|
|
|
|
PHD_VECTOR pos;
|
|
|
|
pos.x = vect.x;
|
|
|
|
pos.y = vect.y;
|
|
|
|
pos.z = vect.z;
|
|
|
|
|
|
|
|
vect.x = 8;
|
|
|
|
vect.y = 36;
|
|
|
|
vect.z = 1024 + (GetRandomDraw() & 255);
|
|
|
|
GetLaraJointPosition(&vect, LM_LHAND);
|
|
|
|
|
|
|
|
PHD_VECTOR vel;
|
|
|
|
vel.x = vect.x - pos.x;
|
|
|
|
vel.y = vect.y - pos.y;
|
|
|
|
vel.z = vect.z - pos.z;
|
|
|
|
|
2020-07-21 09:56:47 +02:00
|
|
|
TriggerChaffEffects(LaraItem, &pos, &vel, LaraItem->speed, (bool)(g_Level.Rooms[LaraItem->roomNumber].flags & ENV_FLAG_WATER),flareAge);
|
2020-05-23 14:26:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void TriggerChaffEffects(ITEM_INFO* Item,int age)
|
|
|
|
{
|
|
|
|
Matrix world
|
|
|
|
= Matrix::CreateTranslation(-6, 6, 32)
|
|
|
|
* Matrix::CreateFromYawPitchRoll(TO_RAD(Item->pos.yRot), TO_RAD(Item->pos.xRot), TO_RAD(Item->pos.zRot));
|
|
|
|
|
|
|
|
PHD_VECTOR pos;
|
|
|
|
pos.x = Item->pos.xPos + world.Translation().x;
|
|
|
|
pos.y = Item->pos.yPos + world.Translation().y;
|
|
|
|
pos.z = Item->pos.zPos + world.Translation().z;
|
|
|
|
|
|
|
|
world
|
|
|
|
= Matrix::CreateTranslation(-6, 6, 32)
|
|
|
|
* Matrix::CreateTranslation((GetRandomDraw() & 127) - 64, (GetRandomDraw() & 127) - 64, (GetRandomDraw() & 511) + 512)
|
|
|
|
* Matrix::CreateFromYawPitchRoll(TO_RAD(Item->pos.yRot), TO_RAD(Item->pos.xRot), TO_RAD(Item->pos.zRot));
|
|
|
|
|
|
|
|
PHD_VECTOR vel;
|
|
|
|
vel.x = world.Translation().x;
|
|
|
|
vel.y = world.Translation().y;
|
|
|
|
vel.z = world.Translation().z;
|
|
|
|
|
2020-07-21 09:56:47 +02:00
|
|
|
TriggerChaffEffects(Item, &pos, &vel, Item->speed, (bool)(g_Level.Rooms[Item->roomNumber].flags & ENV_FLAG_WATER),age);
|
2020-05-23 14:26:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void TriggerChaffEffects(ITEM_INFO* item, PHD_VECTOR* pos, PHD_VECTOR* vel, int speed, bool isUnderwater,int age)
|
|
|
|
{
|
2021-09-17 16:07:53 +03:00
|
|
|
int numSparks = (int)GenerateFloat(2, 5);
|
2020-05-23 14:26:06 +02:00
|
|
|
for (int i = 0; i < numSparks; i++)
|
|
|
|
{
|
|
|
|
long dx, dz;
|
|
|
|
|
|
|
|
dx = item->pos.xPos - pos->x;
|
|
|
|
dz = item->pos.zPos - pos->z;
|
|
|
|
|
|
|
|
if (dx < -MAX_TRIGGER_RANGE || dx > MAX_TRIGGER_RANGE || dz < -MAX_TRIGGER_RANGE || dz > MAX_TRIGGER_RANGE)
|
|
|
|
return;
|
|
|
|
|
|
|
|
CVECTOR color;
|
|
|
|
color.r = 255;
|
|
|
|
color.g = (GetRandomDraw() & 127) + 64;
|
|
|
|
color.b = 192 - color.g;
|
|
|
|
|
2020-05-28 22:17:55 +02:00
|
|
|
TriggerChaffSparkles(pos, vel, &color,age,item);
|
2020-05-23 14:26:06 +02:00
|
|
|
if (isUnderwater)
|
|
|
|
{
|
|
|
|
TriggerChaffBubbles(pos, item->roomNumber);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Vector3 position = Vector3(pos->x,pos->y,pos->z);
|
|
|
|
Vector3 direction = Vector3(vel->x, vel->y, vel->z);
|
|
|
|
direction.Normalize();
|
2021-08-30 18:03:21 +03:00
|
|
|
TEN::Effects::Smoke::TriggerFlareSmoke(position+(direction*20), direction,age,item->roomNumber);
|
2020-05-23 14:26:06 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-05-28 22:17:55 +02:00
|
|
|
void TriggerChaffSparkles (PHD_VECTOR* pos, PHD_VECTOR* vel, CVECTOR* color,int age,ITEM_INFO* item)
|
2020-05-23 14:26:06 +02:00
|
|
|
{
|
2020-05-28 22:17:55 +02:00
|
|
|
/*
|
2020-05-23 14:26:06 +02:00
|
|
|
SPARKS* sparkle;
|
|
|
|
|
|
|
|
sparkle = &Sparks[GetFreeSpark()];
|
|
|
|
|
|
|
|
sparkle->on = true;
|
|
|
|
|
|
|
|
sparkle->sR = 255;
|
|
|
|
sparkle->sG = 255;
|
|
|
|
sparkle->sB = 255;
|
|
|
|
|
|
|
|
sparkle->dR = color->r;
|
|
|
|
sparkle->dG = color->g;
|
|
|
|
sparkle->dB = color->b;
|
|
|
|
|
|
|
|
sparkle->colFadeSpeed = 3;
|
|
|
|
sparkle->fadeToBlack = 5;
|
|
|
|
sparkle->sLife = sparkle->life = 10;
|
2021-10-27 19:00:30 +03:00
|
|
|
sparkle->transType = TransTypeEnum::COLADD;
|
2020-05-23 14:26:06 +02:00
|
|
|
sparkle->dynamic = true;
|
|
|
|
|
|
|
|
sparkle->x = pos->x + (GetRandomDraw() & 7) - 3;
|
|
|
|
sparkle->y = pos->y + (GetRandomDraw() & 7) - 3;
|
|
|
|
sparkle->z = pos->z + (GetRandomDraw() & 7) - 3;
|
|
|
|
sparkle->xVel = vel->x + ((GetRandomDraw() & 255) - 128);
|
|
|
|
sparkle->yVel = vel->y + ((GetRandomDraw() & 255) - 128);
|
|
|
|
sparkle->zVel = vel->z + ((GetRandomDraw() & 255) - 128);
|
|
|
|
sparkle->friction = 2 | (2 << 4);
|
|
|
|
sparkle->scalar = 1;
|
|
|
|
sparkle->size = sparkle->sSize = (GetRandomDraw() & 3) + 4;
|
|
|
|
sparkle->dSize = (GetRandomDraw() & 1) + 1;
|
|
|
|
sparkle->gravity = sparkle->maxYvel = 0;
|
|
|
|
sparkle->flags = SP_SCALE;
|
2020-05-28 22:17:55 +02:00
|
|
|
*/
|
2021-08-30 18:03:21 +03:00
|
|
|
TEN::Effects::Spark::TriggerFlareSparkParticles(pos, vel,color,item->roomNumber);
|
2020-05-23 14:26:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void TriggerChaffSmoke(PHD_VECTOR* pos, PHD_VECTOR* vel, int speed, bool moving, bool wind)
|
|
|
|
{
|
|
|
|
SMOKE_SPARKS* smoke;
|
|
|
|
|
|
|
|
int rnd = 0;
|
|
|
|
BYTE trans, size;
|
|
|
|
|
|
|
|
smoke = &SmokeSparks[GetFreeSmokeSpark()];
|
|
|
|
|
|
|
|
smoke->on = true;
|
|
|
|
|
|
|
|
smoke->sShade = 0;
|
|
|
|
if (moving)
|
|
|
|
{
|
2021-08-30 15:13:18 -05:00
|
|
|
trans = (speed << 7) >> 5;
|
2020-05-23 14:26:06 +02:00
|
|
|
smoke->dShade = trans;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
smoke->dShade = 64 + (GetRandomDraw() & 7);
|
|
|
|
|
|
|
|
smoke->colFadeSpeed = 4 + (GetRandomDraw() & 3);
|
|
|
|
smoke->fadeToBlack = 4;
|
|
|
|
|
2021-08-30 15:13:18 -05:00
|
|
|
rnd = (GetRandomControl() & 3) - (speed >> 12) + 20;
|
2020-05-23 14:26:06 +02:00
|
|
|
if (rnd < 9)
|
|
|
|
{
|
|
|
|
smoke->life = 9;
|
|
|
|
smoke->sLife = 9;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
smoke->life = rnd;
|
|
|
|
smoke->sLife = rnd;
|
|
|
|
}
|
|
|
|
|
2021-09-25 16:03:28 -05:00
|
|
|
smoke->transType = TransTypeEnum::COLADD;
|
2020-05-23 14:26:06 +02:00
|
|
|
|
|
|
|
smoke->x = pos->x + (GetRandomControl() & 7) - 3;
|
|
|
|
smoke->y = pos->y + (GetRandomControl() & 7) - 3;
|
|
|
|
smoke->z = pos->z + (GetRandomControl() & 7) - 3;
|
|
|
|
smoke->xVel = vel->x + ((GetRandomDraw() & 63) - 32);
|
|
|
|
smoke->yVel = vel->y;
|
|
|
|
smoke->zVel = vel->z + ((GetRandomDraw() & 63) - 32);
|
|
|
|
smoke->friction = 4;
|
|
|
|
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
{
|
|
|
|
smoke->flags = SP_EXPDEF | SP_ROTATE | SP_DEF | SP_SCALE;
|
|
|
|
smoke->rotAng = (GetRandomControl() & 0xFFF);
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
smoke->rotAdd = (GetRandomControl() & 7) - 24;
|
|
|
|
else
|
|
|
|
smoke->rotAdd = (GetRandomControl() & 7) + 24;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
smoke->flags = SP_EXPDEF | SP_DEF | SP_SCALE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (wind)
|
|
|
|
smoke->flags |= SP_WIND;
|
|
|
|
|
|
|
|
smoke->scalar = 1;
|
|
|
|
smoke->gravity = (GetRandomControl() & 3) - 4;
|
|
|
|
smoke->maxYvel = 0;
|
2021-08-30 15:13:18 -05:00
|
|
|
size = (GetRandomControl() & 7) + (speed >> 7) + 32;
|
|
|
|
smoke->sSize = size >> 2;
|
2020-05-23 14:26:06 +02:00
|
|
|
smoke->size = smoke->dSize = size;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void TriggerChaffBubbles(PHD_VECTOR* pos, int FlareRoomNumber)
|
|
|
|
{
|
|
|
|
|
|
|
|
BUBBLE_STRUCT& bubble = Bubbles[GetFreeBubble()];
|
|
|
|
bubble = {};
|
|
|
|
bubble.active = true;
|
|
|
|
bubble.size = 0;
|
|
|
|
bubble.age = 0;
|
2021-09-17 16:07:53 +03:00
|
|
|
bubble.speed = GenerateFloat(4, 16);
|
2020-05-23 14:26:06 +02:00
|
|
|
bubble.sourceColor = Vector4(0, 0, 0, 0);
|
2021-09-17 16:07:53 +03:00
|
|
|
float shade = GenerateFloat(0.3, 0.8);
|
2020-05-23 14:26:06 +02:00
|
|
|
bubble.destinationColor = Vector4(shade, shade, shade, 0.8);
|
|
|
|
bubble.color = bubble.sourceColor;
|
2021-09-17 16:07:53 +03:00
|
|
|
bubble.destinationSize = GenerateFloat(32, 96);
|
2020-05-23 14:26:06 +02:00
|
|
|
bubble.spriteNum = SPR_BUBBLES;
|
|
|
|
bubble.rotation = 0;
|
|
|
|
bubble.worldPosition = Vector3(pos->x, pos->y, pos->z);
|
|
|
|
float maxAmplitude = 64;
|
2021-09-17 16:07:53 +03:00
|
|
|
bubble.amplitude = Vector3(GenerateFloat(-maxAmplitude, maxAmplitude), GenerateFloat(-maxAmplitude, maxAmplitude), GenerateFloat(-maxAmplitude, maxAmplitude));
|
2020-05-23 14:26:06 +02:00
|
|
|
bubble.worldPositionCenter = bubble.worldPosition;
|
2021-09-17 16:07:53 +03:00
|
|
|
bubble.wavePeriod = Vector3(GenerateFloat(-3.14, 3.14), GenerateFloat(-3.14, 3.14), GenerateFloat(-3.14, 3.14));
|
|
|
|
bubble.waveSpeed = Vector3(1 / GenerateFloat(8, 16), 1 / GenerateFloat(8, 16), 1 / GenerateFloat(8, 16));
|
2020-05-23 14:26:06 +02:00
|
|
|
bubble.roomNumber = FlareRoomNumber;
|
|
|
|
}
|