protected void SaveTreeRec(Node node, string path)
        {
            uint nodeID = node.GetID();

            if (CheckForSavedNode(nodeID, path))
            {
                return;
            }

            string nodeName = node.ToString();
            string output   = nodeID + "," + nodeName;

            // leaf node
            if (nodeName == "ActionNode")
            {
                ActionNode a = (ActionNode)node;
                output += "," + a.GetFunction().Method.Name + "," + a.GetFunction().Method.DeclaringType;
            }
            // decorator node
            else if (nodeName == "Inverter" || nodeName == "Repeater" || nodeName == "RepeatTillFail" || nodeName == "Limiter")
            {
                if (nodeName == "Repeater")
                {
                    Repeater r = (Repeater)node;
                    SaveTreeRec(r.ChildNode, path);
                    output += "," + r.ChildNode.GetID() + "," + r.GetNumberOfRepeats();
                }
                else
                {
                    DecoratorNode d = (DecoratorNode)node;
                    SaveTreeRec(d.ChildNode, path);
                    output += "," + d.ChildNode.GetID();
                }
            }
            // composite node
            else if (nodeName == "Selector" || nodeName == "Sequence")
            {
                CompositeNode c = (CompositeNode)node;
                foreach (Node childNode in c.ChildNodeList)
                {
                    SaveTreeRec(childNode, path);
                    output += "," + childNode.GetID();
                }
            }
            File.AppendAllText(path, output + Environment.NewLine);
        }
        STreeNode GetTreeNode(Node node)
        {
            STreeNode mine     = new STreeNode();
            var       nodeName = node.ToString();

            // leaf node
            if (nodeName == "ActionNode")
            {
                ActionNode a = (ActionNode)node;
                mine.id    = a.GetID();
                mine.name  = a.GetFunction().GetMethodInfo().Name;
                mine.state = a.NodeState;
                mine.Type  = "ActionNode";
            }
            // decorator node
            else if (nodeName == "Inverter" || nodeName == "Repeater" || nodeName == "RepeatTillFail" || nodeName == "Limiter" || nodeName == "Succeeder")
            {
                DecoratorNode d = (DecoratorNode)node;

                mine.id       = d.GetID();
                mine.name     = d.ToString();
                mine.state    = d.NodeState;
                mine.Type     = "DecoratorNode";
                mine.children = new List <STreeNode>()
                {
                    GetTreeNode(d.ChildNode)
                };
            }
            // composite node
            else if (nodeName == "Selector" || nodeName == "Sequence")
            {
                CompositeNode c = (CompositeNode)node;

                mine.id       = c.GetID();
                mine.name     = c.ToString();
                mine.state    = c.NodeState;
                mine.Type     = "CompositeNode";
                mine.children = new List <STreeNode>();
                foreach (Node childNode in c.ChildNodeList)
                {
                    mine.children.Add(GetTreeNode(childNode));
                }
            }

            return(mine);
        }