From d878cd1c9e11e3b4590c40ba57b7b200f233e599 Mon Sep 17 00:00:00 2001 From: wolfcheese Date: Wed, 16 Jun 2021 10:19:46 -0400 Subject: [PATCH] Added bridge collision to FALLING_BLOCK --- TR5Main/Game/traps.cpp | 70 ++++++++++++++++++++++++++++---------- TR5Main/Game/traps.h | 6 ++-- TR5Main/Specific/setup.cpp | 12 ++++--- 3 files changed, 64 insertions(+), 24 deletions(-) diff --git a/TR5Main/Game/traps.cpp b/TR5Main/Game/traps.cpp index 450ec9a7c..884abefbb 100644 --- a/TR5Main/Game/traps.cpp +++ b/TR5Main/Game/traps.cpp @@ -307,6 +307,7 @@ void LavaBurn(ITEM_INFO* item) void InitialiseFallingBlock(short itemNumber) { g_Level.Items[itemNumber].meshBits = 1; + T5M::Floordata::AddBridge(itemNumber); } void FallingBlockCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll) @@ -367,28 +368,61 @@ void FallingBlockControl(short itemNumber) } } -void FallingBlockFloor(ITEM_INFO* item, int x, int y, int z, int* height) +//void FallingBlockFloor(ITEM_INFO* item, int x, int y, int z, int* height) +//{ +// if (!((x ^ item->pos.xPos) & 0xFFFFFC00) && !((z ^ item->pos.zPos) & 0xFFFFFC00)) +// { +// if (y <= item->pos.yPos) +// { +// *height = item->pos.yPos; +// HeightType = WALL; +// OnFloor = 1; +// } +// } +//} +// +//void FallingBlockCeiling(ITEM_INFO* item, int x, int y, int z, int* height) +//{ +// if (!((x ^ item->pos.xPos) & 0xFFFFFC00) && !((z ^ item->pos.zPos) & 0xFFFFFC00)) +// { +// if (y > item->pos.yPos) +// { +// *height = item->pos.yPos + 256; +// } +// } +//} + +std::optional FallingBlockFloor(short itemNumber, int x, int y, int z) { - if (!((x ^ item->pos.xPos) & 0xFFFFFC00) && !((z ^ item->pos.zPos) & 0xFFFFFC00)) - { - if (y <= item->pos.yPos) - { - *height = item->pos.yPos; - HeightType = WALL; - OnFloor = 1; - } - } + ITEM_INFO* item = &g_Level.Items[itemNumber]; + if (!item->meshBits || item->itemFlags[0] >= 52) + return std::nullopt; + + int height = item->pos.yPos; + return std::optional{ height }; } -void FallingBlockCeiling(ITEM_INFO* item, int x, int y, int z, int* height) +std::optional FallingBlockCeiling(short itemNumber, int x, int y, int z) { - if (!((x ^ item->pos.xPos) & 0xFFFFFC00) && !((z ^ item->pos.zPos) & 0xFFFFFC00)) - { - if (y > item->pos.yPos) - { - *height = item->pos.yPos + 256; - } - } + ITEM_INFO* item = &g_Level.Items[itemNumber]; + + if (!item->meshBits || item->itemFlags[0] >= 52) + return std::nullopt; + + int height = item->pos.yPos + 256; + return std::optional{ height }; +} + +int FallingBlockFloorBorder(short itemNumber) +{ + ITEM_INFO* item = &g_Level.Items[itemNumber]; + return item->pos.yPos; +} + +int FallingBlockCeilingBorder(short itemNumber) +{ + ITEM_INFO* item = &g_Level.Items[itemNumber]; + return (item->pos.yPos + 256); } void InitialiseWreckingBall(short itemNumber) diff --git a/TR5Main/Game/traps.h b/TR5Main/Game/traps.h index 338dde8e7..97a1a2ea8 100644 --- a/TR5Main/Game/traps.h +++ b/TR5Main/Game/traps.h @@ -13,8 +13,10 @@ void FlameEmitterControl(short itemNumber); void InitialiseFallingBlock(short itemNumber); void FallingBlockCollision(short itemNum, ITEM_INFO* l, COLL_INFO* coll); void FallingBlockControl(short itemNumber); -void FallingBlockFloor(ITEM_INFO* item, int x, int y, int z, int* height); -void FallingBlockCeiling(ITEM_INFO* item, int x, int y, int z, int* height); +std::optional FallingBlockFloor(short itemNumber, int x, int y, int z); +std::optional FallingBlockCeiling(short itemNumber, int x, int y, int z); +int FallingBlockFloorBorder(short itemNumber); +int FallingBlockCeilingBorder(short itemNumber); void InitialiseWreckingBall(short itemNumber); void WreckingBallCollision(short itemNumber, ITEM_INFO* l, COLL_INFO* coll); void WreckingBallControl(short itemNumber); diff --git a/TR5Main/Specific/setup.cpp b/TR5Main/Specific/setup.cpp index dc930b082..081e0390b 100644 --- a/TR5Main/Specific/setup.cpp +++ b/TR5Main/Specific/setup.cpp @@ -492,8 +492,10 @@ void TrapObjects() obj->initialise = InitialiseFallingBlock; obj->collision = FallingBlockCollision; obj->control = FallingBlockControl; - //obj->floor = FallingBlockFloor; - //obj->ceiling = FallingBlockCeiling; + obj->floor = FallingBlockFloor; + obj->ceiling = FallingBlockCeiling; + obj->floorBorder = FallingBlockFloorBorder; + obj->ceilingBorder = FallingBlockCeilingBorder; obj->saveFlags = true; obj->savePosition = true; } @@ -504,8 +506,10 @@ void TrapObjects() obj->initialise = InitialiseFallingBlock; obj->collision = FallingBlockCollision; obj->control = FallingBlockControl; - //obj->floor = FallingBlockFloor; - //obj->ceiling = FallingBlockCeiling; + obj->floor = FallingBlockFloor; + obj->ceiling = FallingBlockCeiling; + obj->floorBorder = FallingBlockFloorBorder; + obj->ceilingBorder = FallingBlockCeilingBorder; obj->saveFlags = true; obj->savePosition = true; }