Exemple #1
0
    public void GetCharacterResponse()
    {
        CurrentCharacter.Perceive(_events);
        var possibleActions = CurrentCharacter.Decide();
        var action          = RolePlayCharacterAsset.TakeBestActions(possibleActions).FirstOrDefault();

        _events.Clear();
        CurrentCharacter.Update();

        if (action != null)
        {
            var actionKey = action.Key.ToString();
            if (actionKey == "Speak")
            {
                var nextState         = action.Parameters[1];
                var dialogues         = _integratedAuthoringTool.GetDialogueActionsByState(action.Parameters[0].ToString());
                var characterDialogue = dialogues.FirstOrDefault(dto => string.Equals(dto.Meaning.ToString(), action.Parameters[2].ToString(), StringComparison.CurrentCultureIgnoreCase) && string.Equals(dto.Style.ToString(), action.Parameters[3].ToString(), StringComparison.CurrentCultureIgnoreCase));
                if (characterDialogue != null)
                {
                    UpdateFeedbackScores(characterDialogue, "Client");
                    _events.Add((Name)string.Format("Event(Property-Change,{0},DialogueState(Player),{1})", CurrentCharacter.CharacterName, nextState));
                    UpdateCurrentState();
                    PlayDialogueAudio(characterDialogue.FileName);
                    GetCharacterDialogueSuccessEvent?.Invoke(Localization.GetAndFormat(characterDialogue.FileName, false, ScenarioCode));
                }
            }
        }

        GetCharacterStrongestEmotion();
    }
        private IEnumerator UpdateCoroutine()
        {
            _events.Clear();
            while (m_rpc.GetBeliefValue(string.Format(IATConsts.DIALOGUE_STATE_PROPERTY, IATConsts.PLAYER)) != IATConsts.TERMINAL_DIALOGUE_STATE)
            {
                yield return(new WaitForSeconds(0.1f));

                if (_events.Count == 0)
                {
                    m_rpc.Update();
                    continue;
                }



                m_rpc.Perceive(_events);



                var action = m_rpc.Decide().FirstOrDefault();

                _events.Clear();
                m_rpc.Update();

                if (action == null)
                {
                    continue;
                }

                Debug.Log("Action Key: " + action.Key);

                if (canSpeak)
                {
                    switch (action.Key.ToString())
                    {
                    case "Speak":
                        m_activeController.StartCoroutine(HandleSpeak(action));
                        canSpeak = false;
                        break;

                    case "Disconnect":
                        m_activeController.StartCoroutine(newHandleDisconnect());
                        m_dialogController.AddDialogLine(string.Format("- {0} disconnects -", m_rpc.CharacterName));

                        _currentCoroutine = null;
                        Object.Destroy(_body.Body);
                        break;

                    default:
                        Debug.LogWarning("Unknown action: " + action.Key);
                        break;
                    }
                }
            }
        }
    public void PlayerDecide()
    {
        if (_player != null)
        {
            var decisions = _player.Decide();

            if (decisions.IsEmpty() || waitingforReply)
            {
                return;
            }

            UpdateButtonTexts(false, decisions.ToList());
        }
    }
Exemple #4
0
        private void decide(SuecaEvent ev)
        {
            //Console.WriteLine("DECING FOR EVENT: " + ev.Name);
            string[] tags     = ev.Tags.ToArray();
            string[] meanings = ev.Meanings.ToArray();

            IEnumerable <ActionLibrary.IAction> possibleActions = _rpc.Decide();

            if (possibleActions == null || possibleActions.IsEmpty())
            {
                //Console.WriteLine("No action");
                return;
            }
            else
            {
                ActionLibrary.IAction chosenAction = possibleActions.FirstOrDefault();
                saveToFile();

                switch (chosenAction.Key.ToString())
                {
                case "Speak":
                    Name currentState = chosenAction.Parameters[0];
                    Name nextState    = chosenAction.Parameters[1];
                    Name meaning      = chosenAction.Parameters[2];
                    Name style        = chosenAction.Parameters[3];

                    var possibleDialogs = _iat.GetDialogueActions(IATConsts.AGENT, currentState, nextState, meaning, style);
                    var dialog          = getUtterance(possibleDialogs);

                    Console.WriteLine(dialog);
                    EmotionalSuecaPlayer.SuecaPub.PerformUtteranceWithTags("", dialog, tags, meanings);
                    break;

                case "Animation":
                    Name state       = chosenAction.Parameters[0];
                    Name emotionName = chosenAction.Parameters[1];
                    Console.WriteLine("[ANIMATION] Soft reaction to " + state + " with the style " + emotionName);
                    break;

                default:
                    Console.WriteLine("Unknown Action");
                    break;
                }
            }
        }
