using Godot; using System; using System.Collections.Generic; public class RunningProgramGraphBuilder { private readonly Dictionary dslNodes; private readonly Action addNode; private readonly Action connectNodes; public RunningProgramGraphBuilder( Dictionary dslNodes, Action addNode, Action connectNodes ) { this.dslNodes = dslNodes; this.addNode = addNode; this.connectNodes = connectNodes; } public void Load(ProgramNode startNode) { Dictionary loadedNodes = new Dictionary(); LoadNode(startNode, loadedNodes); } private NodeDisplay LoadNode( ProgramNode programNode, Dictionary loadedNodes ) { if (programNode == null) return null; if (loadedNodes.ContainsKey(programNode)) return loadedNodes[programNode]; NodeDisplay nodeDisplay = NodeDisplay.Load( programNode.DisplayText, programNode.Save(), dslNodes ); if (nodeDisplay == null) return null; if (programNode.EditorNodeId != null && programNode.EditorNodeId.Length > 0) { nodeDisplay.Name = programNode.EditorNodeId; } addNode(nodeDisplay); loadedNodes.Add(programNode, nodeDisplay); ConnectNode(nodeDisplay, 0, programNode.nextNode, loadedNodes); ConnectNode(nodeDisplay, 1, programNode.NegativeNode, loadedNodes); return nodeDisplay; } private void ConnectNode( NodeDisplay fromDisplay, int fromPort, ProgramNode targetNode, Dictionary loadedNodes ) { NodeDisplay toDisplay = LoadNode(targetNode, loadedNodes); if (toDisplay == null) return; connectNodes(fromDisplay.Name, fromPort, toDisplay.Name, 0); } }