summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2026-03-17 19:58:28 +0100
committerOatmealDome <julian@oatmealdome.me>2026-03-17 17:57:25 -0400
commit8b5a50da8f9592b6bbcc88a0b046b1ba1daf3ba0 (patch)
tree75b65bcde28320ec9296deca94a249f296bc9ffb
parent5c9e4f8e476fe9ae574457828fe231bbc7078be3 (diff)
RetroAchievements: Block loading discs that don't match current title
-rw-r--r--Source/Core/Core/AchievementManager.cpp20
-rw-r--r--Source/Core/Core/AchievementManager.h3
-rw-r--r--Source/Core/Core/HW/DVD/DVDInterface.cpp4
3 files changed, 25 insertions, 2 deletions
diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp
index cacad3f3d1..a88fb463e1 100644
--- a/Source/Core/Core/AchievementManager.cpp
+++ b/Source/Core/Core/AchievementManager.cpp
@@ -26,6 +26,7 @@
#include "Core/Config/FreeLookSettings.h"
#include "Core/Config/MainSettings.h"
#include "Core/ConfigLoaders/GameConfigLoader.h"
+#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/GeckoCode.h"
#include "Core/HW/Memmap.h"
@@ -215,6 +216,25 @@ void AchievementManager::LoadGame(const DiscIO::Volume* volume)
}
}
+void AchievementManager::ChangeDisc(const DiscIO::Volume* volume)
+{
+ if (volume == nullptr)
+ {
+ INFO_LOG_FMT(ACHIEVEMENTS, "Ejecting disc.");
+ LoadGame(nullptr);
+ }
+ else if (volume->GetGameID() != SConfig::GetInstance().GetGameID())
+ {
+ INFO_LOG_FMT(ACHIEVEMENTS, "Inserting disc that doesn't belong to the running game.");
+ LoadGame(nullptr);
+ }
+ else
+ {
+ INFO_LOG_FMT(ACHIEVEMENTS, "Inserting disc.");
+ LoadGame(volume);
+ }
+}
+
bool AchievementManager::IsGameLoaded() const
{
auto* game_info = rc_client_get_game_info(m_client);
diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h
index 2ab23a4368..ea57ef7341 100644
--- a/Source/Core/Core/AchievementManager.h
+++ b/Source/Core/Core/AchievementManager.h
@@ -121,6 +121,7 @@ public:
void Login(const std::string& password);
bool HasAPIToken() const;
void LoadGame(const DiscIO::Volume* volume);
+ void ChangeDisc(const DiscIO::Volume* volume);
bool IsGameLoaded() const;
void SetBackgroundExecutionAllowed(bool allowed);
@@ -333,6 +334,8 @@ public:
constexpr void LoadGame(const DiscIO::Volume*) {}
+ constexpr void ChangeDisc(const DiscIO::Volume*) {}
+
constexpr void SetBackgroundExecutionAllowed(bool allowed) {}
constexpr void DoFrame() {}
diff --git a/Source/Core/Core/HW/DVD/DVDInterface.cpp b/Source/Core/Core/HW/DVD/DVDInterface.cpp
index 8420366ffb..376aeb4add 100644
--- a/Source/Core/Core/HW/DVD/DVDInterface.cpp
+++ b/Source/Core/Core/HW/DVD/DVDInterface.cpp
@@ -442,7 +442,7 @@ void DVDInterface::AutoChangeDiscCallback(Core::System& system, u64 userdata, s6
void DVDInterface::EjectDiscCallback(Core::System& system, u64 userdata, s64 cyclesLate)
{
- AchievementManager::GetInstance().LoadGame(nullptr);
+ AchievementManager::GetInstance().ChangeDisc(nullptr);
system.GetDVDInterface().SetDisc(nullptr, {});
}
@@ -454,7 +454,7 @@ void DVDInterface::InsertDiscCallback(Core::System& system, u64 userdata, s64 cy
if (new_disc)
{
- AchievementManager::GetInstance().LoadGame(new_disc.get());
+ AchievementManager::GetInstance().ChangeDisc(new_disc.get());
di.SetDisc(std::move(new_disc), {});
}
else