Completely get rid of TriggerIndex

This commit is contained in:
Lwmte 2021-08-20 15:26:12 +03:00
parent 1828ddaeab
commit d394bcc39f
8 changed files with 111 additions and 117 deletions

View file

@ -919,10 +919,6 @@ void LaraAboveWater(ITEM_INFO* item, COLL_INFO* coll) //hmmmm
// Check for collision with items // Check for collision with items
LaraBaddieCollision(item, coll); LaraBaddieCollision(item, coll);
// FIXME: refresh floor globals because sometimes they are messed by calling GetFloorHeight
// all over the place. Needed for monkeyswing. Remove when block flags decoupled from floordata. -- Lwmte 19.08.21
RefreshFloorGlobals(item);
// Handle Lara collision // Handle Lara collision
if (Lara.Vehicle == NO_ITEM) if (Lara.Vehicle == NO_ITEM)
lara_collision_routines[item->currentAnimState](item, coll); lara_collision_routines[item->currentAnimState](item, coll);

View file

@ -1080,8 +1080,6 @@ void DoFloorThings(FLOOR_INFO* floor, int x, int y, int z)
int height = floor->floor * 256; int height = floor->floor * 256;
if (height != NO_HEIGHT) if (height != NO_HEIGHT)
{ {
TriggerIndex = NULL;
if (floor->index != 0) if (floor->index != 0)
{ {
short* data = &g_Level.FloorData[floor->index]; short* data = &g_Level.FloorData[floor->index];
@ -1131,11 +1129,7 @@ void DoFloorThings(FLOOR_INFO* floor, int x, int y, int z)
break; break;
case TRIGGER_TYPE: case TRIGGER_TYPE:
if (!TriggerIndex)
TriggerIndex = data - 1;
data++; data++;
do do
{ {
trigger = *(data++); trigger = *(data++);
@ -1152,18 +1146,6 @@ void DoFloorThings(FLOOR_INFO* floor, int x, int y, int z)
} while (!(trigger & END_BIT)); } while (!(trigger & END_BIT));
break; break;
case LAVA_TYPE:
TriggerIndex = data - 1;
break;
case CLIMB_TYPE:
case MONKEY_TYPE:
case TRIGTRIGGER_TYPE:
case MINER_TYPE:
if (!TriggerIndex)
TriggerIndex = data - 1;
break;
case SPLIT1: case SPLIT1:
case SPLIT2: case SPLIT2:
case NOCOLF1T: case NOCOLF1T:
@ -1258,13 +1240,6 @@ void DoFloorThings(FLOOR_INFO* floor, int x, int y, int z)
} }
} }
void RefreshFloorGlobals(ITEM_INFO* item)
{
auto room = item->roomNumber;
auto floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &room);
DoFloorThings(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
}
void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNumber, int objectHeight) void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNumber, int objectHeight)
{ {
int resetRoom; int resetRoom;

View file

@ -126,7 +126,6 @@ int Move3DPosTo3DPos(PHD_3DPOS* src, PHD_3DPOS* dest, int velocity, short angAdd
int MoveLaraPosition(PHD_VECTOR* pos, ITEM_INFO* item, ITEM_INFO* l); int MoveLaraPosition(PHD_VECTOR* pos, ITEM_INFO* item, ITEM_INFO* l);
int TestBoundsCollide(ITEM_INFO* item, ITEM_INFO* l, int radius); int TestBoundsCollide(ITEM_INFO* item, ITEM_INFO* l, int radius);
void CreatureCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll); void CreatureCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll);
void RefreshFloorGlobals(ITEM_INFO* item);
void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNumber, int objectHeight); void GetCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNumber, int objectHeight);
void GetObjectCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNumber, int objectHeight); void GetObjectCollisionInfo(COLL_INFO* coll, int xPos, int yPos, int zPos, int roomNumber, int objectHeight);
void LaraBaddieCollision(ITEM_INFO* item, COLL_INFO* coll); void LaraBaddieCollision(ITEM_INFO* item, COLL_INFO* coll);

View file

@ -104,7 +104,6 @@ short NextFxActive;
short NextFxFree; short NextFxFree;
short NextItemActive; short NextItemActive;
short NextItemFree; short NextItemFree;
short *TriggerIndex;
int DisableLaraControl = 0; int DisableLaraControl = 0;
int WeatherType; int WeatherType;
@ -130,7 +129,6 @@ int InitialiseGame;
int RequiredStartPos; int RequiredStartPos;
int WeaponDelay; int WeaponDelay;
int WeaponEnemyTimer; int WeaponEnemyTimer;
HEIGHT_TYPES HeightType;
int HeavyTriggered; int HeavyTriggered;
short SkyPos1; short SkyPos1;
short SkyPos2; short SkyPos2;
@ -162,6 +160,7 @@ short FlashFadeG;
short FlashFadeB; short FlashFadeB;
short FlashFader; short FlashFader;
HEIGHT_TYPES HeightType;
int SplitFloor; int SplitFloor;
int SplitCeiling; int SplitCeiling;
int TiltXOffset; int TiltXOffset;
@ -1756,9 +1755,86 @@ int CheckNoColCeilingTriangle(FLOOR_INFO *floor, int x, int z)
return 0; return 0;
} }
short* GetTriggerIndex(FLOOR_INFO* floor, int x, int y, int z)
{
ROOM_INFO* r;
while (floor->pitRoom != NO_ROOM)
{
if (CheckNoColFloorTriangle(floor, x, z) == 1)
break;
r = &g_Level.Rooms[floor->pitRoom];
floor = &XZ_GET_SECTOR(r, x - r->x, z - r->z);
}
if ((floor->floor * 256) == NO_HEIGHT || floor->index == 0)
return NULL;
short* triggerIndex = NULL;
short* data = &g_Level.FloorData[floor->index];
short type;
int trigger;
do
{
type = *(data++);
switch (type & DATA_TYPE)
{
case DOOR_TYPE:
case TILT_TYPE:
case ROOF_TYPE:
case SPLIT1:
case SPLIT2:
case SPLIT3:
case SPLIT4:
case NOCOLF1T:
case NOCOLF1B:
case NOCOLF2T:
case NOCOLF2B:
case NOCOLC1T:
case NOCOLC1B:
case NOCOLC2T:
case NOCOLC2B:
data++;
break;
case LAVA_TYPE:
case CLIMB_TYPE:
case MONKEY_TYPE:
case TRIGTRIGGER_TYPE:
case MINER_TYPE:
break;
case TRIGGER_TYPE:
triggerIndex = data - 1;
data++;
do
{
trigger = *(data++);
if (TRIG_BITS(trigger) != TO_OBJECT)
{
if (TRIG_BITS(trigger) == TO_CAMERA ||
TRIG_BITS(trigger) == TO_FLYBY)
{
trigger = *(data++);
}
}
} while (!(trigger & END_BIT));
break;
default:
break;
}
} while (!(type & END_BIT));
return triggerIndex;
}
int GetFloorHeight(FLOOR_INFO *floor, int x, int y, int z) int GetFloorHeight(FLOOR_INFO *floor, int x, int y, int z)
{ {
TiltYOffset = 0; TiltYOffset = 0;
TiltXOffset = 0; TiltXOffset = 0;
OnObject = 0; OnObject = 0;
@ -1777,15 +1853,8 @@ int GetFloorHeight(FLOOR_INFO *floor, int x, int y, int z)
int height = floor->floor * 256; int height = floor->floor * 256;
if (height != NO_HEIGHT) if (height != NO_HEIGHT)
{ {
// return height;
TriggerIndex = NULL;
if (floor->index != 0) if (floor->index != 0)
{ {
// return height;
short* data = &g_Level.FloorData[floor->index]; short* data = &g_Level.FloorData[floor->index];
short type, hadj; short type, hadj;
@ -1799,6 +1868,14 @@ int GetFloorHeight(FLOOR_INFO *floor, int x, int y, int z)
switch (type & DATA_TYPE) switch (type & DATA_TYPE)
{ {
case LAVA_TYPE:
case CLIMB_TYPE:
case MONKEY_TYPE:
case TRIGTRIGGER_TYPE:
case MINER_TYPE:
break;
case DOOR_TYPE: case DOOR_TYPE:
case ROOF_TYPE: case ROOF_TYPE:
case SPLIT3: case SPLIT3:
@ -1833,11 +1910,7 @@ int GetFloorHeight(FLOOR_INFO *floor, int x, int y, int z)
break; break;
case TRIGGER_TYPE: case TRIGGER_TYPE:
if (!TriggerIndex)
TriggerIndex = data - 1;
data++; data++;
do do
{ {
trigger = *(data++); trigger = *(data++);
@ -1850,32 +1923,10 @@ int GetFloorHeight(FLOOR_INFO *floor, int x, int y, int z)
trigger = *(data++); trigger = *(data++);
} }
} }
else
{
/*item = &g_Level.Items[trigger & VALUE_BITS];
obj = &Objects[item->objectNumber];
if (obj->floor && !(item->flags & 0x8000))
{
(obj->floor)(item, x, y, z, &height);
}*/
}
} while (!(trigger & END_BIT)); } while (!(trigger & END_BIT));
break; break;
case LAVA_TYPE:
TriggerIndex = data - 1;
break;
case CLIMB_TYPE:
case MONKEY_TYPE:
case TRIGTRIGGER_TYPE:
case MINER_TYPE:
if (!TriggerIndex)
TriggerIndex = data - 1;
break;
case SPLIT1: case SPLIT1:
case SPLIT2: case SPLIT2:
case NOCOLF1T: case NOCOLF1T:
@ -3522,13 +3573,12 @@ void TestTriggersAtXYZ(int x, int y, int z, short roomNumber, int heavy, int fla
{ {
auto roomNum = roomNumber; auto roomNum = roomNumber;
auto floor = GetFloor(x, y, z, &roomNum); auto floor = GetFloor(x, y, z, &roomNum);
GetFloorHeight(floor, x, y, z);
// Don't process legacy triggers if trigger triggerer wasn't used // Don't process legacy triggers if trigger triggerer wasn't used
if (floor->Flags.MarkTriggerer && !floor->Flags.MarkTriggererActive) if (floor->Flags.MarkTriggerer && !floor->Flags.MarkTriggererActive)
return; return;
TestTriggers(TriggerIndex, heavy, flags); TestTriggers(GetTriggerIndex(floor, x, y, z), heavy, flags);
} }
void ProcessSectorFlags(int x, int y, int z, short roomNumber) void ProcessSectorFlags(int x, int y, int z, short roomNumber)

View file

@ -76,7 +76,6 @@ extern short NextFxActive;
extern short NextFxFree; extern short NextFxFree;
extern short NextItemActive; extern short NextItemActive;
extern short NextItemFree; extern short NextItemFree;
extern short* TriggerIndex;
extern int DisableLaraControl; extern int DisableLaraControl;
extern int WeatherType; extern int WeatherType;
extern int LaraDrawType; extern int LaraDrawType;
@ -154,6 +153,7 @@ void AlterFloorHeight(ITEM_INFO* item, int height);
int CheckNoColCeilingTriangle(FLOOR_INFO* floor, int x, int z); int CheckNoColCeilingTriangle(FLOOR_INFO* floor, int x, int z);
int CheckNoColFloorTriangle(FLOOR_INFO* floor, int x, int z); int CheckNoColFloorTriangle(FLOOR_INFO* floor, int x, int z);
int GetFloorHeight(FLOOR_INFO* floor, int x, int y, int z); int GetFloorHeight(FLOOR_INFO* floor, int x, int y, int z);
short* GetTriggerIndex(FLOOR_INFO* floor, int x, int y, int z);
FLOOR_INFO* GetFloor(int x, int y, int z, short* roomNumber); FLOOR_INFO* GetFloor(int x, int y, int z, short* roomNumber);
//void UpdateDebris(); //void UpdateDebris();
int LOS(GAME_VECTOR* start, GAME_VECTOR* end); int LOS(GAME_VECTOR* start, GAME_VECTOR* end);

View file

@ -130,40 +130,13 @@ void ControlTriggerTriggerer(short itemNumber)
{ {
ITEM_INFO* item = &g_Level.Items[itemNumber]; ITEM_INFO* item = &g_Level.Items[itemNumber];
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &item->roomNumber); FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &item->roomNumber);
int height = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (TriggerIndex) if (floor->Flags.MarkTriggerer)
{
short* trigger = TriggerIndex;
if ((*trigger & 0x1F) == 5)
{
if ((*trigger & 0x8000) != 0)
return;
trigger++;
}
if ((*trigger & 0x1F) == 6)
{
if ((*trigger & 0x8000) != 0)
return;
trigger++;
}
if ((*trigger & 0x1F) == 19)
{
if ((*trigger & 0x8000) != 0)
return;
trigger++;
}
if ((*trigger & 0x1F) == 20)
{ {
if (TriggerActive(item)) if (TriggerActive(item))
*trigger |= 0x20u; floor->Flags.MarkTriggererActive = true;
else else
*trigger &= 0xDFu; floor->Flags.MarkTriggererActive = false;
}
} }
} }

View file

@ -811,10 +811,11 @@ bool SaveGame::readGameStatusChunks(ChunkId* chunkId, int maxSize, int arg)
g_Level.Rooms[roomIndex].mesh[staticIndex].y, g_Level.Rooms[roomIndex].mesh[staticIndex].y,
g_Level.Rooms[roomIndex].mesh[staticIndex].z, g_Level.Rooms[roomIndex].mesh[staticIndex].z,
&roomIndex); &roomIndex);
int height = GetFloorHeight(floor, g_Level.Rooms[roomIndex].mesh[staticIndex].x,
TestTriggersAtXYZ(g_Level.Rooms[roomIndex].mesh[staticIndex].x,
g_Level.Rooms[roomIndex].mesh[staticIndex].y, g_Level.Rooms[roomIndex].mesh[staticIndex].y,
g_Level.Rooms[roomIndex].mesh[staticIndex].z); g_Level.Rooms[roomIndex].mesh[staticIndex].z, roomIndex, true, NULL);
TestTriggers(TriggerIndex, 1, 0);
floor->stopper = false; floor->stopper = false;
} }

