diff --git a/BizHawk.Client.Common/movie/tasproj/TasBranch.cs b/BizHawk.Client.Common/movie/tasproj/TasBranch.cs index 80f0d720dd..b290831ff5 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasBranch.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasBranch.cs @@ -25,10 +25,13 @@ namespace BizHawk.Client.Common { public new void Add(TasBranch item) { - var currentHashes = this.Select(b => b.UniqueIdentifier.GetHashCode()).ToList(); + if (item.UniqueIdentifier == Guid.Empty) + { + var currentHashes = this.Select(b => b.UniqueIdentifier.GetHashCode()).ToList(); - do item.UniqueIdentifier = Guid.NewGuid(); - while (currentHashes.Contains(item.UniqueIdentifier.GetHashCode())); + do item.UniqueIdentifier = Guid.NewGuid(); + while (currentHashes.Contains(item.UniqueIdentifier.GetHashCode())); + } base.Add(item); } diff --git a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs index 86e572ff12..a3fb105333 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs @@ -503,38 +503,6 @@ namespace BizHawk.Client.Common MaybeRemoveStates(); } - // TODO: save/load BranchStates - public void Save(BinaryWriter bw) - { - List noSave = ExcludeStates(); - - bw.Write(States.Count - noSave.Count); - for (int i = 0; i < States.Count; i++) - { - if (noSave.Contains(i)) - continue; - - StateAccessed(States.ElementAt(i).Key); - KeyValuePair kvp = States.ElementAt(i); - bw.Write(kvp.Key); - bw.Write(kvp.Value.Length); - bw.Write(kvp.Value.State); - } - - bw.Write(currentBranch); - bw.Write(BranchStates.Count); - foreach (var s in BranchStates) - { - bw.Write(s.Key); - bw.Write(s.Value.Count); - foreach (var t in s.Value) - { - bw.Write(t.Key); - t.Value.Write(bw); - } - } - } - private List ExcludeStates() { List ret = new List(); @@ -569,6 +537,41 @@ namespace BizHawk.Client.Common return ret; } + public void Save(BinaryWriter bw) + { + List noSave = ExcludeStates(); + + bw.Write(States.Count - noSave.Count); + for (int i = 0; i < States.Count; i++) + { + if (noSave.Contains(i)) + continue; + + StateAccessed(States.ElementAt(i).Key); + KeyValuePair kvp = States.ElementAt(i); + bw.Write(kvp.Key); + bw.Write(kvp.Value.Length); + bw.Write(kvp.Value.State); + } + + bw.Write(currentBranch); + + if (Settings.BranchStatesInTasproj) + { + bw.Write(BranchStates.Count); + foreach (var s in BranchStates) + { + bw.Write(s.Key); + bw.Write(s.Value.Count); + foreach (var t in s.Value) + { + bw.Write(t.Key); + t.Value.Write(bw); + } + } + } + } + public void Load(BinaryReader br) { States.Clear(); @@ -592,22 +595,26 @@ namespace BizHawk.Client.Common return; currentBranch = br.ReadInt32(); - int c = br.ReadInt32(); - BranchStates = new SortedList>(c); - while (c > 0) + + if (Settings.BranchStatesInTasproj) { - int key = br.ReadInt32(); - int c2 = br.ReadInt32(); - var list = new SortedList(c2); - while (c2 > 0) + int c = br.ReadInt32(); + BranchStates = new SortedList>(c); + while (c > 0) { - int key2 = br.ReadInt32(); - var state = StateManagerState.Read(br, this); - list.Add(key2, state); - c2--; + int key = br.ReadInt32(); + int c2 = br.ReadInt32(); + var list = new SortedList(c2); + while (c2 > 0) + { + int key2 = br.ReadInt32(); + var state = StateManagerState.Read(br, this); + list.Add(key2, state); + c2--; + } + BranchStates.Add(key, list); + c--; } - BranchStates.Add(key, list); - c--; } } diff --git a/BizHawk.Client.Common/movie/tasproj/TasStateManagerSettings.cs b/BizHawk.Client.Common/movie/tasproj/TasStateManagerSettings.cs index 2ccd8ba8fa..04c9a6a135 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasStateManagerSettings.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasStateManagerSettings.cs @@ -13,6 +13,7 @@ namespace BizHawk.Client.Common DiskSaveCapacitymb = 512; Capacitymb = 512; DiskCapacitymb = 512; + BranchStatesInTasproj = false; } public TasStateManagerSettings(TasStateManagerSettings settings) @@ -20,6 +21,7 @@ namespace BizHawk.Client.Common DiskSaveCapacitymb = settings.DiskSaveCapacitymb; Capacitymb = settings.Capacitymb; DiskCapacitymb = settings.DiskCapacitymb; + BranchStatesInTasproj = settings.BranchStatesInTasproj; } /// @@ -50,6 +52,13 @@ namespace BizHawk.Client.Common [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; } + /// + /// Put branch states to .tasproj + /// + [DisplayName("Put branch states to .tasproj")] + [Description("Put branch states to .tasproj")] + public bool BranchStatesInTasproj { get; set; } + /// /// The total state capacity in bytes. /// @@ -77,6 +86,7 @@ namespace BizHawk.Client.Common sb.AppendLine(DiskSaveCapacitymb.ToString()); sb.AppendLine(Capacitymb.ToString()); sb.AppendLine(DiskCapacitymb.ToString()); + sb.AppendLine(BranchStatesInTasproj.ToString()); return sb.ToString(); } @@ -88,6 +98,7 @@ namespace BizHawk.Client.Common 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])) @@ -97,10 +108,16 @@ namespace BizHawk.Client.Common } 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; } } } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.Designer.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.Designer.cs index 8488b81e49..2cdd800120 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.Designer.cs @@ -53,6 +53,7 @@ namespace BizHawk.Client.EmuHawk this.label8 = new System.Windows.Forms.Label(); this.label9 = new System.Windows.Forms.Label(); this.NumSaveStatesLabel = new System.Windows.Forms.Label(); + this.BranchStatesInTasproj = new System.Windows.Forms.CheckBox(); ((System.ComponentModel.ISupportInitialize)(this.MemCapacityNumeric)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.DiskCapacityNumeric)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.SaveCapacityNumeric)).BeginInit(); @@ -62,7 +63,7 @@ namespace BizHawk.Client.EmuHawk // this.CancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.CancelBtn.Location = new System.Drawing.Point(216, 113); + this.CancelBtn.Location = new System.Drawing.Point(216, 143); this.CancelBtn.Name = "CancelBtn"; this.CancelBtn.Size = new System.Drawing.Size(60, 23); this.CancelBtn.TabIndex = 0; @@ -73,7 +74,7 @@ namespace BizHawk.Client.EmuHawk // OkBtn // this.OkBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.OkBtn.Location = new System.Drawing.Point(150, 113); + this.OkBtn.Location = new System.Drawing.Point(150, 143); this.OkBtn.Name = "OkBtn"; this.OkBtn.Size = new System.Drawing.Size(60, 23); this.OkBtn.TabIndex = 1; @@ -116,7 +117,7 @@ namespace BizHawk.Client.EmuHawk // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 9); + this.label2.Location = new System.Drawing.Point(9, 9); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(88, 13); this.label2.TabIndex = 5; @@ -125,7 +126,7 @@ namespace BizHawk.Client.EmuHawk // label3 // this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(126, 9); + this.label3.Location = new System.Drawing.Point(147, 9); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(79, 13); this.label3.TabIndex = 6; @@ -134,7 +135,7 @@ namespace BizHawk.Client.EmuHawk // SavestateSizeLabel // this.SavestateSizeLabel.AutoSize = true; - this.SavestateSizeLabel.Location = new System.Drawing.Point(208, 9); + this.SavestateSizeLabel.Location = new System.Drawing.Point(229, 9); this.SavestateSizeLabel.Name = "SavestateSizeLabel"; this.SavestateSizeLabel.Size = new System.Drawing.Size(25, 13); this.SavestateSizeLabel.TabIndex = 7; @@ -188,7 +189,7 @@ namespace BizHawk.Client.EmuHawk // label6 // this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(12, 49); + this.label6.Location = new System.Drawing.Point(9, 49); this.label6.Name = "label6"; this.label6.Size = new System.Drawing.Size(72, 13); this.label6.TabIndex = 5; @@ -196,7 +197,7 @@ namespace BizHawk.Client.EmuHawk // // SaveCapacityNumeric // - this.SaveCapacityNumeric.Location = new System.Drawing.Point(158, 66); + this.SaveCapacityNumeric.Location = new System.Drawing.Point(150, 66); this.SaveCapacityNumeric.Maximum = new decimal(new int[] { 65536, 0, @@ -215,7 +216,7 @@ namespace BizHawk.Client.EmuHawk // label7 // this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(213, 69); + this.label7.Location = new System.Drawing.Point(205, 69); this.label7.Name = "label7"; this.label7.Size = new System.Drawing.Size(21, 13); this.label7.TabIndex = 4; @@ -224,7 +225,7 @@ namespace BizHawk.Client.EmuHawk // label8 // this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(158, 49); + this.label8.Location = new System.Drawing.Point(147, 49); this.label8.Name = "label8"; this.label8.Size = new System.Drawing.Size(112, 13); this.label8.TabIndex = 5; @@ -233,7 +234,7 @@ namespace BizHawk.Client.EmuHawk // label9 // this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(155, 89); + this.label9.Location = new System.Drawing.Point(147, 89); this.label9.Name = "label9"; this.label9.Size = new System.Drawing.Size(84, 13); this.label9.TabIndex = 8; @@ -242,19 +243,31 @@ namespace BizHawk.Client.EmuHawk // NumSaveStatesLabel // this.NumSaveStatesLabel.AutoSize = true; - this.NumSaveStatesLabel.Location = new System.Drawing.Point(242, 89); + this.NumSaveStatesLabel.Location = new System.Drawing.Point(234, 89); this.NumSaveStatesLabel.Name = "NumSaveStatesLabel"; this.NumSaveStatesLabel.Size = new System.Drawing.Size(25, 13); this.NumSaveStatesLabel.TabIndex = 9; this.NumSaveStatesLabel.Text = "1kb"; // + // BranchStatesInTasproj + // + this.BranchStatesInTasproj.AutoSize = true; + this.BranchStatesInTasproj.Location = new System.Drawing.Point(12, 118); + this.BranchStatesInTasproj.Name = "BranchStatesInTasproj"; + this.BranchStatesInTasproj.Size = new System.Drawing.Size(158, 17); + this.BranchStatesInTasproj.TabIndex = 10; + this.BranchStatesInTasproj.Text = "Put branch states to .tasproj"; + this.BranchStatesInTasproj.UseVisualStyleBackColor = true; + this.BranchStatesInTasproj.CheckedChanged += new System.EventHandler(this.BranchStatesInTasproj_CheckedChanged); + // // StateHistorySettingsForm // this.AcceptButton = this.OkBtn; this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.CancelBtn; - this.ClientSize = new System.Drawing.Size(288, 148); + this.ClientSize = new System.Drawing.Size(288, 178); + this.Controls.Add(this.BranchStatesInTasproj); this.Controls.Add(this.NumSaveStatesLabel); this.Controls.Add(this.NumStatesLabel); this.Controls.Add(this.label9); @@ -303,5 +316,6 @@ namespace BizHawk.Client.EmuHawk private Label label8; private Label label9; private Label NumSaveStatesLabel; + private CheckBox BranchStatesInTasproj; } } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.cs index a9293a0f9c..5e25225437 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.cs @@ -44,6 +44,7 @@ namespace BizHawk.Client.EmuHawk SavestateSizeLabel.Text = Math.Round(_stateSizeMb, 2).ToString() + " mb"; CapacityNumeric_ValueChanged(null, null); SaveCapacityNumeric_ValueChanged(null, null); + BranchStatesInTasproj.Checked = Settings.BranchStatesInTasproj; } private int MaxStatesInCapacity @@ -79,5 +80,10 @@ namespace BizHawk.Client.EmuHawk { NumSaveStatesLabel.Text = ((int)Math.Floor(SaveCapacityNumeric.Value / _stateSizeMb)).ToString(); } + + private void BranchStatesInTasproj_CheckedChanged(object sender, EventArgs e) + { + Settings.BranchStatesInTasproj = BranchStatesInTasproj.Checked; + } } }