1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-10 09:32:29 +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")));
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"));
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 }});
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 } });
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")));
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)

View File

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

View File

@@ -20,6 +20,8 @@
#include <cstring>
#include <unordered_map>
#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<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();
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<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());
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<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;
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);

View File

@@ -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<typename T>
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 } });
ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable());
ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
}
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::LoadImages(root, GetImageTable());
ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
}
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")));
ObjectJsonHelpers::LoadStrings(root, GetStringTable());
ObjectJsonHelpers::LoadImages(root, GetImageTable());
ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
}
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::LoadImages(root, GetImageTable());
ObjectJsonHelpers::LoadImages(context, root, GetImageTable());
}