aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS
diff options
context:
space:
mode:
authorEmmanuel Hansen <emmausssss@gmail.com>2022-01-03 08:39:43 +0000
committerGitHub <noreply@github.com>2022-01-03 09:39:43 +0100
commite98abf182043630fd8fae1a20a3ddfe5fe56a313 (patch)
tree7de26ce2e12e9c5036278c49023b023442f2fbc1 /Ryujinx.HLE/HOS
parentdc8a1d5cbafc842c1ad52adcbf0a4a023931541a (diff)
Add Cheat Manager (#2964)
* add cheatmanager * use modloader to load cheats for manager * addressed nits
Diffstat (limited to 'Ryujinx.HLE/HOS')
-rw-r--r--Ryujinx.HLE/HOS/ModLoader.cs15
-rw-r--r--Ryujinx.HLE/HOS/Tamper/AtmosphereProgram.cs8
-rw-r--r--Ryujinx.HLE/HOS/Tamper/ITamperProgram.cs1
-rw-r--r--Ryujinx.HLE/HOS/TamperMachine.cs22
4 files changed, 42 insertions, 4 deletions
diff --git a/Ryujinx.HLE/HOS/ModLoader.cs b/Ryujinx.HLE/HOS/ModLoader.cs
index 54a97556..b31798b8 100644
--- a/Ryujinx.HLE/HOS/ModLoader.cs
+++ b/Ryujinx.HLE/HOS/ModLoader.cs
@@ -664,7 +664,20 @@ namespace Ryujinx.HLE.HOS
Logger.Info?.Print(LogClass.ModLoader, $"Installing cheat '{cheat.Name}'");
- tamperMachine.InstallAtmosphereCheat(cheat.Name, cheat.Instructions, tamperInfo, exeAddress);
+ tamperMachine.InstallAtmosphereCheat(cheat.Name, cheatId, cheat.Instructions, tamperInfo, exeAddress);
+ }
+
+ EnableCheats(titleId, tamperMachine);
+ }
+
+ internal void EnableCheats(ulong titleId, TamperMachine tamperMachine)
+ {
+ var contentDirectory = FindTitleDir(new DirectoryInfo(Path.Combine(GetModsBasePath(), AmsContentsDir)), $"{titleId:x16}");
+ string enabledCheatsPath = Path.Combine(contentDirectory.FullName, CheatDir, "enabled.txt");
+
+ if (File.Exists(enabledCheatsPath))
+ {
+ tamperMachine.EnableCheats(File.ReadAllLines(enabledCheatsPath));
}
}
diff --git a/Ryujinx.HLE/HOS/Tamper/AtmosphereProgram.cs b/Ryujinx.HLE/HOS/Tamper/AtmosphereProgram.cs
index dac445b0..a2aa73a4 100644
--- a/Ryujinx.HLE/HOS/Tamper/AtmosphereProgram.cs
+++ b/Ryujinx.HLE/HOS/Tamper/AtmosphereProgram.cs
@@ -11,6 +11,7 @@ namespace Ryujinx.HLE.HOS.Tamper
public string Name { get; }
public bool TampersCodeMemory { get; set; } = false;
public ITamperedProcess Process { get; }
+ public bool IsEnabled { get; set; }
public AtmosphereProgram(string name, ITamperedProcess process, Parameter<long> pressedKeys, IOperation entryPoint)
{
@@ -22,8 +23,11 @@ namespace Ryujinx.HLE.HOS.Tamper
public void Execute(ControllerKeys pressedKeys)
{
- _pressedKeys.Value = (long)pressedKeys;
- _entryPoint.Execute();
+ if (IsEnabled)
+ {
+ _pressedKeys.Value = (long)pressedKeys;
+ _entryPoint.Execute();
+ }
}
}
}
diff --git a/Ryujinx.HLE/HOS/Tamper/ITamperProgram.cs b/Ryujinx.HLE/HOS/Tamper/ITamperProgram.cs
index 63702bf7..8458d95d 100644
--- a/Ryujinx.HLE/HOS/Tamper/ITamperProgram.cs
+++ b/Ryujinx.HLE/HOS/Tamper/ITamperProgram.cs
@@ -4,6 +4,7 @@ namespace Ryujinx.HLE.HOS.Tamper
{
interface ITamperProgram
{
+ bool IsEnabled { get; set; }
string Name { get; }
bool TampersCodeMemory { get; set; }
ITamperedProcess Process { get; }
diff --git a/Ryujinx.HLE/HOS/TamperMachine.cs b/Ryujinx.HLE/HOS/TamperMachine.cs
index 6044368e..016f326f 100644
--- a/Ryujinx.HLE/HOS/TamperMachine.cs
+++ b/Ryujinx.HLE/HOS/TamperMachine.cs
@@ -20,6 +20,7 @@ namespace Ryujinx.HLE.HOS
private Thread _tamperThread = null;
private ConcurrentQueue<ITamperProgram> _programs = new ConcurrentQueue<ITamperProgram>();
private long _pressedKeys = 0;
+ private Dictionary<string, ITamperProgram> _programDictionary = new Dictionary<string, ITamperProgram>();
private void Activate()
{
@@ -31,7 +32,7 @@ namespace Ryujinx.HLE.HOS
}
}
- internal void InstallAtmosphereCheat(string name, IEnumerable<string> rawInstructions, ProcessTamperInfo info, ulong exeAddress)
+ internal void InstallAtmosphereCheat(string name, string buildId, IEnumerable<string> rawInstructions, ProcessTamperInfo info, ulong exeAddress)
{
if (!CanInstallOnPid(info.Process.Pid))
{
@@ -47,6 +48,7 @@ namespace Ryujinx.HLE.HOS
program.TampersCodeMemory = false;
_programs.Enqueue(program);
+ _programDictionary.TryAdd($"{buildId}-{name}", program);
}
Activate();
@@ -65,6 +67,22 @@ namespace Ryujinx.HLE.HOS
return true;
}
+ public void EnableCheats(string[] enabledCheats)
+ {
+ foreach (var program in _programDictionary.Values)
+ {
+ program.IsEnabled = false;
+ }
+
+ foreach (var cheat in enabledCheats)
+ {
+ if (_programDictionary.TryGetValue(cheat, out var program))
+ {
+ program.IsEnabled = true;
+ }
+ }
+ }
+
private bool IsProcessValid(ITamperedProcess process)
{
return process.State != ProcessState.Crashed && process.State != ProcessState.Exiting && process.State != ProcessState.Exited;
@@ -105,6 +123,8 @@ namespace Ryujinx.HLE.HOS
if (!_programs.TryDequeue(out ITamperProgram program))
{
// No more programs in the queue.
+ _programDictionary.Clear();
+
return false;
}