1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

fix scenery group population

This commit is contained in:
Ted John
2016-07-09 02:01:27 +01:00
parent 5785020b07
commit 7c8fbf3588
3 changed files with 57 additions and 20 deletions

View File

@@ -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<SceneryGroupObject *>(loadedObject);
sgObject->UpdateEntryIndexes();
}
}
}
}
}
bool GetRequiredObjects(const rct_object_entry * entries,
const ObjectRepositoryItem * * requiredObjects,
size_t * outNumRequiredObjects)

View File

@@ -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);

View File

@@ -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;