mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-08 05:48:19 -05:00
Add game pattern to search paths
This commit is contained in:
parent
53bfcadea8
commit
686102a59e
@ -80,11 +80,11 @@ class Linker::Impl
|
|||||||
ObjLoading::UnloadIWDsInSearchPath(searchPath);
|
ObjLoading::UnloadIWDsInSearchPath(searchPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchPaths GetAssetSearchPathsForZone(const std::string& zoneName)
|
SearchPaths GetAssetSearchPathsForZone(const std::string& gameName, const std::string& zoneName)
|
||||||
{
|
{
|
||||||
SearchPaths searchPathsForZone;
|
SearchPaths searchPathsForZone;
|
||||||
|
|
||||||
for (const auto& searchPathStr : m_args.GetAssetSearchPathsForZone(zoneName))
|
for (const auto& searchPathStr : m_args.GetAssetSearchPathsForZone(gameName, zoneName))
|
||||||
{
|
{
|
||||||
auto absolutePath = fs::absolute(searchPathStr);
|
auto absolutePath = fs::absolute(searchPathStr);
|
||||||
|
|
||||||
@ -114,11 +114,11 @@ class Linker::Impl
|
|||||||
return searchPathsForZone;
|
return searchPathsForZone;
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchPaths GetGdtSearchPathsForZone(const std::string& zoneName)
|
SearchPaths GetGdtSearchPathsForZone(const std::string& gameName, const std::string& zoneName)
|
||||||
{
|
{
|
||||||
SearchPaths searchPathsForZone;
|
SearchPaths searchPathsForZone;
|
||||||
|
|
||||||
for (const auto& searchPathStr : m_args.GetGdtSearchPathsForZone(zoneName))
|
for (const auto& searchPathStr : m_args.GetGdtSearchPathsForZone(gameName, zoneName))
|
||||||
{
|
{
|
||||||
auto absolutePath = fs::absolute(searchPathStr);
|
auto absolutePath = fs::absolute(searchPathStr);
|
||||||
|
|
||||||
@ -467,14 +467,22 @@ class Linker::Impl
|
|||||||
|
|
||||||
bool BuildZone(const std::string& zoneName)
|
bool BuildZone(const std::string& zoneName)
|
||||||
{
|
{
|
||||||
auto assetSearchPaths = GetAssetSearchPathsForZone(zoneName);
|
|
||||||
auto gdtSearchPaths = GetGdtSearchPathsForZone(zoneName);
|
|
||||||
auto sourceSearchPaths = GetSourceSearchPathsForZone(zoneName);
|
auto sourceSearchPaths = GetSourceSearchPathsForZone(zoneName);
|
||||||
|
|
||||||
const auto zoneDefinition = ReadZoneDefinition(zoneName, &sourceSearchPaths);
|
const auto zoneDefinition = ReadZoneDefinition(zoneName, &sourceSearchPaths);
|
||||||
if (!zoneDefinition)
|
if (!zoneDefinition)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
std::string gameName;
|
||||||
|
if (!GetGameNameFromZoneDefinition(gameName, zoneName, *zoneDefinition))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (auto& c : gameName)
|
||||||
|
c = static_cast<char>(std::tolower(c));
|
||||||
|
|
||||||
|
auto assetSearchPaths = GetAssetSearchPathsForZone(gameName, zoneName);
|
||||||
|
auto gdtSearchPaths = GetGdtSearchPathsForZone(gameName, zoneName);
|
||||||
|
|
||||||
const auto zone = CreateZoneForDefinition(zoneName, *zoneDefinition, &assetSearchPaths, &gdtSearchPaths, &sourceSearchPaths);
|
const auto zone = CreateZoneForDefinition(zoneName, *zoneDefinition, &assetSearchPaths, &gdtSearchPaths, &sourceSearchPaths);
|
||||||
auto result = zone != nullptr;
|
auto result = zone != nullptr;
|
||||||
if (zone)
|
if (zone)
|
||||||
|
@ -99,6 +99,7 @@ const CommandLineOption* const COMMAND_LINE_OPTIONS[]
|
|||||||
LinkerArgs::LinkerArgs()
|
LinkerArgs::LinkerArgs()
|
||||||
: m_argument_parser(COMMAND_LINE_OPTIONS, std::extent<decltype(COMMAND_LINE_OPTIONS)>::value),
|
: m_argument_parser(COMMAND_LINE_OPTIONS, std::extent<decltype(COMMAND_LINE_OPTIONS)>::value),
|
||||||
m_base_pattern(R"(\?base\?)"),
|
m_base_pattern(R"(\?base\?)"),
|
||||||
|
m_game_pattern(R"(\?game\?)"),
|
||||||
m_zone_pattern(R"(\?zone\?)"),
|
m_zone_pattern(R"(\?zone\?)"),
|
||||||
m_base_folder_depends_on_zone(false),
|
m_base_folder_depends_on_zone(false),
|
||||||
m_out_folder_depends_on_zone(false),
|
m_out_folder_depends_on_zone(false),
|
||||||
@ -153,6 +154,8 @@ std::set<std::string> LinkerArgs::GetZoneIndependentSearchPaths(const std::set<s
|
|||||||
|
|
||||||
for (const auto& path : set)
|
for (const auto& path : set)
|
||||||
{
|
{
|
||||||
|
if (path.find(PATTERN_GAME) != std::string::npos)
|
||||||
|
continue;
|
||||||
if (path.find(PATTERN_ZONE) != std::string::npos)
|
if (path.find(PATTERN_ZONE) != std::string::npos)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -172,20 +175,21 @@ std::set<std::string> LinkerArgs::GetZoneIndependentSearchPaths(const std::set<s
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<std::string> LinkerArgs::GetSearchPathsForZone(const std::set<std::string>& set, const std::string& zoneName) const
|
std::set<std::string> LinkerArgs::GetSearchPathsForZone(const std::set<std::string>& set, const std::string& gameName, const std::string& zoneName) const
|
||||||
{
|
{
|
||||||
std::set<std::string> out;
|
std::set<std::string> out;
|
||||||
const auto basePath = GetBasePathForZone(zoneName);
|
const auto basePath = GetBasePathForZone(zoneName);
|
||||||
|
|
||||||
for (const auto& path : set)
|
for (const auto& path : set)
|
||||||
{
|
{
|
||||||
if (path.find(PATTERN_ZONE) == std::string::npos
|
if (path.find(PATTERN_GAME) == std::string::npos
|
||||||
|
&& path.find(PATTERN_ZONE) == std::string::npos
|
||||||
&& (!m_base_folder_depends_on_zone || path.find(PATTERN_BASE) == std::string::npos))
|
&& (!m_base_folder_depends_on_zone || path.find(PATTERN_BASE) == std::string::npos))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
out.emplace(std::regex_replace(std::regex_replace(path, m_zone_pattern, zoneName), m_base_pattern, basePath));
|
out.emplace(std::regex_replace(std::regex_replace(std::regex_replace(path, m_zone_pattern, zoneName), m_game_pattern, gameName), m_base_pattern, basePath));
|
||||||
}
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
@ -222,7 +226,7 @@ bool LinkerArgs::ParseArgs(const int argc, const char** argv)
|
|||||||
m_base_folder = m_argument_parser.GetValueForOption(OPTION_BASE_FOLDER);
|
m_base_folder = m_argument_parser.GetValueForOption(OPTION_BASE_FOLDER);
|
||||||
else
|
else
|
||||||
SetDefaultBasePath();
|
SetDefaultBasePath();
|
||||||
m_base_folder_depends_on_zone = m_base_folder.find(PATTERN_ZONE) != std::string::npos;
|
m_base_folder_depends_on_zone = m_base_folder.find(PATTERN_GAME) != std::string::npos || m_base_folder.find(PATTERN_ZONE) != std::string::npos;
|
||||||
|
|
||||||
// --output-folder
|
// --output-folder
|
||||||
if (m_argument_parser.IsOptionSpecified(OPTION_OUTPUT_FOLDER))
|
if (m_argument_parser.IsOptionSpecified(OPTION_OUTPUT_FOLDER))
|
||||||
@ -302,17 +306,17 @@ std::set<std::string> LinkerArgs::GetZoneIndependentSourceSearchPaths() const
|
|||||||
return GetZoneIndependentSearchPaths(m_source_search_paths);
|
return GetZoneIndependentSearchPaths(m_source_search_paths);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<std::string> LinkerArgs::GetAssetSearchPathsForZone(const std::string& zoneName) const
|
std::set<std::string> LinkerArgs::GetAssetSearchPathsForZone(const std::string& gameName, const std::string& zoneName) const
|
||||||
{
|
{
|
||||||
return GetSearchPathsForZone(m_asset_search_paths, zoneName);
|
return GetSearchPathsForZone(m_asset_search_paths, gameName, zoneName);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<std::string> LinkerArgs::GetGdtSearchPathsForZone(const std::string& zoneName) const
|
std::set<std::string> LinkerArgs::GetGdtSearchPathsForZone(const std::string& gameName, const std::string& zoneName) const
|
||||||
{
|
{
|
||||||
return GetSearchPathsForZone(m_gdt_search_paths, zoneName);
|
return GetSearchPathsForZone(m_gdt_search_paths, gameName, zoneName);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<std::string> LinkerArgs::GetSourceSearchPathsForZone(const std::string& zoneName) const
|
std::set<std::string> LinkerArgs::GetSourceSearchPathsForZone(const std::string& zoneName) const
|
||||||
{
|
{
|
||||||
return GetSearchPathsForZone(m_source_search_paths, zoneName);
|
return GetSearchPathsForZone(m_source_search_paths, "", zoneName);
|
||||||
}
|
}
|
||||||
|
@ -11,18 +11,20 @@ class LinkerArgs
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static constexpr const char* PATTERN_BASE = "?base?";
|
static constexpr const char* PATTERN_BASE = "?base?";
|
||||||
|
static constexpr const char* PATTERN_GAME = "?game?";
|
||||||
static constexpr const char* PATTERN_ZONE = "?zone?";
|
static constexpr const char* PATTERN_ZONE = "?zone?";
|
||||||
|
|
||||||
static constexpr const char* DEFAULT_BASE_FOLDER = ".";
|
static constexpr const char* DEFAULT_BASE_FOLDER = ".";
|
||||||
static constexpr const char* DEFAULT_BASE_FOLDER_MOD_TOOLS = "..";
|
static constexpr const char* DEFAULT_BASE_FOLDER_MOD_TOOLS = "..";
|
||||||
static constexpr const char* DEFAULT_OUTPUT_FOLDER = "?base?/zone_out/?zone?";
|
static constexpr const char* DEFAULT_OUTPUT_FOLDER = "?base?/zone_out/?zone?";
|
||||||
static constexpr const char* DEFAULT_ASSET_SEARCH_PATH = "?base?/raw;?base?/zone_raw/?zone?";
|
static constexpr const char* DEFAULT_ASSET_SEARCH_PATH = "?base?/raw;?base?/raw/?game?;?base?/zone_raw/?zone?";
|
||||||
static constexpr const char* DEFAULT_GDT_SEARCH_PATH = "?base?/source_data;?base?/zone_raw/?zone?/source_data";
|
static constexpr const char* DEFAULT_GDT_SEARCH_PATH = "?base?/source_data;?base?/zone_raw/?zone?/source_data";
|
||||||
static constexpr const char* DEFAULT_SOURCE_SEARCH_PATH = "?base?/zone_source;?base?/zone_raw/?zone?/zone_source";
|
static constexpr const char* DEFAULT_SOURCE_SEARCH_PATH = "?base?/zone_source;?base?/zone_raw/?zone?/zone_source";
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ArgumentParser m_argument_parser;
|
ArgumentParser m_argument_parser;
|
||||||
std::regex m_base_pattern;
|
std::regex m_base_pattern;
|
||||||
|
std::regex m_game_pattern;
|
||||||
std::regex m_zone_pattern;
|
std::regex m_zone_pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -35,7 +37,7 @@ private:
|
|||||||
_NODISCARD std::string GetBasePathForZone(const std::string& zoneName) const;
|
_NODISCARD std::string GetBasePathForZone(const std::string& zoneName) const;
|
||||||
void SetDefaultBasePath();
|
void SetDefaultBasePath();
|
||||||
_NODISCARD std::set<std::string> GetZoneIndependentSearchPaths(const std::set<std::string>& set) const;
|
_NODISCARD std::set<std::string> GetZoneIndependentSearchPaths(const std::set<std::string>& set) const;
|
||||||
_NODISCARD std::set<std::string> GetSearchPathsForZone(const std::set<std::string>& set, const std::string& zoneName) const;
|
_NODISCARD std::set<std::string> GetSearchPathsForZone(const std::set<std::string>& set, const std::string& gameName, const std::string& zoneName) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
std::vector<std::string> m_zones_to_load;
|
std::vector<std::string> m_zones_to_load;
|
||||||
@ -66,7 +68,7 @@ public:
|
|||||||
_NODISCARD std::set<std::string> GetZoneIndependentGdtSearchPaths() const;
|
_NODISCARD std::set<std::string> GetZoneIndependentGdtSearchPaths() const;
|
||||||
_NODISCARD std::set<std::string> GetZoneIndependentSourceSearchPaths() const;
|
_NODISCARD std::set<std::string> GetZoneIndependentSourceSearchPaths() const;
|
||||||
|
|
||||||
_NODISCARD std::set<std::string> GetAssetSearchPathsForZone(const std::string& zoneName) const;
|
_NODISCARD std::set<std::string> GetAssetSearchPathsForZone(const std::string& gameName, const std::string& zoneName) const;
|
||||||
_NODISCARD std::set<std::string> GetGdtSearchPathsForZone(const std::string& zoneName) const;
|
_NODISCARD std::set<std::string> GetGdtSearchPathsForZone(const std::string& gameName, const std::string& zoneName) const;
|
||||||
_NODISCARD std::set<std::string> GetSourceSearchPathsForZone(const std::string& zoneName) const;
|
_NODISCARD std::set<std::string> GetSourceSearchPathsForZone(const std::string& zoneName) const;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user