aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/dataloader/Dataloader.hpp
diff options
context:
space:
mode:
author Spartan322 <Megacake1234@gmail.com>2023-10-04 10:55:42 +0200
committer Spartan322 <Megacake1234@gmail.com>2023-10-12 16:18:37 +0200
commit5c7af98e3a8a3e7f1462e389c273566d7cdaa5d4 (patch)
treeefeebd80a707a07eda296883772140e9ce32a9ee /src/openvic-simulation/dataloader/Dataloader.hpp
parent1d113b46161f27551bc3a6a857b8727cfb657b81 (diff)
Add static `Dataloader::search_for_game_path(fs::path)`
Searches for Victoria 2 according to the supplied path If supplied path is empty, presumes Steam install according to platform environment variables If invalid supplied path, falls back to empty path behavior Supports Steam install on Windows, Mac, Linux, and FreeBSD Supports Windows registry Update .clang-format categories to include lexy-vdf Add Utility/ConstexprIntToStr.hpp
Diffstat (limited to 'src/openvic-simulation/dataloader/Dataloader.hpp')
-rw-r--r--src/openvic-simulation/dataloader/Dataloader.hpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/openvic-simulation/dataloader/Dataloader.hpp b/src/openvic-simulation/dataloader/Dataloader.hpp
index 9d28132..705da00 100644
--- a/src/openvic-simulation/dataloader/Dataloader.hpp
+++ b/src/openvic-simulation/dataloader/Dataloader.hpp
@@ -1,6 +1,7 @@
#pragma once
#include <filesystem>
+#include <unordered_map>
#include <openvic-dataloader/csv/Parser.hpp>
#include <openvic-dataloader/v2script/Parser.hpp>
@@ -31,6 +32,25 @@ namespace OpenVic {
Dataloader() = default;
+ /// @brief Searches for the Victoria 2 install directory
+ ///
+ /// @param hint_path A path to indicate a hint to assist in searching for the Victoria 2 install directory
+ /// Supports being supplied:
+ /// 1. A valid Victoria 2 game directory (Victoria 2 directory that contains a v2game.exe file)
+ /// 2. An Empty path: assumes a common Steam install structure per platform.
+ /// 2b. If Windows, returns "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Paradox Interactive\Victoria 2" "path" registry value
+ /// 2c. If registry value returns an empty string, performs Steam checks below
+ /// 3. A path to a root Steam install. (eg: C:\Program Files(x86)\Steam, ~/.steam/steam)
+ /// 4. A path to a root Steam steamapps directory. (eg: C:\Program Files(x86)\Steam\steamapps, ~/.steam/steam/steamapps)
+ /// 5. A path to the root Steam libraryfolders.vdf, commonly in the root Steam steamapps directory.
+ /// 6. A path to the Steam library directory that contains Victoria 2.
+ /// 7. A path to a Steam library's steamapps directory that contains Victoria 2.
+ /// 8. A path to a Steam library's steamapps/common directory that contains Victoria 2.
+ /// 9. If any of these checks don't resolve to a valid Victoria 2 game directory when supplied a non-empty hint_path, performs empty path behavior.
+ /// @return fs::path The root directory of a valid Victoria 2 install, or an empty path.
+ ///
+ static fs::path search_for_game_path(fs::path hint_path = {});
+
/* In reverse-load order, so base defines first and final loaded mod last */
bool set_roots(path_vector_t new_roots);
@@ -55,5 +75,19 @@ namespace OpenVic {
/* Args: key, locale, localisation */
using localisation_callback_t = NodeTools::callback_t<std::string_view, locale_t, std::string_view>;
bool load_localisation_files(localisation_callback_t callback, fs::path const& localisation_dir = "localisation");
+
+ private:
+ struct fshash
+ {
+ size_t operator()(const std::filesystem::path& p) const noexcept {
+ return std::filesystem::hash_value(p);
+ }
+ };
+
+ using hint_path_t = fs::path;
+ using game_path_t = fs::path;
+ inline static std::unordered_map<hint_path_t, game_path_t, fshash> _cached_paths;
};
}
+
+