diff --git a/src/object/ObjectManager.cpp b/src/object/ObjectManager.cpp index fa67e51406..f2fa25a423 100644 --- a/src/object/ObjectManager.cpp +++ b/src/object/ObjectManager.cpp @@ -22,6 +22,7 @@ #include "Object.h" #include "ObjectManager.h" #include "ObjectRepository.h" +#include "SceneryGroupObject.h" extern "C" { @@ -94,6 +95,7 @@ public: { _loadedObjects[slot] = loadedObject; UpdateLegacyLoadedObjectList(); + UpdateSceneryGroupIndexes(); reset_type_to_ride_entry_index_map(); } } @@ -130,6 +132,7 @@ public: { SetNewLoadedObjectList(loadedObjects); UpdateLegacyLoadedObjectList(); + UpdateSceneryGroupIndexes(); reset_type_to_ride_entry_index_map(); // Console::WriteLine("%u / %u new objects loaded", numNewLoadedObjects, numRequiredObjects); return true; @@ -162,6 +165,7 @@ public: if (numObjectsUnloaded > 0) { UpdateLegacyLoadedObjectList(); + UpdateSceneryGroupIndexes(); reset_type_to_ride_entry_index_map(); } } @@ -177,6 +181,7 @@ public: } } UpdateLegacyLoadedObjectList(); + UpdateSceneryGroupIndexes(); reset_type_to_ride_entry_index_map(); } @@ -329,6 +334,25 @@ private: } } + void UpdateSceneryGroupIndexes() + { + if (_loadedObjects != nullptr) + { + for (size_t i = 0; i < OBJECT_ENTRY_COUNT; i++) + { + Object * loadedObject = _loadedObjects[i]; + if (loadedObject != nullptr) + { + if (loadedObject->GetObjectType() == OBJECT_TYPE_SCENERY_SETS) + { + auto sgObject = static_cast(loadedObject); + sgObject->UpdateEntryIndexes(); + } + } + } + } + } + bool GetRequiredObjects(const rct_object_entry * entries, const ObjectRepositoryItem * * requiredObjects, size_t * outNumRequiredObjects) diff --git a/src/object/SceneryGroupObject.cpp b/src/object/SceneryGroupObject.cpp index 2976d6c2a9..45bc7bd6d8 100644 --- a/src/object/SceneryGroupObject.cpp +++ b/src/object/SceneryGroupObject.cpp @@ -16,6 +16,7 @@ #include "../core/IStream.hpp" #include "../core/Memory.hpp" +#include "ObjectManager.h" #include "ObjectRepository.h" #include "SceneryGroupObject.h" @@ -56,27 +57,7 @@ void SceneryGroupObject::Load() { _legacyType.name = language_allocate_object_string(GetName()); _legacyType.image = gfx_object_allocate_images(GetImageTable()->GetImages(), GetImageTable()->GetCount()); - _legacyType.entry_count = 0; - for (uint32 i = 0; i < _numItems; i++) - { - uint8 entryType; - uint8 entryIndex; - if (find_object_in_entry_group(&_items[i], &entryType, &entryIndex)) - { - uint16 sceneryEntry = entryIndex; - switch (entryType) { - case OBJECT_TYPE_SMALL_SCENERY: break; - case OBJECT_TYPE_LARGE_SCENERY: sceneryEntry |= 0x300; break; - case OBJECT_TYPE_WALLS: sceneryEntry |= 0x200; break; - case OBJECT_TYPE_PATH_BITS: sceneryEntry |= 0x100; break; - default: sceneryEntry |= 0x400; break; - } - - _legacyType.scenery_entries[_legacyType.entry_count] = sceneryEntry; - _legacyType.entry_count++; - } - } } void SceneryGroupObject::Unload() @@ -97,6 +78,37 @@ void SceneryGroupObject::DrawPreview(rct_drawpixelinfo * dpi) const gfx_draw_sprite(dpi, imageId, x - 15, y - 14, 0); } +void SceneryGroupObject::UpdateEntryIndexes() +{ + IObjectRepository * objectRepository = GetObjectRepository(); + IObjectManager * objectManager = GetObjectManager(); + + _legacyType.entry_count = 0; + for (uint32 i = 0; i < _numItems; i++) + { + const rct_object_entry * objectEntry = &_items[i]; + + const ObjectRepositoryItem * ori = objectRepository->FindObject(objectEntry); + if (ori == nullptr) continue; + if (ori->LoadedObject == nullptr) continue; + + uint16 sceneryEntry = objectManager->GetLoadedObjectEntryIndex(ori->LoadedObject); + Guard::Assert(sceneryEntry != UINT8_MAX); + + uint8 objectType = objectEntry->flags & 0x0F; + switch (objectType) { + case OBJECT_TYPE_SMALL_SCENERY: break; + case OBJECT_TYPE_LARGE_SCENERY: sceneryEntry |= 0x300; break; + case OBJECT_TYPE_WALLS: sceneryEntry |= 0x200; break; + case OBJECT_TYPE_PATH_BITS: sceneryEntry |= 0x100; break; + default: sceneryEntry |= 0x400; break; + } + + _legacyType.scenery_entries[_legacyType.entry_count] = sceneryEntry; + _legacyType.entry_count++; + } +} + void SceneryGroupObject::SetRepositoryItem(ObjectRepositoryItem * item) const { Memory::Free(item->ThemeObjects); diff --git a/src/object/SceneryGroupObject.h b/src/object/SceneryGroupObject.h index af4df3cd44..93697ee0c7 100644 --- a/src/object/SceneryGroupObject.h +++ b/src/object/SceneryGroupObject.h @@ -41,6 +41,7 @@ public: void ReadLegacy(IReadObjectContext * context, IStream * stream) override; void Load() override; void Unload() override; + void UpdateEntryIndexes(); void DrawPreview(rct_drawpixelinfo * dpi) const override;