Refactored EffectsList

This commit is contained in:
MontyTRC89 2022-05-27 05:05:29 +02:00
parent d667122672
commit 616e68160c
28 changed files with 125 additions and 132 deletions

View file

@ -84,11 +84,12 @@ int LevelComplete;
bool InItemControlLoop;
short ItemNewRoomNo;
short ItemNewRooms[MAX_ROOMS];
short NextItemFree;
short NextFxActive;
short NextFxFree;
std::vector<short> ActiveItems;
std::vector<short> ActiveEffects;
int WeaponDelay;
int WeaponEnemyTimer;
@ -290,15 +291,12 @@ GameStatus ControlPhase(int numFrames, int demoMode)
// Update all effects
InItemControlLoop = true;
short fxNumber = NextFxActive;
while (fxNumber != NO_ITEM)
for (short fxNumber : ActiveEffects)
{
short nextFx = EffectList[fxNumber].nextActive;
auto* fx = &EffectList[fxNumber];
if (Objects[fx->objectNumber].control)
Objects[fx->objectNumber].control(fxNumber);
fxNumber = nextFx;
}
InItemControlLoop = false;

View file

@ -60,16 +60,18 @@ extern int CurrentLevel;
extern int LevelComplete;
extern bool InItemControlLoop;
extern short ItemNewRoomNo;
extern short ItemNewRooms[MAX_ROOMS];
extern short NextItemFree;
extern short NextFxActive;
extern short NextFxFree;
extern int WeaponDelay;
extern int WeaponEnemyTimer;
extern std::vector<short> ActiveItems;
extern std::vector<short> ActiveEffects;
extern std::vector<short> OutsideRoomTable[OUTSIDE_SIZE][OUTSIDE_SIZE];

View file

