1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-20 05:23:04 +01:00
Files
OpenRCT2/src/openrct2/object/ResourceTable.cpp
James103 1d8dc111f1 Replace 2023 with 2024 in copyright headers (#21139)
Replace all instances of the year 2023 with 2024 in all copyright headers
2024-01-01 12:52:28 +01:00

117 lines
3.5 KiB
C++

/*****************************************************************************
* Copyright (c) 2014-2024 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include "ResourceTable.h"
#include "../Context.h"
#include "../PlatformEnvironment.h"
#include "../core/Path.hpp"
#include "../core/String.hpp"
using namespace OpenRCT2;
Range<int32_t> ResourceTable::ParseRange(std::string_view s)
{
// Currently only supports [###] or [###..###]
Range<int32_t> result = {};
if (s.length() >= 3 && s[0] == '[' && s[s.length() - 1] == ']')
{
s = s.substr(1, s.length() - 2);
auto parts = String::Split(s, "..");
if (parts.size() == 1)
{
result = Range<int32_t>(std::stoi(parts[0]));
}
else
{
auto left = std::stoi(parts[0]);
auto right = std::stoi(parts[1]);
if (left <= right)
{
result = Range<int32_t>(left, right);
}
else
{
result = Range<int32_t>(right, left);
}
}
}
return result;
}
ResourceTable::SourceInfo ResourceTable::ParseSource(std::string_view source)
{
SourceInfo info;
auto base = source;
auto rangeStart = source.find('[');
if (rangeStart != std::string::npos)
{
base = source.substr(0, rangeStart);
info.SourceRange = ParseRange(source.substr(rangeStart));
}
auto fileName = base;
auto fileNameStart = base.find('/');
if (fileNameStart != std::string::npos)
{
fileName = base.substr(fileNameStart + 1);
}
else
{
fileNameStart = base.find(':');
if (fileNameStart != std::string::npos)
{
fileName = base.substr(fileNameStart + 1);
}
}
if (String::StartsWith(base, "$LGX:"))
{
info.Kind = SourceKind::Gx;
info.Path = fileName;
}
else if (String::StartsWith(base, "$G1"))
{
auto env = GetContext()->GetPlatformEnvironment();
auto dataPath = env->GetDirectoryPath(DIRBASE::RCT2, DIRID::DATA);
info.Kind = SourceKind::G1;
// info.Path = env->FindFile(DIRBASE::RCT2, DIRID::DATA, "g1.dat");
}
else if (String::StartsWith(base, "$CSG"))
{
auto env = GetContext()->GetPlatformEnvironment();
auto dataPath = env->GetDirectoryPath(DIRBASE::RCT2, DIRID::DATA);
info.Kind = SourceKind::Csg;
// info.Path = env->FindFile(DIRBASE::RCT2, DIRID::DATA, "g1.dat");
}
else if (String::StartsWith(base, "$RCT1:DATA/"))
{
auto env = GetContext()->GetPlatformEnvironment();
info.Kind = SourceKind::Data;
info.Path = env->FindFile(DIRBASE::RCT1, DIRID::DATA, fileName);
}
else if (String::StartsWith(base, "$RCT2:DATA/"))
{
auto env = GetContext()->GetPlatformEnvironment();
info.Kind = SourceKind::Data;
info.Path = env->FindFile(DIRBASE::RCT2, DIRID::DATA, fileName);
}
else if (String::StartsWith(base, "$RCT2:OBJDATA/"))
{
auto env = GetContext()->GetPlatformEnvironment();
info.Kind = SourceKind::ObjData;
info.Path = env->FindFile(DIRBASE::RCT2, DIRID::OBJECT, fileName);
}
else if (!String::StartsWith(base, "$"))
{
info.Path = base;
}
return info;
}