mirror of https://github.com/OpenRCT2/OpenRCT2.git
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:
parent
995bbffb84
commit
840179299c
13
src/object.h
13
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);
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
*****************************************************************************/
|
||||
#pragma endregion
|
||||
|
||||
#include <algorithm>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
|
@ -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<void>(&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<void>(&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<rct_object_entry_extended>();
|
||||
item.ObjectEntry = stream->ReadValue<rct_object_entry>();
|
||||
item.Path = stream->ReadString();
|
||||
item.NumImages = stream->ReadValue<uint32>();
|
||||
item.Name = stream->ReadString();
|
||||
item.ChunkSize = stream->ReadValue<size_t>();
|
||||
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++)
|
||||
{
|
||||
item.RequiredObjects[i] = stream->ReadValue<rct_object_entry_extended>();
|
||||
item.RequiredObjects[i] = stream->ReadValue<rct_object_entry>();
|
||||
}
|
||||
|
||||
switch (item.ObjectEntry.flags & 0x0F) {
|
||||
|
@ -394,10 +411,10 @@ private:
|
|||
break;
|
||||
case OBJECT_TYPE_SCENERY_SETS:
|
||||
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++)
|
||||
{
|
||||
item.ThemeObjects[i] = stream->ReadValue<rct_object_entry_extended>();
|
||||
item.ThemeObjects[i] = stream->ReadValue<rct_object_entry>();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -434,7 +451,7 @@ private:
|
|||
stream->WriteValue<uint16>(item.NumThemeObjects);
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue