public string SayHello() { PureFact numberOfStarts = (PureFact)factsManager.GetByName("SystemStartsCount"); int numberOfStartsInt = Convert.ToInt32(numberOfStarts.Value); string text = ""; if (!string.IsNullOrEmpty(factsManager.GetValueByName("UserName"))) //we know how the user's name { text = KorraModelHelper.GetChance(new string[] { "Hi", "Hello", "Hey", }); if (KorraModelHelper.GetChance(3) && numberOfStartsInt > 1 && (text == "Hi" || text == "Hello")) //again version { text += " again"; } text += " " + factsManager.GetValueByName("UserName"); } else //we do NOT know how the user's name { if (KorraModelHelper.GetChance(3) && numberOfStartsInt > 1) { text = KorraModelHelper.GetChance(new string[] { "Hi again", "Hello again", }); //again version } else { text = KorraModelHelper.GetChance(new string[] { "Hi", "Hello", "Hey", "Hello there", "Hey buddy" }); } } return(text); }
public string GoOutAnnoucement() { PureFact factJob = (PureFact)factsManager.GetByName("UserHasJob"); bool userWorks = factJob.IsAnswered && this.IsYes(factJob.Value); var options = (new string[] { "You should go out this evening with your friends.", "Call somebody and go for a drink this evening.", "Today is " + KorraModelHelper.DayOfWeek() + ". It is pizza day. You better have something to eat outside." //TODO: check if it evening, or lunch time }).ToList(); if (userWorks) { options.Add("Call some friends and go for a drink after work."); options.Add("Going to a bar after work sounds like a great idea"); options.Add("Do you have plans for this evening after work? You better go out and have a drink at the local pub."); } else { options.Add("Call some friends and go for a drink."); options.Add("Going to a bar this evening sounds like a great idea."); options.Add("Do you have plans for this evening? You better go out and have a drink at the local pub."); } //choose a statement randomly string text = KorraModelHelper.GetChance(options.ToArray(), lastGoOutAnnouncementUsed); lastGoOutAnnouncementUsed = text; return(text); }
private PureFact GetPureFactAbouBot() { PureFacts pfManager = (PureFacts)providers.SingleOrDefault(x => x is PureFacts); if (pfManager == null) { SharedHelper.LogError("No manager in GetPureFactAbouBot."); return(null); } var q = (from item in pfManager.GetAll() let pf = item as PureFact where pf.Type == PureFactType.AboutBot && pf.IsPlanned == false && pf.IsUsed == false select pf).ToArray(); if (q.Length > 0) { string[] group1 = { "BotName" }; //conversation should start with these string[] group2 = { "BotAge", "BotSex" }; //conversation should continue with these List <ItemProb <string> > itemProbs = new List <ItemProb <string> >(); //assign probabilities foreach (PureFact fact in q) { if (group1.Contains(fact.Name)) //add only 1 item { itemProbs.Add(new ItemProb <string>(fact.Name, Prob(0.99))); break; } else if (group2.Contains(fact.Name)) { itemProbs.Add(new ItemProb <string>(fact.Name, Prob(0.25))); } else { itemProbs.Add(new ItemProb <string>(fact.Name, Prob(0.8))); } } var pureFactDistF = CategoricalF(itemProbs.ToArray()).Normalize(); var pureFactDist = pureFactDistF.ToSampleDist(); var selectionName = pureFactDist.Sample(); PureFact selectedPureFact = (PureFact)pfManager.GetByName(selectionName); //SharedHelper.Log("GetPureFactAbouUser: selectionName " + selectionName); return(selectedPureFact); } else { SharedHelper.LogError("GetPureFactAbouBot could not supply a pure fact about the bot."); return(null); } }
public bool IsAnsweredAndUserIsWoman() { PureFact fact = (PureFact)factsManager.GetByName("UserSex"); if (fact.IsAnswered && fact.Value.ToLower() == Female().ToLower()) //should be changed for other languages { return(true); } return(false); }
public void BeforeAnalyseUserResponse(PureFact pfact) { //Here you change the responses that were encoded when creating this PureFact, even replace the function responsible for the answers. //This can be useful if you have new information about the user and its environment and this could not be encoded in advance. bool isAnswerd = pfact.IsAnswered; string responseValue = pfact.Value; //if (context.Phrases.IsYes(responseValue)) //{ // fact.StatementOnPositiveResponse = ""; //} SharedHelper.Log("Pure fact updated: " + pfact.Name); }
public CommItem?Process(IKorraAIModel model) { #region Get Fact Manager PureFacts pfManager = (PureFacts)model.ItemProviders.SingleOrDefault(x => x is PureFacts); if (pfManager == null) { SharedHelper.LogError("No manager in Facts Manager in MoviesModelUpdateTrigger."); return(null); } #endregion var context = model.GetContext(); string text = ""; PureFact factLikesVideoGames = (PureFact)pfManager.GetByName("UserLikesVideoGames"); PureFact factThinksVideoGameIsGoodPresent = (PureFact)pfManager.GetByName("UserThinksVideoGameIsGoodPresent"); PureFact userAge = (PureFact)pfManager.GetByName("UserAge"); PureFact userSex = (PureFact)pfManager.GetByName("UserSex"); if (factLikesVideoGames == null || factThinksVideoGameIsGoodPresent == null || userAge == null || userSex == null) { SharedHelper.LogError("factJob or factWatchedMovieYesterday is NULL in MoviesModelUpdateTrigger."); } bool UserLikesVideoGamesAnswered = factLikesVideoGames.IsAnswered; bool UserThinksVideoGameIsGoodPresentAnswered = factThinksVideoGameIsGoodPresent.IsAnswered; bool userAgeAnswered = userAge.IsAnswered; bool userSexAnswered = userSex.IsAnswered; if (!UserLikesVideoGamesAnswered) { return(null); } bool UserLikesVideoGamesAnsweredYES = context.BasePhrases.IsYes(factLikesVideoGames.Value); //only if answered //Calcualte 3 differerent surprises: //1. surprise because statistically people from this sex and age like computer games //Should like Video Games, but user answered No if (userAgeAnswered && userSexAnswered && factLikesVideoGames.IsAnswered && !UserLikesVideoGamesAnsweredYES //DOES NOT LIKE VIDEO GAMES ) { int Age = Convert.ToInt32(userAge.Value); bool IsMale = userSex.Value.ToLower() == phrases.Male().ToLower(); var likesVideoGamesInferred = BernoulliF(ProbVariables.User.playsGames(Age, IsMale)); //our estimation based on Age and Sex //Threshold check if (likesVideoGamesInferred.ProbOf(e => e == true).Value > 0.8) { SharedHelper.LogWarning("VG S1 surprise inferred."); text = phrases.SurpriseVideoGames(1, false); //second parameter is not used executedCount = executedCount + 1; return(new CommItem { Category = ActionsEnum.MakeGeneralStatement, Name = "ExpressVideoGamesSurprise", TextToSay = text, FacialExpression = FaceExp.SurpriseOnStartTalking, }); } else { SharedHelper.LogWarning("No VG S1 surprise, because it is below threshold."); } } if (!UserThinksVideoGameIsGoodPresentAnswered) { return(null); } bool UserThinksVideoGameIsGoodPresentYES = context.BasePhrases.IsYes(factThinksVideoGameIsGoodPresent.Value); //only if answered //2. Surprise //Thinks games are good present - YES //Likes games in general - NO //surprise: LikesGames rendered more than 70% positive, but still answered NO by user //backward inference if (UserLikesVideoGamesAnswered && !UserLikesVideoGamesAnsweredYES && //DOES NOT LIKE VIDEO GAMES UserThinksVideoGameIsGoodPresentAnswered && UserThinksVideoGameIsGoodPresentYES //LIKES VG AS PRESENT ) { var conditionThinksVideogameIsGoodPresent = ProbVariables.User.VideoGameModel.ConditionHard(e => e.ThinksVideogameIsGoodPresent); //for this query we are not using Age and Sex, because we already know that the user LikesVideoGames (answered by the user) double probLikesGamesConditionedOnThinksGamesAreGoodPresentInferred = conditionThinksVideogameIsGoodPresent.ProbOf(e => e.LikesVideoGames).Value; SharedHelper.LogWarning("S2 probLikesGamesConditionedOnThinksGamesAreGoodPresent: " + probLikesGamesConditionedOnThinksGamesAreGoodPresentInferred); //Threshold check if (probLikesGamesConditionedOnThinksGamesAreGoodPresentInferred > 0.6) { SharedHelper.LogWarning("VG S2 surprise inferred."); bool IsLikesGamesFirstAnswered = factLikesVideoGames.LastUpdated < factThinksVideoGameIsGoodPresent.LastUpdated; text = phrases.SurpriseVideoGames(2, IsLikesGamesFirstAnswered); executedCount = executedCount + 1; return(new CommItem { Category = ActionsEnum.MakeGeneralStatement, Name = "ExpressVideoGamesSurprise", TextToSay = text, IsReactionToUser = true, FacialExpression = FaceExp.SurpriseOnStartTalking, }); } else { SharedHelper.LogWarning("No VG S2 surprise, because it is below threshold."); } } // 3. Surprise //Thinks games are a good present - NO //Likes games in general - YES //surprise: ThinkGamesGoodPresent rendered more than 70% positive, but still answered NO by user if (UserLikesVideoGamesAnswered && UserThinksVideoGameIsGoodPresentAnswered && UserLikesVideoGamesAnsweredYES && //LIKES VIDEO GAMES !UserThinksVideoGameIsGoodPresentYES) //DOES NOT LIKE VG AS PRESENT { //TODO: it should not be here, but attached to the item //THIS IS NEEDED FOR THE INFERRENCE BELOW ON: probThinksVideoGameIsGoodPresentInferred if (UserLikesVideoGamesAnsweredYES) { ProbVariables.User.LikesVideoGames = BernoulliF(Prob(0.98)); } var probThinksVideoGameIsGoodPresentInferred = ProbVariables.User.VideoGameModel.ProbOf(e => e.ThinksVideogameIsGoodPresent).Value; SharedHelper.LogWarning("S3 probThinksVideoGameIsGoodPresent: " + probThinksVideoGameIsGoodPresentInferred); //Threshold check if (probThinksVideoGameIsGoodPresentInferred >= 0.7) { SharedHelper.LogWarning("VG S3 surprise inferred."); bool IsLikesGamesFirstAnswered = factLikesVideoGames.LastUpdated < factThinksVideoGameIsGoodPresent.LastUpdated; text = phrases.SurpriseVideoGames(3, IsLikesGamesFirstAnswered); executedCount = executedCount + 1; return(new CommItem { Category = ActionsEnum.MakeGeneralStatement, Name = "ExpressVideoGamesSurprise", TextToSay = text, FacialExpression = FaceExp.SurpriseOnStartTalking, }); } else { SharedHelper.LogWarning("No VG S3 surprise, because it is below threshold."); } } return(null); }
public bool Process(bool isPureFactUpdated, TimeSpan timeSinceStart, IKorraAIModel model) { //SharedHelper.LogWarning("Inside movies trigger"); #region Get Fact Manager PureFacts pfManager = (PureFacts)model.ItemProviders.SingleOrDefault(x => x is PureFacts); if (pfManager == null) { SharedHelper.LogError("No manager in Process in MoviesModelUpdateTrigger."); return(false); } #endregion var context = model.GetContext(); PureFact factJob = (PureFact)pfManager.GetByName("UserHasJob"); PureFact factWatchedMovieYesterday = (PureFact)pfManager.GetByName("UserMovieYesterday"); if (factJob == null || factWatchedMovieYesterday == null) { SharedHelper.LogError("factJob or factWatchedMovieYesterday is NULL in MoviesModelUpdateTrigger."); } if (!IsTimeOfDayUpdated && !isPureFactUpdated) { return(false); } SharedHelper.Log("Inside MoviesModelUpdateTrigger"); var oldSuggestToWatchMovie = SharedHelper.GetProb(ProbVariables.Bot.SuggestToWatchMovie).Value; //TODO: this model can be replaced by a Bayesian network, because of the too many IFs //if no job or weekend if ((factJob.IsAnswered && context.BasePhrases.IsNo(factJob.Value)) || StatesShared.IsWeekend) { ProbVariables.Bot.SuggestToWatchMovie = BernoulliF(Prob(0.18)); //KorraBaseHelper.Log("Prob SuggestToWatchMovie changed to: 0.18, no job or weekend"); } else if (factJob.IsAnswered && context.BasePhrases.IsYes(factJob.Value)) //if has job { #region working and evening if (StatesShared.IsEvening /*TODO: or after work hours*/) { //has NOT watched movie yesterday (is working and evening) if (factWatchedMovieYesterday.IsAnswered && context.BasePhrases.IsNo(factJob.Value)) { ProbVariables.Bot.SuggestToWatchMovie = BernoulliF(Prob(0.18)); //KorraBaseHelper.Log("Prob SuggestToWatchMovie changed to: 0.18, evening"); } //has watched movie yesterday (is working and evening) else if (factWatchedMovieYesterday.IsAnswered && context.BasePhrases.IsYes(factJob.Value)) { ProbVariables.Bot.SuggestToWatchMovie = BernoulliF(Prob(0.12)); // KorraBaseHelper.Log("Prob SuggestToWatchMovie changed to: 0.12. Watched movie yesterday."); } } #endregion else //is working and not evening, no time because working and not evening { ProbVariables.Bot.SuggestToWatchMovie = BernoulliF(Prob(0.05)); //KorraBaseHelper.Log("Prob SuggestToWatchMovie changed to: 0.05"); } } else //has job is unknown { ProbVariables.Bot.SuggestToWatchMovie = BernoulliF(Prob(0.10)); } double newSuggestToWatchMovie = SharedHelper.GetProb(ProbVariables.Bot.SuggestToWatchMovie).Value; if (Math.Abs(oldSuggestToWatchMovie - newSuggestToWatchMovie) > (1 / 1000)) { executedCount = executedCount + 1; SharedHelper.Log("Prob SuggestToWatchMovie changed from " + oldSuggestToWatchMovie + " to: " + SharedHelper.GetProb(ProbVariables.Bot.SuggestToWatchMovie)); //return new ModelUpdateTriggerReturn { IsTriggered = true, IsResamplingRequired = true, Value = "" }; return(true); //re-sampling requested } else { return(false); //no re-sampling } }
public void ReGenerateMainSequence(ref Queue <CommItem> Interactions, ItemManager[] p_providers) { this.providers = p_providers; #region debug planned string availableItems = "Available items before sampling:\n"; foreach (var manager in providers) { availableItems += "Available items for : " + manager.ToString() + " (" + manager.AvailableItems() + ")\n"; if (!manager.AreAllUnPlanned()) { SharedHelper.LogError("Flag planned not removed for: " + manager.ToString()); } } if ((JokesProvider.GetAll().Where(x => x.IsPlanned == false)).Count() != JokesProvider.GetAll().Count()) { SharedHelper.LogError("Flag planned not removed for: JokeProvider "); } int availableJokes = JokesProvider.GetAll().Where(x => x.IsPlanned == false && x.IsUsed == false).Count(); availableItems += "Available items for : " + "JokeProvider" + " (" + availableJokes + ")\n"; SharedHelper.LogWarning(availableItems); #endregion PureFacts pfManager = (PureFacts)providers.SingleOrDefault(x => x is PureFacts); if (pfManager == null) { SharedHelper.LogError("No PureFact manager in ReGenerateMainSequence."); } //Creates a distribution over "EasilyOffended", IsRomanticJoke dists.InitJokesDistribution((PureFact)pfManager.GetByName("EasilyOffended"), false, true); //Interactions are built newely generated suggestions and actions allSuggestions = GenerateSuggestions(); allActions = GenerateActions(); while (allActions.Count > 0 && allSuggestions.Count > 0) { if (this.AdjFunc(Interactions.Count)) { allActions = GenerateActions(); } //================================================================================================== CommItem citem = new CommItem(); citem.Category = allActions.Dequeue(); //SharedHelper.Log("action: " + action); string suggestion = ""; if (citem.Category == ActionsEnum.MakeSuggestion) { suggestion = allSuggestions.Dequeue(); } citem.SubCategory = suggestion; //Correction if (citem.Category == ActionsEnum.AskPureFactQuestionAboutUser) { citem.Category = ActionsEnum.PureFact; citem.SubCategory = ActionsEnum.AskPureFactQuestionAboutUser; } if (citem.Category == ActionsEnum.SharePureFactInfoAboutBot) { citem.Category = ActionsEnum.PureFact; citem.SubCategory = ActionsEnum.SharePureFactInfoAboutBot; } #region Process All ItemManager manager = providers.SingleOrDefault(x => x.Is(citem)); if (manager != null && !(manager is PureFacts)) //TODO: to be improved { Item item = manager.GetItem(); if (item != null) { manager.SetAsPlanned(item.Name); citem = new CommItem(item); if (manager is SongsProvider) { citem.TextToSay = ((Song)item).Name; } if (manager is MoviesProvider) { citem.TextToSay = phrases.MovieAnnouncement((Movie)item); } //if (manager is SportsProvider) // SharedHelper.Log("Sport item added in Joi sampler: " + citem.TextToSay); InteractionsStat.AddScheduledInteraction(citem.Category + citem.SubCategory); //SharedHelper.LogWarning("Added " + citem.Category + citem.SubCategory + " with text: " + citem.TextToSay); } else { InteractionsStat.AddMissingInteraction(citem.Category + citem.SubCategory); SharedHelper.LogWarning("Not enough " + citem.Category + citem.SubCategory + " during planning."); } } #endregion else { #region Set Suggestion if (citem.Category == ActionsEnum.MakeSuggestion) { //string suggestion = allSuggestions.Dequeue(); //SharedHelper.Log("suggestion: " + suggestion); #region set joke if (suggestion == SuggestionsEnum.TellJoke) { //the fact that joke has bee planned, does not mean it has been executed Joke joke = dists.NextJoke(); if (joke != null) { citem = new CommItem(joke); //Planned is handled by "dists" //It gives a distribution from all unplanned and unused JokesProvider.SetJokeAsPlanned(joke.Name); //joke.IsPlanned = true; //citem.Name = joke.Name; //citem.TextToSay = joke.Text; //citem.SubCategory = suggestion; citem.IsJokePureFact = joke.IsPureFact; //these jokes come from the PureFacts collection citem.UIAnswer = joke.PureFactUI; citem.FacialExpression = joke.FaceExpression; InteractionsStat.AddScheduledInteraction(SuggestionsEnum.TellJoke); } else { citem.TextToSay = "__nointeraction__"; //UnityEngine.Debug.LogWarning("Not enough jokes during planning."); InteractionsStat.AddMissingInteraction(SuggestionsEnum.TellJoke); } } #endregion #region set Go Out if (suggestion == SuggestionsEnum.GoOut) { citem.TextToSay = phrases.GoOutAnnoucement(); InteractionsStat.AddScheduledInteraction(SuggestionsEnum.GoOut); } #endregion //#region set Watch movie //if (suggestion == SuggestionsEnum.WatchMovie) //{ // Movie movie = MoviesProvider.Get(); // if (movie != null) // { // movie.IsPlanned = true; // //citem.Name = movie.Name; // //citem.TextToSay = phrases.MovieAnnouncement(movie); // citem = new CommItem(movie); // //UnityEngine.Debug.LogWarning("Movie scheduled: " + citem.TextToSay); // InteractionsStat.AddScheduledInteraction(SuggestionsEnum.WatchMovie); // } // else // { // citem.TextToSay = "__nointeraction__"; // SharedHelper.LogWarning("Not enough movies during planning."); // InteractionsStat.AddMissingInteraction(SuggestionsEnum.WatchMovie); // } //} //#endregion #region set Weather forecast if (suggestion == SuggestionsEnum.TellWeatherForecast) { citem.TextToSay = "The weather forecast should be good."; //TODO not translated } #endregion //#region set Song //if (suggestion == SuggestionsEnum.ListenToSong) //{ // //the fact that song has bee planned, does not mean it has been executed // Song song = SongsProvider.GetSong(); // if (song != null) // { // song.IsPlanned = true; // citem.Name = song.Name; // citem.TextToSay = song.Name; // InteractionsStat.AddScheduledInteraction(SuggestionsEnum.ListenToSong); // } // else // { // citem.TextToSay = "__nointeraction__"; // SharedHelper.LogWarning("Not enough songs during planning."); // InteractionsStat.AddMissingInteraction(SuggestionsEnum.ListenToSong); // } //} //#endregion //else //#region set Go to gym //if (suggestion == SuggestionsEnum.DoSport) //{ // ItemManager manager = providers.Single(x => x.Is(citem)); // if (manager == null) SharedHelper.LogWarning("Manager is null"); // Sport sport = (Sport)manager.GetItem(); // if (sport != null) // { // manager.SetAsPlanned(sport.Name); // citem = new CommItem(sport); // InteractionsStat.AddScheduledInteraction(SuggestionsEnum.DoSport); // } // else // { // citem.TextToSay = "__nointeraction__"; // SharedHelper.LogWarning("Not enough sports during planning."); // InteractionsStat.AddMissingInteraction(SuggestionsEnum.DoSport); // } //} //#endregion } //end action suggestions #endregion else if (citem.Category == ActionsEnum.AskUncertanFactQuestion) { //the actual question is selected at run time citem.TextToSay = "###place holder for UncertanFactQuestion"; citem.IsPureFact = false; InteractionsStat.AddScheduledInteraction(ActionsEnum.AskUncertanFactQuestion); } else if (citem.SubCategory == ActionsEnum.AskPureFactQuestionAboutUser) //ABOUT USER { int pfabul = PureFactsAboutUserLeftCount(); if (pfabul > 0) { PureFact sf = pfManager.GetPureFactAbouUser(); if (sf == null) { SharedHelper.LogError("There are pure facts about the user left, but no pure fact has been selected."); } else { citem.TextToSay = sf.Question; //SharedHelper.Log("q name: " + q [0].Name); citem.Name = sf.Name; citem.IsPureFact = true; pfManager.SetAsPlanned(sf.Name); citem.UIAnswer = sf.UI; } InteractionsStat.AddScheduledInteraction(citem.Category + citem.SubCategory); } else { InteractionsStat.AddMissingInteraction(citem.Category + citem.SubCategory); } } else if (citem.SubCategory == ActionsEnum.SharePureFactInfoAboutBot) //ABOUT BOT { int pfabbl = PureFactsAboutBotLeftCount(); if (pfabbl > 0) { PureFact sf = GetPureFactAbouBot(); if (sf == null) { SharedHelper.LogError("There are pure facts about the bot left, but no pure fact has been selected."); } else { //SharedHelper.Log("Found " + Actions.SharePureFactInfoAboutBot + ": " + q.Length.ToString()); citem.TextToSay = sf.Acknowledgement; citem.IsPureFact = true; citem.Name = sf.Name; pfManager.SetAsPlanned(sf.Name); } InteractionsStat.AddScheduledInteraction(citem.Category + citem.SubCategory); } else { InteractionsStat.AddMissingInteraction(citem.Category + citem.SubCategory); } } else if (citem.Category == ActionsEnum.ChangeVisualAppearance) { citem.TextToSay = context.BasePhrases.ChangeClothesAnnouncement(); InteractionsStat.AddScheduledInteraction(ActionsEnum.ChangeVisualAppearance); } else if (citem.Category == ActionsEnum.ExpressMentalState) { //choose mental state to share using a distribution (uniform?) //currently only one state is processed string selectedMentalState = "InAGoodMood"; if (selectedMentalState == "InAGoodMood") { //Take into account the: ProbVariables.Bot.InAGoodMood; //class Statement where the constructor takes prob variable as or UncertainFact //or just phrase that internally takes into account current values of the prob variable and other normal variables citem.TextToSay = "###place holder for InAGoodMood"; } InteractionsStat.AddScheduledInteraction(ActionsEnum.ExpressMentalState); } else { SharedHelper.LogError("Unknown action: " + citem.Category); } } #region Add interaction item to queue if (string.IsNullOrEmpty(citem.TextToSay)) { SharedHelper.LogError("Text is empty! Action was: " + citem.Category + "|" + citem.SubCategory); } else { Interactions.Enqueue(citem); } #endregion #region debug PureFact[] LeftPureFacts = (from item in pfManager.GetAll() let pf = (PureFact)item where (pf.Type == PureFactType.AboutBot || pf.Type != PureFactType.AboutUser) && pf.IsPlanned == false && pf.IsUsed == false select pf).ToArray(); //if (!Flags.DecreaseDistributionOfAskPureFactQuestionAboutUserDone && Interactions.Count > 45 && (LeftPureFacts.Length - PersistentData.PureFactsLoadedOnStartup()) > 0) // KorraBaseHelper.LogError("All pure facts should have been already planned. Left not used pure facts: " + LeftPureFacts.Length); #endregion } }
public void InitJokesDistribution(PureFact p_factEasilyOffended, bool p_romanticJokesFirst, bool p_romanticJokesLast) { factEasilyOffended = p_factEasilyOffended; romanticJokesFirst = p_romanticJokesFirst; romanticJokesLast = p_romanticJokesLast; }
/// <summary> /// Configures when facial expressions are used /// </summary> /// <param name="item"></param> public void SetFacialExpression(CommItem item) { #region Get Fact Manager PureFacts pfManager = (PureFacts)ItemProviders.SingleOrDefault(x => x is PureFacts); if (pfManager == null) { SharedHelper.LogError("No manager in Facts Manager in SetFacialExpression for model " + this.Name); return; } #endregion //PureFacts and Jokes will facial expression set at this stage or by Dynamic Function //it updates the facial expression, if it is empty if (!string.IsNullOrEmpty(item.FacialExpression)) { KorraModelHelper.SetFacialExpressionFlag(item.FacialExpression); } else //here in most cases we default to smile { if (item.IsReactionToUser) //default to smile on reaction { KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); } else //Handle PureFacts AboutBot if (item.IsPureFact && !item.IsJokePureFact) { PureFact fact = (PureFact)pfManager.GetByName(item.Name); if (fact != null && fact.Type == PureFactType.AboutBot) { KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); } } else if (item.Category == ActionsEnum.ChangeVisualAppearance) { KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); } else if (item.Category == ActionsEnum.ConvinceBuyStatement) { KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); } else if (item.Category == ActionsEnum.ExpressMentalState) { KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); } else //Hnadle Jokes (Normal or PureFacts) if (item.SubCategory == SuggestionsEnum.TellJoke && !item.IsJokePureFact) { if (!item.IsJokePureFact) //Normal joke { Joke joke = JokesProvider.GetJokeByName(item.Name); if (joke != null && !string.IsNullOrEmpty(joke.FaceExpression)) //check for custom facial expression { KorraModelHelper.SetFacialExpressionFlag(joke.FaceExpression); } else { KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); //default to smile } } else //PureFact joke that had no facial expression set { KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); //default to smile } } else if (item.SubCategory == SuggestionsEnum.ListenToSong || item.SubCategory == SuggestionsEnum.DoSport || item.SubCategory == SuggestionsEnum.WatchMovie || item.SubCategory == SuggestionsEnum.GoOut) { KorraModelHelper.SetFacialExpressionFlag(FaceExp.SmileAfterTalking); } } }