From ef6768dd33af3fcc696e28395bb463ecdcae1dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 8 Sep 2021 19:18:24 +0300 Subject: [PATCH 1/8] Segment the object arrays in rct_s6_data --- src/openrct2/rct2/RCT2.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/openrct2/rct2/RCT2.h b/src/openrct2/rct2/RCT2.h index 84218c1cf5..73cffc8e7f 100644 --- a/src/openrct2/rct2/RCT2.h +++ b/src/openrct2/rct2/RCT2.h @@ -836,7 +836,24 @@ struct rct_s6_data // packed objects // SC6[3] - rct_object_entry objects[RCT2_OBJECT_ENTRY_COUNT]; + union + { + rct_object_entry objects[RCT2_OBJECT_ENTRY_COUNT]; + struct + { + rct_object_entry rideObjects[RCT12_MAX_RIDE_OBJECTS]; + rct_object_entry sceneryObjects[RCT2_MAX_SMALL_SCENERY_OBJECTS]; + rct_object_entry largeSceneryObjects[RCT2_MAX_LARGE_SCENERY_OBJECTS]; + rct_object_entry wallSceneryObjects[RCT2_MAX_WALL_SCENERY_OBJECTS]; + rct_object_entry bannerObjects[RCT2_MAX_BANNER_OBJECTS]; + rct_object_entry pathObjects[RCT2_MAX_PATH_OBJECTS]; + rct_object_entry pathAdditionObjects[RCT2_MAX_PATH_ADDITION_OBJECTS]; + rct_object_entry sceneryGroupObjects[RCT2_MAX_SCENERY_GROUP_OBJECTS]; + rct_object_entry parkEntranceObjects[RCT2_MAX_PARK_ENTRANCE_OBJECTS]; + rct_object_entry waterObjects[RCT2_MAX_WATER_OBJECTS]; + rct_object_entry scenarioTextObjects[RCT2_MAX_SCENARIO_TEXT_OBJECTS]; + }; + }; // SC6[4] uint16_t elapsed_months; From b1ba29716d6904c16ce0cb0eaf147f34a649bbe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 8 Sep 2021 19:42:30 +0300 Subject: [PATCH 2/8] Refactor import of s6 objects --- src/openrct2/rct2/S6Importer.cpp | 44 ++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 1ae9885831..a718b7f882 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -169,9 +169,10 @@ public: _isSV7 = _stricmp(extension, ".sv7") == 0; } + chunkReader.ReadChunk(&_s6.objects, sizeof(_s6.objects)); + if (isScenario) { - chunkReader.ReadChunk(&_s6.objects, sizeof(_s6.objects)); chunkReader.ReadChunk(&_s6.elapsed_months, 16); chunkReader.ReadChunk(&_s6.tile_elements, sizeof(_s6.tile_elements)); chunkReader.ReadChunk(&_s6.next_free_tile_element_pointer_index, 2560076); @@ -185,7 +186,6 @@ public: } else { - chunkReader.ReadChunk(&_s6.objects, sizeof(_s6.objects)); chunkReader.ReadChunk(&_s6.elapsed_months, 16); chunkReader.ReadChunk(&_s6.tile_elements, sizeof(_s6.tile_elements)); chunkReader.ReadChunk(&_s6.next_free_tile_element_pointer_index, 3048816); @@ -1563,25 +1563,41 @@ public: return justText.data(); } - std::vector GetRequiredObjects() + template + static void AddRequiredObjects(std::vector& required, const T& list, size_t internalLimit) { - std::vector result; rct_object_entry nullEntry = {}; std::memset(&nullEntry, 0xFF, sizeof(nullEntry)); - int objectIt = 0; - for (int16_t objectType = EnumValue(ObjectType::Ride); objectType <= EnumValue(ObjectType::Water); objectType++) + for (const auto& entry : list) { - for (int16_t i = 0; i < rct2_object_entry_group_counts[objectType]; i++, objectIt++) - { - result.push_back(_s6.objects[objectIt]); - } - for (int16_t i = rct2_object_entry_group_counts[objectType]; i < object_entry_group_counts[objectType]; i++) - { - result.push_back(nullEntry); - } + required.push_back(entry); } + // NOTE: The segment of this object type needs to be filled to the internal limit + // the object manager currently expects this. + for (size_t i = std::size(list); i < internalLimit; i++) + { + required.push_back(nullEntry); + } + } + + std::vector GetRequiredObjects() + { + std::vector result; + + AddRequiredObjects(result, _s6.rideObjects, MAX_RIDE_OBJECTS); + AddRequiredObjects(result, _s6.sceneryObjects, MAX_SMALL_SCENERY_OBJECTS); + AddRequiredObjects(result, _s6.largeSceneryObjects, MAX_LARGE_SCENERY_OBJECTS); + AddRequiredObjects(result, _s6.wallSceneryObjects, MAX_WALL_SCENERY_OBJECTS); + AddRequiredObjects(result, _s6.bannerObjects, MAX_BANNER_OBJECTS); + AddRequiredObjects(result, _s6.pathObjects, MAX_PATH_OBJECTS); + AddRequiredObjects(result, _s6.pathAdditionObjects, MAX_PATH_ADDITION_OBJECTS); + AddRequiredObjects(result, _s6.sceneryGroupObjects, MAX_SCENERY_GROUP_OBJECTS); + AddRequiredObjects(result, _s6.parkEntranceObjects, MAX_PARK_ENTRANCE_OBJECTS); + AddRequiredObjects(result, _s6.waterObjects, MAX_WATER_OBJECTS); + AddRequiredObjects(result, _s6.scenarioTextObjects, MAX_SCENARIO_TEXT_OBJECTS); + return result; } }; From 47d163322400a3b7ff0080a80042c84fe68e50d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Wed, 8 Sep 2021 21:14:16 +0300 Subject: [PATCH 3/8] Refactor Export --- src/openrct2/rct2/S6Exporter.cpp | 44 ++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index d646534def..e0d28d1986 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -255,6 +255,24 @@ static void scenario_fix_ghosts(rct_s6_data* s6) } } +template static void ExportObjectList(IObjectManager& objMgr, T& objects, ObjectType type, size_t maxEntries) +{ + for (size_t i = 0; i < maxEntries; i++) + { + auto& dst = objects[i]; + + auto* object = objMgr.GetLoadedObject(type, i); + if (object == nullptr || object->GetObjectEntry() == nullptr) + { + std::memset(&dst, 0xFF, sizeof(dst)); + } + else + { + dst = *object->GetObjectEntry(); + } + } +} + void S6Exporter::Export() { _s6.info = {}; @@ -278,20 +296,18 @@ void S6Exporter::Export() uint32_t researchedTrackPiecesA[128] = {}; uint32_t researchedTrackPiecesB[128] = {}; - for (int32_t i = 0; i < RCT2_OBJECT_ENTRY_COUNT; i++) - { - const rct_object_entry* entry = get_loaded_object_entry(i); - void* entryData = get_loaded_object_chunk(i); - // RCT2 uses (void *)-1 to mark NULL. Make sure it's written in a vanilla-compatible way. - if (entry == nullptr || entryData == nullptr || entryData == reinterpret_cast(-1)) - { - std::memset(&_s6.objects[i], 0xFF, sizeof(rct_object_entry)); - } - else - { - _s6.objects[i] = *entry; - } - } + auto& objectMgr = OpenRCT2::GetContext()->GetObjectManager(); + ExportObjectList(objectMgr, _s6.rideObjects, ObjectType::Ride, RCT12_MAX_RIDE_OBJECTS); + ExportObjectList(objectMgr, _s6.sceneryObjects, ObjectType::SmallScenery, RCT2_MAX_SMALL_SCENERY_OBJECTS); + ExportObjectList(objectMgr, _s6.largeSceneryObjects, ObjectType::LargeScenery, RCT2_MAX_LARGE_SCENERY_OBJECTS); + ExportObjectList(objectMgr, _s6.wallSceneryObjects, ObjectType::Walls, RCT2_MAX_WALL_SCENERY_OBJECTS); + ExportObjectList(objectMgr, _s6.bannerObjects, ObjectType::Banners, RCT2_MAX_BANNER_OBJECTS); + ExportObjectList(objectMgr, _s6.pathObjects, ObjectType::Paths, RCT2_MAX_PATH_OBJECTS); + ExportObjectList(objectMgr, _s6.pathAdditionObjects, ObjectType::PathBits, RCT2_MAX_PATH_ADDITION_OBJECTS); + ExportObjectList(objectMgr, _s6.sceneryGroupObjects, ObjectType::SceneryGroup, RCT2_MAX_SCENERY_GROUP_OBJECTS); + ExportObjectList(objectMgr, _s6.parkEntranceObjects, ObjectType::ParkEntrance, RCT2_MAX_PARK_ENTRANCE_OBJECTS); + ExportObjectList(objectMgr, _s6.waterObjects, ObjectType::Water, RCT2_MAX_WATER_OBJECTS); + ExportObjectList(objectMgr, _s6.scenarioTextObjects, ObjectType::ScenarioText, RCT2_MAX_SCENARIO_TEXT_OBJECTS); _s6.elapsed_months = static_cast(gDateMonthsElapsed); _s6.current_day = gDateMonthTicks; From e3f39bf5540d33ef3695c9d49e807b7f183d8a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 9 Sep 2021 02:20:02 +0300 Subject: [PATCH 4/8] Use PascalCase for object members --- src/openrct2/rct2/RCT2.h | 24 ++++++++++++------------ src/openrct2/rct2/S6Exporter.cpp | 24 ++++++++++++------------ src/openrct2/rct2/S6Importer.cpp | 24 ++++++++++++------------ 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/openrct2/rct2/RCT2.h b/src/openrct2/rct2/RCT2.h index 73cffc8e7f..22575fe640 100644 --- a/src/openrct2/rct2/RCT2.h +++ b/src/openrct2/rct2/RCT2.h @@ -838,20 +838,20 @@ struct rct_s6_data // SC6[3] union { - rct_object_entry objects[RCT2_OBJECT_ENTRY_COUNT]; + rct_object_entry Objects[RCT2_OBJECT_ENTRY_COUNT]; struct { - rct_object_entry rideObjects[RCT12_MAX_RIDE_OBJECTS]; - rct_object_entry sceneryObjects[RCT2_MAX_SMALL_SCENERY_OBJECTS]; - rct_object_entry largeSceneryObjects[RCT2_MAX_LARGE_SCENERY_OBJECTS]; - rct_object_entry wallSceneryObjects[RCT2_MAX_WALL_SCENERY_OBJECTS]; - rct_object_entry bannerObjects[RCT2_MAX_BANNER_OBJECTS]; - rct_object_entry pathObjects[RCT2_MAX_PATH_OBJECTS]; - rct_object_entry pathAdditionObjects[RCT2_MAX_PATH_ADDITION_OBJECTS]; - rct_object_entry sceneryGroupObjects[RCT2_MAX_SCENERY_GROUP_OBJECTS]; - rct_object_entry parkEntranceObjects[RCT2_MAX_PARK_ENTRANCE_OBJECTS]; - rct_object_entry waterObjects[RCT2_MAX_WATER_OBJECTS]; - rct_object_entry scenarioTextObjects[RCT2_MAX_SCENARIO_TEXT_OBJECTS]; + rct_object_entry RideObjects[RCT12_MAX_RIDE_OBJECTS]; + rct_object_entry SceneryObjects[RCT2_MAX_SMALL_SCENERY_OBJECTS]; + rct_object_entry LargeSceneryObjects[RCT2_MAX_LARGE_SCENERY_OBJECTS]; + rct_object_entry WallSceneryObjects[RCT2_MAX_WALL_SCENERY_OBJECTS]; + rct_object_entry BannerObjects[RCT2_MAX_BANNER_OBJECTS]; + rct_object_entry PathObjects[RCT2_MAX_PATH_OBJECTS]; + rct_object_entry PathAdditionObjects[RCT2_MAX_PATH_ADDITION_OBJECTS]; + rct_object_entry SceneryGroupObjects[RCT2_MAX_SCENERY_GROUP_OBJECTS]; + rct_object_entry ParkEntranceObjects[RCT2_MAX_PARK_ENTRANCE_OBJECTS]; + rct_object_entry WaterObjects[RCT2_MAX_WATER_OBJECTS]; + rct_object_entry ScenarioTextObjects[RCT2_MAX_SCENARIO_TEXT_OBJECTS]; }; }; diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index e0d28d1986..a101fe8d18 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -120,7 +120,7 @@ void S6Exporter::Save(OpenRCT2::IStream* stream, bool isScenario) } // 3: Write available objects chunk - chunkWriter.WriteChunk(_s6.objects, sizeof(_s6.objects), SAWYER_ENCODING::ROTATE); + chunkWriter.WriteChunk(_s6.Objects, sizeof(_s6.Objects), SAWYER_ENCODING::ROTATE); // 4: Misc fields (data, rand...) chunk chunkWriter.WriteChunk(&_s6.elapsed_months, 16, SAWYER_ENCODING::RLECOMPRESSED); @@ -297,17 +297,17 @@ void S6Exporter::Export() uint32_t researchedTrackPiecesB[128] = {}; auto& objectMgr = OpenRCT2::GetContext()->GetObjectManager(); - ExportObjectList(objectMgr, _s6.rideObjects, ObjectType::Ride, RCT12_MAX_RIDE_OBJECTS); - ExportObjectList(objectMgr, _s6.sceneryObjects, ObjectType::SmallScenery, RCT2_MAX_SMALL_SCENERY_OBJECTS); - ExportObjectList(objectMgr, _s6.largeSceneryObjects, ObjectType::LargeScenery, RCT2_MAX_LARGE_SCENERY_OBJECTS); - ExportObjectList(objectMgr, _s6.wallSceneryObjects, ObjectType::Walls, RCT2_MAX_WALL_SCENERY_OBJECTS); - ExportObjectList(objectMgr, _s6.bannerObjects, ObjectType::Banners, RCT2_MAX_BANNER_OBJECTS); - ExportObjectList(objectMgr, _s6.pathObjects, ObjectType::Paths, RCT2_MAX_PATH_OBJECTS); - ExportObjectList(objectMgr, _s6.pathAdditionObjects, ObjectType::PathBits, RCT2_MAX_PATH_ADDITION_OBJECTS); - ExportObjectList(objectMgr, _s6.sceneryGroupObjects, ObjectType::SceneryGroup, RCT2_MAX_SCENERY_GROUP_OBJECTS); - ExportObjectList(objectMgr, _s6.parkEntranceObjects, ObjectType::ParkEntrance, RCT2_MAX_PARK_ENTRANCE_OBJECTS); - ExportObjectList(objectMgr, _s6.waterObjects, ObjectType::Water, RCT2_MAX_WATER_OBJECTS); - ExportObjectList(objectMgr, _s6.scenarioTextObjects, ObjectType::ScenarioText, RCT2_MAX_SCENARIO_TEXT_OBJECTS); + ExportObjectList(objectMgr, _s6.RideObjects, ObjectType::Ride, RCT12_MAX_RIDE_OBJECTS); + ExportObjectList(objectMgr, _s6.SceneryObjects, ObjectType::SmallScenery, RCT2_MAX_SMALL_SCENERY_OBJECTS); + ExportObjectList(objectMgr, _s6.LargeSceneryObjects, ObjectType::LargeScenery, RCT2_MAX_LARGE_SCENERY_OBJECTS); + ExportObjectList(objectMgr, _s6.WallSceneryObjects, ObjectType::Walls, RCT2_MAX_WALL_SCENERY_OBJECTS); + ExportObjectList(objectMgr, _s6.BannerObjects, ObjectType::Banners, RCT2_MAX_BANNER_OBJECTS); + ExportObjectList(objectMgr, _s6.PathObjects, ObjectType::Paths, RCT2_MAX_PATH_OBJECTS); + ExportObjectList(objectMgr, _s6.PathAdditionObjects, ObjectType::PathBits, RCT2_MAX_PATH_ADDITION_OBJECTS); + ExportObjectList(objectMgr, _s6.SceneryGroupObjects, ObjectType::SceneryGroup, RCT2_MAX_SCENERY_GROUP_OBJECTS); + ExportObjectList(objectMgr, _s6.ParkEntranceObjects, ObjectType::ParkEntrance, RCT2_MAX_PARK_ENTRANCE_OBJECTS); + ExportObjectList(objectMgr, _s6.WaterObjects, ObjectType::Water, RCT2_MAX_WATER_OBJECTS); + ExportObjectList(objectMgr, _s6.ScenarioTextObjects, ObjectType::ScenarioText, RCT2_MAX_SCENARIO_TEXT_OBJECTS); _s6.elapsed_months = static_cast(gDateMonthsElapsed); _s6.current_day = gDateMonthTicks; diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index a718b7f882..32fe1918b3 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -169,7 +169,7 @@ public: _isSV7 = _stricmp(extension, ".sv7") == 0; } - chunkReader.ReadChunk(&_s6.objects, sizeof(_s6.objects)); + chunkReader.ReadChunk(&_s6.Objects, sizeof(_s6.Objects)); if (isScenario) { @@ -1586,17 +1586,17 @@ public: { std::vector result; - AddRequiredObjects(result, _s6.rideObjects, MAX_RIDE_OBJECTS); - AddRequiredObjects(result, _s6.sceneryObjects, MAX_SMALL_SCENERY_OBJECTS); - AddRequiredObjects(result, _s6.largeSceneryObjects, MAX_LARGE_SCENERY_OBJECTS); - AddRequiredObjects(result, _s6.wallSceneryObjects, MAX_WALL_SCENERY_OBJECTS); - AddRequiredObjects(result, _s6.bannerObjects, MAX_BANNER_OBJECTS); - AddRequiredObjects(result, _s6.pathObjects, MAX_PATH_OBJECTS); - AddRequiredObjects(result, _s6.pathAdditionObjects, MAX_PATH_ADDITION_OBJECTS); - AddRequiredObjects(result, _s6.sceneryGroupObjects, MAX_SCENERY_GROUP_OBJECTS); - AddRequiredObjects(result, _s6.parkEntranceObjects, MAX_PARK_ENTRANCE_OBJECTS); - AddRequiredObjects(result, _s6.waterObjects, MAX_WATER_OBJECTS); - AddRequiredObjects(result, _s6.scenarioTextObjects, MAX_SCENARIO_TEXT_OBJECTS); + AddRequiredObjects(result, _s6.RideObjects, MAX_RIDE_OBJECTS); + AddRequiredObjects(result, _s6.SceneryObjects, MAX_SMALL_SCENERY_OBJECTS); + AddRequiredObjects(result, _s6.LargeSceneryObjects, MAX_LARGE_SCENERY_OBJECTS); + AddRequiredObjects(result, _s6.WallSceneryObjects, MAX_WALL_SCENERY_OBJECTS); + AddRequiredObjects(result, _s6.BannerObjects, MAX_BANNER_OBJECTS); + AddRequiredObjects(result, _s6.PathObjects, MAX_PATH_OBJECTS); + AddRequiredObjects(result, _s6.PathAdditionObjects, MAX_PATH_ADDITION_OBJECTS); + AddRequiredObjects(result, _s6.SceneryGroupObjects, MAX_SCENERY_GROUP_OBJECTS); + AddRequiredObjects(result, _s6.ParkEntranceObjects, MAX_PARK_ENTRANCE_OBJECTS); + AddRequiredObjects(result, _s6.WaterObjects, MAX_WATER_OBJECTS); + AddRequiredObjects(result, _s6.ScenarioTextObjects, MAX_SCENARIO_TEXT_OBJECTS); return result; } From c416c7ca278fad8554bec384b250d900a02dcf73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 9 Sep 2021 03:21:43 +0300 Subject: [PATCH 5/8] Remove unused function get_loaded_object_chunk --- src/openrct2/object/ObjectList.cpp | 8 -------- src/openrct2/object/ObjectList.h | 1 - 2 files changed, 9 deletions(-) diff --git a/src/openrct2/object/ObjectList.cpp b/src/openrct2/object/ObjectList.cpp index 76f1a92a74..186401ae65 100644 --- a/src/openrct2/object/ObjectList.cpp +++ b/src/openrct2/object/ObjectList.cpp @@ -151,14 +151,6 @@ const rct_object_entry* get_loaded_object_entry(size_t index) return obj->GetObjectEntry(); } -void* get_loaded_object_chunk(size_t index) -{ - ObjectType objectType; - ObjectEntryIndex entryIndex; - get_type_entry_index(index, &objectType, &entryIndex); - return object_entry_get_chunk(objectType, entryIndex); -} - void object_entry_get_name_fixed(utf8* buffer, size_t bufferSize, const rct_object_entry* entry) { bufferSize = std::min(static_cast(DAT_NAME_LENGTH) + 1, bufferSize); diff --git a/src/openrct2/object/ObjectList.h b/src/openrct2/object/ObjectList.h index 62cbe2cdca..ad5b8378ed 100644 --- a/src/openrct2/object/ObjectList.h +++ b/src/openrct2/object/ObjectList.h @@ -19,4 +19,3 @@ void get_type_entry_index(size_t index, ObjectType* outObjectType, ObjectEntryIndex* outEntryIndex); const rct_object_entry* get_loaded_object_entry(size_t index); -void* get_loaded_object_chunk(size_t index); From 38ec042a52caefd1e51109b36c271c1020b72bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 9 Sep 2021 03:26:52 +0300 Subject: [PATCH 6/8] Refactor object_entry_get_chunk wrapper --- src/openrct2/object/ObjectList.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/openrct2/object/ObjectList.cpp b/src/openrct2/object/ObjectList.cpp index 186401ae65..d27e33386a 100644 --- a/src/openrct2/object/ObjectList.cpp +++ b/src/openrct2/object/ObjectList.cpp @@ -160,20 +160,13 @@ void object_entry_get_name_fixed(utf8* buffer, size_t bufferSize, const rct_obje void* object_entry_get_chunk(ObjectType objectType, ObjectEntryIndex index) { - ObjectEntryIndex objectIndex = index; - for (int32_t i = 0; i < EnumValue(objectType); i++) - { - objectIndex += object_entry_group_counts[i]; - } - - void* result = nullptr; auto& objectMgr = OpenRCT2::GetContext()->GetObjectManager(); - auto obj = objectMgr.GetLoadedObject(objectIndex); - if (obj != nullptr) + auto* object = objectMgr.GetLoadedObject(objectType, index); + if (object != nullptr) { - result = obj->GetLegacyData(); + return object->GetLegacyData(); } - return result; + return nullptr; } const Object* object_entry_get_object(ObjectType objectType, ObjectEntryIndex index) From 50d7b8bb1c518e5bb5a6ceb04498f97e210dff50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Thu, 9 Sep 2021 03:27:24 +0300 Subject: [PATCH 7/8] Remove unused function get_loaded_object_entry --- src/openrct2/object/ObjectList.cpp | 14 -------------- src/openrct2/object/ObjectList.h | 1 - 2 files changed, 15 deletions(-) diff --git a/src/openrct2/object/ObjectList.cpp b/src/openrct2/object/ObjectList.cpp index d27e33386a..ab94ef62f4 100644 --- a/src/openrct2/object/ObjectList.cpp +++ b/src/openrct2/object/ObjectList.cpp @@ -137,20 +137,6 @@ void get_type_entry_index(size_t index, ObjectType* outObjectType, ObjectEntryIn *outEntryIndex = static_cast(index); } -const rct_object_entry* get_loaded_object_entry(size_t index) -{ - ObjectType objectType; - ObjectEntryIndex entryIndex; - get_type_entry_index(index, &objectType, &entryIndex); - auto obj = object_entry_get_object(objectType, entryIndex); - if (obj == nullptr) - { - return nullptr; - } - - return obj->GetObjectEntry(); -} - void object_entry_get_name_fixed(utf8* buffer, size_t bufferSize, const rct_object_entry* entry) { bufferSize = std::min(static_cast(DAT_NAME_LENGTH) + 1, bufferSize); diff --git a/src/openrct2/object/ObjectList.h b/src/openrct2/object/ObjectList.h index ad5b8378ed..b1048fd82c 100644 --- a/src/openrct2/object/ObjectList.h +++ b/src/openrct2/object/ObjectList.h @@ -18,4 +18,3 @@ #include "ObjectLimits.h" void get_type_entry_index(size_t index, ObjectType* outObjectType, ObjectEntryIndex* outEntryIndex); -const rct_object_entry* get_loaded_object_entry(size_t index); From c9e2c9f4d2dfce25c9acc63a4cb864c4994a1058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sat, 11 Sep 2021 17:10:11 +0300 Subject: [PATCH 8/8] Apply review suggestions --- src/openrct2/rct2/S6Exporter.cpp | 30 ++++++++++++++++-------------- src/openrct2/rct2/S6Importer.cpp | 28 ++++++++++++++-------------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index a101fe8d18..2b155cc33f 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -255,15 +255,17 @@ static void scenario_fix_ghosts(rct_s6_data* s6) } } -template static void ExportObjectList(IObjectManager& objMgr, T& objects, ObjectType type, size_t maxEntries) +template +static void ExportObjectList(IObjectManager& objMgr, T& objects) { - for (size_t i = 0; i < maxEntries; i++) + for (size_t i = 0; i < TMaxEntries; i++) { auto& dst = objects[i]; - auto* object = objMgr.GetLoadedObject(type, i); + const auto* object = objMgr.GetLoadedObject(TObjectType, i); if (object == nullptr || object->GetObjectEntry() == nullptr) { + // The sv6 format expects null/invalid entries to be filled with 0xFF. std::memset(&dst, 0xFF, sizeof(dst)); } else @@ -297,17 +299,17 @@ void S6Exporter::Export() uint32_t researchedTrackPiecesB[128] = {}; auto& objectMgr = OpenRCT2::GetContext()->GetObjectManager(); - ExportObjectList(objectMgr, _s6.RideObjects, ObjectType::Ride, RCT12_MAX_RIDE_OBJECTS); - ExportObjectList(objectMgr, _s6.SceneryObjects, ObjectType::SmallScenery, RCT2_MAX_SMALL_SCENERY_OBJECTS); - ExportObjectList(objectMgr, _s6.LargeSceneryObjects, ObjectType::LargeScenery, RCT2_MAX_LARGE_SCENERY_OBJECTS); - ExportObjectList(objectMgr, _s6.WallSceneryObjects, ObjectType::Walls, RCT2_MAX_WALL_SCENERY_OBJECTS); - ExportObjectList(objectMgr, _s6.BannerObjects, ObjectType::Banners, RCT2_MAX_BANNER_OBJECTS); - ExportObjectList(objectMgr, _s6.PathObjects, ObjectType::Paths, RCT2_MAX_PATH_OBJECTS); - ExportObjectList(objectMgr, _s6.PathAdditionObjects, ObjectType::PathBits, RCT2_MAX_PATH_ADDITION_OBJECTS); - ExportObjectList(objectMgr, _s6.SceneryGroupObjects, ObjectType::SceneryGroup, RCT2_MAX_SCENERY_GROUP_OBJECTS); - ExportObjectList(objectMgr, _s6.ParkEntranceObjects, ObjectType::ParkEntrance, RCT2_MAX_PARK_ENTRANCE_OBJECTS); - ExportObjectList(objectMgr, _s6.WaterObjects, ObjectType::Water, RCT2_MAX_WATER_OBJECTS); - ExportObjectList(objectMgr, _s6.ScenarioTextObjects, ObjectType::ScenarioText, RCT2_MAX_SCENARIO_TEXT_OBJECTS); + ExportObjectList(objectMgr, _s6.RideObjects); + ExportObjectList(objectMgr, _s6.SceneryObjects); + ExportObjectList(objectMgr, _s6.LargeSceneryObjects); + ExportObjectList(objectMgr, _s6.WallSceneryObjects); + ExportObjectList(objectMgr, _s6.BannerObjects); + ExportObjectList(objectMgr, _s6.PathObjects); + ExportObjectList(objectMgr, _s6.PathAdditionObjects); + ExportObjectList(objectMgr, _s6.SceneryGroupObjects); + ExportObjectList(objectMgr, _s6.ParkEntranceObjects); + ExportObjectList(objectMgr, _s6.WaterObjects); + ExportObjectList(objectMgr, _s6.ScenarioTextObjects); _s6.elapsed_months = static_cast(gDateMonthsElapsed); _s6.current_day = gDateMonthTicks; diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 32fe1918b3..bee403a492 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -1563,8 +1563,8 @@ public: return justText.data(); } - template - static void AddRequiredObjects(std::vector& required, const T& list, size_t internalLimit) + template + static void AddRequiredObjects(std::vector& required, const T& list) { rct_object_entry nullEntry = {}; std::memset(&nullEntry, 0xFF, sizeof(nullEntry)); @@ -1576,7 +1576,7 @@ public: // NOTE: The segment of this object type needs to be filled to the internal limit // the object manager currently expects this. - for (size_t i = std::size(list); i < internalLimit; i++) + for (size_t i = std::size(list); i < TInternalLimit; i++) { required.push_back(nullEntry); } @@ -1586,17 +1586,17 @@ public: { std::vector result; - AddRequiredObjects(result, _s6.RideObjects, MAX_RIDE_OBJECTS); - AddRequiredObjects(result, _s6.SceneryObjects, MAX_SMALL_SCENERY_OBJECTS); - AddRequiredObjects(result, _s6.LargeSceneryObjects, MAX_LARGE_SCENERY_OBJECTS); - AddRequiredObjects(result, _s6.WallSceneryObjects, MAX_WALL_SCENERY_OBJECTS); - AddRequiredObjects(result, _s6.BannerObjects, MAX_BANNER_OBJECTS); - AddRequiredObjects(result, _s6.PathObjects, MAX_PATH_OBJECTS); - AddRequiredObjects(result, _s6.PathAdditionObjects, MAX_PATH_ADDITION_OBJECTS); - AddRequiredObjects(result, _s6.SceneryGroupObjects, MAX_SCENERY_GROUP_OBJECTS); - AddRequiredObjects(result, _s6.ParkEntranceObjects, MAX_PARK_ENTRANCE_OBJECTS); - AddRequiredObjects(result, _s6.WaterObjects, MAX_WATER_OBJECTS); - AddRequiredObjects(result, _s6.ScenarioTextObjects, MAX_SCENARIO_TEXT_OBJECTS); + AddRequiredObjects(result, _s6.RideObjects); + AddRequiredObjects(result, _s6.SceneryObjects); + AddRequiredObjects(result, _s6.LargeSceneryObjects); + AddRequiredObjects(result, _s6.WallSceneryObjects); + AddRequiredObjects(result, _s6.BannerObjects); + AddRequiredObjects(result, _s6.PathObjects); + AddRequiredObjects(result, _s6.PathAdditionObjects); + AddRequiredObjects(result, _s6.SceneryGroupObjects); + AddRequiredObjects(result, _s6.ParkEntranceObjects); + AddRequiredObjects(result, _s6.WaterObjects); + AddRequiredObjects(result, _s6.ScenarioTextObjects); return result; }