Add cheats in per game configuration (#6379)
This commit is contained in:
parent
ea649263b7
commit
7327c334ca
|
@ -28,9 +28,6 @@ add_executable(citra-qt
|
||||||
camera/qt_camera_base.h
|
camera/qt_camera_base.h
|
||||||
camera/qt_multimedia_camera.cpp
|
camera/qt_multimedia_camera.cpp
|
||||||
camera/qt_multimedia_camera.h
|
camera/qt_multimedia_camera.h
|
||||||
cheats.cpp
|
|
||||||
cheats.h
|
|
||||||
cheats.ui
|
|
||||||
citra-qt.rc
|
citra-qt.rc
|
||||||
compatdb.cpp
|
compatdb.cpp
|
||||||
compatdb.h
|
compatdb.h
|
||||||
|
@ -88,6 +85,9 @@ add_executable(citra-qt
|
||||||
configuration/configure_web.cpp
|
configuration/configure_web.cpp
|
||||||
configuration/configure_web.h
|
configuration/configure_web.h
|
||||||
configuration/configure_web.ui
|
configuration/configure_web.ui
|
||||||
|
configuration/configure_cheats.cpp
|
||||||
|
configuration/configure_cheats.h
|
||||||
|
configuration/configure_cheats.ui
|
||||||
debugger/console.h
|
debugger/console.h
|
||||||
debugger/console.cpp
|
debugger/console.cpp
|
||||||
debugger/graphics/graphics.cpp
|
debugger/graphics/graphics.cpp
|
||||||
|
|
|
@ -5,16 +5,16 @@
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QTableWidgetItem>
|
#include <QTableWidgetItem>
|
||||||
#include "citra_qt/cheats.h"
|
#include "configure_cheats.h"
|
||||||
#include "core/cheats/cheat_base.h"
|
#include "core/cheats/cheat_base.h"
|
||||||
#include "core/cheats/cheats.h"
|
#include "core/cheats/cheats.h"
|
||||||
#include "core/cheats/gateway_cheat.h"
|
#include "core/cheats/gateway_cheat.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/hle/kernel/process.h"
|
#include "core/hle/kernel/process.h"
|
||||||
#include "ui_cheats.h"
|
#include "ui_configure_cheats.h"
|
||||||
|
|
||||||
CheatDialog::CheatDialog(QWidget* parent)
|
ConfigureCheats::ConfigureCheats(u64 title_id_, QWidget* parent)
|
||||||
: QDialog(parent), ui(std::make_unique<Ui::CheatDialog>()) {
|
: QWidget(parent), ui(std::make_unique<Ui::ConfigureCheats>()), title_id{title_id_} {
|
||||||
// Setup gui control settings
|
// Setup gui control settings
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
ui->tableCheats->setColumnWidth(0, 30);
|
ui->tableCheats->setColumnWidth(0, 30);
|
||||||
|
@ -25,28 +25,26 @@ CheatDialog::CheatDialog(QWidget* parent)
|
||||||
ui->lineName->setEnabled(false);
|
ui->lineName->setEnabled(false);
|
||||||
ui->textCode->setEnabled(false);
|
ui->textCode->setEnabled(false);
|
||||||
ui->textNotes->setEnabled(false);
|
ui->textNotes->setEnabled(false);
|
||||||
const auto game_id = fmt::format(
|
|
||||||
"{:016X}", Core::System::GetInstance().Kernel().GetCurrentProcess()->codeset->program_id);
|
|
||||||
ui->labelTitle->setText(tr("Title ID: %1").arg(QString::fromStdString(game_id)));
|
|
||||||
|
|
||||||
connect(ui->buttonClose, &QPushButton::clicked, this, &CheatDialog::OnCancel);
|
connect(ui->buttonAddCheat, &QPushButton::clicked, this, &ConfigureCheats::OnAddCheat);
|
||||||
connect(ui->buttonAddCheat, &QPushButton::clicked, this, &CheatDialog::OnAddCheat);
|
connect(ui->tableCheats, &QTableWidget::cellClicked, this, &ConfigureCheats::OnRowSelected);
|
||||||
connect(ui->tableCheats, &QTableWidget::cellClicked, this, &CheatDialog::OnRowSelected);
|
connect(ui->lineName, &QLineEdit::textEdited, this, &ConfigureCheats::OnTextEdited);
|
||||||
connect(ui->lineName, &QLineEdit::textEdited, this, &CheatDialog::OnTextEdited);
|
connect(ui->textNotes, &QPlainTextEdit::textChanged, this, &ConfigureCheats::OnTextEdited);
|
||||||
connect(ui->textNotes, &QPlainTextEdit::textChanged, this, &CheatDialog::OnTextEdited);
|
connect(ui->textCode, &QPlainTextEdit::textChanged, this, &ConfigureCheats::OnTextEdited);
|
||||||
connect(ui->textCode, &QPlainTextEdit::textChanged, this, &CheatDialog::OnTextEdited);
|
|
||||||
|
|
||||||
connect(ui->buttonSave, &QPushButton::clicked, this,
|
connect(ui->buttonSave, &QPushButton::clicked, this,
|
||||||
[this] { SaveCheat(ui->tableCheats->currentRow()); });
|
[this] { SaveCheat(ui->tableCheats->currentRow()); });
|
||||||
connect(ui->buttonDelete, &QPushButton::clicked, this, &CheatDialog::OnDeleteCheat);
|
connect(ui->buttonDelete, &QPushButton::clicked, this, &ConfigureCheats::OnDeleteCheat);
|
||||||
|
|
||||||
|
cheat_engine = std::make_unique<Cheats::CheatEngine>(title_id, Core::System::GetInstance());
|
||||||
|
|
||||||
LoadCheats();
|
LoadCheats();
|
||||||
}
|
}
|
||||||
|
|
||||||
CheatDialog::~CheatDialog() = default;
|
ConfigureCheats::~ConfigureCheats() = default;
|
||||||
|
|
||||||
void CheatDialog::LoadCheats() {
|
void ConfigureCheats::LoadCheats() {
|
||||||
cheats = Core::System::GetInstance().CheatEngine().GetCheats();
|
cheats = cheat_engine->GetCheats();
|
||||||
const int cheats_count = static_cast<int>(cheats.size());
|
const int cheats_count = static_cast<int>(cheats.size());
|
||||||
|
|
||||||
ui->tableCheats->setRowCount(cheats_count);
|
ui->tableCheats->setRowCount(cheats_count);
|
||||||
|
@ -63,11 +61,11 @@ void CheatDialog::LoadCheats() {
|
||||||
i, 2, new QTableWidgetItem(QString::fromStdString(cheats[i]->GetType())));
|
i, 2, new QTableWidgetItem(QString::fromStdString(cheats[i]->GetType())));
|
||||||
enabled->setProperty("row", static_cast<int>(i));
|
enabled->setProperty("row", static_cast<int>(i));
|
||||||
|
|
||||||
connect(enabled, &QCheckBox::stateChanged, this, &CheatDialog::OnCheckChanged);
|
connect(enabled, &QCheckBox::stateChanged, this, &ConfigureCheats::OnCheckChanged);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CheatDialog::CheckSaveCheat() {
|
bool ConfigureCheats::CheckSaveCheat() {
|
||||||
auto answer = QMessageBox::warning(
|
auto answer = QMessageBox::warning(
|
||||||
this, tr("Cheats"), tr("Would you like to save the current cheat?"),
|
this, tr("Cheats"), tr("Would you like to save the current cheat?"),
|
||||||
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Cancel);
|
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Cancel);
|
||||||
|
@ -79,7 +77,7 @@ bool CheatDialog::CheckSaveCheat() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CheatDialog::SaveCheat(int row) {
|
bool ConfigureCheats::SaveCheat(int row) {
|
||||||
if (ui->lineName->text().isEmpty()) {
|
if (ui->lineName->text().isEmpty()) {
|
||||||
QMessageBox::critical(this, tr("Save Cheat"), tr("Please enter a cheat name."));
|
QMessageBox::critical(this, tr("Save Cheat"), tr("Please enter a cheat name."));
|
||||||
return false;
|
return false;
|
||||||
|
@ -110,12 +108,12 @@ bool CheatDialog::SaveCheat(int row) {
|
||||||
ui->textNotes->toPlainText().toStdString());
|
ui->textNotes->toPlainText().toStdString());
|
||||||
|
|
||||||
if (newly_created) {
|
if (newly_created) {
|
||||||
Core::System::GetInstance().CheatEngine().AddCheat(cheat);
|
cheat_engine->AddCheat(cheat);
|
||||||
newly_created = false;
|
newly_created = false;
|
||||||
} else {
|
} else {
|
||||||
Core::System::GetInstance().CheatEngine().UpdateCheat(row, cheat);
|
cheat_engine->UpdateCheat(row, cheat);
|
||||||
}
|
}
|
||||||
Core::System::GetInstance().CheatEngine().SaveCheatFile();
|
cheat_engine->SaveCheatFile();
|
||||||
|
|
||||||
int previous_row = ui->tableCheats->currentRow();
|
int previous_row = ui->tableCheats->currentRow();
|
||||||
int previous_col = ui->tableCheats->currentColumn();
|
int previous_col = ui->tableCheats->currentColumn();
|
||||||
|
@ -128,19 +126,7 @@ bool CheatDialog::SaveCheat(int row) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheatDialog::closeEvent(QCloseEvent* event) {
|
void ConfigureCheats::OnRowSelected(int row, int column) {
|
||||||
if (edited && !CheckSaveCheat()) {
|
|
||||||
event->ignore();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
event->accept();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CheatDialog::OnCancel() {
|
|
||||||
close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CheatDialog::OnRowSelected(int row, int column) {
|
|
||||||
if (row == last_row) {
|
if (row == last_row) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -173,25 +159,24 @@ void CheatDialog::OnRowSelected(int row, int column) {
|
||||||
last_col = column;
|
last_col = column;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheatDialog::OnCheckChanged(int state) {
|
void ConfigureCheats::OnCheckChanged(int state) {
|
||||||
const QCheckBox* checkbox = qobject_cast<QCheckBox*>(sender());
|
const QCheckBox* checkbox = qobject_cast<QCheckBox*>(sender());
|
||||||
int row = static_cast<int>(checkbox->property("row").toInt());
|
int row = static_cast<int>(checkbox->property("row").toInt());
|
||||||
cheats[row]->SetEnabled(state);
|
cheats[row]->SetEnabled(state);
|
||||||
Core::System::GetInstance().CheatEngine().SaveCheatFile();
|
cheat_engine->SaveCheatFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheatDialog::OnTextEdited() {
|
void ConfigureCheats::OnTextEdited() {
|
||||||
edited = true;
|
edited = true;
|
||||||
ui->buttonSave->setEnabled(true);
|
ui->buttonSave->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheatDialog::OnDeleteCheat() {
|
void ConfigureCheats::OnDeleteCheat() {
|
||||||
if (newly_created) {
|
if (newly_created) {
|
||||||
newly_created = false;
|
newly_created = false;
|
||||||
} else {
|
} else {
|
||||||
auto& cheat_engine = Core::System::GetInstance().CheatEngine();
|
cheat_engine->RemoveCheat(ui->tableCheats->currentRow());
|
||||||
cheat_engine.RemoveCheat(ui->tableCheats->currentRow());
|
cheat_engine->SaveCheatFile();
|
||||||
cheat_engine.SaveCheatFile();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadCheats();
|
LoadCheats();
|
||||||
|
@ -221,7 +206,14 @@ void CheatDialog::OnDeleteCheat() {
|
||||||
ui->buttonAddCheat->setEnabled(true);
|
ui->buttonAddCheat->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheatDialog::OnAddCheat() {
|
bool ConfigureCheats::ApplyConfiguration() {
|
||||||
|
if (edited) {
|
||||||
|
return SaveCheat(ui->tableCheats->currentRow());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureCheats::OnAddCheat() {
|
||||||
if (edited && !CheckSaveCheat()) {
|
if (edited && !CheckSaveCheat()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
|
@ -5,22 +5,24 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <QDialog>
|
#include "common/common_types.h"
|
||||||
|
|
||||||
namespace Cheats {
|
namespace Cheats {
|
||||||
class CheatBase;
|
class CheatBase;
|
||||||
}
|
class CheatEngine;
|
||||||
|
} // namespace Cheats
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class CheatDialog;
|
class ConfigureCheats;
|
||||||
} // namespace Ui
|
} // namespace Ui
|
||||||
|
|
||||||
class CheatDialog : public QDialog {
|
class ConfigureCheats : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit CheatDialog(QWidget* parent = nullptr);
|
explicit ConfigureCheats(u64 title_id_, QWidget* parent = nullptr);
|
||||||
~CheatDialog();
|
~ConfigureCheats();
|
||||||
|
bool ApplyConfiguration();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
|
@ -42,10 +44,7 @@ private:
|
||||||
*/
|
*/
|
||||||
bool SaveCheat(int row);
|
bool SaveCheat(int row);
|
||||||
|
|
||||||
void closeEvent(QCloseEvent* event) override;
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void OnCancel();
|
|
||||||
void OnRowSelected(int row, int column);
|
void OnRowSelected(int row, int column);
|
||||||
void OnCheckChanged(int state);
|
void OnCheckChanged(int state);
|
||||||
void OnTextEdited();
|
void OnTextEdited();
|
||||||
|
@ -53,8 +52,10 @@ private slots:
|
||||||
void OnAddCheat();
|
void OnAddCheat();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<Ui::CheatDialog> ui;
|
std::unique_ptr<Ui::ConfigureCheats> ui;
|
||||||
std::vector<std::shared_ptr<Cheats::CheatBase>> cheats;
|
std::vector<std::shared_ptr<Cheats::CheatBase>> cheats;
|
||||||
bool edited = false, newly_created = false;
|
bool edited = false, newly_created = false;
|
||||||
int last_row = -1, last_col = -1;
|
int last_row = -1, last_col = -1;
|
||||||
|
u64 title_id;
|
||||||
|
std::unique_ptr<Cheats::CheatEngine> cheat_engine;
|
||||||
};
|
};
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<ui version="4.0">
|
<ui version="4.0">
|
||||||
<class>CheatDialog</class>
|
<class>ConfigureCheats</class>
|
||||||
<widget class="QDialog" name="CheatDialog">
|
<widget class="QWidget" name="ConfigureCheats">
|
||||||
<property name="windowModality">
|
<property name="windowModality">
|
||||||
<enum>Qt::ApplicationModal</enum>
|
<enum>Qt::ApplicationModal</enum>
|
||||||
</property>
|
</property>
|
||||||
|
@ -25,18 +25,6 @@
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout">
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="labelTitle">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>10</pointsize>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Title ID:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
|
@ -208,13 +196,6 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="buttonClose">
|
|
||||||
<property name="text">
|
|
||||||
<string>Close</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
@ -227,7 +208,6 @@
|
||||||
<tabstop>textCode</tabstop>
|
<tabstop>textCode</tabstop>
|
||||||
<tabstop>buttonSave</tabstop>
|
<tabstop>buttonSave</tabstop>
|
||||||
<tabstop>buttonDelete</tabstop>
|
<tabstop>buttonDelete</tabstop>
|
||||||
<tabstop>buttonClose</tabstop>
|
|
||||||
</tabstops>
|
</tabstops>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
|
@ -9,6 +9,7 @@
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include "citra_qt/configuration/config.h"
|
#include "citra_qt/configuration/config.h"
|
||||||
#include "citra_qt/configuration/configure_audio.h"
|
#include "citra_qt/configuration/configure_audio.h"
|
||||||
|
#include "citra_qt/configuration/configure_cheats.h"
|
||||||
#include "citra_qt/configuration/configure_debug.h"
|
#include "citra_qt/configuration/configure_debug.h"
|
||||||
#include "citra_qt/configuration/configure_enhancements.h"
|
#include "citra_qt/configuration/configure_enhancements.h"
|
||||||
#include "citra_qt/configuration/configure_general.h"
|
#include "citra_qt/configuration/configure_general.h"
|
||||||
|
@ -35,6 +36,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const QString
|
||||||
graphics_tab = std::make_unique<ConfigureGraphics>(this);
|
graphics_tab = std::make_unique<ConfigureGraphics>(this);
|
||||||
system_tab = std::make_unique<ConfigureSystem>(this);
|
system_tab = std::make_unique<ConfigureSystem>(this);
|
||||||
debug_tab = std::make_unique<ConfigureDebug>(this);
|
debug_tab = std::make_unique<ConfigureDebug>(this);
|
||||||
|
cheat_tab = std::make_unique<ConfigureCheats>(title_id, this);
|
||||||
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
@ -44,6 +46,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const QString
|
||||||
ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics"));
|
ui->tabWidget->addTab(graphics_tab.get(), tr("Graphics"));
|
||||||
ui->tabWidget->addTab(audio_tab.get(), tr("Audio"));
|
ui->tabWidget->addTab(audio_tab.get(), tr("Audio"));
|
||||||
ui->tabWidget->addTab(debug_tab.get(), tr("Debug"));
|
ui->tabWidget->addTab(debug_tab.get(), tr("Debug"));
|
||||||
|
ui->tabWidget->addTab(cheat_tab.get(), tr("Cheats"));
|
||||||
|
|
||||||
setFocusPolicy(Qt::ClickFocus);
|
setFocusPolicy(Qt::ClickFocus);
|
||||||
setWindowTitle(tr("Properties"));
|
setWindowTitle(tr("Properties"));
|
||||||
|
@ -60,6 +63,9 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const QString
|
||||||
connect(ui->button_reset_per_game, &QPushButton::clicked, this,
|
connect(ui->button_reset_per_game, &QPushButton::clicked, this,
|
||||||
&ConfigurePerGame::ResetDefaults);
|
&ConfigurePerGame::ResetDefaults);
|
||||||
|
|
||||||
|
connect(ui->buttonBox, &QDialogButtonBox::accepted, this,
|
||||||
|
&ConfigurePerGame::HandleAcceptedEvent);
|
||||||
|
|
||||||
LoadConfiguration();
|
LoadConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,6 +87,13 @@ void ConfigurePerGame::ResetDefaults() {
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConfigurePerGame::HandleAcceptedEvent() {
|
||||||
|
if (ui->tabWidget->currentWidget() == cheat_tab.get()) {
|
||||||
|
cheat_tab->ApplyConfiguration();
|
||||||
|
}
|
||||||
|
accept();
|
||||||
|
}
|
||||||
|
|
||||||
void ConfigurePerGame::ApplyConfiguration() {
|
void ConfigurePerGame::ApplyConfiguration() {
|
||||||
general_tab->ApplyConfiguration();
|
general_tab->ApplyConfiguration();
|
||||||
system_tab->ApplyConfiguration();
|
system_tab->ApplyConfiguration();
|
||||||
|
@ -109,6 +122,9 @@ void ConfigurePerGame::RetranslateUI() {
|
||||||
|
|
||||||
void ConfigurePerGame::HandleApplyButtonClicked() {
|
void ConfigurePerGame::HandleApplyButtonClicked() {
|
||||||
ApplyConfiguration();
|
ApplyConfiguration();
|
||||||
|
if (ui->tabWidget->currentWidget() == cheat_tab.get()) {
|
||||||
|
cheat_tab->ApplyConfiguration();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static QPixmap GetQPixmapFromSMDH(std::vector<u8>& smdh_data) {
|
static QPixmap GetQPixmapFromSMDH(std::vector<u8>& smdh_data) {
|
||||||
|
|
|
@ -19,6 +19,7 @@ class ConfigureEnhancements;
|
||||||
class ConfigureGraphics;
|
class ConfigureGraphics;
|
||||||
class ConfigureSystem;
|
class ConfigureSystem;
|
||||||
class ConfigureDebug;
|
class ConfigureDebug;
|
||||||
|
class ConfigureCheats;
|
||||||
|
|
||||||
class QGraphicsScene;
|
class QGraphicsScene;
|
||||||
class QStandardItem;
|
class QStandardItem;
|
||||||
|
@ -51,6 +52,7 @@ public:
|
||||||
private:
|
private:
|
||||||
void changeEvent(QEvent* event) override;
|
void changeEvent(QEvent* event) override;
|
||||||
void RetranslateUI();
|
void RetranslateUI();
|
||||||
|
void HandleAcceptedEvent();
|
||||||
|
|
||||||
void HandleApplyButtonClicked();
|
void HandleApplyButtonClicked();
|
||||||
|
|
||||||
|
@ -70,4 +72,5 @@ private:
|
||||||
std::unique_ptr<ConfigureGraphics> graphics_tab;
|
std::unique_ptr<ConfigureGraphics> graphics_tab;
|
||||||
std::unique_ptr<ConfigureSystem> system_tab;
|
std::unique_ptr<ConfigureSystem> system_tab;
|
||||||
std::unique_ptr<ConfigureDebug> debug_tab;
|
std::unique_ptr<ConfigureDebug> debug_tab;
|
||||||
|
std::unique_ptr<ConfigureCheats> cheat_tab;
|
||||||
};
|
};
|
||||||
|
|
|
@ -235,22 +235,6 @@
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>accepted()</signal>
|
|
||||||
<receiver>ConfigurePerGame</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>20</x>
|
|
||||||
<y>20</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>20</x>
|
|
||||||
<y>20</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
<connection>
|
||||||
<sender>buttonBox</sender>
|
<sender>buttonBox</sender>
|
||||||
<signal>rejected()</signal>
|
<signal>rejected()</signal>
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include "citra_qt/bootmanager.h"
|
#include "citra_qt/bootmanager.h"
|
||||||
#include "citra_qt/camera/qt_multimedia_camera.h"
|
#include "citra_qt/camera/qt_multimedia_camera.h"
|
||||||
#include "citra_qt/camera/still_image_camera.h"
|
#include "citra_qt/camera/still_image_camera.h"
|
||||||
#include "citra_qt/cheats.h"
|
|
||||||
#include "citra_qt/compatdb.h"
|
#include "citra_qt/compatdb.h"
|
||||||
#include "citra_qt/compatibility_list.h"
|
#include "citra_qt/compatibility_list.h"
|
||||||
#include "citra_qt/configuration/config.h"
|
#include "citra_qt/configuration/config.h"
|
||||||
|
@ -663,7 +662,6 @@ void GMainWindow::RestoreUIState() {
|
||||||
microProfileDialog->restoreGeometry(UISettings::values.microprofile_geometry);
|
microProfileDialog->restoreGeometry(UISettings::values.microprofile_geometry);
|
||||||
microProfileDialog->setVisible(UISettings::values.microprofile_visible.GetValue());
|
microProfileDialog->setVisible(UISettings::values.microprofile_visible.GetValue());
|
||||||
#endif
|
#endif
|
||||||
ui->action_Cheats->setEnabled(false);
|
|
||||||
|
|
||||||
game_list->LoadInterfaceLayout();
|
game_list->LoadInterfaceLayout();
|
||||||
|
|
||||||
|
@ -765,7 +763,6 @@ void GMainWindow::ConnectMenuEvents() {
|
||||||
connect_menu(ui->action_Report_Compatibility, &GMainWindow::OnMenuReportCompatibility);
|
connect_menu(ui->action_Report_Compatibility, &GMainWindow::OnMenuReportCompatibility);
|
||||||
connect_menu(ui->action_Configure, &GMainWindow::OnConfigure);
|
connect_menu(ui->action_Configure, &GMainWindow::OnConfigure);
|
||||||
connect_menu(ui->action_Configure_Current_Game, &GMainWindow::OnConfigurePerGame);
|
connect_menu(ui->action_Configure_Current_Game, &GMainWindow::OnConfigurePerGame);
|
||||||
connect_menu(ui->action_Cheats, &GMainWindow::OnCheats);
|
|
||||||
|
|
||||||
// View
|
// View
|
||||||
connect_menu(ui->action_Single_Window_Mode, &GMainWindow::ToggleWindowMode);
|
connect_menu(ui->action_Single_Window_Mode, &GMainWindow::ToggleWindowMode);
|
||||||
|
@ -851,7 +848,6 @@ void GMainWindow::UpdateMenuState() {
|
||||||
ui->action_Load_Amiibo,
|
ui->action_Load_Amiibo,
|
||||||
ui->action_Remove_Amiibo,
|
ui->action_Remove_Amiibo,
|
||||||
ui->action_Pause,
|
ui->action_Pause,
|
||||||
ui->action_Cheats,
|
|
||||||
ui->action_Advance_Frame,
|
ui->action_Advance_Frame,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1937,11 +1933,6 @@ void GMainWindow::TriggerRotateScreens() {
|
||||||
ui->action_Screen_Layout_Upright_Screens->trigger();
|
ui->action_Screen_Layout_Upright_Screens->trigger();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GMainWindow::OnCheats() {
|
|
||||||
CheatDialog cheat_dialog(this);
|
|
||||||
cheat_dialog.exec();
|
|
||||||
}
|
|
||||||
|
|
||||||
void GMainWindow::OnSaveState() {
|
void GMainWindow::OnSaveState() {
|
||||||
QAction* action = qobject_cast<QAction*>(sender());
|
QAction* action = qobject_cast<QAction*>(sender());
|
||||||
assert(action);
|
assert(action);
|
||||||
|
|
|
@ -217,7 +217,6 @@ private slots:
|
||||||
void OnRotateScreens();
|
void OnRotateScreens();
|
||||||
void TriggerSwapScreens();
|
void TriggerSwapScreens();
|
||||||
void TriggerRotateScreens();
|
void TriggerRotateScreens();
|
||||||
void OnCheats();
|
|
||||||
void ShowFullscreen();
|
void ShowFullscreen();
|
||||||
void HideFullscreen();
|
void HideFullscreen();
|
||||||
void ToggleWindowMode();
|
void ToggleWindowMode();
|
||||||
|
|
|
@ -45,7 +45,7 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1081</width>
|
<width>1081</width>
|
||||||
<height>25</height>
|
<height>22</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menu_File">
|
<widget class="QMenu" name="menu_File">
|
||||||
|
@ -115,7 +115,6 @@
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="action_Configure"/>
|
<addaction name="action_Configure"/>
|
||||||
<addaction name="action_Configure_Current_Game"/>
|
<addaction name="action_Configure_Current_Game"/>
|
||||||
<addaction name="action_Cheats"/>
|
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_View">
|
<widget class="QMenu" name="menu_View">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
|
@ -333,11 +332,6 @@
|
||||||
<enum>QAction::PreferencesRole</enum>
|
<enum>QAction::PreferencesRole</enum>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_Cheats">
|
|
||||||
<property name="text">
|
|
||||||
<string>Cheats...</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="action_Display_Dock_Widget_Headers">
|
<action name="action_Display_Dock_Widget_Headers">
|
||||||
<property name="checkable">
|
<property name="checkable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
|
|
@ -19,9 +19,12 @@ namespace Cheats {
|
||||||
// we use the same value
|
// we use the same value
|
||||||
constexpr u64 run_interval_ticks = 50'000'000;
|
constexpr u64 run_interval_ticks = 50'000'000;
|
||||||
|
|
||||||
CheatEngine::CheatEngine(Core::System& system_) : system(system_) {
|
CheatEngine::CheatEngine(u64 title_id_, Core::System& system_)
|
||||||
|
: system(system_), title_id{title_id_} {
|
||||||
LoadCheatFile();
|
LoadCheatFile();
|
||||||
Connect();
|
if (system.IsPoweredOn()) {
|
||||||
|
Connect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheatEngine::Connect() {
|
void CheatEngine::Connect() {
|
||||||
|
@ -32,7 +35,9 @@ void CheatEngine::Connect() {
|
||||||
}
|
}
|
||||||
|
|
||||||
CheatEngine::~CheatEngine() {
|
CheatEngine::~CheatEngine() {
|
||||||
system.CoreTiming().UnscheduleEvent(event, 0);
|
if (system.IsPoweredOn()) {
|
||||||
|
system.CoreTiming().UnscheduleEvent(event, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::shared_ptr<CheatBase>> CheatEngine::GetCheats() const {
|
std::vector<std::shared_ptr<CheatBase>> CheatEngine::GetCheats() const {
|
||||||
|
@ -65,8 +70,7 @@ void CheatEngine::UpdateCheat(std::size_t index, const std::shared_ptr<CheatBase
|
||||||
|
|
||||||
void CheatEngine::SaveCheatFile() const {
|
void CheatEngine::SaveCheatFile() const {
|
||||||
const std::string cheat_dir = FileUtil::GetUserPath(FileUtil::UserPath::CheatsDir);
|
const std::string cheat_dir = FileUtil::GetUserPath(FileUtil::UserPath::CheatsDir);
|
||||||
const std::string filepath = fmt::format(
|
const std::string filepath = fmt::format("{}{:016X}.txt", cheat_dir, title_id);
|
||||||
"{}{:016X}.txt", cheat_dir, system.Kernel().GetCurrentProcess()->codeset->program_id);
|
|
||||||
|
|
||||||
if (!FileUtil::IsDirectory(cheat_dir)) {
|
if (!FileUtil::IsDirectory(cheat_dir)) {
|
||||||
FileUtil::CreateDir(cheat_dir);
|
FileUtil::CreateDir(cheat_dir);
|
||||||
|
@ -81,8 +85,7 @@ void CheatEngine::SaveCheatFile() const {
|
||||||
|
|
||||||
void CheatEngine::LoadCheatFile() {
|
void CheatEngine::LoadCheatFile() {
|
||||||
const std::string cheat_dir = FileUtil::GetUserPath(FileUtil::UserPath::CheatsDir);
|
const std::string cheat_dir = FileUtil::GetUserPath(FileUtil::UserPath::CheatsDir);
|
||||||
const std::string filepath = fmt::format(
|
const std::string filepath = fmt::format("{}{:016X}.txt", cheat_dir, title_id);
|
||||||
"{}{:016X}.txt", cheat_dir, system.Kernel().GetCurrentProcess()->codeset->program_id);
|
|
||||||
|
|
||||||
if (!FileUtil::IsDirectory(cheat_dir)) {
|
if (!FileUtil::IsDirectory(cheat_dir)) {
|
||||||
FileUtil::CreateDir(cheat_dir);
|
FileUtil::CreateDir(cheat_dir);
|
||||||
|
|
|
@ -24,7 +24,7 @@ class CheatBase;
|
||||||
|
|
||||||
class CheatEngine {
|
class CheatEngine {
|
||||||
public:
|
public:
|
||||||
explicit CheatEngine(Core::System& system);
|
explicit CheatEngine(u64 title_id_, Core::System& system);
|
||||||
~CheatEngine();
|
~CheatEngine();
|
||||||
void Connect();
|
void Connect();
|
||||||
std::vector<std::shared_ptr<CheatBase>> GetCheats() const;
|
std::vector<std::shared_ptr<CheatBase>> GetCheats() const;
|
||||||
|
@ -40,5 +40,6 @@ private:
|
||||||
mutable std::shared_mutex cheats_list_mutex;
|
mutable std::shared_mutex cheats_list_mutex;
|
||||||
Core::TimingEventType* event;
|
Core::TimingEventType* event;
|
||||||
Core::System& system;
|
Core::System& system;
|
||||||
|
u64 title_id;
|
||||||
};
|
};
|
||||||
} // namespace Cheats
|
} // namespace Cheats
|
||||||
|
|
|
@ -312,12 +312,12 @@ System::ResultStatus System::Load(Frontend::EmuWindow& emu_window, const std::st
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
kernel->SetCurrentProcess(process);
|
kernel->SetCurrentProcess(process);
|
||||||
cheat_engine = std::make_unique<Cheats::CheatEngine>(*this);
|
|
||||||
title_id = 0;
|
title_id = 0;
|
||||||
if (app_loader->ReadProgramId(title_id) != Loader::ResultStatus::Success) {
|
if (app_loader->ReadProgramId(title_id) != Loader::ResultStatus::Success) {
|
||||||
LOG_ERROR(Core, "Failed to find title id for ROM (Error {})",
|
LOG_ERROR(Core, "Failed to find title id for ROM (Error {})",
|
||||||
static_cast<u32>(load_result));
|
static_cast<u32>(load_result));
|
||||||
}
|
}
|
||||||
|
cheat_engine = std::make_unique<Cheats::CheatEngine>(title_id, *this);
|
||||||
perf_stats = std::make_unique<PerfStats>(title_id);
|
perf_stats = std::make_unique<PerfStats>(title_id);
|
||||||
|
|
||||||
if (Settings::values.custom_textures) {
|
if (Settings::values.custom_textures) {
|
||||||
|
|
Reference in New Issue