Пример #1
0
 public static bool Prefix(BlueprintAnswer __instance, ref bool __result)
 {
     if (!settings.toggleShowAnswersForEachConditionalResponse)
     {
         return(true);
     }
     if (__instance.ShowOnce)
     {
         var dialog                  = Game.Instance.Player.Dialog;
         var dialogController        = Game.Instance.DialogController;
         var matchingSelectedAnswers = dialog.SelectedAnswers.Where(a => a.AssetGuid == __instance.AssetGuid);
         Mod.Debug($"matchingAnswers = {string.Join(", ", matchingSelectedAnswers.Select(a => a.name))}");
         if (__instance.ShowOnceCurrentDialog)
         {
             if (dialogController.LocalSelectedAnswers.Where(a => a.AssetGuid == __instance.AssetGuid).Any())
             {
                 __result = true;
                 return(false);
             }
         }
         else if (matchingSelectedAnswers.Any())
         {
             __result = true;
             return(false);
         }
     }
     return(true);
 }
 public static string GetFixedAnswerString(BlueprintAnswer answer, string bind, int index)
 {
     bool flag = Game.Instance.DialogController.Dialog.Type == DialogType.Book;
     string checkFormat = (!flag) ? UIDialog.Instance.AnswerStringWithCheckFormat : UIDialog.Instance.AnswerStringWithCheckBeFormat;
     string text = string.Empty;
     if (SettingsRoot.Instance.ShowSkillcheksDC.CurrentValue)
     {
         text = answer.SkillChecks.Aggregate(string.Empty, (string current, CheckData skillCheck) => current + string.Format(checkFormat, UIUtility.PackKeys(new object[]
         {
             TooltipType.SkillcheckDC,
             skillCheck.Type
         }), LocalizedTexts.Instance.Stats.GetText(skillCheck.Type), skillCheck.DC));
     }
     if (SettingsRoot.Instance.ShowAliggnmentRequirements.CurrentValue && answer.AlignmentRequirement != AlignmentComponent.None)
     {
         text = string.Format(UIDialog.Instance.AlignmentRequirementFormat, UIUtility.GetAlignmentRequirementText(answer.AlignmentRequirement)) + text;
     }
     if (answer.HasShowCheck)
     {
         text = string.Format(UIDialog.Instance.AnswerShowCheckFormat, LocalizedTexts.Instance.Stats.GetText(answer.ShowCheck.Type), text);
     }
     if (SettingsRoot.Instance.ShowAlignmentShiftsInAnswer.CurrentValue && answer.AlignmentRequirement == AlignmentComponent.None && answer.AlignmentShift.Value > 0 && SettingsRoot.Instance.ShowAlignmentShiftsInAnswer.CurrentValue)
     {
         text = string.Format(UIDialog.Instance.AligmentShiftedFormat, UIUtility.GetAlignmentShiftDirectionText(answer.AlignmentShift.Direction)) + text;
     }
     string stringByBinding = UIKeyboardTexts.Instance.GetStringByBinding(Game.Instance.Keyboard.GetBindingByName(bind));
     return string.Format(UIDialog.Instance.AnswerDialogueFormat,
         (!stringByBinding.Empty()) ? stringByBinding : index.ToString(),
         text + ((!text.Empty()) ? " " : string.Empty) + answer.DisplayText);
 }
Пример #3
0
 static void Postfix(ref string __result, BlueprintAnswer answer, string bind, int index)
 {
     try {
         if (!Main.Enabled)
         {
             return;
         }
         if (Main.settings.previewAlignmentRestrictedDialog && !answer.IsAlignmentRequirementSatisfied)
         {
             __result = GetFixedAnswerString(answer, bind, index);
         }
         if (!Main.settings.previewDialogResults)
         {
             return;
         }
         var answerData = CollateAnswerData(answer, out bool isRecursive);
         if (isRecursive)
         {
             __result += $" <size=75%>[Repeats]</size>";
         }
         var results = new List <string>();
         foreach (var data in answerData)
         {
             var cue       = data.Item1;
             var depth     = data.Item2;
             var actions   = data.Item3;
             var alignment = data.Item4;
             var line      = new List <string>();
             if (actions.Length > 0)
             {
                 line.AddRange(actions.
                               SelectMany(action => PreviewUtilities.FormatActionAsList(action)
                                          .Select(actionText => actionText == "" ? "EmptyAction" : actionText)));
             }
             if (alignment != null && alignment.Value > 0)
             {
                 line.Add($"AlignmentShift({alignment.Direction}, {alignment.Value}, {alignment.Description})");
             }
             if (cue is BlueprintCheck check)
             {
                 line.Add($"Check({check.Type}, DC {check.DC}, hidden {check.Hidden})");
             }
             if (line.Count > 0)
             {
                 results.Add($"{depth}: {line.Join()}");
             }
         }
         if (results.Count > 0)
         {
             __result += $" \n<size=75%>[{results.Join()}]</size>";
         }
     }
     catch (Exception ex) {
         Logger.Error(ex);
     }
 }
Пример #4
0
            private static bool Prefix(DialogAnswerView __instance, BlueprintAnswer answer)
            {
                if (!settings.previewDialogResults && !settings.toggleShowAnswersForEachConditionalResponse && !settings.toggleMakePreviousAnswersMoreClear)
                {
                    return(true);
                }
                var type    = Game.Instance.DialogController.Dialog.Type;
                var str     = string.Format("DialogChoice{0}", (object)__instance.ViewModel.Index);
                var text    = UIConsts.GetAnswerString(answer, str, __instance.ViewModel.Index);
                var isAvail = answer.CanSelect();

                if (answer.NextCue.Cues.Count == 1)
                {
                    var cue           = answer.NextCue.Cues.Dereference <BlueprintCueBase>().FirstOrDefault();
                    var conditionText = $"{string.Join(", ", cue.Conditions.Conditions.Select(c => c.GetCaption()))}";
                    // the following is a kludge for toggleShowAnswersForEachConditionalResponse  to work around cases where there may be a next cue that doesn't get shown due it being already seen and the dialog being intended to fall through.  We assume that any singleton conditional nextCue (CueSelection) was generated by this feature.  We should look for edge cases to be sure.
                    isAvail = cue.CanShow() || !settings.toggleShowAnswersForEachConditionalResponse || conditionText.Length == 0;
                    var color = isAvail ? "#005800><b>" : "#800000>";
                    if (conditionText.Length > 0)
                    {
                        text += $"<size=75%><color={color}[{conditionText.MergeSpaces(true)}]</color></size>";
                    }
                }
                __instance.AnswerText.text        = text;
                __instance.ViewModel.Enable.Value = isAvail;
                var color32 = isAvail ? DialogAnswerView.Colors.NormalAnswer : DialogAnswerView.Colors.DisabledAnswer;

                if (type == DialogType.Common && answer.IsAlreadySelected() && (Game.Instance.DialogController.NextCueWasShown(answer) || !Game.Instance.DialogController.NextCueHasNewAnswers(answer)))
                {
                    color32 = DialogAnswerView.Colors.SelectedAnswer;
                    __instance.AnswerText.alpha = 0.45f;
                    if (settings.toggleMakePreviousAnswersMoreClear)
                    {
                        __instance.AnswerText.text = text.SizePercent(83);
                    }
                }
                else
                {
                    __instance.AnswerText.alpha = 1.0f;
                }
                __instance.AnswerText.color = (Color)color32;
                __instance.AddDisposable(Game.Instance.Keyboard.Bind(str, new Action(__instance.Confirm)));
                if (__instance.ViewModel.Index != 1 || type != DialogType.Interchapter && type != DialogType.Epilogue)
                {
                    return(false);
                }
                __instance.AddDisposable(Game.Instance.Keyboard.Bind("NextOrEnd", new Action(__instance.Confirm)));
                return(false);
            }
Пример #5
0
            private void SetAnswer(BlueprintAnswer answer)
            {
                DialogType type = Game.Instance.DialogController.Dialog.Type;
                string     str  = string.Format("DialogChoice{0}", (object)this.ViewModel.Index);

                this.AnswerText.text = UIConsts.GetAnswerString(answer, str, this.ViewModel.Index);
                Color32 color32 = answer.CanSelect() ? DialogAnswerView.Colors.NormalAnswer : DialogAnswerView.Colors.DisabledAnswer;

                if (type == DialogType.Common && answer.IsAlreadySelected() && (Game.Instance.DialogController.NextCueWasShown(answer) || !Game.Instance.DialogController.NextCueHasNewAnswers(answer)))
                {
                    color32 = DialogAnswerView.Colors.SelectedAnswer;
                }

                this.AnswerText.color = (Color)color32;
                this.AddDisposable(Game.Instance.Keyboard.Bind(str, new Action(this.Confirm)));
                if (this.ViewModel.Index != 1 || type != DialogType.Interchapter && type != DialogType.Epilogue)
                {
                    return;
                }
                this.AddDisposable(Game.Instance.Keyboard.Bind("NextOrEnd", new Action(this.Confirm)));
            }
