2019-03-12 09:15:57 -04:00
|
|
|
|
using Mesen.GUI.Config;
|
|
|
|
|
using Mesen.GUI.Config.Shortcuts;
|
|
|
|
|
using Mesen.GUI.Forms;
|
|
|
|
|
using Mesen.GUI.Properties;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2020-02-05 19:53:18 -05:00
|
|
|
|
using System.IO;
|
2019-03-12 09:15:57 -04:00
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
|
|
|
|
|
namespace Mesen.GUI.Emulation
|
|
|
|
|
{
|
|
|
|
|
public static class SaveStateManager
|
|
|
|
|
{
|
|
|
|
|
private const int NumberOfSaveSlots = 10;
|
|
|
|
|
|
|
|
|
|
public static void UpdateStateMenu(ToolStripMenuItem menu, bool forSave)
|
|
|
|
|
{
|
2020-02-16 21:11:01 -05:00
|
|
|
|
string romName = EmuApi.GetRomInfo().GetRomName();
|
2019-03-12 09:15:57 -04:00
|
|
|
|
for(uint i = 1; i <= NumberOfSaveSlots + (forSave ? 0 : 1); i++) {
|
2020-02-16 21:11:01 -05:00
|
|
|
|
string statePath = Path.Combine(ConfigManager.SaveStateFolder, romName + "_" + i + ".mss");
|
2019-03-12 09:15:57 -04:00
|
|
|
|
string label;
|
|
|
|
|
bool isAutoSaveSlot = i == NumberOfSaveSlots + 1;
|
|
|
|
|
string slotName = isAutoSaveSlot ? "Auto" : i.ToString();
|
|
|
|
|
|
2020-02-05 19:53:18 -05:00
|
|
|
|
if(!File.Exists(statePath)) {
|
2019-03-12 09:15:57 -04:00
|
|
|
|
label = slotName + ". " + ResourceHelper.GetMessage("EmptyState");
|
|
|
|
|
} else {
|
2020-02-05 19:53:18 -05:00
|
|
|
|
DateTime dateTime = new FileInfo(statePath).LastWriteTime;
|
2019-03-12 09:15:57 -04:00
|
|
|
|
label = slotName + ". " + dateTime.ToShortDateString() + " " + dateTime.ToShortTimeString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(i == NumberOfSaveSlots + 1) {
|
|
|
|
|
//Autosave slot (load only)
|
|
|
|
|
menu.DropDownItems[NumberOfSaveSlots + 1].Text = label;
|
|
|
|
|
} else {
|
|
|
|
|
menu.DropDownItems[(int)i - 1].Text = label;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void InitializeStateMenu(ToolStripMenuItem menu, bool forSave, ShortcutHandler shortcutHandler)
|
|
|
|
|
{
|
|
|
|
|
Action<uint> addSaveStateInfo = (i) => {
|
|
|
|
|
ToolStripMenuItem item = new ToolStripMenuItem();
|
|
|
|
|
menu.DropDownItems.Add(item);
|
|
|
|
|
|
|
|
|
|
if(forSave) {
|
|
|
|
|
shortcutHandler.BindShortcut(item, (EmulatorShortcut)((int)EmulatorShortcut.SaveStateSlot1 + i - 1));
|
|
|
|
|
} else {
|
|
|
|
|
shortcutHandler.BindShortcut(item, (EmulatorShortcut)((int)EmulatorShortcut.LoadStateSlot1 + i - 1));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for(uint i = 1; i <= NumberOfSaveSlots; i++) {
|
|
|
|
|
addSaveStateInfo(i);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!forSave) {
|
|
|
|
|
menu.DropDownItems.Add("-");
|
|
|
|
|
addSaveStateInfo(NumberOfSaveSlots + 1);
|
|
|
|
|
menu.DropDownItems.Add("-");
|
2020-02-05 21:30:16 -05:00
|
|
|
|
|
|
|
|
|
ToolStripMenuItem loadDialog = new ToolStripMenuItem(ResourceHelper.GetMessage("LoadStateDialog"), Resources.SplitView);
|
|
|
|
|
menu.DropDownItems.Add(loadDialog);
|
|
|
|
|
shortcutHandler.BindShortcut(loadDialog, EmulatorShortcut.LoadStateDialog, () => EmuRunner.IsRunning() && !NetplayApi.IsConnected());
|
|
|
|
|
|
2019-03-12 09:15:57 -04:00
|
|
|
|
ToolStripMenuItem loadFromFile = new ToolStripMenuItem(ResourceHelper.GetMessage("LoadFromFile"), Resources.Folder);
|
|
|
|
|
menu.DropDownItems.Add(loadFromFile);
|
|
|
|
|
shortcutHandler.BindShortcut(loadFromFile, EmulatorShortcut.LoadStateFromFile);
|
|
|
|
|
} else {
|
|
|
|
|
menu.DropDownItems.Add("-");
|
2020-02-05 21:30:16 -05:00
|
|
|
|
ToolStripMenuItem saveDialog = new ToolStripMenuItem(ResourceHelper.GetMessage("SaveStateDialog"), Resources.SplitView);
|
|
|
|
|
menu.DropDownItems.Add(saveDialog);
|
|
|
|
|
shortcutHandler.BindShortcut(saveDialog, EmulatorShortcut.SaveStateDialog, () => EmuRunner.IsRunning() && !NetplayApi.IsConnected());
|
|
|
|
|
|
2019-03-12 09:15:57 -04:00
|
|
|
|
ToolStripMenuItem saveToFile = new ToolStripMenuItem(ResourceHelper.GetMessage("SaveToFile"), Resources.SaveFloppy);
|
|
|
|
|
menu.DropDownItems.Add(saveToFile);
|
|
|
|
|
shortcutHandler.BindShortcut(saveToFile, EmulatorShortcut.SaveStateToFile);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void SaveState(uint slot)
|
|
|
|
|
{
|
|
|
|
|
if(EmuRunner.IsRunning()) {
|
|
|
|
|
EmuApi.SaveState(slot);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void LoadState(uint slot)
|
|
|
|
|
{
|
|
|
|
|
if(EmuRunner.IsRunning()) {
|
|
|
|
|
EmuApi.LoadState(slot);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void LoadStateFromFile()
|
|
|
|
|
{
|
|
|
|
|
if(EmuRunner.IsRunning()) {
|
|
|
|
|
using(OpenFileDialog ofd = new OpenFileDialog()) {
|
|
|
|
|
ofd.InitialDirectory = ConfigManager.SaveStateFolder;
|
|
|
|
|
ofd.SetFilter(ResourceHelper.GetMessage("FilterSavestate"));
|
2019-10-14 15:04:26 -04:00
|
|
|
|
if(ofd.ShowDialog(frmMain.Instance) == DialogResult.OK) {
|
2019-03-12 09:15:57 -04:00
|
|
|
|
EmuApi.LoadStateFile(ofd.FileName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void SaveStateToFile()
|
|
|
|
|
{
|
|
|
|
|
if(EmuRunner.IsRunning()) {
|
|
|
|
|
using(SaveFileDialog sfd = new SaveFileDialog()) {
|
|
|
|
|
sfd.InitialDirectory = ConfigManager.SaveStateFolder;
|
2019-08-09 16:25:59 -04:00
|
|
|
|
sfd.FileName = EmuApi.GetRomInfo().GetRomName() + ".mss";
|
2019-03-12 09:15:57 -04:00
|
|
|
|
sfd.SetFilter(ResourceHelper.GetMessage("FilterSavestate"));
|
2019-10-14 15:04:26 -04:00
|
|
|
|
if(sfd.ShowDialog(frmMain.Instance) == DialogResult.OK) {
|
2019-03-12 09:15:57 -04:00
|
|
|
|
EmuApi.SaveStateFile(sfd.FileName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|