namespace GeometryTD.Procedure { public static class RunStateAdvanceService { public static bool TryCompleteCurrentNode( RunState runState, RunNodeCompletionStatus completionStatus, RunNodeCompletionSnapshot completionSnapshot) { if (runState == null || runState.IsCompleted) { return false; } RunNodeState currentNode = runState.CurrentNode; if (currentNode == null || currentNode.Status != RunNodeStatus.Available) { return false; } runState.ApplyCompletionSnapshot(completionSnapshot); if (completionStatus == RunNodeCompletionStatus.Exception) { currentNode.Status = RunNodeStatus.Exception; return true; } if (completionStatus != RunNodeCompletionStatus.Completed) { return false; } currentNode.Status = RunNodeStatus.Completed; int nextIndex = runState.CurrentNodeIndex + 1; if (nextIndex >= runState.Nodes.Count) { runState.CurrentNodeContinueChallengeLayer = 0; runState.CurrentNodeIndex = runState.Nodes.Count; runState.IsCompleted = true; return true; } runState.CurrentNodeIndex = nextIndex; runState.CurrentNodeContinueChallengeLayer = 0; RunNodeState nextNode = runState.CurrentNode; if (nextNode != null && nextNode.Status == RunNodeStatus.Locked) { nextNode.Status = RunNodeStatus.Available; } return true; } } }