mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-24 00:03:11 +01:00
Merge pull request #13503 from Gymnasiast/refactor/object-entry-descriptor
Create ObjectEntryDescriptor to properly handle mixed DAT and JSON
This commit is contained in:
@@ -41,8 +41,8 @@ set(CMAKE_MACOSX_RPATH 1)
|
|||||||
set(TITLE_SEQUENCE_URL "https://github.com/OpenRCT2/title-sequences/releases/download/v0.1.2c/title-sequences.zip")
|
set(TITLE_SEQUENCE_URL "https://github.com/OpenRCT2/title-sequences/releases/download/v0.1.2c/title-sequences.zip")
|
||||||
set(TITLE_SEQUENCE_SHA1 "304d13a126c15bf2c86ff13b81a2f2cc1856ac8d")
|
set(TITLE_SEQUENCE_SHA1 "304d13a126c15bf2c86ff13b81a2f2cc1856ac8d")
|
||||||
|
|
||||||
set(OBJECTS_URL "https://github.com/OpenRCT2/objects/releases/download/v1.0.18/objects.zip")
|
set(OBJECTS_URL "https://github.com/OpenRCT2/objects/releases/download/v1.0.20/objects.zip")
|
||||||
set(OBJECTS_SHA1 "4a3c32a0251c3babe014844f2c683fc32138b3f2")
|
set(OBJECTS_SHA1 "151424d24b1d49a167932b58319bedaa6ec368e9")
|
||||||
|
|
||||||
set(REPLAYS_URL "https://github.com/OpenRCT2/replays/releases/download/v0.0.22/replays.zip")
|
set(REPLAYS_URL "https://github.com/OpenRCT2/replays/releases/download/v0.0.22/replays.zip")
|
||||||
set(REPLAYS_SHA1 "7591db0a3842a7ac44fcbfbff9a573c9cb3ddc56")
|
set(REPLAYS_SHA1 "7591db0a3842a7ac44fcbfbff9a573c9cb3ddc56")
|
||||||
|
|||||||
@@ -3908,7 +3908,7 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "version=\"1.0.18\"\nzipname=\"objects.zip\"\nliburl=\"https://github.com/OpenRCT2/objects/releases/download/v$version/$zipname\"\n\n[[ ! -d \"${SRCROOT}/data/object\" || ! -e \"${SRCROOT}/objectsversion\" || $(head -n 1 \"${SRCROOT}/objectsversion\") != $version ]]\noutdated=$?\n\nif [[ $outdated -eq 0 ]]; then\nif [[ -d \"${SRCROOT}/data/object\" ]]; then rm -r \"${SRCROOT}/data/object\"; fi\nmkdir -p \"${SRCROOT}/data/object\"\n\ncurl -L -o \"${SRCROOT}/data/object/$zipname\" \"$liburl\"\nunzip -uaq -d \"${SRCROOT}/data/object\" \"${SRCROOT}/data/object/$zipname\"\nrm \"${SRCROOT}/data/object/$zipname\"\n\necho $version > \"${SRCROOT}/objectsversion\"\nfi";
|
shellScript = "version=\"1.0.20\"\nzipname=\"objects.zip\"\nliburl=\"https://github.com/OpenRCT2/objects/releases/download/v$version/$zipname\"\n\n[[ ! -d \"${SRCROOT}/data/object\" || ! -e \"${SRCROOT}/objectsversion\" || $(head -n 1 \"${SRCROOT}/objectsversion\") != $version ]]\noutdated=$?\n\nif [[ $outdated -eq 0 ]]; then\nif [[ -d \"${SRCROOT}/data/object\" ]]; then rm -r \"${SRCROOT}/data/object\"; fi\nmkdir -p \"${SRCROOT}/data/object\"\n\ncurl -L -o \"${SRCROOT}/data/object/$zipname\" \"$liburl\"\nunzip -uaq -d \"${SRCROOT}/data/object\" \"${SRCROOT}/data/object/$zipname\"\nrm \"${SRCROOT}/data/object/$zipname\"\n\necho $version > \"${SRCROOT}/objectsversion\"\nfi";
|
||||||
};
|
};
|
||||||
C68B2D471EC790710020651C /* Download Libraries */ = {
|
C68B2D471EC790710020651C /* Download Libraries */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
|||||||
@@ -46,8 +46,8 @@
|
|||||||
<GtestSha1>058b9df80244c03f1633cb06e9f70471a29ebb8e</GtestSha1>
|
<GtestSha1>058b9df80244c03f1633cb06e9f70471a29ebb8e</GtestSha1>
|
||||||
<TitleSequencesUrl>https://github.com/OpenRCT2/title-sequences/releases/download/v0.1.2c/title-sequences.zip</TitleSequencesUrl>
|
<TitleSequencesUrl>https://github.com/OpenRCT2/title-sequences/releases/download/v0.1.2c/title-sequences.zip</TitleSequencesUrl>
|
||||||
<TitleSequencesSha1>304d13a126c15bf2c86ff13b81a2f2cc1856ac8d</TitleSequencesSha1>
|
<TitleSequencesSha1>304d13a126c15bf2c86ff13b81a2f2cc1856ac8d</TitleSequencesSha1>
|
||||||
<ObjectsUrl>https://github.com/OpenRCT2/objects/releases/download/v1.0.18/objects.zip</ObjectsUrl>
|
<ObjectsUrl>https://github.com/OpenRCT2/objects/releases/download/v1.0.20/objects.zip</ObjectsUrl>
|
||||||
<ObjectsSha1>4a3c32a0251c3babe014844f2c683fc32138b3f2</ObjectsSha1>
|
<ObjectsSha1>151424d24b1d49a167932b58319bedaa6ec368e9</ObjectsSha1>
|
||||||
<ReplaysUrl>https://github.com/OpenRCT2/replays/releases/download/v0.0.22/replays.zip</ReplaysUrl>
|
<ReplaysUrl>https://github.com/OpenRCT2/replays/releases/download/v0.0.22/replays.zip</ReplaysUrl>
|
||||||
<ReplaysSha1>7591db0a3842a7ac44fcbfbff9a573c9cb3ddc56</ReplaysSha1>
|
<ReplaysSha1>7591db0a3842a7ac44fcbfbff9a573c9cb3ddc56</ReplaysSha1>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ let
|
|||||||
objects-src = pkgs.fetchFromGitHub {
|
objects-src = pkgs.fetchFromGitHub {
|
||||||
owner = "OpenRCT2";
|
owner = "OpenRCT2";
|
||||||
repo = "objects";
|
repo = "objects";
|
||||||
rev = "v1.0.18";
|
rev = "v1.0.20";
|
||||||
sha256 = "bf8a28b7ccebaf58e4e9eb2540534632830534cf0b3f73677521dc555878c682";
|
sha256 = "bc266ef589c60302105473499ac142dbf951847be15e65b692d165ce261aeae0";
|
||||||
};
|
};
|
||||||
|
|
||||||
title-sequences-src = pkgs.fetchFromGitHub {
|
title-sequences-src = pkgs.fetchFromGitHub {
|
||||||
|
|||||||
@@ -455,7 +455,7 @@ bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_
|
|||||||
{
|
{
|
||||||
for (const auto& sgEntry : item->SceneryGroupInfo.Entries)
|
for (const auto& sgEntry : item->SceneryGroupInfo.Entries)
|
||||||
{
|
{
|
||||||
window_editor_object_selection_select_object(++isMasterObject, flags, &sgEntry);
|
window_editor_object_selection_select_object(++isMasterObject, flags, sgEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,7 +494,7 @@ bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_
|
|||||||
{
|
{
|
||||||
for (const auto& sgEntry : item->SceneryGroupInfo.Entries)
|
for (const auto& sgEntry : item->SceneryGroupInfo.Entries)
|
||||||
{
|
{
|
||||||
if (!window_editor_object_selection_select_object(++isMasterObject, flags, &sgEntry))
|
if (!window_editor_object_selection_select_object(++isMasterObject, flags, sgEntry))
|
||||||
{
|
{
|
||||||
_maxObjectsWasHit = true;
|
_maxObjectsWasHit = true;
|
||||||
}
|
}
|
||||||
@@ -537,6 +537,14 @@ bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_
|
|||||||
return window_editor_object_selection_select_object(isMasterObject, flags, item);
|
return window_editor_object_selection_select_object(isMasterObject, flags, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_t flags, const ObjectEntryDescriptor& entry)
|
||||||
|
{
|
||||||
|
if (entry.Generation == ObjectGeneration::DAT)
|
||||||
|
return window_editor_object_selection_select_object(isMasterObject, flags, &entry.Entry);
|
||||||
|
|
||||||
|
return window_editor_object_selection_select_object(isMasterObject, flags, entry.Identifier);
|
||||||
|
}
|
||||||
|
|
||||||
bool editor_check_object_group_at_least_one_selected(ObjectType checkObjectType)
|
bool editor_check_object_group_at_least_one_selected(ObjectType checkObjectType)
|
||||||
{
|
{
|
||||||
int32_t numObjects = static_cast<int32_t>(object_repository_get_items_count());
|
int32_t numObjects = static_cast<int32_t>(object_repository_get_items_count());
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ void finish_object_selection();
|
|||||||
bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_t flags, const ObjectRepositoryItem* item);
|
bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_t flags, const ObjectRepositoryItem* item);
|
||||||
bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_t flags, std::string_view identifier);
|
bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_t flags, std::string_view identifier);
|
||||||
bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_t flags, const rct_object_entry* entry);
|
bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_t flags, const rct_object_entry* entry);
|
||||||
|
bool window_editor_object_selection_select_object(uint8_t isMasterObject, int32_t flags, const ObjectEntryDescriptor& entry);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes all unused objects from the object selection.
|
* Removes all unused objects from the object selection.
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include "IStream.hpp"
|
#include "IStream.hpp"
|
||||||
|
|
||||||
|
#include "../object/Object.h"
|
||||||
#include "Memory.hpp"
|
#include "Memory.hpp"
|
||||||
#include "String.hpp"
|
#include "String.hpp"
|
||||||
|
|
||||||
@@ -61,4 +62,22 @@ namespace OpenRCT2
|
|||||||
WriteString(str.c_str());
|
WriteString(str.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ObjectEntryDescriptor IStream::ReadObjectEntryDescriptor()
|
||||||
|
{
|
||||||
|
auto generation = ReadValue<ObjectGeneration>();
|
||||||
|
if (generation == ObjectGeneration::DAT)
|
||||||
|
return ObjectEntryDescriptor(ReadValue<rct_object_entry>());
|
||||||
|
|
||||||
|
return ObjectEntryDescriptor(ReadStdString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void IStream::WriteObjectEntryDescriptor(const ObjectEntryDescriptor& oed)
|
||||||
|
{
|
||||||
|
WriteValue<ObjectGeneration>(oed.Generation);
|
||||||
|
if (oed.Generation == ObjectGeneration::DAT)
|
||||||
|
WriteValue<rct_object_entry>(oed.Entry);
|
||||||
|
else
|
||||||
|
WriteString(oed.Identifier);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace OpenRCT2
|
} // namespace OpenRCT2
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../common.h"
|
#include "../common.h"
|
||||||
|
#include "../object/Object.h"
|
||||||
#include "Memory.hpp"
|
#include "Memory.hpp"
|
||||||
|
|
||||||
#include <istream>
|
#include <istream>
|
||||||
@@ -206,6 +207,8 @@ namespace OpenRCT2
|
|||||||
std::string ReadStdString();
|
std::string ReadStdString();
|
||||||
void WriteString(const utf8* str);
|
void WriteString(const utf8* str);
|
||||||
void WriteString(const std::string& string);
|
void WriteString(const std::string& string);
|
||||||
|
ObjectEntryDescriptor ReadObjectEntryDescriptor();
|
||||||
|
void WriteObjectEntryDescriptor(const ObjectEntryDescriptor& oed);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace OpenRCT2
|
} // namespace OpenRCT2
|
||||||
|
|||||||
@@ -11,10 +11,12 @@
|
|||||||
|
|
||||||
#include "../common.h"
|
#include "../common.h"
|
||||||
#include "../core/JsonFwd.hpp"
|
#include "../core/JsonFwd.hpp"
|
||||||
|
#include "../util/Util.h"
|
||||||
#include "ImageTable.h"
|
#include "ImageTable.h"
|
||||||
#include "StringTable.h"
|
#include "StringTable.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cstring>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -126,6 +128,46 @@ struct rct_object_entry_group
|
|||||||
assert_struct_size(rct_object_entry_group, 8);
|
assert_struct_size(rct_object_entry_group, 8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
enum class ObjectGeneration : uint8_t
|
||||||
|
{
|
||||||
|
DAT,
|
||||||
|
JSON,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ObjectEntryDescriptor
|
||||||
|
{
|
||||||
|
ObjectGeneration Generation;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
rct_object_entry Entry; // For DAT objects
|
||||||
|
char Identifier[64]; // For JSON objects
|
||||||
|
};
|
||||||
|
|
||||||
|
ObjectEntryDescriptor() = default;
|
||||||
|
explicit ObjectEntryDescriptor(const rct_object_entry& newEntry)
|
||||||
|
{
|
||||||
|
Generation = ObjectGeneration::DAT;
|
||||||
|
Entry = newEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit ObjectEntryDescriptor(std::string_view newIdentifier)
|
||||||
|
{
|
||||||
|
Generation = ObjectGeneration::JSON;
|
||||||
|
safe_strcpy(const_cast<char*>(Identifier), std::string(newIdentifier).c_str(), 64);
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectEntryDescriptor& operator=(const ObjectEntryDescriptor& newEntry)
|
||||||
|
{
|
||||||
|
Generation = newEntry.Generation;
|
||||||
|
if (newEntry.Generation == ObjectGeneration::DAT)
|
||||||
|
Entry = newEntry.Entry;
|
||||||
|
else
|
||||||
|
safe_strcpy(const_cast<char*>(Identifier), std::string(newEntry.Identifier).c_str(), 64);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct rct_ride_filters
|
struct rct_ride_filters
|
||||||
{
|
{
|
||||||
uint8_t category[2];
|
uint8_t category[2];
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class ObjectFileIndex final : public FileIndex<ObjectRepositoryItem>
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
static constexpr uint32_t MAGIC_NUMBER = 0x5844494F; // OIDX
|
static constexpr uint32_t MAGIC_NUMBER = 0x5844494F; // OIDX
|
||||||
static constexpr uint16_t VERSION = 23;
|
static constexpr uint16_t VERSION = 24;
|
||||||
static constexpr auto PATTERN = "*.dat;*.pob;*.json;*.parkobj";
|
static constexpr auto PATTERN = "*.dat;*.pob;*.json;*.parkobj";
|
||||||
|
|
||||||
IObjectRepository& _objectRepository;
|
IObjectRepository& _objectRepository;
|
||||||
@@ -163,7 +163,7 @@ protected:
|
|||||||
stream->WriteValue<uint16_t>(static_cast<uint16_t>(item.SceneryGroupInfo.Entries.size()));
|
stream->WriteValue<uint16_t>(static_cast<uint16_t>(item.SceneryGroupInfo.Entries.size()));
|
||||||
for (const auto& entry : item.SceneryGroupInfo.Entries)
|
for (const auto& entry : item.SceneryGroupInfo.Entries)
|
||||||
{
|
{
|
||||||
stream->WriteValue<rct_object_entry>(entry);
|
stream->WriteObjectEntryDescriptor(entry);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -211,10 +211,10 @@ protected:
|
|||||||
case ObjectType::SceneryGroup:
|
case ObjectType::SceneryGroup:
|
||||||
{
|
{
|
||||||
auto numEntries = stream->ReadValue<uint16_t>();
|
auto numEntries = stream->ReadValue<uint16_t>();
|
||||||
item.SceneryGroupInfo.Entries = std::vector<rct_object_entry>(numEntries);
|
item.SceneryGroupInfo.Entries = std::vector<ObjectEntryDescriptor>(numEntries);
|
||||||
for (size_t i = 0; i < numEntries; i++)
|
for (size_t i = 0; i < numEntries; i++)
|
||||||
{
|
{
|
||||||
item.SceneryGroupInfo.Entries[i] = stream->ReadValue<rct_object_entry>();
|
item.SceneryGroupInfo.Entries[i] = stream->ReadObjectEntryDescriptor();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -310,6 +310,14 @@ public:
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ObjectRepositoryItem* FindObject(const ObjectEntryDescriptor& entry) const override final
|
||||||
|
{
|
||||||
|
if (entry.Generation == ObjectGeneration::DAT)
|
||||||
|
return FindObject(&entry.Entry);
|
||||||
|
|
||||||
|
return FindObject(entry.Identifier);
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<Object> LoadObject(const ObjectRepositoryItem* ori) override
|
std::unique_ptr<Object> LoadObject(const ObjectRepositoryItem* ori) override
|
||||||
{
|
{
|
||||||
Guard::ArgumentNotNull(ori, GUARD_LINE);
|
Guard::ArgumentNotNull(ori, GUARD_LINE);
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ struct ObjectRepositoryItem
|
|||||||
} RideInfo;
|
} RideInfo;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
std::vector<rct_object_entry> Entries;
|
std::vector<ObjectEntryDescriptor> Entries;
|
||||||
} SceneryGroupInfo;
|
} SceneryGroupInfo;
|
||||||
|
|
||||||
ObjectSourceGame GetFirstSourceGame() const
|
ObjectSourceGame GetFirstSourceGame() const
|
||||||
@@ -75,6 +75,7 @@ struct IObjectRepository
|
|||||||
virtual const ObjectRepositoryItem* FindObjectLegacy(const std::string_view& legacyIdentifier) const abstract;
|
virtual const ObjectRepositoryItem* FindObjectLegacy(const std::string_view& legacyIdentifier) const abstract;
|
||||||
virtual const ObjectRepositoryItem* FindObject(std::string_view identifier) const abstract;
|
virtual const ObjectRepositoryItem* FindObject(std::string_view identifier) const abstract;
|
||||||
virtual const ObjectRepositoryItem* FindObject(const rct_object_entry* objectEntry) const abstract;
|
virtual const ObjectRepositoryItem* FindObject(const rct_object_entry* objectEntry) const abstract;
|
||||||
|
virtual const ObjectRepositoryItem* FindObject(const ObjectEntryDescriptor& oed) const abstract;
|
||||||
|
|
||||||
virtual std::unique_ptr<Object> LoadObject(const ObjectRepositoryItem* ori) abstract;
|
virtual std::unique_ptr<Object> LoadObject(const ObjectRepositoryItem* ori) abstract;
|
||||||
virtual void RegisterLoadedObject(const ObjectRepositoryItem* ori, Object* object) abstract;
|
virtual void RegisterLoadedObject(const ObjectRepositoryItem* ori, Object* object) abstract;
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ void SceneryGroupObject::UpdateEntryIndexes()
|
|||||||
_legacyType.entry_count = 0;
|
_legacyType.entry_count = 0;
|
||||||
for (const auto& objectEntry : _items)
|
for (const auto& objectEntry : _items)
|
||||||
{
|
{
|
||||||
auto ori = objectRepository.FindObject(&objectEntry);
|
auto ori = objectRepository.FindObject(objectEntry);
|
||||||
if (ori == nullptr)
|
if (ori == nullptr)
|
||||||
continue;
|
continue;
|
||||||
if (ori->LoadedObject == nullptr)
|
if (ori->LoadedObject == nullptr)
|
||||||
@@ -98,14 +98,14 @@ void SceneryGroupObject::SetRepositoryItem(ObjectRepositoryItem* item) const
|
|||||||
item->SceneryGroupInfo.Entries = _items;
|
item->SceneryGroupInfo.Entries = _items;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<rct_object_entry> SceneryGroupObject::ReadItems(IStream* stream)
|
std::vector<ObjectEntryDescriptor> SceneryGroupObject::ReadItems(IStream* stream)
|
||||||
{
|
{
|
||||||
auto items = std::vector<rct_object_entry>();
|
auto items = std::vector<ObjectEntryDescriptor>();
|
||||||
while (stream->ReadValue<uint8_t>() != 0xFF)
|
while (stream->ReadValue<uint8_t>() != 0xFF)
|
||||||
{
|
{
|
||||||
stream->Seek(-1, STREAM_SEEK_CURRENT);
|
stream->Seek(-1, STREAM_SEEK_CURRENT);
|
||||||
auto entry = stream->ReadValue<rct_object_entry>();
|
auto entry = stream->ReadValue<rct_object_entry>();
|
||||||
items.push_back(entry);
|
items.push_back(ObjectEntryDescriptor(entry));
|
||||||
}
|
}
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
@@ -166,13 +166,13 @@ EntertainerCostume SceneryGroupObject::ParseEntertainerCostume(const std::string
|
|||||||
return EntertainerCostume::Panda;
|
return EntertainerCostume::Panda;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<rct_object_entry> SceneryGroupObject::ReadJsonEntries(json_t& jEntries)
|
std::vector<ObjectEntryDescriptor> SceneryGroupObject::ReadJsonEntries(json_t& jEntries)
|
||||||
{
|
{
|
||||||
std::vector<rct_object_entry> entries;
|
std::vector<ObjectEntryDescriptor> entries;
|
||||||
|
|
||||||
for (auto& jEntry : jEntries)
|
for (auto& jEntry : jEntries)
|
||||||
{
|
{
|
||||||
auto entry = ParseObjectEntry(Json::GetString(jEntry));
|
auto entry = ObjectEntryDescriptor(Json::GetString(jEntry));
|
||||||
entries.push_back(entry);
|
entries.push_back(entry);
|
||||||
}
|
}
|
||||||
return entries;
|
return entries;
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class SceneryGroupObject final : public Object
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
rct_scenery_group_entry _legacyType = {};
|
rct_scenery_group_entry _legacyType = {};
|
||||||
std::vector<rct_object_entry> _items;
|
std::vector<ObjectEntryDescriptor> _items;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit SceneryGroupObject(const rct_object_entry& entry)
|
explicit SceneryGroupObject(const rct_object_entry& entry)
|
||||||
@@ -46,8 +46,8 @@ public:
|
|||||||
void SetRepositoryItem(ObjectRepositoryItem* item) const override;
|
void SetRepositoryItem(ObjectRepositoryItem* item) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static std::vector<rct_object_entry> ReadItems(OpenRCT2::IStream* stream);
|
static std::vector<ObjectEntryDescriptor> ReadItems(OpenRCT2::IStream* stream);
|
||||||
static uint32_t ReadJsonEntertainerCostumes(json_t& jCostumes);
|
static uint32_t ReadJsonEntertainerCostumes(json_t& jCostumes);
|
||||||
static EntertainerCostume ParseEntertainerCostume(const std::string& s);
|
static EntertainerCostume ParseEntertainerCostume(const std::string& s);
|
||||||
static std::vector<rct_object_entry> ReadJsonEntries(json_t& jEntries);
|
static std::vector<ObjectEntryDescriptor> ReadJsonEntries(json_t& jEntries);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user