diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 2d121e2456..a6b6c8207a 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -51,6 +51,7 @@ #include "UI/OnScreenDisplay.h" #include "UI/GameInfoCache.h" #include "UI/DisplayLayoutScreen.h" +#include "UI/RetroAchievements.h" #include "UI/RetroAchievementScreens.h" static void AfterSaveStateAction(SaveState::Status status, const std::string &message, void *) { @@ -346,7 +347,7 @@ void GamePauseScreen::CreateViews() { return UI::EVENT_DONE; }); } - if (g_Config.bAchievementsEnable) { + if (g_Config.bAchievementsEnable && Achievements::IsActive()) { rightColumnItems->Add(new Choice(pa->T("Achievements")))->OnClick.Add([&](UI::EventParams &e) { screenManager()->push(new RetroAchievementsListScreen(gamePath_)); return UI::EVENT_DONE; diff --git a/UI/RetroAchievementScreens.cpp b/UI/RetroAchievementScreens.cpp index 532608b6fe..887c8a4a70 100644 --- a/UI/RetroAchievementScreens.cpp +++ b/UI/RetroAchievementScreens.cpp @@ -7,6 +7,23 @@ void RetroAchievementsListScreen::CreateViews() { auto di = GetI18NCategory(I18NCat::DIALOG); + using namespace UI; + + root_ = new ScrollView(UI::ORIENT_VERTICAL); + + LinearLayout *listLayout = root_->Add(new LinearLayout(UI::ORIENT_VERTICAL)); + + std::vector achievements; + + Achievements::EnumerateAchievements([&](const Achievements::Achievement &achievement) { + achievements.push_back(achievement); + return true; + }); + + for (auto achievement : achievements) { + listLayout->Add(new TextView(achievement.title)); + listLayout->Add(new TextView(achievement.description)); + } } void RetroAchievementsSettingsScreen::CreateTabs() { diff --git a/UI/RetroAchievements.cpp b/UI/RetroAchievements.cpp index 5d07cee261..749b822e71 100644 --- a/UI/RetroAchievements.cpp +++ b/UI/RetroAchievements.cpp @@ -2083,6 +2083,9 @@ void Achievements::CheevosEventHandler(const rc_runtime_event_t *runtime_event) } unsigned Achievements::PeekMemory(unsigned address, unsigned num_bytes, void *ud) { + // Unclear why achievements are defined with this offset, but they are and it can't be changed now, so we roll with it. + address += 0x08000000; + switch (num_bytes) { case 1: return Memory::Read_U8(address); case 2: return Memory::Read_U16(address);