103 lines
2.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|