using System; using System.ComponentModel; using System.Text; using Newtonsoft.Json; namespace BizHawk.Client.Common { public class TasStateManagerSettings { public TasStateManagerSettings() { DiskSaveCapacitymb = 512; Capacitymb = 512; DiskCapacitymb = 512; StateGap = 4; BranchStatesInTasproj = false; EraseBranchStatesFirst = true; } public TasStateManagerSettings(TasStateManagerSettings settings) { DiskSaveCapacitymb = settings.DiskSaveCapacitymb; Capacitymb = settings.Capacitymb; DiskCapacitymb = settings.DiskCapacitymb; StateGap = settings.StateGap; BranchStatesInTasproj = settings.BranchStatesInTasproj; EraseBranchStatesFirst = settings.EraseBranchStatesFirst; } /// /// Whether or not to save state history information to disk /// [DisplayName("Save History")] [Description("Whether or not to use savestate history")] public bool SaveStateHistory { get { return DiskSaveCapacitymb != 0; } } /// /// The size limit to use when saving the tas project to disk. /// [DisplayName("Save Capacity (in megabytes)")] [Description("The size limit to use when saving the tas project to disk.")] public int DiskSaveCapacitymb { get; set; } /// /// The total amount of memory to devote to state history in megabytes /// [DisplayName("Capacity (in megabytes)")] [Description("The size limit of the state history buffer. When this limit is reached it will start moving to disk.")] public int Capacitymb { get; set; } /// /// The total amount of disk space to devote to state history in megabytes /// [DisplayName("Disk Capacity (in megabytes)")] [Description("The size limit of the state history buffer on the disk. When this limit is reached it will start removing previous savestates")] public int DiskCapacitymb { get; set; } /// /// The amount of states to skip during project saving /// [DisplayName("State interval for .tasproj")] [Description("The actual state gap in frames is calculated as Nth power on 2")] public int StateGap { get; set; } /// /// Put branch states to .tasproj /// [DisplayName("Put branch states to .tasproj")] [Description("Put branch states to .tasproj")] public bool BranchStatesInTasproj { get; set; } /// /// Erase branch states before greenzone states when capacity is met /// [DisplayName("Erase branch states first")] [Description("Erase branch states before greenzone states when capacity is met")] public bool EraseBranchStatesFirst { get; set; } /// /// The total state capacity in bytes. /// [JsonIgnore] [Browsable(false)] public ulong CapTotal { get { return (ulong)(Capacitymb + DiskCapacitymb) * 1024UL * 1024UL; } } /// /// The memory state capacity in bytes. /// [JsonIgnore] [Browsable(false)] public ulong Cap { get { return (ulong)Capacitymb * 1024UL * 1024UL; } } public override string ToString() { StringBuilder sb = new StringBuilder(); sb.AppendLine(DiskSaveCapacitymb.ToString()); sb.AppendLine(Capacitymb.ToString()); sb.AppendLine(DiskCapacitymb.ToString()); sb.AppendLine(BranchStatesInTasproj.ToString()); sb.AppendLine(EraseBranchStatesFirst.ToString()); sb.AppendLine(StateGap.ToString()); return sb.ToString(); } public void PopulateFromString(string settings) { if (!string.IsNullOrWhiteSpace(settings)) { try { string[] lines = settings.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); Capacitymb = int.Parse(lines[1]); int refCapacity; if (!int.TryParse(lines[0], out refCapacity)) { if (bool.Parse(lines[0])) DiskSaveCapacitymb = Capacitymb; else DiskSaveCapacitymb = 0; } else DiskSaveCapacitymb = refCapacity; if (lines.Length > 2) DiskCapacitymb = int.Parse(lines[2]); else DiskCapacitymb = 512; if (lines.Length > 3) BranchStatesInTasproj = bool.Parse(lines[3]); else BranchStatesInTasproj = false; if (lines.Length > 4) EraseBranchStatesFirst = bool.Parse(lines[4]); else EraseBranchStatesFirst = true; if (lines.Length > 5) StateGap = int.Parse(lines[5]); else StateGap = 4; } catch (Exception) { // "GreenZoneSettings inconsistent, ignoring" // if we don't catch it, the project won't load // but dialog boxes aren't supposed to exist here? } } } } }