Skip to content

Commit

Permalink
Add AR Code Whitelist Approval
Browse files Browse the repository at this point in the history
  • Loading branch information
LillyJadeKatrin committed Sep 10, 2024
1 parent 5649d11 commit 1e5ea75
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 9 deletions.
2 changes: 1 addition & 1 deletion Source/Android/jni/Cheats/ARCheat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ Java_org_dolphinemu_dolphinemu_features_cheats_model_ARCheat_loadCodes(JNIEnv* e
const Common::IniFile game_ini_default = SConfig::LoadDefaultGameIni(game_id, revision);

const std::vector<ActionReplay::ARCode> codes =
ActionReplay::LoadCodes(game_ini_default, game_ini_local);
ActionReplay::LoadCodes(game_ini_default, game_ini_local, game_id);

return VectorToJObjectArray(env, codes, IDCache::GetARCheatClass(), ARCheatToJava);
}
Expand Down
19 changes: 19 additions & 0 deletions Source/Core/Core/AchievementManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "Common/ScopeGuard.h"
#include "Common/Version.h"
#include "Common/WorkQueueThread.h"
#include "Core/ActionReplay.h"
#include "Core/Config/AchievementSettings.h"
#include "Core/Core.h"
#include "Core/GeckoCode.h"
Expand Down Expand Up @@ -432,6 +433,18 @@ Common::SHA1::Digest AchievementManager::GetPatchHash(const Gecko::GeckoCode& co
return context->Finish();
}

Common::SHA1::Digest AchievementManager::GetPatchHash(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,
const std::string& game_ini_id) const
{
Expand All @@ -444,6 +457,12 @@ void AchievementManager::FilterApprovedGeckoCodes(std::vector<Gecko::GeckoCode>&
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);
}

void AchievementManager::SetSpectatorMode()
{
rc_client_set_spectator_mode_enabled(m_client, Config::Get(Config::RA_SPECTATOR_ENABLED));
Expand Down
8 changes: 8 additions & 0 deletions Source/Core/Core/AchievementManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ namespace Gecko
class GeckoCode;
} // namespace Gecko

namespace ActionReplay
{
struct ARCode;
} // namespace ActionReplay

class AchievementManager
{
public:
Expand Down Expand Up @@ -132,6 +137,8 @@ class AchievementManager
const std::string& game_ini_id) const;
void FilterApprovedGeckoCodes(std::vector<Gecko::GeckoCode>& codes,
const std::string& game_ini_id) const;
void FilterApprovedARCodes(std::vector<ActionReplay::ARCode>& codes,
const std::string& game_ini_id) const;

void SetSpectatorMode();
std::string_view GetPlayerDisplayName() const;
Expand Down Expand Up @@ -191,6 +198,7 @@ class AchievementManager
void FilterApprovedIni(std::vector<T>& patches, const std::string& game_ini_id) const;
Common::SHA1::Digest GetPatchHash(const PatchEngine::Patch& patch) const;
Common::SHA1::Digest GetPatchHash(const Gecko::GeckoCode& patch) const;
Common::SHA1::Digest GetPatchHash(const ActionReplay::ARCode& patch) const;

static void LeaderboardEntriesCallback(int result, const char* error_message,
rc_client_leaderboard_entry_list_t* list,
Expand Down
16 changes: 13 additions & 3 deletions Source/Core/Core/ActionReplay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include "Common/MsgHandler.h"

#include "Core/ARDecrypt.h"
#include "Core/AchievementManager.h"
#include "Core/CheatCodes.h"
#include "Core/Config/MainSettings.h"
#include "Core/PowerPC/MMU.h"
Expand Down Expand Up @@ -169,13 +170,15 @@ 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.
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,
const std::string& game_id)
{
std::vector<ARCode> codes;

Expand Down Expand Up @@ -246,6 +249,13 @@ std::vector<ARCode> LoadCodes(const Common::IniFile& global_ini, const Common::I
}
}

#ifdef USE_RETRO_ACHIEVEMENTS
{
std::lock_guard lg{AchievementManager::GetInstance().GetLock()};
AchievementManager::GetInstance().FilterApprovedARCodes(codes, game_id);
}
#endif // USE_RETRO_ACHIEVEMENTS

return codes;
}

Expand Down
6 changes: 4 additions & 2 deletions Source/Core/Core/ActionReplay.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,11 @@ void SetSyncedCodesAsActive();
void UpdateSyncedCodes(std::span<const ARCode> codes);
std::vector<ARCode> ApplyAndReturnCodes(std::span<const ARCode> codes);
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,
const std::string& game_id);
void SaveCodes(Common::IniFile* local_ini, std::span<const ARCode> codes);

using EncryptedLine = std::string;
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/Core/NetPlayServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2119,7 +2119,7 @@ bool NetPlayServer::SyncCodes()
{
// Create an AR Code Vector with just the active codes
std::vector<ActionReplay::ARCode> s_active_codes =
ActionReplay::ApplyAndReturnCodes(ActionReplay::LoadCodes(globalIni, localIni));
ActionReplay::ApplyAndReturnCodes(ActionReplay::LoadCodes(globalIni, localIni, game_id));

// Determine Codelist Size
u16 codelines = 0;
Expand Down
2 changes: 1 addition & 1 deletion Source/Core/Core/PatchEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ void LoadPatches()
else
{
Gecko::SetActiveCodes(Gecko::LoadCodes(globalIni, localIni, sconfig.GetGameID()));
ActionReplay::LoadAndApplyCodes(globalIni, localIni);
ActionReplay::LoadAndApplyCodes(globalIni, localIni, sconfig.GetGameID());
}
}

Expand Down
2 changes: 1 addition & 1 deletion Source/Core/DolphinQt/Config/ARCodeWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ void ARCodeWidget::LoadCodes()

const Common::IniFile game_ini_default =
SConfig::LoadDefaultGameIni(m_game_id, m_game_revision);
m_ar_codes = ActionReplay::LoadCodes(game_ini_default, game_ini_local);
m_ar_codes = ActionReplay::LoadCodes(game_ini_default, game_ini_local, m_game_id);
}

m_code_list->setEnabled(!m_game_id.empty());
Expand Down

0 comments on commit 1e5ea75

Please sign in to comment.