View file

@ -1182,12 +1182,12 @@ void SwitchControl(short itemNumber)
int GetKeyTrigger(ITEM_INFO* item) int GetKeyTrigger(ITEM_INFO* item)
{ {
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &item->roomNumber); FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &item->roomNumber);
GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); auto triggerIndex = GetTriggerIndex(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (TriggerIndex) if (triggerIndex)
{ {
short* trigger = TriggerIndex; short* trigger = triggerIndex;
for (short i = *TriggerIndex; (i & 0x1F) != 4; trigger++) for (short i = *triggerIndex; (i & 0x1F) != 4; trigger++)
{ {
if (i < 0) if (i < 0)
break; break;
@ -1210,12 +1210,12 @@ int GetKeyTrigger(ITEM_INFO* item)
int GetSwitchTrigger(ITEM_INFO* item, short* itemNos, int AttatchedToSwitch) int GetSwitchTrigger(ITEM_INFO* item, short* itemNos, int AttatchedToSwitch)
{ {
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &item->roomNumber); FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &item->roomNumber);
GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); auto triggerIndex = GetTriggerIndex(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (TriggerIndex) if (triggerIndex)
{ {
short* trigger; short* trigger;
for (trigger = TriggerIndex; (*trigger & DATA_TYPE) != TRIGGER_TYPE; trigger++) for (trigger = triggerIndex; (*trigger & DATA_TYPE) != TRIGGER_TYPE; trigger++)
{ {
if (*trigger & END_BIT) if (*trigger & END_BIT)
break; break;
@ -1338,16 +1338,16 @@ void CogSwitchCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll)
ITEM_INFO* item = &g_Level.Items[itemNum]; ITEM_INFO* item = &g_Level.Items[itemNum];
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &item->roomNumber); FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &item->roomNumber);
GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos); auto triggerIndex = GetTriggerIndex(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
if (!TriggerIndex) if (!triggerIndex)
{ {
ObjectCollision(itemNum, l, coll); ObjectCollision(itemNum, l, coll);
return; return;
} }
short* trigger = TriggerIndex; short* trigger = triggerIndex;
for (int i = *TriggerIndex; (i & 0x1F) != 4; trigger++) for (int i = *triggerIndex; (i & 0x1F) != 4; trigger++)
{ {
if (i < 0) if (i < 0)
break; break;