Files
ppsspp/UI/CwCheatScreen.h
Henrik RydgårdandClaude Opus 5 9d62a3c4b0 Support PSPAR/TempAR folder and comment codes in cheat files
These _M 0xCF00000n lines carry no memory operations - they group the
entries that follow them into folders, or turn them into comments. We
used to reject them as unsupported TempAR codes, so files using them
showed parse errors and listed the folder headings as toggleable
cheats that did nothing.

Folders now render like the existing cheat titles with their contents
indented, comments render as plain text, and enabling an entry in a
single select folder turns off its siblings.

Fixes #21257

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01JvJR8oJNSCimCM9KXVLjfq
2026-09-03 12:37:31 -06:00

100 lines
3.0 KiB
C++

// Copyright (c) 2013- PPSSPP Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0 or later versions.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
#pragma once
#include <cstdint>
#include <functional>
#include "Common/UI/View.h"
#include "Common/UI/UIScreen.h"
#include "Common/UI/Context.h"
#include "UI/BaseScreens.h"
#include "UI/SimpleDialogScreen.h"
#include "UI/MiscViews.h"
#include "Common/Net/HTTPClient.h"
struct CheatFileInfo;
class CWCheatEngine;
class NoticeView;
class CwCheatScreen : public UITwoPaneBaseDialogScreen {
public:
CwCheatScreen(const Path &gamePath);
~CwCheatScreen();
bool TryLoadCheatInfo();
void OnAddCheat(UI::EventParams &params);
void OnImportCheat(UI::EventParams &params);
void OnImportBrowse(UI::EventParams &params);
void OnEditCheatFile(UI::EventParams &params);
void OnDisableAll(UI::EventParams &params);
void update() override;
bool key(const KeyInput &input) override;
void onFinish(DialogResult result) override;
const char *tag() const override { return "CwCheat"; }
bool WantsTextInput() const override;
protected:
void BeforeCreateViews() override;
void CreateSettingsViews(UI::ViewGroup *) override;
void CreateContentViews(UI::ViewGroup *) override;
std::string_view GetTitle() const override;
void dialogFinished(const Screen *dialog, DialogResult result) override;
private:
void OnCheckBox(int index);
bool ImportCheats(const Path &cheatFile, int *cheatsFound);
void ImportAndReport(const Path &cheatFile);
enum { INDEX_ALL = -1 };
bool HasCheatWithName(const std::string &name);
bool RebuildCheatFile(int index);
// Works out the folder/comment nesting from the PSPAR structure codes in fileInfo_.
void ComputeCheatLayout();
struct CheatLayout {
int depth = 0; // How deep in folders, for indentation.
bool isComment = false; // Show as text rather than a checkbox.
bool isFolder = false; // This entry is a folder header.
int singleSelectParent = -1; // Enclosing single-select folder, if any.
};
std::vector<CheatLayout> layout_;
CWCheatEngine *engine_ = nullptr;
std::vector<CheatFileInfo> fileInfo_;
std::string gameID_;
int fileCheckCounter_ = 0;
uint64_t fileCheckHash_ = 0;
std::string errorMessage_;
NoticeLevel errorLevel_ = NoticeLevel::ERROR;
std::string errorDetails_;
UI::ViewGroup *cheatList_ = nullptr;
ViewSearch search_;
std::shared_ptr<http::Request> downloadRequest_;
};