Add AR Code Whitelist Approval
This commit is contained in:
parent
13a1956cfa
commit
3c255b55e8
|
@ -24,6 +24,7 @@
|
||||||
#include "Common/ScopeGuard.h"
|
#include "Common/ScopeGuard.h"
|
||||||
#include "Common/Version.h"
|
#include "Common/Version.h"
|
||||||
#include "Common/WorkQueueThread.h"
|
#include "Common/WorkQueueThread.h"
|
||||||
|
#include "Core/ActionReplay.h"
|
||||||
#include "Core/Config/AchievementSettings.h"
|
#include "Core/Config/AchievementSettings.h"
|
||||||
#include "Core/Config/FreeLookSettings.h"
|
#include "Core/Config/FreeLookSettings.h"
|
||||||
#include "Core/Config/MainSettings.h"
|
#include "Core/Config/MainSettings.h"
|
||||||
|
@ -474,6 +475,18 @@ Common::SHA1::Digest AchievementManager::GetCodeHash(const Gecko::GeckoCode& cod
|
||||||
return context->Finish();
|
return context->Finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Common::SHA1::Digest AchievementManager::GetCodeHash(const ActionReplay::ARCode& code) const
|
||||||
|
{
|
||||||
|
auto context = Common::SHA1::CreateContext();
|
||||||
|
context->Update(Common::BitCastToArray<u8>(static_cast<u64>(code.ops.size())));
|
||||||
|
for (const auto& entry : code.ops)
|
||||||
|
{
|
||||||
|
context->Update(Common::BitCastToArray<u8>(entry.cmd_addr));
|
||||||
|
context->Update(Common::BitCastToArray<u8>(entry.value));
|
||||||
|
}
|
||||||
|
return context->Finish();
|
||||||
|
}
|
||||||
|
|
||||||
void AchievementManager::FilterApprovedPatches(std::vector<PatchEngine::Patch>& patches,
|
void AchievementManager::FilterApprovedPatches(std::vector<PatchEngine::Patch>& patches,
|
||||||
const std::string& game_ini_id) const
|
const std::string& game_ini_id) const
|
||||||
{
|
{
|
||||||
|
@ -486,12 +499,24 @@ void AchievementManager::FilterApprovedGeckoCodes(std::vector<Gecko::GeckoCode>&
|
||||||
FilterApprovedIni(codes, game_ini_id);
|
FilterApprovedIni(codes, game_ini_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AchievementManager::FilterApprovedARCodes(std::vector<ActionReplay::ARCode>& codes,
|
||||||
|
const std::string& game_ini_id) const
|
||||||
|
{
|
||||||
|
FilterApprovedIni(codes, game_ini_id);
|
||||||
|
}
|
||||||
|
|
||||||
bool AchievementManager::CheckApprovedGeckoCode(const Gecko::GeckoCode& code,
|
bool AchievementManager::CheckApprovedGeckoCode(const Gecko::GeckoCode& code,
|
||||||
const std::string& game_ini_id) const
|
const std::string& game_ini_id) const
|
||||||
{
|
{
|
||||||
return CheckApprovedCode(code, game_ini_id);
|
return CheckApprovedCode(code, game_ini_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AchievementManager::CheckApprovedARCode(const ActionReplay::ARCode& code,
|
||||||
|
const std::string& game_ini_id) const
|
||||||
|
{
|
||||||
|
return CheckApprovedCode(code, game_ini_id);
|
||||||
|
}
|
||||||
|
|
||||||
void AchievementManager::SetSpectatorMode()
|
void AchievementManager::SetSpectatorMode()
|
||||||
{
|
{
|
||||||
rc_client_set_spectator_mode_enabled(m_client, Config::Get(Config::RA_SPECTATOR_ENABLED));
|
rc_client_set_spectator_mode_enabled(m_client, Config::Get(Config::RA_SPECTATOR_ENABLED));
|
||||||
|
|
|
@ -50,6 +50,11 @@ namespace Gecko
|
||||||
class GeckoCode;
|
class GeckoCode;
|
||||||
} // namespace Gecko
|
} // namespace Gecko
|
||||||
|
|
||||||
|
namespace ActionReplay
|
||||||
|
{
|
||||||
|
struct ARCode;
|
||||||
|
} // namespace ActionReplay
|
||||||
|
|
||||||
class AchievementManager
|
class AchievementManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -135,7 +140,10 @@ public:
|
||||||
const std::string& game_ini_id) const;
|
const std::string& game_ini_id) const;
|
||||||
void FilterApprovedGeckoCodes(std::vector<Gecko::GeckoCode>& codes,
|
void FilterApprovedGeckoCodes(std::vector<Gecko::GeckoCode>& codes,
|
||||||
const std::string& game_ini_id) const;
|
const std::string& game_ini_id) const;
|
||||||
|
void FilterApprovedARCodes(std::vector<ActionReplay::ARCode>& codes,
|
||||||
|
const std::string& game_ini_id) const;
|
||||||
bool CheckApprovedGeckoCode(const Gecko::GeckoCode& code, const std::string& game_ini_id) const;
|
bool CheckApprovedGeckoCode(const Gecko::GeckoCode& code, const std::string& game_ini_id) const;
|
||||||
|
bool CheckApprovedARCode(const ActionReplay::ARCode& code, const std::string& game_ini_id) const;
|
||||||
|
|
||||||
void SetSpectatorMode();
|
void SetSpectatorMode();
|
||||||
std::string_view GetPlayerDisplayName() const;
|
std::string_view GetPlayerDisplayName() const;
|
||||||
|
@ -197,6 +205,7 @@ private:
|
||||||
bool CheckApprovedCode(const T& code, const std::string& game_ini_id) const;
|
bool CheckApprovedCode(const T& code, const std::string& game_ini_id) const;
|
||||||
Common::SHA1::Digest GetCodeHash(const PatchEngine::Patch& patch) const;
|
Common::SHA1::Digest GetCodeHash(const PatchEngine::Patch& patch) const;
|
||||||
Common::SHA1::Digest GetCodeHash(const Gecko::GeckoCode& code) const;
|
Common::SHA1::Digest GetCodeHash(const Gecko::GeckoCode& code) const;
|
||||||
|
Common::SHA1::Digest GetCodeHash(const ActionReplay::ARCode& code) const;
|
||||||
|
|
||||||
static void LeaderboardEntriesCallback(int result, const char* error_message,
|
static void LeaderboardEntriesCallback(int result, const char* error_message,
|
||||||
rc_client_leaderboard_entry_list_t* list,
|
rc_client_leaderboard_entry_list_t* list,
|
||||||
|
@ -288,6 +297,12 @@ public:
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr bool CheckApprovedARCode(const ActionReplay::ARCode& code,
|
||||||
|
const std::string& game_ini_id)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
constexpr void LoadGame(const std::string&, const DiscIO::Volume*) {}
|
constexpr void LoadGame(const std::string&, const DiscIO::Volume*) {}
|
||||||
|
|
||||||
constexpr void SetBackgroundExecutionAllowed(bool allowed) {}
|
constexpr void SetBackgroundExecutionAllowed(bool allowed) {}
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include "Common/MsgHandler.h"
|
#include "Common/MsgHandler.h"
|
||||||
|
|
||||||
#include "Core/ARDecrypt.h"
|
#include "Core/ARDecrypt.h"
|
||||||
|
#include "Core/AchievementManager.h"
|
||||||
#include "Core/CheatCodes.h"
|
#include "Core/CheatCodes.h"
|
||||||
#include "Core/Config/MainSettings.h"
|
#include "Core/Config/MainSettings.h"
|
||||||
#include "Core/PowerPC/MMU.h"
|
#include "Core/PowerPC/MMU.h"
|
||||||
|
@ -112,7 +113,7 @@ struct ARAddr
|
||||||
|
|
||||||
// ----------------------
|
// ----------------------
|
||||||
// AR Remote Functions
|
// AR Remote Functions
|
||||||
void ApplyCodes(std::span<const ARCode> codes)
|
void ApplyCodes(std::span<const ARCode> codes, const std::string& game_id)
|
||||||
{
|
{
|
||||||
if (!Config::AreCheatsEnabled())
|
if (!Config::AreCheatsEnabled())
|
||||||
return;
|
return;
|
||||||
|
@ -121,7 +122,10 @@ void ApplyCodes(std::span<const ARCode> codes)
|
||||||
s_disable_logging = false;
|
s_disable_logging = false;
|
||||||
s_active_codes.clear();
|
s_active_codes.clear();
|
||||||
std::copy_if(codes.begin(), codes.end(), std::back_inserter(s_active_codes),
|
std::copy_if(codes.begin(), codes.end(), std::back_inserter(s_active_codes),
|
||||||
[](const ARCode& code) { return code.enabled; });
|
[&game_id](const ARCode& code) {
|
||||||
|
return code.enabled &&
|
||||||
|
AchievementManager::GetInstance().CheckApprovedARCode(code, game_id);
|
||||||
|
});
|
||||||
s_active_codes.shrink_to_fit();
|
s_active_codes.shrink_to_fit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,9 +173,10 @@ void AddCode(ARCode code)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadAndApplyCodes(const Common::IniFile& global_ini, const Common::IniFile& local_ini)
|
void LoadAndApplyCodes(const Common::IniFile& global_ini, const Common::IniFile& local_ini,
|
||||||
|
const std::string& game_id)
|
||||||
{
|
{
|
||||||
ApplyCodes(LoadCodes(global_ini, local_ini));
|
ApplyCodes(LoadCodes(global_ini, local_ini), game_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parses the Action Replay section of a game ini file.
|
// Parses the Action Replay section of a game ini file.
|
||||||
|
|
|
@ -45,12 +45,13 @@ struct ARCode
|
||||||
|
|
||||||
void RunAllActive(const Core::CPUThreadGuard& cpu_guard);
|
void RunAllActive(const Core::CPUThreadGuard& cpu_guard);
|
||||||
|
|
||||||
void ApplyCodes(std::span<const ARCode> codes);
|
void ApplyCodes(std::span<const ARCode> codes, const std::string& game_id);
|
||||||
void SetSyncedCodesAsActive();
|
void SetSyncedCodesAsActive();
|
||||||
void UpdateSyncedCodes(std::span<const ARCode> codes);
|
void UpdateSyncedCodes(std::span<const ARCode> codes);
|
||||||
std::vector<ARCode> ApplyAndReturnCodes(std::span<const ARCode> codes);
|
std::vector<ARCode> ApplyAndReturnCodes(std::span<const ARCode> codes);
|
||||||
void AddCode(ARCode new_code);
|
void AddCode(ARCode new_code);
|
||||||
void LoadAndApplyCodes(const Common::IniFile& global_ini, const Common::IniFile& local_ini);
|
void LoadAndApplyCodes(const Common::IniFile& global_ini, const Common::IniFile& local_ini,
|
||||||
|
const std::string& game_id);
|
||||||
|
|
||||||
std::vector<ARCode> LoadCodes(const Common::IniFile& global_ini, const Common::IniFile& local_ini);
|
std::vector<ARCode> LoadCodes(const Common::IniFile& global_ini, const Common::IniFile& local_ini);
|
||||||
void SaveCodes(Common::IniFile* local_ini, std::span<const ARCode> codes);
|
void SaveCodes(Common::IniFile* local_ini, std::span<const ARCode> codes);
|
||||||
|
|
|
@ -2125,13 +2125,16 @@ bool NetPlayServer::SyncCodes()
|
||||||
|
|
||||||
// Sync AR Codes
|
// Sync AR Codes
|
||||||
{
|
{
|
||||||
|
std::vector<ActionReplay::ARCode> codes = ActionReplay::LoadCodes(globalIni, localIni);
|
||||||
|
#ifdef USE_RETRO_ACHIEVEMENTS
|
||||||
|
AchievementManager::GetInstance().FilterApprovedARCodes(codes, game_id);
|
||||||
|
#endif // USE_RETRO_ACHIEVEMENTS
|
||||||
// Create an AR Code Vector with just the active codes
|
// Create an AR Code Vector with just the active codes
|
||||||
std::vector<ActionReplay::ARCode> s_active_codes =
|
std::vector<ActionReplay::ARCode> active_codes = ActionReplay::ApplyAndReturnCodes(codes);
|
||||||
ActionReplay::ApplyAndReturnCodes(ActionReplay::LoadCodes(globalIni, localIni));
|
|
||||||
|
|
||||||
// Determine Codelist Size
|
// Determine Codelist Size
|
||||||
u16 codelines = 0;
|
u16 codelines = 0;
|
||||||
for (const ActionReplay::ARCode& active_code : s_active_codes)
|
for (const ActionReplay::ARCode& active_code : active_codes)
|
||||||
{
|
{
|
||||||
INFO_LOG_FMT(NETPLAY, "Indexing {}", active_code.name);
|
INFO_LOG_FMT(NETPLAY, "Indexing {}", active_code.name);
|
||||||
for (const ActionReplay::AREntry& op : active_code.ops)
|
for (const ActionReplay::AREntry& op : active_code.ops)
|
||||||
|
@ -2159,7 +2162,7 @@ bool NetPlayServer::SyncCodes()
|
||||||
pac << MessageID::SyncCodes;
|
pac << MessageID::SyncCodes;
|
||||||
pac << SyncCodeID::ARData;
|
pac << SyncCodeID::ARData;
|
||||||
// Iterate through the active code vector and send each codeline
|
// Iterate through the active code vector and send each codeline
|
||||||
for (const ActionReplay::ARCode& active_code : s_active_codes)
|
for (const ActionReplay::ARCode& active_code : active_codes)
|
||||||
{
|
{
|
||||||
INFO_LOG_FMT(NETPLAY, "Sending {}", active_code.name);
|
INFO_LOG_FMT(NETPLAY, "Sending {}", active_code.name);
|
||||||
for (const ActionReplay::AREntry& op : active_code.ops)
|
for (const ActionReplay::AREntry& op : active_code.ops)
|
||||||
|
|
|
@ -198,7 +198,7 @@ void LoadPatches()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Gecko::SetActiveCodes(Gecko::LoadCodes(globalIni, localIni), sconfig.GetGameID());
|
Gecko::SetActiveCodes(Gecko::LoadCodes(globalIni, localIni), sconfig.GetGameID());
|
||||||
ActionReplay::LoadAndApplyCodes(globalIni, localIni);
|
ActionReplay::LoadAndApplyCodes(globalIni, localIni, sconfig.GetGameID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,7 +335,7 @@ bool ApplyFramePatches(Core::System& system)
|
||||||
void Shutdown()
|
void Shutdown()
|
||||||
{
|
{
|
||||||
s_on_frame.clear();
|
s_on_frame.clear();
|
||||||
ActionReplay::ApplyCodes({});
|
ActionReplay::ApplyCodes({}, "");
|
||||||
Gecko::Shutdown();
|
Gecko::Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ void ARCodeWidget::OnItemChanged(QListWidgetItem* item)
|
||||||
m_ar_codes[m_code_list->row(item)].enabled = (item->checkState() == Qt::Checked);
|
m_ar_codes[m_code_list->row(item)].enabled = (item->checkState() == Qt::Checked);
|
||||||
|
|
||||||
if (!m_restart_required)
|
if (!m_restart_required)
|
||||||
ActionReplay::ApplyCodes(m_ar_codes);
|
ActionReplay::ApplyCodes(m_ar_codes, m_game_id);
|
||||||
|
|
||||||
UpdateList();
|
UpdateList();
|
||||||
SaveCodes();
|
SaveCodes();
|
||||||
|
|
Loading…
Reference in New Issue