From 986881e4e1b19d39ad0efd5a301be7ed439434b1 Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Tue, 3 Sep 2024 00:03:41 -0400 Subject: [PATCH] Expose function for getting the details for currently opened mods --- librecomp/include/librecomp/mods.hpp | 2 ++ librecomp/src/mods.cpp | 35 ++++++++++++++++++++++++++++ librecomp/src/recomp.cpp | 5 ++++ 3 files changed, 42 insertions(+) diff --git a/librecomp/include/librecomp/mods.hpp b/librecomp/include/librecomp/mods.hpp index c5d47d6..1ca0136 100644 --- a/librecomp/include/librecomp/mods.hpp +++ b/librecomp/include/librecomp/mods.hpp @@ -148,6 +148,7 @@ namespace recomp { void scan_mods(); void enable_mod(const std::string& mod_id, bool enabled); bool is_mod_enabled(const std::string& mod_id); + std::vector get_mod_details(const std::string& mod_game_id); // Internal functions, TODO move to an internal header. struct PatchData { @@ -170,6 +171,7 @@ namespace recomp { size_t num_opened_mods(); std::vector load_mods(const std::string& mod_game_id, uint8_t* rdram, int32_t load_address, uint32_t& ram_used); void unload_mods(); + std::vector get_mod_details(const std::string& mod_game_id); private: ModOpenError open_mod(const std::filesystem::path& mod_path, std::string& error_param); ModLoadError load_mod(uint8_t* rdram, const std::unordered_map& section_map, recomp::mods::ModHandle& handle, int32_t load_address, uint32_t& ram_used, std::string& error_param); diff --git a/librecomp/src/mods.cpp b/librecomp/src/mods.cpp index 31ea674..91de9a0 100644 --- a/librecomp/src/mods.cpp +++ b/librecomp/src/mods.cpp @@ -414,6 +414,41 @@ size_t recomp::mods::ModContext::num_opened_mods() { return opened_mods.size(); } +std::vector recomp::mods::ModContext::get_mod_details(const std::string& mod_game_id) { + std::vector ret{}; + bool all_games = mod_game_id.empty(); + size_t game_index = (size_t)-1; + + auto find_game_it = mod_game_ids.find(mod_game_id); + if (find_game_it != mod_game_ids.end()) { + game_index = find_game_it->second; + } + + for (const ModHandle& mod : opened_mods) { + if (all_games || mod.is_for_game(game_index)) { + std::vector cur_dependencies{}; + + // TODO the recompiler context isn't available at this point, since it's parsed on mod load. + // Move that parsing to mod opening so it can be used here. + // for (const auto& cur_dep : mod.recompiler_context->dependencies) { + // cur_dependencies.emplace_back(DependencyDetails{ + // .mod_id = cur_dep.mod_id, + // .version = Version{.major = cur_dep.major_version, .minor = cur_dep.minor_version, .patch = cur_dep.patch_version} + // }); + // } + + ret.emplace_back(ModDetails{ + .mod_id = mod.manifest.mod_id, + .version = mod.manifest.version, + .authors = {}, // TODO add mod authors to the manifest and copy them here + .dependencies = std::move(cur_dependencies) + }); + } + } + + return ret; +} + std::vector recomp::mods::ModContext::load_mods(const std::string& mod_game_id, uint8_t* rdram, int32_t load_address, uint32_t& ram_used) { std::vector ret{}; ram_used = 0; diff --git a/librecomp/src/recomp.cpp b/librecomp/src/recomp.cpp index 2bd3945..0e8023d 100644 --- a/librecomp/src/recomp.cpp +++ b/librecomp/src/recomp.cpp @@ -482,6 +482,11 @@ bool recomp::mods::is_mod_enabled(const std::string& mod_id) { return mod_context->is_mod_enabled(mod_id); } +std::vector recomp::mods::get_mod_details(const std::string& mod_game_id) { + std::lock_guard lock { mod_context_mutex }; + return mod_context->get_mod_details(mod_game_id); +} + bool wait_for_game_started(uint8_t* rdram, recomp_context* context) { game_status.wait(GameStatus::None);