@ -54,11 +54,10 @@ enum FireSizeEnum
struct FX_INFO
{
bool Active;
PHD_3DPOS pos;
short roomNumber;
short RoomNumber;
short objectNumber;
short nextFx;
short nextActive;
short speed;
short fallspeed;
int frameNumber;

View file

@ -1235,7 +1235,7 @@ int ExplodingDeath(short itemNumber, int meshBits, short flags)
fx->pos.Position.y = boneMatrix.Translation().y + item->Pose.Position.y;
fx->pos.Position.z = boneMatrix.Translation().z + item->Pose.Position.z;
fx->roomNumber = item->RoomNumber;
fx->RoomNumber = item->RoomNumber;
fx->pos.Orientation.x = 0;
fx->pos.Orientation.y = GetRandomControl() * 2;
@ -1286,7 +1286,7 @@ int ExplodingDeath(short itemNumber, int meshBits, short flags)
fx->pos.Position.y = boneMatrix.Translation().y + item->Pose.Position.y;
fx->pos.Position.z = boneMatrix.Translation().z + item->Pose.Position.z;
fx->roomNumber = item->RoomNumber;
fx->RoomNumber = item->RoomNumber;
fx->pos.Orientation.x = 0;
fx->pos.Orientation.y = GetRandomControl() * 2;

View file

@ -152,25 +152,20 @@ void EffectNewRoom(short fxNumber, short roomNumber)
else
{
auto* fx = &EffectList[fxNumber];
auto* room = &g_Level.Rooms[fx->roomNumber];
if (room->fxNumber == fxNumber)
room->fxNumber = fx->nextFx;
else
if (fx->RoomNumber != NO_ROOM)
{
for (short linkNumber = room->fxNumber; linkNumber != -1; linkNumber = EffectList[linkNumber].nextFx)
{
if (EffectList[linkNumber].nextFx == fxNumber)
{
EffectList[linkNumber].nextFx = fx->nextFx;
break;
}
}
auto* oldRoom = &g_Level.Rooms[fx->RoomNumber];
oldRoom->Effects.erase(
std::remove(
oldRoom->Effects.begin(),
oldRoom->Effects.end(),
fxNumber),
oldRoom->Effects.end());
}
fx->roomNumber = roomNumber;
fx->nextFx = g_Level.Rooms[roomNumber].fxNumber;
g_Level.Rooms[roomNumber].fxNumber = fxNumber;
fx->RoomNumber = roomNumber;
g_Level.Rooms[roomNumber].Effects.push_back(fxNumber);
}
}
@ -184,74 +179,74 @@ void KillEffect(short fxNumber)
else
{
auto* fx = &EffectList[fxNumber];
DetatchSpark(fxNumber, SP_FX);
if (NextFxActive == fxNumber)
NextFxActive = fx->nextActive;
else
fx->Active = false;
ActiveEffects.erase(
std::remove(
ActiveEffects.begin(),
ActiveEffects.end(),
fxNumber),
ActiveEffects.end());
if (fx->RoomNumber != NO_ROOM)
{
for (short linknum = NextFxActive; linknum != NO_ITEM; linknum = EffectList[linknum].nextActive)
{
if (EffectList[linknum].nextActive == fxNumber)
{
EffectList[linknum].nextActive = fx->nextActive;
break;
}
}
g_Level.Rooms[fx->RoomNumber].Items.erase(
std::remove(
g_Level.Rooms[fx->RoomNumber].Effects.begin(),
g_Level.Rooms[fx->RoomNumber].Effects.end(),
fxNumber),
g_Level.Rooms[fx->RoomNumber].Effects.end());
}
if (g_Level.Rooms[fx->roomNumber].fxNumber == fxNumber)
g_Level.Rooms[fx->roomNumber].fxNumber = fx->nextFx;
else
{
for (short linknum = g_Level.Rooms[fx->roomNumber].fxNumber; linknum != NO_ITEM; linknum = EffectList[linknum].nextFx)
{
if (EffectList[linknum].nextFx == fxNumber)
{
EffectList[linknum].nextFx = fx->nextFx;
break;
}
}
}
fx->nextFx = NextFxFree;
NextFxFree = fxNumber;
}
}
short CreateNewEffect(short roomNum)
{
short fxNumber = NextFxFree;
if (NextFxFree != NO_ITEM)
{
auto* fx = &EffectList[NextFxFree];
NextFxFree = fx->nextFx;
short fxNumber = NextFxFree;
auto* fx = &EffectList[fxNumber];
fx->Active = true;
fx->RoomNumber = roomNum;
fx->shade = GRAY555;
auto* room = &g_Level.Rooms[roomNum];
fx->roomNumber = roomNum;
fx->nextFx = room->fxNumber;
room->fxNumber = fxNumber;
fx->nextActive = NextFxActive;
NextFxActive = fxNumber;
fx->shade = GRAY555;
room->Effects.push_back(fxNumber);
NextFxFree = NO_ITEM;
for (short currentFxNumber = 0; currentFxNumber < NUM_EFFECTS; currentFxNumber++)
{
auto* currentFx = &EffectList[currentFxNumber];
if (!currentFx->Active)
{
NextFxFree = currentFxNumber;
break;
}
}
return fxNumber;
}
else
{
return NO_ITEM;
}
}
void InitialiseFXArray(int allocateMemory)
{
NextFxActive = NO_ITEM;
NextFxFree = 0;
ActiveEffects.clear();
for (int i = 0; i < NUM_EFFECTS; i++)
for (short currentFxNumber = 0; currentFxNumber < NUM_EFFECTS; currentFxNumber++)
{
auto* fx = &EffectList[i];
fx->nextFx = i + 1;
EffectList[currentFxNumber].Active = false;
}
EffectList[NUM_EFFECTS - 1].nextFx = NO_ITEM;
}
void RemoveDrawnItem(short itemNumber)

View file

