Add CheatEngine and support for Gateway cheats (#4406)

* Add CheatEngine; Add support for Gateway cheats; Add Cheat UI

* fix a potential crash on some systems

* fix substr with negative length

* Add Joker to the NonOp comp handling

* Fixup JokerOp

* minor fixup in patchop; add todo for nested loops

* Add comment for PadState member variable in HID

* fix: stol to stoul in parsing cheat file

* fix misplaced parsing of values; fix patchop code

* add missing break

* Make read_func and write_func a template parameter
This commit is contained in:
Ben
2018-11-17 02:01:10 +01:00
committed by James Rowe
parent 560df843b1
commit b90ff739a0
23 changed files with 1052 additions and 1 deletions

View File

@ -0,0 +1,83 @@
// Copyright 2018 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once
#include <atomic>
#include <memory>
#include "core/cheats/cheat_base.h"
namespace Cheats {
class GatewayCheat final : public CheatBase {
public:
enum class CheatType {
Null = -0x1,
Write32 = 0x00,
Write16 = 0x01,
Write8 = 0x02,
GreaterThan32 = 0x03,
LessThan32 = 0x04,
EqualTo32 = 0x05,
NotEqualTo32 = 0x06,
GreaterThan16WithMask = 0x07,
LessThan16WithMask = 0x08,
EqualTo16WithMask = 0x09,
NotEqualTo16WithMask = 0x0A,
LoadOffset = 0x0B,
Loop = 0x0C,
Terminator = 0xD0,
LoopExecuteVariant = 0xD1,
FullTerminator = 0xD2,
SetOffset = 0xD3,
AddValue = 0xD4,
SetValue = 0xD5,
IncrementiveWrite32 = 0xD6,
IncrementiveWrite16 = 0xD7,
IncrementiveWrite8 = 0xD8,
Load32 = 0xD9,
Load16 = 0xDA,
Load8 = 0xDB,
AddOffset = 0xDC,
Joker = 0xDD,
Patch = 0xE,
};
struct CheatLine {
explicit CheatLine(const std::string& line);
CheatType type;
u32 address;
u32 value;
u32 first;
std::string cheat_line;
};
GatewayCheat(std::string name, std::vector<CheatLine> cheat_lines, std::string comments);
~GatewayCheat();
void Execute(Core::System& system) override;
bool IsEnabled() const override;
void SetEnabled(bool enabled) override;
std::string GetComments() const override;
std::string GetName() const override;
std::string GetType() const override;
std::string ToString() const override;
/// Gateway cheats look like:
/// [Name]
/// 12345678 90ABCDEF
/// 12345678 90ABCDEF
/// (there might be multiple lines of those hex numbers)
/// Comment lines start with a '*'
/// This function will pares the file for such structures
static std::vector<std::unique_ptr<CheatBase>> LoadFile(const std::string& filepath);
private:
std::atomic<bool> enabled = false;
const std::string name;
const std::vector<CheatLine> cheat_lines;
const std::string comments;
};
} // namespace Cheats