Exemple #5
0
        private IEnumerator UpdateCoroutine()
        {
            while (m_rpc.GetBeliefValue(string.Format(IATConsts.DIALOGUE_STATE_PROPERTY, IATConsts.PLAYER)) != IATConsts.TERMINAL_DIALOGUE_STATE)
            {
                yield return(new WaitForSeconds(1));

                if (_body._speechController.IsPlaying)
                {
                    continue;
                }

                var action = m_rpc.Decide().Shuffle().FirstOrDefault();
                _events.Clear();
                m_rpc.Update();

                if (action == null)
                {
                    continue;
                }

                switch (action.Key.ToString())
                {
                case "Speak":
                    m_activeController.StartCoroutine(HandleSpeak(action));

                    break;

                case "Disconnect":
                    m_activeController.StartCoroutine(HandleDisconnect());
                    m_dialogController.AddDialogLine(string.Format("- {0} disconnects -", m_rpc.CharacterName));

                    _currentCoroutine = null;
                    Object.Destroy(_body.Body);
                    GameObject.FindObjectOfType <SingleCharacterDemo>().Restart();
                    break;

                default:
                    Debug.LogWarning("Unknown action: " + action.Key);
                    break;
                }
            }
        }
Exemple #6
0
    public void Decide()
    {
        IEnumerable <ActionLibrary.IAction> possibleActions = rpc.Decide();

        ActionLibrary.IAction chosenAction = possibleActions.FirstOrDefault();

        if (chosenAction == null)
        {
            Console.WriteLine("No action");
            //saveToFile();
            return;
        }
        else
        {
            //saveToFile();


            switch (chosenAction.Key.ToString())
            {
            case "Speak":

                Name currentState = chosenAction.Parameters[0];
                Name nextState    = chosenAction.Parameters[1];
                Name meaning      = chosenAction.Parameters[2];
                Name style        = chosenAction.Parameters[3];

                var possibleDialogs = GameGlobals.FAtiMAIat.GetDialogueActions(currentState, nextState, meaning, style);
                int randomUttIndex  = UnityEngine.Random.Range(0, possibleDialogs.Count());
                var dialog          = possibleDialogs[randomUttIndex].Utterance;

                currSpeeches.Add(invoker.GetName() + ": \"" + StripSpeechSentence(dialog) + "\"");
                break;

            default:
                break;
            }
        }
    }
Exemple #7
0
    private IEnumerator DetermineAgentDialogue(float updateTime)
    {
        while (true)
        {
            var actions = agent1RPC.Decide().ToArray();
            var action  = actions.Where(a => a.Key.ToString().Equals(IATConsts.DIALOG_ACTION_KEY)).FirstOrDefault();

            if (action != null)
            {
                Name cs        = action.Parameters[0];
                Name ns        = action.Parameters[1];
                Name m         = action.Parameters[2];
                Name s         = action.Parameters[3];
                var  dialogs   = iat.GetDialogueActions(cs, ns, m, s);
                var  dialog    = dialogs.Shuffle().FirstOrDefault();
                var  processed = this.ReplaceVariablesInDialogue(dialog.Utterance);

                HandleSpeakAction(dialog.Id, agent1RPC.CharacterName.ToString(), IATConsts.PLAYER);
                AgentUtterance.text = processed;
            }
            yield return(new WaitForSeconds(updateTime));
        }
    }
