diff --git a/src/openrct2-ui/windows/InstallTrack.cpp b/src/openrct2-ui/windows/InstallTrack.cpp index 6636334a91..453617d46f 100644 --- a/src/openrct2-ui/windows/InstallTrack.cpp +++ b/src/openrct2-ui/windows/InstallTrack.cpp @@ -239,9 +239,9 @@ namespace OpenRCT2::Ui::Windows } const auto& rtd = GetRideTypeDescriptor(td.trackAndVehicle.rtdIndex); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) { - if (td.trackAndVehicle.rtdIndex == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::miniGolf) { // Holes auto ft = Formatter(); diff --git a/src/openrct2-ui/windows/NewCampaign.cpp b/src/openrct2-ui/windows/NewCampaign.cpp index 0e82515560..dd78ff9e20 100644 --- a/src/openrct2-ui/windows/NewCampaign.cpp +++ b/src/openrct2-ui/windows/NewCampaign.cpp @@ -151,7 +151,7 @@ namespace OpenRCT2::Ui::Windows continue; if (rtd.HasFlag(RtdFlag::sellsDrinks)) continue; - if (rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType == RtdSpecialType::toilet) continue; RideList.push_back(curRide.id); diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 7825032de6..4b8cba0e74 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1362,7 +1362,7 @@ namespace OpenRCT2::Ui::Windows if (!rtd.HasFlag(RtdFlag::hasDataLogging)) disabledTabs |= (1uLL << WIDX_TAB_8); // 0x800 - if (ride->type == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::miniGolf) disabledTabs |= (1uLL << WIDX_TAB_2 | 1uLL << WIDX_TAB_3 | 1uLL << WIDX_TAB_4); // 0xE0 if (rtd.HasFlag(RtdFlag::noVehicles)) @@ -1383,7 +1383,7 @@ namespace OpenRCT2::Ui::Windows disabledTabs |= (1uLL << WIDX_TAB_6); // 0x200 } - if (rtd.HasFlag(RtdFlag::isCashMachine) || rtd.HasFlag(RtdFlag::isFirstAid) + if (rtd.specialType == RtdSpecialType::cashMachine || rtd.specialType == RtdSpecialType::firstAid || (GetGameState().Park.Flags & PARK_FLAGS_NO_MONEY) != 0) disabledTabs |= (1uLL << WIDX_TAB_9); // 0x1000 @@ -2010,7 +2010,9 @@ namespace OpenRCT2::Ui::Windows const auto& gameState = GetGameState(); const auto& rtd = ride.GetRideTypeDescriptor(); if (gameState.Cheats.ShowVehiclesFromOtherTrackTypes - && !(rtd.HasFlag(RtdFlag::isFlatRide) || rtd.HasFlag(RtdFlag::isMaze) || ride.type == RIDE_TYPE_MINI_GOLF)) + && !( + rtd.HasFlag(RtdFlag::isFlatRide) || rtd.specialType == RtdSpecialType::maze + || rtd.specialType == RtdSpecialType::miniGolf)) { selectionShouldBeExpanded = true; rideTypeIterator = 0; @@ -2037,7 +2039,7 @@ namespace OpenRCT2::Ui::Windows if (selectionShouldBeExpanded && rtdIterator.HasFlag(RtdFlag::isFlatRide)) continue; if (selectionShouldBeExpanded - && (rtdIterator.HasFlag(RtdFlag::isMaze) || rideTypeIterator == RIDE_TYPE_MINI_GOLF)) + && (rtdIterator.specialType == RtdSpecialType::maze || rtd.specialType == RtdSpecialType::miniGolf)) continue; auto& rideEntries = objManager.GetAllRideEntries(rideTypeIterator); @@ -2486,6 +2488,7 @@ namespace OpenRCT2::Ui::Windows if (vehicle == nullptr) return STR_EMPTY; + auto& rtd = ride->GetRideTypeDescriptor(); if (vehicle->status != Vehicle::Status::Crashing && vehicle->status != Vehicle::Status::Crashed) { auto trackType = vehicle->GetTrackType(); @@ -2494,7 +2497,7 @@ namespace OpenRCT2::Ui::Windows || trackType == TrackElemType::DiagUp25ToFlat || trackType == TrackElemType::DiagUp60ToFlat || trackType == TrackElemType::DiagBlockBrakes) { - if (ride->GetRideTypeDescriptor().SupportsTrackGroup(TrackGroup::blockBrakes) && vehicle->velocity == 0) + if (rtd.SupportsTrackGroup(TrackGroup::blockBrakes) && vehicle->velocity == 0) { ft.Add(STR_STOPPED_BY_BLOCK_BRAKES); return STR_BLACK_STRING; @@ -2502,7 +2505,7 @@ namespace OpenRCT2::Ui::Windows } } - if (ride->type == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::miniGolf) return STR_EMPTY; auto stringId = VehicleStatusNames[EnumValue(vehicle->status)]; @@ -4622,7 +4625,7 @@ namespace OpenRCT2::Ui::Windows // Maze style const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { widgets[WIDX_MAZE_STYLE].type = WindowWidgetType::DropdownMenu; widgets[WIDX_MAZE_STYLE_DROPDOWN].type = WindowWidgetType::Button; @@ -4689,7 +4692,7 @@ namespace OpenRCT2::Ui::Windows } // Track supports colour - if (HasTrackColour(*ride, 2) && !rtd.HasFlag(RtdFlag::isMaze)) + if (HasTrackColour(*ride, 2) && rtd.specialType != RtdSpecialType::maze) { widgets[WIDX_TRACK_SUPPORT_COLOUR].type = WindowWidgetType::ColourBtn; widgets[WIDX_TRACK_SUPPORT_COLOUR].image = GetColourButtonImage(trackColour.supports); @@ -4872,7 +4875,7 @@ namespace OpenRCT2::Ui::Windows // Track const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { GfxDrawSprite(dpi, ImageId(MazeOptions[trackColour.supports].sprite), screenCoords); } @@ -5721,7 +5724,7 @@ namespace OpenRCT2::Ui::Windows if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_NO_RAW_STATS)) { - if (ride->type == RIDE_TYPE_MINI_GOLF) + if (ride->GetRideTypeDescriptor().specialType == RtdSpecialType::miniGolf) { // Holes ft = Formatter(); @@ -5873,7 +5876,7 @@ namespace OpenRCT2::Ui::Windows screenCoords.y += kListRowHeight; } - if (ride->type != RIDE_TYPE_MINI_GOLF) + if (ride->GetRideTypeDescriptor().specialType != RtdSpecialType::miniGolf) { // Inversions if (ride->inversions != 0) @@ -6314,7 +6317,7 @@ namespace OpenRCT2::Ui::Windows ShopItem shopItem; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType == RtdSpecialType::toilet) { shopItem = ShopItem::Admission; } @@ -6420,7 +6423,7 @@ namespace OpenRCT2::Ui::Windows auto rideEntry = ride->GetRideEntry(); const auto& rtd = ride->GetRideTypeDescriptor(); - return Park::RidePricesUnlocked() || rtd.HasFlag(RtdFlag::isToilet) + return Park::RidePricesUnlocked() || rtd.specialType == RtdSpecialType::toilet || (rideEntry != nullptr && rideEntry->shop_item[0] != ShopItem::None); } @@ -6595,7 +6598,8 @@ namespace OpenRCT2::Ui::Windows // If ride prices are locked, do not allow setting the price, unless we're dealing with a shop or toilet. const auto& rtd = ride->GetRideTypeDescriptor(); - if (!Park::RidePricesUnlocked() && rideEntry->shop_item[0] == ShopItem::None && !rtd.HasFlag(RtdFlag::isToilet)) + if (!Park::RidePricesUnlocked() && rideEntry->shop_item[0] == ShopItem::None + && rtd.specialType != RtdSpecialType::toilet) { disabled_widgets |= (1uLL << WIDX_PRIMARY_PRICE); widgets[WIDX_PRIMARY_PRICE_LABEL].tooltip = STR_RIDE_INCOME_ADMISSION_PAY_FOR_ENTRY_TIP; @@ -6614,7 +6618,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_PRIMARY_PRICE].text = STR_FREE; ShopItem primaryItem = ShopItem::Admission; - if (rtd.HasFlag(RtdFlag::isToilet) || ((primaryItem = rideEntry->shop_item[0]) != ShopItem::None)) + if (rtd.specialType == RtdSpecialType::toilet || ((primaryItem = rideEntry->shop_item[0]) != ShopItem::None)) { widgets[WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK].type = WindowWidgetType::Checkbox; diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 566cc20512..e624a8f4e0 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -3059,7 +3059,7 @@ namespace OpenRCT2::Ui::Windows { WindowRideConstructionUpdateEnabledTrackPieces(); if (auto currentRide = GetRide(_currentRideIndex); - !currentRide || currentRide->GetRideTypeDescriptor().HasFlag(RtdFlag::isMaze)) + !currentRide || currentRide->GetRideTypeDescriptor().specialType == RtdSpecialType::maze) { return; } @@ -3293,7 +3293,7 @@ namespace OpenRCT2::Ui::Windows } const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) { auto window = static_cast(WindowFindByClass(WindowClass::RideConstruction)); if (!window) @@ -3349,7 +3349,7 @@ namespace OpenRCT2::Ui::Windows // search for appropriate z value for ghost, up to max ride height int numAttempts = (z <= MAX_TRACK_HEIGHT ? ((MAX_TRACK_HEIGHT - z) / kCoordsZStep + 1) : 2); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { for (int zAttempts = 0; zAttempts < numAttempts; ++zAttempts) { @@ -3586,7 +3586,7 @@ namespace OpenRCT2::Ui::Windows int numAttempts = (z <= MAX_TRACK_HEIGHT ? ((MAX_TRACK_HEIGHT - z) / kCoordsZStep + 1) : 2); const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { for (int32_t zAttempts = 0; zAttempts < numAttempts; ++zAttempts) { @@ -4689,7 +4689,7 @@ namespace OpenRCT2::Ui::Windows RideConstructionRemoveGhosts(); const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { int32_t flags = GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST; auto gameAction = MazeSetTrackAction(CoordsXYZD{ trackPos, 0 }, true, rideIndex, GC_SET_MAZE_TRACK_BUILD); @@ -5051,7 +5051,7 @@ namespace OpenRCT2::Ui::Windows int32_t z = _unkF440C5.z; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { const int32_t flags = GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST; const CoordsXYZD quadrants[kNumOrthogonalDirections] = { diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index c1c83bf06c..54ae966d59 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -415,7 +415,7 @@ namespace OpenRCT2::Ui::Windows } const auto& rtd = GetRideTypeDescriptor(td.trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { DrawMiniPreviewMaze(td, pass, origin, min, max); } diff --git a/src/openrct2-ui/windows/TrackList.cpp b/src/openrct2-ui/windows/TrackList.cpp index 60ef169386..de95175fed 100644 --- a/src/openrct2-ui/windows/TrackList.cpp +++ b/src/openrct2-ui/windows/TrackList.cpp @@ -562,9 +562,9 @@ namespace OpenRCT2::Ui::Windows if (GetRideTypeDescriptor(_loadedTrackDesign->trackAndVehicle.rtdIndex).HasFlag(RtdFlag::hasTrack)) { const auto& rtd = GetRideTypeDescriptor(_loadedTrackDesign->trackAndVehicle.rtdIndex); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) { - if (_loadedTrackDesign->trackAndVehicle.rtdIndex == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::miniGolf) { // Holes ft = Formatter(); diff --git a/src/openrct2/actions/RideCreateAction.cpp b/src/openrct2/actions/RideCreateAction.cpp index 04435ae9c8..1d781d284c 100644 --- a/src/openrct2/actions/RideCreateAction.cpp +++ b/src/openrct2/actions/RideCreateAction.cpp @@ -235,7 +235,7 @@ GameActions::Result RideCreateAction::Execute() const ride->price[0] = 0; } - if (rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType == RtdSpecialType::toilet) { if (ShopItemHasCommonPrice(ShopItem::Admission)) { diff --git a/src/openrct2/actions/RideSetPriceAction.cpp b/src/openrct2/actions/RideSetPriceAction.cpp index de24307cdc..c5a018e3b8 100644 --- a/src/openrct2/actions/RideSetPriceAction.cpp +++ b/src/openrct2/actions/RideSetPriceAction.cpp @@ -112,7 +112,7 @@ GameActions::Result RideSetPriceAction::Execute() const shopItem = ShopItem::Admission; const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType != RtdSpecialType::toilet) { shopItem = rideEntry->shop_item[0]; if (shopItem == ShopItem::None) @@ -165,7 +165,7 @@ void RideSetPriceAction::RideSetCommonPrice(ShopItem shopItem) const auto invalidate = false; auto rideEntry = GetRideEntryByIndex(ride.subtype); const auto& rtd = ride.GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isToilet) && shopItem == ShopItem::Admission) + if (rtd.specialType == RtdSpecialType::toilet && shopItem == ShopItem::Admission) { if (ride.price[0] != _price) { diff --git a/src/openrct2/actions/RideSetVehicleAction.cpp b/src/openrct2/actions/RideSetVehicleAction.cpp index b24dce20c6..3b1d994ad2 100644 --- a/src/openrct2/actions/RideSetVehicleAction.cpp +++ b/src/openrct2/actions/RideSetVehicleAction.cpp @@ -232,8 +232,8 @@ bool RideSetVehicleAction::RideIsVehicleTypeValid(const Ride& ride) const const auto& rtd = ride.GetRideTypeDescriptor(); if (gameState.Cheats.ShowVehiclesFromOtherTrackTypes && !( - ride.GetRideTypeDescriptor().HasFlag(RtdFlag::isFlatRide) || rtd.HasFlag(RtdFlag::isMaze) - || ride.type == RIDE_TYPE_MINI_GOLF)) + ride.GetRideTypeDescriptor().HasFlag(RtdFlag::isFlatRide) || rtd.specialType == RtdSpecialType::maze + || rtd.specialType == RtdSpecialType::miniGolf)) { selectionShouldBeExpanded = true; rideTypeIterator = 0; @@ -255,7 +255,7 @@ bool RideSetVehicleAction::RideIsVehicleTypeValid(const Ride& ride) const continue; const auto& rtd = GetRideTypeDescriptor(rideTypeIterator); - if (rtd.HasFlag(RtdFlag::isMaze) || rideTypeIterator == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::maze || rtd.specialType == RtdSpecialType::miniGolf) continue; } diff --git a/src/openrct2/entity/Guest.cpp b/src/openrct2/entity/Guest.cpp index 13a160e37f..e13d43a9ed 100644 --- a/src/openrct2/entity/Guest.cpp +++ b/src/openrct2/entity/Guest.cpp @@ -452,6 +452,7 @@ static void PeepUpdateHunger(Guest* peep); static void PeepDecideWhetherToLeavePark(Guest* peep); static void PeepLeavePark(Guest* peep); static void PeepHeadForNearestRideWithFlag(Guest* peep, bool considerOnlyCloseRides, RtdFlag rtdFlag); +static void GuestHeadForNearestRideWithSpecialType(Guest& guest, bool considerOnlyCloseRides, RtdSpecialType specialType); bool Loc690FD0(Peep* peep, RideId* rideToView, uint8_t* rideSeatToView, TileElement* tileElement); template<> @@ -1122,10 +1123,10 @@ void Guest::Tick128UpdateGuest(uint32_t index) PeepHeadForNearestRideWithFlag(this, false, RtdFlag::sellsDrinks); break; case PeepThoughtType::Toilet: - PeepHeadForNearestRideWithFlag(this, false, RtdFlag::isToilet); + GuestHeadForNearestRideWithSpecialType(*this, false, RtdSpecialType::toilet); break; case PeepThoughtType::RunningOut: - PeepHeadForNearestRideWithFlag(this, false, RtdFlag::isCashMachine); + GuestHeadForNearestRideWithSpecialType(*this, false, RtdSpecialType::cashMachine); break; default: break; @@ -1145,7 +1146,7 @@ void Guest::Tick128UpdateGuest(uint32_t index) if (Nausea >= 200) { thought_type = PeepThoughtType::VerySick; - PeepHeadForNearestRideWithFlag(this, true, RtdFlag::isFirstAid); + GuestHeadForNearestRideWithSpecialType(*this, true, RtdSpecialType::firstAid); } InsertNewThought(thought_type); } @@ -2240,7 +2241,7 @@ bool Guest::ShouldGoToShop(Ride& ride, bool peepAtShop) } const auto& rtd = ride.GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType == RtdSpecialType::toilet) { if (Toilet < 70) { @@ -2266,7 +2267,7 @@ bool Guest::ShouldGoToShop(Ride& ride, bool peepAtShop) } } - if (rtd.HasFlag(RtdFlag::isFirstAid)) + if (rtd.specialType == RtdSpecialType::firstAid) { if (Nausea < 128) { @@ -3251,12 +3252,19 @@ static void PeepHeadForNearestRide(Guest* peep, bool considerOnlyCloseRides, T p static void PeepHeadForNearestRideWithFlag(Guest* peep, bool considerOnlyCloseRides, RtdFlag rtdFlag) { - if ((rtdFlag == RtdFlag::isToilet) && peep->HasFoodOrDrink()) + PeepHeadForNearestRide( + peep, considerOnlyCloseRides, [rtdFlag](const Ride& ride) { return ride.GetRideTypeDescriptor().HasFlag(rtdFlag); }); +} + +static void GuestHeadForNearestRideWithSpecialType(Guest& guest, bool considerOnlyCloseRides, RtdSpecialType specialType) +{ + if ((specialType == RtdSpecialType::toilet) && guest.HasFoodOrDrink()) { return; } - PeepHeadForNearestRide( - peep, considerOnlyCloseRides, [rtdFlag](const Ride& ride) { return ride.GetRideTypeDescriptor().HasFlag(rtdFlag); }); + PeepHeadForNearestRide(&guest, considerOnlyCloseRides, [specialType](const Ride& ride) { + return ride.GetRideTypeDescriptor().specialType == specialType; + }); } /** @@ -3277,10 +3285,10 @@ void Guest::StopPurchaseThought(ride_type_t rideType) if (!rtd.HasFlag(RtdFlag::sellsDrinks)) { thoughtType = PeepThoughtType::RunningOut; - if (!rtd.HasFlag(RtdFlag::isCashMachine)) + if (rtd.specialType != RtdSpecialType::cashMachine) { thoughtType = PeepThoughtType::Toilet; - if (!rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType != RtdSpecialType::toilet) { return; } @@ -3365,7 +3373,7 @@ void Guest::UpdateBuying() } const auto& rtd = GetRideTypeDescriptor(ride->type); - if (rtd.HasFlag(RtdFlag::isCashMachine)) + if (rtd.specialType == RtdSpecialType::cashMachine) { if (CurrentRide != PreviousRide) { @@ -3388,7 +3396,7 @@ void Guest::UpdateBuying() if (CurrentRide != PreviousRide) { const auto& rtd = GetRideTypeDescriptor(ride->type); - if (rtd.HasFlag(RtdFlag::isCashMachine)) + if (rtd.specialType == RtdSpecialType::cashMachine) { item_bought = PeepShouldUseCashMachine(this, CurrentRide); if (!item_bought) @@ -3907,7 +3915,7 @@ void Guest::UpdateRideFreeVehicleEnterRide(Ride& ride) } const auto& rtd = ride.GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isSpiralSlide)) + if (rtd.specialType == RtdSpecialType::spiralSlide) { SwitchToSpecialSprite(1); } @@ -4697,7 +4705,7 @@ void Guest::UpdateRideApproachSpiralSlide() Var37 = (directionTemp * 4) | (Var37 & 0x30) | waypoint; CoordsXY targetLoc = ride->GetStation(CurrentRideStation).Start; - assert(rtd.HasFlag(RtdFlag::isSpiralSlide)); + assert(rtd.specialType == RtdSpecialType::spiralSlide); targetLoc += SpiralSlideWalkingPath[Var37]; SetDestination(targetLoc); @@ -4711,7 +4719,7 @@ void Guest::UpdateRideApproachSpiralSlide() CoordsXY targetLoc = ride->GetStation(CurrentRideStation).Start; - assert(rtd.HasFlag(RtdFlag::isSpiralSlide)); + assert(rtd.specialType == RtdSpecialType::spiralSlide); targetLoc += SpiralSlideWalkingPath[Var37]; SetDestination(targetLoc); @@ -4745,7 +4753,7 @@ void Guest::UpdateRideOnSpiralSlide() return; const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isSpiralSlide)) + if (rtd.specialType != RtdSpecialType::spiralSlide) return; auto destination = GetDestination(); @@ -4850,7 +4858,7 @@ void Guest::UpdateRideLeaveSpiralSlide() CoordsXY targetLoc = ride->GetStation(CurrentRideStation).Start; [[maybe_unused]] const auto& rtd = ride->GetRideTypeDescriptor(); - assert(rtd.HasFlag(RtdFlag::isSpiralSlide)); + assert(rtd.specialType == RtdSpecialType::spiralSlide); targetLoc += SpiralSlideWalkingPath[Var37]; SetDestination(targetLoc); @@ -5110,7 +5118,7 @@ void Guest::UpdateRideShopInteract() const int16_t tileCentreY = NextLoc.y + 16; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isFirstAid)) + if (rtd.specialType == RtdSpecialType::firstAid) { if (Nausea <= 35) { diff --git a/src/openrct2/entity/Peep.cpp b/src/openrct2/entity/Peep.cpp index a3806d5077..f60602f70f 100644 --- a/src/openrct2/entity/Peep.cpp +++ b/src/openrct2/entity/Peep.cpp @@ -1141,7 +1141,7 @@ void PeepProblemWarningsUpdate() break; } ride = GetRide(peep->GuestHeadingToRideId); - if (ride != nullptr && !ride->GetRideTypeDescriptor().HasFlag(RtdFlag::isToilet)) + if (ride != nullptr && ride->GetRideTypeDescriptor().specialType != RtdSpecialType::toilet) toiletCounter++; break; diff --git a/src/openrct2/management/Award.cpp b/src/openrct2/management/Award.cpp index 4220040320..e692c8299c 100644 --- a/src/openrct2/management/Award.cpp +++ b/src/openrct2/management/Award.cpp @@ -374,7 +374,7 @@ static bool AwardIsDeservedBestToilets([[maybe_unused]] int32_t activeAwardTypes const auto& rideManager = GetRideManager(); auto numToilets = static_cast(std::count_if(rideManager.begin(), rideManager.end(), [](const Ride& ride) { const auto& rtd = ride.GetRideTypeDescriptor(); - return rtd.HasFlag(RtdFlag::isToilet) && ride.status == RideStatus::Open; + return rtd.specialType == RtdSpecialType::toilet && ride.status == RideStatus::Open; })); // At least 4 open toilets diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 1944ea4331..4b47a6e9aa 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1050,7 +1050,7 @@ namespace OpenRCT2::RCT1 dst->dropsPoweredLifts = src->NumDrops; dst->start_drop_height = src->StartDropHeight / 2; dst->highest_drop_height = src->HighestDropHeight / 2; - if (dst->type == RIDE_TYPE_MINI_GOLF) + if (src->Type == RideType::MiniatureGolf) dst->holes = src->NumInversions & kRCT12InversionAndHoleMask; else dst->inversions = src->NumInversions & kRCT12InversionAndHoleMask; diff --git a/src/openrct2/rct1/T4Importer.cpp b/src/openrct2/rct1/T4Importer.cpp index 1b35758eaa..12703b1629 100644 --- a/src/openrct2/rct1/T4Importer.cpp +++ b/src/openrct2/rct1/T4Importer.cpp @@ -235,7 +235,7 @@ namespace OpenRCT2::RCT1 td->operation.operationSetting, GetRideTypeDescriptor(td->trackAndVehicle.rtdIndex).OperatingSettings.MaxValue); const auto& rtd = GetRideTypeDescriptor(td->trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { TD46MazeElement t4MazeElement{}; t4MazeElement.All = !0; diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 72ad05dd03..86642a1968 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -1382,7 +1382,7 @@ namespace OpenRCT2::RCT2 // This has to be done last, since the maze entry shares fields with the colour and sequence fields. const auto& rtd = GetRideTypeDescriptor(rideType); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { dst2->SetMazeEntry(src2->GetMazeEntry()); } diff --git a/src/openrct2/rct2/T6Exporter.cpp b/src/openrct2/rct2/T6Exporter.cpp index 25bcce1aef..c68106bbd3 100644 --- a/src/openrct2/rct2/T6Exporter.cpp +++ b/src/openrct2/rct2/T6Exporter.cpp @@ -51,6 +51,7 @@ namespace OpenRCT2::RCT2 bool T6Exporter::SaveTrack(OpenRCT2::IStream* stream) { + auto& rtd = GetRideTypeDescriptor(_trackDesign.trackAndVehicle.rtdIndex); auto td6rideType = OpenRCT2RideTypeToRCT2RideType(_trackDesign.trackAndVehicle.rtdIndex); OpenRCT2::MemoryStream tempStream; tempStream.WriteValue(td6rideType); @@ -81,7 +82,7 @@ namespace OpenRCT2::RCT2 tempStream.WriteValue(_trackDesign.statistics.maxNegativeVerticalG / kTD46GForcesMultiplier); tempStream.WriteValue(_trackDesign.statistics.maxLateralG / kTD46GForcesMultiplier); - if (td6rideType == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::miniGolf) tempStream.WriteValue(_trackDesign.statistics.holes & kRCT12InversionAndHoleMask); else tempStream.WriteValue(_trackDesign.statistics.inversions & kRCT12InversionAndHoleMask); @@ -114,8 +115,7 @@ namespace OpenRCT2::RCT2 } tempStream.WriteValue(_trackDesign.operation.liftHillSpeed | (_trackDesign.operation.numCircuits << 5)); - const auto& rtd = GetRideTypeDescriptor(_trackDesign.trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { for (const auto& mazeElement : _trackDesign.mazeElements) { diff --git a/src/openrct2/rct2/T6Importer.cpp b/src/openrct2/rct2/T6Importer.cpp index 5bc7ffa78e..605a3e3941 100644 --- a/src/openrct2/rct2/T6Importer.cpp +++ b/src/openrct2/rct2/T6Importer.cpp @@ -132,7 +132,7 @@ namespace OpenRCT2::RCT2 td->operation.operationSetting, GetRideTypeDescriptor(td->trackAndVehicle.rtdIndex).OperatingSettings.MaxValue); const auto& rtd = GetRideTypeDescriptor(td->trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { TD46MazeElement t6MazeElement{}; t6MazeElement.All = !0; diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 9262504fb2..9decc64683 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -298,11 +298,11 @@ size_t Ride::GetNumPrices() const { size_t result = 0; const auto& rtd = GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isCashMachine) || rtd.HasFlag(RtdFlag::isFirstAid)) + if (rtd.specialType == RtdSpecialType::cashMachine || rtd.specialType == RtdSpecialType::firstAid) { result = 0; } - else if (rtd.HasFlag(RtdFlag::isToilet)) + else if (rtd.specialType == RtdSpecialType::toilet) { result = 1; } @@ -795,7 +795,7 @@ bool Ride::FindTrackGap(const CoordsXYE& input, CoordsXYE* output) const return false; const auto& rtd = GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) return false; WindowBase* w = WindowFindByClass(WindowClass::RideConstruction); @@ -1108,7 +1108,7 @@ void Ride::Update() // Update stations const auto& rtd = GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) for (StationIndex::UnderlyingType i = 0; i < OpenRCT2::Limits::kMaxStationsPerRide; i++) RideUpdateStation(*this, StationIndex::FromUnderlying(i)); @@ -2630,7 +2630,7 @@ static StationIndexWithMessage RideModeCheckStationPresent(const Ride& ride) if (!rtd.HasFlag(RtdFlag::hasTrack)) return { StationIndex::GetNull(), STR_NOT_YET_CONSTRUCTED }; - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) return { StationIndex::GetNull(), STR_NOT_YET_CONSTRUCTED }; return { StationIndex::GetNull(), STR_REQUIRES_A_STATION_PLATFORM }; @@ -2793,7 +2793,7 @@ static bool RideCheckTrackContainsInversions(const CoordsXYE& input, CoordsXYE* if (ride != nullptr) { const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) return true; } @@ -2854,7 +2854,7 @@ static bool RideCheckTrackContainsBanked(const CoordsXYE& input, CoordsXYE* outp return false; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) return true; WindowBase* w = WindowFindByClass(WindowClass::RideConstruction); @@ -3189,7 +3189,7 @@ static void RideSetStartFinishPoints(RideId rideIndex, const CoordsXYE& startEle return; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) RideSetMazeEntranceExitPoints(*ride); else if (ride->type == RIDE_TYPE_BOAT_HIRE) RideSetBoatHireReturnPoint(*ride, startElement); @@ -3974,7 +3974,7 @@ void Ride::ConstructMissingEntranceOrExit() const } const auto& rtd = GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) { auto location = incompleteStation->GetStart(); WindowScrollToLocation(*w, location); @@ -5906,7 +5906,7 @@ ResultWithMessage Ride::ChangeStatusGetStartElement(StationIndex stationIndex, C { // Maze is strange, station start is 0... investigation required const auto& rtd = GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) return { false }; } diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index d310e5c3f1..ebb333b08e 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -960,7 +960,7 @@ bool RideModify(const CoordsXYE& input) ride_create_or_find_construction_window(rideIndex); const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { return ride_modify_maze(tileElement); } @@ -1147,7 +1147,7 @@ money64 SetOperatingSettingNested(RideId rideId, RideSetSetting setting, uint8_t void Ride::ValidateStations() { const auto& rtd = GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) { // find the stations of the ride to begin stepping over track elements from for (const auto& station : stations) diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index 9e2b56e18d..ba133232ba 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -328,114 +328,126 @@ struct TrackDrawerDescriptor enum class RtdFlag : uint8_t { - hasTrackColourMain = 0, - hasTrackColourAdditional = 1, - hasTrackColourSupports = 2, + hasTrackColourMain, + hasTrackColourAdditional, + hasTrackColourSupports, // Set by flat rides, tower rides and shops/stalls. - hasSinglePieceStation = 3, + hasSinglePieceStation, - hasLeaveWhenAnotherVehicleArrivesAtStation = 4, - canSynchroniseWithAdjacentStations = 5, + hasLeaveWhenAnotherVehicleArrivesAtStation, + canSynchroniseWithAdjacentStations, // Used only by boat Hire and submarine ride - trackMustBeOnWater = 6, + trackMustBeOnWater, - hasGForces = 7, + hasGForces, // Used by rides that can't have gaps, like those with a vertical tower, // such as the observation tower. - cannotHaveGaps = 8, + cannotHaveGaps, - hasDataLogging = 9, - hasDrops = 10, + hasDataLogging, + hasDrops, + + noTestMode, - noTestMode = 11, // Set on rides with two varieties, like the u and o shapes of the dinghy slide // and the dry and submerged track of the water coaster. - - hasCoveredPieces = 12, + hasCoveredPieces, // Used only by maze, spiral slide and shops - noVehicles = 13, + noVehicles, - hasLoadOptions = 14, - hasLsmBehaviourOnFlat = 15, + hasLoadOptions, + hasLsmBehaviourOnFlat, // Set by flat rides where the vehicle is integral to the structure, like // Merry-go-round and swinging ships. (Contrast with rides like dodgems.) - vehicleIsIntegral = 16, + vehicleIsIntegral, - isShopOrFacility = 17, + isShopOrFacility, // If set, wall scenery can not share a tile with the ride's track - noWallsAroundTrack = 18, + noWallsAroundTrack, - isFlatRide = 19, + isFlatRide, // Whether or not guests will go on the ride again if they liked it // (this is usually applied to everything apart from transport rides). - guestsWillRideAgain = 20, + guestsWillRideAgain, // Used by Toilets and First Aid to mark that guest should go // inside the building (rather than 'buying' at the counter) - guestsShouldGoInsideFacility = 21, + guestsShouldGoInsideFacility, // Guests are "IN" (ride) rather than "ON" (ride) - describeAsInside = 22, + describeAsInside, - sellsFood = 23, - sellsDrinks = 24, - isToilet = 25, + sellsFood, + sellsDrinks, // Whether or not vehicle colours can be set - hasVehicleColours = 26, + hasVehicleColours, - checkForStalling = 27, - hasTrack = 28, + checkForStalling, + hasTrack, // Only set by lift - allowExtraTowerBases = 29, + allowExtraTowerBases, // Only set by reverser coaster - layeredVehiclePreview = 30, + layeredVehiclePreview, - supportsMultipleColourSchemes = 31, - allowDoorsOnTrack = 32, - hasMusicByDefault = 33, - allowMusic = 34, + supportsMultipleColourSchemes, + allowDoorsOnTrack, + hasMusicByDefault, + allowMusic, // Used by the Flying RC, Lay-down RC, Multi-dimension RC - hasInvertedVariant = 35, + hasInvertedVariant, - checkGForces = 36, - hasEntranceAndExit = 37, - allowMoreVehiclesThanStationFits = 38, - hasAirTime = 39, - singleSession = 40, - allowMultipleCircuits = 41, - allowCableLiftHill = 42, - showInTrackDesigner = 43, - isTransportRide = 44, - interestingToLookAt = 45, - slightlyInterestingToLookAt = 46, + checkGForces, + hasEntranceAndExit, + allowMoreVehiclesThanStationFits, + hasAirTime, + singleSession, + allowMultipleCircuits, + allowCableLiftHill, + showInTrackDesigner, + isTransportRide, + interestingToLookAt, + slightlyInterestingToLookAt, // This is only set on the Flying RC and its alternative type. - startConstructionInverted = 47, + startConstructionInverted, - listVehiclesSeparately = 48, - supportsLevelCrossings = 49, - isSuspended = 50, - hasLandscapeDoors = 51, - upInclineRequiresLift = 52, - guestsCanUseUmbrella = 53, - isCashMachine = 54, - hasOneStation = 55, - hasSeatRotation = 56, - isFirstAid = 57, - isMaze = 58, - isSpiralSlide = 59, - allowReversedTrains = 60, + listVehiclesSeparately, + supportsLevelCrossings, + isSuspended, + hasLandscapeDoors, + upInclineRequiresLift, + guestsCanUseUmbrella, + hasOneStation, + hasSeatRotation, + allowReversedTrains, +}; + +/** + * Some rides are so different from others that they need some special code. + * This replaces direct ride type checks. + * + * Note: only add to this list if behaviour cannot sufficiently be altered using flags. + */ +enum class RtdSpecialType +{ + none, + maze, + miniGolf, + spiralSlide, + toilet, + cashMachine, + firstAid, }; // Set on ride types that have a main colour, additional colour and support colour. @@ -517,6 +529,7 @@ struct RideTypeDescriptor MusicTrackOffsetLengthFunc MusicTrackOffsetLength = OpenRCT2::RideAudio::RideMusicGetTrackOffsetLength_Default; UpdateRideApproachVehicleWaypointsFunction UpdateRideApproachVehicleWaypoints = UpdateRideApproachVehicleWaypointsDefault; + RtdSpecialType specialType = RtdSpecialType::none; bool HasFlag(RtdFlag flag) const; /** @deprecated */ diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index 2a0a4e2540..7d251e7371 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -526,7 +526,7 @@ static void ride_ratings_begin_proximity_loop(RideRatingUpdateState& state) } const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { state.State = RIDE_RATINGS_STATE_CALCULATE; return; @@ -1632,7 +1632,7 @@ static RatingTuple ride_ratings_get_turns_ratings(const Ride& ride) intensity += slopedTurnsRating.intensity; nausea += slopedTurnsRating.nausea; - auto inversions = (ride.type == RIDE_TYPE_MINI_GOLF) ? ride.holes : ride.inversions; + auto inversions = ride.GetRideTypeDescriptor().specialType == RtdSpecialType::miniGolf ? ride.holes : ride.inversions; RatingTuple inversionsRating = get_inversions_ratings(inversions); excitement += inversionsRating.excitement; intensity += inversionsRating.intensity; @@ -1769,7 +1769,7 @@ static int32_t ride_ratings_get_scenery_score(const Ride& ride) } const auto& rtd = ride.GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { location = ride.GetStation().Entrance.ToCoordsXY(); } diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 817a86ec89..15415a5d8f 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -906,7 +906,7 @@ static void TrackDesignMirrorMaze(TrackDesign& td) void TrackDesignMirror(TrackDesign& td) { const auto& rtd = GetRideTypeDescriptor(td.trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { TrackDesignMirrorMaze(td); } @@ -1767,7 +1767,7 @@ static GameActions::Result TrackDesignPlaceVirtual( GameActions::Result trackPlaceRes; const auto& rtd = GetRideTypeDescriptor(td.trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { trackPlaceRes = TrackDesignPlaceMaze(tds, td, coords, ride); } diff --git a/src/openrct2/ride/TrackPaint.cpp b/src/openrct2/ride/TrackPaint.cpp index 9d2f14dc0a..f8e66b6bff 100644 --- a/src/openrct2/ride/TrackPaint.cpp +++ b/src/openrct2/ride/TrackPaint.cpp @@ -1972,7 +1972,8 @@ void PaintTrack(PaintSession& session, Direction direction, int32_t height, cons { uint8_t zOffset = 16; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isToilet) || rtd.HasFlag(RtdFlag::isFirstAid) || rtd.HasFlag(RtdFlag::isCashMachine)) + if (rtd.specialType == RtdSpecialType::toilet || rtd.specialType == RtdSpecialType::firstAid + || rtd.specialType == RtdSpecialType::cashMachine) zOffset = 23; const auto* originElement = ride->GetOriginElement(StationIndex::FromUnderlying(0)); diff --git a/src/openrct2/ride/rtd/gentle/Maze.h b/src/openrct2/ride/rtd/gentle/Maze.h index e3dc2616b4..4e53d6a5b4 100644 --- a/src/openrct2/ride/rtd/gentle/Maze.h +++ b/src/openrct2/ride/rtd/gentle/Maze.h @@ -29,7 +29,7 @@ constexpr RideTypeDescriptor MazeRTD = .InvertedTrackPaintFunctions = {}, .Flags = EnumsToFlags(RtdFlag::hasTrackColourSupports, RtdFlag::hasSinglePieceStation, RtdFlag::noTestMode, RtdFlag::noVehicles, RtdFlag::noWallsAroundTrack, RtdFlag::describeAsInside, RtdFlag::hasTrack, RtdFlag::hasEntranceAndExit, - RtdFlag::guestsCanUseUmbrella, RtdFlag::isMaze), + RtdFlag::guestsCanUseUmbrella), .RideModes = EnumsToFlags(RideMode::Maze), .DefaultMode = RideMode::Maze, .OperatingSettings = { 1, 64 }, @@ -74,5 +74,6 @@ constexpr RideTypeDescriptor MazeRTD = .SpecialElementRatingAdjustment = SpecialTrackElementRatingsAjustment_Default, .GetGuestWaypointLocation = GetGuestWaypointLocationDefault, .ConstructionWindowContext = RideConstructionWindowContext::Maze, + .specialType = RtdSpecialType::maze, }; // clang-format on diff --git a/src/openrct2/ride/rtd/gentle/MiniGolf.h b/src/openrct2/ride/rtd/gentle/MiniGolf.h index f06e988df1..78a8be78f8 100644 --- a/src/openrct2/ride/rtd/gentle/MiniGolf.h +++ b/src/openrct2/ride/rtd/gentle/MiniGolf.h @@ -80,5 +80,6 @@ constexpr RideTypeDescriptor MiniGolfRTD = .ConstructionWindowContext = RideConstructionWindowContext::Default, .RideUpdate = nullptr, .UpdateMeasurementsSpecialElements = RideUpdateMeasurementsSpecialElements_MiniGolf, + .specialType = RtdSpecialType::miniGolf, }; // clang-format on diff --git a/src/openrct2/ride/rtd/gentle/SpiralSlide.h b/src/openrct2/ride/rtd/gentle/SpiralSlide.h index be22034f39..883b48e81e 100644 --- a/src/openrct2/ride/rtd/gentle/SpiralSlide.h +++ b/src/openrct2/ride/rtd/gentle/SpiralSlide.h @@ -29,7 +29,7 @@ constexpr RideTypeDescriptor SpiralSlideRTD = RtdFlag::cannotHaveGaps, RtdFlag::noTestMode, RtdFlag::noVehicles, RtdFlag::noWallsAroundTrack, RtdFlag::isFlatRide, RtdFlag::allowMusic, RtdFlag::hasEntranceAndExit, RtdFlag::interestingToLookAt, - RtdFlag::listVehiclesSeparately, RtdFlag::isSpiralSlide), + RtdFlag::listVehiclesSeparately), .RideModes = EnumsToFlags(RideMode::SingleRidePerAdmission, RideMode::UnlimitedRidesPerAdmission), .DefaultMode = RideMode::SingleRidePerAdmission, .OperatingSettings = { 1, 5 }, @@ -78,5 +78,6 @@ constexpr RideTypeDescriptor SpiralSlideRTD = .GetGuestWaypointLocation = GetGuestWaypointLocationDefault, .ConstructionWindowContext = RideConstructionWindowContext::Default, .RideUpdate = UpdateSpiralSlide, + .specialType = RtdSpecialType::spiralSlide, }; // clang-format on diff --git a/src/openrct2/ride/rtd/shops/CashMachine.h b/src/openrct2/ride/rtd/shops/CashMachine.h index 8865bbf4a8..b78f85e4e8 100644 --- a/src/openrct2/ride/rtd/shops/CashMachine.h +++ b/src/openrct2/ride/rtd/shops/CashMachine.h @@ -25,7 +25,7 @@ constexpr RideTypeDescriptor CashMachineRTD = }), .InvertedTrackPaintFunctions = {}, .Flags = EnumsToFlags(RtdFlag::hasSinglePieceStation, RtdFlag::cannotHaveGaps, RtdFlag::noTestMode, - RtdFlag::noVehicles, RtdFlag::isCashMachine, RtdFlag::isShopOrFacility, + RtdFlag::noVehicles, RtdFlag::isShopOrFacility, RtdFlag::noWallsAroundTrack, RtdFlag::isFlatRide, RtdFlag::listVehiclesSeparately), .RideModes = EnumsToFlags(RideMode::ShopStall), .DefaultMode = RideMode::ShopStall, @@ -61,5 +61,6 @@ constexpr RideTypeDescriptor CashMachineRTD = .DesignCreateMode = TrackDesignCreateMode::Default, .MusicUpdateFunction = DefaultMusicUpdate, .Classification = RideClassification::KioskOrFacility, + .specialType = RtdSpecialType::cashMachine, }; // clang-format on diff --git a/src/openrct2/ride/rtd/shops/FirstAid.h b/src/openrct2/ride/rtd/shops/FirstAid.h index 553f3f4fd0..da13a5d2c3 100644 --- a/src/openrct2/ride/rtd/shops/FirstAid.h +++ b/src/openrct2/ride/rtd/shops/FirstAid.h @@ -26,7 +26,7 @@ constexpr RideTypeDescriptor FirstAidRTD = .InvertedTrackPaintFunctions = {}, .Flags = EnumsToFlags(RtdFlag::hasSinglePieceStation, RtdFlag::cannotHaveGaps, RtdFlag::noTestMode, RtdFlag::noVehicles, RtdFlag::isShopOrFacility, RtdFlag::noWallsAroundTrack, - RtdFlag::isFlatRide, RtdFlag::isFirstAid, RtdFlag::guestsShouldGoInsideFacility, + RtdFlag::isFlatRide, RtdFlag::guestsShouldGoInsideFacility, RtdFlag::describeAsInside, RtdFlag::listVehiclesSeparately), .RideModes = EnumsToFlags(RideMode::ShopStall), .DefaultMode = RideMode::ShopStall, @@ -63,5 +63,6 @@ constexpr RideTypeDescriptor FirstAidRTD = .DesignCreateMode = TrackDesignCreateMode::Default, .MusicUpdateFunction = DefaultMusicUpdate, .Classification = RideClassification::KioskOrFacility, + .specialType = RtdSpecialType::firstAid, }; // clang-format on diff --git a/src/openrct2/ride/rtd/shops/Toilets.h b/src/openrct2/ride/rtd/shops/Toilets.h index 5e60e15896..d88e44a25b 100644 --- a/src/openrct2/ride/rtd/shops/Toilets.h +++ b/src/openrct2/ride/rtd/shops/Toilets.h @@ -27,7 +27,7 @@ constexpr RideTypeDescriptor ToiletsRTD = .Flags = EnumsToFlags(RtdFlag::hasSinglePieceStation, RtdFlag::cannotHaveGaps, RtdFlag::noTestMode, RtdFlag::noVehicles, RtdFlag::isShopOrFacility, RtdFlag::noWallsAroundTrack, RtdFlag::isFlatRide, RtdFlag::guestsShouldGoInsideFacility, RtdFlag::describeAsInside, - RtdFlag::isToilet, RtdFlag::listVehiclesSeparately), + RtdFlag::listVehiclesSeparately), .RideModes = EnumsToFlags(RideMode::ShopStall), .DefaultMode = RideMode::ShopStall, .OperatingSettings = { 4, 4 }, @@ -63,5 +63,6 @@ constexpr RideTypeDescriptor ToiletsRTD = .DesignCreateMode = TrackDesignCreateMode::Default, .MusicUpdateFunction = DefaultMusicUpdate, .Classification = RideClassification::KioskOrFacility, + .specialType = RtdSpecialType::toilet, }; // clang-format on diff --git a/src/openrct2/scripting/bindings/world/ScTileElement.cpp b/src/openrct2/scripting/bindings/world/ScTileElement.cpp index 7ec82c4171..dbd13a201c 100644 --- a/src/openrct2/scripting/bindings/world/ScTileElement.cpp +++ b/src/openrct2/scripting/bindings/world/ScTileElement.cpp @@ -508,7 +508,7 @@ namespace OpenRCT2::Scripting if (ride != nullptr) { const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) throw DukException() << "Cannot read 'sequence' property, TrackElement belongs to a maze."; } @@ -561,7 +561,7 @@ namespace OpenRCT2::Scripting if (ride != nullptr) { const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) throw DukException() << "Cannot set 'sequence' property, TrackElement belongs to a maze."; } @@ -834,7 +834,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot read 'mazeEntry' property, ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) throw DukException() << "Cannot read 'mazeEntry' property, ride is not a maze."; duk_push_int(ctx, el->GetMazeEntry()); @@ -864,7 +864,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot set 'mazeEntry' property, ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) throw DukException() << "Cannot set 'mazeEntry' property, ride is not a maze."; el->SetMazeEntry(value.as_uint()); @@ -892,7 +892,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot read 'colourScheme' property, ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) throw DukException() << "Cannot read 'colourScheme' property, TrackElement belongs to a maze."; duk_push_int(ctx, el->GetColourScheme()); @@ -922,7 +922,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot set 'colourScheme', ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) throw DukException() << "Cannot set 'colourScheme' property, TrackElement belongs to a maze."; el->SetColourScheme(static_cast(value.as_uint())); @@ -950,7 +950,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot read 'seatRotation' property, ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) throw DukException() << "Cannot read 'seatRotation' property, TrackElement belongs to a maze."; duk_push_int(ctx, el->GetSeatRotation()); @@ -980,7 +980,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot set 'seatRotation' property, ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) throw DukException() << "Cannot set 'seatRotation' property, TrackElement belongs to a maze."; el->SetSeatRotation(value.as_uint());