mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Cheat menu access from gameScreen + minor bugfix +
Invalidate JIT for 0xE/0xD checks And big thanks to [Unknown] for help:3
This commit is contained in:
parent
0519b3ef79
commit
778c518a37
7 changed files with 54 additions and 19 deletions
|
@ -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<std::string> makeCodeParts(const std::vector<std::stri
|
|||
return finalList;
|
||||
}
|
||||
|
||||
void CWCheatEngine::CreateCheatFile() {
|
||||
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\n", 1, 4, f);
|
||||
fclose(f);
|
||||
}
|
||||
if (!File::Exists(activeCheatFile)) {
|
||||
I18NCategory *err = GetI18NCategory("Error");
|
||||
host->NotifyUserMessage(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<std::string> CWCheatEngine::GetCodesList() { //Reads the entire cheat list from the appropriate .ini.
|
||||
std::vector<std::string> CWCheatEngine::GetCodesList(std::string file) { //Reads the entire cheat list from the appropriate .ini.
|
||||
if (file.empty()) {
|
||||
file = activeCheatFile;
|
||||
}
|
||||
std::string line;
|
||||
std::vector<std::string> 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;
|
||||
|
|
|
@ -21,8 +21,9 @@ bool CheatsInEffect();
|
|||
class CWCheatEngine {
|
||||
public:
|
||||
CWCheatEngine();
|
||||
std::vector<std::string> GetCodesList();
|
||||
std::vector<std::string> GetCodesList(std::string file = "");
|
||||
void CreateCodeList();
|
||||
void CreateCheatFile();
|
||||
void Exit();
|
||||
void Run();
|
||||
std::vector<int> GetNextCode();
|
||||
|
|
|
@ -40,10 +40,23 @@ static bool enableAll = false;
|
|||
static std::vector<std::string> cheatList;
|
||||
static CWCheatEngine *cheatEngine2;
|
||||
static std::deque<bool> 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++) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -55,6 +55,7 @@ private:
|
|||
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_;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue