diff --git a/custom/mupen64plus-next_common.h b/custom/mupen64plus-next_common.h index 3ff303fe5..affd5384b 100644 --- a/custom/mupen64plus-next_common.h +++ b/custom/mupen64plus-next_common.h @@ -76,8 +76,8 @@ extern char* retro_dd_path_img; extern char* retro_dd_path_rom; // Other Subsystems -extern char* retro_transferpak_rom_path; -extern char* retro_transferpak_ram_path; +extern char* retro_transferpak_rom_path[4]; +extern char* retro_transferpak_ram_path[4]; // Threaded GL Callback extern void gln64_thr_gl_invoke_command_loop(); diff --git a/libretro/libretro.c b/libretro/libretro.c index c4f570f3b..c4cf727d4 100644 --- a/libretro/libretro.c +++ b/libretro/libretro.c @@ -159,8 +159,8 @@ char* retro_dd_path_img = NULL; char* retro_dd_path_rom = NULL; // Other Subsystems -char* retro_transferpak_rom_path = NULL; -char* retro_transferpak_ram_path = NULL; +char* retro_transferpak_rom_path[4] = { NULL }; +char* retro_transferpak_ram_path[4] = { NULL }; uint32_t CoreOptionCategoriesSupported = 0; uint32_t CoreOptionUpdateDisplayCbSupported = 0; @@ -380,16 +380,19 @@ static void cleanup_global_paths() retro_dd_path_rom = NULL; } - if(retro_transferpak_rom_path) + for (int id = 0; id < 4; id++) { - free(retro_transferpak_rom_path); - retro_transferpak_rom_path = NULL; - } - - if(retro_transferpak_ram_path) - { - free(retro_transferpak_ram_path); - retro_transferpak_ram_path = NULL; + if(retro_transferpak_rom_path[id]) + { + free(retro_transferpak_rom_path[id]); + retro_transferpak_rom_path[id] = NULL; + } + + if(retro_transferpak_ram_path[id]) + { + free(retro_transferpak_ram_path[id]); + retro_transferpak_ram_path[id] = NULL; + } } } @@ -579,8 +582,11 @@ bool retro_load_game_special(unsigned game_type, const struct retro_game_info *i case RETRO_GAME_TYPE_TRANSFERPAK: if(num_info == 3) { - retro_transferpak_ram_path = strdup(info[0].path); - retro_transferpak_rom_path = strdup(info[1].path); + for (int i = 0; i < 4; i++) + { + retro_transferpak_ram_path[i] = strdup(info[0].path); + retro_transferpak_rom_path[i] = strdup(info[1].path); + } } else { return false; } @@ -1893,43 +1899,94 @@ bool retro_load_game(const struct retro_game_info *game) } } - if (!retro_transferpak_rom_path && game->path) + if (game->path) { - gamePath = (char *)game->path; - newPath = (char *)calloc(1, strlen(gamePath) + 4); - strcpy(newPath, gamePath); - strcat(newPath, ".gb"); - FILE *fileTest = fopen(newPath, "r"); - if (!fileTest) - { - free(newPath); - } - else - { - fclose(fileTest); - // Free'd later in Mupen Core - retro_transferpak_rom_path = newPath; - - // We have a gb rom! - if (!retro_transferpak_ram_path) - { - gamePath = (char *)game->path; - newPath = (char *)calloc(1, strlen(gamePath) + 5); - strcpy(newPath, gamePath); - strcat(newPath, ".sav"); - FILE *fileTest = fopen(newPath, "r"); - if (!fileTest) - { + gamePath = (char *)game->path; + char iToStr[2]; + iToStr[0] = '1'; + iToStr[1] = '\0'; + for (int i = 0; i < 4; i++, iToStr[0]++) + { + if (retro_transferpak_rom_path[i]) + continue; + + newPath = (char *)calloc(1, strlen(gamePath) + 10); + strcpy(newPath, gamePath); + strcat(newPath, ".pak/"); + strcat(newPath, iToStr); + strcat(newPath, ".gb"); + FILE *fileTest = fopen(newPath, "r"); + if (!fileTest) + { free(newPath); - } - else - { + } + else + { fclose(fileTest); // Free'd later in Mupen Core - retro_transferpak_ram_path = newPath; - } - } - } + retro_transferpak_rom_path[i] = newPath; + + // We have a gb rom! + if (!retro_transferpak_ram_path[i]) + { + gamePath = (char *)game->path; + newPath = (char *)calloc(1, strlen(gamePath) + 11); + strcpy(newPath, gamePath); + strcat(newPath, ".pak/"); + strcat(newPath, iToStr); + strcat(newPath, ".sav"); + FILE *fileTest = fopen(newPath, "r"); + if (!fileTest) + { + free(newPath); + } + else + { + fclose(fileTest); + // Free'd later in Mupen Core + retro_transferpak_ram_path[i] = newPath; + } + } + goto skip_generic_gb; + } + + newPath = (char *)calloc(1, strlen(gamePath) + 4); + strcpy(newPath, gamePath); + strcat(newPath, ".gb"); + fileTest = fopen(newPath, "r"); + if (!fileTest) + { + free(newPath); + } + else + { + fclose(fileTest); + // Free'd later in Mupen Core + retro_transferpak_rom_path[i] = newPath; + + // We have a gb rom! + if (!retro_transferpak_ram_path[i]) + { + gamePath = (char *)game->path; + newPath = (char *)calloc(1, strlen(gamePath) + 5); + strcpy(newPath, gamePath); + strcat(newPath, ".sav"); + FILE *fileTest = fopen(newPath, "r"); + if (!fileTest) + { + free(newPath); + } + else + { + fclose(fileTest); + // Free'd later in Mupen Core + retro_transferpak_ram_path[i] = newPath; + } + } + } + +skip_generic_gb: + } } // Init default vals diff --git a/mupen64plus-core/src/backends/plugins_compat/input_plugin_compat.c b/mupen64plus-core/src/backends/plugins_compat/input_plugin_compat.c index 8ebdd059d..8ebb55ffb 100644 --- a/mupen64plus-core/src/backends/plugins_compat/input_plugin_compat.c +++ b/mupen64plus-core/src/backends/plugins_compat/input_plugin_compat.c @@ -115,7 +115,7 @@ static m64p_error input_plugin_get_input(void* opaque, uint32_t* input_) cin_compat->main_switch_pak(cin_compat->control_id); cin_compat->main_switch_pak = NULL; // If switching to Transfer Pak and if a rom path is set, Switch it - if(Controls[cin_compat->control_id].Plugin == PLUGIN_TRANSFER_PAK && retro_transferpak_rom_path) + if(Controls[cin_compat->control_id].Plugin == PLUGIN_TRANSFER_PAK && retro_transferpak_rom_path[cin_compat->control_id]) { cin_compat->gb_cart_switch_enabled = 1; } diff --git a/mupen64plus-core/src/main/main.c b/mupen64plus-core/src/main/main.c index 3ef61a270..f2f224378 100644 --- a/mupen64plus-core/src/main/main.c +++ b/mupen64plus-core/src/main/main.c @@ -1235,7 +1235,7 @@ static void init_gb_rom(void* opaque, void** storage, const struct storage_backe /* Ask the core loader for rom filename */ char* rom_filename = (g_media_loader.get_gb_cart_rom == NULL) - ? (retro_transferpak_rom_path ? strdup(retro_transferpak_rom_path) : NULL) + ? (retro_transferpak_rom_path[data->control_id] ? strdup(retro_transferpak_rom_path[data->control_id]) : NULL) : g_media_loader.get_gb_cart_rom(g_media_loader.cb_data, data->control_id); /* Handle the no cart case */ @@ -1279,7 +1279,7 @@ static void init_gb_ram(void* opaque, size_t ram_size, void** storage, const str /* Ask the core loader for ram filename */ char* ram_filename = (g_media_loader.get_gb_cart_ram == NULL) - ? (retro_transferpak_ram_path ? strdup(retro_transferpak_ram_path) : NULL) + ? (retro_transferpak_ram_path[data->control_id] ? strdup(retro_transferpak_ram_path[data->control_id]) : NULL) : g_media_loader.get_gb_cart_ram(g_media_loader.cb_data, data->control_id); /* Handle the no RAM case