TombEngine/TR5Main/Game/Lara/lara_flare.cpp

456 lines
9.8 KiB
C++
Raw Normal View History

#include "framework.h"
2020-08-09 22:09:14 -03:00
#include "lara_flare.h"
2021-11-07 04:54:48 +03:00
#include "lara_tests.h"
#include "level.h"
#include "setup.h"
2021-09-25 16:00:30 +03:00
#include "Sound/sound.h"
#include "animation.h"
2019-12-01 08:13:19 +01:00
#include "items.h"
2020-08-09 22:09:14 -03:00
#include "lara_fire.h"
2019-12-01 08:13:19 +01:00
#include "Lara.h"
#include "collide.h"
2021-09-25 16:00:30 +03:00
#include "effects/effects.h"
#include "effects/chaffFX.h"
#include "Specific/prng.h"
2021-09-25 11:27:47 +02:00
2020-05-23 14:26:06 +02:00
constexpr std::array<float, 28> FlareFlickerTable = { 0.7590,0.9880,0.8790,0.920,0.8020,0.7610,0.97878,0.8978,0.9983,0.934763,0.8485,0.762573,0.84642,0.7896,0.817634,0.923424,0.7589,0.81399,0.92834,0.9978,0.7610,0.97878,0.8978,0.9983,0.934763,0.8485,0.762573,0.74642 };
constexpr DirectX::SimpleMath::Vector3 FlareMainColor = Vector3(1,0.52947, 0.3921);
constexpr std::array<float, 28> FlareFlickerTableLow = { 0.7590,0.1880,0.0790,0.920,0.8020,0.07610,0.197878,0.38978,0.09983,0.00934763,0.8485,0.0762573,0.84642,0.7896,0.517634,0.0923424,0.7589,0.081399,0.92834,0.01978,0.17610,0.497878,0.8978,0.69983,0.934763,0.28485,0.1762573,0.374642 };
2021-08-30 18:03:21 +03:00
using namespace TEN::Math::Random;
2021-02-03 01:50:59 -03:00
void FlareControl(short itemNumber)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
ITEM_INFO* flare = &g_Level.Items[itemNumber];
2021-11-20 13:18:59 +11:00
if (TestLaraSwamp(flare))
{
KillItem(itemNumber);
return;
}
2021-11-20 13:18:59 +11:00
if (flare->fallspeed)
2019-12-01 08:13:19 +01:00
{
2021-11-20 13:18:59 +11:00
flare->pos.xRot += ANGLE(3.0f);
flare->pos.zRot += ANGLE(5.0f);
2019-12-01 08:13:19 +01:00
}
else
{
2021-11-20 13:18:59 +11:00
flare->pos.xRot = 0;
flare->pos.zRot = 0;
2019-12-01 08:13:19 +01:00
}
2021-11-20 13:18:59 +11:00
auto oldX = flare->pos.xPos;
auto oldY = flare->pos.yPos;
auto oldZ = flare->pos.zPos;
2019-12-01 08:13:19 +01:00
2021-11-20 13:18:59 +11:00
int xv = flare->speed * phd_sin(flare->pos.yRot);
int zv = flare->speed * phd_cos(flare->pos.yRot);
2019-12-01 08:13:19 +01:00
2021-11-20 13:18:59 +11:00
flare->pos.xPos += xv;
flare->pos.zPos += zv;
2019-12-01 08:13:19 +01:00
2021-11-20 13:18:59 +11:00
if (TestLaraWater(flare) || TestLaraSwamp(flare)) // TODO: Generic water/swamp test function.
2019-12-01 08:13:19 +01:00
{
2021-11-20 13:18:59 +11:00
flare->fallspeed += (5 - flare->fallspeed) / 2;
flare->speed += (5 - flare->speed) / 2;
2019-12-01 08:13:19 +01:00
}
else
2021-11-20 13:18:59 +11:00
flare->fallspeed += 6;
2020-05-23 14:26:06 +02:00
2021-11-20 13:18:59 +11:00
flare->pos.yPos += flare->fallspeed;
2019-12-01 08:13:19 +01:00
2021-11-20 13:18:59 +11:00
DoProjectileDynamics(itemNumber, oldX, oldY, oldZ, xv, flare->fallspeed, zv);
2020-05-23 14:26:06 +02:00
2021-11-20 13:18:59 +11:00
short& age = flare->data;
age &= 0x7FFF;
if (age >= FLARE_AGE)
2019-12-01 08:13:19 +01:00
{
2021-11-20 13:18:59 +11:00
if (!flare->fallspeed && !flare->speed)
{
KillItem(itemNumber);
return;
}
2019-12-01 08:13:19 +01:00
}
else
age++;
2020-05-23 14:26:06 +02:00
2021-11-20 13:18:59 +11:00
if (DoFlareLight((PHD_VECTOR*)&flare->pos, age))
2019-12-01 08:13:19 +01:00
{
2021-11-20 13:18:59 +11:00
TriggerChaffEffects(flare,age);
/* Hardcoded code */
2019-12-01 08:13:19 +01:00
age |= 0x8000;
}
2019-11-21 07:43:34 +01:00
}
2021-11-20 13:18:59 +11:00
void ready_flare(ITEM_INFO* lara)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
LaraInfo*& info = lara->data;
info->gunStatus = LG_NO_ARMS;
info->leftArm.zRot = 0;
info->leftArm.yRot = 0;
info->leftArm.xRot = 0;
info->rightArm.zRot = 0;
info->rightArm.yRot = 0;
info->rightArm.xRot = 0;
info->rightArm.lock = false;
info->leftArm.lock = false;
info->target = NULL;
2019-11-21 07:43:34 +01:00
}
2021-11-20 13:18:59 +11:00
void undraw_flare_meshes(ITEM_INFO* lara)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
LaraInfo*& info = lara->data;
info->meshPtrs[LM_LHAND] = Objects[ID_LARA_SKIN].meshIndex + LM_LHAND;
2019-11-21 07:43:34 +01:00
}
2019-12-15 16:19:01 +01:00
2021-11-20 13:18:59 +11:00
void draw_flare_meshes(ITEM_INFO * lara)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
LaraInfo*& info = lara->data;
info->meshPtrs[LM_LHAND] = Objects[ID_LARA_FLARE_ANIM].meshIndex + LM_LHAND;
2019-11-21 07:43:34 +01:00
}
2021-11-20 13:18:59 +11:00
void undraw_flare(ITEM_INFO* lara)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
LaraInfo*& info = lara->data;
info->flareControlLeft = true;
2019-12-01 08:13:19 +01:00
2021-11-20 13:18:59 +11:00
short frame1 = info->flareFrame;
short frame2 = info->leftArm.frameNumber;
2021-11-20 13:18:59 +11:00
if (lara->goalAnimState == LS_STOP
&& info->Vehicle == NO_ITEM)
2019-12-01 08:13:19 +01:00
{
2021-11-20 13:18:59 +11:00
if (lara->animNumber == LA_STAND_IDLE)
2019-12-01 08:13:19 +01:00
{
2021-11-20 13:18:59 +11:00
lara->animNumber = LA_DISCARD_FLARE;
frame1 = frame2 + g_Level.Anims[lara->animNumber].frameBase;
info->flareFrame = frame1;
lara->frameNumber = frame1;
2019-12-01 08:13:19 +01:00
}
2021-11-20 13:18:59 +11:00
if (lara->animNumber == LA_DISCARD_FLARE)
2019-12-01 08:13:19 +01:00
{
2021-11-20 13:18:59 +11:00
info->flareControlLeft = false;
2019-12-01 08:13:19 +01:00
2021-11-20 13:18:59 +11:00
if (frame1 >= g_Level.Anims[lara->animNumber].frameBase + 31)
2019-12-01 08:13:19 +01:00
{
2021-11-20 13:18:59 +11:00
info->requestGunType = info->lastGunType;
info->gunType = info->lastGunType;
info->gunStatus = LG_NO_ARMS;
2019-12-01 08:13:19 +01:00
2021-11-20 15:39:05 +11:00
InitialiseNewWeapon(lara);
2019-12-01 08:13:19 +01:00
2021-11-20 13:18:59 +11:00
info->target = NULL;
info->rightArm.lock = false;
info->leftArm.lock = false;
SetAnimation(lara, LA_STAND_SOLID);
info->flareFrame = g_Level.Anims[lara->animNumber].frameBase;
2019-12-01 08:13:19 +01:00
return;
}
2021-11-20 13:18:59 +11:00
info->flareFrame++;
2019-12-01 08:13:19 +01:00
}
}
2021-11-20 13:18:59 +11:00
else if (lara->animNumber == LA_DISCARD_FLARE)
2019-12-01 08:13:19 +01:00
{
2021-11-20 13:18:59 +11:00
lara->animNumber = LA_STAND_SOLID;
lara->frameNumber = g_Level.Anims[lara->animNumber].frameBase;
2019-12-01 08:13:19 +01:00
}
2019-12-26 23:35:16 -03:00
if (frame2 >= 33 && frame2 < 72)
{
frame2 = 2;
2021-11-20 13:18:59 +11:00
DoFlareInHand(lara, info->flareAge);
2019-12-26 23:35:16 -03:00
}
else if (!frame2)
2019-12-01 08:13:19 +01:00
{
frame2 = 1;
2021-11-20 13:18:59 +11:00
DoFlareInHand(lara, info->flareAge);
2019-12-01 08:13:19 +01:00
}
else if (frame2 >= 72 && frame2 < 95)
{
frame2++;
2019-12-01 08:13:19 +01:00
if (frame2 == 94)
{
frame2 = 1;
2021-11-20 13:18:59 +11:00
DoFlareInHand(lara, info->flareAge);
2019-12-01 08:13:19 +01:00
}
}
2019-12-26 23:35:16 -03:00
else if (frame2 >= 1 && frame2 < 33)
2019-12-01 08:13:19 +01:00
{
frame2++;
2019-12-01 08:13:19 +01:00
if (frame2 == 21)
{
2021-11-20 13:18:59 +11:00
CreateFlare(lara, ID_FLARE_ITEM, 1);
undraw_flare_meshes(lara);
info->flareAge = 0;
2019-12-01 08:13:19 +01:00
}
else if (frame2 == 33)
{
frame2 = 0;
2021-11-20 13:18:59 +11:00
info->requestGunType = info->lastGunType;
info->gunType = info->lastGunType;
info->gunStatus = LG_NO_ARMS;
2019-12-01 08:13:19 +01:00
2021-11-20 15:39:05 +11:00
InitialiseNewWeapon(lara);
2019-12-01 08:13:19 +01:00
2021-11-20 13:18:59 +11:00
info->flareControlLeft = false;
info->target = NULL;
info->rightArm.lock = false;
info->leftArm.lock = false;
info->flareFrame = 0;
2019-12-01 08:13:19 +01:00
}
2019-12-26 23:35:16 -03:00
else if (frame2 < 21)
2021-11-20 13:18:59 +11:00
DoFlareInHand(lara, info->flareAge);
2019-12-01 08:13:19 +01:00
}
2019-12-26 23:35:16 -03:00
else if (frame2 >= 95 && frame2 < 110)
2019-12-01 08:13:19 +01:00
{
frame2++;
2019-12-01 08:13:19 +01:00
if (frame2 == 110)
2019-12-26 23:35:16 -03:00
{
2019-12-01 08:13:19 +01:00
frame2 = 1;
2021-11-20 13:18:59 +11:00
DoFlareInHand(lara, info->flareAge);
2019-12-26 23:35:16 -03:00
}
2019-12-01 08:13:19 +01:00
}
2021-11-20 13:18:59 +11:00
info->leftArm.frameNumber = frame2;
set_flare_arm(lara, info->leftArm.frameNumber);
2019-11-21 07:43:34 +01:00
}
2021-11-20 13:18:59 +11:00
void draw_flare(ITEM_INFO* lara)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
LaraInfo*& info = lara->data;
2019-12-02 09:11:21 +01:00
short frame;
2019-11-21 07:43:34 +01:00
2021-11-20 13:18:59 +11:00
if (lara->currentAnimState == LS_PICKUP_FLARE ||
lara->currentAnimState == LS_PICKUP)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
DoFlareInHand(lara, info->flareAge);
info->flareControlLeft = false;
info->leftArm.frameNumber = 93;
set_flare_arm(lara, 93);
2019-11-21 07:43:34 +01:00
}
else
{
2021-11-20 13:18:59 +11:00
frame = info->leftArm.frameNumber + 1;
info->flareControlLeft = true;
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
if (frame < 33 || frame > 94)
frame = 33;
else if (frame == 46)
2021-11-20 13:18:59 +11:00
draw_flare_meshes(lara);
2019-12-01 08:13:19 +01:00
else if (frame >= 72 && frame <= 93)
2019-11-21 07:43:34 +01:00
{
2019-12-01 08:13:19 +01:00
if (frame == 72)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
SoundEffect(SFX_TR4_OBJ_GEM_SMASH, &lara->pos, TestLaraWater(lara));
info->flareAge = 1;
2019-11-21 07:43:34 +01:00
}
2021-11-20 13:18:59 +11:00
DoFlareInHand(lara, info->flareAge);
2019-11-21 07:43:34 +01:00
}
else
{
2019-12-01 08:13:19 +01:00
if (frame == 94)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
ready_flare(LaraItem);
2019-12-01 08:13:19 +01:00
frame = 0;
2021-11-20 13:18:59 +11:00
DoFlareInHand(lara, info->flareAge);
2019-11-21 07:43:34 +01:00
}
}
2021-11-20 13:18:59 +11:00
info->leftArm.frameNumber = frame;
set_flare_arm(lara, frame);
2019-12-01 08:13:19 +01:00
}
2019-11-21 07:43:34 +01:00
}
2021-11-20 13:18:59 +11:00
void set_flare_arm(ITEM_INFO* lara, int frame)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
LaraInfo*& info = lara->data;
short anim = Objects[ID_LARA_FLARE_ANIM].animIndex;
2019-11-21 07:43:34 +01:00
if (frame >= 95)
2019-12-01 08:13:19 +01:00
anim += 4;
2019-11-21 07:43:34 +01:00
else if (frame >= 72)
2019-12-01 08:13:19 +01:00
anim += 3;
2019-11-21 07:43:34 +01:00
else if (frame >= 33)
2019-12-01 08:13:19 +01:00
anim += 2;
2019-11-21 07:43:34 +01:00
else if (frame >= 1)
2019-12-01 08:13:19 +01:00
anim += 1;
2019-11-21 07:43:34 +01:00
2021-11-20 13:18:59 +11:00
info->leftArm.animNumber = anim;
info->leftArm.frameBase = g_Level.Anims[anim].framePtr;
2019-11-21 07:43:34 +01:00
}
2021-11-20 13:18:59 +11:00
void CreateFlare(ITEM_INFO* lara, GAME_OBJECT_ID objectNum, int thrown)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
LaraInfo*& info = lara->data;
2019-12-02 09:11:21 +01:00
short itemNum = CreateItem();
2021-11-20 13:18:59 +11:00
2019-12-01 08:13:19 +01:00
if (itemNum != NO_ITEM)
{
bool flag = false;
ITEM_INFO* item = &g_Level.Items[itemNum];
2019-12-01 08:13:19 +01:00
item->objectNumber = objectNum;
2021-11-20 13:18:59 +11:00
item->roomNumber = lara->roomNumber;
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
PHD_VECTOR pos;
pos.x = -16;
pos.y = 32;
pos.z = 42;
GetLaraJointPosition(&pos, LM_LHAND);
2019-12-01 08:13:19 +01:00
item->pos.xPos = pos.x;
item->pos.yPos = pos.y;
item->pos.zPos = pos.z;
2021-11-20 13:18:59 +11:00
auto probe = GetCollisionResult(pos.x, pos.y, pos.z, lara->roomNumber);
auto floorHeight = probe.Position.Floor;
auto collided = GetCollidedObjects(item, 0, 1, CollidedItems, CollidedMeshes, true);
if (collided || floorHeight < pos.y)
2019-12-01 08:13:19 +01:00
{
flag = true;
2021-11-20 13:18:59 +11:00
item->pos.yRot = lara->pos.yRot + ANGLE(180.0f);
item->pos.xPos = lara->pos.xPos + 320 * phd_sin(item->pos.yRot);
item->pos.zPos = lara->pos.zPos + 320 * phd_cos(item->pos.yRot);
item->roomNumber = lara->roomNumber;
2019-12-01 08:13:19 +01:00
}
else
{
if (thrown)
2021-11-20 13:18:59 +11:00
item->pos.yRot = lara->pos.yRot;
2019-12-01 08:13:19 +01:00
else
2021-11-20 13:18:59 +11:00
item->pos.yRot = lara->pos.yRot - ANGLE(45.0f);
item->roomNumber = lara->roomNumber;
2019-12-01 08:13:19 +01:00
}
InitialiseItem(itemNum);
item->pos.zRot = 0;
item->pos.xRot = 0;
item->shade = -1;
2020-05-23 14:26:06 +02:00
2019-12-01 08:13:19 +01:00
if (thrown)
{
2021-11-20 13:18:59 +11:00
item->speed = lara->speed + 50;
item->fallspeed = lara->fallspeed - 50;
2019-12-01 08:13:19 +01:00
}
else
{
2021-11-20 13:18:59 +11:00
item->speed = lara->speed + 10;
item->fallspeed = lara->fallspeed + 50;
2019-12-01 08:13:19 +01:00
}
2020-05-23 14:26:06 +02:00
2019-12-01 08:13:19 +01:00
if (flag)
item->speed >>= 1;
2019-12-01 08:13:19 +01:00
if (objectNum == ID_FLARE_ITEM)
{
Merge branch 'master' into item_data # Conflicts: # TR5Main/Game/Lara/lara.cpp # TR5Main/Game/Lara/lara_collide.cpp # TR5Main/Game/Lara/lara_monkey.cpp # TR5Main/Game/Lara/lara_struct.h # TR5Main/Game/Lara/lara_tests.cpp # TR5Main/Game/collide.h # TR5Main/Game/control.h # TR5Main/Game/effect.h # TR5Main/Game/effect2.cpp # TR5Main/Game/flipeffect.cpp # TR5Main/Game/floordata.h # TR5Main/Game/hair.cpp # TR5Main/Game/health.cpp # TR5Main/Game/items.cpp # TR5Main/Game/newinv2.cpp # TR5Main/Game/spotcam.cpp # TR5Main/Objects/Effects/tr4_bubbles.cpp # TR5Main/Objects/TR1/Entity/tr1_ape.cpp # TR5Main/Objects/TR1/Entity/tr1_bigrat.cpp # TR5Main/Objects/TR1/Entity/tr1_doppelganger.cpp # TR5Main/Objects/TR2/Entity/tr2_birdmonster.cpp # TR5Main/Objects/TR2/Entity/tr2_shark.cpp # TR5Main/Objects/TR2/Entity/tr2_spider.cpp # TR5Main/Objects/TR2/Entity/tr2_yeti.cpp # TR5Main/Objects/TR3/Entity/tr3_fishemitter.cpp # TR5Main/Objects/TR3/Entity/tr3_flamethrower.cpp # TR5Main/Objects/TR3/Entity/tr3_monkey.cpp # TR5Main/Objects/TR3/Entity/tr3_raptor.cpp # TR5Main/Objects/TR3/Entity/tr3_scuba.cpp # TR5Main/Objects/TR3/Entity/tr3_trex.cpp # TR5Main/Objects/TR3/Vehicles/kayak.cpp # TR5Main/Objects/TR3/Vehicles/minecart.cpp # TR5Main/Objects/TR4/Entity/tr4_bat.cpp # TR5Main/Objects/TR4/Entity/tr4_big_beetle.cpp # TR5Main/Objects/TR4/Entity/tr4_bigscorpion.cpp # TR5Main/Objects/TR4/Entity/tr4_demigod.cpp # TR5Main/Objects/TR4/Entity/tr4_dog.cpp # TR5Main/Objects/TR4/Entity/tr4_hammerhead.cpp # TR5Main/Objects/TR4/Entity/tr4_harpy.cpp # TR5Main/Objects/TR4/Entity/tr4_mutant.cpp # TR5Main/Objects/TR4/Entity/tr4_smallscorpion.cpp # TR5Main/Objects/TR4/Entity/tr4_troops.cpp # TR5Main/Objects/TR4/Entity/tr4_wildboar.cpp # TR5Main/Objects/TR4/Trap/tr4_joby_spikes.cpp # TR5Main/Objects/TR4/Vehicles/motorbike.cpp # TR5Main/Objects/TR5/Entity/tr5_doberman.cpp # TR5Main/Objects/TR5/Entity/tr5_imp.cpp # TR5Main/Objects/TR5/Entity/tr5_larson.cpp # TR5Main/Objects/TR5/Entity/tr5_lion.cpp # TR5Main/Objects/TR5/Entity/tr5_reaper.cpp # TR5Main/Objects/TR5/Object/tr5_pushableblock.cpp # TR5Main/Objects/TR5/Object/tr5_rollingball.cpp # TR5Main/Objects/TR5/Trap/tr5_fallingceiling.cpp # TR5Main/Renderer/Renderer11Draw2D.cpp # TR5Main/Specific/input.cpp # TR5Main/Specific/level.cpp # TR5Main/TombEngine.vcxproj.filters
2021-08-31 17:37:15 +02:00
item->data = (short)0;
short& age = item->data;
2021-11-20 13:18:59 +11:00
if (DoFlareLight((PHD_VECTOR*)&item->pos, info->flareAge))
age = (info->flareAge | 0x8000);
2019-12-01 08:13:19 +01:00
else
2021-11-20 13:18:59 +11:00
age = (info->flareAge & 0x7FFF);
2019-12-01 08:13:19 +01:00
}
else
2021-11-20 13:18:59 +11:00
item->itemFlags[3] = info->litTorch;
2019-12-01 08:13:19 +01:00
AddActiveItem(itemNum);
item->status = ITEM_ACTIVE;
}
2019-11-21 07:43:34 +01:00
}
void DrawFlareInAir(ITEM_INFO* item)
{
TENLog("DrawFlareInAir() not implemented!", LogLevel::Warning);
}
2021-11-20 13:18:59 +11:00
void DoFlareInHand(ITEM_INFO* lara, int flare_age)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
LaraInfo*& info = lara->data;
PHD_VECTOR pos = { 11, 32, 41 };
2019-11-21 07:43:34 +01:00
GetLaraJointPosition(&pos, LM_LHAND);
2020-05-23 14:26:06 +02:00
if (DoFlareLight(&pos, flare_age))
TriggerChaffEffects(flare_age);
2019-11-21 07:43:34 +01:00
/* Hardcoded code */
2019-11-21 07:43:34 +01:00
2021-11-20 13:18:59 +11:00
if (info->flareAge >= FLARE_AGE)
2019-11-21 07:43:34 +01:00
{
2021-11-20 13:18:59 +11:00
if (info->gunStatus == LG_NO_ARMS)
info->gunStatus = LG_UNDRAW_GUNS;
2019-11-21 07:43:34 +01:00
}
2021-11-20 13:18:59 +11:00
else if (info->flareAge != 0)
info->flareAge++;
2019-11-21 07:43:34 +01:00
}
2021-02-03 01:50:59 -03:00
int DoFlareLight(PHD_VECTOR* pos, int age)
2019-11-21 07:43:34 +01:00
{
2019-12-02 09:11:21 +01:00
int r, g, b;
2020-05-23 14:26:06 +02:00
float random;
2019-12-02 09:11:21 +01:00
int falloff;
if (age >= FLARE_AGE || age == 0)
2019-11-21 07:43:34 +01:00
return 0;
2021-09-17 16:07:53 +03:00
random = GenerateFloat();
2019-11-21 07:43:34 +01:00
int x = pos->x + (random * 120);
int y = pos->y + (random * 120) - 256;
int z = pos->z + (random * 120);
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
if (age < 4)
2019-11-21 07:43:34 +01:00
{
falloff = 12 + ((1 - (age / 4.0f)) * 16);
2020-05-23 14:26:06 +02:00
r = FlareMainColor.x * 255;
2020-05-23 14:26:06 +02:00
g = FlareMainColor.y * 255;
b = FlareMainColor.z * 255;
2019-11-21 07:43:34 +01:00
2019-12-01 08:13:19 +01:00
TriggerDynamicLight(x, y, z, falloff, r, g, b);
2020-05-23 14:26:06 +02:00
return (random < 0.9f);
2019-11-21 07:43:34 +01:00
}
else if (age < (FLARE_AGE - 90))
2019-11-21 07:43:34 +01:00
{
auto multiplier = FlareFlickerTable[age % FlareFlickerTable.size()];
falloff = 12 * multiplier;
2019-11-21 07:43:34 +01:00
2020-05-23 14:26:06 +02:00
r = FlareMainColor.x * 255 * multiplier;
g = FlareMainColor.y * 255 * multiplier;
b = FlareMainColor.z * 255 * multiplier;
2019-12-01 08:13:19 +01:00
TriggerDynamicLight(x, y, z, falloff, r, g, b);
2020-05-23 14:26:06 +02:00
return (random < 0.4f);
2019-11-21 07:43:34 +01:00
}
2020-05-23 14:26:06 +02:00
else
2019-11-21 07:43:34 +01:00
{
auto multiplier = FlareFlickerTableLow[age % FlareFlickerTableLow.size()];
falloff = 12 * (1.0f - ((age - (FLARE_AGE - 90)) / (FLARE_AGE - (FLARE_AGE - 90))));
2020-05-23 14:26:06 +02:00
r = FlareMainColor.x * 255 * multiplier;
g = FlareMainColor.y * 255 * multiplier;
b = FlareMainColor.z * 255 * multiplier;
TriggerDynamicLight(x, y, z, falloff, r, g, b);
return (random < .3f);
}
2019-11-21 07:43:34 +01:00
}