1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-18 12:33:17 +01:00

Modify object loading for JSON-only objects

This commit is contained in:
Gymnasiast
2021-09-12 21:25:22 +02:00
parent 37821ce25e
commit bdab3219cb
52 changed files with 707 additions and 500 deletions

View File

@@ -255,7 +255,8 @@ namespace ObjectFactory
if (entry.GetType() != ObjectType::ScenarioText)
{
result = CreateObject(entry);
result = CreateObject(entry.GetType());
result->SetDescriptor(ObjectEntryDescriptor(entry));
utf8 objectName[DAT_NAME_LENGTH + 1] = { 0 };
object_entry_get_name_fixed(objectName, sizeof(objectName), &entry);
@@ -287,9 +288,11 @@ namespace ObjectFactory
Guard::ArgumentNotNull(entry, GUARD_LINE);
Guard::ArgumentNotNull(data, GUARD_LINE);
auto result = CreateObject(*entry);
auto result = CreateObject(entry->GetType());
if (result != nullptr)
{
result->SetDescriptor(ObjectEntryDescriptor(*entry));
utf8 objectName[DAT_NAME_LENGTH + 1];
object_entry_get_name_fixed(objectName, sizeof(objectName), entry);
@@ -309,60 +312,60 @@ namespace ObjectFactory
return result;
}
std::unique_ptr<Object> CreateObject(const rct_object_entry& entry)
std::unique_ptr<Object> CreateObject(ObjectType type)
{
std::unique_ptr<Object> result;
switch (entry.GetType())
switch (type)
{
case ObjectType::Ride:
result = std::make_unique<RideObject>(entry);
result = std::make_unique<RideObject>();
break;
case ObjectType::SmallScenery:
result = std::make_unique<SmallSceneryObject>(entry);
result = std::make_unique<SmallSceneryObject>();
break;
case ObjectType::LargeScenery:
result = std::make_unique<LargeSceneryObject>(entry);
result = std::make_unique<LargeSceneryObject>();
break;
case ObjectType::Walls:
result = std::make_unique<WallObject>(entry);
result = std::make_unique<WallObject>();
break;
case ObjectType::Banners:
result = std::make_unique<BannerObject>(entry);
result = std::make_unique<BannerObject>();
break;
case ObjectType::Paths:
result = std::make_unique<FootpathObject>(entry);
result = std::make_unique<FootpathObject>();
break;
case ObjectType::PathBits:
result = std::make_unique<FootpathItemObject>(entry);
result = std::make_unique<FootpathItemObject>();
break;
case ObjectType::SceneryGroup:
result = std::make_unique<SceneryGroupObject>(entry);
result = std::make_unique<SceneryGroupObject>();
break;
case ObjectType::ParkEntrance:
result = std::make_unique<EntranceObject>(entry);
result = std::make_unique<EntranceObject>();
break;
case ObjectType::Water:
result = std::make_unique<WaterObject>(entry);
result = std::make_unique<WaterObject>();
break;
case ObjectType::ScenarioText:
break;
case ObjectType::TerrainSurface:
result = std::make_unique<TerrainSurfaceObject>(entry);
result = std::make_unique<TerrainSurfaceObject>();
break;
case ObjectType::TerrainEdge:
result = std::make_unique<TerrainEdgeObject>(entry);
result = std::make_unique<TerrainEdgeObject>();
break;
case ObjectType::Station:
result = std::make_unique<StationObject>(entry);
result = std::make_unique<StationObject>();
break;
case ObjectType::Music:
result = std::make_unique<MusicObject>(entry);
result = std::make_unique<MusicObject>();
break;
case ObjectType::FootpathSurface:
result = std::make_unique<FootpathSurfaceObject>(entry);
result = std::make_unique<FootpathSurfaceObject>();
break;
case ObjectType::FootpathRailings:
result = std::make_unique<FootpathRailingsObject>(entry);
result = std::make_unique<FootpathRailingsObject>();
break;
default:
throw std::runtime_error("Invalid object type");
@@ -497,22 +500,28 @@ namespace ObjectFactory
{
auto id = Json::GetString(jRoot["id"]);
rct_object_entry entry = {};
ObjectEntryDescriptor descriptor;
auto originalId = Json::GetString(jRoot["originalId"]);
auto originalName = originalId;
if (originalId.length() == 8 + 1 + 8 + 1 + 8)
{
entry.flags = std::stoul(originalId.substr(0, 8), nullptr, 16);
originalName = originalId.substr(9, 8);
entry.checksum = std::stoul(originalId.substr(18, 8), nullptr, 16);
}
// Always set, since originalId might be missing or incorrect.
entry.SetType(objectType);
auto minLength = std::min<size_t>(8, originalName.length());
std::memcpy(entry.name, originalName.c_str(), minLength);
auto originalName = originalId.substr(9, 8);
result = CreateObject(entry);
rct_object_entry entry = {};
entry.flags = std::stoul(originalId.substr(0, 8), nullptr, 16);
entry.checksum = std::stoul(originalId.substr(18, 8), nullptr, 16);
entry.SetType(objectType);
auto minLength = std::min<size_t>(8, originalName.length());
std::memcpy(entry.name, originalName.c_str(), minLength);
descriptor = ObjectEntryDescriptor(entry);
}
else
{
descriptor = ObjectEntryDescriptor(objectType, id);
}
result = CreateObject(objectType);
result->SetIdentifier(id);
result->SetDescriptor(descriptor);
result->MarkAsJsonObject();
auto readContext = ReadObjectContext(objectRepository, id, !gOpenRCT2NoGraphics, fileRetriever);
result->ReadJson(&readContext, jRoot);