From 731275613a38e4554ae49a17d789156ec030d932 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Tue, 30 Jan 2024 01:34:00 +0100 Subject: [PATCH] Create flag to allow building track segment partly underground --- src/openrct2/actions/TrackPlaceAction.cpp | 22 ++++++++++++++-------- src/openrct2/ride/Track.h | 1 + src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index 5a63658df6..8001ac381e 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -265,11 +265,14 @@ GameActions::Result TrackPlaceAction::Query() const const auto clearanceData = canBuild.GetData(); uint8_t mapGroundFlags = clearanceData.GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); - if (resultData.GroundFlags != 0 && (resultData.GroundFlags & mapGroundFlags) == 0) + if (!(ted.Flags & TRACK_ELEM_FLAG_CAN_BE_PARTLY_UNDERGROUND)) { - return GameActions::Result( - GameActions::Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, - STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND); + if (resultData.GroundFlags != 0 && (resultData.GroundFlags & mapGroundFlags) == 0) + { + return GameActions::Result( + GameActions::Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, + STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND); + } } resultData.GroundFlags = mapGroundFlags; @@ -508,11 +511,14 @@ GameActions::Result TrackPlaceAction::Execute() const const auto clearanceData = canBuild.GetData(); uint8_t mapGroundFlags = clearanceData.GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); - if (resultData.GroundFlags != 0 && (resultData.GroundFlags & mapGroundFlags) == 0) + if (!(ted.Flags & TRACK_ELEM_FLAG_CAN_BE_PARTLY_UNDERGROUND)) { - return GameActions::Result( - GameActions::Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, - STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND); + if (resultData.GroundFlags != 0 && (resultData.GroundFlags & mapGroundFlags) == 0) + { + return GameActions::Result( + GameActions::Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, + STR_CANT_BUILD_PARTLY_ABOVE_AND_PARTLY_BELOW_GROUND); + } } resultData.GroundFlags = mapGroundFlags; diff --git a/src/openrct2/ride/Track.h b/src/openrct2/ride/Track.h index 3020e6e258..4a7b9bc6a5 100644 --- a/src/openrct2/ride/Track.h +++ b/src/openrct2/ride/Track.h @@ -259,6 +259,7 @@ enum TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT = (1 << 13), TRACK_ELEM_FLAG_INVERSION_TO_NORMAL = (1 << 14), TRACK_ELEM_FLAG_BANKED = (1 << 15), // Also set on Spinning Tunnel and Log Flume reverser, probably to save a flag. + TRACK_ELEM_FLAG_CAN_BE_PARTLY_UNDERGROUND = (1 << 16), }; namespace TrackElemType diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index cd0bc5c00b..26ce6305d4 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -5956,7 +5956,7 @@ static constexpr uint8_t TrackSequenceElementAllowedWallEdges[][MaxSequencesPerP static_assert(std::size(TrackSequenceElementAllowedWallEdges) == TrackElemType::Count); /** rct2: 0x0099423C */ -static constexpr uint16_t TrackFlags[] = { +static constexpr uint32_t TrackFlags[] = { /* TrackElemType::Flat */ TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, /* TrackElemType::EndStation */ 0, /* TrackElemType::BeginStation */ 0, diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index e9e796cd90..a4f432a8d5 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -87,7 +87,7 @@ struct TrackElementDescriptor uint32_t PriceModifier; track_type_t MirrorElement; uint32_t HeightMarkerPositions; - uint16_t Flags; + uint32_t Flags; std::array SequenceElementAllowedWallEdges; std::array SequenceProperties;