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); 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)

View File

@ -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);
} }

View File

@ -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;
}; };