public static void SaveEmptyTree(OneWayTreeNode node, int pathId)
 {
     LoadJsonFiles.SaveSerializableToJson(
         ExtractQuestSet(node)
         , QUESTS_LOAD_PATH + pathId, false);
     LoadJsonFiles.SaveSerializableToJson(
         ExtractQuestDirections(node)
         , QUESTTREE_LOAD_PATH + pathId, false);
 }
    public void DrawEditableTree(OneWayTreeNode node)
    {
        node.data.title        = EditorGUILayout.TextField("Title", node.data.title);
        node.data.description  = EditorGUILayout.TextField("Description: " + node.data.description, node.data.description);
        node.data.reward.money = EditorGUILayout.IntField("Money: " + node.data.reward.money, node.data.reward.money);

        // waves ...
        for (int i = 0; i < node.data.waves.Length; i++)
        {
            WaveItem item = node.data.waves[i];
            item.itemId    = (WaveSpawnItems)EditorGUILayout.EnumFlagsField("Unit: " + item.itemId, item.itemId);
            item.times     = EditorGUILayout.IntField("Times: " + item.times, item.times);
            item.spawnRate = EditorGUILayout.FloatField("Spawn rate: " + item.spawnRate, item.spawnRate);
            if (GUILayout.Button("- wave"))
            {
                node.data.RemoveWave(i);
            }
        }
        if (GUILayout.Button("+ wave"))
        {
            node.data.AddWave(new WaveItem {
                itemId = 0, times = 1, spawnRate = GameManager.EnemySpawnRate
            });
        }
        // end waves...

        if (GUILayout.Button("+ node"))
        {
            node.children.Add(new OneWayTreeNode()
            {
                children = new System.Collections.Generic.List <OneWayTreeNode>(),
                data     = new QuestInfo()
                {
                    title  = "Not assigned",
                    reward = new QuestReward()
                    {
                        money = 100
                    },
                    description = "empty",
                    waves       = new WaveItem[] { new WaveItem {
                                                       itemId = 0, times = 1
                                                   } }
                }
            }
                              );
        }
        for (int i = 0; i < node.children.Count; i++)
        {
            EditorGUILayout.LabelField("L_" + i + "_>");
            EditorGUI.indentLevel++;
            DrawEditableTree(node.children[i]);
            EditorGUI.indentLevel--;
        }
    }
    static QuestSet ExtractQuestSet(OneWayTreeNode node)
    {
        QuestSet set = new QuestSet();

        OneWayTreeNode[] nodes = node.rAsList();
        QuestInfo[]      infos = new QuestInfo[nodes.Length];
        for (int i = 0; i < nodes.Length; i++)
        {
            infos[i] = nodes[i].data;
        }
        set.quests = infos;
        return(set);
    }
    public static OneWayTreeNode LoadTree(string QUESTS_LOAD_PATH, string QUESTTREE_LOAD_PATH)
    {
        QuestSet qs = LoadJsonFiles.LoadJsonToSerializable <QuestSet>(QUESTS_LOAD_PATH);

        if (qs == null)
        {
            return(null);
        }
        return(OneWayTreeNode.ConstructQuestTree(
                   qs.quests,
                   LoadJsonFiles.LoadJsonToSerializable <QuestTreeDirections>(QUESTTREE_LOAD_PATH)
                   ));
    }
    static QuestTreeDirections ExtractQuestDirections(OneWayTreeNode node)
    {
        QuestTreeDirections dirs = new QuestTreeDirections();

        OneWayTreeNode[] nodes = node.rAsList();
        dirs.nodes = new IntSerializableArr[nodes.Length];
        for (int i = 0; i < dirs.nodes.Length; i++)
        {
            dirs.nodes[i]            = new IntSerializableArr();
            dirs.nodes[i].directions = new int[nodes[i].children.Count];
            for (int j = 0; j < dirs.nodes[i].directions.Length; j++)
            {
                dirs.nodes[i].directions[j] = i + j + 1;// untested
            }
        }
        return(dirs);
    }
    public OneWayTreeNode[] rAsList()
    {
        List <OneWayTreeNode>  arr = new List <OneWayTreeNode>();
        Queue <OneWayTreeNode> q   = new Queue <OneWayTreeNode>();

        q.Enqueue(this);
        while (q.Count > 0)
        {
            OneWayTreeNode node = q.Dequeue();
            arr.Add(node);
            for (int i = 0; i < node.children.Count; i++)
            {
                q.Enqueue(node.children[i]);
            }
        }
        return(arr.ToArray());
    }
 public void DrawTree(OneWayTreeNode node)
 {
     EditorGUILayout.LabelField(node.data.title);
     EditorGUILayout.LabelField("Description: " + node.data.description);
     EditorGUILayout.LabelField("Money: " + node.data.reward.money);
     foreach (var item in node.data.waves)
     {
         EditorGUILayout.LabelField("Unit: " + item.itemId);
         EditorGUILayout.LabelField("Times: " + item.times);
         EditorGUILayout.LabelField("Spawn rate: " + item.spawnRate);
     }
     for (int i = 0; i < node.children.Count; i++)
     {
         EditorGUILayout.LabelField("L_" + i + "_>");
         EditorGUI.indentLevel++;
         DrawTree(node.children[i]);
         EditorGUI.indentLevel--;
     }
 }
 public static OneWayTreeNode ConstructQuestTree(object[] data, QuestTreeDirections directions)
 {
     if (data.Length == 0 || directions.nodes.Length != data.Length)
     {
         Debug.Log("err: " + (data.Length == 0) + " " + (directions.nodes.Length != data.Length));
         return(null);
     }
     OneWayTreeNode[] nodes = new OneWayTreeNode[data.Length];
     for (int i = 0; i < data.Length; i++)
     {
         nodes[i]      = new OneWayTreeNode();
         nodes[i].data = data[i] as QuestInfo;
         nodes[i].id   = i;
     }
     // put down directions and mark those who have any incoming.
     // to find root later(0 incoming).
     bool[] hasInc = new bool[data.Length];
     for (int i = 0; i < data.Length; i++)
     {
         for (int j = 0; j < directions.nodes[i].directions.Length; j++)
         {
             if (nodes[i] == nodes[directions.nodes[i].directions[j]])
             {
                 continue;
             }
             nodes[i].Add(nodes[directions.nodes[i].directions[j]]);
             hasInc[directions.nodes[i].directions[j]] = true;
         }
     }
     // paths.. just map who the child is. or connect them in linear fashion
     //
     // find root - node that has 0 incoming connections
     for (int i = 0; i < hasInc.Length; i++)
     {
         if (!hasInc[i])
         {
             return(nodes[i]);
         }
     }
     return(null);// err
 }
    private void OnGUI()
    {
        if (Application.isPlaying)
        {
            scroll = EditorGUILayout.BeginScrollView(scroll);
            DrawTree(GameManager.Instance.quests.GetQuestTree());
            EditorGUILayout.EndScrollView();
        }
        else
        {
            EditorGUILayout.LabelField("Press play... \n 0 is different than DEFAULT. -1 is DEFAULT.");
            scroll = EditorGUILayout.BeginScrollView(scroll);
            if (GUILayout.Button("Open load path"))
            {
                node = QuestBehaviours.LoadTree(fileId);
            }
            if (GUILayout.Button("Load ALL quest files "))
            {
                allFiles.Clear();
                for (int i = 0; i < 100; i++)
                {
                    OneWayTreeNode node1 = QuestBehaviours.LoadTree(i);
                    if (node1 != null)
                    {
                        allFiles.Add(node1);
                    }
                }
            }
            if (GUILayout.Button("Load DEFAULT quest file "))
            {
                node = QuestBehaviours.LoadTree(-1);
            }
            for (int i = 0; i < allFiles.Count; i++)
            {
                EditorGUILayout.BeginHorizontal();
                if (GUILayout.Button("Load quest file " + i))
                {
                    node = allFiles[i];
                }
                if (GUILayout.Button("Save as default" + i))
                {
                    QuestBehaviours.SaveEmptyTree(allFiles[i]);
                }
                EditorGUILayout.EndHorizontal();
            }
            // atm only for saving.
            fileId = EditorGUILayout.IntField(fileId);

            if (GUILayout.Button("Save quest file"))
            {
                if (fileId > -1)
                {
                    QuestBehaviours.SaveEmptyTree(node, fileId);
                }
                else
                {
                    QuestBehaviours.SaveEmptyTree(node);
                }
            }

            // edit tree - add items, edit them.
            if (node != null && node.data != null && node.data.reward != null)
            {
                DrawEditableTree(node);
            }
            EditorGUILayout.EndScrollView();
        }
    }
 internal void SetQuest(OneWayTreeNode tree)
 {
     GameManager.Instance.quests.SetQuestTree(
         tree
         );
 }
 internal void SetQuestTree(OneWayTreeNode root) //QuestInfo[] quests) {
 {
     manager.allQuestsAsTree = root;
 }