mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-02 17:57:59 +03:00
518 lines
No EOL
12 KiB
C++
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);
|
|
}
|
|
}
|
|
}
|
|
} |