From 04bdff052fc560e892e14b9ac5523cc1bd9932d0 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek <1478678+Gymnasiast@users.noreply.github.com> Date: Wed, 25 Sep 2024 14:29:39 +0200 Subject: [PATCH] Use FlagHolder for _currentTrackAlternative --- src/openrct2-ui/windows/Ride.cpp | 2 +- src/openrct2-ui/windows/RideConstruction.cpp | 22 +++++++-------- src/openrct2/actions/TrackPlaceAction.cpp | 2 +- src/openrct2/core/FlagHolder.hpp | 2 ++ src/openrct2/ride/RideConstruction.cpp | 28 ++++++++++---------- src/openrct2/ride/RideConstruction.h | 12 +++++++-- src/openrct2/ride/RideData.h | 7 ----- 7 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 242c43d533..3851705d3a 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -2240,7 +2240,7 @@ namespace OpenRCT2::Ui::Windows // Reset ghost track if ride construction window is open, prevents a crash // Will get set to the correct Alternative variable during set_default_next_piece. // TODO: Rework construction window to prevent the need for this. - _currentTrackAlternative = RIDE_TYPE_NO_ALTERNATIVES; + _currentTrackAlternative.clearAll(); RideConstructionSetDefaultNextPiece(); }); GameActions::Execute(&rideSetSetting); diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index e3343108cc..549fc37e22 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -241,10 +241,10 @@ namespace OpenRCT2::Ui::Windows _currentTrackPitchEnd = TrackPitch::None; _currentTrackRollEnd = TrackRoll::None; _currentTrackHasLiftHill = false; - _currentTrackAlternative = RIDE_TYPE_NO_ALTERNATIVES; + _currentTrackAlternative.clearAll(); if (currentRide->GetRideTypeDescriptor().HasFlag(RtdFlag::startConstructionInverted)) - _currentTrackAlternative |= RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; + _currentTrackAlternative.set(AlternativeTrackFlag::inverted); _previousTrackRollEnd = TrackRoll::None; _previousTrackPitchEnd = TrackPitch::None; @@ -1320,7 +1320,7 @@ namespace OpenRCT2::Ui::Windows RideConstructionInvalidateCurrentTrack(); _currentTrackHasLiftHill = !_currentTrackHasLiftHill; if ((_currentTrackHasLiftHill) && !GetGameState().Cheats.EnableChainLiftOnAllTrack) - _currentTrackAlternative &= ~RIDE_TYPE_ALTERNATIVE_TRACK_PIECES; + _currentTrackAlternative.unset(AlternativeTrackFlag::alternativePieces); _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; @@ -1396,13 +1396,13 @@ namespace OpenRCT2::Ui::Windows break; case WIDX_U_TRACK: RideConstructionInvalidateCurrentTrack(); - _currentTrackAlternative &= ~RIDE_TYPE_ALTERNATIVE_TRACK_PIECES; + _currentTrackAlternative.unset(AlternativeTrackFlag::alternativePieces); _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); break; case WIDX_O_TRACK: RideConstructionInvalidateCurrentTrack(); - _currentTrackAlternative |= RIDE_TYPE_ALTERNATIVE_TRACK_PIECES; + _currentTrackAlternative.set(AlternativeTrackFlag::alternativePieces); if (!GetGameState().Cheats.EnableChainLiftOnAllTrack) _currentTrackHasLiftHill = false; _currentTrackPrice = kMoney64Undefined; @@ -2105,7 +2105,7 @@ namespace OpenRCT2::Ui::Windows { if (trackDrawerDescriptor.HasCoveredPieces()) { - if (_currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_PIECES) + if (_currentTrackAlternative.has(AlternativeTrackFlag::alternativePieces)) { pressedWidgets |= (1uLL << WIDX_O_TRACK); } @@ -3660,7 +3660,7 @@ namespace OpenRCT2::Ui::Windows auto saveCurrentTrackPitchEnd = _currentTrackPitchEnd; auto savePreviousTrackRollEnd = _previousTrackRollEnd; auto saveCurrentTrackRollEnd = _currentTrackRollEnd; - int32_t saveCurrentTrackAlternative = _currentTrackAlternative; + auto savedCurrentTrackAlternative = _currentTrackAlternative; auto savedCurrentTrackLiftHill = _currentTrackHasLiftHill; RideInitialiseConstructionWindow(*ride); @@ -3671,7 +3671,7 @@ namespace OpenRCT2::Ui::Windows _currentTrackPitchEnd = saveCurrentTrackPitchEnd; _previousTrackRollEnd = savePreviousTrackRollEnd; _currentTrackRollEnd = saveCurrentTrackRollEnd; - _currentTrackAlternative = saveCurrentTrackAlternative; + _currentTrackAlternative = savedCurrentTrackAlternative; _currentTrackHasLiftHill = savedCurrentTrackLiftHill; OpenRCT2::Audio::Play(OpenRCT2::Audio::SoundId::Error, 0, state->position.x); @@ -4583,7 +4583,7 @@ namespace OpenRCT2::Ui::Windows auto savedCurrentTrackPitchEnd = _currentTrackPitchEnd; auto savedPreviousTrackRollEnd = _previousTrackRollEnd; auto savedCurrentTrackRollEnd = _currentTrackRollEnd; - int32_t savedCurrentTrackAlternative = _currentTrackAlternative; + auto savedCurrentTrackAlternative = _currentTrackAlternative; auto savedCurrentTrackLiftHill = _currentTrackHasLiftHill; RideConstructionSetDefaultNextPiece(); WindowRideConstructionUpdateActiveElements(); @@ -4851,7 +4851,7 @@ namespace OpenRCT2::Ui::Windows liftHillAndInvertedState |= CONSTRUCTION_LIFT_HILL_SELECTED; } - if (_currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_TYPE) + if (_currentTrackAlternative.has(AlternativeTrackFlag::inverted)) { liftHillAndInvertedState |= CONSTRUCTION_INVERTED_TRACK_SELECTED; } @@ -4890,7 +4890,7 @@ namespace OpenRCT2::Ui::Windows const auto& rtd = ride->GetRideTypeDescriptor(); const auto trackDrawerDecriptor = getCurrentTrackDrawerDescriptor(rtd); - if (trackDrawerDecriptor.HasCoveredPieces() && _currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_PIECES) + if (trackDrawerDecriptor.HasCoveredPieces() && _currentTrackAlternative.has(AlternativeTrackFlag::alternativePieces)) { auto availablePieces = trackDrawerDecriptor.Covered.EnabledTrackPieces; const auto& ted = GetTrackElementDescriptor(trackType); diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index 90a77ae0fc..6891ecdf0a 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -619,7 +619,7 @@ GameActions::Result TrackPlaceAction::Execute() const trackElement->SetSeatRotation(_seatRotation); } - if (_trackPlaceFlags & RIDE_TYPE_ALTERNATIVE_TRACK_TYPE) + if (_trackPlaceFlags & CONSTRUCTION_INVERTED_TRACK_SELECTED) { trackElement->SetInverted(true); } diff --git a/src/openrct2/core/FlagHolder.hpp b/src/openrct2/core/FlagHolder.hpp index f235286fea..34ff10afe4 100644 --- a/src/openrct2/core/FlagHolder.hpp +++ b/src/openrct2/core/FlagHolder.hpp @@ -9,6 +9,8 @@ #pragma once +#include "../util/Util.h" + template struct FlagHolder { THolderType holder{}; diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index 06ecf053e9..02ae4a8e55 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -67,7 +67,7 @@ uint32_t _rideConstructionNextArrowPulse = 0; TrackPitch _currentTrackPitchEnd; TrackRoll _currentTrackRollEnd; bool _currentTrackHasLiftHill; -uint8_t _currentTrackAlternative; +OpenRCT2::SelectedAlternative _currentTrackAlternative{}; track_type_t _selectedTrackType; TrackRoll _previousTrackRollEnd; @@ -544,10 +544,10 @@ static void ride_construction_reset_current_piece() _currentTrackPitchEnd = TrackPitch::None; _currentTrackRollEnd = TrackRoll::None; _currentTrackHasLiftHill = false; - _currentTrackAlternative = RIDE_TYPE_NO_ALTERNATIVES; + _currentTrackAlternative.clearAll(); if (rtd.HasFlag(RtdFlag::startConstructionInverted)) { - _currentTrackAlternative |= RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; + _currentTrackAlternative.set(AlternativeTrackFlag::inverted); } _previousTrackPitchEnd = TrackPitch::None; _previousTrackRollEnd = TrackRoll::None; @@ -599,12 +599,12 @@ void RideConstructionSetDefaultNextPiece() } // Set whether track is covered - _currentTrackAlternative &= ~RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; + _currentTrackAlternative.unset(AlternativeTrackFlag::inverted); if (rtd.HasFlag(RtdFlag::hasInvertedVariant)) { if (tileElement->AsTrack()->IsInverted()) { - _currentTrackAlternative |= RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; + _currentTrackAlternative.set(AlternativeTrackFlag::inverted); } } @@ -621,7 +621,7 @@ void RideConstructionSetDefaultNextPiece() if (bank == TrackRoll::UpsideDown) { bank = TrackRoll::None; - _currentTrackAlternative ^= RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; + _currentTrackAlternative.flip(AlternativeTrackFlag::inverted); } } _currentTrackRollEnd = bank; @@ -647,12 +647,12 @@ void RideConstructionSetDefaultNextPiece() trackType = tileElement->AsTrack()->GetTrackType(); // Set whether track is covered - _currentTrackAlternative &= ~RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; + _currentTrackAlternative.unset(AlternativeTrackFlag::inverted); if (rtd.HasFlag(RtdFlag::hasInvertedVariant)) { if (tileElement->AsTrack()->IsInverted()) { - _currentTrackAlternative |= RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; + _currentTrackAlternative.set(AlternativeTrackFlag::inverted); } } @@ -669,7 +669,7 @@ void RideConstructionSetDefaultNextPiece() if (bank == TrackRoll::UpsideDown) { bank = TrackRoll::None; - _currentTrackAlternative ^= RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; + _currentTrackAlternative.flip(AlternativeTrackFlag::inverted); } } _currentTrackRollEnd = bank; @@ -1046,10 +1046,10 @@ int32_t RideInitialiseConstructionWindow(Ride& ride) _currentTrackPitchEnd = TrackPitch::None; _currentTrackRollEnd = TrackRoll::None; _currentTrackHasLiftHill = false; - _currentTrackAlternative = RIDE_TYPE_NO_ALTERNATIVES; + _currentTrackAlternative.clearAll(); if (ride.GetRideTypeDescriptor().HasFlag(RtdFlag::startConstructionInverted)) - _currentTrackAlternative |= RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; + _currentTrackAlternative.set(AlternativeTrackFlag::inverted); _previousTrackRollEnd = TrackRoll::None; _previousTrackPitchEnd = TrackPitch::None; @@ -1463,14 +1463,14 @@ ResultWithMessage RideAreAllPossibleEntrancesAndExitsBuilt(const Ride& ride) TrackDrawerDescriptor getCurrentTrackDrawerDescriptor(const RideTypeDescriptor& rtd) { - const bool isInverted = _currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; + const bool isInverted = _currentTrackAlternative.has(AlternativeTrackFlag::inverted); return getTrackDrawerDescriptor(rtd, isInverted); } TrackDrawerEntry getCurrentTrackDrawerEntry(const RideTypeDescriptor& rtd) { - const bool isInverted = _currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_TYPE; - const bool isCovered = _currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_PIECES; + const bool isInverted = _currentTrackAlternative.has(AlternativeTrackFlag::inverted); + const bool isCovered = _currentTrackAlternative.has(AlternativeTrackFlag::alternativePieces); return getTrackDrawerEntry(rtd, isInverted, isCovered); } diff --git a/src/openrct2/ride/RideConstruction.h b/src/openrct2/ride/RideConstruction.h index e5d329e413..5f52f0d24d 100644 --- a/src/openrct2/ride/RideConstruction.h +++ b/src/openrct2/ride/RideConstruction.h @@ -10,6 +10,7 @@ #pragma once #include "../Identifiers.h" +#include "../core/FlagHolder.hpp" #include "../world/Location.hpp" #include "Station.h" #include "Track.h" @@ -39,7 +40,14 @@ namespace OpenRCT2 MazeMove, MazeFill }; -} + + enum class AlternativeTrackFlag : uint8_t + { + alternativePieces, // Dinghy slide and Water Coaster + inverted, // Flying RC, Lay-down RC, Multi-dimension RC + }; + using SelectedAlternative = FlagHolder; +} // namespace OpenRCT2 extern money64 _currentTrackPrice; @@ -56,7 +64,7 @@ extern uint32_t _rideConstructionNextArrowPulse; extern TrackPitch _currentTrackPitchEnd; extern TrackRoll _currentTrackRollEnd; extern bool _currentTrackHasLiftHill; -extern uint8_t _currentTrackAlternative; +extern OpenRCT2::SelectedAlternative _currentTrackAlternative; extern track_type_t _selectedTrackType; extern TrackRoll _previousTrackRollEnd; diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index 87edbc8161..f0a0e6d01d 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -528,13 +528,6 @@ struct RideTypeDescriptor extern const RideTypeDescriptor RideTypeDescriptors[RIDE_TYPE_COUNT]; -enum -{ - RIDE_TYPE_NO_ALTERNATIVES = 0, - RIDE_TYPE_ALTERNATIVE_TRACK_PIECES = 1, // Dinghy slide and Water Coaster - RIDE_TYPE_ALTERNATIVE_TRACK_TYPE = 2, // Flying RC, Lay-down RC, Multi-dimension RC -}; - // clang-format off constexpr RideComponentName RideComponentNames[] = {