BizHawk/BizHawk.Client.Common/SaveSlotManager.cs

103 lines
2.1 KiB
C#

using System.IO;
using BizHawk.Common;
using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common
{
public class SaveSlotManager
{
private readonly bool[] _slots = new bool[10];
private readonly bool[] _redo = new bool[10];
public void Update(IEmulator emulator, IMovie movie, string saveStatePrefix)
{
if (!emulator.HasSavestates())
{
for (int i = 0; i < 10; i++)
{
_slots[i] = false;
}
return;
}
for (int i = 0; i < 10; i++)
{
if (movie is TasMovie tasMovie)
{
_slots[i] = i < tasMovie.Branches.Count;
}
else
{
var file = new FileInfo($"{saveStatePrefix}.QuickSave{i}.State");
if (file.Directory != null && file.Directory.Exists == false)
{
file.Directory.Create();
}
_slots[i] = file.Exists;
}
}
}
public bool HasSlot(IEmulator emulator, IMovie movie, int slot, string savestatePrefix)
{
if (!emulator.HasSavestates())
{
return false;
}
if (!0.RangeTo(10).Contains(slot))
{
return false;
}
Update(emulator, movie, savestatePrefix);
return _slots[slot];
}
public void ClearRedoList()
{
for (int i = 0; i < 10; i++)
{
_redo[i] = false;
}
}
public void ToggleRedo(IMovie movie, int slot)
{
if (0.RangeTo(9).Contains(slot) && !(movie is TasMovie)) _redo[slot] ^= true;
}
public bool IsRedo(IMovie movie, int slot) => 0.RangeTo(9).Contains(slot) && !(movie is TasMovie) && _redo[slot];
public void SwapBackupSavestate(IMovie movie, string path, int currentSlot)
{
// Takes the .state and .bak files and swaps them
var state = new FileInfo(path);
var backup = new FileInfo($"{path}.bak");
var temp = new FileInfo($"{path}.bak.tmp");
if (!state.Exists || !backup.Exists)
{
return;
}
if (temp.Exists)
{
temp.Delete();
}
backup.CopyTo($"{path}.bak.tmp");
backup.Delete();
state.CopyTo($"{path}.bak");
state.Delete();
temp.CopyTo(path);
temp.Delete();
ToggleRedo(movie, currentSlot);
}
}
}