2018-11-14 20:54:18 +01:00
|
|
|
#include "effect2.h"
|
|
|
|
#include "draw.h"
|
|
|
|
|
2018-11-24 09:39:37 +01:00
|
|
|
#include "..\Scripting\GameFlowScript.h"
|
|
|
|
|
|
|
|
extern GameFlow* g_GameFlow;
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void TriggerDynamicLight(int x, int y, int z, short falloff, byte r, byte g, byte b)
|
2018-11-14 20:54:18 +01:00
|
|
|
{
|
|
|
|
g_Renderer->AddDynamicLight(x, y, z, falloff, r, g, b);
|
|
|
|
}
|
|
|
|
|
2019-12-03 14:58:00 +01:00
|
|
|
static byte TriggerGunSmoke_SubFunction(int weaponType)
|
2018-11-01 09:10:32 +01:00
|
|
|
{
|
2019-12-03 14:58:00 +01:00
|
|
|
switch (weaponType)
|
|
|
|
{
|
|
|
|
case WEAPON_HK:
|
|
|
|
case WEAPON_ROCKET_LAUNCHER:
|
|
|
|
case WEAPON_GRENADE_LAUNCHER:
|
|
|
|
return 12; // Rocket and Grenade value for TriggerGunSmoke in TR3 have the value 12 ! (the HK is not included there)
|
|
|
|
|
|
|
|
// other weapon
|
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TriggerGunSmoke(int x, int y, int z, short xv, short yv, short zv, byte initial, int weaponType, byte count)
|
|
|
|
{
|
|
|
|
SMOKE_SPARKS* spark;
|
2018-11-01 09:10:32 +01:00
|
|
|
|
2019-12-03 14:58:00 +01:00
|
|
|
spark = &SmokeSparks[GetFreeSmokeSpark()];
|
2018-11-01 09:10:32 +01:00
|
|
|
spark->On = true;
|
|
|
|
spark->sShade = 0;
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->dShade = (count << 2);
|
2018-11-01 09:10:32 +01:00
|
|
|
spark->ColFadeSpeed = 4;
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->FadeToBlack = 32 - (initial << 4);
|
2018-11-01 09:10:32 +01:00
|
|
|
spark->Life = (GetRandomControl() & 3) + 40;
|
|
|
|
spark->sLife = spark->Life;
|
|
|
|
|
2019-12-03 14:58:00 +01:00
|
|
|
if (weaponType == WEAPON_PISTOLS || weaponType == WEAPON_REVOLVER || weaponType == WEAPON_UZI)
|
|
|
|
{
|
|
|
|
if (spark->dShade > 64)
|
|
|
|
spark->dShade = 64;
|
|
|
|
}
|
2018-11-01 09:10:32 +01:00
|
|
|
|
|
|
|
spark->TransType = 2;
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->x = x + (GetRandomControl() & 31) - 16;
|
|
|
|
spark->y = y + (GetRandomControl() & 31) - 16;
|
|
|
|
spark->z = z + (GetRandomControl() & 31) - 16;
|
2018-11-01 09:10:32 +01:00
|
|
|
|
|
|
|
if (initial)
|
|
|
|
{
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->Xvel = ((GetRandomControl() & 1023) - 512) + xv;
|
|
|
|
spark->Yvel = ((GetRandomControl() & 1023) - 512) + yv;
|
|
|
|
spark->Zvel = ((GetRandomControl() & 1023) - 512) + zv;
|
2018-11-01 09:10:32 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->Xvel = ((GetRandomControl() & 511) - 256) >> 1;
|
|
|
|
spark->Yvel = ((GetRandomControl() & 511) - 256) >> 1;
|
|
|
|
spark->Zvel = ((GetRandomControl() & 511) - 256) >> 1;
|
2018-11-01 09:10:32 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
spark->Friction = 4;
|
|
|
|
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
{
|
2019-12-03 14:58:00 +01:00
|
|
|
if (Rooms[LaraItem->roomNumber].flags & ENV_FLAG_WIND)
|
|
|
|
spark->Flags = SP_ROTATE | SP_WIND;
|
2018-11-01 09:10:32 +01:00
|
|
|
else
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->Flags = SP_ROTATE;
|
2018-11-01 09:10:32 +01:00
|
|
|
|
|
|
|
spark->RotAng = GetRandomControl() & 255;
|
|
|
|
|
|
|
|
if (GetRandomControl() & 1)
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->RotAdd = -(GetRandomControl() & 15) - 16;
|
2018-11-01 09:10:32 +01:00
|
|
|
else
|
|
|
|
spark->RotAdd = (GetRandomControl() & 15) + 16;
|
|
|
|
}
|
2019-12-03 14:58:00 +01:00
|
|
|
else if (Rooms[LaraItem->roomNumber].flags & ENV_FLAG_WIND)
|
2018-11-01 09:10:32 +01:00
|
|
|
{
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->Flags = SP_WIND;
|
2018-11-01 09:10:32 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->Flags = 0;
|
|
|
|
}
|
|
|
|
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->Gravity = -(GetRandomControl() & 1) - 2;
|
|
|
|
spark->MaxYvel = -(GetRandomControl() & 1) - 2;
|
2018-11-01 09:10:32 +01:00
|
|
|
|
2019-12-03 14:58:00 +01:00
|
|
|
byte size = ((GetRandomControl() & 7) + 24) - TriggerGunSmoke_SubFunction(weaponType);
|
2018-11-01 09:10:32 +01:00
|
|
|
|
|
|
|
if (initial)
|
|
|
|
{
|
|
|
|
spark->sSize = size >> 1;
|
|
|
|
spark->Size = size >> 1;
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->dSize = (size << 1) + 8;
|
2018-11-01 09:10:32 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->sSize = size >> 2;
|
|
|
|
spark->Size = size >> 2;
|
2019-12-03 14:58:00 +01:00
|
|
|
spark->dSize = size;
|
2018-11-01 09:10:32 +01:00
|
|
|
}
|
|
|
|
|
2019-12-03 14:58:00 +01:00
|
|
|
/*if (gfLevelFlags & 0x20 && LaraItem->room_number == gfMirrorRoom) // 0x20 = GF_MIRROR_ENABLED
|
2018-11-01 09:10:32 +01:00
|
|
|
{
|
|
|
|
spark->mirror = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->mirror = 0;
|
|
|
|
}*/
|
2018-11-14 20:54:18 +01:00
|
|
|
}
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void TriggerRocketFlame(int x, int y, int z, int xv, int yv, int zv, int itemNumber)
|
2018-11-01 22:45:59 +01:00
|
|
|
{
|
|
|
|
SPARKS* sptr = &Sparks[GetFreeSpark()];
|
|
|
|
|
|
|
|
sptr->on = true;
|
|
|
|
sptr->sR = 48 + (GetRandomControl() & 31);
|
|
|
|
sptr->sG = sptr->sR;
|
|
|
|
sptr->sB = 192 + (GetRandomControl() & 63);
|
|
|
|
|
|
|
|
sptr->dR = 192 + (GetRandomControl() & 63);
|
|
|
|
sptr->dG = 128 + (GetRandomControl() & 63);
|
|
|
|
sptr->dB = 32;
|
|
|
|
|
|
|
|
sptr->colFadeSpeed = 12 + (GetRandomControl() & 3);
|
|
|
|
sptr->fadeToBlack = 12;
|
|
|
|
sptr->sLife = sptr->life = (GetRandomControl() & 3) + 28;
|
|
|
|
sptr->transType = 2;
|
|
|
|
sptr->extras = 0;
|
|
|
|
sptr->dynamic = -1;
|
|
|
|
|
|
|
|
sptr->x = x + ((GetRandomControl() & 31) - 16);
|
|
|
|
sptr->y = y;
|
|
|
|
sptr->z = z + ((GetRandomControl() & 31) - 16);
|
|
|
|
|
|
|
|
sptr->xVel = xv;
|
|
|
|
sptr->yVel = yv;
|
|
|
|
sptr->zVel = zv;
|
|
|
|
sptr->friction = 3 | (3 << 4);
|
|
|
|
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
{
|
|
|
|
sptr->flags = SP_SCALE | SP_DEF | SP_ROTATE | SP_ITEM | SP_EXPDEF;
|
|
|
|
sptr->fxObj = itemNumber;
|
|
|
|
sptr->rotAng = GetRandomControl() & 4095;
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
sptr->rotAdd = -(GetRandomControl() & 15) - 16;
|
|
|
|
else
|
|
|
|
sptr->rotAdd = (GetRandomControl() & 15) + 16;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sptr->flags = SP_SCALE | SP_DEF | SP_ITEM | SP_EXPDEF;
|
|
|
|
sptr->fxObj = itemNumber;
|
|
|
|
}
|
|
|
|
|
|
|
|
sptr->gravity = 0;
|
|
|
|
sptr->maxYvel = 0;
|
|
|
|
|
|
|
|
// TODO: right sprite
|
|
|
|
sptr->def = Objects[ID_DEFAULT_SPRITES].meshIndex;
|
|
|
|
sptr->scalar = 2;
|
|
|
|
|
2019-11-27 15:12:35 +01:00
|
|
|
int size = (GetRandomControl() & 7) + 32;
|
2018-11-01 22:45:59 +01:00
|
|
|
sptr->size = sptr->sSize = size;
|
|
|
|
}
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void TriggerRocketSmoke(int x, int y, int z, int bodyPart)
|
2018-11-01 22:45:59 +01:00
|
|
|
{
|
|
|
|
SPARKS* sptr = &Sparks[GetFreeSpark()];
|
|
|
|
|
|
|
|
sptr->on = true;
|
|
|
|
sptr->sR = 0;
|
|
|
|
sptr->sG = 0;
|
|
|
|
sptr->sB = 0;
|
|
|
|
|
|
|
|
sptr->dR = 64 + bodyPart;
|
|
|
|
sptr->dG = 64 + bodyPart;
|
|
|
|
sptr->dB = 64 + bodyPart;
|
|
|
|
|
|
|
|
sptr->colFadeSpeed = 4 + (GetRandomControl() & 3);
|
|
|
|
sptr->fadeToBlack = 12;
|
|
|
|
sptr->sLife = sptr->life = (GetRandomControl() & 3) + 20;
|
|
|
|
sptr->transType = 2;
|
|
|
|
sptr->extras = 0;
|
|
|
|
sptr->dynamic = -1;
|
|
|
|
|
|
|
|
sptr->x = x + ((GetRandomControl() & 15) - 8);
|
|
|
|
sptr->y = y + ((GetRandomControl() & 15) - 8);
|
|
|
|
sptr->z = z + ((GetRandomControl() & 15) - 8);
|
|
|
|
sptr->xVel = ((GetRandomControl() & 255) - 128);
|
|
|
|
sptr->yVel = -(GetRandomControl() & 3) - 4;
|
|
|
|
sptr->zVel = ((GetRandomControl() & 255) - 128);
|
|
|
|
sptr->friction = 4;
|
|
|
|
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
{
|
|
|
|
sptr->flags = SP_SCALE | SP_DEF | SP_ROTATE | SP_EXPDEF;
|
|
|
|
sptr->rotAng = GetRandomControl() & 4095;
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
sptr->rotAdd = -(GetRandomControl() & 15) - 16;
|
|
|
|
else
|
|
|
|
sptr->rotAdd = (GetRandomControl() & 15) + 16;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sptr->flags = SP_SCALE | SP_DEF | SP_EXPDEF;
|
|
|
|
|
|
|
|
// TODO: right sprite
|
|
|
|
sptr->def = Objects[ID_DEFAULT_SPRITES].meshIndex;
|
|
|
|
sptr->scalar = 3;
|
|
|
|
sptr->gravity = -(GetRandomControl() & 3) - 4;
|
|
|
|
sptr->maxYvel = -(GetRandomControl() & 3) - 4;
|
|
|
|
|
2019-11-27 15:12:35 +01:00
|
|
|
int size = (GetRandomControl() & 7) + 32;
|
2018-11-01 22:45:59 +01:00
|
|
|
sptr->size = sptr->sSize = size >> 2;
|
2018-11-14 20:54:18 +01:00
|
|
|
}
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void GrenadeExplosionEffects(int x, int y, int z, short roomNumber)
|
2018-11-24 09:39:37 +01:00
|
|
|
{
|
|
|
|
ROOM_INFO* room = &Rooms[roomNumber];
|
|
|
|
|
|
|
|
bool mirror = (roomNumber == g_GameFlow->GetLevel(CurrentLevel)->Mirror.Room);
|
|
|
|
|
|
|
|
bool water = false;
|
|
|
|
if (room->flags & ENV_FLAG_WATER)
|
|
|
|
{
|
|
|
|
TriggerExplosionBubbles(x, y, z, roomNumber);
|
|
|
|
water = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
SMOKE_SPARKS* spark = &SmokeSparks[GetFreeSmokeSpark()];
|
|
|
|
spark->On = true;
|
|
|
|
spark->sShade = 0;
|
|
|
|
spark->dShade = -128;
|
|
|
|
spark->ColFadeSpeed = 4;
|
|
|
|
spark->FadeToBlack = 16;
|
|
|
|
spark->TransType = 2;
|
|
|
|
spark->Life = spark->sLife = (GetRandomControl() & 0xF) + 64;
|
|
|
|
spark->x = (GetRandomControl() & 0x1F) + x - 16;
|
|
|
|
spark->y = (GetRandomControl() & 0x1F) + y - 16;
|
|
|
|
spark->z = (GetRandomControl() & 0x1F) + z - 16;
|
|
|
|
|
|
|
|
if (water)
|
|
|
|
{
|
|
|
|
spark->Xvel = spark->Yvel = GetRandomControl() & 0x3FF - 512;
|
|
|
|
spark->Zvel = (GetRandomControl() & 0x3FF) - 512;
|
|
|
|
spark->Friction = 68;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->Xvel = 2 * (GetRandomControl() & 0x3FF) - 1024;
|
|
|
|
spark->Yvel = -512 - (GetRandomControl() & 0x3FF);
|
|
|
|
spark->Zvel = 2 * (GetRandomControl() & 0x3FF) - 1024;
|
|
|
|
spark->Friction = 85;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (room->flags & ENV_FLAG_WIND)
|
|
|
|
spark->Flags = 272;
|
|
|
|
else
|
|
|
|
spark->Flags = 16;
|
|
|
|
|
|
|
|
spark->RotAng = GetRandomControl() & 0xFFF;
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
{
|
|
|
|
spark->RotAdd = -16 - (GetRandomControl() & 0xF);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->RotAdd = (GetRandomControl() & 0xF) + 16;
|
|
|
|
}
|
|
|
|
spark->MaxYvel = 0;
|
|
|
|
spark->Gravity = 0;
|
|
|
|
spark->sSize = spark->Size = (GetRandomControl() & 0x1F) + 64;
|
|
|
|
spark->dSize = 2 * (spark->sSize + 4);
|
|
|
|
spark->mirror = mirror;
|
|
|
|
}
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void GrenadeLauncherSpecialEffect1(int x, int y, int z, int flag1, int flag2)
|
2018-11-24 09:39:37 +01:00
|
|
|
{
|
2019-11-27 15:12:35 +01:00
|
|
|
int dx = LaraItem->pos.xPos - x;
|
|
|
|
int dz = LaraItem->pos.zPos - z;
|
2018-11-24 09:39:37 +01:00
|
|
|
|
|
|
|
if (dx >= -ANGLE(90) && dx <= ANGLE(90) && dz >= -ANGLE(90) && dz <= ANGLE(90))
|
|
|
|
{
|
|
|
|
SPARKS* spark = &Sparks[GetFreeSpark()];
|
|
|
|
|
|
|
|
spark->on = true;
|
|
|
|
|
|
|
|
if (flag2 == 2)
|
|
|
|
{
|
|
|
|
spark->sR = spark->sG = (GetRandomControl() & 0x1F) + 48;
|
|
|
|
spark->sB = (GetRandomControl() & 0x3F) - 64;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (flag2 == -2)
|
|
|
|
{
|
|
|
|
spark->sR = 48;
|
|
|
|
spark->sG = 255;
|
|
|
|
spark->sB = (GetRandomControl() & 0x1F) + 48;
|
|
|
|
|
|
|
|
spark->dR = 32;
|
|
|
|
spark->dG = (GetRandomControl() & 0x3F) - 64;
|
|
|
|
spark->dB = (GetRandomControl() & 0x3F) + -128;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->sR = 255;
|
|
|
|
spark->sB = 48;
|
|
|
|
spark->sG = (GetRandomControl() & 0x1F) + 48;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flag2 != -2)
|
|
|
|
{
|
|
|
|
spark->dR = (GetRandomControl() & 0x3F) - 64;
|
|
|
|
spark->dG = (GetRandomControl() & 0x3F) + -128;
|
|
|
|
spark->dB = 32;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flag1 == -1)
|
|
|
|
{
|
|
|
|
if (flag2 == 2 || flag2 == -2 || flag2 == -1)
|
|
|
|
{
|
|
|
|
spark->fadeToBlack = 6;
|
|
|
|
spark->colFadeSpeed = (GetRandomControl() & 3) + 5;
|
|
|
|
spark->life = spark->sLife = (flag2 < -2 ? 0 : 8) + (GetRandomControl() & 3) + 16;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->fadeToBlack = 8;
|
|
|
|
spark->colFadeSpeed = (GetRandomControl() & 3) + 20;
|
|
|
|
spark->life = spark->sLife = (GetRandomControl() & 7) + 40;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->fadeToBlack = 16;
|
|
|
|
spark->colFadeSpeed = (GetRandomControl() & 3) + 8;
|
|
|
|
spark->life = spark->sLife = (GetRandomControl() & 3) + 28;
|
|
|
|
}
|
|
|
|
|
|
|
|
spark->transType = 2;
|
|
|
|
|
|
|
|
if (flag1 != -1)
|
|
|
|
{
|
|
|
|
spark->y = 0;
|
|
|
|
spark->x = (GetRandomControl() & 0x1F) - 16;
|
|
|
|
spark->z = (GetRandomControl() & 0x1F) - 16;
|
|
|
|
|
|
|
|
//LABEL_POS_1:
|
|
|
|
|
|
|
|
if (flag2 && flag2 != 1)
|
|
|
|
{
|
|
|
|
if (flag2 < -2)
|
|
|
|
{
|
|
|
|
spark->y = y;
|
|
|
|
spark->x = (GetRandomControl() & 0xF) + x - 8;
|
|
|
|
spark->z = (GetRandomControl() & 0xF) + z - 8;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->x = (GetRandomControl() & 0x3F) + x - 32;
|
|
|
|
spark->y = y;
|
|
|
|
spark->z = (GetRandomControl() & 0x3F) + z - 32;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->y = y;
|
|
|
|
spark->x = (GetRandomControl() & 0x1F) + x - 16;
|
|
|
|
spark->z = (GetRandomControl() & 0x1F) + z - 16;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flag2 == 2)
|
|
|
|
{
|
|
|
|
spark->xVel = (GetRandomControl() & 0x1F) - 16;
|
|
|
|
spark->yVel = -1024 - (GetRandomControl() & 0x1FF);
|
|
|
|
spark->friction = 68;
|
|
|
|
spark->zVel = (GetRandomControl() & 0x1F) - 16;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->xVel = GetRandomControl() - 128;
|
|
|
|
spark->yVel = -16 - (GetRandomControl() & 0xF);
|
|
|
|
spark->zVel = GetRandomControl() - 128;
|
|
|
|
if (flag2 == 1)
|
|
|
|
{
|
|
|
|
spark->friction = 51;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->friction = 5;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
{
|
|
|
|
if (flag1 == -1)
|
|
|
|
{
|
|
|
|
spark->gravity = -16 - (GetRandomControl() & 0x1F);
|
|
|
|
spark->maxYvel = -16 - (GetRandomControl() & 7);
|
|
|
|
spark->flags = 538;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->flags = 602;
|
|
|
|
spark->fxObj = flag1;
|
|
|
|
spark->gravity = -32 - (GetRandomControl() & 0x3F);
|
|
|
|
spark->maxYvel = -24 - (GetRandomControl() & 7);
|
|
|
|
}
|
|
|
|
|
|
|
|
spark->rotAng = GetRandomControl() & 0xFFF;
|
|
|
|
|
|
|
|
if (GetRandomControl() & 1)
|
|
|
|
{
|
|
|
|
spark->rotAdd = -16 - (GetRandomControl() & 0xF);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->rotAdd = (GetRandomControl() & 0xF) + 16;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (flag1 == -1)
|
|
|
|
{
|
|
|
|
spark->flags = 522;
|
|
|
|
spark->gravity = -16 - (GetRandomControl() & 0x1F);
|
|
|
|
spark->maxYvel = -16 - (GetRandomControl() & 7);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->flags = 586;
|
|
|
|
spark->fxObj = flag1;
|
|
|
|
spark->gravity = -32 - (GetRandomControl() & 0x3F);
|
|
|
|
spark->maxYvel = -24 - (GetRandomControl() & 7);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
spark->scalar = 2;
|
|
|
|
|
|
|
|
if (flag2)
|
|
|
|
{
|
|
|
|
if (flag2 == 1)
|
|
|
|
{
|
|
|
|
spark->sSize = spark->size = (GetRandomControl() & 0x1F) + 64;
|
|
|
|
}
|
|
|
|
else if (flag2 < 254)
|
|
|
|
{
|
|
|
|
spark->maxYvel = 0;
|
|
|
|
spark->gravity = 0;
|
|
|
|
spark->sSize = spark->size = (GetRandomControl() & 0x1F) + 32;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->sSize = spark->size = (GetRandomControl() & 0xF) + 48;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->sSize = spark->size = (GetRandomControl() & 0x1F) + 128;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (flag2 == 2)
|
|
|
|
{
|
|
|
|
spark->dSize = spark->size >> 2;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->dSize = spark->size >> 4;
|
|
|
|
if (flag2 == 7)
|
|
|
|
{
|
|
|
|
spark->colFadeSpeed >>= 2;
|
|
|
|
spark->fadeToBlack = spark->fadeToBlack >> 2;
|
|
|
|
spark->life = spark->life >> 2;
|
|
|
|
spark->sLife = spark->life >> 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*if (flag2 && flag2 != 1)
|
|
|
|
{
|
|
|
|
if (flag2 < -2)
|
|
|
|
{
|
|
|
|
spark->y = y;
|
|
|
|
spark->x = (GetRandomControl() & 0xF) + x - 8;
|
|
|
|
spark->z = (GetRandomControl() & 0xF) + z - 8;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->x = (GetRandomControl() & 0x3F) + x - 32;
|
|
|
|
spark->y = y;
|
|
|
|
spark->z = (GetRandomControl() & 0x3F) + z - 32;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->y = y;
|
|
|
|
spark->x = (GetRandomControl() & 0x1F) + x - 16;
|
|
|
|
spark->z = (GetRandomControl() & 0x1F) + z - 16;
|
|
|
|
}
|
|
|
|
|
|
|
|
goto LABEL_POS_1;*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-02 14:49:19 +01:00
|
|
|
void TriggerMetalSparks(int x, int y, int z, int xv, int yv, int zv, int additional)
|
2018-11-25 21:13:14 +01:00
|
|
|
{
|
2019-11-27 15:12:35 +01:00
|
|
|
int dx = LaraItem->pos.xPos - x;
|
|
|
|
int dz = LaraItem->pos.zPos - z;
|
2018-11-25 21:13:14 +01:00
|
|
|
|
|
|
|
if (dx >= -16384 && dx <= 16384 && dz >= -16384 && dz <= 16384)
|
|
|
|
{
|
2019-11-27 15:12:35 +01:00
|
|
|
int r = rand();
|
2018-11-25 21:13:14 +01:00
|
|
|
|
|
|
|
SPARKS* spark = &Sparks[GetFreeSpark()];
|
|
|
|
|
|
|
|
spark->dG = (r & 0x7F) + 64;
|
|
|
|
spark->dB = -64 - (r & 0x7F) + 64;
|
|
|
|
spark->life = 10;
|
|
|
|
spark->sLife = 10;
|
|
|
|
spark->sR = -1;
|
|
|
|
spark->sG = -1;
|
|
|
|
spark->sB = -1;
|
|
|
|
spark->dR = -1;
|
|
|
|
spark->x = (r & 7) + x - 3;
|
|
|
|
spark->on = 1;
|
|
|
|
spark->colFadeSpeed = 3;
|
|
|
|
spark->fadeToBlack = 5;
|
|
|
|
spark->y = ((r >> 3) & 7) + y - 3;
|
|
|
|
spark->transType = 2;
|
|
|
|
spark->friction = 34;
|
|
|
|
spark->scalar = 1;
|
|
|
|
spark->z = ((r >> 6) & 7) + z - 3;
|
|
|
|
spark->flags = 2;
|
|
|
|
spark->xVel = (byte)(r >> 2) + xv - 128;
|
|
|
|
spark->yVel = (byte)(r >> 4) + yv - 128;
|
|
|
|
spark->zVel = (byte)(r >> 6) + zv - 128;
|
|
|
|
spark->sSize = ((r >> 9) & 3) + 4;
|
|
|
|
spark->size = ((r >> 9) & 3) + 4;
|
|
|
|
spark->dSize = ((r >> 12) & 1) + 1;
|
|
|
|
spark->maxYvel = 0;
|
|
|
|
spark->gravity = 0;
|
|
|
|
|
|
|
|
if (additional)
|
|
|
|
{
|
|
|
|
r = rand();
|
|
|
|
spark = &Sparks[GetFreeSpark()];
|
|
|
|
spark->on = 1;
|
|
|
|
spark->sR = spark->dR >> 1;
|
|
|
|
spark->sG = spark->dG >> 1;
|
|
|
|
spark->fadeToBlack = 4;
|
|
|
|
spark->transType = 2;
|
|
|
|
spark->colFadeSpeed = (r & 3) + 8;
|
|
|
|
spark->sB = spark->dB >> 1;
|
|
|
|
spark->dR = 32;
|
|
|
|
spark->dG = 32;
|
|
|
|
spark->dB = 32;
|
|
|
|
spark->yVel = yv;
|
|
|
|
spark->life = ((r >> 3) & 7) + 13;
|
|
|
|
spark->sLife = ((r >> 3) & 7) + 13;
|
|
|
|
spark->friction = 4;
|
|
|
|
spark->x = x + (xv >> 5);
|
|
|
|
spark->y = y + (yv >> 5);
|
|
|
|
spark->z = z + (zv >> 5);
|
|
|
|
spark->xVel = (r & 0x3F) + xv - 32;
|
|
|
|
spark->zVel = ((r >> 6) & 0x3F) + zv - 32;
|
|
|
|
if (r & 1)
|
|
|
|
{
|
|
|
|
spark->flags = 538;
|
|
|
|
spark->rotAng = r >> 3;
|
|
|
|
if (r & 2)
|
|
|
|
{
|
|
|
|
spark->rotAdd = -16 - (r & 0xF);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->rotAdd = (r & 0xF) + 16;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spark->flags = 522;
|
|
|
|
}
|
|
|
|
spark->gravity = -8 - (r >> 3 & 3);
|
|
|
|
spark->scalar = 2;
|
|
|
|
spark->maxYvel = -4 - (r >> 6 & 3);
|
|
|
|
spark->sSize = ((r >> 8) & 0xF) + 24 >> 3;
|
|
|
|
spark->size = ((r >> 8) & 0xF) + 24 >> 3;
|
|
|
|
spark->dSize = ((r >> 8) & 0xF) + 24;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-14 20:54:18 +01:00
|
|
|
void Inject_Effect2()
|
|
|
|
{
|
2019-12-01 08:13:19 +01:00
|
|
|
INJECT(0x00431240, TriggerDynamicLight);
|
2018-11-14 20:54:18 +01:00
|
|
|
INJECT(0x004820A0, TriggerGunSmoke);
|
2018-08-19 09:46:58 +02:00
|
|
|
}
|