/// <summary> /// Builds the state machine functions /// </summary> /// <param name="inputNpc">Npc</param> /// <param name="stateMachine">State machine</param> /// <returns>Function list</returns> private async Task <List <ScribanExportState> > BuildStateMachineFunctions(KortistoNpc inputNpc, StateMachine stateMachine) { if (stateMachine == null || stateMachine.State == null || !stateMachine.State.Any()) { return(new List <ScribanExportState>()); } _stateMachineFunctionRenderer.SetErrorCollection(_errorCollection); _stateMachineFunctionRenderer.SetExportTemplatePlaceholderResolver(_templatePlaceholderResolver); List <StateTransition> transitions = stateMachine.Link != null ? stateMachine.Link : new List <StateTransition>(); List <StateMachineStartEnd> endNodes = stateMachine.End != null ? stateMachine.End : new List <StateMachineStartEnd>(); string startId = stateMachine.Start.Any() ? stateMachine.Start.FirstOrDefault().Id : string.Empty; List <ScribanExportState> exportStates = new List <ScribanExportState>(); foreach (StateMachineState curState in stateMachine.State) { if (curState.DontExportToScript) { continue; } ScribanExportState exportState = ConvertState(curState, transitions, endNodes, startId); await GenerateStateFunctions(exportState, inputNpc, curState); exportState.OriginalState = curState; exportStates.Add(exportState); } SetTransitions(transitions, exportStates, endNodes); return(exportStates); }
/// <summary> /// Generates the state functions /// </summary> /// <param name="exportState">Export state to fill</param> /// <param name="inputNpc">Input npcs</param> /// <param name="state">State</param> /// <returns>Task</returns> private async Task GenerateStateFunctions(ScribanExportState exportState, KortistoNpc inputNpc, StateMachineState state) { List <ScribanExportStateFunction> functions = (await _stateMachineFunctionRenderer.RenderStateFunctions(state, inputNpc)).Select(f => new ScribanExportStateFunction(f)).ToList(); exportState.InitialFunction = functions.FirstOrDefault(); exportState.AdditionalFunctions = functions.Skip(1).ToList(); exportState.AllFunctions = functions; }
/// <summary> /// Converts a state for scriban /// </summary> /// <param name="state">State</param> /// <param name="transitions">Transitions</param> /// <param name="endNodes">End nodes</param> /// <param name="startId">Id of the start node</param> /// <returns>Converted state</returns> private static ScribanExportState ConvertState(StateMachineState state, List <StateTransition> transitions, List <StateMachineStartEnd> endNodes, string startId) { ScribanExportState exportState = new ScribanExportState(); exportState.Id = state.Id; exportState.Name = state.Name; exportState.Description = state.Description; exportState.IsInitialState = transitions.Any(l => l.TargetNodeId == state.Id && l.SourceNodeId == startId); exportState.HasEndConnection = transitions.Any(l => l.SourceNodeId == state.Id && endNodes.Any(e => e.Id == l.TargetNodeId)); exportState.ScriptType = ScribanScriptUtil.ConvertScriptType(state.ScriptType); exportState.ScriptName = state.ScriptName; return(exportState); }