diff --git a/.gitmodules b/.gitmodules
index a3c92a9929..2ca84d342b 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -44,3 +44,6 @@
[submodule "cpu_features"]
path = ext/cpu_features
url = https://github.com/google/cpu_features.git
+[submodule "ext/rcheevos"]
+ path = ext/rcheevos
+ url = https://github.com/RetroAchievements/rcheevos.git
diff --git a/Core/Config.cpp b/Core/Config.cpp
index 95e396f582..905c3e3b48 100644
--- a/Core/Config.cpp
+++ b/Core/Config.cpp
@@ -178,6 +178,7 @@ static const ConfigSetting generalSettings[] = {
ConfigSetting("CwCheatRefreshRate", &g_Config.iCwCheatRefreshRate, 77, CfgFlag::PER_GAME),
ConfigSetting("CwCheatScrollPosition", &g_Config.fCwCheatScrollPosition, 0.0f, CfgFlag::PER_GAME),
ConfigSetting("GameListScrollPosition", &g_Config.fGameListScrollPosition, 0.0f, CfgFlag::DEFAULT),
+ ConfigSetting("EnableRetroAchievements", &g_Config.bEnableRetroAchievements, false, CfgFlag::PER_GAME),
ConfigSetting("ScreenshotsAsPNG", &g_Config.bScreenshotsAsPNG, false, CfgFlag::PER_GAME),
ConfigSetting("UseFFV1", &g_Config.bUseFFV1, false, CfgFlag::DEFAULT),
diff --git a/Core/Config.h b/Core/Config.h
index 209402ac63..2c996dcf88 100644
--- a/Core/Config.h
+++ b/Core/Config.h
@@ -216,6 +216,7 @@ public:
int iAutoLoadSaveState; // 0 = off, 1 = oldest, 2 = newest, >2 = slot number + 3
bool bEnableCheats;
bool bReloadCheats;
+ bool bEnableRetroAchievements;
int iCwCheatRefreshRate;
float fCwCheatScrollPosition;
float fGameListScrollPosition;
diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp
index c96942dc3a..c06d5dd6a3 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/RetroAchievementScreens.h"
static void AfterSaveStateAction(SaveState::Status status, const std::string &message, void *) {
if (!message.empty() && (!g_Config.bDumpFrames || !g_Config.bDumpVideoOutput)) {
@@ -340,7 +341,16 @@ void GamePauseScreen::CreateViews() {
return UI::EVENT_DONE;
});
if (g_Config.bEnableCheats) {
- rightColumnItems->Add(new Choice(pa->T("Cheats")))->OnClick.Handle(this, &GamePauseScreen::OnCwCheat);
+ rightColumnItems->Add(new Choice(pa->T("Cheats")))->OnClick.Add([&](UI::EventParams &e) {
+ screenManager()->push(new CwCheatScreen(gamePath_));
+ return UI::EVENT_DONE;
+ });
+ }
+ if (g_Config.bEnableRetroAchievements) {
+ rightColumnItems->Add(new Choice(pa->T("Achievements")))->OnClick.Add([&](UI::EventParams &e) {
+ screenManager()->push(new RetroAchievementsListScreen(gamePath_));
+ return UI::EVENT_DONE;
+ });
}
// TODO, also might be nice to show overall compat rating here?
@@ -426,11 +436,6 @@ UI::EventReturn GamePauseScreen::OnLastSaveUndo(UI::EventParams &e) {
return UI::EVENT_DONE;
}
-UI::EventReturn GamePauseScreen::OnCwCheat(UI::EventParams &e) {
- screenManager()->push(new CwCheatScreen(gamePath_));
- return UI::EVENT_DONE;
-}
-
UI::EventReturn GamePauseScreen::OnSwitchUMD(UI::EventParams &e) {
screenManager()->push(new UmdReplaceScreen());
return UI::EVENT_DONE;
diff --git a/UI/PauseScreen.h b/UI/PauseScreen.h
index f9f0a949ab..ed0dfced8d 100644
--- a/UI/PauseScreen.h
+++ b/UI/PauseScreen.h
@@ -54,7 +54,6 @@ private:
UI::EventReturn OnLastSaveUndo(UI::EventParams &e);
UI::EventReturn OnScreenshotClicked(UI::EventParams &e);
- UI::EventReturn OnCwCheat(UI::EventParams &e);
UI::EventReturn OnCreateConfig(UI::EventParams &e);
UI::EventReturn OnDeleteConfig(UI::EventParams &e);
diff --git a/UI/RetroAchievementScreens.cpp b/UI/RetroAchievementScreens.cpp
new file mode 100644
index 0000000000..dfc532fb1c
--- /dev/null
+++ b/UI/RetroAchievementScreens.cpp
@@ -0,0 +1,7 @@
+#include "UI/RetroAchievementScreens.h"
+#include "RetroAchievements.h"
+
+void RetroAchievementsListScreen::CreateViews() {
+ auto di = GetI18NCategory(I18NCat::DIALOG);
+
+}
diff --git a/UI/RetroAchievementScreens.h b/UI/RetroAchievementScreens.h
new file mode 100644
index 0000000000..b269de8ef0
--- /dev/null
+++ b/UI/RetroAchievementScreens.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "Common/UI/UIScreen.h"
+#include "Common/UI/ViewGroup.h"
+#include "UI/MiscScreens.h"
+#include "Common/File/Path.h"
+
+class RetroAchievementsListScreen : public UIDialogScreenWithGameBackground {
+public:
+ RetroAchievementsListScreen(const Path &gamePath) : UIDialogScreenWithGameBackground(gamePath) {}
+ const char *tag() const override { return "RetroAchievementsListScreen"; }
+
+ void CreateViews() override;
+};
diff --git a/UI/RetroAchievements.cpp b/UI/RetroAchievements.cpp
new file mode 100644
index 0000000000..89791a097f
--- /dev/null
+++ b/UI/RetroAchievements.cpp
@@ -0,0 +1,13 @@
+#include "ext/rcheevos/include/rcheevos.h"
+
+#include "UI/RetroAchievements.h"
+
+RetroAchievements g_retroAchievements;
+
+void RetroAchievements::Init() {
+
+}
+
+void RetroAchievements::Shutdown() {
+
+}
diff --git a/UI/RetroAchievements.h b/UI/RetroAchievements.h
new file mode 100644
index 0000000000..6db4649f69
--- /dev/null
+++ b/UI/RetroAchievements.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "ext/rcheevos/include/rcheevos.h"
+
+class RetroAchievements {
+public:
+ void Init();
+ void Shutdown();
+};
+
+extern RetroAchievements g_retroAchievements;
+
+// TODO: Move the screens out into their own files.
diff --git a/UI/UI.vcxproj b/UI/UI.vcxproj
index ccf71e8f91..d28c28f8d3 100644
--- a/UI/UI.vcxproj
+++ b/UI/UI.vcxproj
@@ -59,6 +59,8 @@
+
+
@@ -94,6 +96,8 @@
+
+
diff --git a/UI/UI.vcxproj.filters b/UI/UI.vcxproj.filters
index 049f31c217..767dc2b4e0 100644
--- a/UI/UI.vcxproj.filters
+++ b/UI/UI.vcxproj.filters
@@ -86,6 +86,10 @@
Screens
+
+
+ Screens
+
@@ -172,6 +176,10 @@
Screens
+
+
+ Screens
+
@@ -181,4 +189,4 @@
{071baa63-c681-4ad6-945b-e126645d1b55}
-
\ No newline at end of file
+
diff --git a/UWP/PPSSPP_UWP.sln b/UWP/PPSSPP_UWP.sln
index e54559c70a..c2874228d1 100644
--- a/UWP/PPSSPP_UWP.sln
+++ b/UWP/PPSSPP_UWP.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.28803.202
+# Visual Studio Version 17
+VisualStudioVersion = 17.6.33801.468
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PPSSPP_UWP", "UWP.vcxproj", "{01D7D581-09A3-4A26-94BD-A7C529B29329}"
ProjectSection(ProjectDependencies) = postProject
@@ -34,6 +34,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniupnpc_UWP", "miniupnpc_
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpu_features_UWP", "cpu_features_UWP\cpu_features_UWP.vcxproj", "{C249F016-7F82-45CF-BB6E-0642A988C4D3}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rcheevos_UWP", "rcheevos_UWP\rcheevos_UWP.vcxproj", "{4C9D52D0-310A-4347-8991-E3788CB22169}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM = Debug|ARM
@@ -50,6 +52,42 @@ Global
UWP Gold|x64 = UWP Gold|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM.ActiveCfg = Debug|ARM
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM.Build.0 = Debug|ARM
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM.Deploy.0 = Debug|ARM
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM64.Build.0 = Debug|ARM64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|Win32.ActiveCfg = Debug|Win32
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|Win32.Build.0 = Debug|Win32
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|Win32.Deploy.0 = Debug|Win32
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|x64.ActiveCfg = Debug|x64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|x64.Build.0 = Debug|x64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|x64.Deploy.0 = Debug|x64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM.ActiveCfg = Release|ARM
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM.Build.0 = Release|ARM
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM.Deploy.0 = Release|ARM
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM64.ActiveCfg = Release|ARM64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM64.Build.0 = Release|ARM64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM64.Deploy.0 = Release|ARM64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|Win32.ActiveCfg = Release|Win32
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|Win32.Build.0 = Release|Win32
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|Win32.Deploy.0 = Release|Win32
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|x64.ActiveCfg = Release|x64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|x64.Build.0 = Release|x64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|x64.Deploy.0 = Release|x64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM.ActiveCfg = UWP Gold|ARM
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM.Build.0 = UWP Gold|ARM
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM.Deploy.0 = UWP Gold|ARM
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM64.ActiveCfg = UWP Gold|ARM64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM64.Build.0 = UWP Gold|ARM64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM64.Deploy.0 = UWP Gold|ARM64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|Win32.ActiveCfg = UWP Gold|Win32
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|Win32.Build.0 = UWP Gold|Win32
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|Win32.Deploy.0 = UWP Gold|Win32
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|x64.ActiveCfg = UWP Gold|x64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|x64.Build.0 = UWP Gold|x64
+ {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|x64.Deploy.0 = UWP Gold|x64
{ACB316CA-3ECB-48E5-BE0A-91E72D5B0F12}.Debug|ARM.ActiveCfg = Debug|ARM
{ACB316CA-3ECB-48E5-BE0A-91E72D5B0F12}.Debug|ARM.Build.0 = Debug|ARM
{ACB316CA-3ECB-48E5-BE0A-91E72D5B0F12}.Debug|ARM64.ActiveCfg = Debug|ARM64
@@ -122,30 +160,6 @@ Global
{5D271429-C288-4534-98AF-94475D940058}.UWP Gold|Win32.Build.0 = UWP Gold|Win32
{5D271429-C288-4534-98AF-94475D940058}.UWP Gold|x64.ActiveCfg = UWP Gold|x64
{5D271429-C288-4534-98AF-94475D940058}.UWP Gold|x64.Build.0 = UWP Gold|x64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Debug|ARM.ActiveCfg = Debug|ARM
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Debug|ARM.Build.0 = Debug|ARM
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Debug|ARM64.Build.0 = Debug|ARM64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Debug|Win32.ActiveCfg = Debug|Win32
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Debug|Win32.Build.0 = Debug|Win32
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Debug|x64.ActiveCfg = Debug|x64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Debug|x64.Build.0 = Debug|x64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Release|ARM.ActiveCfg = Release|ARM
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Release|ARM.Build.0 = Release|ARM
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Release|ARM64.ActiveCfg = Release|ARM64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Release|ARM64.Build.0 = Release|ARM64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Release|Win32.ActiveCfg = Release|Win32
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Release|Win32.Build.0 = Release|Win32
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Release|x64.ActiveCfg = Release|x64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.Release|x64.Build.0 = Release|x64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.UWP Gold|ARM.ActiveCfg = UWP Gold|ARM
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.UWP Gold|ARM.Build.0 = UWP Gold|ARM
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.UWP Gold|ARM64.ActiveCfg = UWP Gold|ARM64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.UWP Gold|ARM64.Build.0 = UWP Gold|ARM64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.UWP Gold|Win32.ActiveCfg = UWP Gold|Win32
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.UWP Gold|Win32.Build.0 = UWP Gold|Win32
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.UWP Gold|x64.ActiveCfg = UWP Gold|x64
- {935028AF-B850-4AD7-A00E-7BA84FB97D05}.UWP Gold|x64.Build.0 = UWP Gold|x64
{5FAC15BD-7397-4512-99D5-66CDC03AF5B7}.Debug|ARM.ActiveCfg = Debug|ARM
{5FAC15BD-7397-4512-99D5-66CDC03AF5B7}.Debug|ARM.Build.0 = Debug|ARM
{5FAC15BD-7397-4512-99D5-66CDC03AF5B7}.Debug|ARM64.ActiveCfg = Debug|ARM64
@@ -218,42 +232,6 @@ Global
{DDF90203-0AAE-4F38-B589-2E9637658CE6}.UWP Gold|Win32.Build.0 = UWP Gold|Win32
{DDF90203-0AAE-4F38-B589-2E9637658CE6}.UWP Gold|x64.ActiveCfg = UWP Gold|x64
{DDF90203-0AAE-4F38-B589-2E9637658CE6}.UWP Gold|x64.Build.0 = UWP Gold|x64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM.ActiveCfg = Debug|ARM
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM.Build.0 = Debug|ARM
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM.Deploy.0 = Debug|ARM
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM64.Build.0 = Debug|ARM64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|ARM64.Deploy.0 = Debug|ARM64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|Win32.ActiveCfg = Debug|Win32
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|Win32.Build.0 = Debug|Win32
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|Win32.Deploy.0 = Debug|Win32
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|x64.ActiveCfg = Debug|x64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|x64.Build.0 = Debug|x64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Debug|x64.Deploy.0 = Debug|x64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM.ActiveCfg = Release|ARM
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM.Build.0 = Release|ARM
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM.Deploy.0 = Release|ARM
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM64.ActiveCfg = Release|ARM64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM64.Build.0 = Release|ARM64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|ARM64.Deploy.0 = Release|ARM64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|Win32.ActiveCfg = Release|Win32
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|Win32.Build.0 = Release|Win32
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|Win32.Deploy.0 = Release|Win32
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|x64.ActiveCfg = Release|x64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|x64.Build.0 = Release|x64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.Release|x64.Deploy.0 = Release|x64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM.ActiveCfg = UWP Gold|ARM
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM.Build.0 = UWP Gold|ARM
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM.Deploy.0 = UWP Gold|ARM
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM64.ActiveCfg = UWP Gold|ARM64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM64.Build.0 = UWP Gold|ARM64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|ARM64.Deploy.0 = UWP Gold|ARM64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|Win32.ActiveCfg = UWP Gold|Win32
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|Win32.Build.0 = UWP Gold|Win32
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|Win32.Deploy.0 = UWP Gold|Win32
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|x64.ActiveCfg = UWP Gold|x64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|x64.Build.0 = UWP Gold|x64
- {01D7D581-09A3-4A26-94BD-A7C529B29329}.UWP Gold|x64.Deploy.0 = UWP Gold|x64
{D326891E-ECE4-4B94-B5E7-8AA0A8E8ECBC}.Debug|ARM.ActiveCfg = Debug|ARM
{D326891E-ECE4-4B94-B5E7-8AA0A8E8ECBC}.Debug|ARM.Build.0 = Debug|ARM
{D326891E-ECE4-4B94-B5E7-8AA0A8E8ECBC}.Debug|ARM64.ActiveCfg = Debug|ARM64
@@ -398,6 +376,30 @@ Global
{C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|Win32.Build.0 = UWP Gold|Win32
{C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|x64.ActiveCfg = UWP Gold|x64
{C249F016-7F82-45CF-BB6E-0642A988C4D3}.UWP Gold|x64.Build.0 = UWP Gold|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Debug|ARM.ActiveCfg = Debug|ARM
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Debug|ARM.Build.0 = Debug|ARM
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Debug|ARM64.ActiveCfg = Debug|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Debug|ARM64.Build.0 = Debug|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Debug|Win32.Build.0 = Debug|Win32
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Debug|x64.ActiveCfg = Debug|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Debug|x64.Build.0 = Debug|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Release|ARM.ActiveCfg = Release|ARM
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Release|ARM.Build.0 = Release|ARM
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Release|ARM64.ActiveCfg = Release|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Release|ARM64.Build.0 = Release|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Release|Win32.ActiveCfg = Release|Win32
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Release|Win32.Build.0 = Release|Win32
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Release|x64.ActiveCfg = Release|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.Release|x64.Build.0 = Release|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.UWP Gold|ARM.ActiveCfg = Debug|ARM
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.UWP Gold|ARM.Build.0 = Debug|ARM
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.UWP Gold|ARM64.ActiveCfg = Debug|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.UWP Gold|ARM64.Build.0 = Debug|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.UWP Gold|Win32.ActiveCfg = Debug|Win32
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.UWP Gold|Win32.Build.0 = Debug|Win32
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.UWP Gold|x64.ActiveCfg = Debug|x64
+ {4C9D52D0-310A-4347-8991-E3788CB22169}.UWP Gold|x64.Build.0 = Debug|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/UWP/UI_UWP/UI_UWP.vcxproj b/UWP/UI_UWP/UI_UWP.vcxproj
index b911519463..bc5cca59bf 100644
--- a/UWP/UI_UWP/UI_UWP.vcxproj
+++ b/UWP/UI_UWP/UI_UWP.vcxproj
@@ -295,6 +295,8 @@
+
+
@@ -331,6 +333,8 @@
+
+
@@ -350,6 +354,14 @@
Create
+
+
+ {acb316ca-3ecb-48e5-be0a-91e72d5b0f12}
+
+
+ {4c9d52d0-310a-4347-8991-e3788cb22169}
+
+
diff --git a/UWP/UI_UWP/UI_UWP.vcxproj.filters b/UWP/UI_UWP/UI_UWP.vcxproj.filters
index d0d4d113f4..0914752d27 100644
--- a/UWP/UI_UWP/UI_UWP.vcxproj.filters
+++ b/UWP/UI_UWP/UI_UWP.vcxproj.filters
@@ -35,6 +35,8 @@
+
+
@@ -71,5 +73,7 @@
+
+
-
\ No newline at end of file
+
diff --git a/UWP/rcheevos_UWP/rcheevos_UWP.vcxproj b/UWP/rcheevos_UWP/rcheevos_UWP.vcxproj
new file mode 100644
index 0000000000..b6bd8f50c3
--- /dev/null
+++ b/UWP/rcheevos_UWP/rcheevos_UWP.vcxproj
@@ -0,0 +1,251 @@
+
+
+
+
+ Debug
+ ARM
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ ARM
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {4c9d52d0-310a-4347-8991-e3788cb22169}
+ StaticLibrary
+ rcheevos
+ en-US
+ 14.0
+ true
+ Windows Store
+ 10.0.19041.0
+ 10.0.17763.0
+ 10.0
+ rcheevos_UWP
+
+
+
+ StaticLibrary
+ true
+ v143
+
+
+ StaticLibrary
+ true
+ v143
+
+
+ StaticLibrary
+ true
+ v143
+
+
+ StaticLibrary
+ false
+ true
+ v143
+
+
+ StaticLibrary
+ false
+ true
+ v143
+
+
+ StaticLibrary
+ false
+ true
+ v143
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+
+ false
+ true
+ NotUsing
+ ../../ext/rcheevos/include;$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
+ RC_DISABLE_LUA;_UNICODE;UNICODE;%(PreprocessorDefinitions)
+
+
+ Console
+ false
+ false
+
+
+
+
+ false
+ true
+ NotUsing
+ ../../ext/rcheevos/include;$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
+ RC_DISABLE_LUA;_UNICODE;UNICODE;%(PreprocessorDefinitions)
+
+
+ Console
+ false
+ false
+
+
+
+
+ false
+ true
+ NotUsing
+ ../../ext/rcheevos/include;$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
+ RC_DISABLE_LUA;_UNICODE;UNICODE;%(PreprocessorDefinitions)
+
+
+ Console
+ false
+ false
+
+
+
+
+ false
+ true
+ NotUsing
+ ../../ext/rcheevos/include;$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
+ RC_DISABLE_LUA;_UNICODE;UNICODE;%(PreprocessorDefinitions)
+
+
+ Console
+ false
+ false
+
+
+
+
+ false
+ true
+ NotUsing
+ ../../ext/rcheevos/include;$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
+ RC_DISABLE_LUA;_UNICODE;UNICODE;%(PreprocessorDefinitions)
+
+
+ Console
+ false
+ false
+
+
+
+
+ false
+ true
+ NotUsing
+ ../../ext/rcheevos/include;$(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
+ RC_DISABLE_LUA;_UNICODE;UNICODE;%(PreprocessorDefinitions)
+
+
+ Console
+ false
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UWP/rcheevos_UWP/rcheevos_UWP.vcxproj.filters b/UWP/rcheevos_UWP/rcheevos_UWP.vcxproj.filters
new file mode 100644
index 0000000000..d0fa50830b
--- /dev/null
+++ b/UWP/rcheevos_UWP/rcheevos_UWP.vcxproj.filters
@@ -0,0 +1,144 @@
+
+
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ rapi
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rhash
+
+
+
+
+ {918cc87d-a38b-4e00-be13-0256398e1eec}
+
+
+ {89858679-3cc1-4b8b-b2f7-7f418d9335e9}
+
+
+ {e161d2c8-a15a-499d-96d9-fc29fb4ff78d}
+
+
+ {4e62f4d5-be01-4047-b0d6-3c0c171ff486}
+
+
+
+
+ rapi
+
+
+ rapi
+
+
+ rapi
+
+
+ rapi
+
+
+ rapi
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rhash
+
+
+ rhash
+
+
+ rhash
+
+
+
\ No newline at end of file
diff --git a/Windows/PPSSPP.sln b/Windows/PPSSPP.sln
index 877e13aff7..d2ceca3bec 100644
--- a/Windows/PPSSPP.sln
+++ b/Windows/PPSSPP.sln
@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.28307.1082
+# Visual Studio Version 17
+VisualStudioVersion = 17.6.33801.468
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PPSSPPWindows", "PPSSPP.vcxproj", "{567AF8DB-42C1-4D08-96CD-D70A2DFEFC6B}"
ProjectSection(ProjectDependencies) = postProject
@@ -89,6 +89,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzstd", "..\ext\libzstd.v
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpu_features", "..\ext\cpu_features.vcxproj", "{C249F016-7F82-45CF-BB6E-0642A988C4D3}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rcheevos", "..\ext\rcheevos-build\rcheevos.vcxproj", "{31694510-A8C0-40F6-B09B-E8DF825ADEFA}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM = Debug|ARM
@@ -375,6 +377,22 @@ Global
{C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|Win32.Build.0 = Release|Win32
{C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|x64.ActiveCfg = Release|x64
{C249F016-7F82-45CF-BB6E-0642A988C4D3}.Release|x64.Build.0 = Release|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Debug|ARM.ActiveCfg = Debug|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Debug|ARM.Build.0 = Debug|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Debug|ARM64.ActiveCfg = Debug|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Debug|ARM64.Build.0 = Debug|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Debug|Win32.Build.0 = Debug|Win32
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Debug|x64.ActiveCfg = Debug|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Debug|x64.Build.0 = Debug|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Release|ARM.ActiveCfg = Release|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Release|ARM.Build.0 = Release|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Release|ARM64.ActiveCfg = Release|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Release|ARM64.Build.0 = Release|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Release|Win32.ActiveCfg = Release|Win32
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Release|Win32.Build.0 = Release|Win32
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Release|x64.ActiveCfg = Release|x64
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -391,6 +409,7 @@ Global
{D8A71225-178B-424E-96C1-CC3BE2C1B047} = {39FCACF8-10D9-4D8D-97AA-7507436AD932}
{8BFD8150-94D5-4BF9-8A50-7BD9929A0850} = {39FCACF8-10D9-4D8D-97AA-7507436AD932}
{C249F016-7F82-45CF-BB6E-0642A988C4D3} = {39FCACF8-10D9-4D8D-97AA-7507436AD932}
+ {31694510-A8C0-40F6-B09B-E8DF825ADEFA} = {39FCACF8-10D9-4D8D-97AA-7507436AD932}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {2FD47774-A031-48F4-B645-A49A3140A29B}
diff --git a/android/jni/Android.mk b/android/jni/Android.mk
index 8d77243f70..35870d4b8e 100644
--- a/android/jni/Android.mk
+++ b/android/jni/Android.mk
@@ -77,6 +77,34 @@ SPIRV_CROSS_FILES := \
$(SRC)/ext/SPIRV-Cross/spirv_glsl.cpp \
$(SRC)/ext/SPIRV-Cross/spirv_parser.cpp \
$(SRC)/ext/SPIRV-Cross/spirv_cross_parsed_ir.cpp
+
+RCHEEVOS_FILES := \
+ # rapi
+ ${SRC}/ext/rcheevos/src/rapi/rc_api_common.c \
+ ${SRC}/ext/rcheevos/src/rapi/rc_api_editor.c \
+ ${SRC}/ext/rcheevos/src/rapi/rc_api_info.c \
+ ${SRC}/ext/rcheevos/src/rapi/rc_api_runtime.c \
+ ${SRC}/ext/rcheevos/src/rapi/rc_api_user.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/alloc.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/compat.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/condition.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/condset.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/consoleinfo.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/format.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/lboard.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/memref.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/operand.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/rc_validate.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/richpresence.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/richpresence.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/runtime.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/runtime_progress.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/trigger.c \
+ ${SRC}/ext/rcheevos/src/rcheevos/value.c \
+ ${SRC}/ext/rcheevos/src/rhash/cdreader.c \
+ ${SRC}/ext/rcheevos/src/rhash/hash.c \
+ ${SRC}/ext/rcheevos/src/rhash/md5.c \
+ ${SRC}/ext/rcheevos/src/rurl/url.c
VR_FILES := \
$(SRC)/Common/VR/OpenXRLoader.cpp \
@@ -149,6 +177,7 @@ EXEC_AND_LIB_FILES := \
$(VR_FILES) \
$(VMA_FILES) \
$(SPIRV_CROSS_FILES) \
+ $(RCHEEVOS_FILES) \
$(EXT_FILES) \
$(NATIVE_FILES) \
$(SRC)/Common/Buffer.cpp \
diff --git a/ext/rcheevos b/ext/rcheevos
new file mode 160000
index 0000000000..d176b4bcb4
--- /dev/null
+++ b/ext/rcheevos
@@ -0,0 +1 @@
+Subproject commit d176b4bcb42488da84f55991fd10f8ff36183384
diff --git a/ext/rcheevos-build/CMakeLists.txt b/ext/rcheevos-build/CMakeLists.txt
new file mode 100644
index 0000000000..cf94b76be4
--- /dev/null
+++ b/ext/rcheevos-build/CMakeLists.txt
@@ -0,0 +1,47 @@
+cmake_minimum_required (VERSION 3.2.0)
+project (RCheevos)
+
+set(SRC_DIR ../rcheevos/src)
+
+# format
+set(ALL_SOURCE_FILES
+ # rapi
+ ${SRC_DIR}/rapi/rc_api_common.c
+ ${SRC_DIR}/rapi/rc_api_common.h
+ ${SRC_DIR}/rapi/rc_api_editor.c
+ ${SRC_DIR}/rapi/rc_api_info.c
+ ${SRC_DIR}/rapi/rc_api_runtime.c
+ ${SRC_DIR}/rapi/rc_api_user.c
+ # rcheevos
+ ${SRC_DIR}/rcheevos/alloc.c
+ ${SRC_DIR}/rcheevos/compat.c
+ ${SRC_DIR}/rcheevos/condition.c
+ ${SRC_DIR}/rcheevos/condset.c
+ ${SRC_DIR}/rcheevos/consoleinfo.c
+ ${SRC_DIR}/rcheevos/format.c
+ ${SRC_DIR}/rcheevos/lboard.c
+ ${SRC_DIR}/rcheevos/memref.c
+ ${SRC_DIR}/rcheevos/operand.c
+ ${SRC_DIR}/rcheevos/rc_compat.h
+ ${SRC_DIR}/rcheevos/rc_internal.h
+ ${SRC_DIR}/rcheevos/rc_validate.h
+ ${SRC_DIR}/rcheevos/rc_validate.c
+ ${SRC_DIR}/rcheevos/rc_version.h
+ ${SRC_DIR}/rcheevos/richpresence.c
+ ${SRC_DIR}/rcheevos/richpresence.c
+ ${SRC_DIR}/rcheevos/runtime.c
+ ${SRC_DIR}/rcheevos/runtime_progress.c
+ ${SRC_DIR}/rcheevos/trigger.c
+ ${SRC_DIR}/rcheevos/value.c
+ # rhash
+ ${SRC_DIR}/rhash/cdreader.c
+ ${SRC_DIR}/rhash/hash.c
+ ${SRC_DIR}/rhash/md5.c
+ ${SRC_DIR}/rhash/md5.h
+ # rurl
+ ${SRC_DIR}/rurl/url.c
+ )
+
+add_library(rcheevos STATIC ${ALL_SOURCE_FILES})
+
+target_include_directories(rcheevos PUBLIC ../rcheevos/include ../rcheevos/src/rapi)
diff --git a/ext/rcheevos-build/rcheevos.vcxproj b/ext/rcheevos-build/rcheevos.vcxproj
new file mode 100644
index 0000000000..d785e9b475
--- /dev/null
+++ b/ext/rcheevos-build/rcheevos.vcxproj
@@ -0,0 +1,189 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 16.0
+ Win32Proj
+ {31694510-a8c0-40f6-b09b-e8df825adefa}
+ rcheevos
+
+
+
+ StaticLibrary
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+ $(DefaultPlatformToolset)
+
+
+ StaticLibrary
+ true
+ $(DefaultPlatformToolset)
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+ $(DefaultPlatformToolset)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Level3
+ true
+ RC_DISABLE_LUA;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ pch.h
+ ../rcheevos/include
+
+
+
+
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ RC_DISABLE_LUA;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ pch.h
+ ../rcheevos/include
+
+
+
+
+ true
+ true
+ true
+
+
+
+
+ Level3
+ true
+ RC_DISABLE_LUA;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ pch.h
+ ../rcheevos/include
+
+
+
+
+ true
+
+
+
+
+ Level3
+ true
+ true
+ true
+ RC_DISABLE_LUA;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ pch.h
+ ../rcheevos/include
+
+
+
+
+ true
+ true
+ true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ext/rcheevos-build/rcheevos.vcxproj.filters b/ext/rcheevos-build/rcheevos.vcxproj.filters
new file mode 100644
index 0000000000..d4fb9e4ffb
--- /dev/null
+++ b/ext/rcheevos-build/rcheevos.vcxproj.filters
@@ -0,0 +1,150 @@
+
+
+
+
+ {d69c6a56-d9c2-4b21-96af-7adc52a4e0ea}
+
+
+ {0acc1fc7-94ca-4eee-967e-5a64a884dbf1}
+
+
+ {55ec06aa-6d34-4edf-8b0b-f93f93a064b4}
+
+
+ {990047ac-f0d4-44f5-8463-54f898557d02}
+
+
+ {9e049d1f-4b83-4aa5-89f3-01a42e1773e2}
+
+
+
+
+ rapi
+
+
+ rapi
+
+
+ rapi
+
+
+ rapi
+
+
+ rapi
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rhash
+
+
+ rhash
+
+
+ rhash
+
+
+ rurl
+
+
+
+
+ rapi
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ include
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rcheevos
+
+
+ rhash
+
+
+
\ No newline at end of file