TombEngine/TR5Main/Objects/TR5/Object/tr5_highobject.cpp
KrysB4k 735e73f1ea Removed duplicate function GetFloorAndTestTriggers, fix pushblock issues
GetFloorAndItemTriggers() was removed in favor of TestTriggersAtXYZ() from switch.cpp, which does the same. All calls to GetFloorAndItemTriggers were replaced with TestTriggersAtXYZ.

Pushables pulling bug was fixed in TestBlockPull(). PushableBlockControl() now calls ItemNewRoom() to signal change of room membership of pushable.
2020-12-19 23:02:55 +01:00

213 lines
No EOL
4.3 KiB
C++

#include "framework.h"
#include "tr5_highobject.h"
#include "items.h"
#include "level.h"
#include "control.h"
#include "sound.h"
#include "objectslist.h"
void InitialiseHighObject1(short itemNumber)
{
int x = 0;
int y = 0;
int z = 0;
ITEM_INFO* item = &g_Level.Items[itemNumber];
for (int i = 0; i < g_Level.NumItems; i++)
{
ITEM_INFO* currentItem = &g_Level.Items[i];
if (currentItem->objectNumber != ID_TRIGGER_TRIGGERER)
{
if (currentItem->objectNumber == ID_PUZZLE_ITEM4_COMBO2)
{
item->itemFlags[3] |= (i * 256);
currentItem->pos.yPos = item->pos.yPos - 512;
continue;
}
}
if (currentItem->triggerFlags == 111)
{
item->itemFlags[3] |= i;
continue;
}
if (currentItem->triggerFlags != 112)
{
if (currentItem->objectNumber == ID_PUZZLE_ITEM4_COMBO2)
{
item->itemFlags[3] |= (i * 256);
currentItem->pos.yPos = item->pos.yPos - 512;
continue;
}
}
else
{
x = currentItem->pos.xPos;
y = currentItem->pos.yPos;
z = currentItem->pos.zPos;
}
}
for (int i = 0; i < g_Level.NumItems; i++)
{
ITEM_INFO* currentItem = &g_Level.Items[i];
if (currentItem->objectNumber == ID_PULLEY
&& currentItem->pos.xPos == x
&& currentItem->pos.yPos == y
&& currentItem->pos.zPos == z)
{
item->itemFlags[2] |= i;
break;
}
}
}
void ControlHighObject1(short itemNumber)
{
ITEM_INFO* item = &g_Level.Items[itemNumber];
if (!TriggerActive(item))
{
if (item->itemFlags[0] == 4)
{
item->itemFlags[1]--;
if (!item->itemFlags[1])
{
ITEM_INFO* targetItem = &g_Level.Items[item->itemFlags[3] & 0xFF];
targetItem->flags = (item->flags & 0xC1FF) | 0x20;
item->itemFlags[0] = 6;
item->itemFlags[1] = 768;
TestTriggersAtXYZ(item->pos.xPos, item->pos.yPos, item->pos.zPos, item->roomNumber, 1, 0);
}
return;
}
if (item->itemFlags[0] == 6)
{
item->itemFlags[1] -= 8;
if (item->itemFlags[1] >= 0)
{
int flags = 0;
if (item->itemFlags[1] >= 256)
{
if (item->itemFlags[1] <= 512)
flags = 31;
else
flags = (768 - item->itemFlags[1]) / 8;
}
else
{
flags = item->itemFlags[1] / 8;
}
SoundEffect(SFX_BLK_PLAT_RAISE_LOW, &item->pos, (flags * 256) | 8);
item->pos.yPos += 8;
ITEM_INFO* targetItem = &g_Level.Items[(item->itemFlags[3] / 256) & 0xFF];
targetItem->flags |= 0x20u;
targetItem->pos.yPos = item->pos.yPos - 560;
}
if (item->itemFlags[1] < -60)
{
ITEM_INFO* targetItem = &g_Level.Items[item->itemFlags[2] & 0xFF];
targetItem->itemFlags[1] = 0;
targetItem->flags |= 0x20u;
item->itemFlags[0] = 0;
item->itemFlags[1] = 0;
RemoveActiveItem(itemNumber);
item->flags &= 0xC1FF;
item->status = ITEM_NOT_ACTIVE;
return;
}
}
}
else if (item->itemFlags[0] >= 3)
{
if (item->itemFlags[0] == 4)
{
item->itemFlags[0] = 5;
item->itemFlags[1] = 0;
}
else if (item->itemFlags[0] == 5 && !item->itemFlags[1] && g_Level.Items[(item->itemFlags[3] / 256) & 0xFF].flags < 0)
{
DoFlipMap(3);
FlipMap[3] ^= 0x3E00u;
item->itemFlags[1] = 1;
}
}
else
{
if (item->itemFlags[1] >= 256)
{
item->itemFlags[1] = 0;
item->itemFlags[0]++;
if (item->itemFlags[0] == 3)
{
item->itemFlags[1] = 30 * item->triggerFlags;
item->itemFlags[0] = 4;
short targetItemNumber = item->itemFlags[3] & 0xFF;
ITEM_INFO* targetItem = &g_Level.Items[targetItemNumber];
AddActiveItem(targetItemNumber);
targetItem->flags |= 0x3E20u;
targetItem->status = ITEM_ACTIVE;
targetItemNumber = item->itemFlags[2] & 0xFF;
targetItem = &g_Level.Items[targetItemNumber];
targetItem->itemFlags[1] = 1;
targetItem->flags |= 0x20;
targetItem->flags &= 0xC1FF;
return;
}
RemoveActiveItem(itemNumber);
item->flags &= 0xC1FF;
item->status = ITEM_NOT_ACTIVE;
return;
}
int flags = 0;
if (item->itemFlags[1] >= 31)
{
if (item->itemFlags[1] <= 224)
flags = 31;
else
flags = 255 - item->itemFlags[1];
}
else
{
flags = item->itemFlags[1];
}
SoundEffect(SFX_BLK_PLAT_RAISE_LOW, &item->pos, (flags * 256) | 8);
item->itemFlags[1] += 16;
item->pos.yPos -= 16;
short targetItemNumber = (item->itemFlags[3] / 256) & 0xFF;
ITEM_INFO* targetItem = &g_Level.Items[targetItemNumber];
targetItem->flags |= 0x20;
targetItem->pos.yPos = item->pos.yPos - 560;
}
}