Fix raising blocks height

This commit is contained in:
asasas9500 2020-11-14 14:35:27 -03:00
parent efd37b3290
commit 1b96701d5e
3 changed files with 36 additions and 10 deletions

View file

@ -40,20 +40,20 @@ void ControlRaisingBlock(short itemNumber)
{ {
if (item->triggerFlags == -1) if (item->triggerFlags == -1)
{ {
AlterFloorHeight(item, -255); //AlterFloorHeight(item, -255);
} }
else if (item->triggerFlags == -3) else if (item->triggerFlags == -3)
{ {
AlterFloorHeight(item, -1023); //AlterFloorHeight(item, -1023);
} }
else else
{ {
AlterFloorHeight(item, -item->itemFlags[7]); //AlterFloorHeight(item, -item->itemFlags[7]);
} }
} }
else else
{ {
AlterFloorHeight(item, -item->itemFlags[7]); //AlterFloorHeight(item, -item->itemFlags[7]);
} }
item->itemFlags[2] = 1; item->itemFlags[2] = 1;
@ -93,22 +93,22 @@ void ControlRaisingBlock(short itemNumber)
{ {
if (item->triggerFlags == -1) if (item->triggerFlags == -1)
{ {
AlterFloorHeight(item, 255); //AlterFloorHeight(item, 255);
item->itemFlags[2] = 0; item->itemFlags[2] = 0;
} }
else if (item->triggerFlags == -3) else if (item->triggerFlags == -3)
{ {
AlterFloorHeight(item, 1023); //AlterFloorHeight(item, 1023);
item->itemFlags[2] = 0; item->itemFlags[2] = 0;
} }
else else
{ {
AlterFloorHeight(item, item->itemFlags[7]); //AlterFloorHeight(item, item->itemFlags[7]);
} }
} }
else else
{ {
AlterFloorHeight(item, item->itemFlags[7]); //AlterFloorHeight(item, item->itemFlags[7]);
} }
item->itemFlags[2] = 0; item->itemFlags[2] = 0;
@ -133,4 +133,26 @@ void ControlRaisingBlock(short itemNumber)
item->itemFlags[1] -= 64; item->itemFlags[1] -= 64;
} }
} }
std::tuple<std::optional<int>, bool> RaisingBlockFloor(short itemNumber, int x, int y, int z)
{
const auto& item = g_Level.Items[itemNumber];
if (abs(item.pos.xPos - x) <= SECTOR(1) / 2 && abs(item.pos.zPos - z) <= SECTOR(1) / 2)
{
auto height = item.pos.yPos - item.itemFlags[7] * item.itemFlags[1] / 4096;
return std::make_tuple(std::optional{height}, y > height && y < item.pos.yPos);
}
return std::make_tuple(std::nullopt, false);
}
std::tuple<std::optional<int>, bool> RaisingBlockCeiling(short itemNumber, int x, int y, int z)
{
const auto& item = g_Level.Items[itemNumber];
if (abs(item.pos.xPos - x) <= SECTOR(1) / 2 && abs(item.pos.zPos - z) <= SECTOR(1) / 2)
{
auto height = item.pos.yPos - item.itemFlags[7] * item.itemFlags[1] / 4096;
return std::make_tuple(std::optional{item.pos.yPos}, y > height && y < item.pos.yPos);
}
return std::make_tuple(std::nullopt, false);
}

View file

@ -1,4 +1,6 @@
#pragma once #pragma once
void InitialiseRaisingBlock(short itemNumber); void InitialiseRaisingBlock(short itemNumber);
void ControlRaisingBlock(short itemNumber); void ControlRaisingBlock(short itemNumber);
std::tuple<std::optional<int>, bool> RaisingBlockFloor(short itemNumber, int x, int y, int z);
std::tuple<std::optional<int>, bool> RaisingBlockCeiling(short itemNumber, int x, int y, int z);

View file

@ -903,6 +903,8 @@ static void StartObject(OBJECT_INFO *obj)
{ {
obj->initialise = InitialiseRaisingBlock; obj->initialise = InitialiseRaisingBlock;
obj->control = ControlRaisingBlock; obj->control = ControlRaisingBlock;
obj->floor = RaisingBlockFloor;
obj->ceiling = RaisingBlockCeiling;
obj->saveFlags = true; obj->saveFlags = true;
} }
} }