Cheats: Added basic cheat code finder tool
This commit is contained in:
parent
9d239daf3c
commit
ccc2fc2aa3
24 changed files with 1229 additions and 31 deletions
|
@ -448,10 +448,10 @@ void Console::LoadState(uint8_t *buffer, uint32_t bufferSize)
|
||||||
LoadState(stream);
|
LoadState(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Debugger> Console::GetDebugger()
|
std::shared_ptr<Debugger> Console::GetDebugger(bool autoStart)
|
||||||
{
|
{
|
||||||
auto lock = _debuggerLock.AcquireSafe();
|
auto lock = _debuggerLock.AcquireSafe();
|
||||||
if(!_debugger) {
|
if(!_debugger && autoStart) {
|
||||||
_debugger.reset(new Debugger(Console::Instance, _cpu, _ppu, _memoryManager, _mapper));
|
_debugger.reset(new Debugger(Console::Instance, _cpu, _ppu, _memoryManager, _mapper));
|
||||||
}
|
}
|
||||||
return _debugger;
|
return _debugger;
|
||||||
|
|
|
@ -59,7 +59,7 @@ class Console
|
||||||
//Used to resume the emu loop after calling Pause()
|
//Used to resume the emu loop after calling Pause()
|
||||||
static void Resume();
|
static void Resume();
|
||||||
|
|
||||||
std::shared_ptr<Debugger> GetDebugger();
|
std::shared_ptr<Debugger> GetDebugger(bool autoStart = true);
|
||||||
void StopDebugger();
|
void StopDebugger();
|
||||||
|
|
||||||
static NesModel GetNesModel();
|
static NesModel GetNesModel();
|
||||||
|
|
|
@ -597,6 +597,12 @@ uint32_t Debugger::GetMemoryState(DebugMemoryType type, uint8_t *buffer)
|
||||||
memcpy(buffer, chrRam, _mapper->GetChrSize(true));
|
memcpy(buffer, chrRam, _mapper->GetChrSize(true));
|
||||||
delete[] chrRam;
|
delete[] chrRam;
|
||||||
return _mapper->GetChrSize(true);
|
return _mapper->GetChrSize(true);
|
||||||
|
|
||||||
|
case DebugMemoryType::InternalRam:
|
||||||
|
for(int i = 0; i < 0x800; i++) {
|
||||||
|
buffer[i] = _memoryManager->DebugRead(i);
|
||||||
|
}
|
||||||
|
return 0x800;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ enum class DebugMemoryType
|
||||||
PrgRom = 5,
|
PrgRom = 5,
|
||||||
ChrRom = 6,
|
ChrRom = 6,
|
||||||
ChrRam = 7,
|
ChrRam = 7,
|
||||||
|
InternalRam = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class DebuggerFlags
|
enum class DebuggerFlags
|
||||||
|
|
81
GUI.NET/Debugger/Controls/ctrlAddressList.Designer.cs
generated
Normal file
81
GUI.NET/Debugger/Controls/ctrlAddressList.Designer.cs
generated
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
namespace Mesen.GUI.Debugger.Controls
|
||||||
|
{
|
||||||
|
partial class ctrlAddressList
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if(disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Component Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.ctrlDataViewer = new Mesen.GUI.Debugger.ctrlScrollableTextbox();
|
||||||
|
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
|
this.tableLayoutPanel1.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// tableLayoutPanel1
|
||||||
|
//
|
||||||
|
this.tableLayoutPanel1.ColumnCount = 1;
|
||||||
|
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel1.Controls.Add(this.ctrlDataViewer, 0, 1);
|
||||||
|
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||||
|
this.tableLayoutPanel1.RowCount = 2;
|
||||||
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel1.Size = new System.Drawing.Size(191, 109);
|
||||||
|
this.tableLayoutPanel1.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// ctrlDataViewer
|
||||||
|
//
|
||||||
|
this.ctrlDataViewer.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||||
|
this.ctrlDataViewer.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.ctrlDataViewer.FontSize = 13F;
|
||||||
|
this.ctrlDataViewer.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.ctrlDataViewer.Name = "ctrlDataViewer";
|
||||||
|
this.ctrlDataViewer.ShowContentNotes = false;
|
||||||
|
this.ctrlDataViewer.ShowLineNumberNotes = false;
|
||||||
|
this.ctrlDataViewer.Size = new System.Drawing.Size(185, 103);
|
||||||
|
this.ctrlDataViewer.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// ctrlAddressList
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Controls.Add(this.tableLayoutPanel1);
|
||||||
|
this.Name = "ctrlAddressList";
|
||||||
|
this.Size = new System.Drawing.Size(191, 109);
|
||||||
|
this.tableLayoutPanel1.ResumeLayout(false);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
|
||||||
|
private ctrlScrollableTextbox ctrlDataViewer;
|
||||||
|
private System.Windows.Forms.ToolTip toolTip;
|
||||||
|
}
|
||||||
|
}
|
49
GUI.NET/Debugger/Controls/ctrlAddressList.cs
Normal file
49
GUI.NET/Debugger/Controls/ctrlAddressList.cs
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Data;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using Mesen.GUI.Config;
|
||||||
|
|
||||||
|
namespace Mesen.GUI.Debugger.Controls
|
||||||
|
{
|
||||||
|
public partial class ctrlAddressList : BaseScrollableTextboxUserControl
|
||||||
|
{
|
||||||
|
private int[] _addresses;
|
||||||
|
|
||||||
|
public ctrlAddressList()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
this.ctrlDataViewer.MarginWidth = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override ctrlScrollableTextbox ScrollableTextbox
|
||||||
|
{
|
||||||
|
get { return this.ctrlDataViewer; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetData(byte[] values, int[] addresses)
|
||||||
|
{
|
||||||
|
this.ctrlDataViewer.Header = null;
|
||||||
|
this.ctrlDataViewer.TextLines = values.Select(val => val.ToString("X2")).ToArray();
|
||||||
|
this.ctrlDataViewer.LineNumbers = addresses;
|
||||||
|
_addresses = addresses;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int? CurrentAddress
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if(_addresses?.Length > 0) {
|
||||||
|
return _addresses[Math.Min(this.ctrlDataViewer.CurrentLine, _addresses.Length - 1)];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
123
GUI.NET/Debugger/Controls/ctrlAddressList.resx
Normal file
123
GUI.NET/Debugger/Controls/ctrlAddressList.resx
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
</root>
|
|
@ -250,6 +250,8 @@ namespace Mesen.GUI.Debugger
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int MarginWidth { set { this.ctrlTextbox.MarginWidth = value; } }
|
||||||
|
|
||||||
public void OpenSearchBox(bool forceFocus = false)
|
public void OpenSearchBox(bool forceFocus = false)
|
||||||
{
|
{
|
||||||
bool focus = !this.panelSearch.Visible;
|
bool focus = !this.panelSearch.Visible;
|
||||||
|
|
|
@ -48,6 +48,7 @@ namespace Mesen.GUI.Debugger
|
||||||
private string _searchString = null;
|
private string _searchString = null;
|
||||||
private string _header = null;
|
private string _header = null;
|
||||||
private Font _noteFont = null;
|
private Font _noteFont = null;
|
||||||
|
private int _marginWidth = 6;
|
||||||
|
|
||||||
public ctrlTextbox()
|
public ctrlTextbox()
|
||||||
{
|
{
|
||||||
|
@ -159,6 +160,15 @@ namespace Mesen.GUI.Debugger
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int MarginWidth
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this._marginWidth = value;
|
||||||
|
this.Invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool Search(string searchString, bool searchBackwards, bool isNewSearch)
|
public bool Search(string searchString, bool searchBackwards, bool isNewSearch)
|
||||||
{
|
{
|
||||||
if(string.IsNullOrWhiteSpace(searchString)) {
|
if(string.IsNullOrWhiteSpace(searchString)) {
|
||||||
|
@ -284,7 +294,7 @@ namespace Mesen.GUI.Debugger
|
||||||
|
|
||||||
private int GetMargin(Graphics g)
|
private int GetMargin(Graphics g)
|
||||||
{
|
{
|
||||||
return this.ShowLineNumbers ? (int)(g.MeasureString("W", this.Font).Width * 6) : 0;
|
return this.ShowLineNumbers ? (int)(g.MeasureString("W", this.Font).Width * _marginWidth) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int GetLineIndexAtPosition(int yPos)
|
public int GetLineIndexAtPosition(int yPos)
|
||||||
|
@ -369,7 +379,7 @@ namespace Mesen.GUI.Debugger
|
||||||
get { return Math.Min(this._contents.Length - 1, Math.Max(0, _cursorPosition)); }
|
get { return Math.Min(this._contents.Length - 1, Math.Max(0, _cursorPosition)); }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_cursorPosition = Math.Min(this._contents.Length - 1, Math.Max(0, value));
|
_cursorPosition = Math.Max(0, Math.Min(this._contents.Length - 1, Math.Max(0, value)));
|
||||||
if(_cursorPosition < this.ScrollPosition) {
|
if(_cursorPosition < this.ScrollPosition) {
|
||||||
this.ScrollPosition = _cursorPosition;
|
this.ScrollPosition = _cursorPosition;
|
||||||
} else if(_cursorPosition > this.GetLastVisibleLineIndex()) {
|
} else if(_cursorPosition > this.GetLastVisibleLineIndex()) {
|
||||||
|
|
|
@ -130,5 +130,17 @@
|
||||||
<Value ID="AllOnes">All 1s</Value>
|
<Value ID="AllOnes">All 1s</Value>
|
||||||
<Value ID="Random">Random Values</Value>
|
<Value ID="Random">Random Values</Value>
|
||||||
</Enum>
|
</Enum>
|
||||||
|
<Enum ID="CheatCurrentFilterType">
|
||||||
|
<Value ID="Smaller">Smaller than</Value>
|
||||||
|
<Value ID="Equal">Equal to</Value>
|
||||||
|
<Value ID="NotEqual">Not equal to</Value>
|
||||||
|
<Value ID="Greater">Greater than</Value>
|
||||||
|
</Enum>
|
||||||
|
<Enum ID="CheatPrevFilterType">
|
||||||
|
<Value ID="Smaller">Smaller</Value>
|
||||||
|
<Value ID="Equal">Equal</Value>
|
||||||
|
<Value ID="NotEqual">Not equal</Value>
|
||||||
|
<Value ID="Greater">Greater</Value>
|
||||||
|
</Enum>
|
||||||
</Enums>
|
</Enums>
|
||||||
</Resources>
|
</Resources>
|
|
@ -364,6 +364,19 @@
|
||||||
<Control ID="btnExportSelectedCheats">Exporter les codes sélectionnés</Control>
|
<Control ID="btnExportSelectedCheats">Exporter les codes sélectionnés</Control>
|
||||||
<Control ID="mnuExportSelectedCheats">Exporter</Control>
|
<Control ID="mnuExportSelectedCheats">Exporter</Control>
|
||||||
<Control ID="chkDisableCheats">Désactiver tous les codes</Control>
|
<Control ID="chkDisableCheats">Désactiver tous les codes</Control>
|
||||||
|
|
||||||
|
<Control ID="tpgCheatFinder">Recherche de codes</Control>
|
||||||
|
<Control ID="btnReset">Réinitialiser</Control>
|
||||||
|
<Control ID="btnUndo">Annuler</Control>
|
||||||
|
<Control ID="lblCurrentValue">La valeur courante est</Control>
|
||||||
|
<Control ID="lblPreviousValue">La valeur précédente était</Control>
|
||||||
|
<Control ID="btnAddCurrentFilter">Ajouter le filtre</Control>
|
||||||
|
<Control ID="btnAddPrevFilter">Ajouter le filtre</Control>
|
||||||
|
<Control ID="btnCreateCheat">Créer un code</Control>
|
||||||
|
<Control ID="mnuCreateCheat">Créer un code</Control>
|
||||||
|
<Control ID="lblAtAddress">à</Control>
|
||||||
|
<Control ID="chkPauseGameWhileWindowActive">Mettre le jeu à pause automatiquement lorsque cette fenêtre est active</Control>
|
||||||
|
|
||||||
<Control ID="btnOK">OK</Control>
|
<Control ID="btnOK">OK</Control>
|
||||||
<Control ID="btnCancel">Annuler</Control>
|
<Control ID="btnCancel">Annuler</Control>
|
||||||
</Form>
|
</Form>
|
||||||
|
@ -540,5 +553,17 @@
|
||||||
<Value ID="AllOnes">Tous les bits à 1</Value>
|
<Value ID="AllOnes">Tous les bits à 1</Value>
|
||||||
<Value ID="Random">Valeurs aléatoires</Value>
|
<Value ID="Random">Valeurs aléatoires</Value>
|
||||||
</Enum>
|
</Enum>
|
||||||
|
<Enum ID="CheatCurrentFilterType">
|
||||||
|
<Value ID="Smaller">Plus petite que</Value>
|
||||||
|
<Value ID="Equal">Égale à</Value>
|
||||||
|
<Value ID="NotEqual">Pas égale à</Value>
|
||||||
|
<Value ID="Greater">Plus grand que</Value>
|
||||||
|
</Enum>
|
||||||
|
<Enum ID="CheatPrevFilterType">
|
||||||
|
<Value ID="Smaller">Plus petite</Value>
|
||||||
|
<Value ID="Equal">Égale</Value>
|
||||||
|
<Value ID="NotEqual">Pas égale</Value>
|
||||||
|
<Value ID="Greater">Plus grande</Value>
|
||||||
|
</Enum>
|
||||||
</Enums>
|
</Enums>
|
||||||
</Resources>
|
</Resources>
|
|
@ -352,6 +352,19 @@
|
||||||
<Control ID="btnExportSelectedCheats">選択中のコードをエクスポートする</Control>
|
<Control ID="btnExportSelectedCheats">選択中のコードをエクスポートする</Control>
|
||||||
<Control ID="mnuExportSelectedCheats">エクスポート</Control>
|
<Control ID="mnuExportSelectedCheats">エクスポート</Control>
|
||||||
<Control ID="chkDisableCheats">チートコード機能を無効にする</Control>
|
<Control ID="chkDisableCheats">チートコード機能を無効にする</Control>
|
||||||
|
|
||||||
|
<Control ID="tpgCheatFinder">コードファインダー</Control>
|
||||||
|
<Control ID="btnReset">リセット</Control>
|
||||||
|
<Control ID="btnUndo">元に戻す</Control>
|
||||||
|
<Control ID="lblCurrentValue">現在の数値は</Control>
|
||||||
|
<Control ID="lblPreviousValue">前回の数値は現在の数値</Control>
|
||||||
|
<Control ID="btnAddCurrentFilter">フィルター追加</Control>
|
||||||
|
<Control ID="btnAddPrevFilter">フィルター追加</Control>
|
||||||
|
<Control ID="btnCreateCheat">コード作成</Control>
|
||||||
|
<Control ID="mnuCreateCheat">コード作成</Control>
|
||||||
|
<Control ID="lblAtAddress"></Control>
|
||||||
|
<Control ID="chkPauseGameWhileWindowActive">このウィンドウがアクティブの時、自動的にゲームをポーズする</Control>
|
||||||
|
|
||||||
<Control ID="btnOK">OK</Control>
|
<Control ID="btnOK">OK</Control>
|
||||||
<Control ID="btnCancel">キャンセル</Control>
|
<Control ID="btnCancel">キャンセル</Control>
|
||||||
</Form>
|
</Form>
|
||||||
|
@ -523,5 +536,17 @@
|
||||||
<Value ID="AllOnes">ビット全てを1にする</Value>
|
<Value ID="AllOnes">ビット全てを1にする</Value>
|
||||||
<Value ID="Random">乱数</Value>
|
<Value ID="Random">乱数</Value>
|
||||||
</Enum>
|
</Enum>
|
||||||
|
<Enum ID="CheatCurrentFilterType">
|
||||||
|
<Value ID="Smaller">次の数値より小さい</Value>
|
||||||
|
<Value ID="Equal">次の数値と同じ</Value>
|
||||||
|
<Value ID="NotEqual">次の数値とは違う</Value>
|
||||||
|
<Value ID="Greater">次の数値より大きい</Value>
|
||||||
|
</Enum>
|
||||||
|
<Enum ID="CheatPrevFilterType">
|
||||||
|
<Value ID="Smaller">より小さい</Value>
|
||||||
|
<Value ID="Equal">と同じ</Value>
|
||||||
|
<Value ID="NotEqual">とは違う</Value>
|
||||||
|
<Value ID="Greater">より大きい</Value>
|
||||||
|
</Enum>
|
||||||
</Enums>
|
</Enums>
|
||||||
</Resources>
|
</Resources>
|
|
@ -114,6 +114,15 @@ namespace Mesen.GUI.Forms
|
||||||
AddBinding(fieldName, trueRadio);
|
AddBinding(fieldName, trueRadio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void InitializeComboBox(ComboBox combo, Type enumType)
|
||||||
|
{
|
||||||
|
combo.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||||
|
combo.Items.Clear();
|
||||||
|
foreach(Enum value in Enum.GetValues(enumType)) {
|
||||||
|
combo.Items.Add(ResourceHelper.GetEnumText(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void AddBinding(string fieldName, Control bindedField)
|
protected void AddBinding(string fieldName, Control bindedField)
|
||||||
{
|
{
|
||||||
if(BindedType == null) {
|
if(BindedType == null) {
|
||||||
|
@ -131,12 +140,7 @@ namespace Mesen.GUI.Forms
|
||||||
if(_fieldInfo.ContainsKey(fieldName)) {
|
if(_fieldInfo.ContainsKey(fieldName)) {
|
||||||
Type fieldType = _fieldInfo[fieldName].FieldType;
|
Type fieldType = _fieldInfo[fieldName].FieldType;
|
||||||
if(fieldType.IsSubclassOf(typeof(Enum)) && bindedField is ComboBox) {
|
if(fieldType.IsSubclassOf(typeof(Enum)) && bindedField is ComboBox) {
|
||||||
ComboBox combo = ((ComboBox)bindedField);
|
InitializeComboBox(((ComboBox)bindedField), fieldType);
|
||||||
combo.DropDownStyle = ComboBoxStyle.DropDownList;
|
|
||||||
combo.Items.Clear();
|
|
||||||
foreach(Enum value in Enum.GetValues(fieldType)) {
|
|
||||||
combo.Items.Add(ResourceHelper.GetEnumText(value));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_bindings[fieldName] = bindedField;
|
_bindings[fieldName] = bindedField;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -31,9 +31,23 @@ namespace Mesen.GUI.Forms
|
||||||
this.Icon = menuItem.Image;
|
this.Icon = menuItem.Image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(owner != null) {
|
||||||
|
CenterOnParent(owner);
|
||||||
|
}
|
||||||
|
|
||||||
base.Show(owner);
|
base.Show(owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CenterOnParent(IWin32Window owner)
|
||||||
|
{
|
||||||
|
Form parent = (Form)owner;
|
||||||
|
Point point = parent.PointToScreen(new Point(parent.Width / 2, parent.Height / 2));
|
||||||
|
|
||||||
|
this.StartPosition = FormStartPosition.Manual;
|
||||||
|
this.Top = point.Y - this.Height / 2;
|
||||||
|
this.Left = point.X - this.Width / 2;
|
||||||
|
}
|
||||||
|
|
||||||
public DialogResult ShowDialog(object sender, IWin32Window owner = null)
|
public DialogResult ShowDialog(object sender, IWin32Window owner = null)
|
||||||
{
|
{
|
||||||
if(sender is ToolStripMenuItem) {
|
if(sender is ToolStripMenuItem) {
|
||||||
|
|
368
GUI.NET/Forms/Cheats/ctrlCheatFinder.Designer.cs
generated
Normal file
368
GUI.NET/Forms/Cheats/ctrlCheatFinder.Designer.cs
generated
Normal file
|
@ -0,0 +1,368 @@
|
||||||
|
namespace Mesen.GUI.Forms.Cheats
|
||||||
|
{
|
||||||
|
partial class ctrlCheatFinder
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if(disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Component Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
this.tmrRefresh = new System.Windows.Forms.Timer(this.components);
|
||||||
|
this.grpFilters = new System.Windows.Forms.GroupBox();
|
||||||
|
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.lblPreviousValue = new System.Windows.Forms.Label();
|
||||||
|
this.cboPrevFilterType = new System.Windows.Forms.ComboBox();
|
||||||
|
this.btnAddPrevFilter = new System.Windows.Forms.Button();
|
||||||
|
this.flowLayoutPanel4 = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.lblCurrentValue = new System.Windows.Forms.Label();
|
||||||
|
this.cboCurrentFilterType = new System.Windows.Forms.ComboBox();
|
||||||
|
this.nudCurrentFilterValue = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.btnAddCurrentFilter = new System.Windows.Forms.Button();
|
||||||
|
this.btnReset = new System.Windows.Forms.Button();
|
||||||
|
this.btnUndo = new System.Windows.Forms.Button();
|
||||||
|
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.lstAddresses = new Mesen.GUI.Debugger.Controls.ctrlAddressList();
|
||||||
|
this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||||
|
this.mnuCreateCheat = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel();
|
||||||
|
this.btnCreateCheat = new System.Windows.Forms.Button();
|
||||||
|
this.lblAtAddress = new System.Windows.Forms.Label();
|
||||||
|
this.lblAddress = new System.Windows.Forms.Label();
|
||||||
|
this.chkPauseGameWhileWindowActive = new System.Windows.Forms.CheckBox();
|
||||||
|
this.grpFilters.SuspendLayout();
|
||||||
|
this.tableLayoutPanel2.SuspendLayout();
|
||||||
|
this.flowLayoutPanel1.SuspendLayout();
|
||||||
|
this.flowLayoutPanel4.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.nudCurrentFilterValue)).BeginInit();
|
||||||
|
this.tableLayoutPanel1.SuspendLayout();
|
||||||
|
this.contextMenuStrip.SuspendLayout();
|
||||||
|
this.flowLayoutPanel2.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// tmrRefresh
|
||||||
|
//
|
||||||
|
this.tmrRefresh.Enabled = true;
|
||||||
|
this.tmrRefresh.Tick += new System.EventHandler(this.tmrRefresh_Tick);
|
||||||
|
//
|
||||||
|
// grpFilters
|
||||||
|
//
|
||||||
|
this.grpFilters.Controls.Add(this.tableLayoutPanel2);
|
||||||
|
this.grpFilters.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.grpFilters.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.grpFilters.Name = "grpFilters";
|
||||||
|
this.grpFilters.Size = new System.Drawing.Size(399, 160);
|
||||||
|
this.grpFilters.TabIndex = 4;
|
||||||
|
this.grpFilters.TabStop = false;
|
||||||
|
this.grpFilters.Text = "Filters";
|
||||||
|
//
|
||||||
|
// tableLayoutPanel2
|
||||||
|
//
|
||||||
|
this.tableLayoutPanel2.ColumnCount = 2;
|
||||||
|
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
|
||||||
|
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel2.Controls.Add(this.flowLayoutPanel1, 0, 2);
|
||||||
|
this.tableLayoutPanel2.Controls.Add(this.flowLayoutPanel4, 0, 1);
|
||||||
|
this.tableLayoutPanel2.Controls.Add(this.btnReset, 0, 0);
|
||||||
|
this.tableLayoutPanel2.Controls.Add(this.btnUndo, 1, 0);
|
||||||
|
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 16);
|
||||||
|
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
|
||||||
|
this.tableLayoutPanel2.RowCount = 4;
|
||||||
|
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
|
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
|
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
|
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
|
||||||
|
this.tableLayoutPanel2.Size = new System.Drawing.Size(393, 141);
|
||||||
|
this.tableLayoutPanel2.TabIndex = 13;
|
||||||
|
//
|
||||||
|
// flowLayoutPanel1
|
||||||
|
//
|
||||||
|
this.tableLayoutPanel2.SetColumnSpan(this.flowLayoutPanel1, 2);
|
||||||
|
this.flowLayoutPanel1.Controls.Add(this.lblPreviousValue);
|
||||||
|
this.flowLayoutPanel1.Controls.Add(this.cboPrevFilterType);
|
||||||
|
this.flowLayoutPanel1.Controls.Add(this.btnAddPrevFilter);
|
||||||
|
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 59);
|
||||||
|
this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
|
||||||
|
this.flowLayoutPanel1.Size = new System.Drawing.Size(393, 31);
|
||||||
|
this.flowLayoutPanel1.TabIndex = 1;
|
||||||
|
//
|
||||||
|
// lblPreviousValue
|
||||||
|
//
|
||||||
|
this.lblPreviousValue.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.lblPreviousValue.AutoSize = true;
|
||||||
|
this.lblPreviousValue.Location = new System.Drawing.Point(3, 8);
|
||||||
|
this.lblPreviousValue.Name = "lblPreviousValue";
|
||||||
|
this.lblPreviousValue.Size = new System.Drawing.Size(99, 13);
|
||||||
|
this.lblPreviousValue.TabIndex = 3;
|
||||||
|
this.lblPreviousValue.Text = "Previous value was";
|
||||||
|
//
|
||||||
|
// cboPrevFilterType
|
||||||
|
//
|
||||||
|
this.cboPrevFilterType.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.cboPrevFilterType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.cboPrevFilterType.FormattingEnabled = true;
|
||||||
|
this.cboPrevFilterType.Location = new System.Drawing.Point(108, 4);
|
||||||
|
this.cboPrevFilterType.Name = "cboPrevFilterType";
|
||||||
|
this.cboPrevFilterType.Size = new System.Drawing.Size(110, 21);
|
||||||
|
this.cboPrevFilterType.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// btnAddPrevFilter
|
||||||
|
//
|
||||||
|
this.btnAddPrevFilter.AutoSize = true;
|
||||||
|
this.btnAddPrevFilter.Location = new System.Drawing.Point(224, 3);
|
||||||
|
this.btnAddPrevFilter.Name = "btnAddPrevFilter";
|
||||||
|
this.btnAddPrevFilter.Size = new System.Drawing.Size(75, 23);
|
||||||
|
this.btnAddPrevFilter.TabIndex = 2;
|
||||||
|
this.btnAddPrevFilter.Text = "Add Filter";
|
||||||
|
this.btnAddPrevFilter.UseVisualStyleBackColor = true;
|
||||||
|
this.btnAddPrevFilter.Click += new System.EventHandler(this.btnAddPrevFilter_Click);
|
||||||
|
//
|
||||||
|
// flowLayoutPanel4
|
||||||
|
//
|
||||||
|
this.tableLayoutPanel2.SetColumnSpan(this.flowLayoutPanel4, 2);
|
||||||
|
this.flowLayoutPanel4.Controls.Add(this.lblCurrentValue);
|
||||||
|
this.flowLayoutPanel4.Controls.Add(this.cboCurrentFilterType);
|
||||||
|
this.flowLayoutPanel4.Controls.Add(this.nudCurrentFilterValue);
|
||||||
|
this.flowLayoutPanel4.Controls.Add(this.btnAddCurrentFilter);
|
||||||
|
this.flowLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.flowLayoutPanel4.Location = new System.Drawing.Point(0, 29);
|
||||||
|
this.flowLayoutPanel4.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.flowLayoutPanel4.Name = "flowLayoutPanel4";
|
||||||
|
this.flowLayoutPanel4.Size = new System.Drawing.Size(393, 30);
|
||||||
|
this.flowLayoutPanel4.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// lblCurrentValue
|
||||||
|
//
|
||||||
|
this.lblCurrentValue.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.lblCurrentValue.AutoSize = true;
|
||||||
|
this.lblCurrentValue.Location = new System.Drawing.Point(3, 8);
|
||||||
|
this.lblCurrentValue.Name = "lblCurrentValue";
|
||||||
|
this.lblCurrentValue.Size = new System.Drawing.Size(80, 13);
|
||||||
|
this.lblCurrentValue.TabIndex = 4;
|
||||||
|
this.lblCurrentValue.Text = "Current value is";
|
||||||
|
//
|
||||||
|
// cboCurrentFilterType
|
||||||
|
//
|
||||||
|
this.cboCurrentFilterType.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.cboCurrentFilterType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||||
|
this.cboCurrentFilterType.FormattingEnabled = true;
|
||||||
|
this.cboCurrentFilterType.Location = new System.Drawing.Point(89, 4);
|
||||||
|
this.cboCurrentFilterType.Name = "cboCurrentFilterType";
|
||||||
|
this.cboCurrentFilterType.Size = new System.Drawing.Size(110, 21);
|
||||||
|
this.cboCurrentFilterType.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// nudCurrentFilterValue
|
||||||
|
//
|
||||||
|
this.nudCurrentFilterValue.Location = new System.Drawing.Point(205, 5);
|
||||||
|
this.nudCurrentFilterValue.Margin = new System.Windows.Forms.Padding(3, 5, 3, 3);
|
||||||
|
this.nudCurrentFilterValue.Maximum = new decimal(new int[] {
|
||||||
|
255,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.nudCurrentFilterValue.Name = "nudCurrentFilterValue";
|
||||||
|
this.nudCurrentFilterValue.Size = new System.Drawing.Size(41, 20);
|
||||||
|
this.nudCurrentFilterValue.TabIndex = 1;
|
||||||
|
//
|
||||||
|
// btnAddCurrentFilter
|
||||||
|
//
|
||||||
|
this.btnAddCurrentFilter.AutoSize = true;
|
||||||
|
this.btnAddCurrentFilter.Location = new System.Drawing.Point(252, 3);
|
||||||
|
this.btnAddCurrentFilter.Name = "btnAddCurrentFilter";
|
||||||
|
this.btnAddCurrentFilter.Size = new System.Drawing.Size(75, 23);
|
||||||
|
this.btnAddCurrentFilter.TabIndex = 2;
|
||||||
|
this.btnAddCurrentFilter.Text = "Add Filter";
|
||||||
|
this.btnAddCurrentFilter.UseVisualStyleBackColor = true;
|
||||||
|
this.btnAddCurrentFilter.Click += new System.EventHandler(this.btnAddCurrentFilter_Click);
|
||||||
|
//
|
||||||
|
// btnReset
|
||||||
|
//
|
||||||
|
this.btnReset.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.btnReset.Name = "btnReset";
|
||||||
|
this.btnReset.Size = new System.Drawing.Size(75, 23);
|
||||||
|
this.btnReset.TabIndex = 5;
|
||||||
|
this.btnReset.Text = "Reset";
|
||||||
|
this.btnReset.UseVisualStyleBackColor = true;
|
||||||
|
this.btnReset.Click += new System.EventHandler(this.btnReset_Click);
|
||||||
|
//
|
||||||
|
// btnUndo
|
||||||
|
//
|
||||||
|
this.btnUndo.Location = new System.Drawing.Point(84, 3);
|
||||||
|
this.btnUndo.Name = "btnUndo";
|
||||||
|
this.btnUndo.Size = new System.Drawing.Size(75, 23);
|
||||||
|
this.btnUndo.TabIndex = 11;
|
||||||
|
this.btnUndo.Text = "Undo";
|
||||||
|
this.btnUndo.UseVisualStyleBackColor = true;
|
||||||
|
this.btnUndo.Click += new System.EventHandler(this.btnUndo_Click);
|
||||||
|
//
|
||||||
|
// tableLayoutPanel1
|
||||||
|
//
|
||||||
|
this.tableLayoutPanel1.ColumnCount = 2;
|
||||||
|
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
|
||||||
|
this.tableLayoutPanel1.Controls.Add(this.grpFilters, 0, 0);
|
||||||
|
this.tableLayoutPanel1.Controls.Add(this.lstAddresses, 1, 0);
|
||||||
|
this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel2, 1, 1);
|
||||||
|
this.tableLayoutPanel1.Controls.Add(this.chkPauseGameWhileWindowActive, 0, 1);
|
||||||
|
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
|
||||||
|
this.tableLayoutPanel1.RowCount = 2;
|
||||||
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
|
||||||
|
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
|
||||||
|
this.tableLayoutPanel1.Size = new System.Drawing.Size(565, 196);
|
||||||
|
this.tableLayoutPanel1.TabIndex = 5;
|
||||||
|
//
|
||||||
|
// lstAddresses
|
||||||
|
//
|
||||||
|
this.lstAddresses.ContextMenuStrip = this.contextMenuStrip;
|
||||||
|
this.lstAddresses.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.lstAddresses.Location = new System.Drawing.Point(408, 3);
|
||||||
|
this.lstAddresses.Name = "lstAddresses";
|
||||||
|
this.lstAddresses.Size = new System.Drawing.Size(154, 160);
|
||||||
|
this.lstAddresses.TabIndex = 3;
|
||||||
|
//
|
||||||
|
// contextMenuStrip
|
||||||
|
//
|
||||||
|
this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.mnuCreateCheat});
|
||||||
|
this.contextMenuStrip.Name = "contextMenuStrip";
|
||||||
|
this.contextMenuStrip.Size = new System.Drawing.Size(143, 26);
|
||||||
|
this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening);
|
||||||
|
//
|
||||||
|
// mnuCreateCheat
|
||||||
|
//
|
||||||
|
this.mnuCreateCheat.Name = "mnuCreateCheat";
|
||||||
|
this.mnuCreateCheat.Size = new System.Drawing.Size(142, 22);
|
||||||
|
this.mnuCreateCheat.Text = "Create Cheat";
|
||||||
|
this.mnuCreateCheat.Click += new System.EventHandler(this.btnCreateCheat_Click);
|
||||||
|
//
|
||||||
|
// flowLayoutPanel2
|
||||||
|
//
|
||||||
|
this.flowLayoutPanel2.Controls.Add(this.btnCreateCheat);
|
||||||
|
this.flowLayoutPanel2.Controls.Add(this.lblAtAddress);
|
||||||
|
this.flowLayoutPanel2.Controls.Add(this.lblAddress);
|
||||||
|
this.flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.flowLayoutPanel2.Location = new System.Drawing.Point(405, 166);
|
||||||
|
this.flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
this.flowLayoutPanel2.Name = "flowLayoutPanel2";
|
||||||
|
this.flowLayoutPanel2.Size = new System.Drawing.Size(160, 30);
|
||||||
|
this.flowLayoutPanel2.TabIndex = 5;
|
||||||
|
//
|
||||||
|
// btnCreateCheat
|
||||||
|
//
|
||||||
|
this.btnCreateCheat.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.btnCreateCheat.Name = "btnCreateCheat";
|
||||||
|
this.btnCreateCheat.Size = new System.Drawing.Size(85, 23);
|
||||||
|
this.btnCreateCheat.TabIndex = 5;
|
||||||
|
this.btnCreateCheat.Text = "Create Cheat";
|
||||||
|
this.btnCreateCheat.UseVisualStyleBackColor = true;
|
||||||
|
this.btnCreateCheat.Click += new System.EventHandler(this.btnCreateCheat_Click);
|
||||||
|
//
|
||||||
|
// lblAtAddress
|
||||||
|
//
|
||||||
|
this.lblAtAddress.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.lblAtAddress.AutoSize = true;
|
||||||
|
this.lblAtAddress.Location = new System.Drawing.Point(94, 8);
|
||||||
|
this.lblAtAddress.Name = "lblAtAddress";
|
||||||
|
this.lblAtAddress.Size = new System.Drawing.Size(16, 13);
|
||||||
|
this.lblAtAddress.TabIndex = 6;
|
||||||
|
this.lblAtAddress.Text = "at";
|
||||||
|
//
|
||||||
|
// lblAddress
|
||||||
|
//
|
||||||
|
this.lblAddress.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.lblAddress.AutoSize = true;
|
||||||
|
this.lblAddress.Location = new System.Drawing.Point(116, 8);
|
||||||
|
this.lblAddress.Name = "lblAddress";
|
||||||
|
this.lblAddress.Size = new System.Drawing.Size(37, 13);
|
||||||
|
this.lblAddress.TabIndex = 7;
|
||||||
|
this.lblAddress.Text = "$0000";
|
||||||
|
//
|
||||||
|
// chkPauseGameWhileWindowActive
|
||||||
|
//
|
||||||
|
this.chkPauseGameWhileWindowActive.Anchor = System.Windows.Forms.AnchorStyles.Left;
|
||||||
|
this.chkPauseGameWhileWindowActive.AutoSize = true;
|
||||||
|
this.chkPauseGameWhileWindowActive.Location = new System.Drawing.Point(3, 172);
|
||||||
|
this.chkPauseGameWhileWindowActive.Name = "chkPauseGameWhileWindowActive";
|
||||||
|
this.chkPauseGameWhileWindowActive.Size = new System.Drawing.Size(278, 17);
|
||||||
|
this.chkPauseGameWhileWindowActive.TabIndex = 6;
|
||||||
|
this.chkPauseGameWhileWindowActive.Text = "Automatically pause game when this window is active";
|
||||||
|
this.chkPauseGameWhileWindowActive.UseVisualStyleBackColor = true;
|
||||||
|
this.chkPauseGameWhileWindowActive.CheckedChanged += new System.EventHandler(this.chkPauseGameWhileWindowActive_CheckedChanged);
|
||||||
|
//
|
||||||
|
// ctrlCheatFinder
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Controls.Add(this.tableLayoutPanel1);
|
||||||
|
this.Name = "ctrlCheatFinder";
|
||||||
|
this.Size = new System.Drawing.Size(565, 196);
|
||||||
|
this.grpFilters.ResumeLayout(false);
|
||||||
|
this.tableLayoutPanel2.ResumeLayout(false);
|
||||||
|
this.flowLayoutPanel1.ResumeLayout(false);
|
||||||
|
this.flowLayoutPanel1.PerformLayout();
|
||||||
|
this.flowLayoutPanel4.ResumeLayout(false);
|
||||||
|
this.flowLayoutPanel4.PerformLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.nudCurrentFilterValue)).EndInit();
|
||||||
|
this.tableLayoutPanel1.ResumeLayout(false);
|
||||||
|
this.tableLayoutPanel1.PerformLayout();
|
||||||
|
this.contextMenuStrip.ResumeLayout(false);
|
||||||
|
this.flowLayoutPanel2.ResumeLayout(false);
|
||||||
|
this.flowLayoutPanel2.PerformLayout();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.Timer tmrRefresh;
|
||||||
|
private Debugger.Controls.ctrlAddressList lstAddresses;
|
||||||
|
private System.Windows.Forms.GroupBox grpFilters;
|
||||||
|
private System.Windows.Forms.Button btnReset;
|
||||||
|
private System.Windows.Forms.Button btnUndo;
|
||||||
|
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
|
||||||
|
private System.Windows.Forms.ComboBox cboPrevFilterType;
|
||||||
|
private System.Windows.Forms.Button btnAddPrevFilter;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel4;
|
||||||
|
private System.Windows.Forms.ComboBox cboCurrentFilterType;
|
||||||
|
private System.Windows.Forms.NumericUpDown nudCurrentFilterValue;
|
||||||
|
private System.Windows.Forms.Button btnAddCurrentFilter;
|
||||||
|
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
|
||||||
|
private System.Windows.Forms.Button btnCreateCheat;
|
||||||
|
private System.Windows.Forms.Label lblPreviousValue;
|
||||||
|
private System.Windows.Forms.Label lblCurrentValue;
|
||||||
|
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2;
|
||||||
|
private System.Windows.Forms.Label lblAtAddress;
|
||||||
|
private System.Windows.Forms.Label lblAddress;
|
||||||
|
private System.Windows.Forms.ContextMenuStrip contextMenuStrip;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem mnuCreateCheat;
|
||||||
|
private System.Windows.Forms.CheckBox chkPauseGameWhileWindowActive;
|
||||||
|
}
|
||||||
|
}
|
232
GUI.NET/Forms/Cheats/ctrlCheatFinder.cs
Normal file
232
GUI.NET/Forms/Cheats/ctrlCheatFinder.cs
Normal file
|
@ -0,0 +1,232 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Data;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using Mesen.GUI.Config;
|
||||||
|
|
||||||
|
namespace Mesen.GUI.Forms.Cheats
|
||||||
|
{
|
||||||
|
public partial class ctrlCheatFinder : UserControl
|
||||||
|
{
|
||||||
|
public event EventHandler OnAddCheat;
|
||||||
|
public bool TabIsFocused
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_tabIsFocused = value;
|
||||||
|
if(chkPauseGameWhileWindowActive.Checked) {
|
||||||
|
if(_tabIsFocused) {
|
||||||
|
InteropEmu.Pause();
|
||||||
|
} else {
|
||||||
|
InteropEmu.Resume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<byte[]> _memorySnapshots;
|
||||||
|
private List<FilterInfo> _filters;
|
||||||
|
private bool _tabIsFocused = true;
|
||||||
|
|
||||||
|
private enum CheatPrevFilterType
|
||||||
|
{
|
||||||
|
Smaller,
|
||||||
|
Equal,
|
||||||
|
NotEqual,
|
||||||
|
Greater
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum CheatCurrentFilterType
|
||||||
|
{
|
||||||
|
Smaller,
|
||||||
|
Equal,
|
||||||
|
NotEqual,
|
||||||
|
Greater
|
||||||
|
}
|
||||||
|
|
||||||
|
private class FilterInfo
|
||||||
|
{
|
||||||
|
public CheatCurrentFilterType? CurrentType;
|
||||||
|
public CheatPrevFilterType? PrevType;
|
||||||
|
public int Operand;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ctrlCheatFinder()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
BaseConfigForm.InitializeComboBox(cboPrevFilterType, typeof(CheatPrevFilterType));
|
||||||
|
BaseConfigForm.InitializeComboBox(cboCurrentFilterType, typeof(CheatCurrentFilterType));
|
||||||
|
cboPrevFilterType.SelectedIndex = 0;
|
||||||
|
cboCurrentFilterType.SelectedIndex = 0;
|
||||||
|
|
||||||
|
btnUndo.Enabled = false;
|
||||||
|
|
||||||
|
if(LicenseManager.UsageMode != LicenseUsageMode.Designtime) {
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Reset()
|
||||||
|
{
|
||||||
|
_filters = new List<FilterInfo>();
|
||||||
|
_memorySnapshots = new List<byte[]>();
|
||||||
|
TakeSnapshot();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TakeSnapshot()
|
||||||
|
{
|
||||||
|
if(!InteropEmu.IsRunning()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] memory = GetSnapshot();
|
||||||
|
_memorySnapshots.Add(memory);
|
||||||
|
RefreshAddressList();
|
||||||
|
|
||||||
|
UpdateUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] GetSnapshot()
|
||||||
|
{
|
||||||
|
bool release = !InteropEmu.DebugIsDebuggerRunning();
|
||||||
|
byte[] memory = InteropEmu.DebugGetInternalRam();
|
||||||
|
if(release) {
|
||||||
|
InteropEmu.DebugRelease();
|
||||||
|
} else {
|
||||||
|
System.Diagnostics.Debug.Print("test");
|
||||||
|
}
|
||||||
|
|
||||||
|
return memory;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tmrRefresh_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
RefreshAddressList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RefreshAddressList()
|
||||||
|
{
|
||||||
|
UpdateUI();
|
||||||
|
if(!InteropEmu.IsRunning()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HashSet<int> matchingAddresses = new HashSet<int>();
|
||||||
|
for(int i = 0; i < 0x800; i++) {
|
||||||
|
matchingAddresses.Add(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_memorySnapshots.Count > 1) {
|
||||||
|
for(int i = 0; i < _memorySnapshots.Count - 1; i++) {
|
||||||
|
matchingAddresses = new HashSet<int>(matchingAddresses.Where(addr => {
|
||||||
|
if(_filters[i].PrevType.HasValue) {
|
||||||
|
switch(_filters[i].PrevType) {
|
||||||
|
case CheatPrevFilterType.Smaller: return _memorySnapshots[i+1][addr] < _memorySnapshots[i][addr];
|
||||||
|
case CheatPrevFilterType.Equal: return _memorySnapshots[i+1][addr] == _memorySnapshots[i][addr];
|
||||||
|
case CheatPrevFilterType.NotEqual: return _memorySnapshots[i+1][addr] != _memorySnapshots[i][addr];
|
||||||
|
case CheatPrevFilterType.Greater: return _memorySnapshots[i+1][addr] > _memorySnapshots[i][addr];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch(_filters[i].CurrentType) {
|
||||||
|
case CheatCurrentFilterType.Smaller: return _memorySnapshots[i+1][addr] < _filters[i].Operand;
|
||||||
|
case CheatCurrentFilterType.Equal: return _memorySnapshots[i+1][addr] == _filters[i].Operand;
|
||||||
|
case CheatCurrentFilterType.NotEqual: return _memorySnapshots[i+1][addr] != _filters[i].Operand;
|
||||||
|
case CheatCurrentFilterType.Greater: return _memorySnapshots[i+1][addr] > _filters[i].Operand;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] memory = GetSnapshot();
|
||||||
|
List<byte> values = new List<byte>(0x800);
|
||||||
|
List<int> addresses = new List<int>(0x800);
|
||||||
|
for(int i = 0; i < 0x800; i++) {
|
||||||
|
if(matchingAddresses.Contains(i)) {
|
||||||
|
addresses.Add(i);
|
||||||
|
values.Add(memory[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lstAddresses.SetData(values.ToArray(), addresses.ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnReset_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnUndo_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if(_filters.Count > 0) {
|
||||||
|
_filters.RemoveAt(_filters.Count-1);
|
||||||
|
_memorySnapshots.RemoveAt(_memorySnapshots.Count-1);
|
||||||
|
UpdateUI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateUI()
|
||||||
|
{
|
||||||
|
btnUndo.Enabled = _filters.Count > 0;
|
||||||
|
chkPauseGameWhileWindowActive.Enabled = btnAddCurrentFilter.Enabled = btnAddPrevFilter.Enabled = btnReset.Enabled = cboCurrentFilterType.Enabled = cboPrevFilterType.Enabled = nudCurrentFilterValue.Enabled = InteropEmu.IsRunning();
|
||||||
|
mnuCreateCheat.Enabled = btnCreateCheat.Enabled = lstAddresses.CurrentAddress.HasValue;
|
||||||
|
|
||||||
|
if(lstAddresses.CurrentAddress.HasValue) {
|
||||||
|
lblAddress.Visible = true;
|
||||||
|
lblAtAddress.Visible = true;
|
||||||
|
lblAddress.Text = "$" + lstAddresses.CurrentAddress?.ToString("X4");
|
||||||
|
} else {
|
||||||
|
lblAddress.Visible = false;
|
||||||
|
lblAtAddress.Visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnAddPrevFilter_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
_filters.Add(new FilterInfo { PrevType = (CheatPrevFilterType)cboPrevFilterType.SelectedIndex });
|
||||||
|
TakeSnapshot();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnAddCurrentFilter_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
_filters.Add(new FilterInfo { CurrentType = (CheatCurrentFilterType)cboCurrentFilterType.SelectedIndex, Operand = (int)nudCurrentFilterValue.Value });
|
||||||
|
TakeSnapshot();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void contextMenuStrip_Opening(object sender, CancelEventArgs e)
|
||||||
|
{
|
||||||
|
UpdateUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnCreateCheat_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
RomInfo romInfo = InteropEmu.GetRomInfo();
|
||||||
|
CheatInfo newCheat = new CheatInfo {
|
||||||
|
GameCrc = romInfo.GetPrgCrcString(),
|
||||||
|
GameName = romInfo.GetRomName(),
|
||||||
|
Address = (uint)lstAddresses.CurrentAddress,
|
||||||
|
CheatType = CheatType.Custom
|
||||||
|
};
|
||||||
|
|
||||||
|
frmCheat frm = new frmCheat(newCheat);
|
||||||
|
if(frm.ShowDialog() == DialogResult.OK) {
|
||||||
|
OnAddCheat?.Invoke(newCheat, new EventArgs());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void chkPauseGameWhileWindowActive_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if(chkPauseGameWhileWindowActive.Checked) {
|
||||||
|
InteropEmu.Pause();
|
||||||
|
} else {
|
||||||
|
InteropEmu.Resume();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
126
GUI.NET/Forms/Cheats/ctrlCheatFinder.resx
Normal file
126
GUI.NET/Forms/Cheats/ctrlCheatFinder.resx
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<metadata name="tmrRefresh.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
|
<metadata name="contextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>128, 17</value>
|
||||||
|
</metadata>
|
||||||
|
</root>
|
27
GUI.NET/Forms/Cheats/frmCheatList.Designer.cs
generated
27
GUI.NET/Forms/Cheats/frmCheatList.Designer.cs
generated
|
@ -58,8 +58,10 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
this.btnExportAllCheats = new System.Windows.Forms.ToolStripMenuItem();
|
this.btnExportAllCheats = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.btnExportGame = new System.Windows.Forms.ToolStripMenuItem();
|
this.btnExportGame = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.btnExportSelectedCheats = new System.Windows.Forms.ToolStripMenuItem();
|
this.btnExportSelectedCheats = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.tpgCheatFinder = new System.Windows.Forms.TabPage();
|
||||||
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
|
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
|
||||||
this.chkDisableCheats = new System.Windows.Forms.CheckBox();
|
this.chkDisableCheats = new System.Windows.Forms.CheckBox();
|
||||||
|
this.ctrlCheatFinder = new Mesen.GUI.Forms.Cheats.ctrlCheatFinder();
|
||||||
this.baseConfigPanel.SuspendLayout();
|
this.baseConfigPanel.SuspendLayout();
|
||||||
this.tabMain.SuspendLayout();
|
this.tabMain.SuspendLayout();
|
||||||
this.tabCheats.SuspendLayout();
|
this.tabCheats.SuspendLayout();
|
||||||
|
@ -71,6 +73,7 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
this.contextMenuGames.SuspendLayout();
|
this.contextMenuGames.SuspendLayout();
|
||||||
this.contextMenuCheats.SuspendLayout();
|
this.contextMenuCheats.SuspendLayout();
|
||||||
this.tsCheatActions.SuspendLayout();
|
this.tsCheatActions.SuspendLayout();
|
||||||
|
this.tpgCheatFinder.SuspendLayout();
|
||||||
this.tableLayoutPanel2.SuspendLayout();
|
this.tableLayoutPanel2.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
|
@ -84,6 +87,7 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
// tabMain
|
// tabMain
|
||||||
//
|
//
|
||||||
this.tabMain.Controls.Add(this.tabCheats);
|
this.tabMain.Controls.Add(this.tabCheats);
|
||||||
|
this.tabMain.Controls.Add(this.tpgCheatFinder);
|
||||||
this.tabMain.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.tabMain.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.tabMain.Location = new System.Drawing.Point(0, 0);
|
this.tabMain.Location = new System.Drawing.Point(0, 0);
|
||||||
this.tabMain.Margin = new System.Windows.Forms.Padding(0);
|
this.tabMain.Margin = new System.Windows.Forms.Padding(0);
|
||||||
|
@ -370,6 +374,17 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
this.btnExportSelectedCheats.Text = "Selected Cheats";
|
this.btnExportSelectedCheats.Text = "Selected Cheats";
|
||||||
this.btnExportSelectedCheats.Click += new System.EventHandler(this.btnExportSelectedCheats_Click);
|
this.btnExportSelectedCheats.Click += new System.EventHandler(this.btnExportSelectedCheats_Click);
|
||||||
//
|
//
|
||||||
|
// tpgCheatFinder
|
||||||
|
//
|
||||||
|
this.tpgCheatFinder.Controls.Add(this.ctrlCheatFinder);
|
||||||
|
this.tpgCheatFinder.Location = new System.Drawing.Point(4, 22);
|
||||||
|
this.tpgCheatFinder.Name = "tpgCheatFinder";
|
||||||
|
this.tpgCheatFinder.Padding = new System.Windows.Forms.Padding(3);
|
||||||
|
this.tpgCheatFinder.Size = new System.Drawing.Size(608, 231);
|
||||||
|
this.tpgCheatFinder.TabIndex = 1;
|
||||||
|
this.tpgCheatFinder.Text = "Cheat Finder";
|
||||||
|
this.tpgCheatFinder.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
// tableLayoutPanel2
|
// tableLayoutPanel2
|
||||||
//
|
//
|
||||||
this.tableLayoutPanel2.ColumnCount = 1;
|
this.tableLayoutPanel2.ColumnCount = 1;
|
||||||
|
@ -394,6 +409,14 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
this.chkDisableCheats.Text = "Disable all cheats";
|
this.chkDisableCheats.Text = "Disable all cheats";
|
||||||
this.chkDisableCheats.UseVisualStyleBackColor = true;
|
this.chkDisableCheats.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
|
// ctrlCheatFinder
|
||||||
|
//
|
||||||
|
this.ctrlCheatFinder.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.ctrlCheatFinder.Location = new System.Drawing.Point(3, 3);
|
||||||
|
this.ctrlCheatFinder.Name = "ctrlCheatFinder";
|
||||||
|
this.ctrlCheatFinder.Size = new System.Drawing.Size(602, 225);
|
||||||
|
this.ctrlCheatFinder.TabIndex = 0;
|
||||||
|
//
|
||||||
// frmCheatList
|
// frmCheatList
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
@ -404,6 +427,7 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
this.Name = "frmCheatList";
|
this.Name = "frmCheatList";
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
||||||
this.Text = "Cheats";
|
this.Text = "Cheats";
|
||||||
|
this.ShowInTaskbar = true;
|
||||||
this.Controls.SetChildIndex(this.baseConfigPanel, 0);
|
this.Controls.SetChildIndex(this.baseConfigPanel, 0);
|
||||||
this.Controls.SetChildIndex(this.tableLayoutPanel2, 0);
|
this.Controls.SetChildIndex(this.tableLayoutPanel2, 0);
|
||||||
this.baseConfigPanel.ResumeLayout(false);
|
this.baseConfigPanel.ResumeLayout(false);
|
||||||
|
@ -420,6 +444,7 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
this.contextMenuCheats.ResumeLayout(false);
|
this.contextMenuCheats.ResumeLayout(false);
|
||||||
this.tsCheatActions.ResumeLayout(false);
|
this.tsCheatActions.ResumeLayout(false);
|
||||||
this.tsCheatActions.PerformLayout();
|
this.tsCheatActions.PerformLayout();
|
||||||
|
this.tpgCheatFinder.ResumeLayout(false);
|
||||||
this.tableLayoutPanel2.ResumeLayout(false);
|
this.tableLayoutPanel2.ResumeLayout(false);
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
|
@ -457,5 +482,7 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
private System.Windows.Forms.ToolStripSplitButton btnImport;
|
private System.Windows.Forms.ToolStripSplitButton btnImport;
|
||||||
private System.Windows.Forms.ToolStripMenuItem btnImportCheatDB;
|
private System.Windows.Forms.ToolStripMenuItem btnImportCheatDB;
|
||||||
private System.Windows.Forms.ToolStripMenuItem btnImportFromFile;
|
private System.Windows.Forms.ToolStripMenuItem btnImportFromFile;
|
||||||
|
private System.Windows.Forms.TabPage tpgCheatFinder;
|
||||||
|
private ctrlCheatFinder ctrlCheatFinder;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -14,7 +14,7 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
{
|
{
|
||||||
public partial class frmCheatList : BaseConfigForm
|
public partial class frmCheatList : BaseConfigForm
|
||||||
{
|
{
|
||||||
private List<CheatInfo> Cheats { get { return ConfigManager.Config.Cheats; } }
|
private List<CheatInfo> _cheats;
|
||||||
private GameInfo _selectedItem = null;
|
private GameInfo _selectedItem = null;
|
||||||
|
|
||||||
public frmCheatList()
|
public frmCheatList()
|
||||||
|
@ -25,14 +25,45 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
protected override void OnLoad(EventArgs e)
|
protected override void OnLoad(EventArgs e)
|
||||||
{
|
{
|
||||||
base.OnLoad(e);
|
base.OnLoad(e);
|
||||||
chkDisableCheats.Checked = ConfigManager.Config.DisableAllCheats;
|
if(!DesignMode) {
|
||||||
UpdateGameList();
|
_cheats = new List<CheatInfo>(ConfigManager.Config.Cheats);
|
||||||
lstGameList.Select();
|
chkDisableCheats.Checked = ConfigManager.Config.DisableAllCheats;
|
||||||
|
UpdateGameList();
|
||||||
|
lstGameList.Select();
|
||||||
|
|
||||||
|
ctrlCheatFinder.OnAddCheat += CtrlCheatFinder_OnAddCheat;
|
||||||
|
tabMain.TabIndexChanged += TabMain_TabIndexChanged;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void TabMain_TabIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ctrlCheatFinder.TabIsFocused = (tabMain.SelectedTab == tpgCheatFinder);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnActivated(EventArgs e)
|
||||||
|
{
|
||||||
|
if(tabMain.SelectedTab == tpgCheatFinder) {
|
||||||
|
ctrlCheatFinder.TabIsFocused = true;
|
||||||
|
}
|
||||||
|
base.OnActivated(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnDeactivate(EventArgs e)
|
||||||
|
{
|
||||||
|
ctrlCheatFinder.TabIsFocused = false;
|
||||||
|
base.OnDeactivate(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CtrlCheatFinder_OnAddCheat(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
AddCheats(new List<CheatInfo>() { (CheatInfo)sender });
|
||||||
|
}
|
||||||
|
|
||||||
protected override void UpdateConfig()
|
protected override void UpdateConfig()
|
||||||
{
|
{
|
||||||
ConfigManager.Config.DisableAllCheats = chkDisableCheats.Checked;
|
ConfigManager.Config.DisableAllCheats = chkDisableCheats.Checked;
|
||||||
|
ConfigManager.Config.Cheats = _cheats;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateGameList(string gameCrc = null)
|
private void UpdateGameList(string gameCrc = null)
|
||||||
|
@ -42,7 +73,7 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
if(!string.IsNullOrWhiteSpace(romInfo.RomName)) {
|
if(!string.IsNullOrWhiteSpace(romInfo.RomName)) {
|
||||||
nameByCrc[romInfo.GetPrgCrcString()] = romInfo.GetRomName();
|
nameByCrc[romInfo.GetPrgCrcString()] = romInfo.GetRomName();
|
||||||
}
|
}
|
||||||
foreach(CheatInfo cheat in this.Cheats) {
|
foreach(CheatInfo cheat in _cheats) {
|
||||||
if(!nameByCrc.ContainsKey(cheat.GameCrc)) {
|
if(!nameByCrc.ContainsKey(cheat.GameCrc)) {
|
||||||
nameByCrc[cheat.GameCrc] = cheat.GameName;
|
nameByCrc[cheat.GameCrc] = cheat.GameName;
|
||||||
}
|
}
|
||||||
|
@ -99,7 +130,7 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
lstCheats.Items.Clear();
|
lstCheats.Items.Clear();
|
||||||
if(_selectedItem != null) {
|
if(_selectedItem != null) {
|
||||||
string crc32 = _selectedItem.Crc;
|
string crc32 = _selectedItem.Crc;
|
||||||
foreach(CheatInfo cheat in this.Cheats) {
|
foreach(CheatInfo cheat in _cheats) {
|
||||||
if(cheat.GameCrc == crc32) {
|
if(cheat.GameCrc == crc32) {
|
||||||
ListViewItem item = lstCheats.Items.Add(cheat.CheatName);
|
ListViewItem item = lstCheats.Items.Add(cheat.CheatName);
|
||||||
item.SubItems.Add(cheat.ToString());
|
item.SubItems.Add(cheat.ToString());
|
||||||
|
@ -163,7 +194,7 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
{
|
{
|
||||||
foreach(ListViewItem item in lstCheats.SelectedItems) {
|
foreach(ListViewItem item in lstCheats.SelectedItems) {
|
||||||
CheatInfo cheat = item.Tag as CheatInfo;
|
CheatInfo cheat = item.Tag as CheatInfo;
|
||||||
this.Cheats.Remove(cheat);
|
_cheats.Remove(cheat);
|
||||||
}
|
}
|
||||||
UpdateGameList();
|
UpdateGameList();
|
||||||
}
|
}
|
||||||
|
@ -177,7 +208,7 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
{
|
{
|
||||||
foreach(var item in lstCheats.Items) {
|
foreach(var item in lstCheats.Items) {
|
||||||
CheatInfo cheat = ((ListViewItem)item).Tag as CheatInfo;
|
CheatInfo cheat = ((ListViewItem)item).Tag as CheatInfo;
|
||||||
this.Cheats.Remove(cheat);
|
_cheats.Remove(cheat);
|
||||||
}
|
}
|
||||||
UpdateGameList();
|
UpdateGameList();
|
||||||
}
|
}
|
||||||
|
@ -209,13 +240,13 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
{
|
{
|
||||||
if(cheats.Count > 0) {
|
if(cheats.Count > 0) {
|
||||||
HashSet<string> existingCheats = new HashSet<string>();
|
HashSet<string> existingCheats = new HashSet<string>();
|
||||||
foreach(CheatInfo cheat in this.Cheats) {
|
foreach(CheatInfo cheat in _cheats) {
|
||||||
existingCheats.Add(cheat.GameCrc + cheat.ToString());
|
existingCheats.Add(cheat.GameCrc + cheat.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(CheatInfo cheat in cheats) {
|
foreach(CheatInfo cheat in cheats) {
|
||||||
if(!existingCheats.Contains(cheat.GameCrc + cheat.ToString())) {
|
if(!existingCheats.Contains(cheat.GameCrc + cheat.ToString())) {
|
||||||
this.Cheats.Add(cheat);
|
_cheats.Add(cheat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,12 +268,12 @@ namespace Mesen.GUI.Forms.Cheats
|
||||||
|
|
||||||
private void btnExportAllCheats_Click(object sender, EventArgs e)
|
private void btnExportAllCheats_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportCheats(this.Cheats, "MesenCheats.xml");
|
ExportCheats(_cheats, "MesenCheats.xml");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnExportGame_Click(object sender, EventArgs e)
|
private void btnExportGame_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportCheats(this.Cheats.Where((c) => c.GameCrc == _selectedItem.Crc), _selectedItem.Text + "_Cheats.xml");
|
ExportCheats(_cheats.Where((c) => c.GameCrc == _selectedItem.Crc), _selectedItem.Text + "_Cheats.xml");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void btnExportSelectedCheats_Click(object sender, EventArgs e)
|
private void btnExportSelectedCheats_Click(object sender, EventArgs e)
|
||||||
|
|
|
@ -28,6 +28,7 @@ namespace Mesen.GUI.Forms
|
||||||
{
|
{
|
||||||
private static Language _language;
|
private static Language _language;
|
||||||
private static XmlDocument _resources = new XmlDocument();
|
private static XmlDocument _resources = new XmlDocument();
|
||||||
|
private static XmlDocument _enResources = new XmlDocument();
|
||||||
private static XmlDocument _originalEnglishResources = null;
|
private static XmlDocument _originalEnglishResources = null;
|
||||||
|
|
||||||
public static Language GetCurrentLanguage()
|
public static Language GetCurrentLanguage()
|
||||||
|
@ -54,9 +55,10 @@ namespace Mesen.GUI.Forms
|
||||||
}
|
}
|
||||||
|
|
||||||
string filename;
|
string filename;
|
||||||
|
string enFilename = "resources.en.xml";
|
||||||
switch(language) {
|
switch(language) {
|
||||||
default:
|
default:
|
||||||
case Language.English: filename = "resources.en.xml"; break;
|
case Language.English: filename = enFilename; break;
|
||||||
case Language.French: filename = "resources.fr.xml"; break;
|
case Language.French: filename = "resources.fr.xml"; break;
|
||||||
case Language.Japanese: filename = "resources.ja.xml"; break;
|
case Language.Japanese: filename = "resources.ja.xml"; break;
|
||||||
case Language.Russian: filename = "resources.ru.xml"; break;
|
case Language.Russian: filename = "resources.ru.xml"; break;
|
||||||
|
@ -68,11 +70,19 @@ namespace Mesen.GUI.Forms
|
||||||
using(Stream stream = ResourceManager.GetZippedResource(filename)) {
|
using(Stream stream = ResourceManager.GetZippedResource(filename)) {
|
||||||
_resources.Load(stream);
|
_resources.Load(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using(Stream stream = ResourceManager.GetZippedResource(enFilename)) {
|
||||||
|
_enResources.Load(stream);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetMessage(string id, params object[] args)
|
public static string GetMessage(string id, params object[] args)
|
||||||
{
|
{
|
||||||
var baseNode = _resources.SelectSingleNode("/Resources/Messages/Message[@ID='" + id + "']");
|
var baseNode = _resources.SelectSingleNode("/Resources/Messages/Message[@ID='" + id + "']");
|
||||||
|
if(baseNode == null) {
|
||||||
|
baseNode = _enResources.SelectSingleNode("/Resources/Messages/Message[@ID='" + id + "']");
|
||||||
|
}
|
||||||
|
|
||||||
if(baseNode != null) {
|
if(baseNode != null) {
|
||||||
return string.Format(baseNode.InnerText, args);
|
return string.Format(baseNode.InnerText, args);
|
||||||
} else {
|
} else {
|
||||||
|
@ -83,6 +93,10 @@ namespace Mesen.GUI.Forms
|
||||||
public static string GetEnumText(Enum e)
|
public static string GetEnumText(Enum e)
|
||||||
{
|
{
|
||||||
var baseNode = _resources.SelectSingleNode("/Resources/Enums/Enum[@ID='" + e.GetType().Name + "']/Value[@ID='" + e.ToString() + "']");
|
var baseNode = _resources.SelectSingleNode("/Resources/Enums/Enum[@ID='" + e.GetType().Name + "']/Value[@ID='" + e.ToString() + "']");
|
||||||
|
if(baseNode == null) {
|
||||||
|
baseNode = _enResources.SelectSingleNode("/Resources/Enums/Enum[@ID='" + e.GetType().Name + "']/Value[@ID='" + e.ToString() + "']");
|
||||||
|
}
|
||||||
|
|
||||||
if(baseNode != null) {
|
if(baseNode != null) {
|
||||||
return baseNode.InnerText;
|
return baseNode.InnerText;
|
||||||
} else {
|
} else {
|
||||||
|
@ -150,9 +164,6 @@ namespace Mesen.GUI.Forms
|
||||||
ApplyResources(baseNode, ((ContextMenuStrip)ctrl).Items);
|
ApplyResources(baseNode, ((ContextMenuStrip)ctrl).Items);
|
||||||
} else if(ctrl is ListView) {
|
} else if(ctrl is ListView) {
|
||||||
ApplyResources(baseNode, ((ListView)ctrl).Columns);
|
ApplyResources(baseNode, ((ListView)ctrl).Columns);
|
||||||
if(((ListView)ctrl).ContextMenuStrip != null) {
|
|
||||||
ApplyResources(baseNode, ((ListView)ctrl).ContextMenuStrip.Items);
|
|
||||||
}
|
|
||||||
} else if(ctrl is ToolStrip) {
|
} else if(ctrl is ToolStrip) {
|
||||||
ApplyResources(baseNode, ((ToolStrip)ctrl).Items);
|
ApplyResources(baseNode, ((ToolStrip)ctrl).Items);
|
||||||
} else if(ctrl is ToolStripSplitButton) {
|
} else if(ctrl is ToolStripSplitButton) {
|
||||||
|
@ -162,6 +173,12 @@ namespace Mesen.GUI.Forms
|
||||||
} else if(ctrl is ToolStripMenuItem) {
|
} else if(ctrl is ToolStripMenuItem) {
|
||||||
ApplyResources(baseNode, ((ToolStripMenuItem)ctrl).DropDownItems);
|
ApplyResources(baseNode, ((ToolStripMenuItem)ctrl).DropDownItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(ctrl is Control) {
|
||||||
|
if(((Control)ctrl).ContextMenuStrip != null) {
|
||||||
|
ApplyResources(baseNode, ((Control)ctrl).ContextMenuStrip.Items);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ namespace Mesen.GUI.Forms
|
||||||
private Thread _emuThread;
|
private Thread _emuThread;
|
||||||
private frmDebugger _debugger;
|
private frmDebugger _debugger;
|
||||||
private frmLogWindow _logWindow;
|
private frmLogWindow _logWindow;
|
||||||
|
private frmCheatList _cheatListWindow;
|
||||||
private string _currentRomPath = null;
|
private string _currentRomPath = null;
|
||||||
private int _currentRomArchiveIndex = -1;
|
private int _currentRomArchiveIndex = -1;
|
||||||
private string _currentGame = null;
|
private string _currentGame = null;
|
||||||
|
@ -1028,9 +1029,15 @@ namespace Mesen.GUI.Forms
|
||||||
|
|
||||||
private void mnuCheats_Click(object sender, EventArgs e)
|
private void mnuCheats_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
frmCheatList frm = new frmCheatList();
|
if(_cheatListWindow == null) {
|
||||||
if(frm.ShowDialog(sender, this) == DialogResult.OK) {
|
_cheatListWindow = new frmCheatList();
|
||||||
CheatInfo.ApplyCheats();
|
_cheatListWindow.Show(sender, this);
|
||||||
|
_cheatListWindow.FormClosed += (s, evt) => {
|
||||||
|
_cheatListWindow = null;
|
||||||
|
CheatInfo.ApplyCheats();
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
_cheatListWindow.Focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -271,6 +271,12 @@
|
||||||
<Compile Include="Debugger\Controls\ctrlCallstack.Designer.cs">
|
<Compile Include="Debugger\Controls\ctrlCallstack.Designer.cs">
|
||||||
<DependentUpon>ctrlCallstack.cs</DependentUpon>
|
<DependentUpon>ctrlCallstack.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Debugger\Controls\ctrlAddressList.cs">
|
||||||
|
<SubType>UserControl</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Debugger\Controls\ctrlAddressList.Designer.cs">
|
||||||
|
<DependentUpon>ctrlAddressList.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Debugger\Controls\ctrlPaletteViewer.cs">
|
<Compile Include="Debugger\Controls\ctrlPaletteViewer.cs">
|
||||||
<SubType>UserControl</SubType>
|
<SubType>UserControl</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
@ -374,6 +380,12 @@
|
||||||
<Compile Include="Forms\BaseConfigForm.cs">
|
<Compile Include="Forms\BaseConfigForm.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Forms\Cheats\ctrlCheatFinder.cs">
|
||||||
|
<SubType>UserControl</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Forms\Cheats\ctrlCheatFinder.Designer.cs">
|
||||||
|
<DependentUpon>ctrlCheatFinder.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Forms\Cheats\FceuxCheatLoader.cs" />
|
<Compile Include="Forms\Cheats\FceuxCheatLoader.cs" />
|
||||||
<Compile Include="Forms\Cheats\frmCheat.cs">
|
<Compile Include="Forms\Cheats\frmCheat.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
|
@ -553,6 +565,9 @@
|
||||||
<EmbeddedResource Include="Debugger\Controls\ctrlCallstack.resx">
|
<EmbeddedResource Include="Debugger\Controls\ctrlCallstack.resx">
|
||||||
<DependentUpon>ctrlCallstack.cs</DependentUpon>
|
<DependentUpon>ctrlCallstack.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Debugger\Controls\ctrlAddressList.resx">
|
||||||
|
<DependentUpon>ctrlAddressList.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Debugger\Controls\ctrlPaletteViewer.resx">
|
<EmbeddedResource Include="Debugger\Controls\ctrlPaletteViewer.resx">
|
||||||
<DependentUpon>ctrlPaletteViewer.cs</DependentUpon>
|
<DependentUpon>ctrlPaletteViewer.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
@ -604,6 +619,9 @@
|
||||||
<EmbeddedResource Include="Forms\BaseForm.resx">
|
<EmbeddedResource Include="Forms\BaseForm.resx">
|
||||||
<DependentUpon>BaseForm.cs</DependentUpon>
|
<DependentUpon>BaseForm.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Forms\Cheats\ctrlCheatFinder.resx">
|
||||||
|
<DependentUpon>ctrlCheatFinder.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="Forms\Cheats\frmCheat.resx">
|
<EmbeddedResource Include="Forms\Cheats\frmCheat.resx">
|
||||||
<DependentUpon>frmCheat.cs</DependentUpon>
|
<DependentUpon>frmCheat.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
|
|
@ -157,6 +157,7 @@ namespace Mesen.GUI
|
||||||
[DllImport(DLLPath)] public static extern void SetAudioDevice(string audioDevice);
|
[DllImport(DLLPath)] public static extern void SetAudioDevice(string audioDevice);
|
||||||
|
|
||||||
[DllImport(DLLPath)] public static extern void DebugInitialize();
|
[DllImport(DLLPath)] public static extern void DebugInitialize();
|
||||||
|
[DllImport(DLLPath)] [return: MarshalAs(UnmanagedType.I1)] public static extern bool DebugIsDebuggerRunning();
|
||||||
[DllImport(DLLPath)] public static extern void DebugRelease();
|
[DllImport(DLLPath)] public static extern void DebugRelease();
|
||||||
[DllImport(DLLPath)] public static extern void DebugSetFlags(DebuggerFlags flags);
|
[DllImport(DLLPath)] public static extern void DebugSetFlags(DebuggerFlags flags);
|
||||||
[DllImport(DLLPath)] public static extern void DebugGetState(ref DebugState state);
|
[DllImport(DLLPath)] public static extern void DebugGetState(ref DebugState state);
|
||||||
|
@ -196,6 +197,19 @@ namespace Mesen.GUI
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static byte[] DebugGetInternalRam()
|
||||||
|
{
|
||||||
|
byte[] buffer = new byte[0x800];
|
||||||
|
GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
|
||||||
|
try {
|
||||||
|
UInt32 memorySize = InteropEmu.DebugGetMemoryStateWrapper(DebugMemoryType.InternalRam, handle.AddrOfPinnedObject());
|
||||||
|
Array.Resize(ref buffer, (int)memorySize);
|
||||||
|
} finally {
|
||||||
|
handle.Free();
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
[DllImport(DLLPath, EntryPoint="DebugGetNametable")] private static extern void DebugGetNametableWrapper(UInt32 nametableIndex, IntPtr frameBuffer, IntPtr tileData, IntPtr attributeData);
|
[DllImport(DLLPath, EntryPoint="DebugGetNametable")] private static extern void DebugGetNametableWrapper(UInt32 nametableIndex, IntPtr frameBuffer, IntPtr tileData, IntPtr attributeData);
|
||||||
public static void DebugGetNametable(int nametableIndex, out byte[] frameData, out byte[] tileData, out byte[] attributeData)
|
public static void DebugGetNametable(int nametableIndex, out byte[] frameData, out byte[] tileData, out byte[] attributeData)
|
||||||
{
|
{
|
||||||
|
@ -888,6 +902,7 @@ namespace Mesen.GUI
|
||||||
PrgRom = 5,
|
PrgRom = 5,
|
||||||
ChrRom = 6,
|
ChrRom = 6,
|
||||||
ChrRam = 7,
|
ChrRam = 7,
|
||||||
|
InternalRam = 8
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MD5Helper
|
public class MD5Helper
|
||||||
|
|
|
@ -21,6 +21,11 @@ extern "C"
|
||||||
Console::GetInstance()->StopDebugger();
|
Console::GetInstance()->StopDebugger();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DllExport bool __stdcall DebugIsDebuggerRunning()
|
||||||
|
{
|
||||||
|
return Console::GetInstance()->GetDebugger(false).get() != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
DllExport void __stdcall DebugSetFlags(uint32_t flags) { GetDebugger()->SetFlags(flags); }
|
DllExport void __stdcall DebugSetFlags(uint32_t flags) { GetDebugger()->SetFlags(flags); }
|
||||||
|
|
||||||
DllExport void __stdcall DebugGetState(DebugState *state) { GetDebugger()->GetState(state); }
|
DllExport void __stdcall DebugGetState(DebugState *state) { GetDebugger()->GetState(state); }
|
||||||
|
|
Loading…
Add table
Reference in a new issue