2020-12-21 13:16:29 -03:00
|
|
|
#include "framework.h"
|
2021-12-19 05:24:12 +03:00
|
|
|
#include "Objects/Generic/Object/objects.h"
|
2021-12-22 16:23:57 +03:00
|
|
|
#include "Game/items.h"
|
|
|
|
#include "Game/effects/effects.h"
|
|
|
|
#include "Game/animation.h"
|
|
|
|
#include "Game/Lara/lara.h"
|
2022-02-08 20:45:21 +11:00
|
|
|
#include "Game/Lara/lara_helpers.h"
|
2021-12-22 16:23:57 +03:00
|
|
|
#include "Game/collision/sphere.h"
|
|
|
|
#include "Game/control/control.h"
|
|
|
|
#include "Specific/setup.h"
|
|
|
|
#include "Specific/level.h"
|
|
|
|
#include "Specific/input.h"
|
2021-09-25 16:00:30 +03:00
|
|
|
#include "Sound/sound.h"
|
2021-12-22 16:23:57 +03:00
|
|
|
#include "Game/collision/collide_item.h"
|
2021-09-25 11:27:47 +02:00
|
|
|
|
2020-12-21 13:16:29 -03:00
|
|
|
OBJECT_TEXTURE* WaterfallTextures[6];
|
|
|
|
float WaterfallY[6];
|
|
|
|
int lastWaterfallY = 0;
|
2021-10-27 19:00:30 +03:00
|
|
|
|
2020-12-21 13:16:29 -03:00
|
|
|
PHD_VECTOR TightRopePos = { 0, 0, 0 };
|
2021-10-27 19:00:30 +03:00
|
|
|
OBJECT_COLLISION_BOUNDS TightRopeBounds =
|
2022-02-24 14:22:30 +11:00
|
|
|
{
|
|
|
|
-256, 256,
|
|
|
|
0, 0,
|
|
|
|
-256, 256,
|
|
|
|
ANGLE(-10.0f), ANGLE(10.0f),
|
|
|
|
ANGLE(-30.0f), ANGLE(30.0f),
|
|
|
|
ANGLE(-10.0f), ANGLE(10.0f)
|
|
|
|
};
|
2020-12-21 13:16:29 -03:00
|
|
|
|
|
|
|
OBJECT_COLLISION_BOUNDS ParallelBarsBounds =
|
2022-02-24 14:22:30 +11:00
|
|
|
{
|
|
|
|
-640, 640,
|
|
|
|
704, 832,
|
|
|
|
-96, 96,
|
|
|
|
ANGLE(-10.0f), ANGLE(10.0f),
|
|
|
|
ANGLE(-30.0f), ANGLE(30.0f),
|
|
|
|
ANGLE(-10.0f), ANGLE(10.0f)
|
|
|
|
};
|
2020-12-21 13:16:29 -03:00
|
|
|
|
|
|
|
void ControlAnimatingSlots(short itemNumber)
|
|
|
|
{
|
|
|
|
// TODO: TR5 has here a series of hardcoded OCB codes, this function actually is just a placeholder
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* item = &g_Level.Items[itemNumber];
|
2020-12-21 13:16:29 -03:00
|
|
|
|
|
|
|
if (TriggerActive(item))
|
|
|
|
AnimateItem(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ControlTriggerTriggerer(short itemNumber)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* item = &g_Level.Items[itemNumber];
|
2022-02-09 16:55:46 +11:00
|
|
|
FLOOR_INFO* floor = GetFloor(item->Position.xPos, item->Position.yPos, item->Position.zPos, &item->RoomNumber);
|
2021-08-20 15:26:12 +03:00
|
|
|
|
|
|
|
if (floor->Flags.MarkTriggerer)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2021-08-20 15:26:12 +03:00
|
|
|
if (TriggerActive(item))
|
|
|
|
floor->Flags.MarkTriggererActive = true;
|
|
|
|
else
|
|
|
|
floor->Flags.MarkTriggererActive = false;
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void AnimateWaterfalls()
|
|
|
|
{
|
2021-05-21 05:38:20 +02:00
|
|
|
return;
|
|
|
|
|
2020-12-21 13:16:29 -03:00
|
|
|
lastWaterfallY = (lastWaterfallY - 7) & 0x3F;
|
|
|
|
float y = lastWaterfallY * 0.00390625f;
|
|
|
|
float theY;
|
|
|
|
|
|
|
|
for (int i = 0; i < 6; i++)
|
|
|
|
{
|
|
|
|
if (Objects[ID_WATERFALL1 + i].loaded)
|
|
|
|
{
|
|
|
|
OBJECT_TEXTURE* texture = WaterfallTextures[i];
|
|
|
|
|
|
|
|
texture->vertices[0].y = y + WaterfallY[i];
|
|
|
|
texture->vertices[1].y = y + WaterfallY[i];
|
|
|
|
texture->vertices[2].y = y + WaterfallY[i] + 0.24609375f;
|
|
|
|
texture->vertices[3].y = y + WaterfallY[i] + 0.24609375f;
|
|
|
|
|
|
|
|
if (i < 5)
|
|
|
|
{
|
|
|
|
texture++;
|
|
|
|
|
|
|
|
texture->vertices[0].y = y + WaterfallY[i];
|
|
|
|
texture->vertices[1].y = y + WaterfallY[i];
|
|
|
|
texture->vertices[2].y = y + WaterfallY[i] + 0.24609375f;
|
|
|
|
texture->vertices[3].y = y + WaterfallY[i] + 0.24609375f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-26 06:04:32 +02:00
|
|
|
void ControlWaterfall(short itemNumber)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* item = &g_Level.Items[itemNumber];
|
2020-12-21 13:16:29 -03:00
|
|
|
|
2022-02-09 16:55:46 +11:00
|
|
|
int dx = item->Position.xPos - LaraItem->Position.xPos;
|
|
|
|
int dy = item->Position.yPos - LaraItem->Position.yPos;
|
|
|
|
int dz = item->Position.zPos - LaraItem->Position.zPos;
|
2020-12-21 13:16:29 -03:00
|
|
|
|
2021-05-26 06:04:32 +02:00
|
|
|
if (dx >= -16384 && dx <= 16384 && dy >= -16384 && dy <= 16384 && dz >= -16384 && dz <= 16384)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2021-05-26 06:04:32 +02:00
|
|
|
if (!(Wibble & 0xC))
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2021-05-26 06:04:32 +02:00
|
|
|
TriggerWaterfallMist(
|
2022-02-09 16:55:46 +11:00
|
|
|
item->Position.xPos + 68 * phd_sin(item->Position.yRot),
|
|
|
|
item->Position.yPos,
|
|
|
|
item->Position.zPos + 68 * phd_cos(item->Position.yRot),
|
|
|
|
item->Position.yRot >> 4);
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
2021-05-26 06:04:32 +02:00
|
|
|
|
2022-02-09 16:55:46 +11:00
|
|
|
SoundEffect(SFX_TR4_WATERFALL_LOOP, &item->Position, 0);
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
void TightropeCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* laraInfo = GetLaraInfo(laraItem);
|
|
|
|
auto* tightropeItem = &g_Level.Items[itemNumber];
|
2020-12-21 13:16:29 -03:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
if ((!(TrInput & IN_ACTION) ||
|
|
|
|
laraItem->ActiveState != LS_IDLE ||
|
|
|
|
laraItem->AnimNumber != LA_STAND_IDLE ||
|
|
|
|
laraItem->Status == ITEM_INVISIBLE ||
|
|
|
|
laraInfo->Control.HandStatus != HandStatus::Free) &&
|
|
|
|
(!laraInfo->Control.IsMoving || laraInfo->interactedItem !=itemNumber))
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2021-09-05 14:49:00 +02:00
|
|
|
#ifdef NEW_TIGHTROPE
|
2022-02-24 14:22:30 +11:00
|
|
|
if (laraItem->ActiveState == LS_TIGHTROPE_WALK &&
|
|
|
|
laraItem->TargetState != LS_TIGHTROPE_DISMOUNT &&
|
|
|
|
!laraInfo->Control.TightropeControl.CanDismount)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (tightropeItem->Position.yRot == laraItem->Position.yRot)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (abs(tightropeItem->Position.xPos - laraItem->Position.xPos) + abs(tightropeItem->Position.zPos - laraItem->Position.zPos) < 640)
|
|
|
|
laraInfo->Control.TightropeControl.CanDismount = true;
|
2021-09-05 14:49:00 +02:00
|
|
|
}
|
|
|
|
}
|
2022-02-10 16:18:15 +11:00
|
|
|
|
|
|
|
#else // !NEW_TIGHTROPE
|
2022-02-24 14:22:30 +11:00
|
|
|
if (laraItem->ActiveState == LS_TIGHTROPE_WALK &&
|
|
|
|
laraItem->TargetState != LS_TIGHTROPE_DISMOUNT &&
|
|
|
|
!laraInfo->Control.TightropeControl.Off)
|
2021-09-05 14:49:00 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (item->Position.yRot == laraItem->Position.yRot)
|
2021-09-05 14:49:00 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (abs(item->Position.xPos - laraItem->Position.xPos) + abs(item->Position.zPos - laraItem->Position.zPos) < 640)
|
|
|
|
laraInfo->tightRopeOff = true;
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
}
|
2021-09-05 14:49:00 +02:00
|
|
|
#endif
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
tightropeItem->Position.yRot += -ANGLE(180.0f);
|
2022-02-10 16:18:15 +11:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
if (TestLaraPosition(&TightRopeBounds, tightropeItem, laraItem))
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (MoveLaraPosition(&TightRopePos, tightropeItem, laraItem))
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
laraItem->ActiveState = LS_TIGHTROPE_ENTER;
|
|
|
|
laraItem->AnimNumber = LA_TIGHTROPE_START;
|
|
|
|
laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase;
|
|
|
|
laraInfo->Control.IsMoving = false;
|
|
|
|
ResetLaraFlex(laraItem);
|
2021-09-05 14:49:00 +02:00
|
|
|
#ifdef NEW_TIGHTROPE
|
2022-02-24 14:22:30 +11:00
|
|
|
laraInfo->Control.TightropeControl.Balance = 0;
|
|
|
|
laraInfo->Control.TightropeControl.CanDismount = false;
|
|
|
|
laraInfo->Control.TightropeControl.TightropeItem = itemNumber;
|
|
|
|
laraInfo->Control.TightropeControl.TimeOnTightrope = 0;
|
2021-09-05 14:49:00 +02:00
|
|
|
#else // !NEW_TIGHTROPE
|
2022-02-24 14:22:30 +11:00
|
|
|
laraInfo->Control.TightropeControl.OnCount = 60;
|
|
|
|
laraInfo->Control.TightropeControl.Off = 0;
|
|
|
|
laraInfo->Control.TightropeControl.Fall = 0;
|
2021-09-05 14:49:00 +02:00
|
|
|
#endif
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
else
|
2022-02-24 14:22:30 +11:00
|
|
|
laraInfo->interactedItem = itemNumber;
|
2022-02-10 16:18:15 +11:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
tightropeItem->Position.yRot += -ANGLE(180.0f);
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (laraInfo->Control.IsMoving && laraInfo->interactedItem == itemNumber)
|
|
|
|
laraInfo->Control.IsMoving = false;
|
2022-02-10 16:18:15 +11:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
tightropeItem->Position.yRot += -ANGLE(180.0f);
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
void HorizontalBarCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* laraInfo = GetLaraInfo(laraItem);
|
|
|
|
auto* barItem = &g_Level.Items[itemNumber];
|
|
|
|
|
|
|
|
if (TrInput & IN_ACTION &&
|
|
|
|
laraItem->ActiveState == LS_REACH &&
|
|
|
|
laraItem->AnimNumber == LA_REACH)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
int test1 = TestLaraPosition(&ParallelBarsBounds, barItem, laraItem);
|
2020-12-21 13:16:29 -03:00
|
|
|
int test2 = 0;
|
|
|
|
if (!test1)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
barItem->Position.yRot += -ANGLE(180.0f);
|
|
|
|
test2 = TestLaraPosition(&ParallelBarsBounds, barItem, laraItem);
|
|
|
|
barItem->Position.yRot += -ANGLE(180);
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (test1 || test2)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
laraItem->ActiveState = LS_MISC_CONTROL;
|
|
|
|
laraItem->AnimNumber = LA_SWINGBAR_GRAB;
|
|
|
|
laraItem->FrameNumber = g_Level.Anims[laraItem->AnimNumber].frameBase;
|
|
|
|
laraItem->VerticalVelocity = false;
|
|
|
|
laraItem->Airborne = false;
|
2020-12-21 13:16:29 -03:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
ResetLaraFlex(barItem);
|
2020-12-21 13:16:29 -03:00
|
|
|
|
|
|
|
if (test1)
|
2022-02-24 14:22:30 +11:00
|
|
|
laraItem->Position.yRot = barItem->Position.yRot;
|
2020-12-21 13:16:29 -03:00
|
|
|
else
|
2022-02-24 14:22:30 +11:00
|
|
|
laraItem->Position.yRot = barItem->Position.yRot + -ANGLE(180.0f);
|
2020-12-21 13:16:29 -03:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
PHD_VECTOR pos1 = { 0, -128, 512 };
|
2020-12-21 13:16:29 -03:00
|
|
|
GetLaraJointPosition(&pos1, LM_LHAND);
|
2022-02-24 14:22:30 +11:00
|
|
|
|
|
|
|
PHD_VECTOR pos2 = { 0, -128, 512 };
|
2020-12-21 13:16:29 -03:00
|
|
|
GetLaraJointPosition(&pos2, LM_RHAND);
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
if (laraItem->Position.yRot & 0x4000)
|
|
|
|
laraItem->Position.xPos += barItem->Position.xPos - ((pos1.x + pos2.x) >> 1);
|
2020-12-21 13:16:29 -03:00
|
|
|
else
|
2022-02-24 14:22:30 +11:00
|
|
|
laraItem->Position.zPos += barItem->Position.zPos - ((pos1.z + pos2.z) / 2);
|
|
|
|
laraItem->Position.yPos += barItem->Position.yPos - ((pos1.y + pos2.y) / 2);
|
2020-12-21 13:16:29 -03:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
laraInfo->interactedItem = itemNumber;
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
else
|
2022-02-24 14:22:30 +11:00
|
|
|
ObjectCollision(itemNumber, laraItem, coll);
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
2022-02-24 14:22:30 +11:00
|
|
|
else if (laraItem->ActiveState != LS_HORIZONTAL_BAR_SWING)
|
|
|
|
ObjectCollision(itemNumber, laraItem, coll);
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
void CutsceneRopeControl(short itemNumber)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* ropeItem = &g_Level.Items[itemNumber];
|
|
|
|
|
|
|
|
PHD_VECTOR pos1 = { -128, -72, -16 };
|
|
|
|
GetJointAbsPosition(&g_Level.Items[ropeItem->ItemFlags[2]], &pos1, 0);
|
|
|
|
|
|
|
|
PHD_VECTOR pos2 = { 830, -12, 0 };
|
|
|
|
GetJointAbsPosition(&g_Level.Items[ropeItem->ItemFlags[3]], &pos2, 0);
|
|
|
|
|
|
|
|
ropeItem->Position.xPos = pos2.x;
|
|
|
|
ropeItem->Position.yPos = pos2.y;
|
|
|
|
ropeItem->Position.zPos = pos2.z;
|
|
|
|
|
|
|
|
int dx = (pos2.x - pos1.x) * (pos2.x - pos1.x);
|
|
|
|
int dy = (pos2.y - pos1.y) * (pos2.y - pos1.y);
|
|
|
|
int dz = (pos2.z - pos1.z) * (pos2.z - pos1.z);
|
|
|
|
|
|
|
|
ropeItem->ItemFlags[1] = ((sqrt(dx + dy + dz) * 2) + sqrt(dx + dy + dz)) * 2;
|
|
|
|
ropeItem->Position.xRot = -4869;
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
void HybridCollision(short itemNumber, ITEM_INFO* laraitem, COLL_INFO* coll)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* item = &g_Level.Items[itemNumber];
|
2020-12-21 13:16:29 -03:00
|
|
|
|
|
|
|
/*if (gfCurrentLevel == LVL5_SINKING_SUBMARINE)
|
|
|
|
{
|
|
|
|
if (item->frameNumber < g_Level.Anims[item->animNumber].frame_end)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
ObjectCollision(itemNumber, laraitem, coll);
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
}*/
|
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
void InitialiseTightrope(short itemNumber)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* tightropeItem = &g_Level.Items[itemNumber];
|
2020-12-21 13:16:29 -03:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
if (tightropeItem->Position.yRot > 0)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (tightropeItem->Position.yRot == ANGLE(90.0f))
|
|
|
|
tightropeItem->Position.xPos -= 256;
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
2022-02-24 14:22:30 +11:00
|
|
|
else if (tightropeItem->Position.yRot)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (tightropeItem->Position.yRot == -ANGLE(180.0f))
|
|
|
|
tightropeItem->Position.zPos += CLICK(1);
|
|
|
|
else if (tightropeItem->Position.yRot == -ANGLE(90.0f))
|
|
|
|
tightropeItem->Position.xPos += CLICK(1);
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
else
|
2022-02-24 14:22:30 +11:00
|
|
|
tightropeItem->Position.zPos -= CLICK(1);
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
void InitialiseAnimating(short itemNumber)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
/*auto* item = &g_Level.Items[itemNumber];
|
2022-02-09 16:55:46 +11:00
|
|
|
item->ActiveState = 0;
|
2020-12-21 13:16:29 -03:00
|
|
|
item->animNumber = Objects[item->objectNumber].animIndex;
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;*/
|
|
|
|
}
|
|
|
|
|
|
|
|
void AnimatingControl(short itemNumber)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* item = &g_Level.Items[itemNumber];
|
2020-12-21 13:16:29 -03:00
|
|
|
|
|
|
|
if (!TriggerActive(item))
|
|
|
|
return;
|
|
|
|
|
2022-02-09 16:55:46 +11:00
|
|
|
item->Status = ITEM_ACTIVE;
|
2020-12-21 13:16:29 -03:00
|
|
|
AnimateItem(item);
|
|
|
|
|
|
|
|
// TODO: ID_SHOOT_SWITCH2 probably the bell in Trajan Markets, use LUA for that
|
|
|
|
/*if (item->frameNumber >= g_Level.Anims[item->animNumber].frameEnd)
|
|
|
|
{
|
|
|
|
item->frameNumber = g_Level.Anims[item->animNumber].frameBase;
|
|
|
|
RemoveActiveItem(itemNumber);
|
|
|
|
item->aiBits = 0;
|
|
|
|
item->status = ITEM_NOT_ACTIVE;
|
|
|
|
}*/
|
|
|
|
}
|
|
|
|
|
|
|
|
void HighObject2Control(short itemNumber)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* item = &g_Level.Items[itemNumber];
|
2020-12-21 13:16:29 -03:00
|
|
|
|
|
|
|
if (!TriggerActive(item))
|
|
|
|
return;
|
|
|
|
|
2022-02-09 16:55:46 +11:00
|
|
|
if (!item->ItemFlags[2])
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-09 16:55:46 +11:00
|
|
|
int div = item->TriggerFlags % 10 << 10;
|
|
|
|
int mod = item->TriggerFlags / 10 << 10;
|
|
|
|
item->ItemFlags[0] = GetRandomControl() % div;
|
|
|
|
item->ItemFlags[1] = GetRandomControl() % mod;
|
|
|
|
item->ItemFlags[2] = (GetRandomControl() & 0xF) + 15;
|
2020-12-21 13:16:29 -03:00
|
|
|
}
|
|
|
|
|
2022-02-09 16:55:46 +11:00
|
|
|
if (--item->ItemFlags[2] < 15)
|
2020-12-21 13:16:29 -03:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* spark = &Sparks[GetFreeSpark()];
|
2020-12-21 13:16:29 -03:00
|
|
|
spark->on = 1;
|
|
|
|
spark->sR = -1;
|
|
|
|
spark->sB = 16;
|
|
|
|
spark->sG = (GetRandomControl() & 0x1F) + 48;
|
|
|
|
spark->dR = (GetRandomControl() & 0x3F) - 64;
|
|
|
|
spark->dB = 0;
|
|
|
|
spark->dG = (GetRandomControl() & 0x3F) + -128;
|
|
|
|
spark->fadeToBlack = 4;
|
|
|
|
spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
|
2021-10-27 19:00:30 +03:00
|
|
|
spark->transType = TransTypeEnum::COLADD;
|
2020-12-21 13:16:29 -03:00
|
|
|
spark->life = spark->sLife = (GetRandomControl() & 3) + 24;
|
2022-02-09 16:55:46 +11:00
|
|
|
spark->x = item->ItemFlags[1] + (GetRandomControl() & 0x3F) + item->Position.xPos - 544;
|
|
|
|
spark->y = item->Position.yPos;
|
|
|
|
spark->z = item->ItemFlags[0] + (GetRandomControl() & 0x3F) + item->Position.zPos - 544;
|
2020-12-21 13:16:29 -03:00
|
|
|
spark->xVel = (GetRandomControl() & 0x1FF) - 256;
|
|
|
|
spark->friction = 6;
|
|
|
|
spark->zVel = (GetRandomControl() & 0x1FF) - 256;
|
|
|
|
spark->rotAng = GetRandomControl() & 0xFFF;
|
|
|
|
spark->rotAdd = (GetRandomControl() & 0x3F) - 32;
|
|
|
|
spark->maxYvel = 0;
|
|
|
|
spark->yVel = -512 - (GetRandomControl() & 0x3FF);
|
|
|
|
spark->sSize = spark->size = (GetRandomControl() & 0xF) + 32;
|
|
|
|
spark->dSize = spark->size / 4;
|
|
|
|
|
|
|
|
if (GetRandomControl() & 3)
|
|
|
|
{
|
|
|
|
spark->flags = SP_ROTATE | SP_DEF | SP_SCALE | SP_EXPDEF;
|
|
|
|
spark->scalar = 3;
|
|
|
|
spark->gravity = (GetRandomControl() & 0x3F) + 32;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->flags = SP_ROTATE | SP_DEF | SP_SCALE;
|
|
|
|
spark->def = Objects[ID_DEFAULT_SPRITES].meshIndex + SPR_UNDERWATERDUST;
|
|
|
|
spark->scalar = 1;
|
|
|
|
spark->gravity = (GetRandomControl() & 0xF) + 64;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|