diff --git a/src/openrct2/object/Object.h b/src/openrct2/object/Object.h index 7c721f1028..ddd5e16627 100644 --- a/src/openrct2/object/Object.h +++ b/src/openrct2/object/Object.h @@ -202,8 +202,6 @@ enum OBJECT_ERROR : uint32 extern sint32 object_entry_group_counts[]; extern sint32 object_entry_group_encoding[]; -extern const rct_object_entry_group object_entry_groups[]; - void object_list_load(); bool object_entry_is_empty(const rct_object_entry *entry); diff --git a/src/openrct2/object/ObjectList.cpp b/src/openrct2/object/ObjectList.cpp index 4453bdd457..cc64cbf5dc 100644 --- a/src/openrct2/object/ObjectList.cpp +++ b/src/openrct2/object/ObjectList.cpp @@ -54,46 +54,6 @@ sint32 object_entry_group_encoding[] = { CHUNK_ENCODING_RLE, CHUNK_ENCODING_ROTATE }; - - rct_ride_entry *gRideEntries[MAX_RIDE_OBJECTS]; - rct_small_scenery_entry *gSmallSceneryEntries[MAX_SMALL_SCENERY_OBJECTS]; - rct_large_scenery_entry *gLargeSceneryEntries[MAX_LARGE_SCENERY_OBJECTS]; - rct_wall_scenery_entry *gWallSceneryEntries[MAX_WALL_SCENERY_OBJECTS]; - rct_banner *gBannerSceneryEntries[MAX_BANNER_OBJECTS]; - rct_footpath_entry *gFootpathEntries[MAX_PATH_OBJECTS]; - rct_path_bit_scenery_entry *gFootpathAdditionEntries[MAX_PATH_ADDITION_OBJECTS]; - rct_scenery_group_entry *gSceneryGroupEntries[MAX_SCENERY_GROUP_OBJECTS]; - rct_entrance_type *gParkEntranceEntries[MAX_PARK_ENTRANCE_OBJECTS]; - rct_water_type *gWaterEntries[MAX_WATER_OBJECTS]; - rct_stex_entry *gStexEntries[MAX_SCENARIO_TEXT_OBJECTS]; - - static rct_object_entry _objectEntriesRides[MAX_RIDE_OBJECTS]; - static rct_object_entry _objectEntriesSmallScenery[MAX_SMALL_SCENERY_OBJECTS]; - static rct_object_entry _objectEntriesLargeScenery[MAX_LARGE_SCENERY_OBJECTS]; - static rct_object_entry _objectEntriesWalls[MAX_WALL_SCENERY_OBJECTS]; - static rct_object_entry _objectEntriesBanners[MAX_BANNER_OBJECTS]; - static rct_object_entry _objectEntriesFootpaths[MAX_PATH_OBJECTS]; - static rct_object_entry _objectEntriesFootpathAdditions[MAX_PATH_ADDITION_OBJECTS]; - static rct_object_entry _objectEntriesSceneryGroups[MAX_SCENERY_GROUP_OBJECTS]; - static rct_object_entry _objectEntriesParkEntrances[MAX_PARK_ENTRANCE_OBJECTS]; - static rct_object_entry _objectEntriesWaters[MAX_WATER_OBJECTS]; - static rct_object_entry _objectEntriesStexs[MAX_SCENARIO_TEXT_OBJECTS]; - - -// 0x98D97C chunk address', 0x98D980 object_entries -const rct_object_entry_group object_entry_groups[] = { - (void**)(gRideEntries ), _objectEntriesRides, // rides - (void**)(gSmallSceneryEntries ), _objectEntriesSmallScenery, // small scenery 0x009AD1A4, 0xF2FA3C - (void**)(gLargeSceneryEntries ), _objectEntriesLargeScenery, // large scenery 0x009AD594, 0xF40DEC - (void**)(gWallSceneryEntries ), _objectEntriesWalls, // walls 0x009AD794, 0xF417EC - (void**)(gBannerSceneryEntries ), _objectEntriesBanners, // banners 0x009AD994, 0xF421EC - (void**)(gFootpathEntries ), _objectEntriesFootpaths, // paths 0x009ADA14, 0xF4246C - (void**)(gFootpathAdditionEntries ), _objectEntriesFootpathAdditions, // path bits 0x009ADA54, 0xF425AC - (void**)(gSceneryGroupEntries ), _objectEntriesSceneryGroups, // scenery sets 0x009ADA90, 0xF426D8 - (void**)(gParkEntranceEntries ), _objectEntriesParkEntrances, // park entrance 0x009ADADC, 0xF42854 - (void**)(gWaterEntries ), _objectEntriesWaters, // water 0x009ADAE0, 0xF42868 - (void**)(gStexEntries ), _objectEntriesStexs, // scenario text 0x009ADAE4, 0xF4287C -}; // clang-format on bool object_entry_is_empty(const rct_object_entry *entry) diff --git a/src/openrct2/object/ObjectList.h b/src/openrct2/object/ObjectList.h index 69f826dd4a..c8eb729ba5 100644 --- a/src/openrct2/object/ObjectList.h +++ b/src/openrct2/object/ObjectList.h @@ -8,21 +8,8 @@ #include "../world/Water.h" #include "ObjectLimits.h" -extern rct_ride_entry *gRideEntries[MAX_RIDE_OBJECTS]; -extern rct_small_scenery_entry *gSmallSceneryEntries[MAX_SMALL_SCENERY_OBJECTS]; -extern rct_large_scenery_entry *gLargeSceneryEntries[MAX_LARGE_SCENERY_OBJECTS]; -extern rct_wall_scenery_entry *gWallSceneryEntries[MAX_WALL_SCENERY_OBJECTS]; -extern rct_banner *gBannerSceneryEntries[MAX_BANNER_OBJECTS]; -extern rct_footpath_entry *gFootpathEntries[MAX_PATH_OBJECTS]; -extern rct_path_bit_scenery_entry *gFootpathAdditionEntries[MAX_PATH_ADDITION_OBJECTS]; -extern rct_scenery_group_entry *gSceneryGroupEntries[MAX_SCENERY_GROUP_OBJECTS]; -extern rct_entrance_type *gParkEntranceEntries[MAX_PARK_ENTRANCE_OBJECTS]; -extern rct_water_type *gWaterEntries[MAX_WATER_OBJECTS]; -extern rct_stex_entry *gStexEntries[MAX_SCENARIO_TEXT_OBJECTS]; - void get_type_entry_index(size_t index, uint8 * outObjectType, uint8 * outEntryIndex); const rct_object_entry * get_loaded_object_entry(size_t index); void * get_loaded_object_chunk(size_t index); uint8 object_entry_get_type(const rct_object_entry * objectEntry); uint8 object_entry_get_source_game(const rct_object_entry * objectEntry); - diff --git a/src/openrct2/object/ObjectManager.cpp b/src/openrct2/object/ObjectManager.cpp index 5ed03cbf45..120521c703 100644 --- a/src/openrct2/object/ObjectManager.cpp +++ b/src/openrct2/object/ObjectManager.cpp @@ -50,7 +50,6 @@ public: _loadedObjects[i] = nullptr; } - UpdateLegacyLoadedObjectList(); UpdateSceneryGroupIndexes(); reset_type_to_ride_entry_index_map(); } @@ -62,6 +61,13 @@ public: Object * GetLoadedObject(size_t index) override { + if (index >= OBJECT_ENTRY_COUNT) + { +#ifdef DEBUG + log_warning("Object index %u exceeds maximum of %d.", index, OBJECT_ENTRY_COUNT); +#endif + return nullptr; + } if (_loadedObjects == nullptr) { return nullptr; @@ -71,6 +77,14 @@ public: Object * GetLoadedObject(sint32 objectType, size_t index) override { + if (index >= (size_t)object_entry_group_counts[objectType]) + { +#ifdef DEBUG + log_warning("Object index %u exceeds maximum for type type %d.", index, objectType); +#endif + return nullptr; + } + size_t objectIndex = index; for (sint32 i = 0; i < objectType; i++) { @@ -118,7 +132,6 @@ public: if (loadedObject != nullptr) { _loadedObjects[slot] = loadedObject; - UpdateLegacyLoadedObjectList(); UpdateSceneryGroupIndexes(); reset_type_to_ride_entry_index_map(); } @@ -153,7 +166,6 @@ public: else { SetNewLoadedObjectList(loadedObjects); - UpdateLegacyLoadedObjectList(); UpdateSceneryGroupIndexes(); reset_type_to_ride_entry_index_map(); log_verbose("%u / %u new objects loaded", numNewLoadedObjects, numRequiredObjects); @@ -185,7 +197,6 @@ public: if (numObjectsUnloaded > 0) { - UpdateLegacyLoadedObjectList(); UpdateSceneryGroupIndexes(); reset_type_to_ride_entry_index_map(); } @@ -200,7 +211,6 @@ public: UnloadObject(_loadedObjects[i]); } } - UpdateLegacyLoadedObjectList(); UpdateSceneryGroupIndexes(); reset_type_to_ride_entry_index_map(); } @@ -218,7 +228,6 @@ public: loadedObject->Load(); } } - UpdateLegacyLoadedObjectList(); UpdateSceneryGroupIndexes(); reset_type_to_ride_entry_index_map(); } @@ -382,31 +391,6 @@ private: log_verbose("%u / %u objects unloaded", numObjectsUnloaded, totalObjectsLoaded); } - void UpdateLegacyLoadedObjectList() - { - for (sint32 i = 0; i < OBJECT_ENTRY_COUNT; i++) - { - Object * loadedObject = nullptr; - if (_loadedObjects != nullptr) - { - loadedObject = _loadedObjects[i]; - } - - uint8 objectType, entryIndex; - get_type_entry_index(i, &objectType, &entryIndex); - - void * * legacyChunk = &object_entry_groups[objectType].chunks[entryIndex]; - if (loadedObject == nullptr) - { - *legacyChunk = nullptr; - } - else - { - *legacyChunk = loadedObject->GetLegacyData(); - } - } - } - void UpdateSceneryGroupIndexes() { if (_loadedObjects != nullptr) diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 0cbd92c139..778d1093fc 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -35,6 +35,7 @@ #include "../management/NewsItem.h" #include "../network/network.h" #include "../object/ObjectList.h" +#include "../object/ObjectManager.h" #include "../OpenRCT2.h" #include "../peep/Peep.h" #include "../peep/Staff.h" @@ -233,13 +234,17 @@ Ride *get_ride(sint32 index) rct_ride_entry * get_ride_entry(sint32 index) { - if (index < 0 || index >= object_entry_group_counts[OBJECT_TYPE_RIDE]) + rct_ride_entry * result = nullptr; + auto objMgr = GetObjectManager(); + if (objMgr != nullptr) { - log_error("invalid index %d for ride type", index); - return nullptr; + auto obj = objMgr->GetLoadedObject(OBJECT_TYPE_RIDE, index); + if (obj != nullptr) + { + result = (rct_ride_entry *)obj->GetLegacyData(); + } } - - return gRideEntries[index]; + return result; } void get_ride_entry_name(char *name, sint32 index) diff --git a/src/openrct2/world/Footpath.cpp b/src/openrct2/world/Footpath.cpp index c5359c4447..ead8fb4aee 100644 --- a/src/openrct2/world/Footpath.cpp +++ b/src/openrct2/world/Footpath.cpp @@ -21,6 +21,7 @@ #include "../localisation/Localisation.h" #include "../network/network.h" #include "../object/ObjectList.h" +#include "../object/ObjectManager.h" #include "../OpenRCT2.h" #include "../ride/Station.h" #include "../ride/Track.h" @@ -2273,7 +2274,17 @@ void footpath_remove_edges_at(sint32 x, sint32 y, rct_tile_element *tileElement) rct_footpath_entry *get_footpath_entry(sint32 entryIndex) { - return gFootpathEntries[entryIndex]; + rct_footpath_entry * result = nullptr; + auto objMgr = GetObjectManager(); + if (objMgr != nullptr) + { + auto obj = objMgr->GetLoadedObject(OBJECT_TYPE_PATHS, entryIndex); + if (obj != nullptr) + { + result = (rct_footpath_entry *)obj->GetLegacyData(); + } + } + return result; } uint8 footpath_get_edges(const rct_tile_element * element) diff --git a/src/openrct2/world/Scenery.cpp b/src/openrct2/world/Scenery.cpp index 6e6c3901e7..e6098fcb31 100644 --- a/src/openrct2/world/Scenery.cpp +++ b/src/openrct2/world/Scenery.cpp @@ -20,6 +20,7 @@ #include "../localisation/Localisation.h" #include "../network/network.h" #include "../object/ObjectList.h" +#include "../object/ObjectManager.h" #include "../scenario/Scenario.h" #include "Climate.h" #include "Footpath.h" @@ -279,50 +280,92 @@ void scenery_remove_ghost_tool_placement(){ rct_scenery_entry *get_small_scenery_entry(sint32 entryIndex) { - if (entryIndex >= object_entry_group_counts[OBJECT_TYPE_SMALL_SCENERY]) { - return nullptr; + rct_scenery_entry * result = nullptr; + auto objMgr = GetObjectManager(); + if (objMgr != nullptr) + { + auto obj = objMgr->GetLoadedObject(OBJECT_TYPE_SMALL_SCENERY, entryIndex); + if (obj != nullptr) + { + result = (rct_scenery_entry *)obj->GetLegacyData(); + } } - return (rct_scenery_entry*)gSmallSceneryEntries[entryIndex]; + return result; } rct_scenery_entry *get_large_scenery_entry(sint32 entryIndex) { - if (entryIndex >= object_entry_group_counts[OBJECT_TYPE_LARGE_SCENERY]) { - return nullptr; + rct_scenery_entry * result = nullptr; + auto objMgr = GetObjectManager(); + if (objMgr != nullptr) + { + auto obj = objMgr->GetLoadedObject(OBJECT_TYPE_LARGE_SCENERY, entryIndex); + if (obj != nullptr) + { + result = (rct_scenery_entry *)obj->GetLegacyData(); + } } - return (rct_scenery_entry*)gLargeSceneryEntries[entryIndex]; + return result; } rct_scenery_entry *get_wall_entry(sint32 entryIndex) { - if (entryIndex >= object_entry_group_counts[OBJECT_TYPE_WALLS]) { - return nullptr; + rct_scenery_entry * result = nullptr; + auto objMgr = GetObjectManager(); + if (objMgr != nullptr) + { + auto obj = objMgr->GetLoadedObject(OBJECT_TYPE_WALLS, entryIndex); + if (obj != nullptr) + { + result = (rct_scenery_entry *)obj->GetLegacyData(); + } } - return (rct_scenery_entry*)gWallSceneryEntries[entryIndex]; + return result; } rct_scenery_entry *get_banner_entry(sint32 entryIndex) { - if (entryIndex >= object_entry_group_counts[OBJECT_TYPE_BANNERS]) { - return nullptr; + rct_scenery_entry * result = nullptr; + auto objMgr = GetObjectManager(); + if (objMgr != nullptr) + { + auto obj = objMgr->GetLoadedObject(OBJECT_TYPE_BANNERS, entryIndex); + if (obj != nullptr) + { + result = (rct_scenery_entry *)obj->GetLegacyData(); + } } - return (rct_scenery_entry*)gBannerSceneryEntries[entryIndex]; + return result; } rct_scenery_entry *get_footpath_item_entry(sint32 entryIndex) { - if (entryIndex >= object_entry_group_counts[OBJECT_TYPE_PATH_BITS]) { - return nullptr; + rct_scenery_entry * result = nullptr; + auto objMgr = GetObjectManager(); + if (objMgr != nullptr) + { + auto obj = objMgr->GetLoadedObject(OBJECT_TYPE_PATH_BITS, entryIndex); + if (obj != nullptr) + { + result = (rct_scenery_entry *)obj->GetLegacyData(); + } } - return (rct_scenery_entry*)gFootpathAdditionEntries[entryIndex]; + return result; } rct_scenery_group_entry *get_scenery_group_entry(sint32 entryIndex) { - if (entryIndex >= object_entry_group_counts[OBJECT_TYPE_SCENERY_GROUP]) { - return nullptr; + rct_scenery_group_entry * result = nullptr; + auto objMgr = GetObjectManager(); + if (objMgr != nullptr) + { + auto obj = objMgr->GetLoadedObject(OBJECT_TYPE_SCENERY_GROUP, entryIndex); + if (obj != nullptr) + { + result = (rct_scenery_group_entry *)obj->GetLegacyData(); + } } - return (rct_scenery_group_entry*)gSceneryGroupEntries[entryIndex]; + return result; } sint32 get_scenery_id_from_entry_index(uint8 objectType, sint32 entryIndex)