private void Start()
 {
     // Getting components and setting them to relevant pointers
     m_UtilityScript = GetComponent <UtilityScoring>();
     m_MoveScript    = GetComponent <SimpleMovement>();
     m_PathFinder    = GetComponent <PathFinding>();
     m_Inventory     = GetComponent <CharacterInventory>();
     m_Stats         = GetComponent <CharacterStats>();
     m_Mesh          = GetComponentInChildren <PlayerMesh>(); // Mesh is actually in a child of the GameObject with this script attached to
     m_Queue         = new LinkedList <QueuedTask>();
     m_Audio         = FindObjectOfType <AudioManager>();
 }
Exemplo n.º 2
0
    // Score candidate actions depending on the goal then make a behaviour tree out of the ranking
    private void PreProcessAction(string code)
    {
        char separator = '_';

        string[] codeSlices = code.Split(separator);
        float    i_time     = Time.realtimeSinceStartup;


        if (codeSlices[0].Equals("a") && codeSlices.Length > 2)
        {
            switch (codeSlices[1])
            {
            // Get Item
            case "gi":
            {
                string targetItem  = codeSlices[2];
                bool   craftable   = CheckCraftable(targetItem);
                double utilityFind = CheckFind(targetItem);
                float  t0          = Time.realtimeSinceStartup;

                List <System.Tuple <string, double> > uS = UtilityScoring.ScoreGetItem(m_personality,
                                                                                       m_skills,
                                                                                       utilityFind,
                                                                                       craftable);
                if (m_logTimes)
                {
                    Debug.Log("\tScoring time:" + (Time.realtimeSinceStartup - t0).ToString());
                }

                t0         = Time.realtimeSinceStartup;
                m_treeRoot = MakeTree(uS, targetItem);
                if (m_logTimes)
                {
                    Debug.Log("\tMake Tree time:" + (Time.realtimeSinceStartup - t0).ToString());
                }


                break;
            }

            // Convince
            case "co":
            {
                string targetName = "NPC_" + codeSlices[2];
                float  t0         = Time.realtimeSinceStartup;

                List <System.Tuple <string, double> > uS = UtilityScoring.ScoreConvince(m_personality,
                                                                                        m_skills);
                if (m_logTimes)
                {
                    Debug.Log("\tScoring time:" + (Time.realtimeSinceStartup - t0).ToString());
                }


                t0         = Time.realtimeSinceStartup;
                m_treeRoot = MakeTree(uS, targetName);
                if (m_logTimes)
                {
                    Debug.Log("\tMake Tree time:" + (Time.realtimeSinceStartup - t0).ToString());
                }

                break;
            }

            // Neutralize
            case "nu":
            {
                string targetName         = "NPC_" + codeSlices[2];
                double allegianceToTarget = 0;
                float  t0 = Time.realtimeSinceStartup;

                if (m_allegiances.ContainsKey(targetName))
                {
                    allegianceToTarget = m_allegiances[targetName];
                }
                else
                {
                    m_allegiances[targetName] = 0;
                }

                List <System.Tuple <string, double> > uS = UtilityScoring.ScoreNeutralize(m_personality,
                                                                                          m_skills,
                                                                                          allegianceToTarget);
                if (m_logTimes)
                {
                    Debug.Log("\tScoring time:" + (Time.realtimeSinceStartup - t0).ToString());
                }

                t0         = Time.realtimeSinceStartup;
                m_treeRoot = MakeTree(uS, targetName);
                if (m_logTimes)
                {
                    Debug.Log("\tMake Tree time:" + (Time.realtimeSinceStartup - t0).ToString());
                }

                break;
            }

            // Develop
            case "dv":
            {
                string target = codeSlices[2];
                float  t0     = Time.realtimeSinceStartup;

                List <System.Tuple <string, double> > uS = UtilityScoring.ScoreDevelop(m_personality,
                                                                                       m_skills);
                if (m_logTimes)
                {
                    Debug.Log("\tScoring time:" + (Time.realtimeSinceStartup - t0).ToString());
                }

                t0         = Time.realtimeSinceStartup;
                m_treeRoot = MakeTree(uS, target);
                if (m_logTimes)
                {
                    Debug.Log("\tMake Tree time:" + (Time.realtimeSinceStartup - t0).ToString());
                }

                break;
            }

            default:
                break;
            }
        }

        if (m_logTimes)
        {
            Debug.Log("\tTOTAL PREPROCESS TIME: " + (Time.realtimeSinceStartup - i_time).ToString());
        }
    }
Exemplo n.º 3
0
    // Main Method of the Class, takes care of all steps of the analytics (from initialisation to saving the results in text files
    public static void PerformAnalytics()
    {
        Dictionary <string, Dictionary <string, Dictionary <string, int> > > testNPCs = MakeTestNPCs();



        // Goals

        List <string> goals = new List <string>()
        {
            "a_gi_pinkoin_close", // close
            "a_gi_pinkoin_far",   // far
            "a_gi_sword",         // cheap-ish
            "a_gi_wizardstaff",   // expensive
            "a_co_paladincork",
            "a_co_sneekibreeki",
            "a_nu_paladincork",
            "a_nu_sneekibreeki",
            "a_dv_enchant", // expensive
            "a_dv_house",   // very expensive
            "a_dv_nails"    // cheap
        };


        // Rank actions for goals for all NPCs

        Dictionary <string, Dictionary <string, List <string> > > generatedActionRanks = new Dictionary <string, Dictionary <string, List <string> > >();

        foreach (KeyValuePair <string, Dictionary <string, Dictionary <string, int> > > npc in testNPCs)
        {
            generatedActionRanks.Add(npc.Key, new Dictionary <string, List <string> >());
            for (int i = 0; i < goals.Count; ++i)
            {
                switch (goals[i])
                {
                case "a_gi_pinkoin_close":
                {
                    List <string> actions = new List <string>();
                    // personality, skills, utility for find, craftable
                    List <Tuple <string, double> > us = UtilityScoring.ScoreGetItem(
                        npc.Value["personality"],
                        npc.Value["skills"],
                        98.0,
                        false
                        );

                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                case "a_gi_pinkoin_far":
                {
                    List <string> actions = new List <string>();
                    // personality, skills, utility for find, craftable
                    List <Tuple <string, double> > us = UtilityScoring.ScoreGetItem(
                        npc.Value["personality"],
                        npc.Value["skills"],
                        10.0,
                        false
                        );
                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                case "a_gi_sword":
                {
                    List <string> actions = new List <string>();
                    // personality, skills, utility for find, craftable
                    List <Tuple <string, double> > us = UtilityScoring.ScoreGetItem(
                        npc.Value["personality"],
                        npc.Value["skills"],
                        -1.0,
                        true
                        );

                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                case "a_gi_wizardstaff":
                {
                    List <string> actions = new List <string>();
                    // personality, skills, utility for find, craftable
                    List <Tuple <string, double> > us = UtilityScoring.ScoreGetItem(
                        npc.Value["personality"],
                        npc.Value["skills"],
                        -1.0,
                        true
                        );

                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                case "a_co_paladincork":
                {
                    List <string> actions = new List <string>();
                    // personality, skills
                    List <Tuple <string, double> > us = UtilityScoring.ScoreConvince(
                        npc.Value["personality"],
                        npc.Value["skills"]
                        );

                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                case "a_co_sneekibreeki":
                {
                    List <string> actions = new List <string>();
                    // personality, skills
                    List <Tuple <string, double> > us = UtilityScoring.ScoreConvince(
                        npc.Value["personality"],
                        npc.Value["skills"]
                        );

                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                case "a_nu_paladincork":
                {
                    List <string> actions = new List <string>();
                    // personality, skills, allegiance to target NPC
                    List <Tuple <string, double> > us = UtilityScoring.ScoreNeutralize(
                        npc.Value["personality"],
                        npc.Value["skills"],
                        npc.Value["allegiances"]["npc_paladincork"]
                        );

                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                case "a_nu_sneekibreeki":
                {
                    List <string> actions = new List <string>();
                    // personality, skills, allegiance to target NPC
                    List <Tuple <string, double> > us = UtilityScoring.ScoreNeutralize(
                        npc.Value["personality"],
                        npc.Value["skills"],
                        npc.Value["allegiances"]["npc_sneekibreeki"]
                        );

                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                case "a_dv_enchant":
                {
                    List <string> actions = new List <string>();
                    // personality, skills
                    List <Tuple <string, double> > us = UtilityScoring.ScoreDevelop(
                        npc.Value["personality"],
                        npc.Value["skills"]
                        );

                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                case "a_dv_house":
                {
                    List <string> actions = new List <string>();
                    // personality, skills
                    List <Tuple <string, double> > us = UtilityScoring.ScoreDevelop(
                        npc.Value["personality"],
                        npc.Value["skills"]
                        );

                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                case "a_dv_nails":
                {
                    List <string> actions = new List <string>();
                    // personality, skills
                    List <Tuple <string, double> > us = UtilityScoring.ScoreDevelop(
                        npc.Value["personality"],
                        npc.Value["skills"]
                        );

                    foreach (Tuple <string, double> t in us)
                    {
                        actions.Add(t.Item1);
                    }
                    generatedActionRanks[npc.Key].Add(goals[i], actions);
                    break;
                }

                default:
                    break;
                }
            }
        }


        // scripted rankings
        // NPC, Goal, Actions
        Dictionary <string, Dictionary <string, List <string> > > scriptedActionRanks = GetScriptedActionRankings();


        string data       = "NPC\t\t\t" + String.Format("{0,-20}\t\t{1,-20}\t\t{2,-20}\t\t{3,-20}", "Goal", "HarmonicDWD", "GeometricCWD", "LevenshteinDistance") + "\n";
        string actionData = "NPC\t\t\t\t" + String.Format("{0,-30}\t\t{1,-40}\t\t{2,-40}", "Goal", "Scripted", "Generated") + "\n";

        foreach (KeyValuePair <string, Dictionary <string, Dictionary <string, int> > > npc in testNPCs)
        {
            data       += npc.Key + "\n";
            actionData += npc.Key + "\n";
            for (int i = 0; i < goals.Count; ++i)
            {
                // Evaluate and add to log data
                data += "\t\t\t" + String.Format("{0,-20}\t\t{1,-20}",
                                                 goals[i],
                                                 Evaluate(scriptedActionRanks[npc.Key][goals[i]],
                                                          generatedActionRanks[npc.Key][goals[i]])) + "\n";


                actionData += "\t\t\t\t" + String.Format("{0,-30}\t\t{1,-40}\t\t{2,-40}",
                                                         goals[i],
                                                         string.Join <string>(", ", scriptedActionRanks[npc.Key][goals[i]]),
                                                         string.Join <string>(", ", generatedActionRanks[npc.Key][goals[i]])) + "\n";
            }
        }
        WriteDataToTextFile("./AnalyticsLogs", "Evaluation_", data);
        WriteDataToTextFile("./AnalyticsLogs", "ActionLists_", actionData);
    }