geometry-tower-defense-base/src-ref/Procedure/ProcedureMain/RunStateAdvanceService.cs

57 lines
1.7 KiB
C#

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