2017-08-08 19:32:50 -04:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
2018-06-19 23:51:15 -04:00
|
|
|
|
using System.IO.Compression;
|
2017-08-08 19:32:50 -04:00
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
2018-06-19 23:51:15 -04:00
|
|
|
|
using System.Text.RegularExpressions;
|
2017-08-08 19:32:50 -04:00
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using Mesen.GUI.Config;
|
|
|
|
|
using Mesen.GUI.Debugger;
|
|
|
|
|
using Mesen.GUI.Forms.Cheats;
|
|
|
|
|
using Mesen.GUI.Forms.HdPackEditor;
|
|
|
|
|
using Mesen.GUI.Forms.NetPlay;
|
|
|
|
|
|
|
|
|
|
namespace Mesen.GUI.Forms
|
|
|
|
|
{
|
|
|
|
|
public partial class frmMain
|
|
|
|
|
{
|
2017-09-03 10:24:18 -04:00
|
|
|
|
private void mnuDebug_DropDownOpening(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
mnuEditHeader.Enabled = _emuThread != null && InteropEmu.GetRomInfo().Format == RomFormat.iNes;
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-14 23:44:01 -04:00
|
|
|
|
private void mnuEditHeader_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
using(frmEditHeader frm = new frmEditHeader()) {
|
|
|
|
|
frm.ShowDialog(sender, this);
|
2017-08-08 19:32:50 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuPlayMovie_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
using(OpenFileDialog ofd = new OpenFileDialog()) {
|
|
|
|
|
ofd.SetFilter(ResourceHelper.GetMessage("FilterMovie"));
|
|
|
|
|
ofd.InitialDirectory = ConfigManager.MovieFolder;
|
2017-11-29 23:24:26 -05:00
|
|
|
|
if(ofd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK) {
|
2017-08-08 19:32:50 -04:00
|
|
|
|
InteropEmu.MoviePlay(ofd.FileName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuStopMovie_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
InteropEmu.MovieStop();
|
|
|
|
|
}
|
2017-12-22 15:08:58 -05:00
|
|
|
|
|
|
|
|
|
private void mnuRecordMovie_Click(object sender, EventArgs e)
|
2017-08-08 19:32:50 -04:00
|
|
|
|
{
|
2017-12-22 15:08:58 -05:00
|
|
|
|
using(frmRecordMovie frm = new frmRecordMovie()) {
|
|
|
|
|
frm.ShowDialog(mnuMovies, this);
|
|
|
|
|
}
|
2017-08-08 19:32:50 -04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuWaveRecord_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
using(SaveFileDialog sfd = new SaveFileDialog()) {
|
|
|
|
|
sfd.SetFilter(ResourceHelper.GetMessage("FilterWave"));
|
|
|
|
|
sfd.InitialDirectory = ConfigManager.WaveFolder;
|
|
|
|
|
sfd.FileName = InteropEmu.GetRomInfo().GetRomName() + ".wav";
|
2017-11-29 23:24:26 -05:00
|
|
|
|
if(sfd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK) {
|
2017-08-08 19:32:50 -04:00
|
|
|
|
InteropEmu.WaveRecord(sfd.FileName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuWaveStop_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
InteropEmu.WaveStop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuAviRecord_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
using(frmRecordAvi frm = new frmRecordAvi()) {
|
2017-11-29 23:24:26 -05:00
|
|
|
|
if(frm.ShowDialog(mnuVideoRecorder, this) == DialogResult.OK) {
|
2017-08-08 19:32:50 -04:00
|
|
|
|
InteropEmu.AviRecord(frm.Filename, ConfigManager.Config.AviRecordInfo.Codec, ConfigManager.Config.AviRecordInfo.CompressionLevel);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuAviStop_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
InteropEmu.AviStop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuCheats_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(_cheatListWindow == null) {
|
|
|
|
|
_cheatListWindow = new frmCheatList();
|
|
|
|
|
_cheatListWindow.Show(sender, this);
|
|
|
|
|
_cheatListWindow.FormClosed += (s, evt) => {
|
2018-03-22 18:37:55 -04:00
|
|
|
|
CheatInfo.ApplyCheats();
|
2017-08-08 19:32:50 -04:00
|
|
|
|
_cheatListWindow = null;
|
|
|
|
|
};
|
|
|
|
|
} else {
|
|
|
|
|
_cheatListWindow.Focus();
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-09-08 10:38:41 -04:00
|
|
|
|
|
|
|
|
|
private void LoadRandomGame()
|
2017-08-08 19:32:50 -04:00
|
|
|
|
{
|
|
|
|
|
IEnumerable<string> gameFolders = ConfigManager.Config.RecentFiles.Select(recentFile => recentFile.RomFile.Folder.ToLowerInvariant()).Distinct();
|
|
|
|
|
List<string> gameRoms = new List<string>();
|
|
|
|
|
|
|
|
|
|
foreach(string folder in gameFolders) {
|
|
|
|
|
if(Directory.Exists(folder)) {
|
|
|
|
|
gameRoms.AddRange(Directory.EnumerateFiles(folder, "*.nes", SearchOption.TopDirectoryOnly));
|
|
|
|
|
gameRoms.AddRange(Directory.EnumerateFiles(folder, "*.unf", SearchOption.TopDirectoryOnly));
|
|
|
|
|
gameRoms.AddRange(Directory.EnumerateFiles(folder, "*.fds", SearchOption.TopDirectoryOnly));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(gameRoms.Count == 0) {
|
|
|
|
|
MesenMsgBox.Show("RandomGameNoGameFound", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
|
|
|
} else {
|
|
|
|
|
Random random = new Random();
|
2018-06-02 19:14:25 -04:00
|
|
|
|
string randomGame = gameRoms[random.Next(gameRoms.Count)];
|
2017-08-08 19:32:50 -04:00
|
|
|
|
LoadFile(randomGame);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuLogWindow_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(_logWindow == null) {
|
|
|
|
|
_logWindow = new frmLogWindow();
|
|
|
|
|
_logWindow.Show(sender, this);
|
|
|
|
|
_logWindow.FormClosed += (object a, FormClosedEventArgs b) => {
|
|
|
|
|
_logWindow = null;
|
|
|
|
|
};
|
|
|
|
|
} else {
|
|
|
|
|
_logWindow.Focus();
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-06-19 23:51:15 -04:00
|
|
|
|
|
|
|
|
|
private void mnuInstallHdPack_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
using(OpenFileDialog ofd = new OpenFileDialog()) {
|
|
|
|
|
ofd.SetFilter(ResourceHelper.GetMessage("FilterZipFiles"));
|
|
|
|
|
if(ofd.ShowDialog(this) == DialogResult.OK) {
|
|
|
|
|
try {
|
|
|
|
|
using(FileStream stream = File.Open(ofd.FileName, FileMode.Open)) {
|
|
|
|
|
ZipArchive zip = new ZipArchive(stream);
|
|
|
|
|
|
|
|
|
|
//Find the hires.txt file
|
|
|
|
|
ZipArchiveEntry hiresEntry = null;
|
|
|
|
|
foreach(ZipArchiveEntry entry in zip.Entries) {
|
|
|
|
|
if(entry.Name == "hires.txt") {
|
|
|
|
|
hiresEntry = entry;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(hiresEntry != null) {
|
|
|
|
|
using(Stream entryStream = hiresEntry.Open()) {
|
|
|
|
|
using(StreamReader reader = new StreamReader(entryStream)) {
|
|
|
|
|
string hiresData = reader.ReadToEnd();
|
|
|
|
|
RomInfo romInfo = InteropEmu.GetRomInfo();
|
|
|
|
|
|
|
|
|
|
//If there's a "supportedRom" tag, check if it matches the current ROM
|
|
|
|
|
Regex supportedRomRegex = new Regex("<supportedRom>([^\\n]*)");
|
|
|
|
|
Match match = supportedRomRegex.Match(hiresData);
|
|
|
|
|
if(match.Success) {
|
|
|
|
|
if(!match.Groups[1].Value.ToUpper().Contains(InteropEmu.GetRomInfo().Sha1.ToUpper())) {
|
|
|
|
|
MesenMsgBox.Show("InstallHdPackWrongRom", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Extract HD pack
|
|
|
|
|
try {
|
|
|
|
|
string targetFolder = Path.Combine(ConfigManager.HdPackFolder, Path.GetFileNameWithoutExtension(romInfo.GetRomName()));
|
|
|
|
|
if(Directory.Exists(targetFolder)) {
|
|
|
|
|
//Warn if the folder already exists
|
|
|
|
|
if(MesenMsgBox.Show("InstallHdPackConfirmOverwrite", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, targetFolder) != DialogResult.OK) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
Directory.CreateDirectory(targetFolder);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string hiresFileFolder = hiresEntry.FullName.Substring(0, hiresEntry.FullName.Length - "hires.txt".Length);
|
|
|
|
|
foreach(ZipArchiveEntry entry in zip.Entries) {
|
|
|
|
|
//Extract only the files in the same subfolder as the hires.txt file (and only if they have a name & size > 0)
|
|
|
|
|
if(!string.IsNullOrWhiteSpace(entry.Name) && entry.Length > 0 && entry.FullName.StartsWith(hiresFileFolder)) {
|
|
|
|
|
entry.ExtractToFile(Path.Combine(targetFolder, entry.Name), true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch(Exception ex) {
|
|
|
|
|
MesenMsgBox.Show("InstallHdPackError", MessageBoxButtons.OK, MessageBoxIcon.Error, ex.ToString());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Turn on HD Pack support automatically after installation succeeds
|
|
|
|
|
ConfigManager.Config.VideoInfo.UseHdPacks = true;
|
|
|
|
|
ConfigManager.ApplyChanges();
|
|
|
|
|
ConfigManager.Config.ApplyConfig();
|
|
|
|
|
|
|
|
|
|
if(MesenMsgBox.Show("InstallHdPackConfirmReset", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) {
|
|
|
|
|
//Power cycle game if the user agrees
|
|
|
|
|
InteropEmu.PowerCycle();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
MesenMsgBox.Show("InstallHdPackInvalidPack", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch {
|
|
|
|
|
//Invalid file (file missing, not a zip file, etc.)
|
|
|
|
|
MesenMsgBox.Show("InstallHdPackInvalidZipFile", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-08-08 19:32:50 -04:00
|
|
|
|
|
|
|
|
|
private void mnuHdPackEditor_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(_hdPackEditorWindow == null) {
|
|
|
|
|
_hdPackEditorWindow = new frmHdPackEditor();
|
|
|
|
|
_hdPackEditorWindow.Show(sender, this);
|
|
|
|
|
_hdPackEditorWindow.FormClosed += (object a, FormClosedEventArgs b) => {
|
|
|
|
|
_hdPackEditorWindow = null;
|
|
|
|
|
};
|
|
|
|
|
} else {
|
|
|
|
|
_hdPackEditorWindow.Focus();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuStartServer_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(InteropEmu.IsServerRunning()) {
|
|
|
|
|
Task.Run(() => InteropEmu.StopServer());
|
|
|
|
|
} else {
|
|
|
|
|
using(frmServerConfig frm = new frmServerConfig()) {
|
2017-11-29 23:24:26 -05:00
|
|
|
|
if(frm.ShowDialog(sender, this) == System.Windows.Forms.DialogResult.OK) {
|
2018-06-16 14:02:12 -04:00
|
|
|
|
InteropEmu.StartServer(ConfigManager.Config.ServerInfo.Port, ConfigManager.Config.ServerInfo.Password, ConfigManager.Config.Profile.PlayerName);
|
2017-08-08 19:32:50 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuConnect_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(InteropEmu.IsConnected()) {
|
|
|
|
|
Task.Run(() => InteropEmu.Disconnect());
|
|
|
|
|
} else {
|
|
|
|
|
using(frmClientConfig frm = new frmClientConfig()) {
|
2017-11-29 23:24:26 -05:00
|
|
|
|
if(frm.ShowDialog(sender, this) == System.Windows.Forms.DialogResult.OK) {
|
2017-08-08 19:32:50 -04:00
|
|
|
|
Task.Run(() => {
|
2018-06-16 14:02:12 -04:00
|
|
|
|
InteropEmu.Connect(
|
|
|
|
|
ConfigManager.Config.ClientConnectionInfo.Host,
|
|
|
|
|
ConfigManager.Config.ClientConnectionInfo.Port,
|
|
|
|
|
ConfigManager.Config.ClientConnectionInfo.Password,
|
|
|
|
|
ConfigManager.Config.Profile.PlayerName,
|
|
|
|
|
ConfigManager.Config.ClientConnectionInfo.Spectator
|
|
|
|
|
);
|
2017-08-08 19:32:50 -04:00
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuProfile_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
using(frmPlayerProfile frm = new frmPlayerProfile()) {
|
2017-11-29 23:24:26 -05:00
|
|
|
|
frm.ShowDialog(sender, this);
|
2017-08-08 19:32:50 -04:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuNetPlayPlayer1_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
InteropEmu.NetPlaySelectController(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuNetPlayPlayer2_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
InteropEmu.NetPlaySelectController(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuNetPlayPlayer3_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
InteropEmu.NetPlaySelectController(2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuNetPlayPlayer4_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
InteropEmu.NetPlaySelectController(3);
|
|
|
|
|
}
|
2017-11-19 23:08:23 -05:00
|
|
|
|
|
|
|
|
|
private void mnuNetPlayPlayer5_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
InteropEmu.NetPlaySelectController(4);
|
|
|
|
|
}
|
2017-08-08 19:32:50 -04:00
|
|
|
|
|
|
|
|
|
private void mnuNetPlaySpectator_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
InteropEmu.NetPlaySelectController(0xFF);
|
|
|
|
|
}
|
2018-03-10 09:58:24 -05:00
|
|
|
|
|
|
|
|
|
private void mnuApuViewer_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DebugWindowManager.OpenDebugWindow(DebugWindow.ApuViewer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuAssembler_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DebugWindowManager.OpenDebugWindow(DebugWindow.Assembler);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuDebugger_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DebugWindowManager.OpenDebugWindow(DebugWindow.Debugger);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuDebugDebugger_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DebugWindowManager.OpenDebugWindow(DebugWindow.Debugger);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuMemoryViewer_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DebugWindowManager.OpenDebugWindow(DebugWindow.MemoryViewer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuEventViewer_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DebugWindowManager.OpenDebugWindow(DebugWindow.EventViewer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuPpuViewer_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DebugWindowManager.OpenDebugWindow(DebugWindow.PpuViewer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuScriptWindow_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DebugWindowManager.OpenDebugWindow(DebugWindow.ScriptWindow);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void mnuTraceLogger_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DebugWindowManager.OpenDebugWindow(DebugWindow.TraceLogger);
|
|
|
|
|
}
|
2018-06-23 18:29:15 -04:00
|
|
|
|
|
|
|
|
|
private void mnuTextHooker_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
DebugWindowManager.OpenDebugWindow(DebugWindow.TextHooker);
|
|
|
|
|
}
|
2017-08-08 19:32:50 -04:00
|
|
|
|
}
|
|
|
|
|
}
|