mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-01-30 03:32:55 +00:00
Improve booting disc games
Store disc locations for disc games Create /dev_hdd0/disc/ directory Move disc games from /dev_hdd0/game/ to /disc/ automatically Load disc game patches automatically
This commit is contained in:
parent
420bfef214
commit
08e9400870
@ -21,6 +21,7 @@
|
|||||||
#include "Utilities/StrUtil.h"
|
#include "Utilities/StrUtil.h"
|
||||||
|
|
||||||
#include "../Crypto/unself.h"
|
#include "../Crypto/unself.h"
|
||||||
|
#include "yaml-cpp/yaml.h"
|
||||||
|
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
|
||||||
@ -206,6 +207,7 @@ void Emulator::Init()
|
|||||||
fs::create_dir(dev_hdd0 + "home/00000001/savedata/");
|
fs::create_dir(dev_hdd0 + "home/00000001/savedata/");
|
||||||
fs::create_dir(dev_hdd0 + "home/00000001/trophy/");
|
fs::create_dir(dev_hdd0 + "home/00000001/trophy/");
|
||||||
fs::write_file(dev_hdd0 + "home/00000001/localusername", fs::create + fs::excl + fs::write, "User"s);
|
fs::write_file(dev_hdd0 + "home/00000001/localusername", fs::create + fs::excl + fs::write, "User"s);
|
||||||
|
fs::create_dir(dev_hdd0 + "disc/");
|
||||||
fs::create_dir(dev_hdd1 + "cache/");
|
fs::create_dir(dev_hdd1 + "cache/");
|
||||||
fs::create_dir(dev_hdd1 + "game/");
|
fs::create_dir(dev_hdd1 + "game/");
|
||||||
fs::create_path(dev_hdd1);
|
fs::create_path(dev_hdd1);
|
||||||
@ -282,6 +284,14 @@ void Emulator::Load()
|
|||||||
{
|
{
|
||||||
Init();
|
Init();
|
||||||
|
|
||||||
|
// Load game list (maps ABCD12345 IDs to /dev_bdvd/ locations)
|
||||||
|
YAML::Node games = YAML::Load(fs::file{fs::get_config_dir() + "/games.yml", fs::read + fs::create}.to_string());
|
||||||
|
|
||||||
|
if (!games.IsMap())
|
||||||
|
{
|
||||||
|
games.reset();
|
||||||
|
}
|
||||||
|
|
||||||
// Open SELF or ELF
|
// Open SELF or ELF
|
||||||
fs::file elf_file(m_path);
|
fs::file elf_file(m_path);
|
||||||
|
|
||||||
@ -301,6 +311,7 @@ void Emulator::Load()
|
|||||||
const auto _psf = psf::load_object(sfov ? sfov : sfo1);
|
const auto _psf = psf::load_object(sfov ? sfov : sfo1);
|
||||||
m_title = psf::get_string(_psf, "TITLE", m_path);
|
m_title = psf::get_string(_psf, "TITLE", m_path);
|
||||||
m_title_id = psf::get_string(_psf, "TITLE_ID");
|
m_title_id = psf::get_string(_psf, "TITLE_ID");
|
||||||
|
const auto _cat = psf::get_string(_psf, "CATEGORY");
|
||||||
|
|
||||||
LOG_NOTICE(LOADER, "Title: %s", GetTitle());
|
LOG_NOTICE(LOADER, "Title: %s", GetTitle());
|
||||||
LOG_NOTICE(LOADER, "Serial: %s", GetTitleID());
|
LOG_NOTICE(LOADER, "Serial: %s", GetTitleID());
|
||||||
@ -349,21 +360,86 @@ void Emulator::Load()
|
|||||||
vfs::mount("dev_usb000", fmt::replace_all(g_cfg.vfs.dev_usb000, "$(EmulatorDir)", emu_dir));
|
vfs::mount("dev_usb000", fmt::replace_all(g_cfg.vfs.dev_usb000, "$(EmulatorDir)", emu_dir));
|
||||||
vfs::mount("app_home", home_dir.empty() ? elf_dir + '/' : fmt::replace_all(home_dir, "$(EmulatorDir)", emu_dir));
|
vfs::mount("app_home", home_dir.empty() ? elf_dir + '/' : fmt::replace_all(home_dir, "$(EmulatorDir)", emu_dir));
|
||||||
|
|
||||||
// Mount /dev_bdvd/ if necessary
|
// Detect boot location
|
||||||
if (bdvd_dir.empty())
|
const std::string hdd0_game = vfs::get("/dev_hdd0/game/");
|
||||||
|
const std::string hdd0_disc = vfs::get("/dev_hdd0/disc/");
|
||||||
|
|
||||||
|
if (_cat == "DG" && m_path.find(hdd0_game + m_title_id + '/') != -1)
|
||||||
{
|
{
|
||||||
size_t pos = elf_dir.rfind("PS3_GAME");
|
// Booting disc game from wrong location
|
||||||
std::string temp = elf_dir.substr(0, pos);
|
LOG_ERROR(LOADER, "Disc game found at invalid location: /dev_hdd0/game/%s/", m_title_id);
|
||||||
if ((pos != std::string::npos) && fs::is_file(temp + "/PS3_DISC.SFB")) {
|
|
||||||
bdvd_dir = temp;
|
// Move and retry from correct location
|
||||||
|
if (fs::rename(hdd0_game + m_title_id, hdd0_disc + m_title_id))
|
||||||
|
{
|
||||||
|
LOG_SUCCESS(LOADER, "Disc game moved to special location: /dev_hdd0/disc/%s/", m_title_id);
|
||||||
|
return SetPath(hdd0_disc + m_path.substr(hdd0_game.size())), Load();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_ERROR(LOADER, "Failed to move disc game to /dev_hdd0/disc/%s/ (%s)", m_title_id, fs::g_tls_error);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_cat == "DG" && bdvd_dir.empty())
|
||||||
|
{
|
||||||
|
// Mount /dev_bdvd/ if necessary
|
||||||
|
if (auto pos = elf_dir.rfind("/PS3_GAME") + 1)
|
||||||
|
{
|
||||||
|
bdvd_dir = elf_dir.substr(0, pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_cat == "GD" && bdvd_dir.empty())
|
||||||
|
{
|
||||||
|
// Load /dev_bdvd/ from game list if available
|
||||||
|
if (auto node = games[m_title_id])
|
||||||
|
{
|
||||||
|
bdvd_dir = node.Scalar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!bdvd_dir.empty() && fs::is_dir(bdvd_dir))
|
if (!bdvd_dir.empty() && fs::is_dir(bdvd_dir))
|
||||||
{
|
{
|
||||||
vfs::mount("dev_bdvd", fmt::replace_all(bdvd_dir, "$(EmulatorDir)", emu_dir));
|
vfs::mount("dev_bdvd", bdvd_dir);
|
||||||
LOG_NOTICE(LOADER, "Disc: %s", vfs::get("/dev_bdvd"));
|
LOG_NOTICE(LOADER, "Disc: %s", vfs::get("/dev_bdvd"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check /dev_bdvd/
|
||||||
|
if (_cat == "DG")
|
||||||
|
{
|
||||||
|
fs::file sfb_file;
|
||||||
|
|
||||||
|
if (bdvd_dir.empty())
|
||||||
|
{
|
||||||
|
LOG_ERROR(LOADER, "Failed to mount disc directory for the disc game %s", m_title_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sfb_file.open(vfs::get("/dev_bdvd/PS3_DISC.SFB")) || sfb_file.size() < 4 || sfb_file.read<u32>() != ".SFB"_u32)
|
||||||
|
{
|
||||||
|
LOG_ERROR(LOADER, "Invalid disc directory for the disc game %s", m_title_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store /dev_bdvd/ location
|
||||||
|
games[m_title_id] = bdvd_dir;
|
||||||
|
YAML::Emitter out;
|
||||||
|
out << games;
|
||||||
|
fs::file(fs::get_config_dir() + "/games.yml", fs::rewrite).write(out.c_str(), out.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check game updates
|
||||||
|
const std::string hdd0_boot = hdd0_game + m_title_id + "/USRDIR/EBOOT.BIN";
|
||||||
|
|
||||||
|
if (_cat == "DG" && fs::is_file(hdd0_boot))
|
||||||
|
{
|
||||||
|
// Booting game update
|
||||||
|
LOG_SUCCESS(LOADER, "Updates found at /dev_hdd0/game/%s/!", m_title_id);
|
||||||
|
return SetPath(hdd0_boot), Load();
|
||||||
|
}
|
||||||
|
|
||||||
// Mount /host_root/ if necessary
|
// Mount /host_root/ if necessary
|
||||||
if (g_cfg.vfs.host_root)
|
if (g_cfg.vfs.host_root)
|
||||||
{
|
{
|
||||||
@ -422,9 +498,9 @@ void Emulator::Load()
|
|||||||
|
|
||||||
if (m_elf_path.empty())
|
if (m_elf_path.empty())
|
||||||
{
|
{
|
||||||
if (m_path.find(vfs::get("/dev_hdd0/game/")) != -1)
|
if (m_path.find(hdd0_game) != -1)
|
||||||
{
|
{
|
||||||
m_elf_path = "/dev_hdd0/game/" + m_path.substr(vfs::get("/dev_hdd0/game/").size());
|
m_elf_path = "/dev_hdd0/game/" + m_path.substr(hdd0_game.size());
|
||||||
}
|
}
|
||||||
else if (!bdvd_dir.empty() && fs::is_dir(bdvd_dir))
|
else if (!bdvd_dir.empty() && fs::is_dir(bdvd_dir))
|
||||||
{
|
{
|
||||||
@ -724,7 +800,7 @@ s32 error_code::error_report(const fmt_type_info* sup, u64 arg)
|
|||||||
if (ppu.last_function)
|
if (ppu.last_function)
|
||||||
{
|
{
|
||||||
func = ppu.last_function;
|
func = ppu.last_function;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_system == system_type::psv)
|
if (g_system == system_type::psv)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user