TombEngine/TR5Main/Objects/Effects/tr4_bubbles.cpp

518 lines
No EOL
12 KiB
C++

#include "../newobjects.h"
#include "../../Game/effect2.h"
#include "../../Game/debris.h"
#include "../../Game/items.h"
#include "../../Game/traps.h"
#include "../../Game/draw.h"
#include "../../Game/tomb4fx.h"
#include "../../Game/effects.h"
void BubblesEffect1(short fxNum, short xVel, short yVel, short zVel)
{
FX_INFO* fx = &Effects[fxNum];
int dx = LaraItem->pos.xPos - fx->pos.xPos;
int dz = LaraItem->pos.zPos - fx->pos.zPos;
if (dx >= -16384 && dx <= 16384 && dz >= -16384 && dz <= 16384)
{
SPARKS* spark = &Sparks[GetFreeSpark()];
spark->on = 1;
spark->sR = 0;
spark->dR = 0;
spark->sG = (GetRandomControl() & 0x7F) + 32;
spark->sB = spark->dG + 64;
spark->dB = (GetRandomControl() & 0x7F) + 32;
spark->dG = spark->dB + 64;
spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
spark->transType = 2;
spark->life = spark->sLife = (GetRandomControl() & 3) + 16;
spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8;
spark->xVel = xVel;
spark->yVel = yVel;
spark->z = (GetRandomControl() & 0xF) - 8;
spark->zVel = zVel;
spark->friction = 68;
spark->flags = 602;
spark->rotAng = GetRandomControl() & 0xFFF;
if (GetRandomControl() & 1)
{
spark->rotAdd = -32 - (GetRandomControl() & 0x1F);
}
else
{
spark->rotAdd = (GetRandomControl() & 0x1F) + 32;
}
spark->gravity = 0;
spark->maxYvel = 0;
spark->fxObj = fxNum;
if (fx->flag1 == 1)
{
spark->scalar = 3;
}
else
{
spark->scalar = 2;
}
spark->sSize = spark->size = (GetRandomControl() & 7) + 64;
spark->dSize = spark->size >> 5;
}
}
void BubblesEffect2(short fxNum, short xVel, short yVel, short zVel)
{
FX_INFO* fx = &Effects[fxNum];
int dx = LaraItem->pos.xPos - fx->pos.xPos;
int dz = LaraItem->pos.zPos - fx->pos.zPos;
if (dx >= -16384 && dx <= 16384 && dz >= -16384 && dz <= 16384)
{
SPARKS* spark = &Sparks[GetFreeSpark()];
spark->on = 1;
spark->sR = 0;
spark->sG = (GetRandomControl() & 0x7F) + 32;
spark->sB = spark->dG + 64;
spark->dB = 0;
spark->dG = spark->dR = (GetRandomControl() & 0x7F) + 32;
spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
spark->transType = 2;
spark->life = spark->sLife = (GetRandomControl() & 3) + 16;
spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8;
spark->xVel = xVel;
spark->zVel = zVel;
spark->z = (GetRandomControl() & 0xF) - 8;
spark->yVel = yVel;
spark->friction = 68;
spark->flags = 602;
spark->rotAng = GetRandomControl() & 0xFFF;
if (GetRandomControl() & 1)
{
spark->rotAdd = -32 - (GetRandomControl() & 0x1F);
}
else
{
spark->rotAdd = (GetRandomControl() & 0x1F) + 32;
}
spark->gravity = 0;
spark->maxYvel = 0;
spark->fxObj = fxNum;
spark->scalar = 2;
spark->sSize = spark->size = (GetRandomControl() & 7) + 64;
spark->dSize = spark->size >> 5;
}
}
void BubblesEffect3(short fxNum, short xVel, short yVel, short zVel)
{
FX_INFO* fx = &Effects[fxNum];
int dx = LaraItem->pos.xPos - fx->pos.xPos;
int dz = LaraItem->pos.zPos - fx->pos.zPos;
if (dx >= -16384 && dx <= 16384 && dz >= -16384 && dz <= 16384)
{
SPARKS* spark = &Sparks[GetFreeSpark()];
spark->on = 1;
spark->sB = 0;
spark->sR = (GetRandomControl() & 0x3F) + -128;
spark->sG = spark->sG >> 1;
spark->dB = 0;
spark->dR = (GetRandomControl() & 0x3F) + -128;
spark->dG = spark->dG >> 1;
spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 8;
spark->transType = 2;
spark->dynamic = -1;
spark->life = spark->sLife = (GetRandomControl() & 7) + 32;
spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8;
spark->z = (GetRandomControl() & 0xF) - 8;
spark->x += fx->pos.xPos;
spark->y += fx->pos.yPos;
spark->z += fx->pos.zPos;
spark->xVel = xVel;
spark->yVel = yVel;
spark->zVel = zVel;
spark->friction = 34;
spark->flags = 538;
spark->rotAng = GetRandomControl() & 0xFFF;
if (GetRandomControl() & 1)
{
spark->rotAdd = -32 - (GetRandomControl() & 0x1F);
}
else
{
spark->rotAdd = (GetRandomControl() & 0x1F) + 32;
}
spark->gravity = 0;
spark->maxYvel = 0;
spark->fxObj = fxNum;
spark->scalar = 2;
spark->sSize = spark->size = (GetRandomControl() & 0xF) + 128;
spark->dSize = spark->size >> 2;
}
}
void BubblesEffect4(short fxNum, short xVel, short yVel, short zVel)
{
FX_INFO* fx = &Effects[fxNum];
int dx = LaraItem->pos.xPos - fx->pos.xPos;
int dz = LaraItem->pos.zPos - fx->pos.zPos;
if (dx >= -16384 && dx <= 16384 && dz >= -16384 && dz <= 16384)
{
SPARKS* spark = &Sparks[GetFreeSpark()];
spark->on = 1;
if (fx->flag1 == 3 || fx->flag1 == 4)
{
spark->sR = 0;
spark->dR = 0;
spark->sB = (GetRandomControl() & 0x7F) + 32;
spark->sG = spark->sB + 64;
spark->dG = (GetRandomControl() & 0x7F) + 32;
spark->dB = spark->dG + 64;
}
else
{
spark->sR = (GetRandomControl() & 0x7F) + 32;
spark->sG = spark->sR - (GetRandomControl() & 0x1F);
spark->sB = 0;
spark->dR = (GetRandomControl() & 0x7F) + 32;
spark->dB = 0;
spark->dG = spark->dR - (GetRandomControl() & 0x1F);
}
spark->fadeToBlack = 8;
spark->colFadeSpeed = (GetRandomControl() & 3) + 4;
spark->transType = 2;
spark->life = spark->sLife = (GetRandomControl() & 3) + 16;
spark->y = 0;
spark->x = (GetRandomControl() & 0xF) - 8;
spark->yVel = yVel;
spark->zVel = zVel;
spark->z = (GetRandomControl() & 0xF) - 8;
spark->xVel = xVel;
spark->friction = 68;
spark->flags = 602;
spark->rotAng = GetRandomControl() & 0xFFF;
if (GetRandomControl() & 1)
{
spark->rotAdd = -32 - (GetRandomControl() & 0x1F);
}
else
{
spark->rotAdd = (GetRandomControl() & 0x1F) + 32;
}
spark->gravity = 0;
spark->maxYvel = 0;
spark->fxObj = fxNum;
spark->scalar = 2;
spark->sSize = spark->size = (GetRandomControl() & 7) + 64;
spark->dSize = spark->size >> 5;
}
}
int BubblesShatterFunction(FX_INFO* fx, int param1, int param2)
{
ShatterItem.yRot = fx->pos.yRot;
ShatterItem.meshp = Meshes[fx->frameNumber];
ShatterItem.sphere.x = fx->pos.xPos;
ShatterItem.sphere.y = fx->pos.yPos;
ShatterItem.sphere.z = fx->pos.zPos;
ShatterItem.bit = 0;
ShatterItem.flags = fx->flag2 & 0x400;
ShatterObject(&ShatterItem, 0, param2, fx->roomNumber, param1);
return 1;
}
void BubblesControl(short fxNum)
{
FX_INFO* fx = &Effects[fxNum];
short angles[2];
phd_GetVectorAngles(
LaraItem->pos.xPos - fx->pos.xPos,
LaraItem->pos.yPos - fx->pos.yPos - 256,
LaraItem->pos.zPos - fx->pos.zPos,
angles);
int unk1 = 0; // v44
int unk2 = 0; // v3
if (fx->flag1 == 1)
{
unk1 = 512;
unk2 = 256;
}
else
{
if (fx->flag1 == 6)
{
if (fx->counter)
{
fx->counter--;
}
unk1 = 256;
}
else
{
unk1 = 768;
}
unk2 = 192;
}
if (fx->speed < unk2)
{
if (fx->flag1 == 6)
{
fx->speed++;
}
else
{
fx->speed += 3;
}
int dy = angles[0] - fx->pos.yRot;
if (abs(dy) > ANGLE(180))
{
dy = -dy;
}
int dx = angles[1] - fx->pos.xRot;
if (abs(dx) > ANGLE(180))
{
dx = -dx;
}
dy >>= 3;
dx >>= 3;
if (dy < -unk1)
dy = -unk1;
else if (dy > unk1)
dy = unk1;
if (dx < -unk1)
dx = -unk1;
else if (dx > unk1)
dx = unk1;
if (fx->flag1 != 4 && (fx->flag1 != 6 || !fx->counter))
{
fx->pos.yRot += dy;
}
fx->pos.xRot += dx;
}
fx->pos.zRot += 16 * fx->speed;
if (fx->flag1 == 6)
{
fx->pos.zRot += 16 * fx->speed;
}
int oldX = fx->pos.xPos;
int oldY = fx->pos.yPos;
int oldZ = fx->pos.zPos;
int c = fx->speed * COS(fx->pos.xRot) >> W2V_SHIFT;
fx->pos.xPos += c * SIN(fx->pos.yRot) >> W2V_SHIFT;
fx->pos.yPos += fx->speed * SIN(-fx->pos.xRot) >> W2V_SHIFT;
fx->pos.zPos += c * COS(fx->pos.yRot) >> W2V_SHIFT;
short roomNumber = fx->roomNumber;
FLOOR_INFO* floor = GetFloor(fx->pos.xPos, fx->pos.yPos, fx->pos.zPos, &roomNumber);
int floorHeight = GetFloorHeight(floor, fx->pos.xPos, fx->pos.yPos, fx->pos.zPos);
int ceilingHeight = GetCeiling(floor, fx->pos.xPos, fx->pos.yPos, fx->pos.zPos);
if (fx->pos.yPos >= floorHeight || fx->pos.yPos <= ceilingHeight)
{
fx->pos.xPos = oldX;
fx->pos.yPos = oldY;
fx->pos.zPos = oldZ;
if (fx->flag1 != 6)
{
BubblesShatterFunction(fx, 0, -32);
}
if (fx->flag1 == 1)
{
TriggerShockwave(
(PHD_3DPOS*)&fx->pos,
0x2000,
0xA000,
64,
64, 80, 00,
24,
(((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->roomNumber);
}
else
{
int shockwaveValue = 0;
byte r, g, b, life;
if (fx->flag1)
{
if (fx->flag1 == 3 || fx->flag1 == 4)
{
shockwaveValue = 268451968;
r = 128;
g = 64;
b = 0;
life = 16;
}
else if (fx->flag1 == 5)
{
shockwaveValue = 276848640;
r = 0;
g = 96;
b = 128;
life = 16;
}
else
{
if (fx->flag1 != 2)
{
if (fx->flag1 == 6)
{
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->roomNumber);
TriggerShockwave(&fx->pos, 0x3000, 0xF000, 64, 0, 96, 128, 24, 0x20000, 0);
fx->pos.yPos -= 128;
TriggerShockwave(&fx->pos, 0x3000, 0xF000, 48, 0, 112, 128, 16, 0, 0x2000);
fx->pos.yPos += 256;
TriggerShockwave(&fx->pos, 0x3000, 0xF000, 48, 0, 112, 128, 16, 0, 0x2000);
}
}
else
{
shockwaveValue = 276856832;
r = 0;
g = 128;
b = 128;
life = 16;
}
}
}
else
{
shockwaveValue = 268468288;
r = 64;
g = 128;
b = 0;
life = 16;
}
TriggerShockwave(&fx->pos, 0x2000, 0xA000, 64, r, g, b, life, 0, 0);
}
KillEffect(fxNum);
return;
}
if (ItemNearLara(&fx->pos, 200))
{
LaraItem->hitStatus = true;
if (fx->flag1 != 6)
{
BubblesShatterFunction(fx, 0, -32);
}
KillEffect(fxNum);
if (fx->flag1 == 1)
{
TriggerShockwave((PHD_3DPOS*)fx, 0x3000, 0xF000, 64, 64, 128, 0, 24, 0, 0);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->roomNumber);
LaraBurn();
//Lara.gassed = true; BYTE1(Lara_Flags) |= 2u;
}
else if (fx->flag1)
{
switch (fx->flag1)
{
case 3:
case 4:
TriggerShockwave((PHD_3DPOS*)fx, 0x2000, 0xA000, 64, 128, 64, 0, 16, 0, 256);
break;
case 5:
TriggerShockwave((PHD_3DPOS*)fx, 0x2000, 0xA000, 64, 0, 96, 128, 16, 0, 512);
break;
case 2:
TriggerShockwave((PHD_3DPOS*)fx, 0x2000, 0xA000, 64, 0, 128, 128, 16, 0, 512);
break;
case 6:
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->roomNumber);
TriggerShockwave((PHD_3DPOS*)fx, 0x3000, 0xF000, 64, 0, 96, 128, 24, 0, 0);
fx->pos.yPos -= 128;
TriggerShockwave((PHD_3DPOS*)fx, 0x3000, 0xF000, 48, 0, 112, 128, 16, 0, 0);
fx->pos.yPos += 256;
TriggerShockwave((PHD_3DPOS*)fx, 0x3000, 0xF000, 48, 0, 112, 128, 16, 0, 0);
LaraBurn();
break;
}
}
else
{
TriggerShockwave(
(PHD_3DPOS*)fx,
0x1800,
0x5800,
48,
64, 128, 0, 16,
(((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
}
}
else
{
if (roomNumber != fx->roomNumber)
{
EffectNewRoom(fxNum, roomNumber);
}
int dx = oldX - fx->pos.xPos;
int dy = oldY - fx->pos.yPos;
int dz = oldZ - fx->pos.zPos;
if (Wibble & 4 || fx->flag1 == 1 || fx->flag1 == 5 || fx->flag1 == 2)
{
if (fx->flag1)
{
if (fx->flag1 == 1)
{
BubblesEffect1(fxNum, 32 * dx, 32 * dy, 32 * dz);
}
else if (fx->flag1 < 3 || fx->flag1 > 5)
{
if (fx->flag1 == 2)
{
BubblesEffect2(fxNum, 16 * dx, 16 * dy, 16 * dz);
}
else if (fx->flag1 == 6)
{
BubblesEffect3(fxNum, 16 * dx, 16 * dy, 16 * dz);
}
}
else
{
BubblesEffect4(fxNum, 16 * dx, 16 * dy, 16 * dz);
}
}
else
{
BubblesEffect1(fxNum, 16 * dx, 16 * dy, 16 * dz);
}
}
}
}