mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-11 04:56:49 +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_INFO* item;
|
||||||
|
|
||||||
item = &g_Level.Items[itemNumber];
|
item = &g_Level.Items[itemNumber];
|
||||||
auto obj = &Objects[item->objectNumber];
|
T5M::Floordata::AddBridge(itemNumber);
|
||||||
obj->floorBorder = TrapDoorFloorBorder;
|
CloseTrapDoor(itemNumber);
|
||||||
obj->ceilingBorder = TrapDoorCeilingBorder;
|
|
||||||
obj->floor = TrapDoorFloor;
|
|
||||||
obj->ceiling = TrapDoorCeiling;
|
|
||||||
CloseTrapDoor(itemNumber, item);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll)
|
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))
|
if (item->currentAnimState == 1 && (item->itemFlags[2] || JustLoaded))
|
||||||
{
|
{
|
||||||
OpenTrapDoor(itemNumber, item);
|
OpenTrapDoor(itemNumber);
|
||||||
}
|
}
|
||||||
else if (!item->currentAnimState && !item->itemFlags[2])
|
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;
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||||
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->itemFlags[2] = 1;
|
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;
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||||
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->itemFlags[2] = 0;
|
item->itemFlags[2] = 0;
|
||||||
T5M::Floordata::RemoveBridge(itemNumber);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int TrapDoorFloorBorder(short itemNumber)
|
int TrapDoorFloorBorder(short itemNumber)
|
||||||
|
@ -234,14 +179,13 @@ int TrapDoorFloorBorder(short itemNumber)
|
||||||
int TrapDoorCeilingBorder(short itemNumber)
|
int TrapDoorCeilingBorder(short itemNumber)
|
||||||
{
|
{
|
||||||
ITEM_INFO* item = &g_Level.Items[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)
|
std::optional<int> TrapDoorFloor(short itemNumber, int x, int y, int z)
|
||||||
{
|
{
|
||||||
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||||
|
if (!item->meshBits || item->itemFlags[2] == 0)
|
||||||
if (!item->meshBits)
|
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
|
|
||||||
int height = item->pos.yPos;
|
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];
|
ITEM_INFO* item = &g_Level.Items[itemNumber];
|
||||||
|
|
||||||
if (!item->meshBits)
|
if (!item->meshBits || item->itemFlags[2] == 0)
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
|
|
||||||
//+ 256 is more accurate, but prevents a tall block from entering underneath
|
int height = item->pos.yPos + 128;
|
||||||
int height = item->pos.yPos + 20;
|
|
||||||
return std::optional{ height };
|
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 CeilingTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll);
|
||||||
void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll);
|
void FloorTrapDoorCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll);
|
||||||
void TrapDoorControl(short itemNumber);
|
void TrapDoorControl(short itemNumber);
|
||||||
void CloseTrapDoor(short itemNumber, ITEM_INFO* item);
|
void CloseTrapDoor(short itemNumber);
|
||||||
void OpenTrapDoor(short itemNumber, ITEM_INFO* item);
|
void OpenTrapDoor(short itemNumber);
|
||||||
int TrapDoorFloorBorder(short itemNumber);
|
int TrapDoorFloorBorder(short itemNumber);
|
||||||
int TrapDoorCeilingBorder(short itemNumber);
|
int TrapDoorCeilingBorder(short itemNumber);
|
||||||
std::optional<int> TrapDoorFloor(short itemNumber, int x, int y, int z);
|
std::optional<int> TrapDoorFloor(short itemNumber, int x, int y, int z);
|
||||||
|
|
|
@ -16,6 +16,10 @@ static void StartObject()
|
||||||
obj->initialise = InitialiseTrapDoor;
|
obj->initialise = InitialiseTrapDoor;
|
||||||
obj->collision = TrapDoorCollision;
|
obj->collision = TrapDoorCollision;
|
||||||
obj->control = TrapDoorControl;
|
obj->control = TrapDoorControl;
|
||||||
|
obj->floorBorder = TrapDoorFloorBorder;
|
||||||
|
obj->ceilingBorder = TrapDoorCeilingBorder;
|
||||||
|
obj->floor = TrapDoorFloor;
|
||||||
|
obj->ceiling = TrapDoorCeiling;
|
||||||
obj->saveAnim = true;
|
obj->saveAnim = true;
|
||||||
obj->saveFlags = true;
|
obj->saveFlags = true;
|
||||||
}
|
}
|
||||||
|
@ -26,6 +30,10 @@ static void StartObject()
|
||||||
obj->initialise = InitialiseTrapDoor;
|
obj->initialise = InitialiseTrapDoor;
|
||||||
obj->collision = TrapDoorCollision;
|
obj->collision = TrapDoorCollision;
|
||||||
obj->control = TrapDoorControl;
|
obj->control = TrapDoorControl;
|
||||||
|
obj->floorBorder = TrapDoorFloorBorder;
|
||||||
|
obj->ceilingBorder = TrapDoorCeilingBorder;
|
||||||
|
obj->floor = TrapDoorFloor;
|
||||||
|
obj->ceiling = TrapDoorCeiling;
|
||||||
obj->saveAnim = true;
|
obj->saveAnim = true;
|
||||||
obj->saveFlags = true;
|
obj->saveFlags = true;
|
||||||
}
|
}
|
||||||
|
@ -36,6 +44,10 @@ static void StartObject()
|
||||||
obj->initialise = InitialiseTrapDoor;
|
obj->initialise = InitialiseTrapDoor;
|
||||||
obj->collision = TrapDoorCollision;
|
obj->collision = TrapDoorCollision;
|
||||||
obj->control = TrapDoorControl;
|
obj->control = TrapDoorControl;
|
||||||
|
obj->floorBorder = TrapDoorFloorBorder;
|
||||||
|
obj->ceilingBorder = TrapDoorCeilingBorder;
|
||||||
|
obj->floor = TrapDoorFloor;
|
||||||
|
obj->ceiling = TrapDoorCeiling;
|
||||||
obj->saveAnim = true;
|
obj->saveAnim = true;
|
||||||
obj->saveFlags = true;
|
obj->saveFlags = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue