private void GoBackTo(int timeStamp, bool isPreview, bool removeBackPoint = false) { IsPreview = isPreview; PreviewStamp = timeStamp; if (!isPreview) { CurrentTimeStamp = removeBackPoint ? timeStamp - 1 : timeStamp; FakeTime = TimeStampTime[CurrentTimeStamp]; } var listNode = Rewindables.First; while (listNode != null) { var node = listNode.Value; var curListNode = listNode; listNode = listNode.Next; if (node == null) { Rewindables.Remove(curListNode); continue; } var container = node.GetTimeStateContainer; if (container.TryGetStateAtTimeStamp(timeStamp, out var state)) { TimeScribe.EnterNode(ScribeMode.Rewind, state); node.ExposeTimeData(); TimeScribe.ExitNode(); } else { node.RewindToPreBirth(); } if (!isPreview) { container.RemoveStatesAfter(removeBackPoint ? timeStamp - 1 : timeStamp); } } }
private void RecordAll(bool removeExceedingState = true) { ++CurrentTimeStamp; if (TimeStampTime.Count >= CurrentTimeStamp + 1) { TimeStampTime[CurrentTimeStamp] = FakeTime; } else { TimeStampTime.Add(FakeTime); } var listNode = Rewindables.First; while (listNode != null) { var node = listNode.Value; var curListNode = listNode; listNode = listNode.Next; if (node == null) { Rewindables.Remove(curListNode); continue; } TimeScribe.EnterNode(ScribeMode.Probe, null); node.ExposeTimeData(); byte[] state = new byte[TimeScribe.ProbeRes]; TimeScribe.EnterNode(ScribeMode.Record, state); node.ExposeTimeData(); node.GetTimeStateContainer.AddTimeState(state, CurrentTimeStamp); if (removeExceedingState) { node.GetTimeStateContainer.RemoveStatesBefore(EarliestExistingTimeState); } TimeScribe.ExitNode(); } }