mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-10 20:46:47 +03:00
Cleaned up code for generic trapdoors
This commit is contained in:
parent
62643f4c64
commit
e97b93e471
3 changed files with 26 additions and 71 deletions
|
@ -13,12 +13,8 @@ void InitialiseTrapDoor(short itemNumber)
|
|||
ITEM_INFO* item;
|
||||
|
||||
item = &g_Level.Items[itemNumber];
|
||||
auto obj = &Objects[item->objectNumber];
|
||||
obj->floorBorder = TrapDoorFloorBorder;
|
||||
obj->ceilingBorder = TrapDoorCeilingBorder;
|
||||
obj->floor = TrapDoorFloor;
|
||||
obj->ceiling = TrapDoorCeiling;
|
||||
CloseTrapDoor(itemNumber, item);
|
||||
T5M::Floordata::AddBridge(itemNumber);
|
||||
CloseTrapDoor(itemNumber);
|
||||
}
|
||||
|
||||
void TrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll)
|
||||
|
@ -154,75 +150,24 @@ void TrapDoorControl(short itemNumber)
|
|||
|
||||
if (item->currentAnimState == 1 && (item->itemFlags[2] || JustLoaded))
|
||||
{
|
||||
OpenTrapDoor(itemNumber, item);
|
||||
OpenTrapDoor(itemNumber);
|
||||
}
|
||||
else if (!item->currentAnimState && !item->itemFlags[2])
|
||||
{
|
||||
CloseTrapDoor(itemNumber, item);
|
||||
CloseTrapDoor(itemNumber);
|
||||
}
|
||||
}
|
||||
|
||||
void CloseTrapDoor(short itemNumber, ITEM_INFO* item)
|
||||
void CloseTrapDoor(short itemNumber)
|
||||
{
|
||||
ROOM_INFO* r;
|
||||
FLOOR_INFO* floor;
|
||||
unsigned short pitsky;
|
||||
|
||||
r = &g_Level.Rooms[item->roomNumber];
|
||||
floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z);
|
||||
pitsky = 0;
|
||||
|
||||
if (item->pos.yPos == r->minfloor)
|
||||
{
|
||||
pitsky = floor->pitRoom;
|
||||
floor->pitRoom = NO_ROOM;
|
||||
r = &g_Level.Rooms[pitsky];
|
||||
floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z);
|
||||
pitsky |= floor->skyRoom * 256;
|
||||
floor->skyRoom = NO_ROOM;
|
||||
}
|
||||
else if (item->pos.yPos == r->maxceiling)
|
||||
{
|
||||
pitsky = floor->skyRoom;
|
||||
floor->skyRoom = NO_ROOM;
|
||||
r = &g_Level.Rooms[pitsky];
|
||||
floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z);
|
||||
pitsky = ((pitsky * 256) | floor->pitRoom);
|
||||
floor->pitRoom = NO_ROOM;
|
||||
}
|
||||
|
||||
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||
item->itemFlags[2] = 1;
|
||||
item->itemFlags[3] = pitsky;
|
||||
T5M::Floordata::AddBridge(itemNumber);
|
||||
}
|
||||
|
||||
void OpenTrapDoor(short itemNumber, ITEM_INFO* item)
|
||||
void OpenTrapDoor(short itemNumber)
|
||||
{
|
||||
ROOM_INFO* r;
|
||||
FLOOR_INFO* floor;
|
||||
unsigned short pitsky;
|
||||
|
||||
r = &g_Level.Rooms[item->roomNumber];
|
||||
floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z);
|
||||
pitsky = item->itemFlags[3];
|
||||
|
||||
if (item->pos.yPos == r->minfloor)
|
||||
{
|
||||
floor->pitRoom = (unsigned char)pitsky;
|
||||
r = &g_Level.Rooms[floor->pitRoom];
|
||||
floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z);
|
||||
floor->skyRoom = pitsky / 256;
|
||||
}
|
||||
else
|
||||
{
|
||||
floor->skyRoom = pitsky / 256;
|
||||
r = &g_Level.Rooms[floor->skyRoom];
|
||||
floor = &XZ_GET_SECTOR(r, item->pos.xPos - r->x, item->pos.zPos - r->z);
|
||||
floor->pitRoom = (unsigned char)pitsky;
|
||||
}
|
||||
|
||||
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||
item->itemFlags[2] = 0;
|
||||
T5M::Floordata::RemoveBridge(itemNumber);
|
||||
}
|
||||
|
||||
int TrapDoorFloorBorder(short itemNumber)
|
||||
|
@ -234,14 +179,13 @@ int TrapDoorFloorBorder(short itemNumber)
|
|||
int TrapDoorCeilingBorder(short itemNumber)
|
||||
{
|
||||
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||
return (item->pos.yPos + 256);
|
||||
return (item->pos.yPos + 128);
|
||||
}
|
||||
|
||||
std::optional<int> TrapDoorFloor(short itemNumber, int x, int y, int z)
|
||||
{
|
||||
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||
|
||||
if (!item->meshBits)
|
||||
if (!item->meshBits || item->itemFlags[2] == 0)
|
||||
return std::nullopt;
|
||||
|
||||
int height = item->pos.yPos;
|
||||
|
@ -252,10 +196,9 @@ std::optional<int> TrapDoorCeiling(short itemNumber, int x, int y, int z)
|
|||
{
|
||||
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||
|
||||
if (!item->meshBits)
|
||||
if (!item->meshBits || item->itemFlags[2] == 0)
|
||||
return std::nullopt;
|
||||
|
||||
//+ 256 is more accurate, but prevents a tall block from entering underneath
|
||||
int height = item->pos.yPos + 20;
|
||||
int height = item->pos.yPos + 128;
|
||||
return std::optional{ height };
|
||||
}
|
|
@ -7,8 +7,8 @@ void TrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll);
|
|||
void CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll);
|
||||
void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll);
|
||||
void TrapDoorControl(short itemNumber);
|
||||
void CloseTrapDoor(short itemNumber, ITEM_INFO* item);
|
||||
void OpenTrapDoor(short itemNumber, ITEM_INFO* item);
|
||||
void CloseTrapDoor(short itemNumber);
|
||||
void OpenTrapDoor(short itemNumber);
|
||||
int TrapDoorFloorBorder(short itemNumber);
|
||||
int TrapDoorCeilingBorder(short itemNumber);
|
||||
std::optional<int> TrapDoorFloor(short itemNumber, int x, int y, int z);
|
||||
|
|
|
@ -16,6 +16,10 @@ static void StartObject()
|
|||
obj->initialise = InitialiseTrapDoor;
|
||||
obj->collision = TrapDoorCollision;
|
||||
obj->control = TrapDoorControl;
|
||||
obj->floorBorder = TrapDoorFloorBorder;
|
||||
obj->ceilingBorder = TrapDoorCeilingBorder;
|
||||
obj->floor = TrapDoorFloor;
|
||||
obj->ceiling = TrapDoorCeiling;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
@ -26,6 +30,10 @@ static void StartObject()
|
|||
obj->initialise = InitialiseTrapDoor;
|
||||
obj->collision = TrapDoorCollision;
|
||||
obj->control = TrapDoorControl;
|
||||
obj->floorBorder = TrapDoorFloorBorder;
|
||||
obj->ceilingBorder = TrapDoorCeilingBorder;
|
||||
obj->floor = TrapDoorFloor;
|
||||
obj->ceiling = TrapDoorCeiling;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
@ -36,6 +44,10 @@ static void StartObject()
|
|||
obj->initialise = InitialiseTrapDoor;
|
||||
obj->collision = TrapDoorCollision;
|
||||
obj->control = TrapDoorControl;
|
||||
obj->floorBorder = TrapDoorFloorBorder;
|
||||
obj->ceilingBorder = TrapDoorCeilingBorder;
|
||||
obj->floor = TrapDoorFloor;
|
||||
obj->ceiling = TrapDoorCeiling;
|
||||
obj->saveAnim = true;
|
||||
obj->saveFlags = true;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue