public void MoveBackTo(NodeHistoryEntry nodeHistoryEntry, int dialogueIndex, bool clearFuture = false, Action onFinish = null) { // Debug.Log($"MoveBackTo begin {nodeHistoryEntry.Key} {nodeHistoryEntry.Value} {dialogueIndex}"); CancelAction(); // Animation should stop NovaAnimation.StopAll(AnimationType.All ^ AnimationType.UI); // Restore history var backNodeIndex = nodeHistory.FindLastIndex(x => x.Equals(nodeHistoryEntry)); if (backNodeIndex < 0) { Debug.LogWarning($"Nova: Move back to node {nodeHistoryEntry.Key} that has not been walked through."); } if (clearFuture) { // All save data of nodes to be removed are deleted for (var i = backNodeIndex + 1; i < nodeHistory.Count; ++i) { checkpointManager.UnsetReached(nodeHistory.GetHashULong(0, i + 1)); } // All save data of later dialogues are deleted checkpointManager.UnsetReachedAfter(nodeHistory, dialogueIndex); } nodeHistory.RemoveRange(backNodeIndex + 1, nodeHistory.Count - (backNodeIndex + 1)); if (backNodeIndex < 0) { nodeHistory.Add(nodeHistoryEntry.Key); } nodeHistory.RemoveInterruptsAfter(backNodeIndex, dialogueIndex); currentNode = flowChartTree.GetNode(nodeHistoryEntry.Key); currentIndex = dialogueIndex; // Restore data var entry = checkpointManager.GetReached(nodeHistory, dialogueIndex); this.RuntimeAssert(entry != null, $"Unable to find restore entry with {nodeHistory} {nodeHistory.Hash}, dialogueIndex {dialogueIndex}"); Restore(entry, onFinish); // Debug.Log($"MoveBackTo end {nodeHistoryEntry.Key} {nodeHistoryEntry.Value} {dialogueIndex}"); }