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; }
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"); } } } }
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); } } }
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); } } } }