Add mod API export to let a mod get its own version (#100)

This commit is contained in:
Wiseguy 2025-04-08 01:04:37 -04:00 committed by GitHub
parent af075623dc
commit cacb14fee5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 35 additions and 0 deletions

View file

@ -343,6 +343,8 @@ namespace recomp {
size_t get_mod_order_index(const std::string& mod_id) const;
std::optional<ModDetails> get_details_for_mod(const std::string& mod_id) const;
std::vector<ModDetails> 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<char> &get_mod_thumbnail(const std::string &mod_id) const;
@ -586,6 +588,8 @@ namespace recomp {
std::filesystem::path get_mods_directory();
std::optional<ModDetails> get_details_for_mod(const std::string& mod_id);
std::vector<ModDetails> 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);

View file

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

View file

@ -1151,6 +1151,14 @@ std::vector<recomp::mods::ModDetails> 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;

View file

@ -583,6 +583,16 @@ std::vector<recomp::mods::ModDetails> 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);