Пример #6
0
        public static BlueprintAnswer CreateAnswer(string name, int num, string text, Condition[] showconditions = null, Condition[] selectconditions = null, CheckData[] FakeCheck = null, ActionList onselect = null, CharacterSelection charselection = null, AlignmentShift shift = null, bool showonce = true, bool showoncecurrentdialog = true, bool movecamera = true, bool checkdistance = true,
                                                   bool addtohistory = true, params BlueprintComponent[] components)
        {
            BlueprintAnswer o = Helpers.Create <BlueprintAnswer>();

            o.name           = "Answer_" + name + num;
            o.AlignmentShift = shift == null?CreateAlignmentShift("", AlignmentShiftDirection.TrueNeutral) : shift;

            o.ShowConditions            = new ConditionsChecker();
            o.ShowConditions.Conditions = showconditions == null?Array.Empty <Condition>() : showconditions;


            o.FakeChecks = FakeCheck == null?Array.Empty <CheckData>() : FakeCheck;

            o.SelectConditions            = new ConditionsChecker();
            o.SelectConditions.Conditions = selectconditions == null?Array.Empty <Condition>() : selectconditions;

            o.AddToHistory = addtohistory;

            o.ShowCheck = new ShowCheck();

            o.CharacterSelection = charselection == null? new CharacterSelection(): charselection;

            o.OnSelect = onselect == null ? new ActionList() : onselect;


            o.ShowOnce = showonce;
            o.ShowOnceCurrentDialog = showoncecurrentdialog;

            o.SetComponents(components);

            o.Text = Helpers.CreateString(o.name + ".Text", text);
            library.AddAsset(o, Guid(o.name));

            return(o);
        }
 static List<Tuple<BlueprintCueBase, int, GameAction[], AlignmentShift>> CollateAnswerData(BlueprintAnswer answer, out bool isRecursive)
 {
     var cueResults = new List<Tuple<BlueprintCueBase, int, GameAction[], AlignmentShift>>();
     var toCheck = new Queue<Tuple<BlueprintCueBase, int>>();
     isRecursive = false;
     if (answer.NextCue.Cues.Count > 0)
     {
         toCheck.Enqueue(new Tuple<BlueprintCueBase, int>(answer.NextCue.Cues[0], 1));
     }
     cueResults.Add(new Tuple<BlueprintCueBase, int, GameAction[], AlignmentShift>(
         answer.ParentAsset as BlueprintCueBase,
         0,
         answer.OnSelect.Actions,
         answer.AlignmentShift
         ));
     while (toCheck.Count > 0)
     {
         var item = toCheck.Dequeue();
         var cueBase = item.Item1;
         int currentDepth = item.Item2;
         if (currentDepth > 20) break;
         if (cueBase is BlueprintCue cue)
         {
             cueResults.Add(new Tuple<BlueprintCueBase, int, GameAction[], AlignmentShift>(
                 cue,
                 currentDepth,
                 cue.OnShow.Actions.Concat(cue.OnStop.Actions).ToArray(),
                 cue.AlignmentShift
                 ));
             if (cue.Answers.Count > 0)
             {
                 if (cue.Answers[0] == answer.ParentAsset) isRecursive = true;
                 break;
             }
             if (cue.Continue.Cues.Count > 0)
             {
                 toCheck.Enqueue(new Tuple<BlueprintCueBase, int>(cue.Continue.Cues[0], currentDepth + 1));
             }
         }
         else if (cueBase is BlueprintBookPage page)
         {
             cueResults.Add(new Tuple<BlueprintCueBase, int, GameAction[], AlignmentShift>(
                 page,
                 currentDepth,
                 page.OnShow.Actions,
                 null
                 ));
             if (page.Answers.Count > 0)
             {
                 if (page.Answers[0] == answer.ParentAsset)
                 {
                     isRecursive = true;
                     break;
                 }
                 if (page.Answers[0] is BlueprintAnswersList) break;
             }
             if (page.Cues.Count > 0)
             {
                 foreach (var c in page.Cues) if (c.CanShow()) toCheck.Enqueue(new Tuple<BlueprintCueBase, int>(c, currentDepth + 1));
             }
         }
         else if (cueBase is BlueprintCheck check)
         {
             toCheck.Enqueue(new Tuple<BlueprintCueBase, int>(check.Success, currentDepth + 1));
             toCheck.Enqueue(new Tuple<BlueprintCueBase, int>(check.Fail, currentDepth + 1));
         }
         else if (cueBase is BlueprintCueSequence sequence)
         {
             foreach (var c in sequence.Cues) if (c.CanShow()) toCheck.Enqueue(new Tuple<BlueprintCueBase, int>(c, currentDepth + 1));
             if (sequence.Exit != null)
             {
                 var exit = sequence.Exit;
                 if (exit.Answers.Count > 0)
                 {
                     if (exit.Answers[0] == answer.ParentAsset) isRecursive = true;
                     break;
                 }
                 if (exit.Continue.Cues.Count > 0)
                 {
                     toCheck.Enqueue(new Tuple<BlueprintCueBase, int>(exit.Continue.Cues[0], currentDepth + 1));
                 }
             }
         }
         else
         {
             break;
         }
     }
     return cueResults;
 }
Пример #8
0
        private static List <Tuple <BlueprintCueBase, int, GameAction[], AlignmentShift> > CollateAnswerData(BlueprintAnswer answer, out bool isRecursive)
        {
            var cueResults = new List <Tuple <BlueprintCueBase, int, GameAction[], AlignmentShift> >();
            var toCheck    = new Queue <Tuple <BlueprintCueBase, int> >();

            isRecursive = false;
            var visited = new HashSet <BlueprintAnswerBase> {
            };

            visited.Add(answer);
            if (answer.NextCue.Cues.Count > 0)
            {
                toCheck.Enqueue(new Tuple <BlueprintCueBase, int>(answer.NextCue.Cues[0], 1));
            }
            cueResults.Add(new Tuple <BlueprintCueBase, int, GameAction[], AlignmentShift>(
                               null,
                               0,
                               answer.OnSelect.Actions,
                               answer.AlignmentShift
                               ));
            while (toCheck.Count > 0)
            {
                var item         = toCheck.Dequeue();
                var cueBase      = item.Item1;
                var currentDepth = item.Item2;
                if (currentDepth > 20)
                {
                    break;
                }
                if (cueBase is BlueprintCue cue)
                {
                    cueResults.Add(new Tuple <BlueprintCueBase, int, GameAction[], AlignmentShift>(
                                       cue,
                                       currentDepth,
                                       cue.OnShow.Actions.Concat(cue.OnStop.Actions).ToArray(),
                                       cue.AlignmentShift
                                       ));
                    if (cue.Answers.Count > 0)
                    {
                        var subAnswer = cue.Answers[0].Get();
                        if (visited.Contains(subAnswer))
                        {
                            isRecursive = true;
                            break;
                        }
                        visited.Add(subAnswer);
                    }
                    if (cue.Continue.Cues.Count > 0)
                    {
                        toCheck.Enqueue(new Tuple <BlueprintCueBase, int>(cue.Continue.Cues[0], currentDepth + 1));
                    }
                }
                else if (cueBase is BlueprintBookPage page)
                {
                    cueResults.Add(new Tuple <BlueprintCueBase, int, GameAction[], AlignmentShift>(
                                       page,
                                       currentDepth,
                                       page.OnShow.Actions,
                                       null
                                       ));
                    if (page.Answers.Count > 0)
                    {
                        var subAnswer = page.Answers[0].Get();
                        if (visited.Contains(subAnswer))
                        {
                            isRecursive = true;
                            break;
                        }
                        visited.Add(subAnswer);
                        if (page.Answers[0].Get() is BlueprintAnswersList)
                        {
                            break;
                        }
                    }
                    if (page.Cues.Count > 0)
                    {
                        foreach (var c in page.Cues)
                        {
                            if (c.Get().CanShow())
                            {
                                toCheck.Enqueue(new Tuple <BlueprintCueBase, int>(c, currentDepth + 1));
                            }
                        }
                    }
                }
                else if (cueBase is BlueprintCheck check)
                {
                    toCheck.Enqueue(new Tuple <BlueprintCueBase, int>(check.Success, currentDepth + 1));
                    toCheck.Enqueue(new Tuple <BlueprintCueBase, int>(check.Fail, currentDepth + 1));
                }
                else if (cueBase is BlueprintCueSequence sequence)
                {
                    foreach (var c in sequence.Cues)
                    {
                        if (c.Get().CanShow())
                        {
                            toCheck.Enqueue(new Tuple <BlueprintCueBase, int>(c, currentDepth + 1));
                        }
                    }
                    if (sequence.Exit != null)
                    {
                        var exit = sequence.Exit;
                        if (exit.Answers.Count > 0)
                        {
                            var subAnswer = exit.Answers[0];
                            if (visited.Contains(subAnswer))
                            {
                                isRecursive = true;
                                break;
                            }
                            visited.Add(subAnswer);
                            if (exit.Continue.Cues.Count > 0)
                            {
                                toCheck.Enqueue(new Tuple <BlueprintCueBase, int>(exit.Continue.Cues[0], currentDepth + 1));
                            }
                        }
                    }
                }
                else
                {
                    break;
                }
            }
            return(cueResults);
        }