From 840179299c748ab7fee913d7a0c5fb80e353eb0f Mon Sep 17 00:00:00 2001 From: Ted John Date: Wed, 29 Jun 2016 21:34:59 +0100 Subject: [PATCH] scrap object exetended and add sort ability Not yet sure if we need to sort object repository, but add code for it anyway. --- src/object.h | 13 +++++++---- src/object/ObjectRepository.cpp | 41 +++++++++++++++++++++++---------- src/object/ObjectRepository.h | 18 +++++++-------- 3 files changed, 47 insertions(+), 25 deletions(-) diff --git a/src/object.h b/src/object.h index 8f71595450..9319408c0a 100644 --- a/src/object.h +++ b/src/object.h @@ -67,10 +67,15 @@ assert_struct_size(rct_object_entry, 0x10); * size: 0x14 */ typedef struct rct_object_entry_extended { - uint32 flags; - char name[8]; - uint32 checksum; - uint32 chunk_size; + union { + rct_object_entry entry; + struct { + uint32 flags; + char name[8]; + uint32 checksum; + uint32 chunk_size; + }; + }; } rct_object_entry_extended; assert_struct_size(rct_object_entry_extended, 0x14); diff --git a/src/object/ObjectRepository.cpp b/src/object/ObjectRepository.cpp index 52fb222d5f..ec175fccfc 100644 --- a/src/object/ObjectRepository.cpp +++ b/src/object/ObjectRepository.cpp @@ -14,6 +14,7 @@ *****************************************************************************/ #pragma endregion +#include #include #include @@ -114,6 +115,8 @@ public: Construct(); Save(); } + + // SortItems(); } const size_t GetNumObjects() const override @@ -267,7 +270,7 @@ private: if (object != nullptr) { ObjectRepositoryItem item = { 0 }; - Memory::Copy(&item.ObjectEntry, object->GetObjectEntry(), sizeof(rct_object_entry)); + item.ObjectEntry = *object->GetObjectEntry(); item.Path = String::Duplicate(path); item.Name = String::Duplicate(object->GetName()); AddItem(&item); @@ -340,17 +343,31 @@ private: } } + void SortItems() + { + std::sort(_items.begin(), _items.end(), [](const ObjectRepositoryItem &a, + const ObjectRepositoryItem &b) -> bool + { + return strcmp(a.Name, b.Name) < 0; + }); + + // Rebuild item map + _itemMap.clear(); + for (size_t i = 0; i < _items.size(); i++) + { + rct_object_entry entry = _items[i].ObjectEntry; + _itemMap[entry] = i; + } + } + bool AddItem(ObjectRepositoryItem * item) { - rct_object_entry entry; - Memory::Copy(&entry, &item->ObjectEntry, sizeof(rct_object_entry)); - - const ObjectRepositoryItem * conflict = FindObject(&entry); + const ObjectRepositoryItem * conflict = FindObject(&item->ObjectEntry); if (conflict == nullptr) { _items.push_back(*item); size_t index = _items.size() - 1; - _itemMap[entry] = index; + _itemMap[item->ObjectEntry] = index; return true; } else @@ -367,17 +384,17 @@ private: { ObjectRepositoryItem item = { 0 }; - item.ObjectEntry = stream->ReadValue(); + item.ObjectEntry = stream->ReadValue(); item.Path = stream->ReadString(); item.NumImages = stream->ReadValue(); item.Name = stream->ReadString(); item.ChunkSize = stream->ReadValue(); item.NumRequiredObjects = stream->ReadValue(); - item.RequiredObjects = Memory::AllocateArray(item.NumRequiredObjects); + item.RequiredObjects = Memory::AllocateArray(item.NumRequiredObjects); for (uint16 i = 0; i < item.NumRequiredObjects; i++) { - item.RequiredObjects[i] = stream->ReadValue(); + item.RequiredObjects[i] = stream->ReadValue(); } switch (item.ObjectEntry.flags & 0x0F) { @@ -394,10 +411,10 @@ private: break; case OBJECT_TYPE_SCENERY_SETS: item.NumThemeObjects = stream->ReadValue(); - item.ThemeObjects = Memory::AllocateArray(item.NumThemeObjects); + item.ThemeObjects = Memory::AllocateArray(item.NumThemeObjects); for (uint16 i = 0; i < item.NumThemeObjects; i++) { - item.ThemeObjects[i] = stream->ReadValue(); + item.ThemeObjects[i] = stream->ReadValue(); } break; } @@ -434,7 +451,7 @@ private: stream->WriteValue(item.NumThemeObjects); for (uint16 i = 0; i < item.NumThemeObjects; i++) { - stream->WriteValue(item.ThemeObjects[i]); + stream->WriteValue(item.ThemeObjects[i]); } break; } diff --git a/src/object/ObjectRepository.h b/src/object/ObjectRepository.h index ded9a2a9a8..6e9e414944 100644 --- a/src/object/ObjectRepository.h +++ b/src/object/ObjectRepository.h @@ -29,19 +29,19 @@ extern "C" typedef struct ObjectRepositoryItem { - rct_object_entry_extended ObjectEntry; - utf8 * Path; - uint32 NumImages; - utf8 * Name; - size_t ChunkSize; - uint16 NumRequiredObjects; - rct_object_entry_extended * RequiredObjects; + rct_object_entry ObjectEntry; + utf8 * Path; + uint32 NumImages; + utf8 * Name; + size_t ChunkSize; + uint16 NumRequiredObjects; + rct_object_entry * RequiredObjects; union { struct { - uint16 NumThemeObjects; - rct_object_entry_extended * ThemeObjects; + uint16 NumThemeObjects; + rct_object_entry * ThemeObjects; }; struct {