Exemple #8
0
    private List <DialogueStateActionDTO> DeterminePlayerDialogues()
    {
        var actions = playerRPC.Decide().ToArray();
        var dOpt    = new List <DialogueStateActionDTO>();

        foreach (var action in actions)
        {
            if (action.Key.ToString().Equals(IATConsts.DIALOG_ACTION_KEY))
            {
                Name currentState = action.Parameters[0];
                Name nextState    = action.Parameters[1];
                Name meaning      = action.Parameters[2];
                Name style        = action.Parameters[3];
                var  dialogs      = iat.GetDialogueActions(currentState, nextState, meaning, style);
                dOpt.AddRange(dialogs);
            }
        }
        dOpt = dOpt.Distinct().ToList();
        var additional = iat.GetDialogueActionsByState("Any");

        dOpt.AddRange(additional);
        return(dOpt);
    }
Exemple #9
0
        public static string SendResponse(HttpListenerRequest request)
        {
            lock (l)
            {
                switch (request.RawUrl)
                {
                case "/perceptions":
                    if (request.HasEntityBody)
                    {
                        using (System.IO.Stream body = request.InputStream)     // here we have data
                        {
                            using (System.IO.StreamReader reader = new System.IO.StreamReader(body, request.ContentEncoding))
                            {
                                string e = reader.ReadToEnd();
                                var    p = JsonConvert.DeserializeObject <Perceptions>(e);
                                try
                                {
                                    p.UpdatePerceptions(Walter);
#if !DEBUG
                                    Console.WriteLine("New percetion");
                                    var     array   = JObject.Parse(e)["Vision"].ToString();
                                    dynamic dynJson = JsonConvert.DeserializeObject(array);
                                    foreach (var print in dynJson)
                                    {
                                        Console.WriteLine(print);
                                        Console.WriteLine(JObject.Parse(print)["Prefab"] + " " + JObject.Parse(print)["GUID"]);
                                    }
                                    //Console.WriteLine("End-----------------------------");
                                    //Console.ReadLine();
#endif
                                }
                                catch (Exception)
                                {
                                    //Debug.WriteLine(p.ToString());
                                    throw new Exception(p.ToString());
                                }
                                return(JsonConvert.True);
                            }
                        }
                    }
                    return(JsonConvert.False);

                case "/decide":



                    var decision = Walter.Decide();

                    //var action = decision.FirstOrDefault();
                    //foreach (var a in decision) {
                    //    Console.WriteLine("MODA TUTORIAL: Action: " + a.Name.ToString() + " Target " + a.Target + " Utility: " + a.Utility);
                    //}

                    if (decision.Count() < 1)
                    {
#if DEBUG
                        Console.WriteLine("No decision");
#endif
                        return(JsonConvert.Null);
                    }

                    //Console.WriteLine("Before conversion: " + decision.FirstOrDefault().ToString());
                    var action = Action.ToAction(decision.First());
                    //Console.WriteLine("ACTION conversion: " + action.Name + " " + action.Target + "; ");
                    string t = decision.Count().ToString() + ": ";
                    foreach (var a in decision)
                    {
                        t += a.Name + " = " + a.Target + "; ";
                    }
                    Console.WriteLine(t);
                    return(JsonConvert.SerializeObject(action));

                case "/events":
                    if (request.HasEntityBody)
                    {
                        using (System.IO.Stream body = request.InputStream)     // here we have data
                        {
                            using (System.IO.StreamReader reader = new System.IO.StreamReader(body, request.ContentEncoding))
                            {
                                string s = reader.ReadToEnd();
                                var    e = JsonConvert.DeserializeObject <Event>(s);
                                try
                                {
                                    e.Perceive(Walter);
                                }
                                catch (Exception excpt)
                                {
                                    //Debug.WriteLine(e.ToString());
                                    throw new Exception(e.ToString());
                                }
                                return(JsonConvert.True);
                            }
                        }
                    }
                    return(JsonConvert.False);

                default:
                    return(JsonConvert.Null);
                }
            }
        }
Exemple #10
0
        public static string SendResponse(HttpListenerRequest request)
        {
            lock (l)
            {
                switch (request.RawUrl)
                {
                case "/perceptions":
                    if (request.HasEntityBody)
                    {
                        using (System.IO.Stream body = request.InputStream)     // here we have data
                        {
                            using (System.IO.StreamReader reader = new System.IO.StreamReader(body, request.ContentEncoding))
                            {
                                string e = reader.ReadToEnd();
                                var    p = JsonConvert.DeserializeObject <Perceptions>(e);
                                try
                                {
                                    p.UpdatePerceptions(Walter);
                                }
                                catch (Exception excpt)
                                {
                                    //Debug.WriteLine(p.ToString());
                                    throw new Exception(p.ToString());
                                }
                                return(JsonConvert.True);
                            }
                        }
                    }
                    return(JsonConvert.False);

                case "/decide":
                    var decision = Walter.Decide();
                    if (decision.Count() < 1)
                    {
                        return(JsonConvert.Null);
                    }
                    var    action = Action.ToAction(decision.First());
                    string t      = decision.Count().ToString() + ": ";
                    foreach (var a in decision)
                    {
                        t += a.Name + " = " + a.Target + "; ";
                    }
                    Debug.WriteLine(t);
                    return(JsonConvert.SerializeObject(action));

                case "/events":
                    if (request.HasEntityBody)
                    {
                        using (System.IO.Stream body = request.InputStream)     // here we have data
                        {
                            using (System.IO.StreamReader reader = new System.IO.StreamReader(body, request.ContentEncoding))
                            {
                                string s = reader.ReadToEnd();
                                var    e = JsonConvert.DeserializeObject <Event>(s);
                                try
                                {
                                    e.Perceive(Walter);
                                }
                                catch (Exception excpt)
                                {
                                    //Debug.WriteLine(e.ToString());
                                    throw new Exception(e.ToString());
                                }
                                return(JsonConvert.True);
                            }
                        }
                    }
                    return(JsonConvert.False);

                default:
                    return(JsonConvert.Null);
                }
            }
        }
Exemple #11
0
        private void decide(SuecaEvent ev)
        {
            Console.WriteLine(_agentName + "---" + "DECING FOR EVENT: " + ev.Name);
            string[] tags     = ev.Tags.ToArray();
            string[] meanings = ev.Meanings.ToArray();

            try
            {
                IEnumerable <ActionLibrary.IAction> possibleActions = _rpc.Decide();

                if (possibleActions == null || possibleActions.IsEmpty())
                {
                    Console.WriteLine(_agentName + "---" + "No action");
                    saveToFile();
                    return;
                }
                else
                {
                    ActionLibrary.IAction chosenAction = possibleActions.FirstOrDefault();
                    saveToFile();

                    switch (chosenAction.Key.ToString())
                    {
                    case "Speak":

                        Name currentState    = chosenAction.Parameters[0];
                        Name nextState       = chosenAction.Parameters[1];
                        Name meaning         = chosenAction.Parameters[2];
                        Name style           = chosenAction.Parameters[3];
                        var  possibleDialogs = _iat.GetDialogueActions(IATConsts.AGENT, currentState, nextState, meaning, style);
                        var  dialog          = getUtterance(possibleDialogs);

                        Console.WriteLine(_agentName + "---" + dialog);
                        EmotionalSuecaPlayer.SuecaPub.StartedUtterance(_esp._id, ev.Name, "");
                        EmotionalSuecaPlayer.SuecaPub.PerformUtteranceWithTags("", dialog, tags, meanings);

                        break;

                    case "Animation":
                        Name   state       = chosenAction.Parameters[0];
                        string emotionName = chosenAction.Parameters[1].ToString().ToLower();
                        if (emotionName == "distress" || emotionName == "shame")
                        {
                            emotionName = "sadness";
                        }
                        else if (emotionName == "pride")
                        {
                            emotionName = "joy";
                        }
                        else if (emotionName == "reproach")
                        {
                            emotionName = "anger";
                        }
                        Console.WriteLine("[ANIMATION] reaction to " + state + " with the style " + emotionName);
                        EmotionalSuecaPlayer.SuecaPub.PlayAnimation("", emotionName + "3");
                        break;

                    default:
                        Console.WriteLine(_agentName + "---" + "Unknown Action");
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(_agentName + "---" + e.ToString());
            }
        }
    // Update is called once per frame
    void Update()
    {
        if (_agentController == null)
        {
            return;
        }

        if (!_agentController.IsRunning)
        {
            return;
        }


        if (_agentController._body._speechController.IsPlaying)
        {
            return;
        }

        if (_agentController.getJustReplied())
        {
            var reply = _agentController.getReply();


            HandleEffects(new List <Name> {
                EventHelper.ActionEnd(_agentController.RPC.CharacterName, (Name)("Speak(" + reply.CurrentState.ToString() + "," + reply.NextState.ToString() + "," + reply.Meaning.ToString() + "," + reply.Style.ToString() + ")"), (Name)"Player")
            });



            waitingforReply = false;
        }

        if (Input.GetKeyDown(KeyCode.P))
        {
            if (Time.timeScale > 0)
            {
                Time.timeScale = 0;
            }
            else
            {
                Time.timeScale = 1;
            }
        }

        if (Input.GetKeyDown(KeyCode.Escape))
        {
            this.Restart();
        }

        if (Input.GetKeyDown(KeyCode.S))
        {
            this.SaveState();
        }

        _agentController.UpdateEmotionExpression();

        if (Player != null)
        {
            var decision = Player.Decide().FirstOrDefault();

            if (decision == null || waitingforReply)
            {
                return;
            }

            if (decision.Target != _agentController.RPC.CharacterName)
            {
                return;
            }
            var dialogActions = _iat.GetDialogueActions(decision.Parameters.ElementAt(0), Name.BuildName("*"), Name.BuildName("*"), Name.BuildName("*"));

            UpdateButtonTexts(false, dialogActions);

            waitingforReply = true;
        }
    }
Exemple #13
0
    public IEnumerator UpdateCoroutine()
    {
        while (m_rpc.GetBeliefValue(string.Format(IATConsts.DIALOGUE_STATE_PROPERTY, IATConsts.PLAYER)) != IATConsts.TERMINAL_DIALOGUE_STATE)
        {
            yield return(new WaitForSeconds(1));

            if (_body._speechController.IsPlaying)
            {
                continue;
            }

            var action = m_rpc.Decide().FirstOrDefault();

            if (action == null)
            {
                Debug.Log(RPC.CharacterName.ToString() + " decided: nothing");
            }
            else
            {
                Debug.Log(RPC.CharacterName.ToString() + " decided: " + action.Key);
            }

            _events.Clear();
            m_rpc.Update();
            UpdateEmotionExpression();
            if (action == null)
            {
                continue;
            }



            lastAction = action;
            if (action != null)
            {
                Debug.Log(RPC.CharacterName.ToString() + " decision is:" + action.Name + " towards " + action.Target);

                switch (action.Key.ToString())
                {
                case "Speak":

                    updateHeadController(action.Target.ToString());
                    GameObject.FindGameObjectWithTag(action.Target.ToString())
                    .GetComponentInChildren <HeadLookController>()._target = this._body.gameObject;


                    m_activeController.StartCoroutine(HandleSpeak(action));

                    break;

                case "Disconnect":
                    m_activeController.StartCoroutine(newHandleDisconnect());
                    m_dialogController.AddDialogLine(string.Format("- {0} disconnects -", m_rpc.CharacterName));

                    _currentCoroutine = null;
                    Object.Destroy(_body.Body);
                    break;

                default:
                    Debug.LogWarning("Unknown action: " + action.Key);
                    break;
                }
            }
        }
    }
Exemple #14
0
        static void Main(string[] args)
        {
            //AssetStorage
            var storage = AssetStorage.FromJson(File.ReadAllText("../../../../Examples/AssetStorage.json"));
            //Loading the asset
            var rpc = new RolePlayCharacterAsset();

            rpc.LoadAssociatedAssets(storage);
            rpc.ActivateIdentity(new Identity((Name)"Portuguese", (Name)"Culture", 1));
            Console.WriteLine("Starting Mood: " + rpc.Mood);
            var actions = rpc.Decide();
            var action  = actions.FirstOrDefault();

            rpc.Update();

            Console.WriteLine("The name of the character loaded is: " + rpc.CharacterName);
            // Console.WriteLine("The following event was perceived: " + event1);
            Console.WriteLine("Mood after event: " + rpc.Mood);
            Console.WriteLine("Strongest emotion: " + rpc.GetStrongestActiveEmotion()?.EmotionType + "-" + rpc.GetStrongestActiveEmotion()?.Intensity);
            Console.WriteLine("First Response: " + action?.Name + ", Target:" + action?.Target.ToString());

            var busyAction = rpc.Decide().FirstOrDefault();

            Console.WriteLine("Second Response: " + busyAction?.Name + ", Target:" + action?.Target.ToString());

            var event3 = EventHelper.ActionEnd(rpc.CharacterName.ToString(), action?.Name.ToString(), "Player");

            rpc.Perceive(new[] { event3 });
            action = rpc.Decide().FirstOrDefault();

            Console.WriteLine("Third Response: " + action?.Name + ", Target:" + action?.Target.ToString());


            int x = 0;

            while (true)
            {
                Console.WriteLine("Mood after tick: " + rpc.Mood + " x: " + x + " tick: " + rpc.Tick);
                Console.WriteLine("Strongest emotion: " + rpc.GetStrongestActiveEmotion()?.EmotionType + "-" + rpc.GetStrongestActiveEmotion()?.Intensity);
                rpc.Update();
                Console.ReadLine();

                if (x == 10)
                {
                    var event1 = EventHelper.ActionEnd("Player", "Kick", rpc.CharacterName.ToString());

                    rpc.Perceive(new[] { event1 });
                    action = rpc.Decide().FirstOrDefault();
                    rpc.Update();
                }


                if (x == 11)
                {
                    rpc.ResetEmotionalState();
                }
                if (x == 25)
                {
                    var event1 = EventHelper.ActionEnd("Player", "Kick", rpc.CharacterName.ToString());

                    rpc.Perceive(new[] { event1 });
                    action = rpc.Decide().FirstOrDefault();
                    rpc.Update();
                }


                else if (x == 30)
                {
                    Console.WriteLine("Reloading " + rpc.GetStrongestActiveEmotion().Intensity + " " + rpc.GetStrongestActiveEmotion().EmotionType + " mood: " + rpc.Mood);

                    Console.WriteLine("Reloading result: " + rpc.GetStrongestActiveEmotion().Intensity + " " + rpc.GetStrongestActiveEmotion().EmotionType + " mood: " + rpc.Mood);
                }

                x++;
            }
        }
    // Update is called once per frame
    void Update()
    {
        if (_agentController == null)
        {
            return;
        }

        if (!_agentController.IsRunning)
        {
            return;
        }

        if (_agentController.getJustReplied())
        {
            var reply = _agentController.getReply();
            waitingForReply = false;
            Initialized     = true;
            UpdateHistory(reply.Utterance);
            ClearDialogOptions();

            var cs  = reply.CurrentState;
            var ns  = reply.NextState;
            var m   = reply.Meaning;
            var sty = reply.Style;

            List <Name> events = new List <Name>();

            events.Add(EventHelper.ActionEnd(_agentController.RPC.CharacterName.ToString(),
                                             "Speak(" + cs + "," + ns + ", " + m + "," + sty + ")", "Player"));
            events.Add(EventHelper.PropertyChange("DialogueState(" + _agentController.RPC.CharacterName + ")", ns,
                                                  _agentController.RPC.CharacterName.ToString()));

            events.Add(EventHelper.PropertyChange("Has(Floor)", "Player",
                                                  _agentController.RPC.CharacterName.ToString()));

            Player.Perceive(events);
        }

        if (Input.GetKeyDown(KeyCode.P))
        {
            if (Time.timeScale > 0)
            {
                Time.timeScale = 0;
            }
            else
            {
                Time.timeScale = 1;
            }
        }

        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[0].onClick.Invoke();
            }
        }
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[1].onClick.Invoke();
            }
        }
        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[2].onClick.Invoke();
            }
        }
        if (Input.GetKeyDown(KeyCode.Alpha4))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[3].onClick.Invoke();
            }
        }

        if (Input.GetKeyDown(KeyCode.Alpha5))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[4].onClick.Invoke();
            }
        }

        if (Input.GetKeyDown(KeyCode.Alpha6))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[5].onClick.Invoke();
            }
        }

        if (Input.GetKeyDown(KeyCode.Keypad1))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[0].onClick.Invoke();
            }
        }

        if (Input.GetKeyDown(KeyCode.Keypad2))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[1].onClick.Invoke();
            }
        }

        if (Input.GetKeyDown(KeyCode.Keypad3))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[2].onClick.Invoke();
            }
        }

        if (Input.GetKeyDown(KeyCode.Keypad4))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[3].onClick.Invoke();
            }
        }
        if (Input.GetKeyDown(KeyCode.Keypad5))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[4].onClick.Invoke();
            }
        }
        if (Input.GetKeyDown(KeyCode.Keypad6))
        {
            if (!m_buttonList.IsEmpty())
            {
                m_buttonList[5].onClick.Invoke();
            }
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            this.SaveState();
        }
        if (_agentController.IsRunning)
        {
            _agentController.UpdateEmotionExpression();

            if (waitingForReply == false)
            {
                var action = Player.Decide().FirstOrDefault();

                if (action == null)
                {
                    return;
                }

                //       Debug.Log("Action Key: " + action.Key);

                var currentState = action.Parameters[0].ToString();



                var possibleOptions         = _iat.GetDialogueActionsByState(currentState).ToList();
                var originalPossibleActions = possibleOptions;



                if (PJScenario)
                {
                    if (!Initialized)
                    {
                        var newOptions =
                            possibleOptions.Shuffle(rand).Where(x => x.CurrentState == "Start").Take(3).ToList();


                        newOptions.AddRange(_iat.GetDialogueActionsByState("Introduction"));
                        possibleOptions = newOptions;
                    }
                    else
                    {
                        // var uhm = rand.Next(0, 10);


                        // Debug.Log(" rand " + uhm );


                        var newOptions = possibleOptions.Where(x => !alreadyUsedDialogs.ContainsKey(x.Utterance)).Shuffle(rand).Take(3).ToList();



                        var additionalOptions =
                            _iat.GetDialogueActionsByState("Start").Shuffle(rand).Take(2).ToList();


                        possibleOptions = newOptions.Concat(additionalOptions).ToList();


                        if (alreadyUsedDialogs.Count() > 12 && possibleOptions.Count() < 6)
                        {
                            var ClosureOptions = _iat.GetDialogueActionsByState("Closure").Shuffle(rand).Take(1).ToList();

                            possibleOptions = newOptions.Concat(additionalOptions).Concat(ClosureOptions).ToList();
                        }
                    }
                }
                //   UpdatePapers();

                waitingForReply = true;
                AddDialogButtons(possibleOptions);
            }
        }
    }