mirror of https://github.com/PCSX2/pcsx2.git
Achievements: Identify using running ELF instead of disc ELF
This commit is contained in:
parent
72145f4914
commit
4714a2fccb
|
@ -139,12 +139,12 @@ namespace Achievements
|
||||||
static void BeginLoadingScreen(const char* text, bool* was_running_idle);
|
static void BeginLoadingScreen(const char* text, bool* was_running_idle);
|
||||||
static void EndLoadingScreen(bool was_running_idle);
|
static void EndLoadingScreen(bool was_running_idle);
|
||||||
static std::string_view GetELFNameForHash(const std::string& elf_path);
|
static std::string_view GetELFNameForHash(const std::string& elf_path);
|
||||||
static std::string GetGameHash();
|
static std::string GetGameHash(const std::string& elf_path);
|
||||||
static void SetHardcoreMode(bool enabled, bool force_display_message);
|
static void SetHardcoreMode(bool enabled, bool force_display_message);
|
||||||
static bool IsLoggedInOrLoggingIn();
|
static bool IsLoggedInOrLoggingIn();
|
||||||
static bool IsUnknownGame();
|
static bool IsUnknownGame();
|
||||||
static void ShowLoginSuccess(const rc_client_t* client);
|
static void ShowLoginSuccess(const rc_client_t* client);
|
||||||
static void IdentifyGame(u32 disc_crc);
|
static void IdentifyGame(u32 disc_crc, u32 crc);
|
||||||
static void BeginLoadGame();
|
static void BeginLoadGame();
|
||||||
static void UpdateGameSummary();
|
static void UpdateGameSummary();
|
||||||
static void DownloadImage(std::string url, std::string cache_filename);
|
static void DownloadImage(std::string url, std::string cache_filename);
|
||||||
|
@ -211,10 +211,10 @@ namespace Achievements
|
||||||
static std::string s_image_directory;
|
static std::string s_image_directory;
|
||||||
static std::unique_ptr<HTTPDownloader> s_http_downloader;
|
static std::unique_ptr<HTTPDownloader> s_http_downloader;
|
||||||
|
|
||||||
static u32 s_game_disc_crc;
|
|
||||||
static std::string s_game_hash;
|
static std::string s_game_hash;
|
||||||
static std::string s_game_title;
|
static std::string s_game_title;
|
||||||
static std::string s_game_icon;
|
static std::string s_game_icon;
|
||||||
|
static u32 s_game_crc;
|
||||||
static rc_client_user_game_summary_t s_game_summary;
|
static rc_client_user_game_summary_t s_game_summary;
|
||||||
static u32 s_game_id = 0;
|
static u32 s_game_id = 0;
|
||||||
|
|
||||||
|
@ -314,12 +314,8 @@ std::string_view Achievements::GetELFNameForHash(const std::string& elf_path)
|
||||||
return std::string_view(elf_path).substr(start, end - start);
|
return std::string_view(elf_path).substr(start, end - start);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Achievements::GetGameHash()
|
std::string Achievements::GetGameHash(const std::string& elf_path)
|
||||||
{
|
{
|
||||||
const std::string elf_path = VMManager::GetDiscELF();
|
|
||||||
if (elf_path.empty())
|
|
||||||
return {};
|
|
||||||
|
|
||||||
// this.. really shouldn't be invalid
|
// this.. really shouldn't be invalid
|
||||||
const std::string_view name_for_hash = GetELFNameForHash(elf_path);
|
const std::string_view name_for_hash = GetELFNameForHash(elf_path);
|
||||||
if (name_for_hash.empty())
|
if (name_for_hash.empty())
|
||||||
|
@ -460,7 +456,7 @@ bool Achievements::Initialize()
|
||||||
|
|
||||||
// Begin disc identification early, before the login finishes.
|
// Begin disc identification early, before the login finishes.
|
||||||
if (VMManager::HasValidVM())
|
if (VMManager::HasValidVM())
|
||||||
IdentifyGame(VMManager::GetDiscCRC());
|
IdentifyGame(VMManager::GetDiscCRC(), VMManager::GetCurrentCRC());
|
||||||
|
|
||||||
const std::string username = Host::GetBaseStringSettingValue("Achievements", "Username");
|
const std::string username = Host::GetBaseStringSettingValue("Achievements", "Username");
|
||||||
const std::string api_token = Host::GetBaseStringSettingValue("Achievements", "Token");
|
const std::string api_token = Host::GetBaseStringSettingValue("Achievements", "Token");
|
||||||
|
@ -845,21 +841,26 @@ void Achievements::GameChanged(u32 disc_crc, u32 crc)
|
||||||
if (!IsActive())
|
if (!IsActive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
IdentifyGame(disc_crc);
|
IdentifyGame(disc_crc, crc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Achievements::IdentifyGame(u32 disc_crc)
|
void Achievements::IdentifyGame(u32 disc_crc, u32 crc)
|
||||||
{
|
{
|
||||||
// avoid reading+hashing the executable if the crc hasn't changed
|
// If we're currently loading the ELF, assume that we're going to load the default ELF.
|
||||||
if (s_game_disc_crc == disc_crc)
|
// That way we can download achievement data while the PS2 logo runs. Pretty safe assumption.
|
||||||
|
const bool booted_elf = VMManager::Internal::HasBootedELF();
|
||||||
|
const u32 crc_to_use = booted_elf ? crc : disc_crc;
|
||||||
|
|
||||||
|
// Avoid reading+hashing the executable if the crc hasn't changed.
|
||||||
|
if (s_game_crc == crc_to_use)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::string game_hash = GetGameHash();
|
const std::string game_hash = GetGameHash(booted_elf ? VMManager::GetCurrentELF() : VMManager::GetDiscELF());
|
||||||
if (s_game_hash == game_hash)
|
if (s_game_hash == game_hash)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ClearGameHash();
|
ClearGameHash();
|
||||||
s_game_disc_crc = disc_crc;
|
s_game_crc = crc_to_use;
|
||||||
s_game_hash = std::move(game_hash);
|
s_game_hash = std::move(game_hash);
|
||||||
|
|
||||||
#ifdef ENABLE_RAINTEGRATION
|
#ifdef ENABLE_RAINTEGRATION
|
||||||
|
@ -898,7 +899,7 @@ void Achievements::BeginLoadGame()
|
||||||
if (s_game_hash.empty())
|
if (s_game_hash.empty())
|
||||||
{
|
{
|
||||||
// when we're booting the bios, or shutting down, this will fail
|
// when we're booting the bios, or shutting down, this will fail
|
||||||
if (s_game_disc_crc != 0)
|
if (s_game_crc != 0)
|
||||||
{
|
{
|
||||||
Host::AddKeyedOSDMessage("retroachievements_disc_read_failed",
|
Host::AddKeyedOSDMessage("retroachievements_disc_read_failed",
|
||||||
TRANSLATE_STR("Achievements", "Failed to read executable from disc. Achievements disabled."),
|
TRANSLATE_STR("Achievements", "Failed to read executable from disc. Achievements disabled."),
|
||||||
|
@ -1019,7 +1020,7 @@ void Achievements::ClearGameInfo()
|
||||||
|
|
||||||
void Achievements::ClearGameHash()
|
void Achievements::ClearGameHash()
|
||||||
{
|
{
|
||||||
s_game_disc_crc = 0;
|
s_game_crc = 0;
|
||||||
std::string().swap(s_game_hash);
|
std::string().swap(s_game_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1492,7 +1493,6 @@ void Achievements::LoadState(const u8* state_data, u32 state_data_size)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// this assumes that the CRC and ELF name has been loaded prior to the cheevos state (it should be).
|
// this assumes that the CRC and ELF name has been loaded prior to the cheevos state (it should be).
|
||||||
if (VMManager::GetDiscCRC() != s_game_disc_crc)
|
|
||||||
GameChanged(VMManager::GetDiscCRC(), VMManager::GetCurrentCRC());
|
GameChanged(VMManager::GetDiscCRC(), VMManager::GetCurrentCRC());
|
||||||
|
|
||||||
#ifdef ENABLE_RAINTEGRATION
|
#ifdef ENABLE_RAINTEGRATION
|
||||||
|
|
|
@ -331,10 +331,14 @@ std::string VMManager::GetDiscVersion()
|
||||||
|
|
||||||
u32 VMManager::GetCurrentCRC()
|
u32 VMManager::GetCurrentCRC()
|
||||||
{
|
{
|
||||||
std::unique_lock lock(s_info_mutex);
|
|
||||||
return s_current_crc;
|
return s_current_crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::string& VMManager::GetCurrentELF()
|
||||||
|
{
|
||||||
|
return s_elf_path;
|
||||||
|
}
|
||||||
|
|
||||||
bool VMManager::Internal::CPUThreadInitialize()
|
bool VMManager::Internal::CPUThreadInitialize()
|
||||||
{
|
{
|
||||||
Threading::SetNameOfCurrentThread("CPU Thread");
|
Threading::SetNameOfCurrentThread("CPU Thread");
|
||||||
|
|
|
@ -93,6 +93,9 @@ namespace VMManager
|
||||||
/// Returns the crc of the executable currently running.
|
/// Returns the crc of the executable currently running.
|
||||||
u32 GetCurrentCRC();
|
u32 GetCurrentCRC();
|
||||||
|
|
||||||
|
/// Returns the path to the ELF which is currently running. Only safe to read on the EE thread.
|
||||||
|
const std::string& GetCurrentELF();
|
||||||
|
|
||||||
/// Initializes all system components.
|
/// Initializes all system components.
|
||||||
bool Initialize(VMBootParameters boot_params);
|
bool Initialize(VMBootParameters boot_params);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue