scrap object exetended and add sort ability

Not yet sure if we need to sort object repository, but add code for it anyway.
This commit is contained in:
Ted John 2016-06-29 21:34:59 +01:00
parent 995bbffb84
commit 840179299c
3 changed files with 47 additions and 25 deletions

View File

@ -67,10 +67,15 @@ assert_struct_size(rct_object_entry, 0x10);
* size: 0x14 * size: 0x14
*/ */
typedef struct rct_object_entry_extended { typedef struct rct_object_entry_extended {
uint32 flags; union {
char name[8]; rct_object_entry entry;
uint32 checksum; struct {
uint32 chunk_size; uint32 flags;
char name[8];
uint32 checksum;
uint32 chunk_size;
};
};
} rct_object_entry_extended; } rct_object_entry_extended;
assert_struct_size(rct_object_entry_extended, 0x14); assert_struct_size(rct_object_entry_extended, 0x14);

View File

@ -14,6 +14,7 @@
*****************************************************************************/ *****************************************************************************/
#pragma endregion #pragma endregion
#include <algorithm>
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
@ -114,6 +115,8 @@ public:
Construct(); Construct();
Save(); Save();
} }
// SortItems();
} }
const size_t GetNumObjects() const override const size_t GetNumObjects() const override
@ -267,7 +270,7 @@ private:
if (object != nullptr) if (object != nullptr)
{ {
ObjectRepositoryItem item = { 0 }; ObjectRepositoryItem item = { 0 };
Memory::Copy<void>(&item.ObjectEntry, object->GetObjectEntry(), sizeof(rct_object_entry)); item.ObjectEntry = *object->GetObjectEntry();
item.Path = String::Duplicate(path); item.Path = String::Duplicate(path);
item.Name = String::Duplicate(object->GetName()); item.Name = String::Duplicate(object->GetName());
AddItem(&item); 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) bool AddItem(ObjectRepositoryItem * item)
{ {
rct_object_entry entry; const ObjectRepositoryItem * conflict = FindObject(&item->ObjectEntry);
Memory::Copy<void>(&entry, &item->ObjectEntry, sizeof(rct_object_entry));
const ObjectRepositoryItem * conflict = FindObject(&entry);
if (conflict == nullptr) if (conflict == nullptr)
{ {
_items.push_back(*item); _items.push_back(*item);
size_t index = _items.size() - 1; size_t index = _items.size() - 1;
_itemMap[entry] = index; _itemMap[item->ObjectEntry] = index;
return true; return true;
} }
else else
@ -367,17 +384,17 @@ private:
{ {
ObjectRepositoryItem item = { 0 }; ObjectRepositoryItem item = { 0 };
item.ObjectEntry = stream->ReadValue<rct_object_entry_extended>(); item.ObjectEntry = stream->ReadValue<rct_object_entry>();
item.Path = stream->ReadString(); item.Path = stream->ReadString();
item.NumImages = stream->ReadValue<uint32>(); item.NumImages = stream->ReadValue<uint32>();
item.Name = stream->ReadString(); item.Name = stream->ReadString();
item.ChunkSize = stream->ReadValue<size_t>(); item.ChunkSize = stream->ReadValue<size_t>();
item.NumRequiredObjects = stream->ReadValue<uint16>(); item.NumRequiredObjects = stream->ReadValue<uint16>();
item.RequiredObjects = Memory::AllocateArray<rct_object_entry_extended>(item.NumRequiredObjects); item.RequiredObjects = Memory::AllocateArray<rct_object_entry>(item.NumRequiredObjects);
for (uint16 i = 0; i < item.NumRequiredObjects; i++) for (uint16 i = 0; i < item.NumRequiredObjects; i++)
{ {
item.RequiredObjects[i] = stream->ReadValue<rct_object_entry_extended>(); item.RequiredObjects[i] = stream->ReadValue<rct_object_entry>();
} }
switch (item.ObjectEntry.flags & 0x0F) { switch (item.ObjectEntry.flags & 0x0F) {
@ -394,10 +411,10 @@ private:
break; break;
case OBJECT_TYPE_SCENERY_SETS: case OBJECT_TYPE_SCENERY_SETS:
item.NumThemeObjects = stream->ReadValue<uint16>(); item.NumThemeObjects = stream->ReadValue<uint16>();
item.ThemeObjects = Memory::AllocateArray<rct_object_entry_extended>(item.NumThemeObjects); item.ThemeObjects = Memory::AllocateArray<rct_object_entry>(item.NumThemeObjects);
for (uint16 i = 0; i < item.NumThemeObjects; i++) for (uint16 i = 0; i < item.NumThemeObjects; i++)
{ {
item.ThemeObjects[i] = stream->ReadValue<rct_object_entry_extended>(); item.ThemeObjects[i] = stream->ReadValue<rct_object_entry>();
} }
break; break;
} }
@ -434,7 +451,7 @@ private:
stream->WriteValue<uint16>(item.NumThemeObjects); stream->WriteValue<uint16>(item.NumThemeObjects);
for (uint16 i = 0; i < item.NumThemeObjects; i++) for (uint16 i = 0; i < item.NumThemeObjects; i++)
{ {
stream->WriteValue<rct_object_entry_extended>(item.ThemeObjects[i]); stream->WriteValue<rct_object_entry>(item.ThemeObjects[i]);
} }
break; break;
} }

View File

@ -29,19 +29,19 @@ extern "C"
typedef struct ObjectRepositoryItem typedef struct ObjectRepositoryItem
{ {
rct_object_entry_extended ObjectEntry; rct_object_entry ObjectEntry;
utf8 * Path; utf8 * Path;
uint32 NumImages; uint32 NumImages;
utf8 * Name; utf8 * Name;
size_t ChunkSize; size_t ChunkSize;
uint16 NumRequiredObjects; uint16 NumRequiredObjects;
rct_object_entry_extended * RequiredObjects; rct_object_entry * RequiredObjects;
union union
{ {
struct struct
{ {
uint16 NumThemeObjects; uint16 NumThemeObjects;
rct_object_entry_extended * ThemeObjects; rct_object_entry * ThemeObjects;
}; };
struct struct
{ {