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:
committed by
GitHub
parent
cdc298e667
commit
04bdff052f
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../util/Util.h"
|
||||
|
||||
template<typename THolderType, typename TEnumType> struct FlagHolder
|
||||
{
|
||||
THolderType holder{};
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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[] =
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user