Cleaned up code for generic trapdoors

This commit is contained in:
wolfcheese 2021-06-12 16:39:13 -04:00
parent 62643f4c64
commit e97b93e471
3 changed files with 26 additions and 71 deletions

View file

@ -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 };
}

View file

@ -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);

View file

@ -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;
}