From 686102a59e2948d65ea2e15be1b35e207c07860c Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 13 Aug 2022 20:49:33 +0200 Subject: [PATCH] Add game pattern to search paths --- src/Linker/Linker.cpp | 20 ++++++++++++++------ src/Linker/LinkerArgs.cpp | 30 +++++++++++++++++------------- src/Linker/LinkerArgs.h | 10 ++++++---- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/Linker/Linker.cpp b/src/Linker/Linker.cpp index 830fa747..0f5e2a4d 100644 --- a/src/Linker/Linker.cpp +++ b/src/Linker/Linker.cpp @@ -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(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) diff --git a/src/Linker/LinkerArgs.cpp b/src/Linker/LinkerArgs.cpp index 8855f313..b323db01 100644 --- a/src/Linker/LinkerArgs.cpp +++ b/src/Linker/LinkerArgs.cpp @@ -99,6 +99,7 @@ const CommandLineOption* const COMMAND_LINE_OPTIONS[] LinkerArgs::LinkerArgs() : m_argument_parser(COMMAND_LINE_OPTIONS, std::extent::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), @@ -151,14 +152,16 @@ std::set LinkerArgs::GetZoneIndependentSearchPaths(const std::set out; - 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) + continue; + if (path.find(PATTERN_ZONE) != std::string::npos) continue; - if(path.find(PATTERN_BASE) != std::string::npos) + if (path.find(PATTERN_BASE) != std::string::npos) { - if(m_base_folder_depends_on_zone) + if (m_base_folder_depends_on_zone) continue; out.emplace(std::regex_replace(path, m_base_pattern, m_base_folder)); @@ -172,20 +175,21 @@ std::set LinkerArgs::GetZoneIndependentSearchPaths(const std::set LinkerArgs::GetSearchPathsForZone(const std::set& set, const std::string& zoneName) const +std::set LinkerArgs::GetSearchPathsForZone(const std::set& set, const std::string& gameName, const std::string& zoneName) const { std::set 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 LinkerArgs::GetZoneIndependentSourceSearchPaths() const return GetZoneIndependentSearchPaths(m_source_search_paths); } -std::set LinkerArgs::GetAssetSearchPathsForZone(const std::string& zoneName) const +std::set 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 LinkerArgs::GetGdtSearchPathsForZone(const std::string& zoneName) const +std::set 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 LinkerArgs::GetSourceSearchPathsForZone(const std::string& zoneName) const { - return GetSearchPathsForZone(m_source_search_paths, zoneName); + return GetSearchPathsForZone(m_source_search_paths, "", zoneName); } diff --git a/src/Linker/LinkerArgs.h b/src/Linker/LinkerArgs.h index b173231a..1b7789d9 100644 --- a/src/Linker/LinkerArgs.h +++ b/src/Linker/LinkerArgs.h @@ -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 GetZoneIndependentSearchPaths(const std::set& set) const; - _NODISCARD std::set GetSearchPathsForZone(const std::set& set, const std::string& zoneName) const; + _NODISCARD std::set GetSearchPathsForZone(const std::set& set, const std::string& gameName, const std::string& zoneName) const; public: std::vector m_zones_to_load; @@ -66,7 +68,7 @@ public: _NODISCARD std::set GetZoneIndependentGdtSearchPaths() const; _NODISCARD std::set GetZoneIndependentSourceSearchPaths() const; - _NODISCARD std::set GetAssetSearchPathsForZone(const std::string& zoneName) const; - _NODISCARD std::set GetGdtSearchPathsForZone(const std::string& zoneName) const; + _NODISCARD std::set GetAssetSearchPathsForZone(const std::string& gameName, const std::string& zoneName) const; + _NODISCARD std::set GetGdtSearchPathsForZone(const std::string& gameName, const std::string& zoneName) const; _NODISCARD std::set GetSourceSearchPathsForZone(const std::string& zoneName) const; };