Branch states on RAM should work. (Disk states will break things.)

This commit is contained in:
Suuper 2015-08-13 08:30:43 -05:00
parent 4eec497174
commit 4ce346661b
4 changed files with 144 additions and 43 deletions

View File

@ -77,11 +77,20 @@ namespace BizHawk.Client.Common
}
public TasLagLog TasLagLog { get { return LagLog; } }
public TasBranchCollection TasBranches { get { return Branches; } }
public List<string> InputLog { get { return _log; } }
public TasMovieMarkerList Markers { get; set; }
public bool BindMarkersToInput { get; set; }
public bool UseInputCache { get; set; }
public TasBranch GetBranch(int id) { return Branches[id]; }
public int BranchCount { get { return Branches.Count; } }
public int BranchIndex(int frame)
{
TasBranch branch = Branches.Where(b => b.Frame == frame)
.OrderByDescending(b => b.TimeStamp).FirstOrDefault();
if (branch == null)
return -1;
return Branches.IndexOf(branch);
}
public override string PreferredExtension
{
@ -467,10 +476,11 @@ namespace BizHawk.Client.Common
_changes = true;
LagLog.FromLagLog(branch.LagLog);
if (divergentPoint.HasValue)
StateManager.Invalidate(divergentPoint.Value);
else
StateManager.Invalidate(branch.InputLog.Count);
//if (divergentPoint.HasValue)
// StateManager.Invalidate(divergentPoint.Value);
//else
// StateManager.Invalidate(branch.InputLog.Count);
StateManager.LoadBranch(Branches.IndexOf(branch));
StateManager.SetState(branch.Frame, branch.CoreData);
@ -496,5 +506,35 @@ namespace BizHawk.Client.Common
return null;
}
public void AddBranch(TasBranch branch)
{
Branches.Add(branch);
TasStateManager.AddBranch();
}
public void RemoveBranch(TasBranch branch)
{
TasStateManager.RemoveBranch(Branches.IndexOf(branch));
Branches.Remove(branch);
}
public void UpdateBranch(TasBranch old, TasBranch newBranch)
{
int index = Branches.IndexOf(old);
Branches[index] = newBranch;
TasStateManager.UpdateBranch(index);
}
public void SwapBranches(int b1, int b2)
{
TasBranch branch = Branches[b1];
if (b2 >= Branches.Count)
b2 = Branches.Count - 1;
Branches.Remove(branch);
Branches.Insert(b2, branch);
}
}
}

View File

@ -37,6 +37,8 @@ namespace BizHawk.Client.Common
private Guid guid = Guid.NewGuid();
private SortedList<int, byte[]> States = new SortedList<int, byte[]>();
private SortedList<int, SortedList<int, byte[]>> BranchStates = new SortedList<int, SortedList<int, byte[]>>();
private int branches = 0;
private string statePath
{
get
@ -570,5 +572,79 @@ namespace BizHawk.Client.Common
return 0;
}
}
#region "Branches"
public void AddBranch()
{
foreach (KeyValuePair<int, byte[]> kvp in States)
{
if (!BranchStates.ContainsKey(kvp.Key))
BranchStates.Add(kvp.Key, new SortedList<int, byte[]>());
SortedList<int, byte[]> stateList = BranchStates[kvp.Key];
if (stateList == null)
{
stateList = new SortedList<int, byte[]>();
BranchStates[kvp.Key] = stateList;
}
stateList.Add(branches, kvp.Value);
}
branches++;
}
public void RemoveBranch(int index)
{
foreach (KeyValuePair<int, SortedList<int, byte[]>> kvp in BranchStates)
{
SortedList<int, byte[]> stateList = kvp.Value;
if (stateList == null)
continue;
stateList.Remove(index);
if (stateList.Count == 0)
BranchStates[kvp.Key] = null;
}
branches--;
}
public void UpdateBranch(int index)
{
// RemoveBranch
foreach (KeyValuePair<int, SortedList<int, byte[]>> kvp in BranchStates)
{
SortedList<int, byte[]> stateList = kvp.Value;
if (stateList == null)
continue;
stateList.Remove(index);
if (stateList.Count == 0)
BranchStates[kvp.Key] = null;
}
// AddBranch
foreach (KeyValuePair<int, byte[]> kvp in States)
{
SortedList<int, byte[]> stateList = BranchStates[kvp.Key];
if (stateList == null)
{
stateList = new SortedList<int, byte[]>();
BranchStates[kvp.Key] = stateList;
}
stateList.Add(index, kvp.Value);
}
}
public void LoadBranch(int index)
{
Invalidate(0); // Not a good way of doing it?
foreach (KeyValuePair<int, SortedList<int, byte[]>> kvp in BranchStates)
{
if (kvp.Key == 0 && States.ContainsKey(0))
continue; // TODO: It might be a better idea to just not put state 0 in BranchStates.
if (kvp.Value.ContainsKey(index))
SetState(kvp.Key, kvp.Value[index]);
}
}
#endregion
}
}

View File

@ -21,10 +21,11 @@ namespace BizHawk.Client.EmuHawk
private readonly PlatformFrameRates FrameRates = new PlatformFrameRates();
public TAStudio Tastudio { get; set; }
private TasMovie Movie { get { return Tastudio.CurrentTasMovie; } }
public TasBranchCollection Branches
private TasBranch GetBranch(int id)
{
get { return Tastudio.CurrentTasMovie.TasBranches; }
return Tastudio.CurrentTasMovie.GetBranch(id);
}
public BookmarksBranchesBox()
@ -63,7 +64,7 @@ namespace BizHawk.Client.EmuHawk
{
if (BranchView.AnyRowsSelected)
{
return Branches[BranchView.SelectedRows.First()];
return GetBranch(BranchView.SelectedRows.First());
}
return null;
@ -76,7 +77,7 @@ namespace BizHawk.Client.EmuHawk
{
text = string.Empty;
if (index >= Tastudio.CurrentTasMovie.TasBranches.Count)
if (index >= Movie.BranchCount)
{
return;
}
@ -87,10 +88,10 @@ namespace BizHawk.Client.EmuHawk
text = index.ToString();
break;
case FrameColumnName:
text = Branches[index].Frame.ToString();
text = GetBranch(index).Frame.ToString();
break;
case TimeColumnName:
text = Branches[index].TimeStamp.ToString(@"hh\:mm\:ss\.ff");
text = GetBranch(index).TimeStamp.ToString(@"hh\:mm\:ss\.ff");
break;
}
}
@ -147,14 +148,14 @@ namespace BizHawk.Client.EmuHawk
{
if (SelectedBranch != null)
{
int index = Branches.IndexOf(SelectedBranch);
int index = BranchView.SelectedRows.First();
if (index == CurrentBranch)
{
CurrentBranch = -1;
}
Branches.Remove(SelectedBranch);
BranchView.RowCount = Branches.Count;
Movie.RemoveBranch(SelectedBranch);
BranchView.RowCount = Movie.BranchCount;
if (index == BranchView.SelectedRows.FirstOrDefault())
{
@ -179,15 +180,15 @@ namespace BizHawk.Client.EmuHawk
public void UpdateValues()
{
BranchView.RowCount = Branches.Count;
BranchView.RowCount = Movie.BranchCount;
}
public void Branch()
{
TasBranch branch = CreateBranch();
Branches.Add(branch);
BranchView.RowCount = Branches.Count;
CurrentBranch = Branches.IndexOf(branch);
Movie.AddBranch(branch);
BranchView.RowCount = Movie.BranchCount;
CurrentBranch = Movie.BranchCount - 1;
BranchView.Refresh();
Tastudio.RefreshDialog();
}
@ -209,11 +210,11 @@ namespace BizHawk.Client.EmuHawk
private void BranchView_CellHovered(object sender, InputRoll.CellEventArgs e)
{
if (e.NewCell != null && e.NewCell.RowIndex.HasValue && e.NewCell.Column != null && e.NewCell.RowIndex < Branches.Count)
if (e.NewCell != null && e.NewCell.RowIndex.HasValue && e.NewCell.Column != null && e.NewCell.RowIndex < Movie.BranchCount)
{
if (e.NewCell.Column.Name == BranchNumberColumnName)
{
ScreenShotPopUp(Branches[e.NewCell.RowIndex.Value], e.NewCell.RowIndex.Value);
ScreenShotPopUp(GetBranch(e.NewCell.RowIndex.Value), e.NewCell.RowIndex.Value);
}
else
{
@ -268,18 +269,13 @@ namespace BizHawk.Client.EmuHawk
if (SelectedBranch != null)
{
UpdateBranch(SelectedBranch);
CurrentBranch = BranchView.SelectedRows.First();
}
}
private void UpdateBranch(TasBranch branch)
{
var index = Branches.IndexOf(branch);
var newbranch = CreateBranch();
Branches.Insert(index, newbranch);
Branches.Remove(branch);
CurrentBranch = index;
Movie.UpdateBranch(branch, CreateBranch());
BranchView.Refresh();
}
@ -305,17 +301,9 @@ namespace BizHawk.Client.EmuHawk
private void BranchView_CellDropped(object sender, InputRoll.CellEventArgs e)
{
if (e.NewCell != null && e.NewCell.IsDataCell && e.OldCell.RowIndex.Value < Branches.Count)
if (e.NewCell != null && e.NewCell.IsDataCell && e.OldCell.RowIndex.Value < Movie.BranchCount)
{
var branch = Branches[e.OldCell.RowIndex.Value];
int originalIndex = Branches.IndexOf(branch);
int newIndex = e.NewCell.RowIndex.Value;
if (newIndex >= Branches.Count)
newIndex = Branches.Count - 1;
Branches.Remove(branch);
Branches.Insert(newIndex, branch);
Movie.SwapBranches(e.OldCell.RowIndex.Value, e.NewCell.RowIndex.Value);
}
}
}

View File

@ -198,13 +198,10 @@ namespace BizHawk.Client.EmuHawk
if (columnName == CursorColumnName)
{
var branch = CurrentTasMovie.TasBranches
.Where(b => b.Frame == index)
.OrderByDescending(b => b.TimeStamp)
.FirstOrDefault();
if (branch != null)
int branchIndex = CurrentTasMovie.BranchIndex(index);
if (branchIndex != -1)
{
text = CurrentTasMovie.TasBranches.IndexOf(branch).ToString();
text = branchIndex.ToString();
}
}
else if (columnName == FrameColumnName)