diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index 77bc6325e5..b080505abd 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -365,7 +365,7 @@ static ride_list_item * window_new_ride_iterate_over_ride_group(uint8 rideType, const RideGroup * rideEntryRideGroup = RideGroupManager::GetRideGroup(rideType, rideEntry); const RideGroup * rideGroup = RideGroupManager::RideGroupFind(rideType, rideGroupIndex); - if (!RideGroupManager::RideGroupsAreEqual(rideEntryRideGroup, rideGroup)) + if (!rideEntryRideGroup->Equals(rideGroup)) continue; } @@ -552,7 +552,8 @@ void window_new_ride_focus(ride_list_item rideItem) if (listItem->type == rideItem.type) { const RideGroup * irg = RideGroupManager::GetRideGroup(rideTypeIndex, rideEntry); - if (!RideGroupManager::RideTypeHasRideGroups(rideTypeIndex) || RideGroupManager::RideGroupsAreEqual(rideGroup, irg)) { + if (!RideGroupManager::RideTypeHasRideGroups(rideTypeIndex) || rideGroup->Equals(irg)) + { _windowNewRideHighlightedItem[0] = rideItem; w->new_ride.highlighted_ride_id = rideItem.ride_type_and_entry; window_new_ride_scroll_to_focused_ride(w); @@ -1082,7 +1083,7 @@ static void window_new_ride_list_vehicles_for(const uint8 rideType, const rct_ri rideGroup = RideGroupManager::GetRideGroup(rideType, (rct_ride_entry *)rideEntry); currentRideGroup = RideGroupManager::GetRideGroup(rideType, (rct_ride_entry *)currentRideEntry); - if (!RideGroupManager::RideGroupsAreEqual(rideGroup, currentRideGroup)) + if (!rideGroup->Equals(currentRideGroup)) continue; } diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 429fa94b44..88f2d427a9 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -2732,7 +2732,7 @@ static void window_ride_vehicle_mousedown(rct_window *w, rct_widgetindex widgetI rideGroup = RideGroupManager::GetRideGroup(ride->type, rideEntry); currentRideGroup = RideGroupManager::GetRideGroup(ride->type, currentRideEntry); - if (!RideGroupManager::RideGroupsAreEqual(rideGroup, currentRideGroup)) + if (!rideGroup->Equals(currentRideGroup)) continue; } diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index b7a02b9498..6fc022ec8e 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -217,7 +217,7 @@ void research_finish_item(rct_research_item * researchItem) { const RideGroup * rideGroup = RideGroupManager::GetRideGroup(base_ride_type, rideEntry); - if (RideGroupManager::RideGroupIsInvented(rideGroup)) + if (rideGroup->IsInvented()) { ride_group_was_invented_before = true; } diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 98c3f85e61..1c9fb60a50 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -398,7 +398,7 @@ void RideObject::SetRepositoryItem(ObjectRepositoryItem * item) const if (irg != nullptr) { - if (RideGroupManager::RideGroupsAreEqual(irg, rideGroup)) + if (irg->Equals(rideGroup)) { rideGroupIndex = i; break; diff --git a/src/openrct2/ride/RideGroupManager.cpp b/src/openrct2/ride/RideGroupManager.cpp index ac282d41c8..7968cd95bd 100644 --- a/src/openrct2/ride/RideGroupManager.cpp +++ b/src/openrct2/ride/RideGroupManager.cpp @@ -103,6 +103,40 @@ static constexpr const RideGroup car_ride_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] static constexpr const RideGroup twister_rc_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { ride_group_steel_twister_rc, ride_group_hyper_twister }; static constexpr const RideGroup steel_wild_mouse_groups[MAX_RIDE_GROUPS_PER_RIDE_TYPE] = { ride_group_steel_wild_mouse, ride_group_spinning_wild_mouse }; +bool RideGroup::Equals(const RideGroup* otherRideGroup) const +{ + return + this->Naming.name == otherRideGroup->Naming.name && + this->Naming.description == otherRideGroup->Naming.description; +} + +bool RideGroup::IsInvented() const +{ + if (!ride_type_is_invented(this->RideType)) + return false; + + uint8 *rideEntryIndexPtr = get_ride_entry_indices_for_ride_type(this->RideType); + + while (*rideEntryIndexPtr != RIDE_ENTRY_INDEX_NULL) + { + uint8 rideEntryIndex = *rideEntryIndexPtr++; + + if (!ride_entry_is_invented(rideEntryIndex)) + continue; + + rct_ride_entry *rideEntry = get_ride_entry(rideEntryIndex); + const RideGroup * rideEntryRideGroup = RideGroupManager::GetRideGroup(this->RideType, rideEntry); + + if (!this->Equals(rideEntryRideGroup)) + continue; + + // The ride entry is invented and belongs to the same ride group. This means the ride group is invented. + return true; + } + + return false; +} + const RideGroup * RideGroupManager::GetRideGroup(const uint8 rideType, const rct_ride_entry * rideEntry) { switch (rideType) @@ -174,42 +208,6 @@ const RideGroup * RideGroupManager::RideGroupFind(const uint8 rideType, const ui } } -bool RideGroupManager::RideGroupsAreEqual(const RideGroup * a, const RideGroup * b) -{ - if (a != nullptr && b != nullptr && (a->Naming.name == b->Naming.name && a->Naming.description == b->Naming.description)) - { - return true; - } - return false; -} - -bool RideGroupManager::RideGroupIsInvented(const RideGroup * rideGroup) -{ - if (!ride_type_is_invented(rideGroup->RideType)) - return false; - - uint8 *rideEntryIndexPtr = get_ride_entry_indices_for_ride_type(rideGroup->RideType); - - while (*rideEntryIndexPtr != RIDE_ENTRY_INDEX_NULL) - { - uint8 rideEntryIndex = *rideEntryIndexPtr++; - - if (!ride_entry_is_invented(rideEntryIndex)) - continue; - - rct_ride_entry *rideEntry = get_ride_entry(rideEntryIndex); - const RideGroup * rideEntryRideGroup = GetRideGroup(rideGroup->RideType, rideEntry); - - if (!RideGroupsAreEqual(rideGroup, rideEntryRideGroup)) - continue; - - // The ride entry is invented and belongs to the same ride group. This means the ride group is invented. - return true; - } - - return false; -} - const std::vector RideGroupManager::GetPreferredRideEntryOrder(const uint8 rideType) { // clang-format off diff --git a/src/openrct2/ride/RideGroupManager.h b/src/openrct2/ride/RideGroupManager.h index a1cfe93f96..e43cb24626 100644 --- a/src/openrct2/ride/RideGroupManager.h +++ b/src/openrct2/ride/RideGroupManager.h @@ -31,16 +31,17 @@ struct RideGroup uint16 MaximumHeight; uint64 AvailableTrackPieces; rct_ride_name Naming; + + bool Equals(const RideGroup* otherRideGroup) const; + bool IsInvented() const; }; class RideGroupManager { - public: +public: static const RideGroup * GetRideGroup(const uint8 trackType, const rct_ride_entry * rideEntry); static bool RideTypeHasRideGroups(const uint8 trackType); static const RideGroup * RideGroupFind(const uint8 rideType, const uint8 index); - static bool RideGroupsAreEqual(const RideGroup * a, const RideGroup * b); - static bool RideGroupIsInvented(const RideGroup * rideGroup); static const std::vector GetPreferredRideEntryOrder(const uint8 rideType); static sint32 VehiclePreferenceCompare(const uint8 rideType, const char * a, const char * b); diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 681fed9723..1d5705aab2 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -1901,7 +1901,7 @@ static money32 place_track_design(sint16 x, sint16 y, sint16 z, uint8 flags, uin } const RideGroup * irg = RideGroupManager::GetRideGroup(td6->type, ire); - if (RideGroupManager::RideGroupsAreEqual(td6RideGroup, irg)) + if (td6RideGroup->Equals(irg)) { entryIndex = *rei; break; diff --git a/src/openrct2/ride/TrackDesignRepository.cpp b/src/openrct2/ride/TrackDesignRepository.cpp index 6f135254c5..66e59538c3 100644 --- a/src/openrct2/ride/TrackDesignRepository.cpp +++ b/src/openrct2/ride/TrackDesignRepository.cpp @@ -207,7 +207,7 @@ public: uint8 rideGroupIndex = (ori != nullptr) ? ori->RideGroupIndex : 0; const RideGroup * itemRideGroup = RideGroupManager::RideGroupFind(rideType, rideGroupIndex); - if (itemRideGroup != nullptr && RideGroupManager::RideGroupsAreEqual(itemRideGroup, rideGroup)) + if (itemRideGroup != nullptr && itemRideGroup->Equals(rideGroup)) { count++; } @@ -272,7 +272,7 @@ public: uint8 rideGroupIndex = (ori != nullptr) ? ori->RideGroupIndex : 0; const RideGroup * itemRideGroup = RideGroupManager::RideGroupFind(rideType, rideGroupIndex); - if (itemRideGroup != nullptr && RideGroupManager::RideGroupsAreEqual(itemRideGroup, rideGroup)) + if (itemRideGroup != nullptr && itemRideGroup->Equals(rideGroup)) { track_design_file_ref ref; ref.name = String::Duplicate(GetNameFromTrackPath(item.Path));