From bc4c908a184011c87f6e234608d44bfbeed10cba Mon Sep 17 00:00:00 2001 From: chaoticgd <43898262+chaoticgd@users.noreply.github.com> Date: Fri, 28 Nov 2025 15:36:21 +0000 Subject: [PATCH 1/2] Achievements: Display an error when trying to load a state in hardcore --- pcsx2-qt/MainWindow.cpp | 7 ++----- pcsx2/ImGui/FullscreenUI.cpp | 13 ++++++------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/pcsx2-qt/MainWindow.cpp b/pcsx2-qt/MainWindow.cpp index 1e6aaa188f..c2f4cb0d45 100644 --- a/pcsx2-qt/MainWindow.cpp +++ b/pcsx2-qt/MainWindow.cpp @@ -813,9 +813,6 @@ void MainWindow::onAchievementsHardcoreModeChanged(bool enabled) // disable debugger while hardcore mode is active m_ui.actionDebugger->setDisabled(enabled); - // refresh emulation actions to show/hide load state buttons based on hardcore mode - updateEmulationActions(s_vm_valid, s_vm_valid, false); - if (enabled) { // If PauseOnEntry is enabled, we prompt the user to disable Hardcore Mode @@ -911,7 +908,7 @@ void MainWindow::updateEmulationActions(bool starting, bool running, bool stoppi m_ui.actionPause->setEnabled(running); m_ui.actionScreenshot->setEnabled(running); m_ui.menuChangeDisc->setEnabled(running); - m_ui.menuLoadState->setEnabled(running && !Achievements::IsHardcoreModeActive()); + m_ui.menuLoadState->setEnabled(running); m_ui.menuSaveState->setEnabled(running); m_ui.actionSaveGSDump->setEnabled(running); @@ -920,7 +917,7 @@ void MainWindow::updateEmulationActions(bool starting, bool running, bool stoppi m_ui.actionToolbarPause->setEnabled(running); m_ui.actionToolbarScreenshot->setEnabled(running); m_ui.actionToolbarChangeDisc->setEnabled(running); - m_ui.actionToolbarLoadState->setEnabled(running && !Achievements::IsHardcoreModeActive()); + m_ui.actionToolbarLoadState->setEnabled(running); m_ui.actionToolbarSaveState->setEnabled(running); m_ui.actionViewGameProperties->setEnabled(running); diff --git a/pcsx2/ImGui/FullscreenUI.cpp b/pcsx2/ImGui/FullscreenUI.cpp index 55e8333ebd..69c1deca63 100644 --- a/pcsx2/ImGui/FullscreenUI.cpp +++ b/pcsx2/ImGui/FullscreenUI.cpp @@ -6948,8 +6948,7 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) case PauseSubMenu::None: { // NOTE: Menu close must come first, because otherwise VM destruction options will race. - const bool can_load_state = s_current_disc_crc != 0 && !Achievements::IsHardcoreModeActive(); - const bool can_save_state = s_current_disc_crc != 0; + const bool can_load_or_save_state = s_current_disc_crc != 0; if (just_focused) ImGui::SetFocusID(ImGui::GetID(FSUI_ICONSTR(ICON_FA_PLAY, "Resume Game")), ImGui::GetCurrentWindow()); @@ -6963,19 +6962,19 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) DoToggleFrameLimit(); } - if (ActiveButton(FSUI_ICONSTR(ICON_FA_ARROW_ROTATE_LEFT, "Load State"), false, can_load_state)) + if (ActiveButton(FSUI_ICONSTR(ICON_FA_ARROW_ROTATE_LEFT, "Load State"), false, can_load_or_save_state)) { if (OpenSaveStateSelector(true)) s_current_main_window = MainWindowType::None; } - if (ActiveButton(FSUI_ICONSTR(ICON_FA_DOWNLOAD, "Save State"), false, can_save_state)) + if (ActiveButton(FSUI_ICONSTR(ICON_FA_DOWNLOAD, "Save State"), false, can_load_or_save_state)) { if (OpenSaveStateSelector(false)) s_current_main_window = MainWindowType::None; } - if (ActiveButton(FSUI_ICONSTR(ICON_FA_WRENCH, "Game Properties"), false, can_save_state)) + if (ActiveButton(FSUI_ICONSTR(ICON_FA_WRENCH, "Game Properties"), false, can_load_or_save_state)) { SwitchToGameSettings(); } @@ -7015,7 +7014,7 @@ void FullscreenUI::DrawPauseMenu(MainWindowType type) if (ActiveButton(FSUI_ICONSTR(ICON_FA_POWER_OFF, "Close Game"), false)) { // skip submenu when we can't save anyway - if (!can_save_state) + if (!can_load_or_save_state) RequestShutdown(false); else OpenPauseSubMenu(PauseSubMenu::Exit); @@ -7340,7 +7339,7 @@ void FullscreenUI::DrawSaveStateSelector(bool is_loading) if (ActiveButton( is_loading ? FSUI_ICONSTR(ICON_FA_FOLDER_OPEN, "Load State") : FSUI_ICONSTR(ICON_FA_FOLDER_OPEN, "Save State"), - false, is_loading ? !Achievements::IsHardcoreModeActive() : true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) + false, true, LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY)) { if (is_loading) DoLoadState(std::move(entry.path)); From 833447cdcff61509c6e6cb77da2adfe7d88145c6 Mon Sep 17 00:00:00 2001 From: chaoticgd <43898262+chaoticgd@users.noreply.github.com> Date: Fri, 28 Nov 2025 15:24:02 +0000 Subject: [PATCH 2/2] Achievements: Enable hardcore mode by default --- pcsx2-qt/Settings/AchievementSettingsWidget.cpp | 8 ++++---- pcsx2/ImGui/FullscreenUI.cpp | 6 +++--- pcsx2/Pcsx2Config.cpp | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pcsx2-qt/Settings/AchievementSettingsWidget.cpp b/pcsx2-qt/Settings/AchievementSettingsWidget.cpp index 3d5afc8539..6a844cdefd 100644 --- a/pcsx2-qt/Settings/AchievementSettingsWidget.cpp +++ b/pcsx2-qt/Settings/AchievementSettingsWidget.cpp @@ -27,7 +27,7 @@ AchievementSettingsWidget::AchievementSettingsWidget(SettingsWindow* settings_di setupTab(m_ui); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.enable, "Achievements", "Enabled", false); - SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.hardcoreMode, "Achievements", "ChallengeMode", false); + SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.hardcoreMode, "Achievements", "ChallengeMode", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.achievementNotifications, "Achievements", "Notifications", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.leaderboardNotifications, "Achievements", "LeaderboardNotifications", true); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.soundEffects, "Achievements", "SoundEffects", true); @@ -49,7 +49,7 @@ AchievementSettingsWidget::AchievementSettingsWidget(SettingsWindow* settings_di SettingWidgetBinder::BindWidgetToFileSetting(sif, m_ui.lbSoundPath, m_ui.lbSoundBrowse, m_ui.lbSoundOpen, m_ui.lbSoundReset, "Achievements", "LBSubmitSoundName", Path::Combine(EmuFolders::Resources, EmuConfig.Achievements.DEFAULT_LBSUBMIT_SOUND_NAME), AUDIO_FILE_FILTER, true, false); dialog()->registerWidgetHelp(m_ui.enable, tr("Enable Achievements"), tr("Unchecked"), tr("When enabled and logged in, PCSX2 will scan for achievements on startup.")); - dialog()->registerWidgetHelp(m_ui.hardcoreMode, tr("Enable Hardcore Mode"), tr("Unchecked"), tr("\"Challenge\" mode for achievements, including leaderboard tracking. Disables save state, cheats, and slowdown functions.")); + dialog()->registerWidgetHelp(m_ui.hardcoreMode, tr("Enable Hardcore Mode"), tr("Checked"), tr("\"Challenge\" mode for achievements, including leaderboard tracking. Disables save state, cheats, and slowdown functions.")); dialog()->registerWidgetHelp(m_ui.achievementNotifications, tr("Show Achievement Notifications"), tr("Checked"), tr("Displays popup messages on events such as achievement unlocks and game completion.")); dialog()->registerWidgetHelp(m_ui.leaderboardNotifications, tr("Show Leaderboard Notifications"), tr("Checked"), tr("Displays popup messages when starting, submitting, or failing a leaderboard challenge.")); dialog()->registerWidgetHelp(m_ui.soundEffects, tr("Enable Sound Effects"), tr("Checked"), tr("Plays sound effects for events such as achievement unlocks and leaderboard submissions.")); @@ -169,7 +169,7 @@ void AchievementSettingsWidget::onHardcoreModeStateChanged() return; const bool enabled = dialog()->getEffectiveBoolValue("Achievements", "Enabled", false); - const bool challenge = dialog()->getEffectiveBoolValue("Achievements", "ChallengeMode", false); + const bool challenge = dialog()->getEffectiveBoolValue("Achievements", "ChallengeMode", true); if (!enabled || !challenge) return; @@ -250,7 +250,7 @@ void AchievementSettingsWidget::onLoginLogoutPressed() m_ui.enable->setChecked(true); updateEnableState(); } - if (!m_ui.hardcoreMode->isChecked() && Host::GetBaseBoolSettingValue("Achievements", "ChallengeMode", false)) + if (!m_ui.hardcoreMode->isChecked() && Host::GetBaseBoolSettingValue("Achievements", "ChallengeMode", true)) { QSignalBlocker sb(m_ui.hardcoreMode); m_ui.hardcoreMode->setChecked(true); diff --git a/pcsx2/ImGui/FullscreenUI.cpp b/pcsx2/ImGui/FullscreenUI.cpp index 69c1deca63..068a8958ba 100644 --- a/pcsx2/ImGui/FullscreenUI.cpp +++ b/pcsx2/ImGui/FullscreenUI.cpp @@ -8816,7 +8816,7 @@ void FullscreenUI::DrawAchievementsLoginWindow() }); } - if (!Host::GetBaseBoolSettingValue("Achievements", "ChallengeMode", false)) + if (!Host::GetBaseBoolSettingValue("Achievements", "ChallengeMode", true)) { OpenConfirmMessageDialog(FSUI_STR("Enable Hardcore Mode"), FSUI_STR("Hardcore mode is not currently enabled. Enabling hardcore mode allows you to set times, scores, and " @@ -8988,7 +8988,7 @@ void FullscreenUI::DrawAchievementsSettingsPage(std::unique_lock& se check_challenge_state |= DrawToggleSetting(bsi, FSUI_ICONSTR(ICON_PF_DUMBELL, "Hardcore Mode"), FSUI_CSTR( "\"Challenge\" mode for achievements, including leaderboard tracking. Disables save state, cheats, and slowdown functions."), - "Achievements", "ChallengeMode", false, enabled); + "Achievements", "ChallengeMode", true, enabled); DrawToggleSetting(bsi, FSUI_ICONSTR(ICON_FA_BELL, "Achievement Notifications"), FSUI_CSTR("Displays popup messages on events such as achievement unlocks and leaderboard submissions."), "Achievements", "Notifications", true, enabled); @@ -9044,7 +9044,7 @@ void FullscreenUI::DrawAchievementsSettingsPage(std::unique_lock& se "Achievements", "UnofficialTestMode", false, enabled); // Check for challenge mode just being enabled. - if (check_challenge_state && enabled && bsi->GetBoolValue("Achievements", "ChallengeMode", false) && VMManager::HasValidVM()) + if (check_challenge_state && enabled && bsi->GetBoolValue("Achievements", "ChallengeMode", true) && VMManager::HasValidVM()) { // don't bother prompting if the game doesn't have achievements auto lock = Achievements::GetLock(); diff --git a/pcsx2/Pcsx2Config.cpp b/pcsx2/Pcsx2Config.cpp index 51ec1f788d..be99e27c55 100644 --- a/pcsx2/Pcsx2Config.cpp +++ b/pcsx2/Pcsx2Config.cpp @@ -1848,7 +1848,7 @@ Pcsx2Config::AchievementsOptions::AchievementsOptions() { bitset = 0; Enabled = false; - HardcoreMode = false; + HardcoreMode = true; EncoreMode = false; SpectatorMode = false; UnofficialTestMode = false;