1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-17 21:12:34 +01:00

Search for object file, case insensitive

This commit is contained in:
Ted John
2018-02-08 21:31:30 +00:00
committed by Gymnasiast
parent dfa40ccd46
commit 83ce94fd9e
12 changed files with 49 additions and 20 deletions

View File

@@ -97,5 +97,5 @@ void BannerObject::ReadJson(IReadObjectContext * context, const json_t * root)
SetPrimarySceneryGroup(ObjectJsonHelpers::GetString(json_object_get(properties, "sceneryGroup"))); SetPrimarySceneryGroup(ObjectJsonHelpers::GetString(json_object_get(properties, "sceneryGroup")));
ObjectJsonHelpers::LoadStrings(root, GetStringTable()); ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable()); ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
} }

View File

@@ -73,5 +73,5 @@ void EntranceObject::ReadJson(IReadObjectContext * context, const json_t * root)
_legacyType.text_height = json_integer_value(json_object_get(properties, "textHeight")); _legacyType.text_height = json_integer_value(json_object_get(properties, "textHeight"));
ObjectJsonHelpers::LoadStrings(root, GetStringTable()); ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable()); ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
} }

View File

@@ -118,5 +118,5 @@ void FootpathItemObject::ReadJson(IReadObjectContext * context, const json_t * r
{ "isTelevision", PATH_BIT_FLAG_IS_QUEUE_SCREEN }}); { "isTelevision", PATH_BIT_FLAG_IS_QUEUE_SCREEN }});
ObjectJsonHelpers::LoadStrings(root, GetStringTable()); ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable()); ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
} }

View File

@@ -83,5 +83,5 @@ void FootpathObject::ReadJson(IReadObjectContext * context, const json_t * root)
{ "editorOnly", FOOTPATH_ENTRY_FLAG_SHOW_ONLY_IN_SCENARIO_EDITOR } }); { "editorOnly", FOOTPATH_ENTRY_FLAG_SHOW_ONLY_IN_SCENARIO_EDITOR } });
ObjectJsonHelpers::LoadStrings(root, GetStringTable()); ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable()); ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
} }

View File

@@ -163,7 +163,7 @@ void LargeSceneryObject::ReadJson(IReadObjectContext * context, const json_t * r
SetPrimarySceneryGroup(ObjectJsonHelpers::GetString(json_object_get(properties, "sceneryGroup"))); SetPrimarySceneryGroup(ObjectJsonHelpers::GetString(json_object_get(properties, "sceneryGroup")));
ObjectJsonHelpers::LoadStrings(root, GetStringTable()); ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable()); ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
} }
std::vector<rct_large_scenery_tile> LargeSceneryObject::ReadJsonTiles(const json_t * jTiles) std::vector<rct_large_scenery_tile> LargeSceneryObject::ReadJsonTiles(const json_t * jTiles)

View File

@@ -129,8 +129,6 @@ namespace ObjectFactory
} }
catch (const std::exception &) catch (const std::exception &)
{ {
Console::Error::WriteLine("Unable to open or read '%s'", path);
delete result; delete result;
result = nullptr; result = nullptr;
} }

View File

@@ -20,6 +20,8 @@
#include <cstring> #include <cstring>
#include <unordered_map> #include <unordered_map>
#include "../Context.h" #include "../Context.h"
#include "../core/File.h"
#include "../core/FileScanner.h"
#include "../core/Math.hpp" #include "../core/Math.hpp"
#include "../core/Memory.hpp" #include "../core/Memory.hpp"
#include "../core/Path.hpp" #include "../core/Path.hpp"
@@ -205,12 +207,36 @@ namespace ObjectJsonHelpers
return result; return result;
} }
static std::vector<rct_g1_element> LoadObjectImages(const std::string &name, uint32 start, uint32 end) static std::string FindLegacyObject(const std::string &name)
{ {
std::vector<rct_g1_element> result;
const auto env = GetContext()->GetPlatformEnvironment(); const auto env = GetContext()->GetPlatformEnvironment();
auto objectsPath = env->GetDirectoryPath(DIRBASE::RCT2, DIRID::OBJECT); auto objectsPath = env->GetDirectoryPath(DIRBASE::RCT2, DIRID::OBJECT);
auto objectPath = Path::Combine(objectsPath, name); 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<IFileScanner>(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<rct_g1_element> LoadObjectImages(IReadObjectContext * context, const std::string &name, uint32 start, uint32 end)
{
std::vector<rct_g1_element> result;
auto objectPath = FindLegacyObject(name);
auto obj = ObjectFactory::CreateObjectFromLegacyFile(objectPath.c_str()); auto obj = ObjectFactory::CreateObjectFromLegacyFile(objectPath.c_str());
if (obj != nullptr) if (obj != nullptr)
{ {
@@ -230,14 +256,19 @@ namespace ObjectJsonHelpers
} }
else 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 // Add place holders
auto placeHolders = (size_t)(end - start) - result.size(); auto placeHolders = (size_t)(end - start) - result.size();
if (placeHolders > 0) 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++) for (size_t i = 0; i < placeHolders; i++)
{ {
auto g1 = rct_g1_element{}; auto g1 = rct_g1_element{};
@@ -247,7 +278,7 @@ namespace ObjectJsonHelpers
return result; return result;
} }
static std::vector<rct_g1_element> ParseImages(std::string s) static std::vector<rct_g1_element> ParseImages(IReadObjectContext * context, std::string s)
{ {
std::vector<rct_g1_element> result; std::vector<rct_g1_element> result;
if (s.empty()) if (s.empty())
@@ -293,7 +324,7 @@ namespace ObjectJsonHelpers
imgEnd = range.back(); imgEnd = range.back();
} }
} }
return LoadObjectImages(name, imgStart, imgEnd); return LoadObjectImages(context, name, imgStart, imgEnd);
} }
return result; 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 jsonImages = json_object_get(root, "images");
auto imageElements = GetJsonStringArray(jsonImages); auto imageElements = GetJsonStringArray(jsonImages);
for (const auto &ie : imageElements) for (const auto &ie : imageElements)
{ {
auto images = ParseImages(ie); auto images = ParseImages(context, ie);
for (const auto &g1 : images) for (const auto &g1 : images)
{ {
imageTable.AddImage(&g1); imageTable.AddImage(&g1);

View File

@@ -39,7 +39,7 @@ namespace ObjectJsonHelpers
uint8 ParseCursor(const std::string &s, uint8 defaultValue); uint8 ParseCursor(const std::string &s, uint8 defaultValue);
rct_object_entry ParseObjectEntry(const std::string & s); rct_object_entry ParseObjectEntry(const std::string & s);
void LoadStrings(const json_t * root, StringTable &stringTable); 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<typename T> template<typename T>
T GetFlags(const json_t * obj, std::initializer_list<std::pair<std::string, T>> list) T GetFlags(const json_t * obj, std::initializer_list<std::pair<std::string, T>> list)

View File

@@ -668,7 +668,7 @@ void RideObject::ReadJson(IReadObjectContext * context, const json_t * root)
{ "disablePainting", RIDE_ENTRY_FLAG_DISABLE_COLOUR_TAB } }); { "disablePainting", RIDE_ENTRY_FLAG_DISABLE_COLOUR_TAB } });
ObjectJsonHelpers::LoadStrings(root, GetStringTable()); ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable()); ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
} }
void RideObject::ReadJsonVehicleInfo(IReadObjectContext * context, const json_t * properties) void RideObject::ReadJsonVehicleInfo(IReadObjectContext * context, const json_t * properties)

View File

@@ -144,7 +144,7 @@ void SceneryGroupObject::ReadJson(IReadObjectContext * context, const json_t * r
} }
ObjectJsonHelpers::LoadStrings(root, GetStringTable()); ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable()); ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
} }
uint32 SceneryGroupObject::ReadJsonEntertainerCostumes(const json_t * jCostumes) uint32 SceneryGroupObject::ReadJsonEntertainerCostumes(const json_t * jCostumes)

View File

@@ -309,7 +309,7 @@ void SmallSceneryObject::ReadJson(IReadObjectContext * context, const json_t * r
SetPrimarySceneryGroup(ObjectJsonHelpers::GetString(json_object_get(properties, "sceneryGroup"))); SetPrimarySceneryGroup(ObjectJsonHelpers::GetString(json_object_get(properties, "sceneryGroup")));
ObjectJsonHelpers::LoadStrings(root, GetStringTable()); ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable()); ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
} }
std::vector<uint8> SmallSceneryObject::ReadJsonFrameOffsets(const json_t * jFrameOffsets) std::vector<uint8> SmallSceneryObject::ReadJsonFrameOffsets(const json_t * jFrameOffsets)

View File

@@ -145,5 +145,5 @@ void WallObject::ReadJson(IReadObjectContext * context, const json_t * root)
} }
ObjectJsonHelpers::LoadStrings(root, GetStringTable()); ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable()); ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
} }