mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-04-28 15:57:59 +03:00
Formatting part 5
This commit is contained in:
parent
8ed1a3d697
commit
d21bbc499d
9 changed files with 123 additions and 144 deletions
|
@ -1344,7 +1344,7 @@ void TriggerShockwaveHitEffect(int x, int y, int z, unsigned char r, unsigned ch
|
|||
|
||||
spark->scalar = 1;
|
||||
spark->SpriteSeqID = ID_DEFAULT_SPRITES;
|
||||
spark->SpriteID = SPR_UNDERWATERDUST;
|
||||
spark->SpriteID = SPR_UNDERWATER_DUST;
|
||||
spark->maxYvel = 0;
|
||||
spark->gravity = (GetRandomControl() & 0x3F) + 64;
|
||||
spark->sSize = spark->size = (GetRandomControl() & 0x1F) + 32;
|
||||
|
|
|
@ -932,26 +932,23 @@ const std::vector<byte> SaveGame::Build()
|
|||
auto fireflySave = Save::FireflyDataBuilder(fbb);
|
||||
fireflySave.add_sprite_index(firefly.SpriteSeqID);
|
||||
fireflySave.add_sprite_id(firefly.SpriteID);
|
||||
fireflySave.add_blend_mode((int)firefly.blendMode);
|
||||
fireflySave.add_scalar(firefly.scalar);
|
||||
fireflySave.add_blend_mode((int)firefly.BlendMode);
|
||||
fireflySave.add_position(&FromVector3(firefly.Position));
|
||||
fireflySave.add_room_number(firefly.RoomNumber);
|
||||
fireflySave.add_position_target(&FromVector3(firefly.PositionTarget));
|
||||
fireflySave.add_orientation(&FromEulerAngles(firefly.Orientation));
|
||||
fireflySave.add_velocity(firefly.Velocity);
|
||||
fireflySave.add_target_item_number((firefly.TargetItemPtr == nullptr) ? -NO_VALUE : firefly.TargetItemPtr->Index);
|
||||
fireflySave.add_target_item_number((firefly.TargetItem == nullptr) ? -NO_VALUE : firefly.TargetItem->Index);
|
||||
fireflySave.add_z_vel(firefly.zVel);
|
||||
fireflySave.add_life(firefly.Life);
|
||||
fireflySave.add_number(firefly.Number);
|
||||
fireflySave.add_number(firefly.ID);
|
||||
fireflySave.add_d_r(firefly.rB);
|
||||
fireflySave.add_d_g(firefly.gB);
|
||||
fireflySave.add_d_b(firefly.bB);
|
||||
fireflySave.add_r(firefly.r);
|
||||
fireflySave.add_g(firefly.g);
|
||||
fireflySave.add_b(firefly.b);
|
||||
fireflySave.add_on(firefly.on);
|
||||
fireflySave.add_size(firefly.size);
|
||||
fireflySave.add_rot_Ang(firefly.rotAng);
|
||||
fireflySave.add_size(firefly.Size);
|
||||
|
||||
auto fireflySaveOffset = fireflySave.Finish();
|
||||
fireflySwarm.push_back(fireflySaveOffset);
|
||||
|
@ -2328,30 +2325,27 @@ static void ParseEffects(const Save::SaveGame* s)
|
|||
for (int i = 0; i < s->firefly_swarm()->size(); i++)
|
||||
{
|
||||
const auto& fireflySave = s->firefly_swarm()->Get(i);
|
||||
auto firefly = FireflyData{};
|
||||
|
||||
auto firefly = FireflyData{};
|
||||
firefly.SpriteSeqID = fireflySave->sprite_index();
|
||||
firefly.SpriteID = fireflySave->sprite_id();
|
||||
firefly.blendMode = (BlendMode)fireflySave->blend_mode();
|
||||
firefly.scalar = fireflySave->scalar();
|
||||
firefly.BlendMode = (BlendMode)fireflySave->blend_mode();
|
||||
firefly.Position = ToVector3(fireflySave->position());
|
||||
firefly.RoomNumber = fireflySave->room_number();
|
||||
firefly.PositionTarget = ToVector3(fireflySave->position_target());
|
||||
firefly.Orientation = ToEulerAngles(fireflySave->orientation());
|
||||
firefly.Velocity = fireflySave->velocity();
|
||||
firefly.TargetItemPtr = (fireflySave->target_item_number() == -1) ? nullptr : &g_Level.Items[fireflySave->target_item_number()];
|
||||
firefly.TargetItem = (fireflySave->target_item_number() == NO_VALUE) ? nullptr : &g_Level.Items[fireflySave->target_item_number()];
|
||||
firefly.zVel = fireflySave->z_vel();
|
||||
firefly.Life = fireflySave->life();
|
||||
firefly.Number = fireflySave->number();
|
||||
firefly.ID = fireflySave->number();
|
||||
firefly.rB = fireflySave->d_r();
|
||||
firefly.gB = fireflySave->d_g();
|
||||
firefly.bB = fireflySave->d_b();
|
||||
firefly.r = fireflySave->r();
|
||||
firefly.g = fireflySave->g();
|
||||
firefly.b = fireflySave->b();
|
||||
firefly.on = fireflySave->on();
|
||||
firefly.size = fireflySave->size();
|
||||
firefly.rotAng = fireflySave->rot_Ang();
|
||||
firefly.Size = fireflySave->size();
|
||||
|
||||
FireflySwarm.push_back(firefly);
|
||||
}
|
||||
|
|
|
@ -81,7 +81,7 @@ namespace TEN::Effects::EmberEmitter
|
|||
else
|
||||
{
|
||||
spark.SpriteSeqID = ID_DEFAULT_SPRITES;
|
||||
spark.SpriteID = SPR_UNDERWATERDUST;
|
||||
spark.SpriteID = SPR_UNDERWATER_DUST;
|
||||
spark.scalar = 1.0f;
|
||||
spark.gravity = Random::GenerateFloat(64.0f, 80.0f);
|
||||
spark.flags = SP_ROTATE | SP_DEF | SP_SCALE;
|
||||
|
@ -133,7 +133,7 @@ namespace TEN::Effects::EmberEmitter
|
|||
}
|
||||
|
||||
spark.SpriteSeqID = ID_DEFAULT_SPRITES;
|
||||
spark.SpriteID = SPR_UNDERWATERDUST;
|
||||
spark.SpriteID = SPR_UNDERWATER_DUST;
|
||||
spark.life =
|
||||
spark.sLife = Random::GenerateFloat(74.0f, 78.0f);
|
||||
spark.x = item.Pose.Position.x + Random::GenerateFloat(0.0f, 22.0f);
|
||||
|
|
|
@ -33,27 +33,30 @@ namespace TEN::Effects::Fireflies
|
|||
constexpr auto FIREFLY_BASE_SEPARATION_DISTANCE = 10.0f;
|
||||
constexpr auto FIREFLY_FLEE_DISTANCE = BLOCK(0.7);
|
||||
constexpr auto FIREFLY_COUNT_MAX = 92;
|
||||
constexpr auto DEFAULT_FIREFLY_COUNT = 20;
|
||||
constexpr auto FIREFLY_RISE_UP_FACTOR = 200;
|
||||
constexpr auto FIREFLY_COUNT_DEFAULT = 20;
|
||||
constexpr auto FIREFLY_ASCENT_FACTOR = 200;
|
||||
constexpr auto FIREFLY_RANGE_MAX = 8;
|
||||
constexpr auto FIREFLY_LIGHT_ALPHA_CYCLE_DURATION = 120.0f;
|
||||
|
||||
static auto FireflySwarm = std::vector<FireflyData>{};
|
||||
std::vector<FireflyData> FireflySwarm;
|
||||
|
||||
static auto NextFireflyIDMap = std::unordered_map<int, int>{}; // For streamer effect.
|
||||
|
||||
void InitializeFireflySwarm(short itemNumber)
|
||||
{
|
||||
constexpr auto VEL_MAX = 160.0f;
|
||||
constexpr auto VEL_MIN = 32.0f;
|
||||
|
||||
auto& item = g_Level.Items[itemNumber];
|
||||
|
||||
item.Animation.Velocity.z = Random::GenerateFloat(32.0f, 160.0f);
|
||||
item.Animation.Velocity.z = Random::GenerateFloat(VEL_MIN, VEL_MAX);
|
||||
|
||||
item.HitPoints = FIREFLY_COUNT_DEFAULT;
|
||||
|
||||
item.HitPoints = DEFAULT_FIREFLY_COUNT;
|
||||
item.ItemFlags[FirefliesItemFlags::TargetItemPtr] = item.Index;
|
||||
item.ItemFlags[FirefliesItemFlags::Light] = 1; // 0 = Turn off light effect, 1 = turn on light (DEFAULT).
|
||||
|
||||
item.ItemFlags[FirefliesItemFlags::Light] = 1; // 1 = light effect, 0 = no light effect.
|
||||
item.ItemFlags[FirefliesItemFlags::TriggerFlags] = std::clamp((int)item.TriggerFlags, -FIREFLY_RANGE_MAX, FIREFLY_RANGE_MAX);
|
||||
|
||||
item.ItemFlags[FirefliesItemFlags::Spawncounter] = 0;
|
||||
item.ItemFlags[FirefliesItemFlags::SpawnCounter] = 0;
|
||||
item.ItemFlags[FirefliesItemFlags::RemoveFliesEffect] = 0;
|
||||
|
||||
// Firefly IDs with light.
|
||||
|
@ -61,31 +64,14 @@ namespace TEN::Effects::Fireflies
|
|||
item.ItemFlags[FirefliesItemFlags::LightID1] = NO_VALUE;
|
||||
}
|
||||
|
||||
static void RemoveFireflies(ItemInfo& item)
|
||||
{
|
||||
FireflySwarm.erase(
|
||||
std::remove_if(
|
||||
FireflySwarm.begin(), FireflySwarm.end(),
|
||||
[&item](FireflyData& firefly)
|
||||
{
|
||||
if (firefly.TargetItemPtr == &item)
|
||||
{
|
||||
firefly.Life = 0.0f;
|
||||
firefly.on = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}),
|
||||
FireflySwarm.end());
|
||||
|
||||
NextFireflyIDMap.erase(item.Index);
|
||||
}
|
||||
|
||||
void SpawnFireflySwarm(ItemInfo& item, int triggerFlags)
|
||||
{
|
||||
constexpr auto VEL_MAX = 34.0f;
|
||||
constexpr auto VEL_MIN = 6.0f;
|
||||
constexpr auto VEL_MAX = 34.0f;
|
||||
constexpr auto VEL_MIN = 6.0f;
|
||||
constexpr auto FIREFLY_SPRITE_ID = 0;
|
||||
constexpr auto FLY_SPRITE_ID = 1;
|
||||
constexpr auto FIREFLY_SIZE = 10.0f; // TODO: Check.
|
||||
constexpr auto FLY_SIZE = 8.0f; // TODO: Check.
|
||||
|
||||
// Create new firefly.
|
||||
auto& firefly = GetNewEffect(FireflySwarm, FIREFLY_COUNT_MAX);
|
||||
|
@ -102,42 +88,36 @@ namespace TEN::Effects::Fireflies
|
|||
b = std::clamp(item.Model.Color.z / 2.0f + brightnessShift, 0.0f, 1.0f) * UCHAR_MAX;
|
||||
|
||||
firefly.SpriteSeqID = ID_FIREFLY_SPRITES;
|
||||
firefly.SpriteID = 0;
|
||||
firefly.blendMode = BlendMode::Additive;
|
||||
firefly.scalar = 3.0f;
|
||||
firefly.size = 1.0f;
|
||||
firefly.SpriteID = FIREFLY_SPRITE_ID;
|
||||
firefly.BlendMode = BlendMode::Additive;
|
||||
firefly.Size = FIREFLY_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
firefly.SpriteSeqID = ID_FIREFLY_SPRITES;
|
||||
firefly.SpriteID = 1;
|
||||
firefly.blendMode = BlendMode::Subtractive;
|
||||
firefly.scalar = 1.2f;
|
||||
firefly.size = 1.2f;
|
||||
firefly.SpriteID = FLY_SPRITE_ID;
|
||||
firefly.BlendMode = BlendMode::Subtractive;
|
||||
firefly.Size = FLY_SIZE;
|
||||
}
|
||||
|
||||
// TODO: Use proper normalised colour in range [0.0f, 1.0f].
|
||||
firefly.r = firefly.rB = r;
|
||||
firefly.g = firefly.gB = g;
|
||||
firefly.b = firefly.bB = b;
|
||||
|
||||
firefly.rotAng = ANGLE(0.0f);
|
||||
|
||||
if (item.TriggerFlags > 8)
|
||||
firefly.rotAng = ANGLE(90.0f);
|
||||
|
||||
firefly.on = true;
|
||||
|
||||
firefly.Position = item.Pose.Position.ToVector3();
|
||||
firefly.RoomNumber = item.RoomNumber;
|
||||
firefly.Orientation = item.Pose.Orientation;
|
||||
firefly.Velocity = Random::GenerateFloat(VEL_MIN, VEL_MAX);
|
||||
firefly.zVel = 0.3f;
|
||||
firefly.zVel = 0.3f; // TODO: Demagic.
|
||||
|
||||
firefly.Life = Random::GenerateInt(1, 400);
|
||||
firefly.TargetItemPtr = &g_Level.Items[item.ItemFlags[FirefliesItemFlags::TargetItemPtr]];
|
||||
// TODO: Demagic.
|
||||
firefly.Life = Random::GenerateFloat(1.0f, 400.0f);
|
||||
|
||||
int& nextFireflyNumber = NextFireflyIDMap[item.Index];
|
||||
firefly.Number = nextFireflyNumber++;
|
||||
firefly.TargetItem = &g_Level.Items[item.ItemFlags[FirefliesItemFlags::TargetItemPtr]];
|
||||
|
||||
int& nextFireflyID = NextFireflyIDMap[item.Index];
|
||||
firefly.ID = nextFireflyID++; // TODO: Increment should be on separate line for clarity.
|
||||
}
|
||||
|
||||
void ControlFireflySwarm(short itemNumber)
|
||||
|
@ -149,13 +129,13 @@ namespace TEN::Effects::Fireflies
|
|||
if (!TriggerActive(&item))
|
||||
{
|
||||
// Remove all fireflies associated with this item.
|
||||
RemoveFireflies(item);
|
||||
ClearInactiveFireflies(item);
|
||||
|
||||
// Reset ItemFlags.
|
||||
if (item.HitPoints == NOT_TARGETABLE)
|
||||
item.HitPoints = item.ItemFlags[FirefliesItemFlags::Spawncounter];
|
||||
item.HitPoints = item.ItemFlags[FirefliesItemFlags::SpawnCounter];
|
||||
|
||||
item.ItemFlags[FirefliesItemFlags::Spawncounter] = 0;
|
||||
item.ItemFlags[FirefliesItemFlags::SpawnCounter] = 0;
|
||||
item.ItemFlags[FirefliesItemFlags::LightID0] = NO_VALUE;
|
||||
item.ItemFlags[FirefliesItemFlags::LightID1] = NO_VALUE;
|
||||
|
||||
|
@ -169,17 +149,16 @@ namespace TEN::Effects::Fireflies
|
|||
|
||||
if (item.HitPoints != NOT_TARGETABLE)
|
||||
{
|
||||
int fireflyCount = item.HitPoints - item.ItemFlags[FirefliesItemFlags::Spawncounter];
|
||||
int fireflyCount = item.HitPoints - item.ItemFlags[FirefliesItemFlags::SpawnCounter];
|
||||
|
||||
if (fireflyCount < 0)
|
||||
{
|
||||
int firefliesToTurnOff = -fireflyCount;
|
||||
for (auto& firefly : FireflySwarm)
|
||||
{
|
||||
if (firefly.TargetItemPtr == &item && firefly.Life > 0.0f)
|
||||
if (firefly.TargetItem == &item && firefly.Life > 0.0f)
|
||||
{
|
||||
firefly.Life = 0.0f;
|
||||
firefly.on = false;
|
||||
firefliesToTurnOff--;
|
||||
|
||||
if (firefliesToTurnOff == 0)
|
||||
|
@ -195,7 +174,7 @@ namespace TEN::Effects::Fireflies
|
|||
}
|
||||
}
|
||||
|
||||
item.ItemFlags[FirefliesItemFlags::Spawncounter] = item.HitPoints;
|
||||
item.ItemFlags[FirefliesItemFlags::SpawnCounter] = item.HitPoints;
|
||||
item.HitPoints = NOT_TARGETABLE;
|
||||
}
|
||||
|
||||
|
@ -204,7 +183,7 @@ namespace TEN::Effects::Fireflies
|
|||
|
||||
for (auto& firefly : FireflySwarm)
|
||||
{
|
||||
auto targetItem = firefly.TargetItemPtr;
|
||||
auto targetItem = firefly.TargetItem;
|
||||
|
||||
if (targetItem == &item)
|
||||
{
|
||||
|
@ -228,7 +207,7 @@ namespace TEN::Effects::Fireflies
|
|||
if (targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] >= 0)
|
||||
{
|
||||
StreamerEffect.Spawn(
|
||||
targetItem->Index, firefly.Number, pos, dir0, orient2D,
|
||||
targetItem->Index, firefly.ID, pos, dir0, orient2D,
|
||||
Vector4(firefly.r / (float)UCHAR_MAX, firefly.g / (float)UCHAR_MAX, firefly.b / (float)UCHAR_MAX, 1.0f),
|
||||
Vector4::Zero,
|
||||
6.3f - (firefly.zVel / 12), ((firefly.Velocity / 8) + firefly.zVel * 3) / (float)UCHAR_MAX, 0.0f, -0.1f, 90.0f, StreamerFeatherMode::None, BlendMode::Additive);
|
||||
|
@ -236,13 +215,13 @@ namespace TEN::Effects::Fireflies
|
|||
else if (targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] < 0)
|
||||
{
|
||||
StreamerEffect.Spawn(
|
||||
targetItem->Index, firefly.Number, pos, dir0, orient2D,
|
||||
targetItem->Index, firefly.ID, pos, dir0, orient2D,
|
||||
Vector4((firefly.r / 2) / (float)UCHAR_MAX, (firefly.g / 2) / (float)UCHAR_MAX, (firefly.b / 2) / (float)UCHAR_MAX, 0.2f),
|
||||
Vector4((firefly.r / 3) / (float)UCHAR_MAX, (firefly.g / 3) / (float)UCHAR_MAX, (firefly.b / 3) / (float)UCHAR_MAX, 0.2f),
|
||||
0.0f, 0.4f, 0.0f, 0.2f, 0.0f, StreamerFeatherMode::None, BlendMode::Subtractive);
|
||||
}
|
||||
|
||||
if ((targetItem->ItemFlags[FirefliesItemFlags::LightID0] == firefly.Number || targetItem->ItemFlags[FirefliesItemFlags::LightID1] == firefly.Number) &&
|
||||
if ((targetItem->ItemFlags[FirefliesItemFlags::LightID0] == firefly.ID || targetItem->ItemFlags[FirefliesItemFlags::LightID1] == firefly.ID) &&
|
||||
targetItem->ItemFlags[FirefliesItemFlags::Light] == 1)
|
||||
{
|
||||
float totalCycleDuration = 2 * (FIREFLY_LIGHT_ALPHA_CYCLE_DURATION + ALPHA_PAUSE_DURATION);
|
||||
|
@ -295,10 +274,10 @@ namespace TEN::Effects::Fireflies
|
|||
|
||||
for (auto& firefly : FireflySwarm)
|
||||
{
|
||||
if (firefly.Life <= 0.0f || !firefly.on)
|
||||
if (firefly.Life <= 0.0f)
|
||||
continue;
|
||||
|
||||
auto targetItem = firefly.TargetItemPtr;
|
||||
auto targetItem = firefly.TargetItem;
|
||||
|
||||
if (targetItem->ItemFlags[FirefliesItemFlags::RemoveFliesEffect])
|
||||
{
|
||||
|
@ -317,7 +296,7 @@ namespace TEN::Effects::Fireflies
|
|||
CLICK(targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] * 4),
|
||||
CLICK(targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] * 2));
|
||||
|
||||
auto itemPos = Vector3i(targetItem->Pose.Position.x, targetItem->Pose.Position.y - FIREFLY_RISE_UP_FACTOR, targetItem->Pose.Position.z);
|
||||
auto itemPos = Vector3i(targetItem->Pose.Position.x, targetItem->Pose.Position.y - FIREFLY_ASCENT_FACTOR, targetItem->Pose.Position.z);
|
||||
|
||||
// Calculate desired position based on target object and random offsets.
|
||||
auto desiredPos = itemPos + Random::GeneratePointInSpheroid(firefly.PositionTarget, EulerAngles::Identity, spheroidAxis);
|
||||
|
@ -349,36 +328,36 @@ namespace TEN::Effects::Fireflies
|
|||
// Update color values for blinking effect.
|
||||
float totalCycleDuration = 2 * (FIREFLY_LIGHT_ALPHA_CYCLE_DURATION + ALPHA_PAUSE_DURATION);
|
||||
float alphaTime = fmod(frameCounter + firefly.Life, totalCycleDuration);
|
||||
float alphaFactor;
|
||||
|
||||
float alpha = 0.0f;
|
||||
if (alphaTime < ALPHA_PAUSE_DURATION)
|
||||
{
|
||||
alphaFactor = 1.0f;
|
||||
alpha = 1.0f;
|
||||
}
|
||||
else if (alphaTime < ALPHA_PAUSE_DURATION + FIREFLY_LIGHT_ALPHA_CYCLE_DURATION)
|
||||
{
|
||||
alphaFactor = 1.0f - ((alphaTime - ALPHA_PAUSE_DURATION) / FIREFLY_LIGHT_ALPHA_CYCLE_DURATION);
|
||||
alpha = 1.0f - ((alphaTime - ALPHA_PAUSE_DURATION) / FIREFLY_LIGHT_ALPHA_CYCLE_DURATION);
|
||||
}
|
||||
else if (alphaTime < 2 * ALPHA_PAUSE_DURATION + FIREFLY_LIGHT_ALPHA_CYCLE_DURATION)
|
||||
{
|
||||
alphaFactor = 0.0f;
|
||||
alpha = 0.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
alphaFactor = (alphaTime - 2 * ALPHA_PAUSE_DURATION - FIREFLY_LIGHT_ALPHA_CYCLE_DURATION) / FIREFLY_LIGHT_ALPHA_CYCLE_DURATION;
|
||||
alpha = (alphaTime - 2 * ALPHA_PAUSE_DURATION - FIREFLY_LIGHT_ALPHA_CYCLE_DURATION) / FIREFLY_LIGHT_ALPHA_CYCLE_DURATION;
|
||||
}
|
||||
|
||||
firefly.r = unsigned char(firefly.rB * alphaFactor);
|
||||
firefly.g = unsigned char(firefly.gB * alphaFactor);
|
||||
firefly.b = unsigned char(firefly.bB * alphaFactor);
|
||||
firefly.r = unsigned char(firefly.rB * alpha);
|
||||
firefly.g = unsigned char(firefly.gB * alpha);
|
||||
firefly.b = unsigned char(firefly.bB * alpha);
|
||||
|
||||
for (const auto& otherFirefly : FireflySwarm)
|
||||
{
|
||||
if (&firefly == &otherFirefly)
|
||||
continue;
|
||||
|
||||
float distToOtherFirefly = Vector3i::Distance(firefly.Position, otherFirefly.Position);
|
||||
float distToPlayer = Vector3i::Distance(firefly.Position, playerItem.Pose.Position);
|
||||
float distToOtherFirefly = Vector3::Distance(firefly.Position, otherFirefly.Position);
|
||||
float distToPlayer = Vector3::Distance(firefly.Position, playerItem.Pose.Position.ToVector3());
|
||||
|
||||
// Player is too close; flee.
|
||||
if (distToPlayer < FIREFLY_FLEE_DISTANCE && playerItem.Animation.ActiveState != 2)
|
||||
|
@ -395,7 +374,7 @@ namespace TEN::Effects::Fireflies
|
|||
auto orientTo = Geometry::GetOrientToPoint(firefly.Position, separationDir);
|
||||
firefly.Orientation.Lerp(orientTo, 0.05f);
|
||||
|
||||
firefly.Velocity -= std::min(FLEE_VEL, firefly.TargetItemPtr->Animation.Velocity.z - 1.0f);
|
||||
firefly.Velocity -= std::min(FLEE_VEL, firefly.TargetItem->Animation.Velocity.z - 1.0f);
|
||||
|
||||
if (Random::TestProbability(1.0f / 700.0f) &&
|
||||
targetItem->ItemFlags[FirefliesItemFlags::Light] == 1 &&
|
||||
|
@ -432,7 +411,7 @@ namespace TEN::Effects::Fireflies
|
|||
if (targetItem->ItemFlags[FirefliesItemFlags::Light] == 1 &&
|
||||
targetItem->ItemFlags[FirefliesItemFlags::TriggerFlags] >= 0)
|
||||
{
|
||||
if (Random::TestProbability(1.0f / (700.0f - float(targetItem->ItemFlags[FirefliesItemFlags::Spawncounter] * 2))))
|
||||
if (Random::TestProbability(1.0f / (700.0f - float(targetItem->ItemFlags[FirefliesItemFlags::SpawnCounter] * 2))))
|
||||
firefly.zVel = 100.0f;
|
||||
|
||||
if (firefly.zVel > 1.0f)
|
||||
|
@ -443,6 +422,26 @@ namespace TEN::Effects::Fireflies
|
|||
}
|
||||
}
|
||||
|
||||
void ClearInactiveFireflies(ItemInfo& item)
|
||||
{
|
||||
FireflySwarm.erase(
|
||||
std::remove_if(
|
||||
FireflySwarm.begin(), FireflySwarm.end(),
|
||||
[&item](FireflyData& firefly)
|
||||
{
|
||||
if (firefly.TargetItem == &item)
|
||||
{
|
||||
firefly.Life = 0.0f;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}),
|
||||
FireflySwarm.end());
|
||||
|
||||
NextFireflyIDMap.erase(item.Index);
|
||||
}
|
||||
|
||||
void ClearFireflySwarm()
|
||||
{
|
||||
FireflySwarm.clear();
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "Objects/game_object_ids.h"
|
||||
#include "Objects/objectslist.h"
|
||||
#include "Math/Math.h"
|
||||
|
||||
struct ItemInfo;
|
||||
|
@ -13,7 +15,7 @@ namespace TEN::Effects::Fireflies
|
|||
TargetItemPtr,
|
||||
Light,
|
||||
TriggerFlags,
|
||||
Spawncounter,
|
||||
SpawnCounter,
|
||||
RemoveFliesEffect,
|
||||
LightID0,
|
||||
LightID1
|
||||
|
@ -21,46 +23,43 @@ namespace TEN::Effects::Fireflies
|
|||
|
||||
struct FireflyData
|
||||
{
|
||||
int SpriteSeqID = ID_DEFAULT_SPRITES;
|
||||
int SpriteID = SPR_UNDERWATERDUST;
|
||||
BlendMode blendMode;
|
||||
unsigned int scalar;
|
||||
int SpriteSeqID = GAME_OBJECT_ID::ID_DEFAULT_SPRITES;
|
||||
int SpriteID = SPRITE_TYPES::SPR_UNDERWATER_DUST;
|
||||
BlendMode BlendMode = BlendMode::Additive;
|
||||
|
||||
Vector3 Position = Vector3::Zero;
|
||||
int RoomNumber = 0;
|
||||
Vector3 PositionTarget = Vector3::Zero;
|
||||
EulerAngles Orientation = EulerAngles::Identity;
|
||||
float Velocity = 0.0f;
|
||||
Vector4 Color = Vector4::Zero; // TODO
|
||||
|
||||
ItemInfo* TargetItemPtr = nullptr;
|
||||
|
||||
float zVel;
|
||||
int ID = 0;
|
||||
float Life = 0.0f;
|
||||
int Number = 0;
|
||||
float Size;
|
||||
float zVel = 0.0f;
|
||||
|
||||
ItemInfo* TargetItem = nullptr; // TODO: Use moveable ID instead.
|
||||
|
||||
Vector3 PrevPosition = Vector3::Zero;
|
||||
Vector4 PrevColor = Vector4::Zero; // TODO
|
||||
|
||||
// TODO: Not needed.
|
||||
unsigned char rB;
|
||||
unsigned char gB;
|
||||
unsigned char bB;
|
||||
unsigned char r;
|
||||
unsigned char g;
|
||||
unsigned char b;
|
||||
|
||||
bool on;
|
||||
float size;
|
||||
short rotAng;
|
||||
|
||||
int PrevX;
|
||||
int PrevY;
|
||||
int PrevZ;
|
||||
byte PrevR;
|
||||
byte PrevG;
|
||||
byte PrevB;
|
||||
|
||||
void StoreInterpolationData()
|
||||
{
|
||||
PrevX = Position.x;
|
||||
PrevY = Position.y;
|
||||
PrevZ = Position.z;
|
||||
PrevPosition = Position;
|
||||
PrevColor = Color;
|
||||
|
||||
PrevR = r;
|
||||
PrevG = g;
|
||||
PrevB = b;
|
||||
|
@ -72,6 +71,7 @@ namespace TEN::Effects::Fireflies
|
|||
void InitializeFireflySwarm(short itemNumber);
|
||||
void ControlFireflySwarm(short itemNumber);
|
||||
void UpdateFireflySwarm();
|
||||
void ClearInactiveFireflies(ItemInfo& item);
|
||||
void ClearFireflySwarm();
|
||||
|
||||
void SpawnFireflySwarm(ItemInfo& item, int triggerFlags);
|
||||
|
|
|
@ -82,7 +82,7 @@ void TriggerElectricityWireSparks(int x, int z, byte objNum, byte node, bool glo
|
|||
{
|
||||
spark->scalar = 0;
|
||||
spark->SpriteSeqID = ID_DEFAULT_SPRITES;
|
||||
spark->SpriteID = SPR_UNDERWATERDUST;
|
||||
spark->SpriteID = SPR_UNDERWATER_DUST;
|
||||
spark->size = spark->sSize = (GetRandomControl() & 7) + 8;
|
||||
}
|
||||
|
||||
|
|
|
@ -153,13 +153,13 @@ namespace TEN::Entities::TR3
|
|||
if (!TriggerActive(&item) || item.ItemFlags[FirefliesItemFlags::RemoveFliesEffect] == 1)
|
||||
{
|
||||
// Remove all fireflies associated with this item.
|
||||
RemoveFireflies(item);
|
||||
ClearInactiveFireflies(item);
|
||||
|
||||
// Reset ItemFlags.
|
||||
if (item.HitPoints == NOT_TARGETABLE)
|
||||
item.HitPoints = FLY_COUNT;
|
||||
|
||||
item.ItemFlags[FirefliesItemFlags::Spawncounter] = 0;
|
||||
item.ItemFlags[FirefliesItemFlags::SpawnCounter] = 0;
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
@ -171,17 +171,16 @@ namespace TEN::Entities::TR3
|
|||
// Spawn fly effect.
|
||||
if (item.HitPoints != NOT_TARGETABLE)
|
||||
{
|
||||
int fireflyCount = item.HitPoints - item.ItemFlags[FirefliesItemFlags::Spawncounter];
|
||||
int fireflyCount = item.HitPoints - item.ItemFlags[FirefliesItemFlags::SpawnCounter];
|
||||
|
||||
if (fireflyCount < 0)
|
||||
{
|
||||
int firefliesToTurnOff = -fireflyCount;
|
||||
for (auto& firefly : FireflySwarm)
|
||||
{
|
||||
if (firefly.TargetItemPtr == &item && firefly.Life > 0.0f)
|
||||
if (firefly.TargetItem == &item && firefly.Life > 0.0f)
|
||||
{
|
||||
firefly.Life = 0.0f;
|
||||
firefly.on = false;
|
||||
firefliesToTurnOff--;
|
||||
|
||||
if (firefliesToTurnOff == 0)
|
||||
|
@ -197,7 +196,7 @@ namespace TEN::Entities::TR3
|
|||
}
|
||||
}
|
||||
|
||||
item.ItemFlags[FirefliesItemFlags::Spawncounter] = item.HitPoints;
|
||||
item.ItemFlags[FirefliesItemFlags::SpawnCounter] = item.HitPoints;
|
||||
item.HitPoints = NOT_TARGETABLE;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,7 +35,7 @@ template <typename T> std::enable_if_t<std::is_same_v<T, std::underlying_type_t<
|
|||
SPR_LENS_FLARE_LIGHT,
|
||||
SPR_BULLETIMPACT,
|
||||
SPR_BUBBLES,
|
||||
SPR_UNDERWATERDUST,
|
||||
SPR_UNDERWATER_DUST,
|
||||
SPR_BLOOD,
|
||||
SPR_EMPTY1,
|
||||
SPR_BUBBLE_CLUSTER,
|
||||
|
|
|
@ -337,27 +337,16 @@ namespace TEN::Renderer
|
|||
if (!Objects[ID_FIREFLY_EMITTER].loaded)
|
||||
return;
|
||||
|
||||
for (auto& firefly : FireflySwarm)
|
||||
for (const auto& firefly : FireflySwarm)
|
||||
{
|
||||
if (!firefly.on)
|
||||
if (firefly.Life <= 0.0f)
|
||||
continue;
|
||||
|
||||
|
||||
if (!CheckIfSlotExists(ID_SPARK_SPRITE, "Particle rendering"))
|
||||
continue;
|
||||
|
||||
auto axis = Vector3(0,0,0);
|
||||
axis.Normalize();
|
||||
|
||||
firefly.scalar = 3;
|
||||
firefly.size = 3;
|
||||
|
||||
auto pos = Vector3::Lerp(
|
||||
Vector3(firefly.PrevX, firefly.PrevY, firefly.PrevZ),
|
||||
Vector3(firefly.Position.x, firefly.Position.y, firefly.Position.z),
|
||||
GetInterpolationFactor());
|
||||
|
||||
pos = Vector3(firefly.Position.x, firefly.Position.y, firefly.Position.z);
|
||||
auto pos = Vector3::Lerp(firefly.PrevPosition, firefly.Position, GetInterpolationFactor());
|
||||
// TODO: Interpolate colour.
|
||||
|
||||
// Disallow sprites out of bounds.
|
||||
int spriteIndex = Objects[firefly.SpriteSeqID].meshIndex + firefly.SpriteID;
|
||||
|
@ -367,9 +356,7 @@ namespace TEN::Renderer
|
|||
&_sprites[spriteIndex],
|
||||
pos,
|
||||
Color(firefly.r / (float)UCHAR_MAX, firefly.g / (float)UCHAR_MAX, firefly.b / (float)UCHAR_MAX, 1.0f),
|
||||
TO_RAD(firefly.rotAng << 4), firefly.scalar,
|
||||
Vector2(firefly.size, firefly.size),
|
||||
firefly.blendMode, true, view);
|
||||
0, 1.0f, Vector2(firefly.Size), firefly.BlendMode, true, view);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1028,7 +1015,7 @@ namespace TEN::Renderer
|
|||
return;
|
||||
|
||||
AddSpriteBillboard(
|
||||
&_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATERDUST],
|
||||
&_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATER_DUST],
|
||||
Vector3::Lerp(part.PrevPosition, part.Position, GetInterpolationFactor()),
|
||||
Color(1.0f, 1.0f, 1.0f, part.Transparency()),
|
||||
0.0f, 1.0f, Vector2(Lerp(part.PrevSize, part.Size, GetInterpolationFactor())),
|
||||
|
@ -1042,7 +1029,7 @@ namespace TEN::Renderer
|
|||
return;
|
||||
|
||||
AddSpriteBillboard(
|
||||
&_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATERDUST],
|
||||
&_sprites[Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATER_DUST],
|
||||
Vector3::Lerp(part.PrevPosition, part.Position, GetInterpolationFactor()),
|
||||
Color(1.0f, 1.0f, 1.0f, part.Transparency()),
|
||||
0.0f, 1.0f, Vector2(Lerp(part.PrevSize, part.Size, GetInterpolationFactor())),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue