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();
            }
        }