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
|
@ -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 {
|
||||||
|
union {
|
||||||
|
rct_object_entry entry;
|
||||||
|
struct {
|
||||||
uint32 flags;
|
uint32 flags;
|
||||||
char name[8];
|
char name[8];
|
||||||
uint32 checksum;
|
uint32 checksum;
|
||||||
uint32 chunk_size;
|
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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue