public ConversationManager(VHMsg.Client vhmsgClient, int agentID = 0)
        {
            _vhmsgClient = vhmsgClient;
            _systemHasFloor = false;
            vrIntentionMsg = "";
            _agentID = agentID;

            //Initialize Dialogue state
            _dialogueState.DialogueTurn = 0;
            _dialogueState.SocialGoal = SOCIAL_GOAL.ENHANCE_RAPPORT;
            _dialogueState.TaskGoal = TASK_GOAL.NONE;
        }
Esempio n. 2
0
        private void MessageAction(object sender, VHMsg.Message args)
        {
            string[] arguments = args.s.Split(' ');

            if (arguments.Length <= 1)
            {
                return;
            }

            //DEBUG:
            //print("Received message: " + args.s);

            //If it is a ping message
            if (arguments[0].Equals("vrAllCall"))
            {
                _vhmsgClient.SendMessage("vrComponent RapportManager all");
            }
            //Gracefully kill self
            else if (arguments[0] == "vrKillComponent")
            {
                if (arguments[1] == "ConversationManager")
                {
                    //Inform that ConversationManager is exiting
                    _vhmsgClient.SendMessage("vrProcEnd ConversationManager all");

                    System.Environment.Exit(0);
                }
            }
            else if (arguments[0] == "vrGalaxy" && arguments[1] == "outgoing"){
                //Transmit message to galaxy network
                byte[] bytes = new byte[(args.s.Length - 2) * sizeof(char)];
                System.Buffer.BlockCopy(args.s.Substring(2, args.s.Length - 1).ToCharArray(), 0, bytes, 0, bytes.Length);
                _client.Send(bytes);
            }
        }
        //Handle incoming messages
        private void MessageAction(object sender, VHMsg.Message args)
        {
            _numMessagesReceived++;

            print(_numMessagesReceived + " messages received - '" + args.s + "'");

            String[] arguments = args.s.Split(' ');

            if (arguments.Length <= 1)
            {
                return;
            }

            //If it is a ping message
            if (arguments[0].Equals("vrAllCall")) {
                _vhmsgClient.SendMessage("vrComponent ConversationManager all");
            }
            //Gracefully kill self
            else if (arguments[0] == "vrKillComponent")
            {
                if (arguments[1] == "ConversationManager")
                {
                    //Inform that ConversationManager is exiting
                    _vhmsgClient.SendMessage("vrProcEnd ConversationManager all");

                    System.Environment.Exit(0);
                }
            }
            else if(arguments[0].Equals("vrInteraction")){
                //Ignore vrInteraction messages from other agents
                if (arguments[1] == _agentID.ToString())
                {
                    if (arguments[2].Equals("floorChanged") || arguments[2].Equals("floor"))
                    {
                        if ((_systemHasFloor = (arguments[3].Equals("system"))) == true)
                        {
                            //Foward any pending messages
                            if (vrIntentionMsg != "")
                            {
                                _vhmsgClient.SendMessage(vrIntentionMsg);
                                vrIntentionMsg = "";
                                updateDialogueState(_dialogueState);
                                //Release floor
                                _systemHasFloor = false;
                                _vhmsgClient.SendMessage("vrInteraction " + _agentID + " releaseFloor");
                            }
                            //Brad takes initiative (bypass the dialogue manager)
                            else if (_dialogueState.DialogueTurn == 0 && _agentID == 0)
                            {
                                //Create and send a Phatic Opener
                                _vhmsgClient.SendMessage("vrIntention " + _dialogueState.OtherAgentID.ToString() + " NONE ENHANCE_RAPPORT PHATIC_OPENER CONVENTION_GREETING");
                                vrIntentionMsg = "";
                                updateDialogueState(_dialogueState);
                                //Release floor
                                _systemHasFloor = false;
                                _vhmsgClient.SendMessage("vrInteraction " + _agentID + " releaseFloor");
                            }
                            else if (_dialogueState.DialogueTurn == 15)
                            {
                                //Create and send a Phatic End
                                _vhmsgClient.SendMessage("vrIntention " + _dialogueState.OtherAgentID.ToString() + " NONE MAINTAIN_RAPPORT PHATIC_END CONVENTION_GREETING");
                                vrIntentionMsg = "";
                                updateDialogueState(_dialogueState);
                                //Release floor
                                _systemHasFloor = false;
                                _vhmsgClient.SendMessage("vrInteraction " + _agentID + " releaseFloor");
                            }
                        }
                    }
                }
            }
            else if(arguments[0].Equals("vrIntention")){
                //Ignore vrIntention messages coming out of the Conversation Manager to the Realizer
                //Note: Outgoing vrIntention msgs have different agentID while incoming ones have this agent's ID
                if (arguments[1].Equals(_agentID.ToString()))
                {
                    //Store or forward vrIntention message to the dialogue manager
                    vrIntentionMsg = "vrDialogue " + _agentID + " " + args.s;   //overwrite old message

                    if (_systemHasFloor)
                    {
                        ///Forward message to dialogue manager
                        _vhmsgClient.SendMessage(vrIntentionMsg);
                        vrIntentionMsg = "";
                    }
                }
            }
            else if (arguments[0].Equals("vrConversation"))
            {
                //Ignore vrInteraction messages from other agents
                if (arguments[1].Equals(_agentID.ToString()))
                {
                    //This comes from the dialogue manager
                    if (arguments[2].Equals("vrIntention"))
                    {
                        string msg = "";    //overwrite old message

                        //Discard the first two arguments
                        for (int i = 2; i < arguments.Length; i++)
                        {
                            msg += arguments[i] + " ";
                        }

                        _vhmsgClient.SendMessage(msg);

                        print("*SENT* : " + msg);
                        print("===== DIALOGUE TURN: " + _dialogueState.DialogueTurn + " =====");

                        updateDialogueState(_dialogueState);

                        //Release floor
                        _systemHasFloor = false;
                        _vhmsgClient.SendMessage("vrInteraction " + _agentID + " releaseFloor");
                    }
                }
            }
        }