@ -43,7 +43,7 @@ void ControlMissile(short fxNumber)
printf("ControlMissile\n");
if (fx->objectNumber == ID_SCUBA_HARPOON &&
!TestEnvironment(ENV_FLAG_WATER, fx->roomNumber) &&
!TestEnvironment(ENV_FLAG_WATER, fx->RoomNumber) &&
fx->pos.Orientation.x > -0x3000);
{
fx->pos.Orientation.x -= ANGLE(1.0f);
@ -54,7 +54,7 @@ void ControlMissile(short fxNumber)
fx->pos.Position.z += velocity * phd_cos(fx->pos.Orientation.y);
fx->pos.Position.x += velocity * phd_sin(fx->pos.Orientation.y);
auto probe = GetCollision(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->roomNumber);
auto probe = GetCollision(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->RoomNumber);
// Check for hitting something.
if (fx->pos.Position.y >= probe.Position.Floor ||
@ -77,7 +77,7 @@ void ControlMissile(short fxNumber)
return;
}
if (probe.RoomNumber != fx->roomNumber)
if (probe.RoomNumber != fx->RoomNumber)
EffectNewRoom(fxNumber, probe.RoomNumber);
// Check for hitting Lara.
@ -114,8 +114,8 @@ void ControlMissile(short fxNumber)
}
// Create bubbles in wake of harpoon bolt.
//if (fx->objectNumber == ID_SCUBA_HARPOON && g_Level.Rooms[fx->roomNumber].flags & 1)
// CreateBubble(&fx->pos, fx->roomNumber, 1, 0);
//if (fx->objectNumber == ID_SCUBA_HARPOON && g_Level.Rooms[fx->RoomNumber].flags & 1)
// CreateBubble(&fx->pos, fx->RoomNumber, 1, 0);
/*else if (fx->objectNumber == DRAGON_FIRE && !fx->counter--)
{
AddDynamicLight(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, 14, 11);
@ -142,7 +142,7 @@ void ControlNatlaGun(short fxNumber)
int x = fx->pos.Position.x + fx->speed * phd_sin(fx->pos.Orientation.y);
int y = fx->pos.Position.y;
auto probe = GetCollision(x, y, z, fx->roomNumber);
auto probe = GetCollision(x, y, z, fx->RoomNumber);
// Don't create one if hit a wall.
if (y >= probe.Position.Floor ||
@ -160,7 +160,7 @@ void ControlNatlaGun(short fxNumber)
fxNew->pos.Position.y = y;
fxNew->pos.Position.z = z;
fxNew->pos.Orientation.y = fx->pos.Orientation.y;
fxNew->roomNumber = probe.RoomNumber;
fxNew->RoomNumber = probe.RoomNumber;
fxNew->speed = fx->speed;
fxNew->frameNumber = 0;
fxNew->objectNumber = ID_PROJ_NATLA;
@ -178,7 +178,7 @@ short ShardGun(int x, int y, int z, short velocity, short yRot, short roomNumber
fx->pos.Position.x = x;
fx->pos.Position.y = y;
fx->pos.Position.z = z;
fx->roomNumber = roomNumber;
fx->RoomNumber = roomNumber;
fx->pos.Orientation.x = fx->pos.Orientation.z = 0;
fx->pos.Orientation.y = yRot;
fx->speed = SHARD_VELOCITY;
@ -201,7 +201,7 @@ short BombGun(int x, int y, int z, short velocity, short yRot, short roomNumber)
fx->pos.Position.x = x;
fx->pos.Position.y = y;
fx->pos.Position.z = z;
fx->roomNumber = roomNumber;
fx->RoomNumber = roomNumber;
fx->pos.Orientation.x = fx->pos.Orientation.z = 0;
fx->pos.Orientation.y = yRot;
fx->speed = ROCKET_VELOCITY;
@ -224,7 +224,7 @@ short NatlaGun(int x, int y, int z, short velocity, short yRot, short roomNumber
fx->pos.Position.x = x;
fx->pos.Position.y = y;
fx->pos.Position.z = z;
fx->roomNumber = roomNumber;
fx->RoomNumber = roomNumber;
fx->pos.Orientation.x = fx->pos.Orientation.z = 0;
fx->pos.Orientation.y = yRot;
fx->speed = NATLA_GUN_VELOCITY;

View file

@ -39,7 +39,7 @@ void DoFlipMap(short group)
flipped->flippedRoom = -1;
room->Items = flipped->Items;
room->fxNumber = flipped->fxNumber;
room->Effects = flipped->Effects;
AddRoomFlipItems(room);

View file

@ -100,7 +100,7 @@ struct ROOM_INFO
std::vector<Vector3> positions;
std::vector<Vector3> normals;
std::vector<Vector3> colors;
std::vector<Vector3> effects;
std::vector<Vector3> verticesEffects;
std::vector<BUCKET> buckets;
std::vector<ROOM_DOOR> doors;
int xSize;
@ -114,10 +114,10 @@ struct ROOM_INFO
int meshEffect;
int reverbType;
int flipNumber;
short fxNumber;
bool boundActive;
std::vector<TriggerVolume> triggerVolumes;
std::vector<short> Items;
std::vector<short> Effects;
};
constexpr auto NUM_ROOMS = 1024;

View file

@ -125,7 +125,7 @@ namespace TEN::Entities::Effects
ShatterItem.sphere.z = fx->pos.Position.z;
ShatterItem.bit = 0;
ShatterItem.flags = fx->flag2 & 0x400;
ShatterObject(&ShatterItem, 0, param2, fx->roomNumber, param1);
ShatterObject(&ShatterItem, 0, param2, fx->RoomNumber, param1);
}
void ControlEnemyMissile(short fxNum)
@ -206,7 +206,7 @@ namespace TEN::Entities::Effects
fx->pos.Position.y += -((fx->speed * phd_sin(fx->pos.Orientation.x))) + fx->fallspeed;
fx->pos.Position.z += (speed * phd_cos(fx->pos.Orientation.y));
auto probe = GetCollision(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->roomNumber);
auto probe = GetCollision(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->RoomNumber);
if (fx->pos.Position.y >= probe.Position.Floor || fx->pos.Position.y <= probe.Position.Ceiling)
{
@ -219,8 +219,8 @@ namespace TEN::Entities::Effects
if (fx->flag1 == 1)
{
TriggerShockwave(&fx->pos, 32, 160, 64, 64, 128, 00, 24, (((~g_Level.Rooms[fx->roomNumber].flags) / 16) & 2) * 65536, 0);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->roomNumber);
TriggerShockwave(&fx->pos, 32, 160, 64, 64, 128, 00, 24, (((~g_Level.Rooms[fx->RoomNumber].flags) / 16) & 2) * 65536, 0);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->RoomNumber);
}
else
{
@ -236,7 +236,7 @@ namespace TEN::Entities::Effects
{
if (fx->flag1 == 6)
{
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->roomNumber);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->RoomNumber);
TriggerShockwave(&fx->pos, 48, 240, 64, 0, 96, 128, 24, 0, 2);
fx->pos.Position.y -= 128;
TriggerShockwave(&fx->pos, 48, 240, 48, 0, 112, 128, 16, 0, 2);
@ -268,7 +268,7 @@ namespace TEN::Entities::Effects
if (fx->flag1 == 1)
{
TriggerShockwave(&fx->pos, 48, 240, 64, 64, 128, 0, 24, 0, 0);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->roomNumber);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 2, fx->RoomNumber);
LaraBurn(LaraItem);
}
else if (fx->flag1)
@ -289,7 +289,7 @@ namespace TEN::Entities::Effects
break;
case 6:
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->roomNumber);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->RoomNumber);
TriggerShockwave(&fx->pos, 48, 240, 64, 0, 96, 128, 24, 0, 0);
fx->pos.Position.y -= 128;
TriggerShockwave(&fx->pos, 48, 240, 48, 0, 112, 128, 16, 0, 0);
@ -300,11 +300,11 @@ namespace TEN::Entities::Effects
}
}
else
TriggerShockwave(&fx->pos, 24, 88, 48, 64, 128, 0, 16, (((~g_Level.Rooms[fx->roomNumber].flags) / 16) & 2) * 65536, 0);
TriggerShockwave(&fx->pos, 24, 88, 48, 64, 128, 0, 16, (((~g_Level.Rooms[fx->RoomNumber].flags) / 16) & 2) * 65536, 0);
}
else
{
if (probe.RoomNumber != fx->roomNumber)
if (probe.RoomNumber != fx->RoomNumber)
EffectNewRoom(fxNum, probe.RoomNumber);
int dx = oldX - fx->pos.Position.x;

View file

@ -330,10 +330,10 @@ namespace TEN::Entities::Effects
(GetRandomControl() & 0x1F) + 96);
}
if (LaraItem->RoomNumber != fx->roomNumber)
if (LaraItem->RoomNumber != fx->RoomNumber)
EffectNewRoom(fxNumber, LaraItem->RoomNumber);
int wh = GetWaterHeight(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->roomNumber);
int wh = GetWaterHeight(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->RoomNumber);
if (wh == NO_HEIGHT || fx->pos.Position.y <= wh || Lara.BurnBlue)
{
SoundEffect(SFX_TR4_LOOP_FOR_SMALL_FIRES, &fx->pos, 0);

View file

@ -47,7 +47,7 @@ void KnifeControl(short fxNumber)
fx->pos.Position.x += speed * phd_sin(fx->pos.Orientation.y);
fx->pos.Position.y += fx->speed * phd_sin(-fx->pos.Orientation.x);
auto probe = GetCollision(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->roomNumber);
auto probe = GetCollision(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->RoomNumber);
if (fx->pos.Position.y >= probe.Position.Floor ||
fx->pos.Position.y <= probe.Position.Ceiling)
@ -56,7 +56,7 @@ void KnifeControl(short fxNumber)
return;
}
if (probe.RoomNumber != fx->roomNumber)
if (probe.RoomNumber != fx->RoomNumber)
EffectNewRoom(fxNumber, probe.RoomNumber);
fx->pos.Orientation.z += ANGLE(30.0f);
@ -71,7 +71,7 @@ void KnifeControl(short fxNumber)
fx->frameNumber = fx->counter = 0;
SoundEffect(SFX_TR2_CRUNCH2, &fx->pos, 0);
DoBloodSplat(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, 80, fx->pos.Orientation.y, fx->roomNumber);
DoBloodSplat(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, 80, fx->pos.Orientation.y, fx->RoomNumber);
KillEffect(fxNumber);
}
}

View file

@ -39,7 +39,7 @@ static void Flame(int x, int y, int z, int velocity, short yRot, short roomNumbe
fx->pos.Position.x = x;
fx->pos.Position.y = y;
fx->pos.Position.z = z;
fx->roomNumber = roomNumber;
fx->RoomNumber = roomNumber;
//TODO: complete fx parameters
fx->shade = 14 * 256;
fx->counter = 40;

View file

@ -175,7 +175,7 @@ static short TriggerFlameThrower(ItemInfo* item, BITE_INFO* bite, short speed)
fx->pos.Position = pos1;
fx->pos.Orientation = angles;
fx->roomNumber = item->RoomNumber;
fx->RoomNumber = item->RoomNumber;
fx->speed = speed * 4;
fx->counter = 20;
fx->flag1 = 0;

View file

@ -394,7 +394,7 @@ void ControlTonyFireBall(short fxNumber)
TriggerFireBallFlame(fxNumber, (TonyFlameType)fx->flag1, (short)((oldX - fx->pos.Position.x) * 8), (short)((oldY - fx->pos.Position.y) * 8), (short)((oldZ - fx->pos.Position.z) * 4));
}
auto probe = GetCollision(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->roomNumber);
auto probe = GetCollision(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->RoomNumber);
if (fx->pos.Position.y >= probe.Position.Floor ||
fx->pos.Position.y < probe.Position.Ceiling)
@ -403,11 +403,11 @@ void ControlTonyFireBall(short fxNumber)
{
Vector3Int pos;
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->roomNumber);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -2, 0, fx->RoomNumber);
if (fx->flag1 == T_ROCKZAPPL || fx->flag1 == T_ROCKZAPPR)
{
for (int x = 0; x < 2; x++)
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -1, 0, fx->roomNumber);
TriggerExplosionSparks(oldX, oldY, oldZ, 3, -1, 0, fx->RoomNumber);
}
pos.x = oldX;
@ -429,7 +429,7 @@ void ControlTonyFireBall(short fxNumber)
type = T_ROCKZAPPDEBRIS;
for (int x = 0; x < j; x++)
TriggerFireBall(NULL, type, &pos, fx->roomNumber, fx->pos.Orientation.y, 32 + (x * 4));
TriggerFireBall(NULL, type, &pos, fx->RoomNumber, fx->pos.Orientation.y, 32 + (x * 4));
if (fx->flag1 == T_ROCKZAPPL || fx->flag1 == T_ROCKZAPPR)
{
@ -467,7 +467,7 @@ void ControlTonyFireBall(short fxNumber)
}
}
if (probe.RoomNumber != fx->roomNumber)
if (probe.RoomNumber != fx->RoomNumber)
EffectNewRoom(fxNumber, LaraItem->RoomNumber);
unsigned char radtab[7] = { 16, 0, 14, 9, 7, 7, 7 };

View file

@ -123,7 +123,7 @@ namespace TEN::Entities::TR4
fx->pos.Orientation.z = 0;
fx->roomNumber = roomNumber;
fx->RoomNumber = roomNumber;
fx->counter = 2 * GetRandomControl() + -ANGLE(180.0f);
fx->flag1 = flags;
fx->speed = (GetRandomControl() & 0x1F) + 96;

View file

@ -52,7 +52,7 @@ static void TriggerHarpyMissile(PHD_3DPOS* pos, short roomNumber, int count)
fx->pos.Orientation.x = pos->Orientation.x;
fx->pos.Orientation.y = pos->Orientation.y;
fx->pos.Orientation.z = 0;
fx->roomNumber = roomNumber;
fx->RoomNumber = roomNumber;
fx->counter = 2 * GetRandomControl() + -32768;
fx->objectNumber = ID_ENERGY_BUBBLES;
fx->speed = (GetRandomControl() & 0x1F) + 96;

View file

@ -41,7 +41,7 @@ namespace TEN::Entities::TR4
fx->pos.Orientation.x = src->Orientation.x;
fx->pos.Orientation.y = src->Orientation.y;
fx->pos.Orientation.z = 0;
fx->roomNumber = roomNumber;
fx->RoomNumber = roomNumber;
fx->counter = 16 * counter + 15;
fx->objectNumber = ID_ENERGY_BUBBLES;
fx->frameNumber = Objects[fx->objectNumber].meshIndex + 5;

View file

@ -545,7 +545,7 @@ void SethaThrowAttack(PHD_3DPOS* pos, short roomNumber, short mesh)
fx->pos.Orientation.x = pos->Orientation.x;
fx->pos.Orientation.y = pos->Orientation.y;
fx->pos.Orientation.z = 0;
fx->roomNumber = roomNumber;
fx->RoomNumber = roomNumber;
fx->counter = 2 * GetRandomControl() + -ANGLE(180);
fx->flag1 = mesh;
fx->objectNumber = ID_BODY_PART;

View file

@ -31,7 +31,7 @@ namespace TEN::Entities::TR4
fx->pos.Position.x = (byte)GetRandomControl() + item->Pose.Position.x - 128;
fx->pos.Position.y = GetCollision(item).Position.Floor;
fx->pos.Position.z = (byte)GetRandomControl() + item->Pose.Position.z - 128;
fx->roomNumber = item->RoomNumber;
fx->RoomNumber = item->RoomNumber;
fx->pos.Orientation.y = 2 * GetRandomControl();
fx->speed = GetRandomControl() / 2048;
fx->fallspeed = -(GetRandomControl() / 1024);

View file

@ -70,7 +70,7 @@ static void HydraBubblesAttack(PHD_3DPOS* pos, short roomNumber, int count)
fx->pos.Orientation.x = pos->Orientation.x;
fx->pos.Orientation.y = pos->Orientation.y;
fx->pos.Orientation.z = 0;
fx->roomNumber = roomNumber;
fx->RoomNumber = roomNumber;
fx->counter = 16 * count + 15;
fx->flag1 = 0;
fx->objectNumber = ID_BUBBLES;

View file

@ -92,7 +92,7 @@ static void ImpThrowStones(ItemInfo* item)
auto* fx = &EffectList[fxNumber];
fx->pos.Position = pos1;
fx->roomNumber = item->RoomNumber;
fx->RoomNumber = item->RoomNumber;
fx->speed = 4 * sqrt(distance);
fx->pos.Orientation = Vector3Shrt(

View file

@ -67,7 +67,7 @@ static void RomanStatueHitEffect(ItemInfo* item, Vector3Int* pos, int joint)
fx->pos.Position.x = pos->x;
fx->pos.Position.y = pos->y;
fx->pos.Position.z = pos->z;
fx->roomNumber = item->RoomNumber;
fx->RoomNumber = item->RoomNumber;
fx->pos.Orientation.z = 0;
fx->pos.Orientation.x = 0;
fx->pos.Orientation.y = 2 * GetRandomControl();
@ -235,7 +235,7 @@ static void RomanStatueAttack(PHD_3DPOS* pos, short roomNumber, short count)
fx->pos.Orientation.x = pos->Orientation.x;
fx->pos.Orientation.y = pos->Orientation.y;
fx->pos.Orientation.z = 0;
fx->roomNumber = roomNumber;
fx->RoomNumber = roomNumber;
fx->counter = 16 * count + 15;
fx->flag1 = 1;
fx->objectNumber = ID_BUBBLES;

View file

@ -42,7 +42,7 @@ void ControlBodyPart(short fxNumber)
fx->pos.Position.y += fx->fallspeed;
fx->pos.Position.z += fx->speed * phd_cos(fx->pos.Orientation.y);
short roomNumber = fx->roomNumber;
short roomNumber = fx->RoomNumber;
FloorInfo* floor = GetFloor(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z,&roomNumber);
if (!fx->counter)
@ -109,10 +109,10 @@ void ControlBodyPart(short fxNumber)
(GetRandomControl() & 0x3F) + fx->pos.Position.z - 32,
1,
2 * GetRandomControl(),
fx->roomNumber);
fx->RoomNumber);
}
}
if (roomNumber != fx->roomNumber)
if (roomNumber != fx->RoomNumber)
EffectNewRoom(fxNumber, roomNumber);
}

View file

@ -104,7 +104,7 @@ void MissileControl(short itemNumber)
fx->pos.Position.y += fx->speed * phd_sin(-fx->pos.Orientation.x);
fx->pos.Position.z += c * phd_cos(fx->pos.Orientation.y);
auto probe = GetCollision(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->roomNumber);
auto probe = GetCollision(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z, fx->RoomNumber);
if (fx->pos.Position.y >= probe.Position.Floor || fx->pos.Position.y <= probe.Position.Ceiling)
{
@ -116,7 +116,7 @@ void MissileControl(short itemNumber)
{
if (fx->flag1 == 1)
{
TriggerExplosionSparks(x, y, z, 3, -2, 2, fx->roomNumber);
TriggerExplosionSparks(x, y, z, 3, -2, 2, fx->RoomNumber);
fx->pos.Position.y -= 64;
TriggerShockwave((PHD_3DPOS*)fx, 48, 256, 64, 64, 128, 0, 24, 0, 1);
fx->pos.Position.y -= 128;
@ -130,7 +130,7 @@ void MissileControl(short itemNumber)
}
else
{
TriggerExplosionSparks(x, y, z, 3, -2, 0, fx->roomNumber);
TriggerExplosionSparks(x, y, z, 3, -2, 0, fx->RoomNumber);
TriggerShockwave((PHD_3DPOS*)fx, 48, 240, 48, 0, 96, 128, 24, 0, 2);
}
@ -145,7 +145,7 @@ void MissileControl(short itemNumber)
if (fx->flag1 == 1)
{
// ROMAN_GOD hit effect
TriggerExplosionSparks(x, y, z, 3, -2, 2, fx->roomNumber);
TriggerExplosionSparks(x, y, z, 3, -2, 2, fx->RoomNumber);
fx->pos.Position.y -= 64;
TriggerShockwave((PHD_3DPOS*)fx, 48, 256, 64, 0, 128, 64, 24, 0, 1);
fx->pos.Position.y -= 128;
@ -171,7 +171,7 @@ void MissileControl(short itemNumber)
else
{
// HYDRA hit effect
TriggerExplosionSparks(x, y, z, 3, -2, 0, fx->roomNumber);
TriggerExplosionSparks(x, y, z, 3, -2, 0, fx->RoomNumber);
TriggerShockwave((PHD_3DPOS*)fx, 48, 240, 48, 0, 96, 128, 24, 0, 0);
if (LaraItem->HitPoints >= 500)
LaraItem->HitPoints -= 300;
@ -182,7 +182,7 @@ void MissileControl(short itemNumber)
}
else
{
if (probe.RoomNumber != fx->roomNumber)
if (probe.RoomNumber != fx->RoomNumber)
EffectNewRoom(itemNumber, probe.RoomNumber);
if (GlobalCounter & 1)
@ -217,7 +217,7 @@ void ExplodeFX(FX_INFO* fx, int noXZVel, int bits)
if (fx->flag2 & 0x2000)
DebrisFlags = 1;
ShatterObject(&ShatterItem, 0, bits, fx->roomNumber, noXZVel);
ShatterObject(&ShatterItem, 0, bits, fx->RoomNumber, noXZVel);
DebrisFlags = 0;
}

View file

@ -220,7 +220,7 @@ namespace TEN::Renderer
vertex->BiTangent = poly.bitangents[k];
vertex->IndexInPoly = k;
vertex->OriginalIndex = index;
vertex->Effects = room.effects[index];
vertex->Effects = room.verticesEffects[index];
unsigned long long primes[]{ 73856093ULL ,19349663ULL ,83492791ULL };
vertex->hash = std::hash<float>{}((vertex->Position.x)* primes[0]) ^ (std::hash<float>{}(vertex->Position.y)* primes[1]) ^ std::hash<float>{}(vertex->Position.z) * primes[2];

View file

@ -1104,7 +1104,7 @@ namespace TEN::Renderer
int firstBucket = (transparent ? 2 : 0);
int lastBucket = (transparent ? 4 : 2);
RendererRoom const & room = m_rooms[effect->Effect->roomNumber];
RendererRoom const & room = m_rooms[effect->Effect->RoomNumber];
//RendererObject * moveableObj = m_moveableObjects[effect->Effect->objectNumber];
m_stItem.World = effect->World;
@ -1162,7 +1162,7 @@ namespace TEN::Renderer
{
for (auto effect : room->EffectsToDraw)
{
RendererRoom const& room = m_rooms[effect->Effect->roomNumber];
RendererRoom const& room = m_rooms[effect->Effect->RoomNumber];
ObjectInfo* obj = &Objects[effect->Effect->objectNumber];
if (obj->drawRoutine && obj->loaded)

View file

@ -723,8 +723,7 @@ namespace TEN::Renderer
RendererRoom& room = m_rooms[roomNumber];
ROOM_INFO* r = &g_Level.Rooms[room.RoomNumber];
short fxNum = NO_ITEM;
for (fxNum = r->fxNumber; fxNum != NO_ITEM; fxNum = EffectList[fxNum].nextFx)
for (short fxNum : r->Effects)
{
FX_INFO *fx = &EffectList[fxNum];
@ -740,7 +739,7 @@ namespace TEN::Renderer
newEffect->World = Matrix::CreateFromYawPitchRoll(fx->pos.Orientation.y, fx->pos.Position.x, fx->pos.Position.z) * Matrix::CreateTranslation(fx->pos.Position.x, fx->pos.Position.y, fx->pos.Position.z);
newEffect->Mesh = GetMesh(obj->nmeshes ? obj->meshIndex : fx->frameNumber);
CollectLightsForEffect(fx->roomNumber, newEffect, renderView);
CollectLightsForEffect(fx->RoomNumber, newEffect, renderView);
room.EffectsToDraw.push_back(newEffect);
}

View file

@ -567,9 +567,9 @@ void ReadRooms()
for (int j = 0; j < numVertices; j++)
room.colors.push_back(ReadVector3());
room.effects.reserve(numVertices);
room.verticesEffects.reserve(numVertices);
for (int j = 0; j < numVertices; j++)
room.effects.push_back(ReadVector3());
room.verticesEffects.push_back(ReadVector3());
int numBuckets = ReadInt32();
room.buckets.reserve(numBuckets);