2020-05-27 19:07:34 +02:00
|
|
|
#include "framework.h"
|
|
|
|
#include "tr5_twoblockplatform.h"
|
|
|
|
#include "level.h"
|
2021-09-19 23:41:26 +03:00
|
|
|
#include "control/control.h"
|
2020-05-27 19:07:34 +02:00
|
|
|
#include "items.h"
|
|
|
|
#include "lara.h"
|
2021-09-25 16:00:30 +03:00
|
|
|
#include "Sound/sound.h"
|
2021-08-28 13:27:58 +02:00
|
|
|
#include "collide.h"
|
2021-09-29 03:41:36 +03:00
|
|
|
#include "floordata.h"
|
|
|
|
#include "Renderer11.h"
|
|
|
|
using namespace TEN::Renderer;
|
|
|
|
|
|
|
|
using namespace TEN::Floordata;
|
2020-05-27 19:07:34 +02:00
|
|
|
|
|
|
|
void InitialiseTwoBlocksPlatform(short itemNumber)
|
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
2020-05-27 19:07:34 +02:00
|
|
|
|
|
|
|
item->itemFlags[0] = item->pos.yPos;
|
|
|
|
item->itemFlags[1] = 1;
|
2021-09-29 03:41:36 +03:00
|
|
|
UpdateBridgeItem(itemNumber);
|
2020-05-27 19:07:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void TwoBlocksPlatformControl(short itemNumber)
|
|
|
|
{
|
2020-07-21 09:56:47 +02:00
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
2020-05-27 19:07:34 +02:00
|
|
|
|
|
|
|
if (TriggerActive(item))
|
|
|
|
{
|
|
|
|
if (item->triggerFlags)
|
|
|
|
{
|
2021-06-02 16:59:30 -03:00
|
|
|
if (item->pos.yPos > (item->itemFlags[0] - 16 * (int) (item->triggerFlags & 0xFFFFFFF0)))
|
2020-05-27 19:07:34 +02:00
|
|
|
{
|
|
|
|
item->pos.yPos -= item->triggerFlags & 0xF;
|
|
|
|
}
|
|
|
|
|
|
|
|
short roomNumber = item->roomNumber;
|
|
|
|
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
|
|
|
|
item->floor = GetFloorHeight(floor, item->pos.xPos, item->pos.yPos, item->pos.zPos);
|
|
|
|
|
|
|
|
if (roomNumber != item->roomNumber)
|
2021-06-02 16:59:30 -03:00
|
|
|
{
|
2021-09-29 03:41:36 +03:00
|
|
|
UpdateBridgeItem(itemNumber, true);
|
2020-05-27 19:07:34 +02:00
|
|
|
ItemNewRoom(itemNumber, roomNumber);
|
2021-09-29 03:41:36 +03:00
|
|
|
UpdateBridgeItem(itemNumber);
|
2021-06-02 16:59:30 -03:00
|
|
|
}
|
2020-05-27 19:07:34 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-08-27 19:29:18 +03:00
|
|
|
bool onObject = false;
|
2020-05-27 19:07:34 +02:00
|
|
|
|
|
|
|
int height = LaraItem->pos.yPos + 1;
|
2021-10-01 10:35:36 +03:00
|
|
|
if (GetBridgeItemIntersect(itemNumber, LaraItem->pos.xPos, LaraItem->pos.yPos, LaraItem->pos.zPos, false).has_value())
|
2021-06-01 13:02:05 +02:00
|
|
|
{
|
|
|
|
if (LaraItem->pos.yPos <= item->pos.yPos + 32)
|
|
|
|
{
|
|
|
|
if (item->pos.yPos < height)
|
|
|
|
{
|
2021-08-27 19:29:18 +03:00
|
|
|
onObject = true;
|
2021-06-01 13:02:05 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-05-27 19:07:34 +02:00
|
|
|
|
2021-08-27 19:29:18 +03:00
|
|
|
if (onObject && LaraItem->animNumber != LA_HOP_BACK_CONTINUE)
|
2020-05-27 19:07:34 +02:00
|
|
|
item->itemFlags[1] = 1;
|
|
|
|
else
|
|
|
|
item->itemFlags[1] = -1;
|
|
|
|
|
2021-06-01 13:02:05 +02:00
|
|
|
if (item->itemFlags[1] < 0)
|
2020-05-27 19:07:34 +02:00
|
|
|
{
|
2021-06-01 13:02:05 +02:00
|
|
|
if (item->pos.yPos <= item->itemFlags[0])
|
2020-05-27 19:07:34 +02:00
|
|
|
{
|
2021-06-01 13:02:05 +02:00
|
|
|
item->itemFlags[1] = 1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SoundEffect(SFX_TR4_RUMBLE_NEXTDOOR, &item->pos, 0);
|
|
|
|
item->pos.yPos -= 4;
|
2020-05-27 19:07:34 +02:00
|
|
|
}
|
|
|
|
}
|
2021-06-01 13:02:05 +02:00
|
|
|
else if (item->itemFlags[1] > 0)
|
2020-05-27 19:07:34 +02:00
|
|
|
{
|
|
|
|
if (item->pos.yPos >= item->itemFlags[0] + 128)
|
|
|
|
{
|
|
|
|
item->itemFlags[1] = -1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-05-26 06:04:32 +02:00
|
|
|
SoundEffect(SFX_TR4_RUMBLE_NEXTDOOR, &item->pos, 0);
|
2020-05-27 19:07:34 +02:00
|
|
|
item->pos.yPos += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-24 20:53:39 +03:00
|
|
|
std::optional<int> TwoBlocksPlatformFloor(short itemNumber, int x, int y, int z)
|
|
|
|
{
|
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
|
|
|
|
|
|
|
if (!item->meshBits)
|
|
|
|
return std::nullopt;
|
|
|
|
|
2021-09-29 03:41:36 +03:00
|
|
|
return GetBridgeItemIntersect(itemNumber, x, y, z, false);
|
2021-09-24 20:53:39 +03:00
|
|
|
}
|
|
|
|
|
2021-06-01 13:02:05 +02:00
|
|
|
std::optional<int> TwoBlocksPlatformCeiling(short itemNumber, int x, int y, int z)
|
2020-05-27 19:07:34 +02:00
|
|
|
{
|
2021-06-01 13:02:05 +02:00
|
|
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
|
|
|
|
2021-06-02 16:59:30 -03:00
|
|
|
if (!item->meshBits)
|
|
|
|
return std::nullopt;
|
2021-06-01 13:02:05 +02:00
|
|
|
|
2021-09-29 03:41:36 +03:00
|
|
|
return GetBridgeItemIntersect(itemNumber, x, y, z, true);
|
2021-06-01 13:02:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int TwoBlocksPlatformFloorBorder(short itemNumber)
|
|
|
|
{
|
2021-09-29 03:41:36 +03:00
|
|
|
return GetBridgeBorder(itemNumber, false);
|
2021-06-01 13:02:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int TwoBlocksPlatformCeilingBorder(short itemNumber)
|
|
|
|
{
|
2021-09-29 03:41:36 +03:00
|
|
|
return GetBridgeBorder(itemNumber, true);
|
2020-05-27 19:07:34 +02:00
|
|
|
}
|