diff --git a/librecomp/include/librecomp/mods.hpp b/librecomp/include/librecomp/mods.hpp index 9e11f68..f98f3b2 100644 --- a/librecomp/include/librecomp/mods.hpp +++ b/librecomp/include/librecomp/mods.hpp @@ -343,6 +343,8 @@ namespace recomp { size_t get_mod_order_index(const std::string& mod_id) const; std::optional get_details_for_mod(const std::string& mod_id) const; std::vector get_all_mod_details(const std::string& mod_game_id); + recomp::Version get_mod_version(size_t mod_index); + std::string get_mod_id(size_t mod_index); void set_mod_index(const std::string &mod_game_id, const std::string &mod_id, size_t index); const ConfigSchema &get_mod_config_schema(const std::string &mod_id) const; const std::vector &get_mod_thumbnail(const std::string &mod_id) const; @@ -586,6 +588,8 @@ namespace recomp { std::filesystem::path get_mods_directory(); std::optional get_details_for_mod(const std::string& mod_id); std::vector get_all_mod_details(const std::string& mod_game_id); + recomp::Version get_mod_version(size_t mod_index); + std::string get_mod_id(size_t mod_index); void enable_mod(const std::string& mod_id, bool enabled); bool is_mod_enabled(const std::string& mod_id); bool is_mod_auto_enabled(const std::string& mod_id); diff --git a/librecomp/src/mod_config_api.cpp b/librecomp/src/mod_config_api.cpp index b1c430a..8551df2 100644 --- a/librecomp/src/mod_config_api.cpp +++ b/librecomp/src/mod_config_api.cpp @@ -51,6 +51,18 @@ void recomp_get_config_string(uint8_t* rdram, recomp_context* ctx, size_t mod_in } } +void recomp_get_mod_version(uint8_t* rdram, recomp_context* ctx, size_t mod_index) { + uint32_t* major_out = _arg<0, uint32_t*>(rdram, ctx); + uint32_t* minor_out = _arg<1, uint32_t*>(rdram, ctx); + uint32_t* patch_out = _arg<2, uint32_t*>(rdram, ctx); + + recomp::Version version = recomp::mods::get_mod_version(mod_index); + + *major_out = version.major; + *minor_out = version.minor; + *patch_out = version.patch; +} + void recomp_free_config_string(uint8_t* rdram, recomp_context* ctx) { gpr str_rdram = (gpr)_arg<0, PTR(char)>(rdram, ctx); gpr offset = str_rdram - 0xFFFFFFFF80000000ULL; @@ -62,5 +74,6 @@ void recomp::mods::register_config_exports() { recomp::overlays::register_ext_base_export("recomp_get_config_u32", recomp_get_config_u32); recomp::overlays::register_ext_base_export("recomp_get_config_double", recomp_get_config_double); recomp::overlays::register_ext_base_export("recomp_get_config_string", recomp_get_config_string); + recomp::overlays::register_ext_base_export("recomp_get_mod_version", recomp_get_mod_version); recomp::overlays::register_base_export("recomp_free_config_string", recomp_free_config_string); } diff --git a/librecomp/src/mods.cpp b/librecomp/src/mods.cpp index b39c763..32be9ef 100644 --- a/librecomp/src/mods.cpp +++ b/librecomp/src/mods.cpp @@ -1151,6 +1151,14 @@ std::vector recomp::mods::ModContext::get_all_mod_deta return ret; } +recomp::Version recomp::mods::ModContext::get_mod_version(size_t mod_index) { + return opened_mods[mod_index].manifest.version; +} + +std::string recomp::mods::ModContext::get_mod_id(size_t mod_index) { + return opened_mods[mod_index].manifest.mod_id; +} + struct RegeneratedSection { uint32_t rom_addr; uint32_t ram_addr; diff --git a/librecomp/src/recomp.cpp b/librecomp/src/recomp.cpp index 169654c..443d05f 100644 --- a/librecomp/src/recomp.cpp +++ b/librecomp/src/recomp.cpp @@ -583,6 +583,16 @@ std::vector recomp::mods::get_all_mod_details(const st return mod_context->get_all_mod_details(mod_game_id); } +recomp::Version recomp::mods::get_mod_version(size_t mod_index) { + std::lock_guard lock { mod_context_mutex }; + return mod_context->get_mod_version(mod_index); +} + +std::string recomp::mods::get_mod_id(size_t mod_index) { + std::lock_guard lock { mod_context_mutex }; + return mod_context->get_mod_id(mod_index); +} + void recomp::mods::set_mod_index(const std::string &mod_game_id, const std::string &mod_id, size_t index) { std::lock_guard lock{ mod_context_mutex }; return mod_context->set_mod_index(mod_game_id, mod_id, index);