2020-06-04 11:00:08 +02:00
|
|
|
#include "framework.h"
|
|
|
|
#include "tr5_highobject.h"
|
|
|
|
#include "items.h"
|
|
|
|
#include "level.h"
|
|
|
|
#include "control.h"
|
|
|
|
#include "switch.h"
|
|
|
|
#include "sound.h"
|
|
|
|
#include "objectslist.h"
|
|
|
|
|
|
|
|
void InitialiseHighObject1(short itemNumber)
|
|
|
|
{
|
|
|
|
int x = 0;
|
|
|
|
int y = 0;
|
|
|
|
int z = 0;
|
|
|
|
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
2020-06-04 11:00:08 +02:00
|
|
|
|
2020-07-21 09:56:47 +02:00
|
|
|
for (int i = 0; i < g_Level.NumItems; i++)
|
2020-06-04 11:00:08 +02:00
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* currentItem = &g_Level.Items[i];
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
if (currentItem->objectNumber != ID_TRIGGER_TRIGGERER)
|
|
|
|
{
|
|
|
|
if (currentItem->objectNumber == ID_PUZZLE_ITEM4_COMBO2)
|
|
|
|
{
|
2020-10-17 23:36:06 -05:00
|
|
|
item->itemFlags[3] |= (i * 256);
|
2020-06-04 11:00:08 +02:00
|
|
|
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)
|
|
|
|
{
|
2020-10-17 23:36:06 -05:00
|
|
|
item->itemFlags[3] |= (i * 256);
|
2020-06-04 11:00:08 +02:00
|
|
|
currentItem->pos.yPos = item->pos.yPos - 512;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
x = currentItem->pos.xPos;
|
|
|
|
y = currentItem->pos.yPos;
|
|
|
|
z = currentItem->pos.zPos;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-21 09:56:47 +02:00
|
|
|
for (int i = 0; i < g_Level.NumItems; i++)
|
2020-06-04 11:00:08 +02:00
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* currentItem = &g_Level.Items[i];
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
if (!TriggerActive(item))
|
|
|
|
{
|
|
|
|
if (item->itemFlags[0] == 4)
|
|
|
|
{
|
|
|
|
item->itemFlags[1]--;
|
|
|
|
|
|
|
|
if (!item->itemFlags[1])
|
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* targetItem = &g_Level.Items[item->itemFlags[3] & 0xFF];
|
2020-06-04 11:00:08 +02:00
|
|
|
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
|
2020-10-17 23:36:06 -05:00
|
|
|
flags = (768 - item->itemFlags[1]) / 8;
|
2020-06-04 11:00:08 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-10-17 23:36:06 -05:00
|
|
|
flags = item->itemFlags[1] / 8;
|
2020-06-04 11:00:08 +02:00
|
|
|
}
|
|
|
|
|
2020-10-17 23:36:06 -05:00
|
|
|
SoundEffect(SFX_BLK_PLAT_RAISE_LOW, &item->pos, (flags * 256) | 8);
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
item->pos.yPos += 8;
|
|
|
|
|
2020-10-17 23:36:06 -05:00
|
|
|
ITEM_INFO* targetItem = &g_Level.Items[(item->itemFlags[3] / 256) & 0xFF];
|
2020-06-04 11:00:08 +02:00
|
|
|
targetItem->flags |= 0x20u;
|
|
|
|
targetItem->pos.yPos = item->pos.yPos - 560;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (item->itemFlags[1] < -60)
|
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* targetItem = &g_Level.Items[item->itemFlags[2] & 0xFF];
|
2020-06-04 11:00:08 +02:00
|
|
|
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;
|
|
|
|
}
|
2020-10-17 23:36:06 -05:00
|
|
|
else if (item->itemFlags[0] == 5 && !item->itemFlags[1] && g_Level.Items[(item->itemFlags[3] / 256) & 0xFF].flags < 0)
|
2020-06-04 11:00:08 +02:00
|
|
|
{
|
|
|
|
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;
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* targetItem = &g_Level.Items[targetItemNumber];
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
AddActiveItem(targetItemNumber);
|
|
|
|
|
|
|
|
targetItem->flags |= 0x3E20u;
|
|
|
|
targetItem->status = ITEM_ACTIVE;
|
|
|
|
|
|
|
|
targetItemNumber = item->itemFlags[2] & 0xFF;
|
2020-07-21 09:56:47 +02:00
|
|
|
targetItem = &g_Level.Items[targetItemNumber];
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
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];
|
|
|
|
}
|
|
|
|
|
2020-10-17 23:36:06 -05:00
|
|
|
SoundEffect(SFX_BLK_PLAT_RAISE_LOW, &item->pos, (flags * 256) | 8);
|
2020-06-04 11:00:08 +02:00
|
|
|
|
|
|
|
item->itemFlags[1] += 16;
|
|
|
|
item->pos.yPos -= 16;
|
|
|
|
|
2020-10-17 23:36:06 -05:00
|
|
|
short targetItemNumber = (item->itemFlags[3] / 256) & 0xFF;
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* targetItem = &g_Level.Items[targetItemNumber];
|
2020-06-04 11:00:08 +02:00
|
|
|
targetItem->flags |= 0x20;
|
|
|
|
targetItem->pos.yPos = item->pos.yPos - 560;
|
|
|
|
}
|
|
|
|
}
|