diff --git a/Core/CwCheat.cpp b/Core/CwCheat.cpp index d3a1474c6ce2..b524eda8a6a1 100644 --- a/Core/CwCheat.cpp +++ b/Core/CwCheat.cpp @@ -39,21 +39,7 @@ static void __CheatStart() { gameTitle = g_paramSFO.GetValueString("DISC_ID"); - activeCheatFile = GetSysDirectory(DIRECTORY_CHEATS) + gameTitle + ".ini"; - File::CreateFullPath(GetSysDirectory(DIRECTORY_CHEATS)); - - if (!File::Exists(activeCheatFile)) { - FILE *f = File::OpenCFile(activeCheatFile, "wb"); - if (f) { - fwrite("\xEF\xBB\xBF", 1, 3, f); - fclose(f); - } - if (!File::Exists(activeCheatFile)) { - I18NCategory *err = GetI18NCategory("Error"); - host->NotifyUserMessage(err->T("Unable to create cheat file, disk may be full")); - } - - } + cheatEngine->CreateCheatFile(); cheatEngine = new CWCheatEngine(); cheatEngine->CreateCodeList(); @@ -153,6 +139,24 @@ static inline std::vector makeCodeParts(const std::vectorNotifyUserMessage(err->T("Unable to create cheat file, disk may be full")); + } + + } +} + void CWCheatEngine::CreateCodeList() { //Creates code list to be used in function GetNextCode initialCodesList = GetCodesList(); std::string currentcode, codename; @@ -263,7 +267,10 @@ inline void trim2(std::string& str) { else str.erase(str.begin(), str.end()); } -std::vector CWCheatEngine::GetCodesList() { //Reads the entire cheat list from the appropriate .ini. +std::vector CWCheatEngine::GetCodesList(std::string file) { //Reads the entire cheat list from the appropriate .ini. + if (file.empty()) { + file = activeCheatFile; + } std::string line; std::vector codesList; // Read from INI here #ifdef _WIN32 @@ -595,6 +602,7 @@ void CWCheatEngine::Run() { bool is8Bit = (arg >> 28) == 0x2; addr = GetAddress(comm & 0x0FFFFFFF); if (Memory::IsValidAddress(addr)) { + InvalidateICache(addr, 4); int memoryValue = is8Bit ? Memory::Read_U8(addr) : Memory::Read_U16(addr); int testValue = arg & (is8Bit ? 0xFF : 0xFFFF); bool executeNextLines = false; @@ -714,6 +722,7 @@ void CWCheatEngine::Run() { bool is8Bit = (comm >> 24) == 0xE1; addr = GetAddress(arg & 0x0FFFFFFF); if (Memory::IsValidAddress(addr)) { + InvalidateICache(addr, 4); int memoryValue = is8Bit ? Memory::Read_U8(addr) : Memory::Read_U16(addr); int testValue = comm & (is8Bit ? 0xFF : 0xFFFF); bool executeNextLines = false; diff --git a/Core/CwCheat.h b/Core/CwCheat.h index baf118b0b13b..29463604a617 100644 --- a/Core/CwCheat.h +++ b/Core/CwCheat.h @@ -21,8 +21,9 @@ bool CheatsInEffect(); class CWCheatEngine { public: CWCheatEngine(); - std::vector GetCodesList(); + std::vector GetCodesList(std::string file = ""); void CreateCodeList(); + void CreateCheatFile(); void Exit(); void Run(); std::vector GetNextCode(); diff --git a/UI/CwCheatScreen.cpp b/UI/CwCheatScreen.cpp index 7f6481709c75..53fd336ad26e 100644 --- a/UI/CwCheatScreen.cpp +++ b/UI/CwCheatScreen.cpp @@ -25,6 +25,7 @@ #include "Core/Core.h" #include "Core/Config.h" #include "Core/CwCheat.h" +#include "Core/Host.h" #include "Core/MIPS/JitCommon/JitCommon.h" #include "UI/OnScreenDisplay.h" @@ -40,10 +41,24 @@ static bool enableAll = false; static std::vector cheatList; static CWCheatEngine *cheatEngine2; static std::deque bEnableCheat; +static std::string gamePath_; + + +CwCheatScreen::CwCheatScreen(std::string gamePath) + : UIDialogScreenWithBackground() { + gamePath_ = gamePath; +} void CwCheatScreen::CreateCodeList() { + GameInfo *info = g_gameInfoCache->GetInfo(NULL, gamePath_, 0); + if (info && info->paramSFOLoaded) { + + gameTitle = info->paramSFO.GetValueString("DISC_ID"); + } cheatEngine2 = new CWCheatEngine(); - cheatList = cheatEngine2->GetCodesList(); + cheatEngine2->CreateCheatFile(); + cheatList = cheatEngine2->GetCodesList(activeCheatFile); + bEnableCheat.clear(); formattedList_.clear(); for (size_t i = 0; i < cheatList.size(); i++) { diff --git a/UI/CwCheatScreen.h b/UI/CwCheatScreen.h index dfc8a4d5797e..af4379ad28f3 100644 --- a/UI/CwCheatScreen.h +++ b/UI/CwCheatScreen.h @@ -26,6 +26,7 @@ extern std::string gameTitle; class CwCheatScreen : public UIDialogScreenWithBackground { public: + CwCheatScreen(std::string gamePath); CwCheatScreen() {} void CreateCodeList(); void processFileOn(std::string activatedCheat); diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index b8b3b9fb53bd..2aa40c8dc80a 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -25,6 +25,7 @@ #include "ui/ui_context.h" #include "ui/view.h" #include "ui/viewgroup.h" +#include "UI/CwCheatScreen.h" #include "UI/EmuScreen.h" #include "UI/GameScreen.h" #include "UI/GameSettingsScreen.h" @@ -49,6 +50,7 @@ void GameScreen::CreateViews() { I18NCategory *di = GetI18NCategory("Dialog"); I18NCategory *ga = GetI18NCategory("Game"); + I18NCategory *pa = GetI18NCategory("Pause"); // Information in the top left. // Back button to the bottom left. @@ -113,6 +115,9 @@ void GameScreen::CreateViews() { #ifdef _WIN32 rightColumnItems->Add(new Choice(ga->T("Show In Folder")))->OnClick.Handle(this, &GameScreen::OnShowInFolder); #endif + if (g_Config.bEnableCheats) { + rightColumnItems->Add(new Choice(pa->T("Cheats")))->OnClick.Handle(this, &GameScreen::OnCwCheat); + } } UI::EventReturn GameScreen::OnCreateConfig(UI::EventParams &e) @@ -205,6 +210,11 @@ UI::EventReturn GameScreen::OnShowInFolder(UI::EventParams &e) { return UI::EVENT_DONE; } +UI::EventReturn GameScreen::OnCwCheat(UI::EventParams &e) { + screenManager()->push(new CwCheatScreen(gamePath_)); + return UI::EVENT_DONE; +} + UI::EventReturn GameScreen::OnSwitchBack(UI::EventParams &e) { screenManager()->finishDialog(this, DR_OK); return UI::EVENT_DONE; diff --git a/UI/GameScreen.h b/UI/GameScreen.h index af82cbed96c6..a97e8085699f 100644 --- a/UI/GameScreen.h +++ b/UI/GameScreen.h @@ -55,6 +55,7 @@ class GameScreen : public UIDialogScreenWithGameBackground { UI::EventReturn OnShowInFolder(UI::EventParams &e); UI::EventReturn OnCreateConfig(UI::EventParams &e); UI::EventReturn OnDeleteConfig(UI::EventParams &e); + UI::EventReturn OnCwCheat(UI::EventParams &e); // As we load metadata in the background, we need to be able to update these after the fact. UI::Thin3DTextureView *texvGameIcon_; diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 2f1339089a25..d843e86302f4 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -405,7 +405,7 @@ UI::EventReturn GamePauseScreen::OnRewind(UI::EventParams &e) { } UI::EventReturn GamePauseScreen::OnCwCheat(UI::EventParams &e) { - screenManager()->push(new CwCheatScreen()); + screenManager()->push(new CwCheatScreen(gamePath_)); return UI::EVENT_DONE; }