2021-09-05 05:52:50 +02:00
|
|
|
#include "framework.h"
|
2021-12-24 03:32:19 +03:00
|
|
|
#include "Objects/Generic/Doors/generic_doors.h"
|
2021-12-22 16:23:57 +03:00
|
|
|
#include "Specific/level.h"
|
|
|
|
#include "Game/control/control.h"
|
|
|
|
#include "Game/control/box.h"
|
|
|
|
#include "Game/items.h"
|
|
|
|
#include "Game/control/lot.h"
|
|
|
|
#include "Game/gui.h"
|
|
|
|
#include "Specific/input.h"
|
|
|
|
#include "Game/pickup/pickup.h"
|
|
|
|
#include "Sound/sound.h"
|
|
|
|
#include "Game/animation.h"
|
|
|
|
#include "Game/collision/sphere.h"
|
2021-12-24 11:08:16 +03:00
|
|
|
#include "Objects/Generic/Switches/cog_switch.h"
|
2021-12-22 16:23:57 +03:00
|
|
|
#include "Objects/objectslist.h"
|
|
|
|
#include "Game/Lara/lara.h"
|
2022-02-24 14:22:30 +11:00
|
|
|
#include "Game/Lara/lara_helpers.h"
|
|
|
|
#include "Game/Lara/lara_struct.h"
|
2021-12-22 16:23:57 +03:00
|
|
|
#include "Specific/trmath.h"
|
|
|
|
#include "Game/misc.h"
|
|
|
|
#include "Game/itemdata/door_data.h"
|
|
|
|
#include "Game/collision/collide_room.h"
|
|
|
|
#include "Game/collision/collide_item.h"
|
|
|
|
#include "Game/itemdata/itemdata.h"
|
2021-09-05 05:52:50 +02:00
|
|
|
|
|
|
|
namespace TEN::Entities::Doors
|
|
|
|
{
|
|
|
|
PHD_VECTOR CrowbarDoorPos(-412, 0, 256);
|
|
|
|
|
|
|
|
OBJECT_COLLISION_BOUNDS CrowbarDoorBounds =
|
|
|
|
{
|
|
|
|
-512, 512,
|
|
|
|
-1024, 0,
|
|
|
|
0, 512,
|
2022-02-24 14:22:30 +11:00
|
|
|
-ANGLE(80.0f), ANGLE(80.0f),
|
|
|
|
-ANGLE(80.0f), ANGLE(80.0f),
|
|
|
|
-ANGLE(80.0f), ANGLE(80.0f)
|
2021-09-05 05:52:50 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
void InitialiseDoor(short itemNumber)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* doorItem = &g_Level.Items[itemNumber];
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
if (doorItem->ObjectNumber == ID_SEQUENCE_DOOR1)
|
|
|
|
doorItem->Flags &= 0xBFFFu;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
if (doorItem->ObjectNumber == ID_LIFT_DOORS1 || doorItem->ObjectNumber == ID_LIFT_DOORS2)
|
|
|
|
doorItem->ItemFlags[0] = 4096;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
doorItem->Data = ITEM_DATA(DOOR_DATA());
|
|
|
|
auto* doorData = (DOOR_DATA*)doorItem->Data;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->opened = false;
|
|
|
|
doorData->dptr1 = nullptr;
|
|
|
|
doorData->dptr2 = nullptr;
|
|
|
|
doorData->dptr3 = nullptr;
|
|
|
|
doorData->dptr4 = nullptr;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2021-09-17 15:32:55 +03:00
|
|
|
short boxNumber, twoRoom;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2021-09-17 15:32:55 +03:00
|
|
|
int xOffset = 0;
|
|
|
|
int zOffset = 0;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
if (doorItem->Position.yRot == 0)
|
|
|
|
zOffset = -SECTOR(1);
|
|
|
|
else if (doorItem->Position.yRot == ANGLE(180.0f))
|
|
|
|
zOffset = SECTOR(1);
|
|
|
|
else if (doorItem->Position.yRot == ANGLE(90.0f))
|
|
|
|
xOffset = -SECTOR(1);
|
2021-09-05 05:52:50 +02:00
|
|
|
else
|
2022-02-24 14:22:30 +11:00
|
|
|
xOffset = SECTOR(1);
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* r = &g_Level.Rooms[doorItem->RoomNumber];
|
|
|
|
doorData->d1.floor = GetSector(r, doorItem->Position.xPos - r->x + xOffset, doorItem->Position.zPos - r->z + zOffset);
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
auto roomNumber = doorData->d1.floor->WallPortal;
|
2021-09-05 05:52:50 +02:00
|
|
|
if (roomNumber == NO_ROOM)
|
2022-02-24 14:22:30 +11:00
|
|
|
boxNumber = doorData->d1.floor->Box;
|
2021-09-05 05:52:50 +02:00
|
|
|
else
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* b = &g_Level.Rooms[roomNumber];
|
|
|
|
boxNumber = GetSector(b, doorItem->Position.xPos - b->x + xOffset, doorItem->Position.zPos - b->z + zOffset)->Box;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->d1.block = (boxNumber != NO_BOX && g_Level.Boxes[boxNumber].flags & BLOCKABLE) ? boxNumber : NO_BOX;
|
|
|
|
doorData->d1.data = *doorData->d1.floor;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
|
|
|
if (r->flippedRoom != -1)
|
|
|
|
{
|
|
|
|
r = &g_Level.Rooms[r->flippedRoom];
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->d1flip.floor = GetSector(r, doorItem->Position.xPos - r->x + xOffset, doorItem->Position.zPos - r->z + zOffset);
|
2021-09-17 01:46:06 +03:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
roomNumber = doorData->d1flip.floor->WallPortal;
|
2021-09-05 05:52:50 +02:00
|
|
|
if (roomNumber == NO_ROOM)
|
2022-02-24 14:22:30 +11:00
|
|
|
boxNumber = doorData->d1flip.floor->Box;
|
2021-09-05 05:52:50 +02:00
|
|
|
else
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* b = &g_Level.Rooms[roomNumber];
|
|
|
|
boxNumber = GetSector(b, doorItem->Position.xPos - b->x + xOffset, doorItem->Position.zPos - b->z + zOffset)->Box;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->d1flip.block = (boxNumber != NO_BOX && g_Level.Boxes[boxNumber].flags & BLOCKABLE) ? boxNumber : NO_BOX;
|
|
|
|
doorData->d1flip.data = *doorData->d1flip.floor;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
else
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->d1flip.floor = NULL;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
twoRoom = doorData->d1.floor->WallPortal;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
ShutThatDoor(&doorData->d1, doorData);
|
|
|
|
ShutThatDoor(&doorData->d1flip, doorData);
|
2021-09-05 05:52:50 +02:00
|
|
|
|
|
|
|
if (twoRoom == NO_ROOM)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->d2.floor = NULL;
|
|
|
|
doorData->d2flip.floor = NULL;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
r = &g_Level.Rooms[twoRoom];
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->d2.floor = GetSector(r, doorItem->Position.xPos - r->x, doorItem->Position.zPos - r->z);
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
roomNumber = doorData->d2.floor->WallPortal;
|
2021-09-05 05:52:50 +02:00
|
|
|
if (roomNumber == NO_ROOM)
|
2022-02-24 14:22:30 +11:00
|
|
|
boxNumber = doorData->d2.floor->Box;
|
2021-09-05 05:52:50 +02:00
|
|
|
else
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* b = &g_Level.Rooms[roomNumber];
|
|
|
|
boxNumber = GetSector(b, doorItem->Position.xPos - b->x, doorItem->Position.zPos - b->z)->Box;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->d2.block = (boxNumber != NO_BOX && g_Level.Boxes[boxNumber].flags & BLOCKABLE) ? boxNumber : NO_BOX;
|
|
|
|
doorData->d2.data = *doorData->d2.floor;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
|
|
|
if (r->flippedRoom != -1)
|
|
|
|
{
|
|
|
|
r = &g_Level.Rooms[r->flippedRoom];
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->d2flip.floor = GetSector(r, doorItem->Position.xPos - r->x, doorItem->Position.zPos - r->z);
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
roomNumber = doorData->d2flip.floor->WallPortal;
|
2021-09-05 05:52:50 +02:00
|
|
|
if (roomNumber == NO_ROOM)
|
2022-02-24 14:22:30 +11:00
|
|
|
boxNumber = doorData->d2flip.floor->Box;
|
2021-09-05 05:52:50 +02:00
|
|
|
else
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* b = &g_Level.Rooms[roomNumber];
|
|
|
|
boxNumber = GetSector(b, doorItem->Position.xPos - b->x, doorItem->Position.zPos - b->z)->Box;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->d2flip.block = (boxNumber != NO_BOX && g_Level.Boxes[boxNumber].flags & BLOCKABLE) ? boxNumber : NO_BOX;
|
|
|
|
doorData->d2flip.data = *doorData->d2flip.floor;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
else
|
2022-02-24 14:22:30 +11:00
|
|
|
doorData->d2flip.floor = NULL;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
ShutThatDoor(&doorData->d2, doorData);
|
|
|
|
ShutThatDoor(&doorData->d2flip, doorData);
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
roomNumber = doorItem->RoomNumber;
|
2021-09-05 05:52:50 +02:00
|
|
|
ItemNewRoom(itemNumber, twoRoom);
|
2022-02-24 14:22:30 +11:00
|
|
|
doorItem->RoomNumber = roomNumber;
|
|
|
|
doorItem->InDrawRoom = true;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
void DoorCollision(short itemNumber, ITEM_INFO* laraItem, COLL_INFO* coll)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* laraInfo = GetLaraInfo(laraItem);
|
|
|
|
auto* doorItem = &g_Level.Items[itemNumber];
|
|
|
|
|
|
|
|
if (doorItem->TriggerFlags == 2 &&
|
2022-03-13 02:04:24 +11:00
|
|
|
doorItem->Status == ITEM_NOT_ACTIVE && !doorItem->Animation.Airborne && // CHECK
|
2022-02-24 14:22:30 +11:00
|
|
|
((TrInput & IN_ACTION || g_Gui.GetInventoryItemChosen() == ID_CROWBAR_ITEM) &&
|
2022-03-13 02:04:24 +11:00
|
|
|
laraItem->Animation.ActiveState == LS_IDLE &&
|
|
|
|
laraItem->Animation.AnimNumber == LA_STAND_IDLE &&
|
2022-02-24 14:22:30 +11:00
|
|
|
!laraItem->HitStatus &&
|
|
|
|
laraInfo->Control.HandStatus == HandStatus::Free ||
|
2022-03-08 18:22:14 +11:00
|
|
|
laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber))
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
doorItem->Position.yRot ^= ANGLE(180.0f);
|
|
|
|
if (TestLaraPosition(&CrowbarDoorBounds, doorItem, laraItem))
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (!laraInfo->Control.IsMoving)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2021-11-16 15:51:50 +03:00
|
|
|
if (g_Gui.GetInventoryItemChosen() == NO_ITEM)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2021-11-16 15:51:50 +03:00
|
|
|
if (g_Gui.IsObjectInInventory(ID_CROWBAR_ITEM))
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2021-11-16 15:51:50 +03:00
|
|
|
g_Gui.SetEnterInventory(ID_CROWBAR_ITEM);
|
2022-02-24 14:22:30 +11:00
|
|
|
doorItem->Position.yRot ^= ANGLE(180.0f);
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (OldPickupPos.x != laraItem->Position.xPos || OldPickupPos.y != laraItem->Position.yPos || OldPickupPos.z != laraItem->Position.zPos)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
OldPickupPos.x = laraItem->Position.xPos;
|
|
|
|
OldPickupPos.y = laraItem->Position.yPos;
|
|
|
|
OldPickupPos.z = laraItem->Position.zPos;
|
2021-09-05 05:52:50 +02:00
|
|
|
SayNo();
|
|
|
|
}
|
2022-02-24 14:22:30 +11:00
|
|
|
|
|
|
|
doorItem->Position.yRot ^= ANGLE(180.0f);
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
2022-02-24 14:22:30 +11:00
|
|
|
|
2021-09-05 05:52:50 +02:00
|
|
|
return;
|
|
|
|
}
|
2021-10-12 00:26:46 -05:00
|
|
|
|
2021-11-16 15:51:50 +03:00
|
|
|
if (g_Gui.GetInventoryItemChosen() != ID_CROWBAR_ITEM)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
doorItem->Position.yRot ^= ANGLE(180.0f);
|
2021-09-05 05:52:50 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2021-10-12 00:26:46 -05:00
|
|
|
|
2021-11-16 15:51:50 +03:00
|
|
|
g_Gui.SetInventoryItemChosen(NO_ITEM);
|
2021-10-12 00:26:46 -05:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
if (MoveLaraPosition(&CrowbarDoorPos, doorItem, laraItem))
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
SetAnimation(laraItem, LA_DOOR_OPEN_CROWBAR);
|
|
|
|
doorItem->Position.yRot ^= ANGLE(180.0f);
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
AddActiveItem(itemNumber);
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
laraInfo->Control.IsMoving = 0;
|
|
|
|
laraInfo->Control.HandStatus = HandStatus::Busy;
|
|
|
|
doorItem->Flags |= IFLAG_ACTIVATION_MASK;
|
|
|
|
doorItem->Status = ITEM_ACTIVE;
|
2022-03-13 02:04:24 +11:00
|
|
|
doorItem->Animation.TargetState = LS_RUN_FORWARD;
|
2021-09-05 05:52:50 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-03-08 18:22:14 +11:00
|
|
|
laraInfo->InteractedItem = itemNumber;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
2022-03-08 18:22:14 +11:00
|
|
|
else if (laraInfo->Control.IsMoving && laraInfo->InteractedItem == itemNumber)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
laraInfo->Control.IsMoving = 0;
|
|
|
|
laraInfo->Control.HandStatus = HandStatus::Free;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
doorItem->Position.yRot ^= ANGLE(180.0f);
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
if (TestBoundsCollide(doorItem, laraItem, coll->Setup.Radius))
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (TestCollision(doorItem, laraItem))
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2021-09-11 22:40:35 +03:00
|
|
|
if (coll->Setup.EnableObjectPush)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (!(doorItem->ObjectNumber >= ID_LIFT_DOORS1 &&
|
|
|
|
doorItem->ObjectNumber <= ID_LIFT_DOORS2) || doorItem->ItemFlags[0])
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
ItemPushItem(doorItem, laraItem, coll, FALSE, TRUE);
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DoorControl(short itemNumber)
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* doorItem = &g_Level.Items[itemNumber];
|
|
|
|
auto* doorData = (DOOR_DATA*)doorItem->Data;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2021-09-06 05:41:03 +02:00
|
|
|
// Doors with OCB = 1 are raisable with cog switchs
|
2022-02-24 14:22:30 +11:00
|
|
|
if (doorItem->TriggerFlags == 1)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (doorItem->ItemFlags[0])
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
auto* bounds = GetBoundsAccurate(doorItem);
|
2021-09-06 05:41:03 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
doorItem->ItemFlags[0]--;
|
|
|
|
doorItem->Position.yPos -= TEN::Entities::Switches::COG_DOOR_SPEED;
|
2021-09-06 05:41:03 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
int y = bounds->Y1 + doorItem->ItemFlags[2] - STEP_SIZE;
|
|
|
|
if (doorItem->Position.yPos < y)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
doorItem->Position.yPos = y;
|
|
|
|
doorItem->ItemFlags[0] = 0;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
2022-02-24 14:22:30 +11:00
|
|
|
if (!doorData->opened)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
OpenThatDoor(&doorData->d1, doorData);
|
|
|
|
OpenThatDoor(&doorData->d2, doorData);
|
|
|
|
OpenThatDoor(&doorData->d1flip, doorData);
|
|
|
|
OpenThatDoor(&doorData->d2flip, doorData);
|
|
|
|
doorData->opened = true;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (doorItem->Position.yPos < doorItem->StartPosition.yPos)
|
|
|
|
doorItem->Position.yPos += 4;
|
|
|
|
if (doorItem->Position.yPos >= doorItem->StartPosition.yPos)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
doorItem->Position.yPos = doorItem->StartPosition.yPos;
|
|
|
|
if (doorData->opened)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
ShutThatDoor(&doorData->d1, doorData);
|
|
|
|
ShutThatDoor(&doorData->d2, doorData);
|
|
|
|
ShutThatDoor(&doorData->d1flip, doorData);
|
|
|
|
ShutThatDoor(&doorData->d2flip, doorData);
|
|
|
|
doorData->opened = false;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-09-06 05:41:03 +02:00
|
|
|
|
|
|
|
return;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
if (doorItem->ObjectNumber < ID_LIFT_DOORS1 || doorItem->ObjectNumber > ID_LIFT_DOORS2)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
if (TriggerActive(doorItem))
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-03-13 02:04:24 +11:00
|
|
|
if (doorItem->Animation.ActiveState == 0)
|
|
|
|
doorItem->Animation.TargetState = 1;
|
2022-02-24 14:22:30 +11:00
|
|
|
else if (!doorData->opened)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
OpenThatDoor(&doorData->d1, doorData);
|
|
|
|
OpenThatDoor(&doorData->d2, doorData);
|
|
|
|
OpenThatDoor(&doorData->d1flip, doorData);
|
|
|
|
OpenThatDoor(&doorData->d2flip, doorData);
|
|
|
|
doorData->opened = true;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
doorItem->Status = ITEM_ACTIVE;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2022-03-13 02:04:24 +11:00
|
|
|
if (doorItem->Animation.ActiveState == 1)
|
|
|
|
doorItem->Animation.TargetState = 0;
|
2022-02-24 14:22:30 +11:00
|
|
|
else if (doorData->opened)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-02-24 14:22:30 +11:00
|
|
|
ShutThatDoor(&doorData->d1, doorData);
|
|
|
|
ShutThatDoor(&doorData->d2, doorData);
|
|
|
|
ShutThatDoor(&doorData->d1flip, doorData);
|
|
|
|
ShutThatDoor(&doorData->d2flip, doorData);
|
|
|
|
doorData->opened = false;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-09-06 05:27:27 +02:00
|
|
|
else
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2021-09-06 05:27:27 +02:00
|
|
|
// TR5 lift doors
|
|
|
|
/*if (!TriggerActive(item))
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2021-09-06 05:27:27 +02:00
|
|
|
if (item->itemFlags[0] >= SECTOR(4))
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2021-09-06 05:27:27 +02:00
|
|
|
if (door->opened)
|
|
|
|
{
|
|
|
|
ShutThatDoor(&door->d1, door);
|
|
|
|
ShutThatDoor(&door->d2, door);
|
|
|
|
ShutThatDoor(&door->d1flip, door);
|
|
|
|
ShutThatDoor(&door->d2flip, door);
|
|
|
|
door->opened = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!item->itemFlags[0])
|
|
|
|
SoundEffect(SFX_TR5_LIFT_DOORS, &item->pos, 0);
|
|
|
|
item->itemFlags[0] += STEP_SIZE;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2021-09-06 05:27:27 +02:00
|
|
|
if (item->itemFlags[0] > 0)
|
|
|
|
{
|
|
|
|
if (item->itemFlags[0] == SECTOR(4))
|
|
|
|
SoundEffect(SFX_TR5_LIFT_DOORS, &item->pos, 0);
|
|
|
|
item->itemFlags[0] -= STEP_SIZE;
|
|
|
|
}
|
|
|
|
if (!door->opened)
|
|
|
|
{
|
|
|
|
DontUnlockBox = true;
|
|
|
|
OpenThatDoor(&door->d1, door);
|
|
|
|
OpenThatDoor(&door->d2, door);
|
|
|
|
OpenThatDoor(&door->d1flip, door);
|
|
|
|
OpenThatDoor(&door->d2flip, door);
|
|
|
|
DontUnlockBox = false;
|
|
|
|
door->opened = true;
|
|
|
|
}
|
|
|
|
}*/
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
2021-09-06 05:27:27 +02:00
|
|
|
|
2022-02-24 14:22:30 +11:00
|
|
|
AnimateItem(doorItem);
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void OpenThatDoor(DOORPOS_DATA* doorPos, DOOR_DATA* dd)
|
|
|
|
{
|
|
|
|
FLOOR_INFO* floor = doorPos->floor;
|
|
|
|
|
|
|
|
if (floor != NULL)
|
|
|
|
{
|
2021-09-11 05:38:26 +02:00
|
|
|
*doorPos->floor = doorPos->data;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
|
|
|
short boxIndex = doorPos->block;
|
|
|
|
if (boxIndex != NO_BOX)
|
|
|
|
{
|
2021-09-11 05:38:26 +02:00
|
|
|
g_Level.Boxes[boxIndex].flags &= ~BLOCKED;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
2021-09-11 05:38:26 +02:00
|
|
|
for (int i = 0; i < ActiveCreatures.size(); i++)
|
2021-09-05 05:52:50 +02:00
|
|
|
{
|
2022-03-06 18:59:04 +11:00
|
|
|
ActiveCreatures[i]->LOT.TargetBox = NO_BOX;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ShutThatDoor(DOORPOS_DATA* doorPos, DOOR_DATA* dd)
|
|
|
|
{
|
|
|
|
FLOOR_INFO* floor = doorPos->floor;
|
|
|
|
|
|
|
|
if (floor)
|
|
|
|
{
|
2021-09-13 02:46:48 +03:00
|
|
|
floor->Box = NO_BOX;
|
2021-09-13 02:07:42 +03:00
|
|
|
floor->TriggerIndex = 0;
|
2021-09-11 23:50:54 +03:00
|
|
|
|
|
|
|
// FIXME: HACK!!!!!!!
|
2021-09-14 11:09:29 +03:00
|
|
|
// We should find a better way of dealing with doors using new floordata.
|
|
|
|
|
2021-09-14 10:59:09 +03:00
|
|
|
floor->WallPortal = -1;
|
2021-09-15 10:12:42 +03:00
|
|
|
floor->FloorCollision.Portals[0] = NO_ROOM;
|
|
|
|
floor->FloorCollision.Portals[1] = NO_ROOM;
|
2021-09-11 23:50:54 +03:00
|
|
|
floor->CeilingCollision.Portals[0] = NO_ROOM;
|
|
|
|
floor->CeilingCollision.Portals[1] = NO_ROOM;
|
2021-09-15 10:12:42 +03:00
|
|
|
floor->FloorCollision.Planes[0] = WALL_PLANE;
|
|
|
|
floor->FloorCollision.Planes[1] = WALL_PLANE;
|
|
|
|
floor->CeilingCollision.Planes[0] = WALL_PLANE;
|
|
|
|
floor->CeilingCollision.Planes[1] = WALL_PLANE;
|
2021-09-05 05:52:50 +02:00
|
|
|
|
|
|
|
short boxIndex = doorPos->block;
|
|
|
|
if (boxIndex != NO_BOX)
|
|
|
|
{
|
|
|
|
g_Level.Boxes[boxIndex].flags |= BLOCKED;
|
2021-09-11 05:38:26 +02:00
|
|
|
|
|
|
|
for (int i = 0; i < ActiveCreatures.size(); i++)
|
2022-03-06 18:59:04 +11:00
|
|
|
ActiveCreatures[i]->LOT.TargetBox = NO_BOX;
|
2021-09-05 05:52:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-02-24 14:22:30 +11:00
|
|
|
}
|