From 6f00e6aafe8228e3b323473ae509170eb85aa9bc Mon Sep 17 00:00:00 2001 From: Ted John Date: Mon, 14 May 2018 13:05:59 +0100 Subject: [PATCH] Make ObjectRepositoryItem C++ --- .../windows/EditorObjectSelection.cpp | 27 ++++---- src/openrct2/EditorObjectSelectionSession.cpp | 15 +++-- src/openrct2/object/ObjectRepository.cpp | 66 +++++++------------ src/openrct2/object/ObjectRepository.h | 30 ++++----- src/openrct2/object/RideObject.cpp | 8 +-- src/openrct2/object/SceneryGroupObject.cpp | 9 +-- src/openrct2/ride/TrackDesign.cpp | 2 +- src/openrct2/ride/TrackDesignRepository.cpp | 4 +- 8 files changed, 67 insertions(+), 94 deletions(-) diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp index dc5f2c2242..c224fd63a4 100644 --- a/src/openrct2-ui/windows/EditorObjectSelection.cpp +++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp @@ -277,8 +277,8 @@ static void visible_list_dispose() static bool visible_list_sort_ride_name(const list_item &a, const list_item &b) { - auto nameA = a.repositoryItem->Name; - auto nameB = b.repositoryItem->Name; + auto nameA = a.repositoryItem->Name.c_str(); + auto nameB = b.repositoryItem->Name.c_str(); return strcmp(nameA, nameB) < 0; } @@ -361,7 +361,7 @@ static void window_editor_object_selection_init_widgets() if (!_window_editor_object_selection_widgets_initialised) { _window_editor_object_selection_widgets_initialised = true; - const auto &tabWidget = widgets[widgets.size() - 2]; + auto tabWidget = widgets[widgets.size() - 2]; for (sint32 i = 1; i < OBJECT_TYPE_COUNT; i++) { widgets.insert(widgets.end() - 1, tabWidget); @@ -1035,7 +1035,7 @@ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinf y = w->y + widget->bottom + 3; width = w->width - w->widgets[WIDX_LIST].right - 6; set_format_arg(0, rct_string_id, STR_STRING); - set_format_arg(2, const char *, listItem->repositoryItem->Name); + set_format_arg(2, const char *, listItem->repositoryItem->Name.c_str()); gfx_draw_string_centred_clipped(dpi, STR_WINDOW_COLOUR_2_STRINGID, gCommonFormatArgs, COLOUR_BLACK, x, y, width); // Draw description of object @@ -1067,7 +1067,7 @@ static void window_editor_object_selection_paint(rct_window *w, rct_drawpixelinf // gfx_draw_string_right(dpi, stringId, nullptr, 2, w->x + w->width - 5, w->y + w->height - 3 - 12 - 14); // Draw object dat name - const char *path = path_get_filename(listItem->repositoryItem->Path); + const char *path = path_get_filename(listItem->repositoryItem->Path.c_str()); set_format_arg(0, rct_string_id, STR_STRING); set_format_arg(2, const char *, path); gfx_draw_string_right(dpi, STR_WINDOW_COLOUR_2_STRINGID, gCommonFormatArgs, COLOUR_BLACK, w->x + w->width - 5, w->y + w->height - 3 - 12); @@ -1134,7 +1134,7 @@ static void window_editor_object_selection_scrollpaint(rct_window *w, rct_drawpi } // Draw text - safe_strcpy(buffer, listItem.repositoryItem->Name, 256 - (buffer - bufferWithColour)); + safe_strcpy(buffer, listItem.repositoryItem->Name.c_str(), 256 - (buffer - bufferWithColour)); if (gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER) { while (*buffer != 0 && *buffer != 9) buffer++; @@ -1317,8 +1317,7 @@ static bool filter_string(const ObjectRepositoryItem * item) return true; // Object doesn't have a name - utf8 *name = item->Name; - if (name == nullptr || name[0] == '\0') + if (item->Name.empty()) return false; // Get ride type @@ -1329,9 +1328,9 @@ static bool filter_string(const ObjectRepositoryItem * item) char type_lower[MAX_PATH]; char object_path[MAX_PATH]; char filter_lower[sizeof(_filter_string)]; - safe_strcpy(name_lower, name, MAX_PATH); + safe_strcpy(name_lower, item->Name.c_str(), MAX_PATH); safe_strcpy(type_lower, rideTypeName, MAX_PATH); - safe_strcpy(object_path, item->Path, MAX_PATH); + safe_strcpy(object_path, item->Path.c_str(), MAX_PATH); safe_strcpy(filter_lower, _filter_string, sizeof(_filter_string)); // Make use of lowercase characters only @@ -1383,9 +1382,9 @@ static bool filter_chunks(const ObjectRepositoryItem * item) uint8 rideType = 0; for (sint32 i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) { - if (item->RideType[i] != RIDE_TYPE_NULL) + if (item->RideInfo.RideType[i] != RIDE_TYPE_NULL) { - rideType = item->RideType[i]; + rideType = item->RideInfo.RideType[i]; break; } } @@ -1426,12 +1425,12 @@ static rct_string_id get_ride_type_string_id(const ObjectRepositoryItem * item) rct_string_id result = STR_NONE; for (sint32 i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) { - uint8 rideType = item->RideType[i]; + uint8 rideType = item->RideInfo.RideType[i]; if (rideType != RIDE_TYPE_NULL) { if (RideGroupManager::RideTypeHasRideGroups(rideType)) { - const RideGroup * rideGroup = RideGroupManager::RideGroupFind(rideType, item->RideGroupIndex); + const RideGroup * rideGroup = RideGroupManager::RideGroupFind(rideType, item->RideInfo.RideGroupIndex); result = rideGroup->Naming.name; } else diff --git a/src/openrct2/EditorObjectSelectionSession.cpp b/src/openrct2/EditorObjectSelectionSession.cpp index d654b0ec83..4f686f08bf 100644 --- a/src/openrct2/EditorObjectSelectionSession.cpp +++ b/src/openrct2/EditorObjectSelectionSession.cpp @@ -61,7 +61,7 @@ static void setup_track_manager_objects() { *selectionFlags |= OBJECT_SELECTION_FLAG_6; - for (auto rideType : item->RideType) + for (auto rideType : item->RideInfo.RideType) { if (rideType != RIDE_TYPE_NULL && ride_type_has_flag(rideType, RIDE_TYPE_FLAG_HAS_TRACK)) { @@ -90,7 +90,7 @@ static void setup_track_designer_objects() { *selectionFlags |= OBJECT_SELECTION_FLAG_6; - for (uint8 rideType : item->RideType) + for (uint8 rideType : item->RideInfo.RideType) { if (rideType != RIDE_TYPE_NULL) { @@ -420,8 +420,9 @@ sint32 window_editor_object_selection_select_object(uint8 bh, sint32 flags, cons uint8 objectType = object_entry_get_type(&item->ObjectEntry); if (objectType == OBJECT_TYPE_SCENERY_GROUP && (flags & (1 << 2))) { - for (sint32 j = 0; j < item->NumThemeObjects; j++) { - window_editor_object_selection_select_object(++bh, flags, &item->ThemeObjects[j]); + for (const auto& sgEntry : item->SceneryGroupInfo.Entries) + { + window_editor_object_selection_select_object(++bh, flags, &sgEntry); } } @@ -450,8 +451,10 @@ sint32 window_editor_object_selection_select_object(uint8 bh, sint32 flags, cons } if (objectType == OBJECT_TYPE_SCENERY_GROUP && (flags & (1 << 2))) { - for (uint16 j = 0; j < item->NumThemeObjects; j++) { - if (!window_editor_object_selection_select_object(++bh, flags, &item->ThemeObjects[j])) { + for (const auto& sgEntry : item->SceneryGroupInfo.Entries) + { + if (!window_editor_object_selection_select_object(++bh, flags, &sgEntry)) + { _maxObjectsWasHit = true; } } diff --git a/src/openrct2/object/ObjectRepository.cpp b/src/openrct2/object/ObjectRepository.cpp index 16dc9a9851..f4e21b4db8 100644 --- a/src/openrct2/object/ObjectRepository.cpp +++ b/src/openrct2/object/ObjectRepository.cpp @@ -121,8 +121,8 @@ public: { ObjectRepositoryItem item = { 0 }; item.ObjectEntry = *object->GetObjectEntry(); - item.Path = String::Duplicate(path); - item.Name = String::Duplicate(object->GetName()); + item.Path = path; + item.Name = object->GetName(); object->SetRepositoryItem(&item); delete object; return std::make_tuple(true, item); @@ -139,22 +139,22 @@ protected: switch (object_entry_get_type(&item.ObjectEntry)) { case OBJECT_TYPE_RIDE: - stream->WriteValue(item.RideFlags); + stream->WriteValue(item.RideInfo.RideFlags); for (sint32 i = 0; i < MAX_CATEGORIES_PER_RIDE; i++) { - stream->WriteValue(item.RideCategory[i]); + stream->WriteValue(item.RideInfo.RideCategory[i]); } for (sint32 i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) { - stream->WriteValue(item.RideType[i]); + stream->WriteValue(item.RideInfo.RideType[i]); } - stream->WriteValue(item.RideGroupIndex); + stream->WriteValue(item.RideInfo.RideGroupIndex); break; case OBJECT_TYPE_SCENERY_GROUP: - stream->WriteValue(item.NumThemeObjects); - for (uint16 i = 0; i < item.NumThemeObjects; i++) + stream->WriteValue((uint16)item.SceneryGroupInfo.Entries.size()); + for (const auto& entry : item.SceneryGroupInfo.Entries) { - stream->WriteValue(item.ThemeObjects[i]); + stream->WriteValue(entry); } break; } @@ -162,7 +162,7 @@ protected: ObjectRepositoryItem Deserialise(IStream * stream) const override { - ObjectRepositoryItem item = { 0 }; + ObjectRepositoryItem item; item.ObjectEntry = stream->ReadValue(); item.Path = stream->ReadString(); @@ -170,25 +170,27 @@ protected: switch (object_entry_get_type(&item.ObjectEntry)) { case OBJECT_TYPE_RIDE: - item.RideFlags = stream->ReadValue(); + item.RideInfo.RideFlags = stream->ReadValue(); for (sint32 i = 0; i < 2; i++) { - item.RideCategory[i] = stream->ReadValue(); + item.RideInfo.RideCategory[i] = stream->ReadValue(); } for (sint32 i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) { - item.RideType[i] = stream->ReadValue(); + item.RideInfo.RideType[i] = stream->ReadValue(); } - item.RideGroupIndex = stream->ReadValue(); + item.RideInfo.RideGroupIndex = stream->ReadValue(); break; case OBJECT_TYPE_SCENERY_GROUP: - item.NumThemeObjects = stream->ReadValue(); - item.ThemeObjects = Memory::AllocateArray(item.NumThemeObjects); - for (uint16 i = 0; i < item.NumThemeObjects; i++) { - item.ThemeObjects[i] = stream->ReadValue(); + auto numEntries = stream->ReadValue(); + item.SceneryGroupInfo.Entries = std::vector(numEntries); + for (size_t i = 0; i < numEntries; i++) + { + item.SceneryGroupInfo.Entries[i] = stream->ReadValue(); + } + break; } - break; } return item; } @@ -286,7 +288,7 @@ public: } else { - return ObjectFactory::CreateObjectFromLegacyFile(*this, ori->Path); + return ObjectFactory::CreateObjectFromLegacyFile(*this, ori->Path.c_str()); } } @@ -376,10 +378,6 @@ public: private: void ClearItems() { - for (auto &item : _items) - { - FreeItem(&item); - } _items.clear(); _itemMap.clear(); } @@ -437,8 +435,8 @@ private: } else { - Console::Error::WriteLine("Object conflict: '%s'", conflict->Path); - Console::Error::WriteLine(" : '%s'", item.Path); + Console::Error::WriteLine("Object conflict: '%s'", conflict->Path.c_str()); + Console::Error::WriteLine(" : '%s'", item.Path.c_str()); return false; } } @@ -454,22 +452,6 @@ private: } } - static void FreeItem(ObjectRepositoryItem * item) - { - Memory::Free(item->Path); - Memory::Free(item->Name); - item->Path = nullptr; - item->Name = nullptr; - - uint8 objectType = object_entry_get_type(&item->ObjectEntry); - switch (objectType) { - case OBJECT_TYPE_SCENERY_GROUP: - Memory::Free(item->ThemeObjects); - item->ThemeObjects = nullptr; - break; - } - } - static void SaveObject(const utf8 * path, const rct_object_entry * entry, const void * data, size_t dataSize, diff --git a/src/openrct2/object/ObjectRepository.h b/src/openrct2/object/ObjectRepository.h index ffd03cae6f..b46d0f9e98 100644 --- a/src/openrct2/object/ObjectRepository.h +++ b/src/openrct2/object/ObjectRepository.h @@ -40,24 +40,20 @@ struct ObjectRepositoryItem { size_t Id; rct_object_entry ObjectEntry; - utf8 * Path; - utf8 * Name; - Object * LoadedObject; - union + std::string Path; + std::string Name; + Object * LoadedObject{}; + struct { - struct - { - uint8 RideFlags; - uint8 RideCategory[2]; - uint8 RideType[MAX_RIDE_TYPES_PER_RIDE_ENTRY]; - uint8 RideGroupIndex; - }; - struct - { - uint16 NumThemeObjects; - rct_object_entry * ThemeObjects; - }; - }; + uint8 RideFlags; + uint8 RideCategory[2]; + uint8 RideType[MAX_RIDE_TYPES_PER_RIDE_ENTRY]; + uint8 RideGroupIndex; + } RideInfo; + struct + { + std::vector Entries; + } SceneryGroupInfo; }; interface IObjectRepository diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index b142bad575..3def718bde 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -372,15 +372,15 @@ void RideObject::SetRepositoryItem(ObjectRepositoryItem * item) const { for (sint32 i = 0; i < RCT2_MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++) { - item->RideType[i] = _legacyType.ride_type[i]; + item->RideInfo.RideType[i] = _legacyType.ride_type[i]; } for (sint32 i = 0; i < RCT2_MAX_CATEGORIES_PER_RIDE; i++) { - item->RideCategory[i] = _legacyType.category[i]; + item->RideInfo.RideCategory[i] = _legacyType.category[i]; } uint8 flags = 0; - item->RideFlags = flags; + item->RideInfo.RideFlags = flags; // Find the first non-null ride type, to be used when checking the ride group uint8 rideTypeIdx = ride_entry_get_first_non_null_ride_type(&_legacyType); @@ -408,7 +408,7 @@ void RideObject::SetRepositoryItem(ObjectRepositoryItem * item) const } } - item->RideGroupIndex = rideGroupIndex; + item->RideInfo.RideGroupIndex = rideGroupIndex; } void RideObject::ReadLegacyVehicle(IReadObjectContext * context, IStream * stream, rct_ride_entry_vehicle * vehicle) diff --git a/src/openrct2/object/SceneryGroupObject.cpp b/src/openrct2/object/SceneryGroupObject.cpp index 32c42cc6af..d946f1f454 100644 --- a/src/openrct2/object/SceneryGroupObject.cpp +++ b/src/openrct2/object/SceneryGroupObject.cpp @@ -107,14 +107,7 @@ void SceneryGroupObject::UpdateEntryIndexes() void SceneryGroupObject::SetRepositoryItem(ObjectRepositoryItem * item) const { - Memory::Free(item->ThemeObjects); - - item->NumThemeObjects = (uint16)_items.size(); - item->ThemeObjects = Memory::AllocateArray(_items.size()); - for (size_t i = 0; i < _items.size(); i++) - { - item->ThemeObjects[i] = _items[i]; - } + item->SceneryGroupInfo.Entries = _items; } std::vector SceneryGroupObject::ReadItems(IStream * stream) diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 0eb3006313..bdaa0ee993 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -1900,7 +1900,7 @@ static money32 place_track_design(sint16 x, sint16 y, sint16 z, uint8 flags, uin const ObjectRepositoryItem * ori = object_repository_find_object_by_name(rideEntryObject->name); if (ori != nullptr) { - uint8 rideGroupIndex = ori->RideGroupIndex; + uint8 rideGroupIndex = ori->RideInfo.RideGroupIndex; const RideGroup * td6RideGroup = RideGroupManager::RideGroupFind(td6->type, rideGroupIndex); uint8 * availableRideEntries = get_ride_entry_indices_for_ride_type(td6->type); diff --git a/src/openrct2/ride/TrackDesignRepository.cpp b/src/openrct2/ride/TrackDesignRepository.cpp index 96c56eafb4..1ab16851ca 100644 --- a/src/openrct2/ride/TrackDesignRepository.cpp +++ b/src/openrct2/ride/TrackDesignRepository.cpp @@ -205,7 +205,7 @@ public: } const ObjectRepositoryItem * ori = repo->FindObject(item.ObjectEntry.c_str()); - uint8 rideGroupIndex = (ori != nullptr) ? ori->RideGroupIndex : 0; + uint8 rideGroupIndex = (ori != nullptr) ? ori->RideInfo.RideGroupIndex : 0; const RideGroup * itemRideGroup = RideGroupManager::RideGroupFind(rideType, rideGroupIndex); if (itemRideGroup != nullptr && itemRideGroup->Equals(rideGroup)) @@ -270,7 +270,7 @@ public: } const ObjectRepositoryItem * ori = repo->FindObject(item.ObjectEntry.c_str()); - uint8 rideGroupIndex = (ori != nullptr) ? ori->RideGroupIndex : 0; + uint8 rideGroupIndex = (ori != nullptr) ? ori->RideInfo.RideGroupIndex : 0; const RideGroup * itemRideGroup = RideGroupManager::RideGroupFind(rideType, rideGroupIndex); if (itemRideGroup != nullptr && itemRideGroup->Equals(rideGroup))