From 5f4d02a6f7d0c4e39b4efa1005e6e51391883d64 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 27 Mar 2024 19:20:05 +0100 Subject: [PATCH 1/4] Move kLegacyObjectEntryGroupEncoding to ObjectRepository.cpp --- src/openrct2/object/Object.h | 1 - src/openrct2/object/ObjectList.cpp | 17 ----------------- src/openrct2/object/ObjectRepository.cpp | 9 ++++++++- 3 files changed, 8 insertions(+), 19 deletions(-) diff --git a/src/openrct2/object/Object.h b/src/openrct2/object/Object.h index 418cf73a0d..c5a397328a 100644 --- a/src/openrct2/object/Object.h +++ b/src/openrct2/object/Object.h @@ -343,7 +343,6 @@ public: #endif extern int32_t object_entry_group_counts[]; -extern int32_t object_entry_group_encoding[]; int32_t ObjectCalculateChecksum(const RCTObjectEntry* entry, const void* data, size_t dataLength); void ObjectCreateIdentifierName(char* string_buffer, size_t size, const RCTObjectEntry* object); diff --git a/src/openrct2/object/ObjectList.cpp b/src/openrct2/object/ObjectList.cpp index 0b7899a598..3a447fe9ce 100644 --- a/src/openrct2/object/ObjectList.cpp +++ b/src/openrct2/object/ObjectList.cpp @@ -44,23 +44,6 @@ int32_t object_entry_group_counts[] = { }; static_assert(std::size(object_entry_group_counts) == EnumValue(ObjectType::Count)); -// 98DA2C -// clang-format off -int32_t object_entry_group_encoding[] = { - CHUNK_ENCODING_RLE, - CHUNK_ENCODING_RLE, - CHUNK_ENCODING_RLE, - CHUNK_ENCODING_RLE, - CHUNK_ENCODING_RLE, - CHUNK_ENCODING_RLE, - CHUNK_ENCODING_RLE, - CHUNK_ENCODING_RLE, - CHUNK_ENCODING_RLE, - CHUNK_ENCODING_RLE, - CHUNK_ENCODING_ROTATE, -}; -// clang-format on - ObjectList::const_iterator::const_iterator(const ObjectList* parent, bool end) { _parent = parent; diff --git a/src/openrct2/object/ObjectRepository.cpp b/src/openrct2/object/ObjectRepository.cpp index 449e4dc672..060f399ac0 100644 --- a/src/openrct2/object/ObjectRepository.cpp +++ b/src/openrct2/object/ObjectRepository.cpp @@ -470,6 +470,13 @@ private: } } + // 0x0098DA2C + static constexpr std::array kLegacyObjectEntryGroupEncoding = { + CHUNK_ENCODING_RLE, CHUNK_ENCODING_RLE, CHUNK_ENCODING_RLE, CHUNK_ENCODING_RLE, + CHUNK_ENCODING_RLE, CHUNK_ENCODING_RLE, CHUNK_ENCODING_RLE, CHUNK_ENCODING_RLE, + CHUNK_ENCODING_RLE, CHUNK_ENCODING_RLE, CHUNK_ENCODING_ROTATE, + }; + static void SaveObject( std::string_view path, const RCTObjectEntry* entry, const void* data, size_t dataSize, bool fixChecksum = true) { @@ -525,7 +532,7 @@ private: // Encode data ObjectType objectType = entry->GetType(); SawyerCodingChunkHeader chunkHeader; - chunkHeader.encoding = object_entry_group_encoding[EnumValue(objectType)]; + chunkHeader.encoding = kLegacyObjectEntryGroupEncoding[EnumValue(objectType)]; chunkHeader.length = static_cast(dataSize); uint8_t* encodedDataBuffer = Memory::Allocate(0x600000); size_t encodedDataSize = SawyerCodingWriteChunkBuffer( From d645906003434e899eb1b5b9eb2fdbe465a350f1 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 27 Mar 2024 19:51:57 +0100 Subject: [PATCH 2/4] Move kTransientObjectTypes, kIntransientObjectTypes out of header --- .../windows/EditorInventionsList.cpp | 2 +- src/openrct2/EditorObjectSelectionSession.cpp | 2 +- src/openrct2/object/ObjectTypes.cpp | 35 +++++++++++++++---- src/openrct2/object/ObjectTypes.h | 16 +++------ src/openrct2/park/ParkFile.cpp | 4 +-- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/openrct2-ui/windows/EditorInventionsList.cpp b/src/openrct2-ui/windows/EditorInventionsList.cpp index bc81650b1b..749f1cb23f 100644 --- a/src/openrct2-ui/windows/EditorInventionsList.cpp +++ b/src/openrct2-ui/windows/EditorInventionsList.cpp @@ -82,7 +82,7 @@ static Widget _inventionListDragWidgets[] = { static void ResearchRidesSetup() { // Reset all objects to not required - for (auto objectType : TransientObjectTypes) + for (auto objectType : getTransientObjectTypes()) { auto maxObjects = object_entry_group_counts[EnumValue(objectType)]; for (int32_t i = 0; i < maxObjects; i++) diff --git a/src/openrct2/EditorObjectSelectionSession.cpp b/src/openrct2/EditorObjectSelectionSession.cpp index a54958c3a2..951d7df7a1 100644 --- a/src/openrct2/EditorObjectSelectionSession.cpp +++ b/src/openrct2/EditorObjectSelectionSession.cpp @@ -125,7 +125,7 @@ void SetupInUseSelectionFlags() { auto& objectMgr = OpenRCT2::GetContext()->GetObjectManager(); - for (auto objectType : TransientObjectTypes) + for (auto objectType : getTransientObjectTypes()) { for (int32_t i = 0; i < object_entry_group_counts[EnumValue(objectType)]; i++) { diff --git a/src/openrct2/object/ObjectTypes.cpp b/src/openrct2/object/ObjectTypes.cpp index 8d7fc157ad..24f5a2f758 100644 --- a/src/openrct2/object/ObjectTypes.cpp +++ b/src/openrct2/object/ObjectTypes.cpp @@ -7,24 +7,45 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ +#include "ObjectTypes.h" + +#include "../util/Util.h" #include "Object.h" #include +// Object types that can be saved in a park file. +static constexpr std::array kTransientObjectTypes = { + ObjectType::Ride, ObjectType::SmallScenery, ObjectType::LargeScenery, ObjectType::Walls, + ObjectType::Banners, ObjectType::Paths, ObjectType::PathAdditions, ObjectType::SceneryGroup, + ObjectType::ParkEntrance, ObjectType::Water, ObjectType::TerrainSurface, ObjectType::TerrainEdge, + ObjectType::Station, ObjectType::Music, ObjectType::FootpathSurface, ObjectType::FootpathRailings, +}; + +// Object types that cannot be saved in a park file. +static constexpr std::array kIntransientObjectTypes = { + ObjectType::ScenarioText, + ObjectType::Audio, +}; + +static_assert(kNumTransientObjectTypes + kNumIntransientObjectTypes == static_cast(ObjectType::Count)); + bool ObjectTypeIsTransient(ObjectType type) { - return std::find(TransientObjectTypes.begin(), TransientObjectTypes.end(), type) != std::end(TransientObjectTypes); + return std::find(kTransientObjectTypes.begin(), kTransientObjectTypes.end(), type) != std::end(kTransientObjectTypes); } bool ObjectTypeIsIntransient(ObjectType type) { - return std::find(IntransientObjectTypes.begin(), IntransientObjectTypes.end(), type) != std::end(IntransientObjectTypes); + return std::find(kIntransientObjectTypes.begin(), kIntransientObjectTypes.end(), type) != std::end(kIntransientObjectTypes); } -size_t GetObjectTypeLimit(ObjectType type) +std::span getTransientObjectTypes() { - auto index = EnumValue(type); - if (index >= EnumValue(ObjectType::Count)) - return 0; - return static_cast(object_entry_group_counts[index]); + return kTransientObjectTypes; +} + +std::span getIntransientObjectTypes() +{ + return kIntransientObjectTypes; } diff --git a/src/openrct2/object/ObjectTypes.h b/src/openrct2/object/ObjectTypes.h index adb9e4854c..317edb18fc 100644 --- a/src/openrct2/object/ObjectTypes.h +++ b/src/openrct2/object/ObjectTypes.h @@ -13,6 +13,7 @@ #include #include #include +#include using ObjectEntryIndex = uint16_t; constexpr ObjectEntryIndex OBJECT_ENTRY_INDEX_NULL = std::numeric_limits::max(); @@ -66,17 +67,10 @@ constexpr std::array ObjectTypes = { // Not using EnumValue to reduce header includes static_assert(ObjectTypes.size() == static_cast(ObjectType::Count)); -// Object types that can be saved in a park file. -constexpr std::array TransientObjectTypes = { - ObjectType::Ride, ObjectType::SmallScenery, ObjectType::LargeScenery, ObjectType::Walls, - ObjectType::Banners, ObjectType::Paths, ObjectType::PathAdditions, ObjectType::SceneryGroup, - ObjectType::ParkEntrance, ObjectType::Water, ObjectType::TerrainSurface, ObjectType::TerrainEdge, - ObjectType::Station, ObjectType::Music, ObjectType::FootpathSurface, ObjectType::FootpathRailings, -}; - -// Object types that cannot be saved in a park file. -constexpr std::array IntransientObjectTypes = { ObjectType::ScenarioText, ObjectType::Audio }; +static constexpr size_t kNumTransientObjectTypes = 16; +static constexpr size_t kNumIntransientObjectTypes = 2; bool ObjectTypeIsTransient(ObjectType type); bool ObjectTypeIsIntransient(ObjectType type); -size_t GetObjectTypeLimit(ObjectType type); +std::span getTransientObjectTypes(); +std::span getIntransientObjectTypes(); diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index fe205516e6..9e9ae0e17f 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -382,8 +382,8 @@ namespace OpenRCT2 auto objectList = objManager.GetLoadedObjects(); // Write number of object sub lists - cs.Write(static_cast(TransientObjectTypes.size())); - for (auto objectType : TransientObjectTypes) + cs.Write(static_cast(getTransientObjectTypes().size())); + for (auto objectType : getTransientObjectTypes()) { // Write sub list const auto& list = objectList.GetList(objectType); From e898e9211d2f484f14f0a3558ae6233282c9f341 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 27 Mar 2024 20:13:10 +0100 Subject: [PATCH 3/4] Move kObjectEntryGroupCounts to ObjectList.cpp --- .../windows/EditorInventionsList.cpp | 5 +++-- .../windows/EditorObjectSelection.cpp | 4 ++-- src/openrct2/Context.cpp | 2 +- src/openrct2/Editor.cpp | 2 +- src/openrct2/EditorObjectSelectionSession.cpp | 6 ++--- src/openrct2/EditorObjectSelectionSession.h | 2 +- src/openrct2/interface/InteractiveConsole.cpp | 7 +++--- src/openrct2/object/Object.h | 2 -- src/openrct2/object/ObjectList.cpp | 22 +++++++++++++++---- src/openrct2/object/ObjectList.h | 4 +++- src/openrct2/object/ObjectManager.cpp | 11 +++++----- src/openrct2/rct1/S4Importer.cpp | 2 +- src/openrct2/ride/Ride.cpp | 2 +- .../bindings/object/ScObjectManager.cpp | 6 ++--- src/openrct2/world/MapGen.cpp | 4 ++-- 15 files changed, 48 insertions(+), 33 deletions(-) diff --git a/src/openrct2-ui/windows/EditorInventionsList.cpp b/src/openrct2-ui/windows/EditorInventionsList.cpp index 749f1cb23f..1319afcb74 100644 --- a/src/openrct2-ui/windows/EditorInventionsList.cpp +++ b/src/openrct2-ui/windows/EditorInventionsList.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -84,8 +85,8 @@ static Widget _inventionListDragWidgets[] = { // Reset all objects to not required for (auto objectType : getTransientObjectTypes()) { - auto maxObjects = object_entry_group_counts[EnumValue(objectType)]; - for (int32_t i = 0; i < maxObjects; i++) + auto maxObjects = getObjectEntryGroupCount(objectType); + for (auto i = 0u; i < maxObjects; i++) { Editor::ClearSelectedObject(objectType, i, ObjectSelectionFlags::AllFlags); } diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index 32a2b797d2..f7b516803b 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -1048,8 +1048,8 @@ static std::vector _window_editor_object_selection_widgets = { { auto screenPos = windowPos + ScreenCoordsXY{ 3, height - 13 }; - int32_t numSelected = _numSelectedObjectsForType[EnumValue(GetSelectedObjectType())]; - int32_t totalSelectable = object_entry_group_counts[EnumValue(GetSelectedObjectType())]; + auto numSelected = _numSelectedObjectsForType[EnumValue(GetSelectedObjectType())]; + auto totalSelectable = getObjectEntryGroupCount(GetSelectedObjectType()); auto ft = Formatter(); ft.Add(numSelected); diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index a3bf35234f..aee148a5fc 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -808,7 +808,7 @@ namespace OpenRCT2 { for (auto objectType : ObjectTypes) { - auto maxObjectsOfType = static_cast(object_entry_group_counts[EnumValue(objectType)]); + auto maxObjectsOfType = static_cast(getObjectEntryGroupCount(objectType)); for (ObjectEntryIndex i = 0; i < maxObjectsOfType; i++) { auto obj = _objectManager->GetLoadedObject(objectType, i); diff --git a/src/openrct2/Editor.cpp b/src/openrct2/Editor.cpp index 174f7ad753..6d7274568c 100644 --- a/src/openrct2/Editor.cpp +++ b/src/openrct2/Editor.cpp @@ -562,7 +562,7 @@ namespace Editor { if (index != OBJECT_ENTRY_INDEX_NULL) { - assert(static_cast(objectType) < object_entry_group_counts[EnumValue(ObjectType::Paths)]); + assert(index < getObjectEntryGroupCount(ObjectType::Paths)); auto& list = _editorSelectedObjectFlags[EnumValue(objectType)]; if (list.size() <= index) { diff --git a/src/openrct2/EditorObjectSelectionSession.cpp b/src/openrct2/EditorObjectSelectionSession.cpp index 951d7df7a1..869084f587 100644 --- a/src/openrct2/EditorObjectSelectionSession.cpp +++ b/src/openrct2/EditorObjectSelectionSession.cpp @@ -36,7 +36,7 @@ std::optional _gSceneryGroupPartialSelectError; std::vector _objectSelectionFlags; -int32_t _numSelectedObjectsForType[EnumValue(ObjectType::Count)]; +uint32_t _numSelectedObjectsForType[EnumValue(ObjectType::Count)]; static int32_t _numAvailableObjectsForType[EnumValue(ObjectType::Count)]; static void SetupInUseSelectionFlags(); @@ -127,7 +127,7 @@ void SetupInUseSelectionFlags() for (auto objectType : getTransientObjectTypes()) { - for (int32_t i = 0; i < object_entry_group_counts[EnumValue(objectType)]; i++) + for (auto i = 0u; i < getObjectEntryGroupCount(objectType); i++) { Editor::ClearSelectedObject(static_cast(objectType), i, ObjectSelectionFlags::AllFlags); @@ -580,7 +580,7 @@ ResultWithMessage WindowEditorObjectSelectionSelectObject( } ObjectType objectType = item->Type; - uint16_t maxObjects = object_entry_group_counts[EnumValue(objectType)]; + auto maxObjects = getObjectEntryGroupCount(objectType); if (maxObjects <= _numSelectedObjectsForType[EnumValue(objectType)]) { diff --git a/src/openrct2/EditorObjectSelectionSession.h b/src/openrct2/EditorObjectSelectionSession.h index b7194011f7..aa05d05b03 100644 --- a/src/openrct2/EditorObjectSelectionSession.h +++ b/src/openrct2/EditorObjectSelectionSession.h @@ -27,7 +27,7 @@ enum EDITOR_INPUT_FLAGS extern std::optional _gSceneryGroupPartialSelectError; extern std::vector _objectSelectionFlags; -extern int32_t _numSelectedObjectsForType[EnumValue(ObjectType::Count)]; +extern uint32_t _numSelectedObjectsForType[EnumValue(ObjectType::Count)]; bool EditorCheckObjectGroupAtLeastOneSelected(ObjectType checkObjectType); bool EditorCheckObjectGroupAtLeastOneSurfaceSelected(bool queue); diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index 3692ce8ba4..d3249ae854 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -1313,8 +1313,8 @@ static int32_t ConsoleCommandCountObjects(InteractiveConsole& console, [[maybe_u { for (auto objectType : ObjectTypes) { - int32_t entryGroupIndex = 0; - for (; entryGroupIndex < object_entry_group_counts[EnumValue(objectType)]; entryGroupIndex++) + uint32_t entryGroupIndex = 0; + for (; entryGroupIndex < getObjectEntryGroupCount(objectType); entryGroupIndex++) { if (ObjectEntryGetObject(objectType, entryGroupIndex) == nullptr) { @@ -1322,8 +1322,7 @@ static int32_t ConsoleCommandCountObjects(InteractiveConsole& console, [[maybe_u } } console.WriteFormatLine( - "%s: %d/%d", _objectTypeNames[EnumValue(objectType)], entryGroupIndex, - object_entry_group_counts[EnumValue(objectType)]); + "%s: %d/%d", _objectTypeNames[EnumValue(objectType)], entryGroupIndex, getObjectEntryGroupCount(objectType)); } return 0; diff --git a/src/openrct2/object/Object.h b/src/openrct2/object/Object.h index c5a397328a..06dba26287 100644 --- a/src/openrct2/object/Object.h +++ b/src/openrct2/object/Object.h @@ -342,8 +342,6 @@ public: # pragma GCC diagnostic pop #endif -extern int32_t object_entry_group_counts[]; - int32_t ObjectCalculateChecksum(const RCTObjectEntry* entry, const void* data, size_t dataLength); void ObjectCreateIdentifierName(char* string_buffer, size_t size, const RCTObjectEntry* object); diff --git a/src/openrct2/object/ObjectList.cpp b/src/openrct2/object/ObjectList.cpp index 3a447fe9ce..7c542b30b6 100644 --- a/src/openrct2/object/ObjectList.cpp +++ b/src/openrct2/object/ObjectList.cpp @@ -14,6 +14,7 @@ #include "../object/Object.h" #include "../util/SawyerCoding.h" #include "../util/Util.h" +#include "ObjectLimits.h" #include "ObjectManager.h" #include "ObjectRepository.h" @@ -21,8 +22,8 @@ #include #include -// 98DA00 -int32_t object_entry_group_counts[] = { +// 0x0098DA00 +static constexpr std::array kObjectEntryGroupCounts = { MAX_RIDE_OBJECTS, // rides MAX_SMALL_SCENERY_OBJECTS, // small scenery MAX_LARGE_SCENERY_OBJECTS, // large scenery @@ -42,7 +43,20 @@ int32_t object_entry_group_counts[] = { MAX_FOOTPATH_RAILINGS_OBJECTS, MAX_AUDIO_OBJECTS, }; -static_assert(std::size(object_entry_group_counts) == EnumValue(ObjectType::Count)); +static_assert(std::size(kObjectEntryGroupCounts) == EnumValue(ObjectType::Count)); + +size_t getObjectEntryGroupCount(ObjectType objectType) +{ + return kObjectEntryGroupCounts[EnumValue(objectType)]; +} + +size_t getObjectTypeLimit(ObjectType type) +{ + auto index = EnumValue(type); + if (index >= EnumValue(ObjectType::Count)) + return 0; + return static_cast(kObjectEntryGroupCounts[index]); +} ObjectList::const_iterator::const_iterator(const ObjectList* parent, bool end) { @@ -186,7 +200,7 @@ void ObjectCreateIdentifierName(char* string_buffer, size_t size, const RCTObjec void ObjectGetTypeEntryIndex(size_t index, ObjectType* outObjectType, ObjectEntryIndex* outEntryIndex) { uint8_t objectType = EnumValue(ObjectType::Ride); - for (size_t groupCount : object_entry_group_counts) + for (size_t groupCount : kObjectEntryGroupCounts) { if (index >= groupCount) { diff --git a/src/openrct2/object/ObjectList.h b/src/openrct2/object/ObjectList.h index 362c9aede1..3cc725cf10 100644 --- a/src/openrct2/object/ObjectList.h +++ b/src/openrct2/object/ObjectList.h @@ -10,7 +10,6 @@ #pragma once #include "Object.h" -#include "ObjectLimits.h" #include @@ -51,3 +50,6 @@ public: }; void ObjectGetTypeEntryIndex(size_t index, ObjectType* outObjectType, ObjectEntryIndex* outEntryIndex); + +size_t getObjectEntryGroupCount(ObjectType objectType); +size_t getObjectTypeLimit(ObjectType type); diff --git a/src/openrct2/object/ObjectManager.cpp b/src/openrct2/object/ObjectManager.cpp index 418286555b..9164b7654a 100644 --- a/src/openrct2/object/ObjectManager.cpp +++ b/src/openrct2/object/ObjectManager.cpp @@ -21,6 +21,7 @@ #include "BannerSceneryEntry.h" #include "LargeSceneryObject.h" #include "Object.h" +#include "ObjectLimits.h" #include "ObjectList.h" #include "ObjectRepository.h" #include "PathAdditionObject.h" @@ -79,7 +80,7 @@ public: return nullptr; } - if (index >= static_cast(object_entry_group_counts[EnumValue(objectType)])) + if (index >= static_cast(getObjectEntryGroupCount(objectType))) { #ifdef DEBUG if (index != OBJECT_ENTRY_INDEX_NULL) @@ -144,7 +145,7 @@ public: ObjectList objectList; for (auto objectType : ObjectTypes) { - auto maxObjectsOfType = static_cast(object_entry_group_counts[EnumValue(objectType)]); + auto maxObjectsOfType = static_cast(getObjectEntryGroupCount(objectType)); for (ObjectEntryIndex i = 0; i < maxObjectsOfType; i++) { auto obj = GetLoadedObject(objectType, i); @@ -384,7 +385,7 @@ private: return static_cast(std::distance(list.begin(), it)); } - auto maxSize = object_entry_group_counts[EnumValue(objectType)]; + auto maxSize = getObjectEntryGroupCount(objectType); if (list.size() < static_cast(maxSize)) { list.emplace_back(); @@ -524,7 +525,7 @@ private: for (auto objectType : ObjectTypes) { auto& descriptors = objectList.GetList(objectType); - auto maxSize = static_cast(object_entry_group_counts[EnumValue(objectType)]); + auto maxSize = static_cast(getObjectEntryGroupCount(objectType)); auto listSize = static_cast(std::min(descriptors.size(), maxSize)); for (ObjectEntryIndex i = 0; i < listSize; i++) { @@ -724,7 +725,7 @@ private: } // Build object lists - const auto maxRideObjects = static_cast(object_entry_group_counts[EnumValue(ObjectType::Ride)]); + const auto maxRideObjects = static_cast(getObjectEntryGroupCount(ObjectType::Ride)); for (size_t i = 0; i < maxRideObjects; i++) { auto* rideObject = static_cast(GetLoadedObject(ObjectType::Ride, i)); diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 69ebdcaff1..f7027e4fd6 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -570,7 +570,7 @@ namespace RCT1 RCT12::EntryList* entries = GetEntryList(objectType); // Check if there are spare entries available - size_t maxEntries = static_cast(object_entry_group_counts[EnumValue(objectType)]); + size_t maxEntries = static_cast(getObjectEntryGroupCount(objectType)); if (entries != nullptr && entries->GetCount() < maxEntries) { entries->GetOrAddEntry(objectName); diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 26782267d4..db44c4ceaa 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -257,7 +257,7 @@ const RideObjectEntry* GetRideEntryByIndex(ObjectEntryIndex index) std::string_view GetRideEntryName(ObjectEntryIndex index) { - if (index >= object_entry_group_counts[EnumValue(ObjectType::Ride)]) + if (index >= getObjectEntryGroupCount(ObjectType::Ride)) { LOG_ERROR("invalid index %d for ride type", index); return {}; diff --git a/src/openrct2/scripting/bindings/object/ScObjectManager.cpp b/src/openrct2/scripting/bindings/object/ScObjectManager.cpp index cab4d4c1c0..cd38f55b18 100644 --- a/src/openrct2/scripting/bindings/object/ScObjectManager.cpp +++ b/src/openrct2/scripting/bindings/object/ScObjectManager.cpp @@ -106,7 +106,7 @@ DukValue ScObjectManager::load(const DukValue& p1, const DukValue& p2) throw DukException() << "Expected number for 'index'."; auto index = static_cast(p2.as_int()); - auto limit = GetObjectTypeLimit(installedObject->Type); + auto limit = getObjectTypeLimit(installedObject->Type); if (index < limit) { auto loadedObject = objectManager.GetLoadedObject(installedObject->Type, index); @@ -214,8 +214,8 @@ std::vector ScObjectManager::getAllObjects(const std::string& typez) c auto type = ScObject::StringToObjectType(typez); if (type) { - auto count = object_entry_group_counts[EnumValue(*type)]; - for (int32_t i = 0; i < count; i++) + auto count = getObjectEntryGroupCount(*type); + for (auto i = 0u; i < count; i++) { auto obj = objManager.GetLoadedObject(*type, i); if (obj != nullptr) diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index c035acd20c..389301afed 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -18,8 +18,8 @@ #include "../core/String.hpp" #include "../localisation/Localisation.h" #include "../localisation/StringIds.h" -#include "../object/Object.h" #include "../object/ObjectEntryManager.h" +#include "../object/ObjectList.h" #include "../object/ObjectManager.h" #include "../object/SmallSceneryEntry.h" #include "../object/TerrainEdgeObject.h" @@ -311,7 +311,7 @@ static void MapGenPlaceTrees() std::vector desertTreeIds; std::vector snowTreeIds; - for (int32_t i = 0; i < object_entry_group_counts[EnumValue(ObjectType::SmallScenery)]; i++) + for (auto i = 0u; i < getObjectEntryGroupCount(ObjectType::SmallScenery); i++) { auto* sceneryEntry = OpenRCT2::ObjectManager::GetObjectEntry(i); auto entry = ObjectEntryGetObject(ObjectType::SmallScenery, i); From cec251bb63152d1263d1139b079fe12167189027 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 27 Mar 2024 21:26:07 +0100 Subject: [PATCH 4/4] Take kAllObjectTypes internal as well --- src/openrct2/Context.cpp | 2 +- src/openrct2/interface/InteractiveConsole.cpp | 2 +- src/openrct2/object/ObjectManager.cpp | 10 +++---- src/openrct2/object/ObjectTypes.cpp | 28 +++++++++++++++++++ src/openrct2/object/ObjectTypes.h | 25 ++--------------- 5 files changed, 37 insertions(+), 30 deletions(-) diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index aee148a5fc..6e2055a85f 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -806,7 +806,7 @@ namespace OpenRCT2 private: bool HasObjectsThatUseFallbackImages() { - for (auto objectType : ObjectTypes) + for (auto objectType : getAllObjectTypes()) { auto maxObjectsOfType = static_cast(getObjectEntryGroupCount(objectType)); for (ObjectEntryIndex i = 0; i < maxObjectsOfType; i++) diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index d3249ae854..b89aec61d5 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -1311,7 +1311,7 @@ static_assert(_objectTypeNames.size() == EnumValue(ObjectType::Count)); static int32_t ConsoleCommandCountObjects(InteractiveConsole& console, [[maybe_unused]] const arguments_t& argv) { - for (auto objectType : ObjectTypes) + for (auto objectType : getAllObjectTypes()) { uint32_t entryGroupIndex = 0; for (; entryGroupIndex < getObjectEntryGroupCount(objectType); entryGroupIndex++) diff --git a/src/openrct2/object/ObjectManager.cpp b/src/openrct2/object/ObjectManager.cpp index 9164b7654a..9c0157798a 100644 --- a/src/openrct2/object/ObjectManager.cpp +++ b/src/openrct2/object/ObjectManager.cpp @@ -143,7 +143,7 @@ public: ObjectList GetLoadedObjects() override { ObjectList objectList; - for (auto objectType : ObjectTypes) + for (auto objectType : getAllObjectTypes()) { auto maxObjectsOfType = static_cast(getObjectEntryGroupCount(objectType)); for (ObjectEntryIndex i = 0; i < maxObjectsOfType; i++) @@ -312,7 +312,7 @@ private: void UnloadAll(bool onlyTransient) { - for (auto type : ObjectTypes) + for (auto type : getAllObjectTypes()) { if (!onlyTransient || !IsIntransientObjectType(type)) { @@ -443,7 +443,7 @@ private: // Unload objects that are not in the hash set size_t totalObjectsLoaded = 0; size_t numObjectsUnloaded = 0; - for (auto type : ObjectTypes) + for (auto type : getAllObjectTypes()) { if (!IsIntransientObjectType(type)) { @@ -522,7 +522,7 @@ private: std::vector requiredObjects; std::vector missingObjects; - for (auto objectType : ObjectTypes) + for (auto objectType : getAllObjectTypes()) { auto& descriptors = objectList.GetList(objectType); auto maxSize = static_cast(getObjectEntryGroupCount(objectType)); @@ -673,7 +673,7 @@ private: } // Set the new object lists - for (auto type : ObjectTypes) + for (auto type : getAllObjectTypes()) { if (!IsIntransientObjectType(type)) { diff --git a/src/openrct2/object/ObjectTypes.cpp b/src/openrct2/object/ObjectTypes.cpp index 24f5a2f758..af6aa715bd 100644 --- a/src/openrct2/object/ObjectTypes.cpp +++ b/src/openrct2/object/ObjectTypes.cpp @@ -14,6 +14,29 @@ #include +constexpr std::array kAllObjectTypes = { + ObjectType::Ride, + ObjectType::SmallScenery, + ObjectType::LargeScenery, + ObjectType::Walls, + ObjectType::Banners, + ObjectType::Paths, + ObjectType::PathAdditions, + ObjectType::SceneryGroup, + ObjectType::ParkEntrance, + ObjectType::Water, + ObjectType::ScenarioText, + ObjectType::TerrainSurface, + ObjectType::TerrainEdge, + ObjectType::Station, + ObjectType::Music, + ObjectType::FootpathSurface, + ObjectType::FootpathRailings, + ObjectType::Audio, +}; + +static_assert(kAllObjectTypes.size() == EnumValue(ObjectType::Count)); + // Object types that can be saved in a park file. static constexpr std::array kTransientObjectTypes = { ObjectType::Ride, ObjectType::SmallScenery, ObjectType::LargeScenery, ObjectType::Walls, @@ -40,6 +63,11 @@ bool ObjectTypeIsIntransient(ObjectType type) return std::find(kIntransientObjectTypes.begin(), kIntransientObjectTypes.end(), type) != std::end(kIntransientObjectTypes); } +std::span getAllObjectTypes() +{ + return kAllObjectTypes; +} + std::span getTransientObjectTypes() { return kTransientObjectTypes; diff --git a/src/openrct2/object/ObjectTypes.h b/src/openrct2/object/ObjectTypes.h index 317edb18fc..da203123a8 100644 --- a/src/openrct2/object/ObjectTypes.h +++ b/src/openrct2/object/ObjectTypes.h @@ -44,33 +44,12 @@ enum class ObjectType : uint8_t None = 255 }; -constexpr std::array ObjectTypes = { - ObjectType::Ride, - ObjectType::SmallScenery, - ObjectType::LargeScenery, - ObjectType::Walls, - ObjectType::Banners, - ObjectType::Paths, - ObjectType::PathAdditions, - ObjectType::SceneryGroup, - ObjectType::ParkEntrance, - ObjectType::Water, - ObjectType::ScenarioText, - ObjectType::TerrainSurface, - ObjectType::TerrainEdge, - ObjectType::Station, - ObjectType::Music, - ObjectType::FootpathSurface, - ObjectType::FootpathRailings, - ObjectType::Audio, -}; -// Not using EnumValue to reduce header includes -static_assert(ObjectTypes.size() == static_cast(ObjectType::Count)); - static constexpr size_t kNumTransientObjectTypes = 16; static constexpr size_t kNumIntransientObjectTypes = 2; bool ObjectTypeIsTransient(ObjectType type); bool ObjectTypeIsIntransient(ObjectType type); + +std::span getAllObjectTypes(); std::span getTransientObjectTypes(); std::span getIntransientObjectTypes();