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

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

View file

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