TombEngine/TR5Main/Objects/tr4bubbles.cpp

503 lines
No EOL
12 KiB
C++

#include "newobjects.h"
#include "..\Global\global.h"
#include "..\Game\Box.h"
#include "..\Game\items.h"
#include "..\Game\lot.h"
#include "..\Game\control.h"
#include "..\Game\effects.h"
#include "..\Game\draw.h"
#include "..\Game\sphere.h"
#include "..\Game\effect2.h"
#include "..\Game\people.h"
#include "..\Game\laramisc.h"
#include "..\Game\debris.h"
void __cdecl BubblesEffect1(__int16 fxNum, __int16 xVel, __int16 yVel, __int16 zVel)
{
FX_INFO* fx = &Effects[fxNum];
__int32 dx = LaraItem->pos.xPos - fx->pos.xPos;
__int32 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 __cdecl BubblesEffect2(__int16 fxNum, __int16 xVel, __int16 yVel, __int16 zVel)
{
FX_INFO* fx = &Effects[fxNum];
__int32 dx = LaraItem->pos.xPos - fx->pos.xPos;
__int32 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 __cdecl BubblesEffect3(__int16 fxNum, __int16 xVel, __int16 yVel, __int16 zVel)
{
FX_INFO* fx = &Effects[fxNum];
__int32 dx = LaraItem->pos.xPos - fx->pos.xPos;
__int32 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 __cdecl BubblesEffect4(__int16 fxNum, __int16 xVel, __int16 yVel, __int16 zVel)
{
FX_INFO* fx = &Effects[fxNum];
__int32 dx = LaraItem->pos.xPos - fx->pos.xPos;
__int32 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;
}
}
__int32 __cdecl BubblesShatterFunction(FX_INFO* fx, __int32 param1, __int32 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 __cdecl BubblesControl(__int16 fxNum)
{
FX_INFO* fx = &Effects[fxNum];
__int16 angles[2];
phd_GetVectorAngles(
LaraItem->pos.xPos - fx->pos.xPos,
LaraItem->pos.yPos - fx->pos.yPos - 256,
LaraItem->pos.zPos - fx->pos.zPos,
angles);
__int32 unk1 = 0; // v44
__int32 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;
}
__int32 dy = angles[0] - fx->pos.yRot;
if (abs(dy) > ANGLE(180))
{
dy = -dy;
}
__int32 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;
}
__int32 oldX = fx->pos.xPos;
__int32 oldY = fx->pos.yPos;
__int32 oldZ = fx->pos.zPos;
__int32 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;
__int16 roomNumber = fx->roomNumber;
FLOOR_INFO* floor = GetFloor(fx->pos.xPos, fx->pos.yPos, fx->pos.zPos, &roomNumber);
__int32 floorHeight = GetFloorHeight(floor, fx->pos.xPos, fx->pos.yPos, fx->pos.zPos);
__int32 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(
&fx->pos,
10485792,
64,
402686016,
(((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->roomNumber);
}
else
{
__int32 shockwaveValue = 0;
if (fx->flag1)
{
if (fx->flag1 == 3 || fx->flag1 == 4)
{
shockwaveValue = 268451968;
}
else if (fx->flag1 == 5)
{
shockwaveValue = 276848640;
}
else
{
if (fx->flag1 != 2)
{
if (fx->flag1 == 6)
{
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->roomNumber);
TriggerShockwave(&fx->pos, 15728688, 64, 411066368, 0x20000, 0);
fx->pos.yPos -= 128;
TriggerShockwave(&fx->pos, 15728688, 48, 276852736, 0x20000, 0);
fx->pos.yPos += 256;
TriggerShockwave(&fx->pos, 15728688, 48, 276852736, 0x20000, 0);
}
}
else
{
shockwaveValue = 276856832;
}
}
}
else
{
shockwaveValue = 268468288;
}
TriggerShockwave(&fx->pos, 10485792, 64, shockwaveValue, 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, 15728688, 64, 402686016, 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, 10485792, 64, 268451968, 0x10000, 0);
break;
case 5:
TriggerShockwave((PHD_3DPOS*)fx, 10485792, 64, 276848640, 0x20000, 0);
break;
case 2:
TriggerShockwave((PHD_3DPOS*)fx, 10485792, 64, 276856832, 0x20000, 0);
break;
case 6:
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->roomNumber);
TriggerShockwave((PHD_3DPOS*)fx, 15728688, 64, 411066368, 0, 0);
fx->pos.yPos -= 128;
TriggerShockwave((PHD_3DPOS*)fx, 15728688, 48, 276852736, 0, 0);
fx->pos.yPos += 256;
TriggerShockwave((PHD_3DPOS*)fx, 15728688, 48, 276852736, 0, 0);
LaraBurn();
break;
}
}
else
{
TriggerShockwave(
(PHD_3DPOS*)fx,
0x00580018,
48,
268468288,
(((~Rooms[fx->roomNumber].flags) >> 4) & 2) << 16, 0);
}
}
else
{
if (roomNumber != fx->roomNumber)
{
EffectNewRoom(fxNum, roomNumber);
}
__int32 dx = oldX - fx->pos.xPos;
__int32 dy = oldY - fx->pos.yPos;
__int32 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);
}
}
}
}