diff --git a/src/openrct2/actions/FootpathLayoutPlaceAction.cpp b/src/openrct2/actions/FootpathLayoutPlaceAction.cpp index 0b6aa37e9c..7fe146995d 100644 --- a/src/openrct2/actions/FootpathLayoutPlaceAction.cpp +++ b/src/openrct2/actions/FootpathLayoutPlaceAction.cpp @@ -155,7 +155,7 @@ namespace OpenRCT2::GameActions auto crossingMode = isQueue || (_slope.type != FootpathSlopeType::flat) ? CreateCrossingMode::none : CreateCrossingMode::pathOverTrack; auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, crossingMode); + { _loc, zLow, zHigh }, MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, crossingMode); if (!entrancePath && canBuild.Error != Status::Ok) { canBuild.ErrorTitle = STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE; @@ -224,7 +224,7 @@ namespace OpenRCT2::GameActions auto crossingMode = isQueue || (_slope.type != FootpathSlopeType::flat) ? CreateCrossingMode::none : CreateCrossingMode::pathOverTrack; auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceNonSceneryClearFunc, quarterTile, GAME_COMMAND_FLAG_APPLY | GetFlags(), + { _loc, zLow, zHigh }, MapPlaceNonSceneryClearFunc, quarterTile, GAME_COMMAND_FLAG_APPLY | GetFlags(), kTileSlopeFlat, crossingMode); if (!entrancePath && canBuild.Error != Status::Ok) { diff --git a/src/openrct2/actions/FootpathPlaceAction.cpp b/src/openrct2/actions/FootpathPlaceAction.cpp index 6883a092c8..904d66e36f 100644 --- a/src/openrct2/actions/FootpathPlaceAction.cpp +++ b/src/openrct2/actions/FootpathPlaceAction.cpp @@ -320,7 +320,7 @@ namespace OpenRCT2::GameActions auto crossingMode = isQueue || (_slope.type != FootpathSlopeType::flat) ? CreateCrossingMode::none : CreateCrossingMode::pathOverTrack; auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, crossingMode); + { _loc, zLow, zHigh }, MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, crossingMode); if (!entrancePath && canBuild.Error != Status::Ok) { canBuild.ErrorTitle = STR_CANT_BUILD_FOOTPATH_HERE; @@ -388,7 +388,7 @@ namespace OpenRCT2::GameActions auto crossingMode = isQueue || (_slope.type != FootpathSlopeType::flat) ? CreateCrossingMode::none : CreateCrossingMode::pathOverTrack; auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceNonSceneryClearFunc, quarterTile, GAME_COMMAND_FLAG_APPLY | GetFlags(), + { _loc, zLow, zHigh }, MapPlaceNonSceneryClearFunc, quarterTile, GAME_COMMAND_FLAG_APPLY | GetFlags(), kTileSlopeFlat, crossingMode); if (!entrancePath && canBuild.Error != Status::Ok) { diff --git a/src/openrct2/actions/LandSetHeightAction.cpp b/src/openrct2/actions/LandSetHeightAction.cpp index 2321b64a0a..116e40e251 100644 --- a/src/openrct2/actions/LandSetHeightAction.cpp +++ b/src/openrct2/actions/LandSetHeightAction.cpp @@ -140,7 +140,7 @@ namespace OpenRCT2::GameActions } auto clearResult = MapCanConstructWithClearAt( - { _coords, _height * kCoordsZStep, zCorner * kCoordsZStep }, &MapSetLandHeightClearFunc, { 0b1111, 0 }, 0, + { _coords, _height * kCoordsZStep, zCorner * kCoordsZStep }, MapSetLandHeightClearFunc, { 0b1111, 0 }, 0, _style, CreateCrossingMode::none); if (clearResult.Error != Status::Ok) { @@ -347,16 +347,16 @@ namespace OpenRCT2::GameActions MapInvalidateTileFull(_coords); } - int32_t LandSetHeightAction::MapSetLandHeightClearFunc( + bool LandSetHeightAction::MapSetLandHeightClearFunc( TileElement** tile_element, [[maybe_unused]] const CoordsXY& coords, [[maybe_unused]] uint8_t flags, [[maybe_unused]] money64* price) { if ((*tile_element)->GetType() == TileElementType::Surface) - return 0; + return true; if ((*tile_element)->GetType() == TileElementType::SmallScenery) - return 0; + return true; - return 1; + return false; } } // namespace OpenRCT2::GameActions diff --git a/src/openrct2/actions/LandSetHeightAction.h b/src/openrct2/actions/LandSetHeightAction.h index 191d56ec4e..1739d08eb7 100644 --- a/src/openrct2/actions/LandSetHeightAction.h +++ b/src/openrct2/actions/LandSetHeightAction.h @@ -46,7 +46,7 @@ namespace OpenRCT2::GameActions * * rct2: 0x00663CB9 */ - static int32_t MapSetLandHeightClearFunc( + static bool MapSetLandHeightClearFunc( TileElement** tile_element, [[maybe_unused]] const CoordsXY& coords, [[maybe_unused]] uint8_t flags, [[maybe_unused]] money64* price); }; diff --git a/src/openrct2/actions/LargeSceneryPlaceAction.cpp b/src/openrct2/actions/LargeSceneryPlaceAction.cpp index 96ea7bf184..5e3dbd6d53 100644 --- a/src/openrct2/actions/LargeSceneryPlaceAction.cpp +++ b/src/openrct2/actions/LargeSceneryPlaceAction.cpp @@ -138,7 +138,7 @@ namespace OpenRCT2::GameActions QuarterTile quarterTile = QuarterTile{ tile.corners, 0 }.Rotate(_loc.direction); const auto isTree = (sceneryEntry->flags & LARGE_SCENERY_FLAG_IS_TREE) != 0; auto canBuild = MapCanConstructWithClearAt( - { curTile, zLow, zHigh }, &MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, + { curTile, zLow, zHigh }, MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, CreateCrossingMode::none, isTree); if (canBuild.Error != Status::Ok) { @@ -270,7 +270,7 @@ namespace OpenRCT2::GameActions QuarterTile quarterTile = QuarterTile{ tile.corners, 0 }.Rotate(_loc.direction); const auto isTree = (sceneryEntry->flags & LARGE_SCENERY_FLAG_IS_TREE) != 0; auto canBuild = MapCanConstructWithClearAt( - { curTile, zLow, zHigh }, &MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, + { curTile, zLow, zHigh }, MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, CreateCrossingMode::none, isTree); if (canBuild.Error != Status::Ok) { diff --git a/src/openrct2/actions/MazePlaceTrackAction.cpp b/src/openrct2/actions/MazePlaceTrackAction.cpp index 54bc77b0c5..10807a31c9 100644 --- a/src/openrct2/actions/MazePlaceTrackAction.cpp +++ b/src/openrct2/actions/MazePlaceTrackAction.cpp @@ -107,7 +107,7 @@ namespace OpenRCT2::GameActions } auto canBuild = MapCanConstructWithClearAt( - { _loc.ToTileStart(), baseHeight, clearanceHeight }, &MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags(), + { _loc.ToTileStart(), baseHeight, clearanceHeight }, MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags(), kTileSlopeFlat); if (canBuild.Error != Status::Ok) { @@ -172,7 +172,7 @@ namespace OpenRCT2::GameActions auto clearanceHeight = _loc.z + kMazeClearanceHeight; auto canBuild = MapCanConstructWithClearAt( - { _loc.ToTileStart(), baseHeight, clearanceHeight }, &MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, + { _loc.ToTileStart(), baseHeight, clearanceHeight }, MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags() | GAME_COMMAND_FLAG_APPLY, kTileSlopeFlat); if (canBuild.Error != Status::Ok) { diff --git a/src/openrct2/actions/RideEntranceExitPlaceAction.cpp b/src/openrct2/actions/RideEntranceExitPlaceAction.cpp index 90acdf34bf..38a66c0140 100644 --- a/src/openrct2/actions/RideEntranceExitPlaceAction.cpp +++ b/src/openrct2/actions/RideEntranceExitPlaceAction.cpp @@ -116,7 +116,7 @@ namespace OpenRCT2::GameActions } auto clear_z = z + (_isExit ? RideExitHeight : RideEntranceHeight); auto canBuild = MapCanConstructWithClearAt( - { _loc, z, clear_z }, &MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags(), kTileSlopeFlat); + { _loc, z, clear_z }, MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags(), kTileSlopeFlat); if (canBuild.Error != Status::Ok) { canBuild.ErrorTitle = errorTitle; @@ -186,7 +186,7 @@ namespace OpenRCT2::GameActions auto clear_z = z + (_isExit ? RideExitHeight : RideEntranceHeight); auto canBuild = MapCanConstructWithClearAt( - { _loc, z, clear_z }, &MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags() | GAME_COMMAND_FLAG_APPLY, + { _loc, z, clear_z }, MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, GetFlags() | GAME_COMMAND_FLAG_APPLY, kTileSlopeFlat); if (canBuild.Error != Status::Ok) { @@ -254,7 +254,7 @@ namespace OpenRCT2::GameActions int16_t baseZ = loc.z; int16_t clearZ = baseZ + (isExit ? RideExitHeight : RideEntranceHeight); auto canBuild = MapCanConstructWithClearAt( - { loc, baseZ, clearZ }, &MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, 0, kTileSlopeFlat); + { loc, baseZ, clearZ }, MapPlaceNonSceneryClearFunc, { 0b1111, 0 }, 0, kTileSlopeFlat); if (canBuild.Error != Status::Ok) { canBuild.ErrorTitle = errorTitle; diff --git a/src/openrct2/actions/SmallSceneryPlaceAction.cpp b/src/openrct2/actions/SmallSceneryPlaceAction.cpp index 42d65af5ae..9b2eaa9a84 100644 --- a/src/openrct2/actions/SmallSceneryPlaceAction.cpp +++ b/src/openrct2/actions/SmallSceneryPlaceAction.cpp @@ -267,7 +267,7 @@ namespace OpenRCT2::GameActions QuarterTile quarterTile = QuarterTile{ collisionQuadrants, supports }.Rotate(quadRotation); const auto isTree = sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_IS_TREE); auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, CreateCrossingMode::none, + { _loc, zLow, zHigh }, MapPlaceSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, CreateCrossingMode::none, isTree); if (canBuild.Error != Status::Ok) { @@ -406,7 +406,7 @@ namespace OpenRCT2::GameActions QuarterTile quarterTile = QuarterTile{ collisionQuadrants, supports }.Rotate(quadRotation); const auto isTree = sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_IS_TREE); auto canBuild = MapCanConstructWithClearAt( - { _loc, zLow, zHigh }, &MapPlaceSceneryClearFunc, quarterTile, GetFlags() | GAME_COMMAND_FLAG_APPLY, kTileSlopeFlat, + { _loc, zLow, zHigh }, MapPlaceSceneryClearFunc, quarterTile, GetFlags() | GAME_COMMAND_FLAG_APPLY, kTileSlopeFlat, CreateCrossingMode::none, isTree); if (canBuild.Error != Status::Ok) { diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index fb7af29227..0578389992 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -263,7 +263,7 @@ namespace OpenRCT2::GameActions ? CreateCrossingMode::trackOverPath : CreateCrossingMode::none; auto canBuild = MapCanConstructWithClearAt( - { mapLoc, baseZ, clearanceZ }, &MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, + { mapLoc, baseZ, clearanceZ }, MapPlaceNonSceneryClearFunc, quarterTile, GetFlags(), kTileSlopeFlat, crossingMode); if (canBuild.Error != Status::Ok) { @@ -468,7 +468,7 @@ namespace OpenRCT2::GameActions ? CreateCrossingMode::trackOverPath : CreateCrossingMode::none; auto canBuild = MapCanConstructWithClearAt( - mapLocWithClearance, &MapPlaceNonSceneryClearFunc, quarterTile, GetFlags() | GAME_COMMAND_FLAG_APPLY, + mapLocWithClearance, MapPlaceNonSceneryClearFunc, quarterTile, GetFlags() | GAME_COMMAND_FLAG_APPLY, kTileSlopeFlat, crossingMode); if (canBuild.Error != Status::Ok) { diff --git a/src/openrct2/world/ConstructionClearance.cpp b/src/openrct2/world/ConstructionClearance.cpp index bafe549d3f..1a9550a8c4 100644 --- a/src/openrct2/world/ConstructionClearance.cpp +++ b/src/openrct2/world/ConstructionClearance.cpp @@ -35,14 +35,14 @@ using namespace OpenRCT2; -static int32_t MapPlaceClearFunc( +static bool MapPlaceClearFunc( TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price, bool is_scenery) { if ((*tile_element)->GetType() != TileElementType::SmallScenery) - return 1; + return false; if (is_scenery && !(flags & GAME_COMMAND_FLAG_TRACK_DESIGN)) - return 1; + return false; auto* scenery = (*tile_element)->AsSmallScenery()->GetEntry(); @@ -50,31 +50,31 @@ static int32_t MapPlaceClearFunc( if (park.flags & PARK_FLAGS_FORBID_TREE_REMOVAL) { if (scenery != nullptr && scenery->HasFlag(SMALL_SCENERY_FLAG_IS_TREE)) - return 1; + return false; } if (!(park.flags & PARK_FLAGS_NO_MONEY) && scenery != nullptr) *price += scenery->removal_price; if (flags & GAME_COMMAND_FLAG_GHOST) - return 0; + return true; if (!(flags & GAME_COMMAND_FLAG_APPLY)) - return 0; + return true; MapInvalidateTile({ coords, (*tile_element)->GetBaseZ(), (*tile_element)->GetClearanceZ() }); TileElementRemove(*tile_element); (*tile_element)--; - return 0; + return true; } /** * * rct2: 0x006E0D6E, 0x006B8D88 */ -int32_t MapPlaceSceneryClearFunc(TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price) +bool MapPlaceSceneryClearFunc(TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price) { return MapPlaceClearFunc(tile_element, coords, flags, price, /*is_scenery=*/true); } @@ -83,42 +83,58 @@ int32_t MapPlaceSceneryClearFunc(TileElement** tile_element, const CoordsXY& coo * * rct2: 0x006C5A4F, 0x006CDE57, 0x006A6733, 0x0066637E */ -int32_t MapPlaceNonSceneryClearFunc(TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price) +bool MapPlaceNonSceneryClearFunc(TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price) { return MapPlaceClearFunc(tile_element, coords, flags, price, /*is_scenery=*/false); } +static bool landSlopeFitsUnderTrack(int32_t baseZ, uint8_t slope, const TrackElement& trackElement) +{ + const auto [slopeNorthZ, slopeEastZ, slopeSouthZ, slopeWestZ] = GetSlopeCornerHeights(baseZ, slope); + + const TrackElemType trackElemType = trackElement.GetTrackType(); + const auto& ted = OpenRCT2::TrackMetaData::GetTrackElementDescriptor(trackElemType); + const uint8_t sequenceIndex = trackElemType == TrackElemType::Maze ? 0 : trackElement.GetSequenceIndex(); + const auto& trackClearances = ted.sequences[sequenceIndex].clearance; + const auto trackQuarters = trackClearances.quarterTile.Rotate(trackElement.GetDirection()); + const auto trackQuarterHeights = trackQuarters.GetQuarterHeights(trackElement.GetBaseZ()); + const uint8_t trackOccupiedQuarters = trackQuarters.GetBaseQuarterOccupied(); + + if ((!(trackOccupiedQuarters & 0b0001) || slopeNorthZ <= trackQuarterHeights.north) + && (!(trackOccupiedQuarters & 0b0010) || slopeEastZ <= trackQuarterHeights.east) + && (!(trackOccupiedQuarters & 0b0100) || slopeSouthZ <= trackQuarterHeights.south) + && (!(trackOccupiedQuarters & 0b1000) || slopeWestZ <= trackQuarterHeights.west)) + { + return true; + } + + return false; +} + +static bool landSlopeFitsUnderPath(int32_t baseZ, uint8_t slope, const PathElement& pathElement) +{ + const auto slopeCornerHeights = GetSlopeCornerHeights(baseZ, slope); + + const uint8_t pathSlope = Numerics::rol4(kTileSlopeSWSideUp, pathElement.GetSlopeDirection()); + const auto pathCornerHeights = GetSlopeCornerHeights(pathElement.GetBaseZ(), pathSlope); + + return (slopeCornerHeights <= pathCornerHeights); +} + static bool MapLoc68BABCShouldContinue( - TileElement** tileElementPtr, const CoordsXYRangedZ& pos, CLEAR_FUNC clearFunc, const uint8_t flags, money64& price, + TileElement** tileElementPtr, const CoordsXYRangedZ& pos, ClearingFunction clearFunc, const uint8_t flags, money64& price, const CreateCrossingMode crossingMode, const bool canBuildCrossing, const uint8_t slope) { - if (clearFunc != nullptr) + if (clearFunc(tileElementPtr, pos, flags, &price)) { - if (!clearFunc(tileElementPtr, pos, flags, &price)) - { - return true; - } + return true; } const TileElement* const tileElement = *tileElementPtr; if (slope != kTileSlopeFlat && tileElement->GetType() == TileElementType::Track) { - const auto [slopeNorthZ, slopeEastZ, slopeSouthZ, slopeWestZ] = GetSlopeCornerHeights(pos.baseZ, slope); - - const TrackElement* const trackElement = tileElement->AsTrack(); - const TrackElemType trackElemType = trackElement->GetTrackType(); - const auto& ted = OpenRCT2::TrackMetaData::GetTrackElementDescriptor(trackElemType); - const uint8_t sequenceIndex = trackElemType == TrackElemType::Maze ? 0 : trackElement->GetSequenceIndex(); - const auto& trackClearances = ted.sequences[sequenceIndex].clearance; - const auto trackQuarters = trackClearances.quarterTile.Rotate(trackElement->GetDirection()); - const auto trackQuarterHeights = trackQuarters.GetQuarterHeights(trackElement->GetBaseZ()); - const uint8_t trackOccupiedQuarters = trackQuarters.GetBaseQuarterOccupied(); - - if ((!(trackOccupiedQuarters & 0b0001) || slopeNorthZ <= trackQuarterHeights.north) - && (!(trackOccupiedQuarters & 0b0010) || slopeEastZ <= trackQuarterHeights.east) - && (!(trackOccupiedQuarters & 0b0100) || slopeSouthZ <= trackQuarterHeights.south) - && (!(trackOccupiedQuarters & 0b1000) || slopeWestZ <= trackQuarterHeights.west)) + if (landSlopeFitsUnderTrack(pos.baseZ, slope, *tileElement->AsTrack())) { return true; } @@ -126,13 +142,7 @@ static bool MapLoc68BABCShouldContinue( if (slope != kTileSlopeFlat && tileElement->GetType() == TileElementType::Path && tileElement->AsPath()->IsSloped()) { - const auto slopeCornerHeights = GetSlopeCornerHeights(pos.baseZ, slope); - - const PathElement& pathElement = *tileElement->AsPath(); - const uint8_t pathSlope = Numerics::rol4(kTileSlopeSWSideUp, pathElement.GetSlopeDirection()); - const auto pathCornerHeights = GetSlopeCornerHeights(pathElement.GetBaseZ(), pathSlope); - - if (slopeCornerHeights <= pathCornerHeights) + if (landSlopeFitsUnderPath(pos.baseZ, slope, *tileElement->AsPath())) { return true; } @@ -169,8 +179,8 @@ static bool MapLoc68BABCShouldContinue( * bl = bl */ GameActions::Result MapCanConstructWithClearAt( - const CoordsXYRangedZ& pos, CLEAR_FUNC clearFunc, const QuarterTile quarterTile, const uint8_t flags, const uint8_t slope, - const CreateCrossingMode crossingMode, const bool isTree) + const CoordsXYRangedZ& pos, ClearingFunction clearFunc, const QuarterTile quarterTile, const uint8_t flags, + const uint8_t slope, const CreateCrossingMode crossingMode, const bool isTree) { auto res = GameActions::Result(); @@ -228,7 +238,7 @@ GameActions::Result MapCanConstructWithClearAt( groundFlags |= ELEMENT_IS_UNDERWATER; if (waterHeight < pos.clearanceZ) { - if (clearFunc != nullptr && clearFunc(&tileElement, pos, flags, &res.Cost)) + if (!clearFunc(&tileElement, pos, flags, &res.Cost)) { res.Error = GameActions::Status::NoClearance; res.ErrorMessage = STR_CANNOT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_WATER; @@ -297,9 +307,16 @@ GameActions::Result MapCanConstructWithClearAt( return res; } +static bool dummyClearFunc( + [[maybe_unused]] OpenRCT2::TileElement** tile_element, [[maybe_unused]] const CoordsXY& coords, + [[maybe_unused]] uint8_t flags, [[maybe_unused]] money64* price) +{ + return false; +} + GameActions::Result MapCanConstructAt(const CoordsXYRangedZ& pos, QuarterTile bl) { - return MapCanConstructWithClearAt(pos, nullptr, bl, 0, kTileSlopeFlat); + return MapCanConstructWithClearAt(pos, dummyClearFunc, bl, 0, kTileSlopeFlat); } /** diff --git a/src/openrct2/world/ConstructionClearance.h b/src/openrct2/world/ConstructionClearance.h index 78e907d31a..16accc2d07 100644 --- a/src/openrct2/world/ConstructionClearance.h +++ b/src/openrct2/world/ConstructionClearance.h @@ -23,7 +23,7 @@ struct CoordsXY; struct CoordsXYRangedZ; class QuarterTile; -using CLEAR_FUNC = int32_t (*)(OpenRCT2::TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price); +using ClearingFunction = bool (&)(OpenRCT2::TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price); enum { @@ -42,9 +42,8 @@ enum class CreateCrossingMode pathOverTrack, }; -int32_t MapPlaceNonSceneryClearFunc( - OpenRCT2::TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price); -int32_t MapPlaceSceneryClearFunc(OpenRCT2::TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price); +bool MapPlaceNonSceneryClearFunc(OpenRCT2::TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price); +bool MapPlaceSceneryClearFunc(OpenRCT2::TileElement** tile_element, const CoordsXY& coords, uint8_t flags, money64* price); struct ConstructClearResult { @@ -52,7 +51,7 @@ struct ConstructClearResult }; [[nodiscard]] OpenRCT2::GameActions::Result MapCanConstructWithClearAt( - const CoordsXYRangedZ& pos, CLEAR_FUNC clearFunc, QuarterTile quarterTile, uint8_t flags, uint8_t slope, + const CoordsXYRangedZ& pos, ClearingFunction clearFunc, QuarterTile quarterTile, uint8_t flags, uint8_t slope, CreateCrossingMode crossingMode = CreateCrossingMode::none, bool isTree = false); [[nodiscard]] OpenRCT2::GameActions::Result MapCanConstructAt(const CoordsXYRangedZ& pos, QuarterTile bl);