Add game pattern to search paths

This commit is contained in:
Jan 2022-08-13 20:49:33 +02:00
parent 53bfcadea8
commit 686102a59e
3 changed files with 37 additions and 23 deletions

View File

@ -80,11 +80,11 @@ class Linker::Impl
ObjLoading::UnloadIWDsInSearchPath(searchPath);
}
SearchPaths GetAssetSearchPathsForZone(const std::string& zoneName)
SearchPaths GetAssetSearchPathsForZone(const std::string& gameName, const std::string& zoneName)
{
SearchPaths searchPathsForZone;
for (const auto& searchPathStr : m_args.GetAssetSearchPathsForZone(zoneName))
for (const auto& searchPathStr : m_args.GetAssetSearchPathsForZone(gameName, zoneName))
{
auto absolutePath = fs::absolute(searchPathStr);
@ -114,11 +114,11 @@ class Linker::Impl
return searchPathsForZone;
}
SearchPaths GetGdtSearchPathsForZone(const std::string& zoneName)
SearchPaths GetGdtSearchPathsForZone(const std::string& gameName, const std::string& zoneName)
{
SearchPaths searchPathsForZone;
for (const auto& searchPathStr : m_args.GetGdtSearchPathsForZone(zoneName))
for (const auto& searchPathStr : m_args.GetGdtSearchPathsForZone(gameName, zoneName))
{
auto absolutePath = fs::absolute(searchPathStr);
@ -467,14 +467,22 @@ class Linker::Impl
bool BuildZone(const std::string& zoneName)
{
auto assetSearchPaths = GetAssetSearchPathsForZone(zoneName);
auto gdtSearchPaths = GetGdtSearchPathsForZone(zoneName);
auto sourceSearchPaths = GetSourceSearchPathsForZone(zoneName);
const auto zoneDefinition = ReadZoneDefinition(zoneName, &sourceSearchPaths);
if (!zoneDefinition)
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);
auto result = zone != nullptr;
if (zone)

View File

@ -99,6 +99,7 @@ const CommandLineOption* const COMMAND_LINE_OPTIONS[]
LinkerArgs::LinkerArgs()
: m_argument_parser(COMMAND_LINE_OPTIONS, std::extent<decltype(COMMAND_LINE_OPTIONS)>::value),
m_base_pattern(R"(\?base\?)"),
m_game_pattern(R"(\?game\?)"),
m_zone_pattern(R"(\?zone\?)"),
m_base_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)
{
if (path.find(PATTERN_GAME) != std::string::npos)
continue;
if (path.find(PATTERN_ZONE) != std::string::npos)
continue;
@ -172,20 +175,21 @@ std::set<std::string> LinkerArgs::GetZoneIndependentSearchPaths(const std::set<s
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;
const auto basePath = GetBasePathForZone(zoneName);
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))
{
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;
@ -222,7 +226,7 @@ bool LinkerArgs::ParseArgs(const int argc, const char** argv)
m_base_folder = m_argument_parser.GetValueForOption(OPTION_BASE_FOLDER);
else
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
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);
}
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
{
return GetSearchPathsForZone(m_source_search_paths, zoneName);
return GetSearchPathsForZone(m_source_search_paths, "", zoneName);
}

View File

@ -11,18 +11,20 @@ class LinkerArgs
{
public:
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* DEFAULT_BASE_FOLDER = ".";
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_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_SOURCE_SEARCH_PATH = "?base?/zone_source;?base?/zone_raw/?zone?/zone_source";
private:
ArgumentParser m_argument_parser;
std::regex m_base_pattern;
std::regex m_game_pattern;
std::regex m_zone_pattern;
/**
@ -35,7 +37,7 @@ private:
_NODISCARD std::string GetBasePathForZone(const std::string& zoneName) const;
void SetDefaultBasePath();
_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:
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> GetZoneIndependentSourceSearchPaths() const;
_NODISCARD std::set<std::string> GetAssetSearchPathsForZone(const std::string& zoneName) const;
_NODISCARD std::set<std::string> GetGdtSearchPathsForZone(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& gameName, const std::string& zoneName) const;
_NODISCARD std::set<std::string> GetSourceSearchPathsForZone(const std::string& zoneName) const;
};