diff --git a/src/openrct2/object/ObjectManager.cpp b/src/openrct2/object/ObjectManager.cpp index 7da4964ef1..b5649492be 100644 --- a/src/openrct2/object/ObjectManager.cpp +++ b/src/openrct2/object/ObjectManager.cpp @@ -48,7 +48,7 @@ public: _loadedObjects.resize(OBJECT_ENTRY_COUNT); UpdateSceneryGroupIndexes(); - reset_type_to_ride_entry_index_map(); + ResetTypeToRideEntryIndexMap(); } ~ObjectManager() override @@ -134,7 +134,7 @@ public: } _loadedObjects[slot] = loadedObject; UpdateSceneryGroupIndexes(); - reset_type_to_ride_entry_index_map(); + ResetTypeToRideEntryIndexMap(); } } } @@ -165,7 +165,7 @@ public: { SetNewLoadedObjectList(std::get<1>(loadedObjects)); UpdateSceneryGroupIndexes(); - reset_type_to_ride_entry_index_map(); + ResetTypeToRideEntryIndexMap(); log_verbose("%u / %u new objects loaded", numNewLoadedObjects, requiredObjects.size()); return true; } @@ -196,7 +196,7 @@ public: if (numObjectsUnloaded > 0) { UpdateSceneryGroupIndexes(); - reset_type_to_ride_entry_index_map(); + ResetTypeToRideEntryIndexMap(); } } @@ -207,7 +207,7 @@ public: UnloadObject(object); } UpdateSceneryGroupIndexes(); - reset_type_to_ride_entry_index_map(); + ResetTypeToRideEntryIndexMap(); } void ResetObjects() override @@ -221,7 +221,7 @@ public: } } UpdateSceneryGroupIndexes(); - reset_type_to_ride_entry_index_map(); + ResetTypeToRideEntryIndexMap(); } std::vector GetPackableObjects() override @@ -546,6 +546,11 @@ private: return loadedObject; } + void ResetTypeToRideEntryIndexMap() + { + reset_type_to_ride_entry_index_map(*this); + } + static void ReportMissingObject(const rct_object_entry * entry) { utf8 objName[DAT_NAME_LENGTH + 1] = { 0 }; diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 57ce46e5a5..3305528654 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -283,23 +283,27 @@ rct_ride_entry * get_ride_entry_by_ride(Ride *ride) * * rct2: 0x006DED68 */ -void reset_type_to_ride_entry_index_map() +void reset_type_to_ride_entry_index_map(IObjectManager& objectManager) { size_t stride = MAX_RIDE_OBJECTS + 1; uint8 * entryTypeTable = (uint8 *)malloc(RIDE_TYPE_COUNT * stride); memset(entryTypeTable, 0xFF, RIDE_TYPE_COUNT * stride); for (uint8 i = 0; i < MAX_RIDE_OBJECTS; i++) { - rct_ride_entry * rideEntry = get_ride_entry(i); - if (rideEntry == nullptr) { - continue; - } - for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) { - uint8 rideType = rideEntry->ride_type[j]; - if (rideType < RIDE_TYPE_COUNT) { - uint8 * entryArray = &entryTypeTable[rideType * stride]; - uint8 * nextEntry = (uint8 *)memchr(entryArray, 0xFF, stride); - *nextEntry = i; + + auto obj = objectManager.GetLoadedObject(OBJECT_TYPE_RIDE, i); + if (obj != nullptr) + { + for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) + { + auto rideEntry = (rct_ride_entry *)obj->GetLegacyData(); + uint8 rideType = rideEntry->ride_type[j]; + if (rideType < RIDE_TYPE_COUNT) + { + uint8 * entryArray = &entryTypeTable[rideType * stride]; + uint8 * nextEntry = (uint8 *)memchr(entryArray, 0xFF, stride); + *nextEntry = i; + } } } } diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 7597cdb25d..aedce37fc8 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -25,6 +25,8 @@ #include "RideRatings.h" #include "Vehicle.h" +interface IObjectManager; + #define MAX_RIDE_TYPES_PER_RIDE_ENTRY 3 // The max number of different types of vehicle. // Examples of vehicles here are the locomotive, tender and carriage of the Miniature Railway. @@ -1038,7 +1040,7 @@ sint32 ride_get_unused_preset_vehicle_colour(uint8 ride_sub_type); void ride_set_vehicle_colours_to_random_preset(Ride *ride, uint8 preset_index); rct_ride_entry *get_ride_entry_by_ride(Ride *ride); uint8 *get_ride_entry_indices_for_ride_type(uint8 rideType); -void reset_type_to_ride_entry_index_map(); +void reset_type_to_ride_entry_index_map(IObjectManager& objectManager); void ride_measurement_clear(Ride *ride); void ride_measurements_update(); rct_ride_measurement *ride_get_measurement(sint32 rideIndex, rct_string_id *message);