1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Use FlagHolder for _currentTrackAlternative

This commit is contained in:
Michael Steenbeek
2024-09-25 14:29:39 +02:00
committed by GitHub
parent cdc298e667
commit 04bdff052f
7 changed files with 39 additions and 36 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -9,6 +9,8 @@
#pragma once
#include "../util/Util.h"
template<typename THolderType, typename TEnumType> struct FlagHolder
{
THolderType holder{};

View File

@@ -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);
}

View File

@@ -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<uint8_t, AlternativeTrackFlag>;
} // 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;

View File

@@ -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[] =
{