mirror of https://github.com/PCSX2/pcsx2.git
Since we don't have a proper cheating system in pcsx2 yet, we're going back to the pnach system for game cheats.
This means you can put your cheats in "\cheats\*.pnach" and pcsx2 will read them from there. Notes: I have included some persona 4 cheats as an example in this commit... Also note that currently the "Enable Patches" menu item also pertains to cheats (as well as database file patches). I will add a separate "Enable Cheats" menu item in the future... git-svn-id: http://pcsx2.googlecode.com/svn/trunk@3030 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
16dfd5c9fc
commit
9c9769c380
|
@ -0,0 +1,15 @@
|
||||||
|
comment=Persona 4 Cheats
|
||||||
|
|
||||||
|
// Max Courage
|
||||||
|
//patch=1,EE,007973F4,word,000000FF
|
||||||
|
|
||||||
|
// Inf Money
|
||||||
|
//patch=1,EE,2079B68C,word,05F5E0FF
|
||||||
|
|
||||||
|
// Inf Health
|
||||||
|
patch=1,EE,207973CC,word,000003E7
|
||||||
|
patch=1,EE,007973CC,word,000003E7
|
||||||
|
|
||||||
|
// Inf Spirit
|
||||||
|
patch=1,EE,207973CE,word,000003E7
|
||||||
|
patch=1,EE,007973CE,word,000003E7
|
|
@ -373,6 +373,8 @@ static wxString compatToStringWX(int compat) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load Game Settings found in database
|
||||||
|
// (game fixes, round modes, clamp modes, etc...)
|
||||||
static void loadGameSettings(DataBase_Loader* gameDB) {
|
static void loadGameSettings(DataBase_Loader* gameDB) {
|
||||||
if (gameDB && gameDB->gameLoaded()) {
|
if (gameDB && gameDB->gameLoaded()) {
|
||||||
SSE_MXCSR eeMX = EmuConfig.Cpu.sseMXCSR;
|
SSE_MXCSR eeMX = EmuConfig.Cpu.sseMXCSR;
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "IopCommon.h"
|
#include "IopCommon.h"
|
||||||
#include "Patch.h"
|
#include "Patch.h"
|
||||||
#include "DataBase_Loader.h"
|
#include "DataBase_Loader.h"
|
||||||
|
#include <wx/textfile.h>
|
||||||
|
|
||||||
IniPatch Patch[ MAX_PATCH ];
|
IniPatch Patch[ MAX_PATCH ];
|
||||||
|
|
||||||
|
@ -409,28 +410,26 @@ void inifile_command( const wxString& cmd )
|
||||||
int code = PatchTableExecute( set, commands );
|
int code = PatchTableExecute( set, commands );
|
||||||
}
|
}
|
||||||
|
|
||||||
// This routine recieves a file from inifile_read, trims it,
|
// This routine receives a string containing patches, trims it,
|
||||||
// Then sends the command to be parsed.
|
// Then sends the command to be parsed.
|
||||||
void inifile_process(string& s)
|
void TrimPatches(string& s)
|
||||||
{
|
{
|
||||||
String_Stream ss(s);
|
String_Stream ss(s);
|
||||||
wxString buff;
|
wxString buff;
|
||||||
while (!ss.finished())
|
while (!ss.finished()) {
|
||||||
{
|
|
||||||
buff = ss.getLineWX();
|
buff = ss.getLineWX();
|
||||||
//Console.Error("%s", buff.ToAscii());
|
inifile_trim(buff);
|
||||||
inifile_trim(buff);
|
if (!buff.IsEmpty()) inifile_command(buff);
|
||||||
if (!buff.IsEmpty()) inifile_command(buff);
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// This routine creates a pnach filename from the games crc,
|
// This routine loads patches from the game database
|
||||||
// loads it, trims the commands, and sends them to be parsed.
|
// Returns number of patches loaded
|
||||||
void inifile_read(const wxString& name )
|
int InitPatches(const wxString& name)
|
||||||
{
|
{
|
||||||
bool patchFound = false;
|
bool patchFound = false;
|
||||||
string patch;
|
string patch;
|
||||||
string crc = string(name.ToAscii());
|
string crc = string(name.ToUTF8().data());
|
||||||
patchnumber = 0;
|
patchnumber = 0;
|
||||||
|
|
||||||
if (GameDB && GameDB->gameLoaded()) {
|
if (GameDB && GameDB->gameLoaded()) {
|
||||||
|
@ -446,9 +445,55 @@ void inifile_read(const wxString& name )
|
||||||
|
|
||||||
if (patchFound) {
|
if (patchFound) {
|
||||||
Console.WriteLn(Color_Green, "Patch found!");
|
Console.WriteLn(Color_Green, "Patch found!");
|
||||||
inifile_process(patch);
|
TrimPatches(patch);
|
||||||
}
|
}
|
||||||
else Console.WriteLn(Color_Gray, "No patch found. Resuming execution without a patch (this is NOT an error).");
|
else Console.WriteLn(Color_Gray, "No patch found. Resuming execution without a patch (this is NOT an error).");
|
||||||
|
|
||||||
|
Console.WriteLn("Patches Loaded: %d", patchnumber);
|
||||||
|
return patchnumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This routine receives a file from inifile_read, trims it,
|
||||||
|
// Then sends the command to be parsed.
|
||||||
|
void inifile_process(wxTextFile &f1 )
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < f1.GetLineCount(); i++)
|
||||||
|
{
|
||||||
|
inifile_trim(f1[i]);
|
||||||
|
if (!f1[i].IsEmpty()) inifile_command(f1[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This routine loads cheats from *.pnach files
|
||||||
|
// Returns number of cheats loaded
|
||||||
|
// Note: Should be called after InitPatches()
|
||||||
|
int InitCheats(const wxString& name)
|
||||||
|
{
|
||||||
|
wxTextFile f1;
|
||||||
|
wxString buffer;
|
||||||
|
int cheatsNumber = patchnumber;
|
||||||
|
|
||||||
|
// FIXME : We need to add a 'cheats' folder to the AppConfig, and use that instead. --air
|
||||||
|
|
||||||
|
buffer = Path::Combine(L"cheats", name + L".pnach");
|
||||||
|
|
||||||
|
if(!f1.Open(buffer) && wxFileName::IsCaseSensitive())
|
||||||
|
{
|
||||||
|
f1.Open( Path::Combine(L"cheats", name.Upper() + L".pnach") );
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!f1.IsOpened())
|
||||||
|
{
|
||||||
|
Console.WriteLn( Color_Gray, "No cheats found. Resuming execution without cheats..." );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLn( Color_Green, "Cheats found!");
|
||||||
|
inifile_process( f1 );
|
||||||
|
|
||||||
|
cheatsNumber = patchnumber - cheatsNumber;
|
||||||
|
Console.WriteLn("Cheats Loaded: %d", cheatsNumber);
|
||||||
|
return cheatsNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _ApplyPatch(IniPatch *p)
|
void _ApplyPatch(IniPatch *p)
|
||||||
|
@ -526,13 +571,6 @@ void ApplyPatch(int place)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int InitPatch(const wxString& crc)
|
|
||||||
{
|
|
||||||
inifile_read(crc);
|
|
||||||
Console.WriteLn("patchnumber: %d", patchnumber);
|
|
||||||
return patchnumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResetPatch( void )
|
void ResetPatch( void )
|
||||||
{
|
{
|
||||||
patchnumber = 0;
|
patchnumber = 0;
|
||||||
|
@ -611,9 +649,11 @@ namespace PatchFunc
|
||||||
|
|
||||||
void gametitle( const wxString& text1, const wxString& text2 )
|
void gametitle( const wxString& text1, const wxString& text2 )
|
||||||
{
|
{
|
||||||
Console.WriteLn( L"gametitle: " + text2 );
|
// Setting Game Title through patches is obsolete now
|
||||||
strgametitle = text2;
|
// Use database instead!
|
||||||
Console.SetTitle( strgametitle );
|
//Console.WriteLn( L"gametitle: " + text2 );
|
||||||
|
//strgametitle = text2;
|
||||||
|
//Console.SetTitle( strgametitle );
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PatchPieces
|
struct PatchPieces
|
||||||
|
|
|
@ -55,12 +55,12 @@ namespace PatchFunc
|
||||||
PATCHTABLEFUNC roundmode;
|
PATCHTABLEFUNC roundmode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void inifile_read( const wxString& name );
|
int InitCheats(const wxString& name);
|
||||||
void inifile_command( const wxString& cmd );
|
void inifile_command(const wxString& cmd);
|
||||||
void inifile_trim( wxString& buffer );
|
void inifile_trim(wxString& buffer);
|
||||||
|
|
||||||
int InitPatch(const wxString& crc);
|
int InitPatches(const wxString& name);
|
||||||
int AddPatch(int Mode, int Place, int Address, int Size, u64 data);
|
int AddPatch(int Mode, int Place, int Address, int Size, u64 data);
|
||||||
void ApplyPatch( int place = 1);
|
void ApplyPatch( int place = 1);
|
||||||
void ResetPatch( void );
|
void ResetPatch( void );
|
||||||
|
|
||||||
|
|
|
@ -582,6 +582,7 @@ void __fastcall eeGameStarting()
|
||||||
wxString gameSerial = L" [" + DiscID + L"]";
|
wxString gameSerial = L" [" + DiscID + L"]";
|
||||||
wxString gameCompat = L" [Status = Unknown]";
|
wxString gameCompat = L" [Status = Unknown]";
|
||||||
wxString gamePatch = L"";
|
wxString gamePatch = L"";
|
||||||
|
wxString gameCheats = L"";
|
||||||
|
|
||||||
if (GameDB && GameDB->gameLoaded()) {
|
if (GameDB && GameDB->gameLoaded()) {
|
||||||
int compat = GameDB->getInt("Compat");
|
int compat = GameDB->getInt("Compat");
|
||||||
|
@ -591,15 +592,24 @@ void __fastcall eeGameStarting()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EmuConfig.EnablePatches) {
|
if (EmuConfig.EnablePatches) {
|
||||||
int patches = InitPatch(gameCRC);
|
int patches = InitPatches(gameCRC);
|
||||||
if (patches) {
|
if (patches) {
|
||||||
wxString pString( wxsFormat( L"%d", patches ) );
|
wxString pString( wxsFormat( L"%d", patches ) );
|
||||||
gamePatch = L" [Patches = " + pString + L"]";
|
gamePatch = L" [Patches = " + pString + L"]";
|
||||||
}
|
}
|
||||||
loadGameSettings(GameDB);
|
loadGameSettings(GameDB);
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.SetTitle(gameName + gameSerial + gameCompat + gamePatch);
|
// ToDo: EmuConfig.EnableCheats option...
|
||||||
|
if (EmuConfig.EnablePatches) {
|
||||||
|
int cheats = InitCheats(gameCRC);
|
||||||
|
if (cheats) {
|
||||||
|
wxString cString( wxsFormat( L"%d", cheats ) );
|
||||||
|
gameCheats = L" [Cheats = " + cString + L"]";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.SetTitle(gameName + gameSerial + gameCompat + gamePatch + gameCheats);
|
||||||
|
|
||||||
GetMTGS().SendGameCRC(ElfCRC);
|
GetMTGS().SendGameCRC(ElfCRC);
|
||||||
g_GameStarted = true;
|
g_GameStarted = true;
|
||||||
|
|
Loading…
Reference in New Issue