Use dataserialiser to simplify object repo code

This commit is contained in:
duncanspumpkin 2020-12-06 16:54:29 +00:00
parent 3a4ccfef37
commit ee9ede6c33
1 changed files with 22 additions and 65 deletions

View File

@ -128,46 +128,25 @@ public:
protected: protected:
void Serialise(IStream* stream, const ObjectRepositoryItem& item) const override void Serialise(IStream* stream, const ObjectRepositoryItem& item) const override
{ {
stream->WriteString(item.Identifier); DataSerialiser serialiser(true, *stream);
stream->WriteValue(item.ObjectEntry); serialiser << item.Identifier;
stream->WriteString(item.Path); serialiser << item.ObjectEntry;
stream->WriteString(item.Name); serialiser << item.Path;
serialiser << item.Name;
uint8_t sourceLength = static_cast<uint8_t>(item.Sources.size()); serialiser << item.Sources;
stream->WriteValue(sourceLength); serialiser << item.Authors;
for (auto source : item.Sources)
{
stream->WriteValue(source);
}
uint8_t authorsLength = static_cast<uint8_t>(item.Authors.size());
stream->WriteValue(authorsLength);
for (const auto& author : item.Authors)
{
stream->WriteString(author);
}
switch (item.ObjectEntry.GetType()) switch (item.ObjectEntry.GetType())
{ {
case ObjectType::Ride: case ObjectType::Ride:
stream->WriteValue<uint8_t>(item.RideInfo.RideFlags); serialiser << item.RideInfo.RideFlags;
for (int32_t i = 0; i < MAX_CATEGORIES_PER_RIDE; i++) serialiser << item.RideInfo.RideCategory;
{ serialiser << item.RideInfo.RideType;
stream->WriteValue<uint8_t>(item.RideInfo.RideCategory[i]);
}
for (int32_t i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++)
{
stream->WriteValue<uint8_t>(item.RideInfo.RideType[i]);
}
break; break;
case ObjectType::SceneryGroup: case ObjectType::SceneryGroup:
{ {
stream->WriteValue<uint16_t>(static_cast<uint16_t>(item.SceneryGroupInfo.Entries.size())); serialiser << item.SceneryGroupInfo.Entries;
DataSerialiser serialiser(true, *stream);
for (const auto& entry : item.SceneryGroupInfo.Entries)
{
serialiser << entry;
}
break; break;
} }
default: default:
@ -179,48 +158,26 @@ protected:
ObjectRepositoryItem Deserialise(IStream* stream) const override ObjectRepositoryItem Deserialise(IStream* stream) const override
{ {
ObjectRepositoryItem item; ObjectRepositoryItem item;
DataSerialiser serialiser(false, *stream);
item.Identifier = stream->ReadStdString(); serialiser << item.Identifier;
item.ObjectEntry = stream->ReadValue<rct_object_entry>(); serialiser << item.ObjectEntry;
item.Path = stream->ReadStdString(); serialiser << item.Path;
item.Name = stream->ReadStdString(); serialiser << item.Name;
auto sourceLength = stream->ReadValue<uint8_t>(); serialiser << item.Sources;
for (size_t i = 0; i < sourceLength; i++) serialiser << item.Authors;
{
auto value = stream->ReadValue<uint8_t>();
item.Sources.push_back(static_cast<ObjectSourceGame>(value));
}
auto authorsLength = stream->ReadValue<uint8_t>();
for (size_t i = 0; i < authorsLength; i++)
{
auto author = stream->ReadStdString();
item.Authors.emplace_back(author);
}
switch (item.ObjectEntry.GetType()) switch (item.ObjectEntry.GetType())
{ {
case ObjectType::Ride: case ObjectType::Ride:
item.RideInfo.RideFlags = stream->ReadValue<uint8_t>(); serialiser << item.RideInfo.RideFlags;
for (int32_t i = 0; i < MAX_CATEGORIES_PER_RIDE; i++) serialiser << item.RideInfo.RideCategory;
{ serialiser << item.RideInfo.RideType;
item.RideInfo.RideCategory[i] = stream->ReadValue<uint8_t>();
}
for (int32_t i = 0; i < MAX_RIDE_TYPES_PER_RIDE_ENTRY; i++)
{
item.RideInfo.RideType[i] = stream->ReadValue<uint8_t>();
}
break; break;
case ObjectType::SceneryGroup: case ObjectType::SceneryGroup:
{ {
auto numEntries = stream->ReadValue<uint16_t>(); serialiser << item.SceneryGroupInfo.Entries;
item.SceneryGroupInfo.Entries = std::vector<ObjectEntryDescriptor>(numEntries);
DataSerialiser serialiser(false, *stream);
for (size_t i = 0; i < numEntries; i++)
{
serialiser << item.SceneryGroupInfo.Entries[i];
}
break; break;
} }
default: default: