From e97b93e4717263f99e41357f7a96b8391ee3d529 Mon Sep 17 00:00:00 2001 From: wolfcheese Date: Sat, 12 Jun 2021 16:39:13 -0400 Subject: [PATCH] Cleaned up code for generic trapdoors --- .../Generic/Object/generic_trapdoor.cpp | 81 +++---------------- .../Objects/Generic/Object/generic_trapdoor.h | 4 +- TR5Main/Objects/Generic/generic_objects.cpp | 12 +++ 3 files changed, 26 insertions(+), 71 deletions(-) diff --git a/TR5Main/Objects/Generic/Object/generic_trapdoor.cpp b/TR5Main/Objects/Generic/Object/generic_trapdoor.cpp index 9a384fb8e..9cd120941 100644 --- a/TR5Main/Objects/Generic/Object/generic_trapdoor.cpp +++ b/TR5Main/Objects/Generic/Object/generic_trapdoor.cpp @@ -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 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 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 }; } \ No newline at end of file diff --git a/TR5Main/Objects/Generic/Object/generic_trapdoor.h b/TR5Main/Objects/Generic/Object/generic_trapdoor.h index 58de9a861..f236042cc 100644 --- a/TR5Main/Objects/Generic/Object/generic_trapdoor.h +++ b/TR5Main/Objects/Generic/Object/generic_trapdoor.h @@ -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 TrapDoorFloor(short itemNumber, int x, int y, int z); diff --git a/TR5Main/Objects/Generic/generic_objects.cpp b/TR5Main/Objects/Generic/generic_objects.cpp index 247369dd2..9e873139a 100644 --- a/TR5Main/Objects/Generic/generic_objects.cpp +++ b/TR5Main/Objects/Generic/generic_objects.cpp @@ -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; }