mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2025-01-20 15:25:38 +00:00
Achievements: Fix HC mode activating on reset of non-cheevo game
This commit is contained in:
parent
ef05a80fd2
commit
84b24c6228
|
@ -129,6 +129,7 @@ static void ClearGameHash();
|
||||||
static std::string GetGameHash(CDImage* image);
|
static std::string GetGameHash(CDImage* image);
|
||||||
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 CanEnableHardcoreMode();
|
||||||
static void ShowLoginSuccess(const rc_client_t* client);
|
static void ShowLoginSuccess(const rc_client_t* client);
|
||||||
static void ShowLoginNotification();
|
static void ShowLoginNotification();
|
||||||
static void IdentifyGame(const std::string& path, CDImage* image);
|
static void IdentifyGame(const std::string& path, CDImage* image);
|
||||||
|
@ -497,7 +498,7 @@ void Achievements::UpdateSettings(const Settings& old_config)
|
||||||
// Hardcore mode can only be enabled through reset (ResetChallengeMode()).
|
// Hardcore mode can only be enabled through reset (ResetChallengeMode()).
|
||||||
if (s_hardcore_mode && !g_settings.achievements_hardcore_mode)
|
if (s_hardcore_mode && !g_settings.achievements_hardcore_mode)
|
||||||
{
|
{
|
||||||
ResetHardcoreMode();
|
ResetHardcoreMode(false);
|
||||||
}
|
}
|
||||||
else if (!s_hardcore_mode && g_settings.achievements_hardcore_mode)
|
else if (!s_hardcore_mode && g_settings.achievements_hardcore_mode)
|
||||||
{
|
{
|
||||||
|
@ -927,13 +928,21 @@ void Achievements::ClientLoadGameCallback(int result, const char* error_message,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const bool has_achievements = rc_client_has_achievements(client);
|
||||||
|
const bool has_leaderboards = rc_client_has_leaderboards(client);
|
||||||
|
|
||||||
|
// If the game has a RetroAchievements entry but no achievements or leaderboards,
|
||||||
|
// enforcing hardcore mode is pointless.
|
||||||
|
if (!has_achievements && !has_leaderboards)
|
||||||
|
DisableHardcoreMode();
|
||||||
|
|
||||||
// We should have matched hardcore mode state.
|
// We should have matched hardcore mode state.
|
||||||
Assert(s_hardcore_mode == (rc_client_get_hardcore_enabled(client) != 0));
|
Assert(s_hardcore_mode == (rc_client_get_hardcore_enabled(client) != 0));
|
||||||
|
|
||||||
s_game_id = info->id;
|
s_game_id = info->id;
|
||||||
s_game_title = info->title;
|
s_game_title = info->title;
|
||||||
s_has_achievements = rc_client_has_achievements(client);
|
s_has_achievements = has_achievements;
|
||||||
s_has_leaderboards = rc_client_has_leaderboards(client);
|
s_has_leaderboards = has_leaderboards;
|
||||||
s_has_rich_presence = rc_client_has_rich_presence(client);
|
s_has_rich_presence = rc_client_has_rich_presence(client);
|
||||||
s_game_icon = {};
|
s_game_icon = {};
|
||||||
|
|
||||||
|
@ -1373,7 +1382,7 @@ void Achievements::DisableHardcoreMode()
|
||||||
SetHardcoreMode(false, true);
|
SetHardcoreMode(false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Achievements::ResetHardcoreMode()
|
bool Achievements::ResetHardcoreMode(bool is_booting)
|
||||||
{
|
{
|
||||||
if (!IsActive())
|
if (!IsActive())
|
||||||
return false;
|
return false;
|
||||||
|
@ -1387,6 +1396,9 @@ bool Achievements::ResetHardcoreMode()
|
||||||
if (s_hardcore_mode == wanted_hardcore_mode)
|
if (s_hardcore_mode == wanted_hardcore_mode)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (!is_booting && wanted_hardcore_mode && !CanEnableHardcoreMode())
|
||||||
|
return false;
|
||||||
|
|
||||||
SetHardcoreMode(wanted_hardcore_mode, false);
|
SetHardcoreMode(wanted_hardcore_mode, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1597,6 +1609,11 @@ bool Achievements::IsLoggedInOrLoggingIn()
|
||||||
return (rc_client_get_user_info(s_client) != nullptr || s_login_request);
|
return (rc_client_get_user_info(s_client) != nullptr || s_login_request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Achievements::CanEnableHardcoreMode()
|
||||||
|
{
|
||||||
|
return (s_load_game_request || s_has_achievements || s_has_leaderboards);
|
||||||
|
}
|
||||||
|
|
||||||
bool Achievements::Login(const char* username, const char* password, Error* error)
|
bool Achievements::Login(const char* username, const char* password, Error* error)
|
||||||
{
|
{
|
||||||
auto lock = GetLock();
|
auto lock = GetLock();
|
||||||
|
|
|
@ -75,7 +75,7 @@ void Logout();
|
||||||
void GameChanged(const std::string& path, CDImage* image);
|
void GameChanged(const std::string& path, CDImage* image);
|
||||||
|
|
||||||
/// Re-enables hardcore mode if it is enabled in the settings.
|
/// Re-enables hardcore mode if it is enabled in the settings.
|
||||||
bool ResetHardcoreMode();
|
bool ResetHardcoreMode(bool is_booting);
|
||||||
|
|
||||||
/// Forces hardcore mode off until next reset.
|
/// Forces hardcore mode off until next reset.
|
||||||
void DisableHardcoreMode();
|
void DisableHardcoreMode();
|
||||||
|
|
|
@ -1115,7 +1115,7 @@ void System::ResetSystem()
|
||||||
if (!Achievements::ConfirmSystemReset())
|
if (!Achievements::ConfirmSystemReset())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (Achievements::ResetHardcoreMode())
|
if (Achievements::ResetHardcoreMode(false))
|
||||||
{
|
{
|
||||||
// Make sure a pre-existing cheat file hasn't been loaded when resetting
|
// Make sure a pre-existing cheat file hasn't been loaded when resetting
|
||||||
// after enabling HC mode.
|
// after enabling HC mode.
|
||||||
|
@ -3502,7 +3502,7 @@ void System::UpdateRunningGame(const char* path, CDImage* image, bool booting)
|
||||||
g_texture_replacements.SetGameID(s_running_game_serial);
|
g_texture_replacements.SetGameID(s_running_game_serial);
|
||||||
|
|
||||||
if (booting)
|
if (booting)
|
||||||
Achievements::ResetHardcoreMode();
|
Achievements::ResetHardcoreMode(true);
|
||||||
|
|
||||||
Achievements::GameChanged(s_running_game_path, image);
|
Achievements::GameChanged(s_running_game_path, image);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue