diff --git a/src/openrct2/object/BannerObject.cpp b/src/openrct2/object/BannerObject.cpp index 625b8bdb18..749c919f6b 100644 --- a/src/openrct2/object/BannerObject.cpp +++ b/src/openrct2/object/BannerObject.cpp @@ -97,5 +97,5 @@ void BannerObject::ReadJson(IReadObjectContext * context, const json_t * root) SetPrimarySceneryGroup(ObjectJsonHelpers::GetString(json_object_get(properties, "sceneryGroup"))); ObjectJsonHelpers::LoadStrings(root, GetStringTable()); - ObjectJsonHelpers::LoadImages(root, GetImageTable()); + ObjectJsonHelpers::LoadImages(context, root, GetImageTable()); } diff --git a/src/openrct2/object/EntranceObject.cpp b/src/openrct2/object/EntranceObject.cpp index c49b213b93..fc1737a63d 100644 --- a/src/openrct2/object/EntranceObject.cpp +++ b/src/openrct2/object/EntranceObject.cpp @@ -73,5 +73,5 @@ void EntranceObject::ReadJson(IReadObjectContext * context, const json_t * root) _legacyType.text_height = json_integer_value(json_object_get(properties, "textHeight")); ObjectJsonHelpers::LoadStrings(root, GetStringTable()); - ObjectJsonHelpers::LoadImages(root, GetImageTable()); + ObjectJsonHelpers::LoadImages(context, root, GetImageTable()); } diff --git a/src/openrct2/object/FootpathItemObject.cpp b/src/openrct2/object/FootpathItemObject.cpp index 78006e1186..97a5fee55e 100644 --- a/src/openrct2/object/FootpathItemObject.cpp +++ b/src/openrct2/object/FootpathItemObject.cpp @@ -118,5 +118,5 @@ void FootpathItemObject::ReadJson(IReadObjectContext * context, const json_t * r { "isTelevision", PATH_BIT_FLAG_IS_QUEUE_SCREEN }}); ObjectJsonHelpers::LoadStrings(root, GetStringTable()); - ObjectJsonHelpers::LoadImages(root, GetImageTable()); + ObjectJsonHelpers::LoadImages(context, root, GetImageTable()); } diff --git a/src/openrct2/object/FootpathObject.cpp b/src/openrct2/object/FootpathObject.cpp index 9595b7911d..3fd27b6c5a 100644 --- a/src/openrct2/object/FootpathObject.cpp +++ b/src/openrct2/object/FootpathObject.cpp @@ -83,5 +83,5 @@ void FootpathObject::ReadJson(IReadObjectContext * context, const json_t * root) { "editorOnly", FOOTPATH_ENTRY_FLAG_SHOW_ONLY_IN_SCENARIO_EDITOR } }); ObjectJsonHelpers::LoadStrings(root, GetStringTable()); - ObjectJsonHelpers::LoadImages(root, GetImageTable()); + ObjectJsonHelpers::LoadImages(context, root, GetImageTable()); } diff --git a/src/openrct2/object/LargeSceneryObject.cpp b/src/openrct2/object/LargeSceneryObject.cpp index cff381489c..2c1aa6fcd0 100644 --- a/src/openrct2/object/LargeSceneryObject.cpp +++ b/src/openrct2/object/LargeSceneryObject.cpp @@ -163,7 +163,7 @@ void LargeSceneryObject::ReadJson(IReadObjectContext * context, const json_t * r SetPrimarySceneryGroup(ObjectJsonHelpers::GetString(json_object_get(properties, "sceneryGroup"))); ObjectJsonHelpers::LoadStrings(root, GetStringTable()); - ObjectJsonHelpers::LoadImages(root, GetImageTable()); + ObjectJsonHelpers::LoadImages(context, root, GetImageTable()); } std::vector LargeSceneryObject::ReadJsonTiles(const json_t * jTiles) diff --git a/src/openrct2/object/ObjectFactory.cpp b/src/openrct2/object/ObjectFactory.cpp index 1c276f5a04..13fb451099 100644 --- a/src/openrct2/object/ObjectFactory.cpp +++ b/src/openrct2/object/ObjectFactory.cpp @@ -129,8 +129,6 @@ namespace ObjectFactory } catch (const std::exception &) { - Console::Error::WriteLine("Unable to open or read '%s'", path); - delete result; result = nullptr; } diff --git a/src/openrct2/object/ObjectJsonHelpers.cpp b/src/openrct2/object/ObjectJsonHelpers.cpp index 647b52beec..d7dab5077d 100644 --- a/src/openrct2/object/ObjectJsonHelpers.cpp +++ b/src/openrct2/object/ObjectJsonHelpers.cpp @@ -20,6 +20,8 @@ #include #include #include "../Context.h" +#include "../core/File.h" +#include "../core/FileScanner.h" #include "../core/Math.hpp" #include "../core/Memory.hpp" #include "../core/Path.hpp" @@ -205,12 +207,36 @@ namespace ObjectJsonHelpers return result; } - static std::vector LoadObjectImages(const std::string &name, uint32 start, uint32 end) + static std::string FindLegacyObject(const std::string &name) { - std::vector result; const auto env = GetContext()->GetPlatformEnvironment(); auto objectsPath = env->GetDirectoryPath(DIRBASE::RCT2, DIRID::OBJECT); auto objectPath = Path::Combine(objectsPath, name); +#ifndef _WIN32 + if (!File::Exists(objectPath)) + { + // UNIX based systems need to search for any files with the same name + // due to case sensitivity. + auto filter = Path::Combine(objectsPath, "*.dat"); + auto scanner = std::unique_ptr(Path::ScanDirectory(filter, false)); + while (scanner->Next()) + { + auto relativePath = scanner->GetPathRelative(); + if (String::Equals(relativePath, name, true)) + { + objectPath = scanner->GetPath(); + break; + } + } + } +#endif + return objectPath; + } + + static std::vector LoadObjectImages(IReadObjectContext * context, const std::string &name, uint32 start, uint32 end) + { + std::vector result; + auto objectPath = FindLegacyObject(name); auto obj = ObjectFactory::CreateObjectFromLegacyFile(objectPath.c_str()); if (obj != nullptr) { @@ -230,14 +256,19 @@ namespace ObjectJsonHelpers } else { - log_warning("Unable to open '%s'", objectPath.c_str()); + std::string msg = "Unable to open '" + objectPath + "'"; + context->LogWarning(OBJECT_ERROR_INVALID_PROPERTY, msg.c_str()); } // Add place holders auto placeHolders = (size_t)(end - start) - result.size(); if (placeHolders > 0) { - log_warning("Adding %d placeholders", placeHolders); + if (obj != nullptr) + { + std::string msg = "Adding " + std::to_string(placeHolders) + " placeholders"; + context->LogWarning(OBJECT_ERROR_INVALID_PROPERTY, msg.c_str()); + } for (size_t i = 0; i < placeHolders; i++) { auto g1 = rct_g1_element{}; @@ -247,7 +278,7 @@ namespace ObjectJsonHelpers return result; } - static std::vector ParseImages(std::string s) + static std::vector ParseImages(IReadObjectContext * context, std::string s) { std::vector result; if (s.empty()) @@ -293,7 +324,7 @@ namespace ObjectJsonHelpers imgEnd = range.back(); } } - return LoadObjectImages(name, imgStart, imgEnd); + return LoadObjectImages(context, name, imgStart, imgEnd); } return result; } @@ -332,13 +363,13 @@ namespace ObjectJsonHelpers } } - void LoadImages(const json_t * root, ImageTable &imageTable) + void LoadImages(IReadObjectContext * context, const json_t * root, ImageTable &imageTable) { auto jsonImages = json_object_get(root, "images"); auto imageElements = GetJsonStringArray(jsonImages); for (const auto &ie : imageElements) { - auto images = ParseImages(ie); + auto images = ParseImages(context, ie); for (const auto &g1 : images) { imageTable.AddImage(&g1); diff --git a/src/openrct2/object/ObjectJsonHelpers.h b/src/openrct2/object/ObjectJsonHelpers.h index 4a0761db89..8daa454f82 100644 --- a/src/openrct2/object/ObjectJsonHelpers.h +++ b/src/openrct2/object/ObjectJsonHelpers.h @@ -39,7 +39,7 @@ namespace ObjectJsonHelpers uint8 ParseCursor(const std::string &s, uint8 defaultValue); rct_object_entry ParseObjectEntry(const std::string & s); void LoadStrings(const json_t * root, StringTable &stringTable); - void LoadImages(const json_t * root, ImageTable &imageTable); + void LoadImages(IReadObjectContext * context, const json_t * root, ImageTable &imageTable); template T GetFlags(const json_t * obj, std::initializer_list> list) diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 58f30998b0..3d86ffd991 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -668,7 +668,7 @@ void RideObject::ReadJson(IReadObjectContext * context, const json_t * root) { "disablePainting", RIDE_ENTRY_FLAG_DISABLE_COLOUR_TAB } }); ObjectJsonHelpers::LoadStrings(root, GetStringTable()); - ObjectJsonHelpers::LoadImages(root, GetImageTable()); + ObjectJsonHelpers::LoadImages(context, root, GetImageTable()); } void RideObject::ReadJsonVehicleInfo(IReadObjectContext * context, const json_t * properties) diff --git a/src/openrct2/object/SceneryGroupObject.cpp b/src/openrct2/object/SceneryGroupObject.cpp index d6ea8d6902..7d88c4171f 100644 --- a/src/openrct2/object/SceneryGroupObject.cpp +++ b/src/openrct2/object/SceneryGroupObject.cpp @@ -144,7 +144,7 @@ void SceneryGroupObject::ReadJson(IReadObjectContext * context, const json_t * r } ObjectJsonHelpers::LoadStrings(root, GetStringTable()); - ObjectJsonHelpers::LoadImages(root, GetImageTable()); + ObjectJsonHelpers::LoadImages(context, root, GetImageTable()); } uint32 SceneryGroupObject::ReadJsonEntertainerCostumes(const json_t * jCostumes) diff --git a/src/openrct2/object/SmallSceneryObject.cpp b/src/openrct2/object/SmallSceneryObject.cpp index 17b0ef2d1f..b01b13939e 100644 --- a/src/openrct2/object/SmallSceneryObject.cpp +++ b/src/openrct2/object/SmallSceneryObject.cpp @@ -309,7 +309,7 @@ void SmallSceneryObject::ReadJson(IReadObjectContext * context, const json_t * r SetPrimarySceneryGroup(ObjectJsonHelpers::GetString(json_object_get(properties, "sceneryGroup"))); ObjectJsonHelpers::LoadStrings(root, GetStringTable()); - ObjectJsonHelpers::LoadImages(root, GetImageTable()); + ObjectJsonHelpers::LoadImages(context, root, GetImageTable()); } std::vector SmallSceneryObject::ReadJsonFrameOffsets(const json_t * jFrameOffsets) diff --git a/src/openrct2/object/WallObject.cpp b/src/openrct2/object/WallObject.cpp index 4da70af90b..c82da14b82 100644 --- a/src/openrct2/object/WallObject.cpp +++ b/src/openrct2/object/WallObject.cpp @@ -145,5 +145,5 @@ void WallObject::ReadJson(IReadObjectContext * context, const json_t * root) } ObjectJsonHelpers::LoadStrings(root, GetStringTable()); - ObjectJsonHelpers::LoadImages(root, GetImageTable()); + ObjectJsonHelpers::LoadImages(context, root, GetImageTable()); }