TombEngine/TR5Main/Objects/TR5/Object/tr5_raisingblock.cpp

178 lines
4 KiB
C++
Raw Normal View History

#include "framework.h"
#include "tr5_raisingblock.h"
#include "items.h"
#include "level.h"
2021-09-25 16:04:16 +03:00
#include "setup.h"
2021-09-19 18:29:25 +03:00
#include "animation.h"
2021-09-19 23:41:26 +03:00
#include "control/control.h"
#include "control/box.h"
#include "objectslist.h"
2021-09-19 18:29:25 +03:00
#include "Sound/sound.h"
#include "camera.h"
void InitialiseRaisingBlock(short itemNumber)
{
ITEM_INFO* item = &g_Level.Items[itemNumber];
short roomNumber = item->roomNumber;
FLOOR_INFO* floor = GetFloor(item->pos.xPos, item->pos.yPos, item->pos.zPos, &roomNumber);
2021-09-13 02:46:48 +03:00
if(floor->Box != NO_BOX)
g_Level.Boxes[floor->Box].flags &= ~BLOCKED;
// Set mutators to 0 by default
for (int i = 0; i < item->mutator.size(); i++)
item->mutator[i].Scale.y = 0;
if (item->triggerFlags < 0)
{
item->aiBits |= ALL_AIOBJ;
AddActiveItem(itemNumber);
item->status = ITEM_ACTIVE;
}
// Get height from animations
ANIM_FRAME* frame = &g_Level.Frames[g_Level.Anims[Objects[item->objectNumber].animIndex].framePtr];
item->itemFlags[7] = (short)abs(frame->boundingBox.Y1 - frame->boundingBox.Y2);
2021-08-30 18:03:21 +03:00
TEN::Floordata::AddBridge(itemNumber);
}
void ControlRaisingBlock(short itemNumber)
{
ITEM_INFO* item = &g_Level.Items[itemNumber];
if (TriggerActive(item))
{
if (!item->itemFlags[2])
{
if (item->objectNumber == ID_RAISING_BLOCK1)
{
if (item->triggerFlags == -1)
{
2020-11-14 14:35:27 -03:00
//AlterFloorHeight(item, -255);
}
else if (item->triggerFlags == -3)
{
2020-11-14 14:35:27 -03:00
//AlterFloorHeight(item, -1023);
}
else
{
2020-11-14 14:35:27 -03:00
//AlterFloorHeight(item, -item->itemFlags[7]);
}
}
else
{
2020-11-14 14:35:27 -03:00
//AlterFloorHeight(item, -item->itemFlags[7]);
}
item->itemFlags[2] = 1;
}
if (item->triggerFlags < 0)
{
item->itemFlags[1] = 1;
}
else if (item->itemFlags[1] < 4096)
{
SoundEffect(SFX_TR4_BLK_PLAT_RAISE_AND_LOW, &item->pos, 0);
item->itemFlags[1] += 64;
if (item->triggerFlags > 0)
{
if (abs(item->pos.xPos - Camera.pos.x) < 10240 &&
abs(item->pos.xPos - Camera.pos.x) < 10240 &&
abs(item->pos.xPos - Camera.pos.x) < 10240)
{
if (item->itemFlags[1] == 64 || item->itemFlags[1] == 4096)
Camera.bounce = -32;
else
Camera.bounce = -16;
}
}
}
}
else if (item->itemFlags[1] <= 0 || item->triggerFlags < 0)
{
if (item->itemFlags[2])
{
item->itemFlags[1] = 0;
if (item->objectNumber == ID_RAISING_BLOCK1)
{
if (item->triggerFlags == -1)
{
2020-11-14 14:35:27 -03:00
//AlterFloorHeight(item, 255);
item->itemFlags[2] = 0;
}
else if (item->triggerFlags == -3)
{
2020-11-14 14:35:27 -03:00
//AlterFloorHeight(item, 1023);
item->itemFlags[2] = 0;
}
else
{
2020-11-14 14:35:27 -03:00
//AlterFloorHeight(item, item->itemFlags[7]);
}
}
else
{
2020-11-14 14:35:27 -03:00
//AlterFloorHeight(item, item->itemFlags[7]);
}
item->itemFlags[2] = 0;
}
}
else
{
SoundEffect(SFX_TR4_BLK_PLAT_RAISE_AND_LOW, &item->pos, 0);
if (item->triggerFlags >= 0)
{
if (abs(item->pos.xPos - Camera.pos.x) < 10240 &&
abs(item->pos.xPos - Camera.pos.x) < 10240 &&
abs(item->pos.xPos - Camera.pos.x) < 10240)
{
if (item->itemFlags[1] == 64 || item->itemFlags[1] == 4096)
Camera.bounce = -32;
else
Camera.bounce = -16;
}
}
item->itemFlags[1] -= 64;
}
// Update bone mutators
if (item->triggerFlags > -1)
{
for (int i = 0; i < item->mutator.size(); i++)
item->mutator[i].Scale = Vector3(1.0f, item->itemFlags[1] / 4096.0f, 1.0f);
}
2020-11-14 14:35:27 -03:00
}
2020-12-21 13:16:29 -03:00
2021-01-06 17:53:13 -03:00
std::optional<int> RaisingBlockFloor(short itemNumber, int x, int y, int z)
2020-12-21 13:16:29 -03:00
{
const auto& item = g_Level.Items[itemNumber];
2021-01-06 17:53:13 -03:00
const auto height = item.pos.yPos - item.itemFlags[7] * item.itemFlags[1] / 4096;
return std::optional{height};
2020-12-21 13:16:29 -03:00
}
2021-01-06 17:53:13 -03:00
std::optional<int> RaisingBlockCeiling(short itemNumber, int x, int y, int z)
2020-12-21 13:16:29 -03:00
{
const auto& item = g_Level.Items[itemNumber];
2021-01-27 22:26:47 -03:00
return std::optional{item.pos.yPos + 1};
}
int RaisingBlockFloorBorder(short itemNumber)
{
const auto& item = g_Level.Items[itemNumber];
const auto height = item.pos.yPos - item.itemFlags[7];
return height;
}
int RaisingBlockCeilingBorder(short itemNumber)
{
const auto& item = g_Level.Items[itemNumber];
return item.pos.yPos + 1;
2020-12-21 13:16:29 -03:00
}