Skip to content

Commit cacb14f

Browse files
authored
Add mod API export to let a mod get its own version (#100)
1 parent af07562 commit cacb14f

File tree

4 files changed

+35
-0
lines changed

4 files changed

+35
-0
lines changed

librecomp/include/librecomp/mods.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,8 @@ namespace recomp {
343343
size_t get_mod_order_index(const std::string& mod_id) const;
344344
std::optional<ModDetails> get_details_for_mod(const std::string& mod_id) const;
345345
std::vector<ModDetails> get_all_mod_details(const std::string& mod_game_id);
346+
recomp::Version get_mod_version(size_t mod_index);
347+
std::string get_mod_id(size_t mod_index);
346348
void set_mod_index(const std::string &mod_game_id, const std::string &mod_id, size_t index);
347349
const ConfigSchema &get_mod_config_schema(const std::string &mod_id) const;
348350
const std::vector<char> &get_mod_thumbnail(const std::string &mod_id) const;
@@ -586,6 +588,8 @@ namespace recomp {
586588
std::filesystem::path get_mods_directory();
587589
std::optional<ModDetails> get_details_for_mod(const std::string& mod_id);
588590
std::vector<ModDetails> get_all_mod_details(const std::string& mod_game_id);
591+
recomp::Version get_mod_version(size_t mod_index);
592+
std::string get_mod_id(size_t mod_index);
589593
void enable_mod(const std::string& mod_id, bool enabled);
590594
bool is_mod_enabled(const std::string& mod_id);
591595
bool is_mod_auto_enabled(const std::string& mod_id);

librecomp/src/mod_config_api.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,18 @@ void recomp_get_config_string(uint8_t* rdram, recomp_context* ctx, size_t mod_in
5151
}
5252
}
5353

54+
void recomp_get_mod_version(uint8_t* rdram, recomp_context* ctx, size_t mod_index) {
55+
uint32_t* major_out = _arg<0, uint32_t*>(rdram, ctx);
56+
uint32_t* minor_out = _arg<1, uint32_t*>(rdram, ctx);
57+
uint32_t* patch_out = _arg<2, uint32_t*>(rdram, ctx);
58+
59+
recomp::Version version = recomp::mods::get_mod_version(mod_index);
60+
61+
*major_out = version.major;
62+
*minor_out = version.minor;
63+
*patch_out = version.patch;
64+
}
65+
5466
void recomp_free_config_string(uint8_t* rdram, recomp_context* ctx) {
5567
gpr str_rdram = (gpr)_arg<0, PTR(char)>(rdram, ctx);
5668
gpr offset = str_rdram - 0xFFFFFFFF80000000ULL;
@@ -62,5 +74,6 @@ void recomp::mods::register_config_exports() {
6274
recomp::overlays::register_ext_base_export("recomp_get_config_u32", recomp_get_config_u32);
6375
recomp::overlays::register_ext_base_export("recomp_get_config_double", recomp_get_config_double);
6476
recomp::overlays::register_ext_base_export("recomp_get_config_string", recomp_get_config_string);
77+
recomp::overlays::register_ext_base_export("recomp_get_mod_version", recomp_get_mod_version);
6578
recomp::overlays::register_base_export("recomp_free_config_string", recomp_free_config_string);
6679
}

librecomp/src/mods.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,14 @@ std::vector<recomp::mods::ModDetails> recomp::mods::ModContext::get_all_mod_deta
11511151
return ret;
11521152
}
11531153

1154+
recomp::Version recomp::mods::ModContext::get_mod_version(size_t mod_index) {
1155+
return opened_mods[mod_index].manifest.version;
1156+
}
1157+
1158+
std::string recomp::mods::ModContext::get_mod_id(size_t mod_index) {
1159+
return opened_mods[mod_index].manifest.mod_id;
1160+
}
1161+
11541162
struct RegeneratedSection {
11551163
uint32_t rom_addr;
11561164
uint32_t ram_addr;

librecomp/src/recomp.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,16 @@ std::vector<recomp::mods::ModDetails> recomp::mods::get_all_mod_details(const st
583583
return mod_context->get_all_mod_details(mod_game_id);
584584
}
585585

586+
recomp::Version recomp::mods::get_mod_version(size_t mod_index) {
587+
std::lock_guard lock { mod_context_mutex };
588+
return mod_context->get_mod_version(mod_index);
589+
}
590+
591+
std::string recomp::mods::get_mod_id(size_t mod_index) {
592+
std::lock_guard lock { mod_context_mutex };
593+
return mod_context->get_mod_id(mod_index);
594+
}
595+
586596
void recomp::mods::set_mod_index(const std::string &mod_game_id, const std::string &mod_id, size_t index) {
587597
std::lock_guard lock{ mod_context_mutex };
588598
return mod_context->set_mod_index(mod_game_id, mod_id, index);

0 commit comments

Comments
 (0)