Skip to content

Commit

Permalink
Achievements: Add leaderboard toggle (+ some minor fixes)
Browse files Browse the repository at this point in the history
  • Loading branch information
stenzek committed Sep 21, 2022
1 parent 3760849 commit d26fef3
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 26 deletions.
2 changes: 2 additions & 0 deletions src/core/settings.cpp
Expand Up @@ -344,6 +344,7 @@ void Settings::Load(SettingsInterface& si)
achievements_use_first_disc_from_playlist = si.GetBoolValue("Cheevos", "UseFirstDiscFromPlaylist", true);
achievements_rich_presence = si.GetBoolValue("Cheevos", "RichPresence", true);
achievements_challenge_mode = si.GetBoolValue("Cheevos", "ChallengeMode", false);
achievements_leaderboards = si.GetBoolValue("Cheevos", "Leaderboards", true);
achievements_sound_effects = si.GetBoolValue("Cheevos", "SoundEffects", true);

log_level = ParseLogLevelName(si.GetStringValue("Logging", "LogLevel", GetLogLevelName(DEFAULT_LOG_LEVEL)).c_str())
Expand Down Expand Up @@ -529,6 +530,7 @@ void Settings::Save(SettingsInterface& si) const
si.SetBoolValue("Cheevos", "UseFirstDiscFromPlaylist", achievements_use_first_disc_from_playlist);
si.SetBoolValue("Cheevos", "RichPresence", achievements_rich_presence);
si.SetBoolValue("Cheevos", "ChallengeMode", achievements_challenge_mode);
si.SetBoolValue("Cheevos", "Leaderboards", achievements_leaderboards);
si.SetBoolValue("Cheevos", "SoundEffects", achievements_sound_effects);

si.SetStringValue("Logging", "LogLevel", GetLogLevelName(log_level));
Expand Down
1 change: 1 addition & 0 deletions src/core/settings.h
Expand Up @@ -173,6 +173,7 @@ struct Settings
bool achievements_use_first_disc_from_playlist : 1;
bool achievements_rich_presence : 1;
bool achievements_challenge_mode : 1;
bool achievements_leaderboards : 1;
bool achievements_sound_effects : 1;
#endif

Expand Down
39 changes: 38 additions & 1 deletion src/duckstation-qt/achievementsettingswidget.cpp
Expand Up @@ -24,6 +24,7 @@ AchievementSettingsWidget::AchievementSettingsWidget(SettingsDialog* dialog, QWi
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.unofficialTestMode, "Cheevos", "UnofficialTestMode", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.useFirstDiscFromPlaylist, "Cheevos",
"UseFirstDiscFromPlaylist", true);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.leaderboards, "Cheevos", "Leaderboards", true);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.soundEffects, "Cheevos", "SoundEffects", true);

dialog->registerWidgetHelp(m_ui.enable, tr("Enable Achievements"), tr("Unchecked"),
Expand All @@ -46,10 +47,16 @@ AchievementSettingsWidget::AchievementSettingsWidget(SettingsDialog* dialog, QWi
tr("\"Challenge\" mode for achievements. Disables save state, cheats, and slowdown "
"functions, but you receive double the achievement points."));
dialog->registerWidgetHelp(
m_ui.challengeMode, tr("Enable Sound Effects"), tr("Checked"),
m_ui.soundEffects, tr("Enable Sound Effects"), tr("Checked"),
tr("Plays sound effects for events such as achievement unlocks and leaderboard submissions."));
dialog->registerWidgetHelp(
m_ui.leaderboards, tr("Enable Leaderboards"), tr("Checked"),
tr("Enables tracking and submission of leaderboards in supported games. If leaderboards "
"are disabled, you will still be able to view the leaderboard and scores, but no scores will be uploaded."));

connect(m_ui.enable, &QCheckBox::stateChanged, this, &AchievementSettingsWidget::updateEnableState);
connect(m_ui.challengeMode, &QCheckBox::stateChanged, this, &AchievementSettingsWidget::updateEnableState);
connect(m_ui.challengeMode, &QCheckBox::stateChanged, this, &AchievementSettingsWidget::onChallengeModeStateChanged);

if (!m_dialog->isPerGameSettings())
{
Expand Down Expand Up @@ -80,10 +87,40 @@ AchievementSettingsWidget::~AchievementSettingsWidget() = default;
void AchievementSettingsWidget::updateEnableState()
{
const bool enabled = m_dialog->getEffectiveBoolValue("Cheevos", "Enabled", false);
const bool challenge = m_dialog->getEffectiveBoolValue("Cheevos", "ChallengeMode", false);
m_ui.testMode->setEnabled(enabled);
m_ui.useFirstDiscFromPlaylist->setEnabled(enabled);
m_ui.richPresence->setEnabled(enabled);
m_ui.challengeMode->setEnabled(enabled);
m_ui.leaderboards->setEnabled(enabled && challenge);
m_ui.unofficialTestMode->setEnabled(enabled);
m_ui.soundEffects->setEnabled(enabled);
}

void AchievementSettingsWidget::onChallengeModeStateChanged()
{
if (!QtHost::IsSystemValid())
return;

const bool enabled = m_dialog->getEffectiveBoolValue("Cheevos", "Enabled", false);
const bool challenge = m_dialog->getEffectiveBoolValue("Cheevos", "ChallengeMode", false);
if (!enabled || !challenge)
return;

// don't bother prompting if the game doesn't have achievements
auto lock = Achievements::GetLock();
if (!Achievements::HasActiveGame())
return;

if (QMessageBox::question(
QtUtils::GetRootWidget(this), tr("Reset System"),
tr("Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?")) !=
QMessageBox::Yes)
{
return;
}

g_emu_thread->resetSystem();
}

void AchievementSettingsWidget::updateLoginState()
Expand Down
1 change: 1 addition & 0 deletions src/duckstation-qt/achievementsettingswidget.h
Expand Up @@ -14,6 +14,7 @@ class AchievementSettingsWidget : public QWidget

private Q_SLOTS:
void updateEnableState();
void onChallengeModeStateChanged();
void onLoginLogoutPressed();
void onViewProfilePressed();
void onAchievementsRefreshed(quint32 id, const QString& game_info_string, quint32 total, quint32 points);
Expand Down
37 changes: 22 additions & 15 deletions src/duckstation-qt/achievementsettingswidget.ui
Expand Up @@ -39,45 +39,52 @@
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="challengeMode">
<item row="2" column="1">
<widget class="QCheckBox" name="unofficialTestMode">
<property name="text">
<string>Enable Hardcore Mode</string>
<string>Test Unofficial Achievements</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="useFirstDiscFromPlaylist">
<item row="0" column="1">
<widget class="QCheckBox" name="richPresence">
<property name="text">
<string>Use First Disc From Playlist</string>
<string>Enable Rich Presence</string>
</property>
</widget>
</item>
<item row="1" column="0">
<item row="3" column="1">
<widget class="QCheckBox" name="testMode">
<property name="text">
<string>Enable Test Mode</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="unofficialTestMode">
<item row="1" column="0">
<widget class="QCheckBox" name="challengeMode">
<property name="text">
<string>Test Unofficial Achievements</string>
<string>Enable Hardcore Mode</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="richPresence">
<item row="2" column="0">
<widget class="QCheckBox" name="soundEffects">
<property name="text">
<string>Enable Rich Presence</string>
<string>Enable Sound Effects</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="soundEffects">
<widget class="QCheckBox" name="useFirstDiscFromPlaylist">
<property name="text">
<string>Enable Sound Effects</string>
<string>Use First Disc From Playlist</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="leaderboards">
<property name="text">
<string>Enable Leaderboards</string>
</property>
</widget>
</item>
Expand Down
26 changes: 16 additions & 10 deletions src/frontend-common/achievements.cpp
Expand Up @@ -404,6 +404,11 @@ bool Achievements::ChallengeModeActive()
return s_challenge_mode;
}

bool Achievements::LeaderboardsActive()
{
return ChallengeModeActive() && g_settings.achievements_leaderboards;
}

bool Achievements::IsTestModeActive()
{
return g_settings.achievements_test_mode;
Expand Down Expand Up @@ -485,11 +490,11 @@ void Achievements::UpdateSettings(const Settings& old_config)
if (g_settings.achievements_challenge_mode != old_config.achievements_challenge_mode)
{
// Hardcore mode can only be enabled through reset (ResetChallengeMode()).
if (s_challenge_mode && !old_config.achievements_challenge_mode)
if (s_challenge_mode && !g_settings.achievements_challenge_mode)
{
ResetChallengeMode();
}
else if (g_settings.achievements_challenge_mode)
else if (!s_challenge_mode && g_settings.achievements_challenge_mode)
{
Host::AddKeyedOSDMessage(
"challenge_mode_reset",
Expand Down Expand Up @@ -1013,14 +1018,8 @@ void Achievements::DisplayAchievementSummary()
if (GetLeaderboardCount() > 0)
{
summary.push_back('\n');
if (ChallengeModeActive())
{
summary.append(Host::TranslateString("Achievements", "Leaderboards are enabled."));
}
else
{
summary.append(Host::TranslateString("Achievements", "Leaderboards are disabled because hardcore mode is off."));
}
if (LeaderboardsActive())
summary.append("Leaderboard submission is enabled.");
}

Host::RunOnCPUThread([title = std::move(title), summary = std::move(summary), icon = s_game_icon]() {
Expand Down Expand Up @@ -1822,6 +1821,13 @@ void Achievements::SubmitLeaderboard(u32 leaderboard_id, int value)
return;
}

if (!LeaderboardsActive())
{
Log_WarningPrintf("Skipping sending leaderboard %u result to server because leaderboards are disabled.",
leaderboard_id);
return;
}

std::unique_lock lock(s_achievements_mutex);

s_submitting_lboard_id = leaderboard_id;
Expand Down
1 change: 1 addition & 0 deletions src/frontend-common/achievements.h
Expand Up @@ -72,6 +72,7 @@ static ALWAYS_INLINE bool IsUsingRAIntegration()
bool IsActive();
bool IsLoggedIn();
bool ChallengeModeActive();
bool LeaderboardsActive();
bool IsTestModeActive();
bool IsUnofficialTestModeActive();
bool IsRichPresenceEnabled();
Expand Down
3 changes: 3 additions & 0 deletions src/frontend-common/fullscreen_ui.cpp
Expand Up @@ -3572,6 +3572,9 @@ void FullscreenUI::DrawAchievementsSettingsPage()
DrawToggleSetting(bsi, ICON_FA_LIST_OL " Leaderboards",
"Enables tracking and submission of leaderboards in supported games.", "Cheevos", "Leaderboards",
true, enabled && challenge);
DrawToggleSetting(bsi, ICON_FA_HEADPHONES " Sound Effects",
"Plays sound effects for events such as achievement unlocks and leaderboard submissions.",
"Cheevos", "SoundEffects", true, enabled);
DrawToggleSetting(bsi, ICON_FA_MEDAL " Test Unofficial Achievements",
"When enabled, DuckStation will list achievements from unofficial sets. These achievements are not "
"tracked by RetroAchievements.",
Expand Down

0 comments on commit d26fef3

Please sign in to comment.