public static ItemSkillTree ConvertToTree(string save, ItemUpdate source)
        {
            string[]      nodeListSave;
            string[]      nodeDetails;
            ItemSkillTree tree = new ItemSkillTree();

            nodeListSave      = save.Split(';');
            tree.m_ItemSource = source;
            string[] a;
            ItemNode bufferNode;

            foreach (string nodeSave in nodeListSave)
            {
                bufferNode  = null;
                nodeDetails = nodeSave.Split(',');
                if (nodeDetails.Length != 8)
                {
                    AnotherRpgMod.Instance.Logger.Warn("Item tree corrupted, reseting tree");
                    tree = new ItemSkillTree();
                    tree.Init(source);
                    return(tree);
                }

                bufferNode = (ItemNode)ItemNodeAtlas.GetCorrectNode(int.Parse(nodeDetails[0]));

                a = nodeDetails[6].Split(':');
                bufferNode.Init(tree, tree.GetSize, int.Parse(nodeDetails[4]), int.Parse(nodeDetails[5]), new Vector2(int.Parse(a[0]), int.Parse(a[1])));

                //Ignore it if there is no neighboor
                if (nodeDetails[1] != "")
                {
                    a = nodeDetails[1].Split(':');
                    foreach (string neightboor in a)
                    {
                        bufferNode.AddNeightboor(int.Parse(neightboor));
                    }
                }
                bufferNode.ForceLockNode(int.Parse(nodeDetails[2]));
                bufferNode.SetLevel = int.Parse(nodeDetails[3]);
                if (nodeDetails[7] != "")
                {
                    bufferNode.LoadValue(nodeDetails[7]);
                }
                tree.AddNode(bufferNode);
            }

            return(tree);
        }
        public int AddNewRandomNode(int Source, Vector2 position, List <int> IDList, bool Ascend = false)
        {
            int      ID   = IDList.Count;
            ItemNode Node = (ItemNode)ItemNodeAtlas.GetCorrectNode(IDList[Mathf.RandomInt(0, ID)]);

            if (!Ascend)
            {
                float power       = Mathf.Clamp((position.Y / 250) + (Math.Abs(position.X) / 300) + Mathf.Random(-0.35f, 0.35f), 0, 45);
                int   level       = 3 + (int)power;
                int   requirement = Mathf.FloorInt(1 + power * 0.75f);
                Node.Init(this, m_nodeList.Count, level, requirement, position);
                Node.SetPower(1 + power);
                if (Source != -1)
                {
                    Node.AddNeightboor(Source);
                }
                m_nodeList.Add(Node);
            }


            return(m_nodeList.Count - 1);
        }
        public static ItemSkillTree ConvertToTree(string save, ItemUpdate source, int evoPoint, int AscPoint)
        {
            string[]      nodeListSave;
            string[]      nodeDetails;
            ItemSkillTree tree = new ItemSkillTree();

            nodeListSave      = save.Split(';');
            tree.m_ItemSource = source;
            string[] a;
            ItemNode bufferNode;

            foreach (string nodeSave in nodeListSave)
            {
                bufferNode  = null;
                nodeDetails = nodeSave.Split('|');
                if (nodeDetails.Length != 8)
                {
                    AnotherRpgMod.Instance.Logger.Error(source.ItemName);
                    AnotherRpgMod.Instance.Logger.Error("Item tree corrupted, reseting tree");
                    AnotherRpgMod.Instance.Logger.Error(nodeSave);
                    tree = new ItemSkillTree();
                    tree.MaxEvolutionPoints = evoPoint;
                    tree.MaxAscendPoints    = AscPoint;
                    tree.Init(source);
                    tree.Reset(true);
                    tree.EvolutionPoints = tree.MaxEvolutionPoints;
                    tree.AscendPoints    = tree.MaxAscendPoints;

                    if (tree.AscendPoints > 0)
                    {
                        tree.ExtendTree(Mathf.Clamp(Mathf.CeilInt(Mathf.Pow(source.baseCap / 3f, 0.95)), 5, 99) * tree.AscendPoints);
                    }
                    return(tree);
                }

                bufferNode = (ItemNode)ItemNodeAtlas.GetCorrectNode(int.Parse(nodeDetails[0]));

                a = nodeDetails[6].Split(':');
                bufferNode.Init(tree, tree.GetSize, int.Parse(nodeDetails[4]), int.Parse(nodeDetails[5]), new Vector2(int.Parse(a[0]), int.Parse(a[1])));

                //Ignore it if there is no neighboor
                if (nodeDetails[1] != "")
                {
                    a = nodeDetails[1].Split(':');
                    foreach (string neightboor in a)
                    {
                        bufferNode.AddNeightboor(int.Parse(neightboor));
                    }
                }
                bufferNode.ForceLockNode(int.Parse(nodeDetails[2]));
                bufferNode.SetLevel = int.Parse(nodeDetails[3]);


                if (nodeDetails[7] != "")
                {
                    bufferNode.LoadValue(nodeDetails[7]);
                }
                tree.AddNode(bufferNode);
            }

            return(tree);
        }