diff --git a/src/object/EntranceObject.cpp b/src/object/EntranceObject.cpp index 73149bcb11..d1b0e3a45b 100644 --- a/src/object/EntranceObject.cpp +++ b/src/object/EntranceObject.cpp @@ -17,6 +17,11 @@ #include "../core/IStream.hpp" #include "EntranceObject.h" +enum OBJ_STRING_ID +{ + OBJ_STRING_ID_NAME, +}; + void EntranceObject::ReadLegacy(IStream * stream) { _legacyType.string_idx = stream->ReadValue(); @@ -24,8 +29,8 @@ void EntranceObject::ReadLegacy(IStream * stream) _legacyType.scrolling_mode = stream->ReadValue(); _legacyType.text_height = stream->ReadValue(); - LoadStringTable(stream, 0); - LoadImageTable(stream); + StringTable.Read(stream, OBJ_STRING_ID_NAME); + ImageTable.Read(stream); } void EntranceObject::Load() @@ -37,3 +42,8 @@ void EntranceObject::Unload() { } + +const utf8 * EntranceObject::GetName() +{ + return StringTable.GetString(OBJ_STRING_ID_NAME); +} diff --git a/src/object/EntranceObject.h b/src/object/EntranceObject.h index e9586a5de1..08091cbcd5 100644 --- a/src/object/EntranceObject.h +++ b/src/object/EntranceObject.h @@ -26,14 +26,16 @@ extern "C" class EntranceObject : public Object { private: - rct_object_entry _objectEntry; rct_entrance_type _legacyType; public: - const rct_object_entry * GetObjectEntry() override { return &_objectEntry; } - void * GetLegacyData() override { return &_legacyType; } + explicit EntranceObject(const rct_object_entry &entry) : Object(entry) { }; + + void * GetLegacyData() override { return &_legacyType; } void ReadLegacy(IStream * stream) override; void Load() override; void Unload() override; + + const utf8 * GetName() override; }; diff --git a/src/object/Object.cpp b/src/object/Object.cpp index e758e2e1c1..decc2e977f 100644 --- a/src/object/Object.cpp +++ b/src/object/Object.cpp @@ -16,12 +16,7 @@ #include "Object.h" -void Object::LoadStringTable(IStream * stream, uint8 id) +Object::Object(const rct_object_entry &entry) { - _stringTable.Read(stream, id); -} - -void Object::LoadImageTable(IStream * stream) -{ - _imageTable.Read(stream); + _objectEntry = entry; } diff --git a/src/object/Object.h b/src/object/Object.h index 0f5548eeca..a68b19c03c 100644 --- a/src/object/Object.h +++ b/src/object/Object.h @@ -30,21 +30,23 @@ interface IStream; class Object { private: - StringTable _stringTable; - ImageTable _imageTable; + rct_object_entry _objectEntry; + +protected: + StringTable StringTable; + ImageTable ImageTable; public: + explicit Object(const rct_object_entry &entry); virtual ~Object() { } // Legacy data structures - virtual const rct_object_entry * GetObjectEntry() abstract; - virtual void * GetLegacyData() abstract; + const rct_object_entry * GetObjectEntry() const { return &_objectEntry; } + virtual void * GetLegacyData() abstract; virtual void ReadLegacy(IStream * stream) abstract; virtual void Load() abstract; virtual void Unload() abstract; -protected: - void LoadStringTable(IStream * stream, uint8 id); - void LoadImageTable(IStream * stream); + virtual const utf8 * GetName() abstract; }; diff --git a/src/object/ObjectFactory.cpp b/src/object/ObjectFactory.cpp index aa926e3b0b..957f10e34b 100644 --- a/src/object/ObjectFactory.cpp +++ b/src/object/ObjectFactory.cpp @@ -39,8 +39,7 @@ namespace ObjectFactory rct_object_entry entry; if (SDL_RWread(file, &entry, sizeof(entry), 1) == 1) { - uint8 objectType = entry.flags & 0x0F; - result = CreateObject(objectType); + result = CreateObject(entry); if (result != nullptr) { size_t bufferSize = 0x600000; @@ -56,13 +55,14 @@ namespace ObjectFactory return result; } - Object * CreateObject(uint8 type) + Object * CreateObject(const rct_object_entry &entry) { Object * result = nullptr; - switch (type) { + uint8 objectType = entry.flags & 0x0F; + switch (objectType) { case OBJECT_TYPE_PARK_ENTRANCE: - result = new EntranceObject(); + result = new EntranceObject(entry); break; } diff --git a/src/object/ObjectFactory.h b/src/object/ObjectFactory.h index 5819adf242..4d89b7ca6e 100644 --- a/src/object/ObjectFactory.h +++ b/src/object/ObjectFactory.h @@ -23,5 +23,5 @@ class Object; namespace ObjectFactory { Object * CreateObjectFromLegacyFile(utf8 * path); - Object * CreateObject(uint8 type); + Object * CreateObject(const rct_object_entry &entry); } diff --git a/src/object/ObjectRepository.cpp b/src/object/ObjectRepository.cpp index 954814940b..203a1ffe79 100644 --- a/src/object/ObjectRepository.cpp +++ b/src/object/ObjectRepository.cpp @@ -57,6 +57,11 @@ class ObjectRepository : public IObjectRepository QueryDirectoryResult _queryDirectoryResult; public: + ~ObjectRepository() + { + ClearItems(); + } + void LoadOrConstruct() { ClearItems(); @@ -140,7 +145,11 @@ private: Object * object = ObjectFactory::CreateObjectFromLegacyFile(path); if (object != nullptr) { - // TODO + ObjectRepositoryItem item = { 0 }; + Memory::Copy(&item.ObjectEntry, object->GetObjectEntry(), sizeof(rct_object_entry)); + item.Path = String::Duplicate(path); + item.Name = String::Duplicate(object->GetName()); + _items.push_back(item); } } @@ -197,7 +206,7 @@ private: // Write items for (uint32 i = 0; i < header.NumItems; i++) { - fs.WriteValue(_items[i]); + WriteItem(&fs, _items[i]); } } catch (IOException ex) @@ -285,8 +294,12 @@ private: static void FreeItem(ObjectRepositoryItem * item) { + Memory::Free(item->Path); + Memory::Free(item->Name); Memory::Free(item->RequiredObjects); Memory::Free(item->ThemeObjects); + item->Path = nullptr; + item->Name = nullptr; item->RequiredObjects = nullptr; item->ThemeObjects = nullptr; } diff --git a/src/object/StringTable.cpp b/src/object/StringTable.cpp index 9a0c823b3e..4939aefb21 100644 --- a/src/object/StringTable.cpp +++ b/src/object/StringTable.cpp @@ -64,6 +64,18 @@ void StringTable::Read(IStream * stream, uint8 id) Sort(); } +const utf8 * StringTable::GetString(uint8 id) +{ + for (auto &string : _strings) + { + if (string.Id == id) + { + return string.Text; + } + } + return nullptr; +} + void StringTable::Sort() { std::sort(_strings.begin(), _strings.end(), [](const StringTableEntry &a, const StringTableEntry &b) -> bool diff --git a/src/object/StringTable.h b/src/object/StringTable.h index 8458a63346..aef6ba6d75 100644 --- a/src/object/StringTable.h +++ b/src/object/StringTable.h @@ -35,7 +35,9 @@ private: public: ~StringTable(); - void Read(IStream * stream, uint8 id); + + void Read(IStream * stream, uint8 id); + const utf8 * GetString(uint8 id); private: void Sort();