Esempio n. 4
0
        private void MessageAction(object sender, VHMsg.Message args)
        {
            String[] arguments = args.s.Split(' ');
            String vrNLUMsg = "vrNLU " + _agentID + " ";

            Random rand = new Random();

            if (arguments.Length <= 1)
            {
                return;
            }

            //Discard messages not directed for this agent
            if (arguments[1] != _agentID.ToString()) { return; }

            //DEBUG:
            //print("Received message: " + args.s);

            //If it is a ping message
            if (arguments[0].Equals("vrAllCall"))
            {
                _vhmsgClient.SendMessage("vrComponent NLU all");
            }
            //Gracefully kill self
            else if (arguments[0] == "vrKillComponent")
            {
                if (arguments[1] == "NLU")
                {
                    //Inform that ConversationManager is exiting
                    _vhmsgClient.SendMessage("vrProcEnd NLU all");

                    System.Environment.Exit(0);
                }
            }
        }
Esempio n. 5
0
        private static void MessageAction(object sender, VHMsg.Message args)
        {
            //Console.WriteLine("Received Message '" + args.s + "'");

            //Ict.ElvinUtility eu = (Ict.ElvinUtility)sender;

            string[] splitargs = args.s.Split(" ".ToCharArray());
            #if JUN
            Console.WriteLine(splitargs[0]);
            Console.WriteLine(splitargs.Length);
            Console.WriteLine(shouldListen);
            #endif

            if (splitargs.Length > 0)
            {
                if (splitargs[0] == "vrPerception")
                {
                    if (shouldListen)
                    {
                        if (splitargs.Length > 3)
                        {
            //#if JUN
            //                            Console.WriteLine(splitargs[1]);
            //#endif
                            string pmlArg = args.s.Substring(args.s.IndexOf(splitargs[2]));
                            ParseAndSendMessage(pmlArg);
                        }
                    }
                }
                else if (splitargs[0] == "vrPerceptionApplication")
                {
                    if (splitargs.Length >= 2)
                    {
                        string mode = splitargs[1];

                        if (mode.ToUpper().Trim().Equals("TOGGLE"))
                        {
                            //shouldListen = !shouldListen;
                            shouldListen = false;
                            CharacterReset();
                            Console.WriteLine("TOGGLE - " + shouldListen);
                        }
                        else if (mode.ToUpper().Trim().Equals("TRACKGAZE"))
                        {
                            shouldListen = true;
                            trackGaze = true;
                            trackEyes = false;
                            trackHead = false;
                            trackSmile = false;
                            trackAddressee = false;
                            CharacterReset();
                            //gazeTimer = new System.Timers.Timer(gazeTime);
                            gazeTimer.Interval = gazeTime;
                            gazeTimer.Enabled = true;
                            Console.WriteLine("TrackGaze - ON");
                        }
                        else if (mode.ToUpper().Trim().Equals("TRACKHEAD"))
                        {
                            shouldListen = true;
                            trackGaze = false;
                            trackEyes = false;
                            trackHead = true;
                            trackSmile = false;
                            trackAddressee = false;
                            CharacterReset();
                            gazeTimer.Enabled = false;
                            Console.WriteLine("TrackHead - ON");
                        }
                        else if (mode.ToUpper().Trim().Equals("TRACKADDRESSEE"))
                        {
                            shouldListen = true;
                            trackGaze = false;
                            trackEyes = false;
                            trackHead = false;
                            trackSmile = false;
                            trackAddressee = true;
                            CharacterReset();
                            gazeTimer.Interval = gazeTime;
                            gazeTimer.Enabled = true;
                            //gazeTimer.Enabled = false;
                            Console.WriteLine("TrackAddressee - ON");
                        }
                        else if (mode.ToUpper().Trim().Equals("RESET"))
                        {
                            Reset();
                            Console.WriteLine("RESET");
                        }
                        //ParseAndSendMessage(pmlArg);
                    }
                }
                else if (splitargs[0] == "vrAllCall")
                {
                    vhmsg.SendMessage("vrComponent perception-test-application");
                }
                else if (splitargs[0] == "vrKillComponent")
                {
                    if (splitargs.Length > 1)
                    {
                        if (splitargs[1] == "all" ||
                            splitargs[1] == "perception-test-application")
                        {
                            isRunning = false;
                        }
                    }
                }
            }
        }
        //Handler for RL training, that bypasses all other communication and connects the two agents' dialogue managers
        private void MessageActionTrain(object sender, VHMsg.Message args)
        {
            String[] arguments = args.s.Split(' ');

            if (arguments.Length <= 1)
            {
                return;
            }

            //If it is a ping message
            if (arguments[0].Equals("vrAllCall"))
            {
                _vhmsgClient.SendMessage("vrComponent ConversationManager all");
            }
            else if (arguments[0].Equals("vrDMRLTrain"))
            {
                //Ignore vrDMRLTrain messages to other agents
                if (arguments[1] == _agentID.ToString())
                {
                    //Retrieve arguments
                    DialogueAction otherDialogueAction = DialogueAction.StringToDialogueAction(arguments);
                }
            }
        }
        //THIS IS FOR DEMO - DEBUG: In the final version, the IM will request a response from the DM and the DM will look at the DState rather than listen to a message
        //This handler implements the handcrafted dialogue policy
        private void MessageActionRuleBased(object sender, VHMsg.Message args)
        {
            String[] arguments = args.s.Split(' ');
            String vrRapportMsg = "vrRapport " + _agentID + " ";
            TASK_GOAL otherTaskGoal;
            SOCIAL_GOAL otherSocialGoal;
            RAPPORT_STRATEGY_DEMO otherRapportStrategy, nextRapportStrategy = RAPPORT_STRATEGY_DEMO.NONE;
            COMMUNICATIVE_ACT otherVerbalAct;

            Random rand = new Random();

            if (arguments.Length <= 1)
            {
                return;
            }

            //Discard messages not directed for this agent
            if (arguments[1] != _agentID.ToString()) { return; }

            //DEBUG:
            //print("Received message: " + args.s);

            //If it is a ping message
            if (arguments[0].Equals("vrAllCall"))
            {
                _vhmsgClient.SendMessage("vrComponent RapportManager all");
            }
            else if (arguments[0].Equals("vrGoal"))
            {
                _dialogueState.TaskGoal = (TASK_GOAL)Enum.Parse(typeof(TASK_GOAL), arguments[2]);
                _dialogueState.SocialGoal = (SOCIAL_GOAL)Enum.Parse(typeof(SOCIAL_GOAL), arguments[3]);
                _parent.updateDialogueState(_dialogueState);
            }
            else if (arguments[0].Equals("vrDialogue"))
            {
                if (arguments[2].Equals("vrIntention"))
                {
                    if (arguments[3] == _agentID.ToString())
                    {
                        //Retrieve arguments
                        otherTaskGoal = (TASK_GOAL)Enum.Parse(typeof(TASK_GOAL), arguments[4]);
                        otherSocialGoal = (SOCIAL_GOAL)Enum.Parse(typeof(SOCIAL_GOAL), arguments[5]);
                        otherRapportStrategy = (RAPPORT_STRATEGY_DEMO)Enum.Parse(typeof(RAPPORT_STRATEGY_DEMO), arguments[6]);
                        otherVerbalAct = (COMMUNICATIVE_ACT)Enum.Parse(typeof(COMMUNICATIVE_ACT), arguments[7]);

                        #region Handcrafted Rapport Selection Strategy FOR INMIND DEMO

                        //Select next action
                        //TODO: Have cases for friends. Rules below assume agents are strangers.
                        switch (otherRapportStrategy)
                        {
                            case RAPPORT_STRATEGY_DEMO.QUESTION_ELICIT_SD:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //The other agent's goal
                                                switch (otherSocialGoal)
                                                {
                                                    case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                        {
                                                            //List of possible rapport strategies
                                                            RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PRAISE, RAPPORT_STRATEGY_DEMO.SELF_DISC_NEGATIVE };
                                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                            break;
                                                        }
                                                    case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                                    case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                        {
                                                            //List of possible rapport strategies
                                                            RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PRAISE, RAPPORT_STRATEGY_DEMO.SELF_DISC_NEGATIVE, RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE };
                                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                            break;
                                                        }
                                                }

                                                break;
                                            }
                                        //Other cases here
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.SELF_DISC_POSITIVE:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //The other agent's goal
                                                switch (otherSocialGoal)
                                                {
                                                    case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                        {
                                                            //List of possible rapport strategies
                                                            RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PRAISE, RAPPORT_STRATEGY_DEMO.SELF_DISC_NEGATIVE };
                                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                            break;
                                                        }
                                                    case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                                    case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                        {
                                                            //List of possible rapport strategies
                                                            RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PRAISE, RAPPORT_STRATEGY_DEMO.SELF_DISC_NEGATIVE, RAPPORT_STRATEGY_DEMO.SELF_DISC_POSITIVE, RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE };
                                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                            break;
                                                        }
                                                }

                                                break;
                                            }
                                        //Other cases here
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.PRAISE:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //The other agent's goal
                                                switch (otherSocialGoal)
                                                {
                                                    case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                        {
                                                            //List of possible rapport strategies
                                                            RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SELF_DISC_NEGATIVE, RAPPORT_STRATEGY_DEMO.SELF_DISC_POSITIVE, RAPPORT_STRATEGY_DEMO.QUESTION_ELICIT_SD };
                                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                            break;
                                                        }
                                                    case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                                    case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                        {
                                                            //List of possible rapport strategies
                                                            RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SELF_DISC_NEGATIVE, RAPPORT_STRATEGY_DEMO.QUESTION_ELICIT_SD, RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE };
                                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                            break;
                                                        }
                                                }

                                                break;
                                            }
                                        //Other cases here
                                    }

                                    break;
                                }
                            /*case RAPPORT_STRATEGY.RECIPROCATE_PREV_ACT: {

                                switch (_dialogueState.SocialGoal)
                                {
                                    //This agent's social goal
                                    case SOCIAL_GOAL.DESTROY_RAPPORT:
                                        {
                                            //The other agent's goal
                                            switch (otherSocialGoal)
                                            {
                                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                                case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                            }

                                            break;
                                        }
                                    //This agent's social goal
                                    case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                        {
                                            //The other agent's goal
                                            switch (otherSocialGoal)
                                            {
                                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                    {
                                                        //List of possible rapport strategies
                                                        RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.EMB_LAUGHTER };
                                                        nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                        break;
                                                    }
                                                case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                    {
                                                        //List of possible rapport strategies
                                                        RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                        nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                        break;
                                                    }
                                            }

                                            break;
                                        }
                                    //This agent's social goal
                                    case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                        {
                                            //The other agent's goal
                                            switch (otherSocialGoal)
                                            {
                                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                    {
                                                        //List of possible rapport strategies
                                                        RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                        nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                        break;
                                                    }
                                                case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                    {
                                                        //List of possible rapport strategies
                                                        RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                        nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                        break;
                                                    }
                                            }

                                            break;
                                        }
                                }

                                break;
                            }*/
                            case RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE:
                                {
                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //The other agent's goal
                                                switch (otherSocialGoal)
                                                {
                                                    case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                        {
                                                            //List of possible rapport strategies
                                                            RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.QUESTION_ELICIT_SD, RAPPORT_STRATEGY_DEMO.SELF_DISC_NEGATIVE, RAPPORT_STRATEGY_DEMO.PRAISE, RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE };
                                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                            break;
                                                        }
                                                    case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                                    case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                        {
                                                            //List of possible rapport strategies
                                                            RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.QUESTION_ELICIT_SD, RAPPORT_STRATEGY_DEMO.PRAISE, RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE };
                                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                            break;
                                                        }
                                                }

                                                break;
                                            }
                                    }
                                    break;
                                }

                            case RAPPORT_STRATEGY_DEMO.NONE:
                                {
                                    break;
                                }

                            default: { Console.WriteLine("Error! Unknown rapport strategy."); break; }
                        }

                        #endregion

                        //Create a task goal
                        vrRapportMsg += _dialogueState.TaskGoal.ToString() + " ";

                        //Create a social goal
                        vrRapportMsg += _dialogueState.SocialGoal.ToString() + " ";

                        vrRapportMsg += nextRapportStrategy.ToString() + " ";

                        //Send message to conversation manager
                        _vhmsgClient.SendMessage(vrRapportMsg);

                        print("SENT message: " + vrRapportMsg);
                    }
                }
            }
            else if(arguments[0].Equals("vrGlobalData")){
                if(arguments[1].Equals(_agentID.ToString()) && arguments[2].Equals("Response")){
                    switch(arguments[3]){
                        case "failed_userExists": {
                            //Try to log in instead

                            _vhmsgClient.SendMessage("vrGlobalData " + _agentID + " login " + _userName);
                            break;
                        }
                        case "failed_noUser": {
                            //Try to create a new user instead
                            _vhmsgClient.SendMessage("vrGlobalData " + _agentID + " new " + _userName);
                            break;
                        }
                        case "userModel": {
                            //TODO: Check if a user model was requested?

                            break;
                        }
                        default: {
                            //Print the message
                            print(args.s);
                            break;
                        }
                    }
                }
            }
        }
        //THIS IS FOR DEMO - DEBUG: In the final version, the IM will request a response from the DM and the DM will look at the DState rather than listen to a message
        //This handler implements the handcrafted dialogue policy
        private void MessageActionRuleBased(object sender, VHMsg.Message args)
        {
            String[] arguments = args.s.Split(' ');
            String vrIntentionMsg = "vrConversation " + _agentID + " vrIntention " + _dialogueState.OtherAgentID + " ";
            TASK_GOAL otherTaskGoal;
            SOCIAL_GOAL otherSocialGoal;
            RAPPORT_STRATEGY_DEMO otherRapportStrategy, nextRapportStrategy = RAPPORT_STRATEGY_DEMO.NONE;
            COMMUNICATIVE_ACT otherVerbalAct;

            Random rand = new Random();

            if (arguments.Length <= 1)
            {
                return;
            }

            //Discard messages not directed for this agent
            if (arguments[1] != _agentID.ToString()) { return; }

            //DEBUG:
            //print("Received message: " + args.s);

            //If it is a ping message
            if (arguments[0].Equals("vrAllCall"))
            {
                _vhmsgClient.SendMessage("vrComponent DialogueManager all");
            }
            else if(arguments[0].Equals("vrGoal")){
                _dialogueState.TaskGoal = (TASK_GOAL)Enum.Parse(typeof(TASK_GOAL), arguments[2]);
                _dialogueState.SocialGoal = (SOCIAL_GOAL)Enum.Parse(typeof(SOCIAL_GOAL), arguments[3]);
                _parent.updateDialogueState(_dialogueState);
            }
            else if (arguments[0].Equals("vrDialogue"))
            {
                if (arguments[2].Equals("vrIntention"))
                {
                    if (arguments[3] == _agentID.ToString())
                    {
                        //Retrieve arguments
                        otherTaskGoal = (TASK_GOAL)Enum.Parse(typeof(TASK_GOAL), arguments[4]);
                        otherSocialGoal = (SOCIAL_GOAL)Enum.Parse(typeof(SOCIAL_GOAL), arguments[5]);
                        otherRapportStrategy = (RAPPORT_STRATEGY_DEMO)Enum.Parse(typeof(RAPPORT_STRATEGY_DEMO), arguments[6]);
                        otherVerbalAct = (COMMUNICATIVE_ACT)Enum.Parse(typeof(COMMUNICATIVE_ACT), arguments[7]);

                        #region Handcrafted Rapport Selection Strategy
                        /*
                    //Select next action
                    //TODO: Have cases for friends. Rules below assume agents are strangers.
                    switch(otherRapportStrategy){
                        case RAPPORT_STRATEGY.ACKNOWLEDGE: {

                            switch(_dialogueState.SocialGoal){
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT: {
                                    //The other agent's goal
                                    switch(otherSocialGoal){                //TODO: Maintain (currently pointless) switch structure for future changes?
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                    }

                                    break;
                                }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT: {
                                    //The other agent's goal
                                    switch (otherSocialGoal)
                                    {
                                        case SOCIAL_GOAL.DESTROY_RAPPORT: {
                                            //List of possible rapport strategies
                                            RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC};
                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                            break;
                                        }
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT: {
                                            //List of possible rapport strategies
                                            RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                            break;
                                        }
                                    }

                                    break;
                                }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT: {
                                    //The other agent's goal
                                    switch (otherSocialGoal)
                                    {
                                        case SOCIAL_GOAL.DESTROY_RAPPORT: {
                                            //List of possible rapport strategies
                                            RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                            break;
                                        }
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT: {
                                            //List of possible rapport strategies
                                            RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                            nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                            break;
                                        }
                                    }

                                    break;
                                }
                            }

                            break;
                        }
                        case RAPPORT_STRATEGY.ADHERE_TO_NORMS: {

                            switch (_dialogueState.SocialGoal)
                            {
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.EMB_LAUGHTER };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                    break;
                                                }
                                        }

                                        break;
                                    }
                            }

                            break;
                        }
                        case RAPPORT_STRATEGY.EMB_LAUGHTER: {

                            switch (_dialogueState.SocialGoal)
                            {
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.INTIMATE_PERSONAL_INFO, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                    break;
                                                }
                                        }

                                        break;
                                    }
                            }

                            break;
                        }
                        case RAPPORT_STRATEGY.INIT_SELF_DISC: {

                            switch (_dialogueState.SocialGoal)
                            {
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.EMB_LAUGHTER, RAPPORT_STRATEGY.RECIPROCATE_PREV_ACT, RAPPORT_STRATEGY.ACKNOWLEDGE };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.INTIMATE_PERSONAL_INFO, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.REFER_SHARED_EXP, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                    break;
                                                }
                                        }

                                        break;
                                    }
                            }

                            break;
                        }
                        case RAPPORT_STRATEGY.INTIMATE_PERSONAL_INFO: {

                            switch (_dialogueState.SocialGoal)
                            {
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.INTIMATE_PERSONAL_INFO, RAPPORT_STRATEGY.EMB_LAUGHTER };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.RECIPROCATE_PREV_ACT, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.INTIMATE_PERSONAL_INFO, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                    break;
                                                }
                                        }

                                        break;
                                    }
                            }

                            break;
                        }
                        case RAPPORT_STRATEGY.NEGATIVE_SELF_DISC: {

                            switch (_dialogueState.SocialGoal)
                            {
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.EMB_LAUGHTER };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.INTIMATE_PERSONAL_INFO, RAPPORT_STRATEGY.RECIPROCATE_PREV_ACT, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                    break;
                                                }
                                        }

                                        break;
                                    }
                            }

                            break;
                        }
                        case RAPPORT_STRATEGY.PRAISE: {

                            switch (_dialogueState.SocialGoal)
                            {
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.EMB_LAUGHTER };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.RECIPROCATE_PREV_ACT, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                    break;
                                                }
                                        }

                                        break;
                                    }
                            }

                            break;
                        }
                        case RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION: {

                            switch (_dialogueState.SocialGoal)
                            {
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.EMB_LAUGHTER };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.RECIPROCATE_PREV_ACT, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCATE_PREV_ACT, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                    break;
                                                }
                                        }

                                        break;
                                    }
                            }

                            break;
                        }
                        case RAPPORT_STRATEGY.RECIPROCATE_PREV_ACT: {

                            switch (_dialogueState.SocialGoal)
                            {
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.EMB_LAUGHTER };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                    break;
                                                }
                                        }

                                        break;
                                    }
                            }

                            break;
                        }
                        case RAPPORT_STRATEGY.REFER_SHARED_EXP: {

                            switch (_dialogueState.SocialGoal)
                            {
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.EMB_LAUGHTER };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                    break;
                                                }
                                        }

                                        break;
                                    }
                            }

                            break;
                        }
                        case RAPPORT_STRATEGY.VIOLATE_NORMS: {

                            switch (_dialogueState.SocialGoal)
                            {
                                //This agent's social goal
                                case SOCIAL_GOAL.DESTROY_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT: { nextRapportStrategy = RAPPORT_STRATEGY.VIOLATE_NORMS; break; }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.EMB_LAUGHTER };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.PRAISE, RAPPORT_STRATEGY.NEGATIVE_SELF_DISC, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                        }

                                        break;
                                    }
                                //This agent's social goal
                                case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                    {
                                        //The other agent's goal
                                        switch (otherSocialGoal)
                                        {
                                            case SOCIAL_GOAL.DESTROY_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                    break;
                                                }
                                            case SOCIAL_GOAL.ENHANCE_RAPPORT:   //Same as maintain
                                            case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                                {
                                                    //List of possible rapport strategies
                                                    RAPPORT_STRATEGY[] validStrategies = { RAPPORT_STRATEGY.INIT_SELF_DISC, RAPPORT_STRATEGY.ACKNOWLEDGE, RAPPORT_STRATEGY.ADHERE_TO_NORMS, RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION, RAPPORT_STRATEGY.REFER_SHARED_EXP };
                                                    nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                    break;
                                                }
                                        }

                                        break;
                                    }
                            }

                            break;
                        }
                        default: { Console.WriteLine("Error! Unknown rapport strategy."); break; }
                    }
                    */
                        #endregion

                        #region Handcrafted Rapport Selection Strategy FOR DEMO

                        //Select next action
                        //TODO: Have cases for friends. Rules below assume agents are strangers.
                        /*switch (otherRapportStrategy)
                        {
                            case RAPPORT_STRATEGY_DEMO.NONE:
                                {
                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_OPENER, RAPPORT_STRATEGY_DEMO.SD_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SD_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SD_INFORMATION, RAPPORT_STRATEGY_DEMO.OUTSIDE_CURRENT_EXPERIENCE, RAPPORT_STRATEGY_DEMO.SD_FEELINGS, RAPPORT_STRATEGY_DEMO.SD_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.OUTSIDE_CURRENT_EXPERIENCE:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SD_INFORMATION, RAPPORT_STRATEGY_DEMO.OUTSIDE_CURRENT_EXPERIENCE, RAPPORT_STRATEGY_DEMO.SD_FEELINGS, RAPPORT_STRATEGY_DEMO.SD_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.OUTSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.PHATIC_END:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.NONE;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_OPENER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.PHATIC_FILLER:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.PHATIC_OPENER:
                                {
                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SD_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE, RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE, RAPPORT_STRATEGY_DEMO.OUTSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.SD_FEELINGS:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SD_FEELINGS, RAPPORT_STRATEGY_DEMO.SD_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.SD_INFORMATION:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SD_FEELINGS, RAPPORT_STRATEGY_DEMO.SD_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.SD_THOUGHTS:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SD_FEELINGS, RAPPORT_STRATEGY_DEMO.SD_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.SQ_FEELINGS:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SD_FEELINGS, RAPPORT_STRATEGY_DEMO.SD_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.SQ_INFORMATION:
                                {
                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SD_FEELINGS, RAPPORT_STRATEGY_DEMO.SD_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }
                            case RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS:
                                {

                                    switch (_dialogueState.SocialGoal)
                                    {
                                        //This agent's social goal
                                        case SOCIAL_GOAL.DESTROY_RAPPORT:
                                            {
                                                nextRapportStrategy = RAPPORT_STRATEGY_DEMO.PHATIC_END;
                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.ENHANCE_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.SD_FEELINGS, RAPPORT_STRATEGY_DEMO.SD_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS, RAPPORT_STRATEGY_DEMO.SQ_FEELINGS };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];

                                                break;
                                            }
                                        //This agent's social goal
                                        case SOCIAL_GOAL.MAINTAIN_RAPPORT:
                                            {
                                                //List of possible rapport strategies
                                                RAPPORT_STRATEGY_DEMO[] validStrategies = { RAPPORT_STRATEGY_DEMO.PHATIC_FILLER, RAPPORT_STRATEGY_DEMO.SQ_INFORMATION, RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE };
                                                nextRapportStrategy = validStrategies[rand.Next(0, validStrategies.Length - 1)];
                                                break;
                                            }
                                    }

                                    break;
                                }

                            default: { Console.WriteLine("Error! Unknown rapport strategy."); break; }
                        }*/

                        #endregion

                        #region Handcrafted Rapport Selection Strategy FOR INMIND DEMO

                        switch(otherRapportStrategy){
                            case RAPPORT_STRATEGY_DEMO.NONE:{
                                break;
                            }
                            case RAPPORT_STRATEGY_DEMO.PRAISE:{
                                break;
                            }
                            case RAPPORT_STRATEGY_DEMO.QUESTION_ELICIT_SD: {
                                break;
                            }
                            case RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE: {
                                break;
                            }
                            case RAPPORT_STRATEGY_DEMO.SELF_DISC_NEGATIVE: {
                                break;
                            }
                            case RAPPORT_STRATEGY_DEMO.SELF_DISC_POSITIVE: {
                                break;
                            }
                            default: {
                                print("Error! Undefined Rapport Strategy! " + otherRapportStrategy);
                                break;
                            }
                        }

                        #endregion

                        //Create a task goal
                        vrIntentionMsg += _dialogueState.TaskGoal.ToString() + " ";

                        //Create a social goal
                        vrIntentionMsg += _dialogueState.SocialGoal.ToString() + " ";

                        vrIntentionMsg += nextRapportStrategy.ToString() + " ";

                        //Select dialogue acts
                       /* switch (nextRapportStrategy)
                        {
                            case RAPPORT_STRATEGY_DEMO.NONE: { vrIntentionMsg += COMMUNICATIVE_ACT.PHATIC.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.INSIDE_CURRENT_EXPERIENCE: { vrIntentionMsg += COMMUNICATIVE_ACT.STATEMENT_INFORMATION.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.OUTSIDE_CURRENT_EXPERIENCE: { vrIntentionMsg += COMMUNICATIVE_ACT.STATEMENT_INFORMATION.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.PHATIC_END: { vrIntentionMsg += COMMUNICATIVE_ACT.PHATIC.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.PHATIC_FILLER: { vrIntentionMsg += COMMUNICATIVE_ACT.PHATIC.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.PHATIC_OPENER: { vrIntentionMsg += COMMUNICATIVE_ACT.CONVENTION_GREETING.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.REFER_TO_SHARED_EXPERIENCE: { vrIntentionMsg += COMMUNICATIVE_ACT.STATEMENT_INFORMATION.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.SD_FEELINGS: { vrIntentionMsg += COMMUNICATIVE_ACT.STATEMENT_INFORMATION.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.SD_INFORMATION: { vrIntentionMsg += COMMUNICATIVE_ACT.STATEMENT_INFORMATION.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.SD_THOUGHTS: { vrIntentionMsg += COMMUNICATIVE_ACT.STATEMENT_INFORMATION.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.SQ_FEELINGS: { vrIntentionMsg += COMMUNICATIVE_ACT.REQUEST_COMMENT.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.SQ_INFORMATION: { vrIntentionMsg += COMMUNICATIVE_ACT.REQUEST_COMMENT.ToString() + " "; break; }
                            case RAPPORT_STRATEGY_DEMO.SQ_THOUGHTS: { vrIntentionMsg += COMMUNICATIVE_ACT.REQUEST_COMMENT.ToString() + " "; break; }
                        }*/

                        /*switch (nextRapportStrategy)
                        {
                            case RAPPORT_STRATEGY.ACKNOWLEDGE: {
                                vrIntentionMsg += rand.NextDouble() > 0.5 ? VERBAL_ACT.FEEDBACK_POSITIVE.ToString() + " " : VERBAL_ACT.PHATIC_OPENER.ToString() + " ";
                                break;
                            }
                            case RAPPORT_STRATEGY.ADHERE_TO_NORMS: {
                                vrIntentionMsg += _dialogueState.DialogueTurn == 0 ? VERBAL_ACT.CONVENTION_GREETING.ToString() + " " : VERBAL_ACT.PHATIC_OPENER.ToString() + " ";
                                break;
                            }
                            case RAPPORT_STRATEGY.EMB_LAUGHTER: { vrIntentionMsg += VERBAL_ACT.NOOP.ToString() + " "; break; }
                            case RAPPORT_STRATEGY.INIT_SELF_DISC: {

                                break;
                            }
                            case RAPPORT_STRATEGY.INTIMATE_PERSONAL_INFO: { vrIntentionMsg += VERBAL_ACT.STATEMENT_INFORMATION.ToString() + " "; break; }
                            case RAPPORT_STRATEGY.NEGATIVE_SELF_DISC: { vrIntentionMsg += VERBAL_ACT.STATEMENT_INFORMATION.ToString() + " "; break; }
                            case RAPPORT_STRATEGY.PRAISE: { break; }
                            case RAPPORT_STRATEGY.RECIPROCAL_APPRECIATION: { break; }
                            case RAPPORT_STRATEGY.RECIPROCATE_PREV_ACT: { break; }
                            case RAPPORT_STRATEGY.REFER_SHARED_EXP: { break; }
                            case RAPPORT_STRATEGY.VIOLATE_NORMS: { break; }
                        }*/

                        //Send message to conversation manager
                        _vhmsgClient.SendMessage(vrIntentionMsg);

                        //print("SENT message: " + vrIntentionMsg);
                    }
                }
            }
        }