diff --git a/Core/CwCheat.cpp b/Core/CwCheat.cpp index d3a1474c6ce2..6ef40c749894 100644 --- a/Core/CwCheat.cpp +++ b/Core/CwCheat.cpp @@ -39,20 +39,8 @@ 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")); - } - + if (gameTitle != "") { //this only generates ini files on boot, let's leave homebrew ini file for UI + cheatEngine->CreateCheatFile(); } cheatEngine = new CWCheatEngine(); @@ -153,6 +141,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; @@ -595,6 +601,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 +721,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..be8b27be9f02 100644 --- a/Core/CwCheat.h +++ b/Core/CwCheat.h @@ -23,6 +23,7 @@ class CWCheatEngine { CWCheatEngine(); std::vector GetCodesList(); void CreateCodeList(); + void CreateCheatFile(); void Exit(); void Run(); std::vector GetNextCode(); diff --git a/UI/CwCheatScreen.cpp b/UI/CwCheatScreen.cpp index 7f6481709c75..23c55effead2 100644 --- a/UI/CwCheatScreen.cpp +++ b/UI/CwCheatScreen.cpp @@ -40,10 +40,36 @@ 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"); + } + std::size_t lslash = gamePath_.find_last_of("/"); + std::size_t lastdot = gamePath_.find_last_of("."); + std::string extension = gamePath_.substr(lastdot + 1); + for (int i = 0; i < extension.size(); i++) { + extension[i] = tolower(extension[i]); + } + if (extension != "iso" && extension != "cso" && extension != "pbp" || gameTitle == "") { + if (extension == "elf") { + gameTitle = "ELF000000"; + } else { + gameTitle = gamePath_.substr(lslash + 1); + } + } cheatEngine2 = new CWCheatEngine(); + cheatEngine2->CreateCheatFile(); cheatList = cheatEngine2->GetCodesList(); + bEnableCheat.clear(); formattedList_.clear(); for (size_t i = 0; i < cheatList.size(); i++) { @@ -201,6 +227,10 @@ UI::EventReturn CwCheatScreen::OnEditCheatFile(UI::EventParams ¶ms) { } UI::EventReturn CwCheatScreen::OnImportCheat(UI::EventParams ¶ms) { + if (gameTitle.length() != 9) { + WARN_LOG(COMMON, "CWCHEAT: Incorrect ID(%s) - can't import cheats.", gameTitle.c_str()); + return UI::EVENT_DONE; + } std::string line; std::vector title; bool finished = false, skip = false; 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; }