diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp index c79e84352b..217d5d2c73 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp @@ -362,22 +362,25 @@ namespace rsx if (!background_image) { - game_content_type background_content_type = game_content_type::background_picture; + // Search for any useable background picture in the given order + game_content_type content_type = game_content_type::background_picture; + game_content_dir_type dir_type = game_content_dir_type::any; for (game_content_type type : { game_content_type::background_picture, game_content_type::content_icon, game_content_type::overlay_picture }) { - if (const std::string picture_path = rpcs3::utils::get_game_content_path(type); fs::is_file(picture_path)) + if (const std::string picture_path = rpcs3::utils::get_game_content_path(type, dir_type); !picture_path.empty()) { - background_content_type = type; + content_type = type; background_image = std::make_unique(picture_path); dirty |= !!background_image->get_data(); break; } } - if (background_image && !background_overlay_image && background_content_type == game_content_type::background_picture) + // Search for an overlay picture in the same dir in case we found a real background picture + if (background_image && !background_overlay_image && content_type == game_content_type::background_picture && dir_type != game_content_dir_type::any) { - if (const std::string picture_path = rpcs3::utils::get_game_content_path(game_content_type::overlay_picture); fs::is_file(picture_path)) + if (const std::string picture_path = rpcs3::utils::get_game_content_path(game_content_type::overlay_picture, dir_type); !picture_path.empty()) { background_overlay_image = std::make_unique(picture_path); dirty |= !!background_overlay_image->get_data(); diff --git a/rpcs3/Emu/system_utils.cpp b/rpcs3/Emu/system_utils.cpp index f354732ead..ec8bad5545 100644 --- a/rpcs3/Emu/system_utils.cpp +++ b/rpcs3/Emu/system_utils.cpp @@ -340,7 +340,7 @@ namespace rpcs3::utils return get_input_config_dir(title_id) + g_cfg_input_configs.default_config + ".yml"; } - std::string get_game_content_path(game_content_type type) + std::string get_game_content_path(game_content_type type, game_content_dir_type& dir_type) { const std::string locale_suffix = fmt::format("_%02d", static_cast(g_cfg.sys.language.get())); const std::string disc_dir = vfs::get("/dev_bdvd/PS3_GAME"); @@ -352,11 +352,12 @@ namespace rpcs3::utils } const bool is_disc_game = !disc_dir.empty(); + const bool check_disc = is_disc_game && dir_type != game_content_dir_type::dev_hdd0; - const auto find_content = [is_disc_game, &hdd0_dir, &disc_dir, &locale_suffix](const std::string& name, const std::string& extension) -> std::string + const auto find_content = [&](const std::string& name, const std::string& extension) -> std::string { // ICON0.PNG is not supposed to be updateable, so we can ignore the hdd0 dir for disc games in that case - const bool check_hdd0 = !hdd0_dir.empty() && !(is_disc_game && name == "ICON0"); + const bool check_hdd0 = !hdd0_dir.empty() && dir_type != game_content_dir_type::dev_bdvd && !(is_disc_game && name == "ICON0"); // Check localized content first for (bool localized : { true, false }) @@ -367,16 +368,24 @@ namespace rpcs3::utils if (check_hdd0) { if (std::string path = hdd0_dir + filename; fs::is_file(path)) + { + dir_type = game_content_dir_type::dev_hdd0; return path; + } } // Check content on disc - if (is_disc_game) + if (check_disc) { if (std::string path = disc_dir + filename; fs::is_file(path)) + { + dir_type = game_content_dir_type::dev_bdvd; return path; + } } } + + dir_type = game_content_dir_type::any; return {}; }; @@ -400,20 +409,21 @@ namespace rpcs3::utils return find_content(high_res ? "PIC0" : "PIC2", "PNG"); } case game_content_type::background_picture: + case game_content_type::background_picture_2: { // Try to find a custom background first if (std::string path = fs::get_config_dir() + "/Icons/game_icons/" + Emu.GetTitleID() + "/PIC1.PNG"; fs::is_file(path)) + { + dir_type = game_content_dir_type::any; return path; + } // Look for proper background - if (std::string path = find_content("PIC1", "PNG"); !path.empty()) - return path; - - // Fallback to PIC3.PNG (should only exist for content discs though...) - return find_content("PIC3", "PNG"); + return find_content(type == game_content_type::background_picture ? "PIC1" : "PIC3", "PNG"); } } + dir_type = game_content_dir_type::any; return {}; } } diff --git a/rpcs3/Emu/system_utils.hpp b/rpcs3/Emu/system_utils.hpp index 74c08bff43..1f8808484f 100644 --- a/rpcs3/Emu/system_utils.hpp +++ b/rpcs3/Emu/system_utils.hpp @@ -3,13 +3,21 @@ #include "util/types.hpp" #include +enum class game_content_dir_type +{ + any, // Can also be used as none when returned + dev_hdd0, // HDD0 dir + dev_bdvd, // Disc dir +}; + enum class game_content_type { - content_icon, // ICON0.PNG - content_video, // ICON1.PAM - content_sound, // SND0.AT3 - overlay_picture, // PIC0.PNG (16:9) or PIC2.PNG (4:3) - background_picture, // PIC1.PNG + content_icon, // ICON0.PNG + content_video, // ICON1.PAM + content_sound, // SND0.AT3 + overlay_picture, // PIC0.PNG (16:9) or PIC2.PNG (4:3) + background_picture, // PIC1.PNG + background_picture_2, // PIC3.PNG (should only exist for install or extra content discs...) }; namespace rpcs3::utils @@ -40,5 +48,5 @@ namespace rpcs3::utils std::string get_input_config_dir(const std::string& title_id = ""); std::string get_custom_input_config_path(const std::string& title_id); - std::string get_game_content_path(game_content_type type); + std::string get_game_content_path(game_content_type type, game_content_dir_type& dir_type); }