コード例 #1
0
 static void RetrieveIDs(Dialog current, List<int> idList)
 {
     idList.Add(current.ID);
     foreach (var dialogOption in current.Options)
     {
         if (dialogOption.IsRedirection) continue;
         if (dialogOption.NextDialog == null) continue;
         RetrieveIDs(dialogOption.NextDialog, idList);
     }
 }
コード例 #2
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 void InspectOptionNode(DialogOption o)
 {
     _activeSubDialog = null;
     _activeOptionNode = o;
 }
コード例 #3
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 void InspectDialogNode(Dialog d)
 {
     _activeOptionNode = null;
     _activeSubDialog = d;
 }
コード例 #4
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 void DisplaySingleDialogNode(Rect r, Dialog d)
 {
     var rect = new Rect(r.x, r.y + 5, r.width - 20, r.height - 5);
     if (rect.y + rect.height > _countedHeight)
     {
         _countedHeight = rect.y + rect.height;
     }
     if (rect.x + rect.width > _countedWidth)
     {
         _countedWidth = rect.x + rect.width;
     }
     var dTitle = GetFormattedTitleString(d.Title.Description, d.Title.GetString);
     dTitle = string.Format("({0}) {1}", d.ID, dTitle);
     if (GUI.Button(rect, dTitle))
     {
         InspectDialogNode(d);
     }
 }
コード例 #5
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 void DisplayDialogTools(Rect r)
 {
     GUILayout.Space(5);
     GUILayout.BeginVertical(EditorStyles.textArea, GUILayout.Width(r.width - 8));
     if (GUILayout.Button("New Dialog"))
     {
         var d = CreateInstance<Dialog>();
         d.ID = GetUniqueId();
         AddToAsset(d);
         SourceCollection.Dialogs.Add(d);
         _activeDialog = d;
     }
     GUILayout.EndVertical();
     var itemRect = new Rect(0, 0, r.width - 38, 17);
     var deleteItemRect = new Rect(itemRect.width, 0, 18, 17);
     var scrollContainerRect = new Rect(2, 30, r.width - 5, r.height - 32);
     var contentScrollRect = new Rect(0, 0, r.width - 20, Mathf.Max(SourceCollection.Dialogs.Count*itemRect.height, scrollContainerRect.height));
     _dialogsScroll = GUI.BeginScrollView(scrollContainerRect, _dialogsScroll, contentScrollRect, false, true);
     for (var i = 0; i < SourceCollection.Dialogs.Count; i++)
     {
         itemRect.y = i*(itemRect.height + 2);
         deleteItemRect.y = itemRect.y;
         if (itemRect.y < _dialogsScroll.y - itemRect.height)
         {
             continue;
         }
         if (itemRect.y > _dialogsScroll.y + scrollContainerRect.height)
         {
             break;
         }
         if (SourceCollection.Dialogs[i] == _activeDialog)
         {
             GUI.color = Color.gray;
         }
         var dTitle = GetFormattedTitleString(SourceCollection.Dialogs[i].Title.Description, SourceCollection.Dialogs[i].Title.GetString, 30);
         if (GUI.Button(itemRect, dTitle, "ButtonLeft"))
         {
             _activeDialog = _activeDialog == SourceCollection.Dialogs[i] ? null : SourceCollection.Dialogs[i];
         }
         GUI.color = Color.white;
         if (GUI.Button(deleteItemRect, "x", "ButtonRight"))
         {
             DeleteCleanupDialog(SourceCollection.Dialogs[i]);
             if (SourceCollection.Dialogs[i] == _activeDialog)
             {
                 CloseSubInspector();
                 _activeDialog = null;
             }
             DeleteCollectionDialog(SourceCollection.Dialogs[i]);
         }
     }
     GUI.EndScrollView();
 }
コード例 #6
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 void DisplayDialogNodeInspector(Rect r, Dialog d)
 {
     var prev = GUI.color;
     GUI.color = _inspectorColor;
     GUILayout.BeginArea(r, EditorStyles.textArea);
     GUI.color = prev;
     GUILayout.Space(5);
     GUILayout.Label("Title", _headerStyle);
     GUILayout.Space(5);
     GUILayout.BeginHorizontal();
     var dTitle = GetFormattedTitleString(d.Title.Description, d.Title.GetString);
     GUILayout.Label(dTitle, _lblStyle, GUILayout.MaxWidth(154));
     if (GUILayout.Button("Edit", _buttonStyle, GUILayout.Width(40)))
     {
         _activeStringEditor = new LocalizedStringEditor(d.Title, "Dialog title");
     }
     GUILayout.EndHorizontal();
     GUILayout.Space(5);
     GUILayout.Label("Text" + (d.Texts.Count > 1 ? " (random)" : ""), _headerStyle);
     GUILayout.Space(5);
     for (var i = 0; i < d.Texts.Count; i++)
     {
         var dtextsT = GetFormattedTitleString(d.Texts[i].Description, d.Texts[i].GetString, 22);
         GUILayout.BeginHorizontal();
         GUILayout.Label(dtextsT, _lblStyle, GUILayout.MaxWidth(134));
         if (GUILayout.Button("Edit", _buttonStyle, GUILayout.Width(40)))
         {
             _activeStringEditor = new LocalizedStringEditor(d.Texts[i], "Dialog text");
         }
         if (GUILayout.Button("x", _buttonStyle, GUILayout.Width(20)))
         {
             d.Texts.RemoveAt(i);
         }
         GUILayout.EndHorizontal();
         GUILayout.Space(5);
     }
     if (d.Texts.Count < 3)
     {
         if (GUILayout.Button("Add Variation", _buttonStyle))
         {
             d.Texts.Add(new LocalizedString(""));
         }
         GUILayout.Space(5);
     }
     GUILayout.Label(new GUIContent("Tag", "User data"), _headerStyle);
     GUILayout.Space(5);
     d.Tag = GUILayout.TextField(d.Tag);
     GUILayout.Space(10);
     GUILayout.Label("Requirements", _headerStyle);
     if (d.Requirements.Count > 1)
     {
         d.RequirementMode = (DialogRequirementMode) EditorGUILayout.EnumPopup("Mode:", d.RequirementMode);
     }
     GUILayout.BeginHorizontal();
     var prevEnabled = GUI.enabled;
     if (d.Requirements.Count >= 6)
     {
         GUI.enabled = false;
     }
     var index = EditorGUILayout.Popup(0, _usableRequirementNames.ToArray());
     if (index > 0)
     {
         var bs = CreateInstance(_usableRequirementTypes[index]) as DialogRequirement;
         AddToAsset(bs);
         d.Requirements.Add(bs);
     }
     GUI.enabled = prevEnabled;
     if (GUILayout.Button("Remove all", _buttonStyle))
     {
         for (var i = d.Requirements.Count; i-- > 0;)
         {
             DestroyImmediate(d.Requirements[i], true);
             d.Requirements.RemoveAt(i);
         }
     }
     GUILayout.EndHorizontal();
     _scrollbar = GUILayout.BeginScrollView(_scrollbar, false, true);
     for (var i = d.Requirements.Count; i-- > 0;)
     {
         if (d.Requirements[i] == null)
         {
             d.Requirements.RemoveAt(i);
             continue;
         }
         if (!DrawInlineRequirement(d.Requirements[i]))
         {
             DestroyImmediate(d.Requirements[i], true);
             d.Requirements.RemoveAt(i);
         }
     }
     GUILayout.EndScrollView();
     if (GUILayout.Button("Close", _buttonStyle))
     {
         CloseSubInspector();
     }
     GUILayout.EndArea();
 }
コード例 #7
0
 static Dialog FindDialog(Dialog current, int id)
 {
     if (current.ID == id)
     {
         return current;
     }
     for (var i = 0; i < current.Options.Count; i++)
     {
         if (current.Options[i].NextDialog == null) continue;
         if (current.Options[i].IsRedirection) continue;
         var d = FindDialog(current.Options[i].NextDialog, id);
         if (d != null)
         {
             return d;
         }
     }
     return null;
 }
コード例 #8
0
 public abstract void Execute(Dialog activeDialog, IDialogRelevantPlayer player, IDialogRelevantNpc npc, IDialogRelevantWorld worldInfo);
コード例 #9
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 void DeleteCollectionDialog(Dialog d)
 {
     if (SourceCollection.Dialogs.Remove(d))
     {
         DeleteDialog(d);
     }
 }
コード例 #10
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 void DeleteCleanupDialog(Dialog toDelete)
 {
     DeleteRecurseDialog(toDelete, _activeDialog, false);
     CleanupUnreferencedAssets();
 }
コード例 #11
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 void CloseSubInspector()
 {
     _activeSubDialog = null;
     _activeOptionNode = null;
     _activeStringEditor = null;
 }
コード例 #12
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 static List<Dialog> GetAllDialogsInChain(List<Dialog> dl, Dialog d)
 {
     if (!dl.Contains(d))
     {
         dl.Add(d);
     }
     for (var i = 0; i < d.Options.Count; i++)
     {
         if (d.Options[i].NextDialog == null) continue;
         if (!d.Options[i].IsRedirection)
         {
             GetAllDialogsInChain(dl, d.Options[i].NextDialog);
         }
     }
     return dl;
 }
コード例 #13
0
 List<Conversation.Answer> GetAvailableAnswers(Dialog d, IDialogRelevantNpc npc, IDialogRelevantPlayer player, IDialogRelevantWorld worldContext, DialogLanguage language)
 {
     var answers = new List<Conversation.Answer>();
     for (var i = 0; i < d.Options.Count; i++)
     {
         if (d.Options[i].NextDialog == null)
         {
             var text = GetDialogStringOrFallback(language, d.Options[i].Text.GetString, d.ID);
             answers.Add(new Conversation.Answer(i, text, d.Options[i].Tag));
         }
         else if (CheckAvailability(d.Options[i].NextDialog, npc, player, worldContext))
         {
             var text = GetDialogStringOrFallback(language, d.Options[i].Text.GetString, d.ID);
             answers.Add(new Conversation.Answer(i, text, d.Options[i].Tag));
         }
     }
     if (answers.Count == 0 && UseEndConversationfallback)
     {
         var txt = GetDialogStringOrFallback(language, _endConversationFallback.GetString, -1);
         answers.Add(new Conversation.Answer(-1, txt, ""));
     }
     return answers;
 }
コード例 #14
0
 static bool CheckAvailability(Dialog d, IDialogRelevantNpc npc, IDialogRelevantPlayer player, IDialogRelevantWorld worldContext)
 {
     if (d.Requirements.Count == 0) return true;
     switch (d.RequirementMode)
     {
         case DialogRequirementMode.And:
             for (var i = 0; i < d.Requirements.Count; i++)
             {
                 if (!d.Requirements[i].Evaluate(player, npc, worldContext))
                 {
                     return false;
                 }
             }
             return true;
         case DialogRequirementMode.Or:
             for (var i = 0; i < d.Requirements.Count; i++)
             {
                 if (d.Requirements[i].Evaluate(player, npc, worldContext))
                 {
                     return true;
                 }
             }
             break;
     }
     return false;
 }
コード例 #15
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 bool IsReferencedInChains(Dialog d)
 {
     foreach (var dl in SourceCollection.Dialogs)
     {
         var chain = new List<Dialog>();
         chain = GetAllDialogsInChain(chain, dl);
         foreach (var chainDialog in chain)
         {
             if (chainDialog == d)
             {
                 return true;
             }
         }
     }
     return false;
 }
コード例 #16
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 int RecurseDialogs(Rect parent, int length, int depth, Dialog d)
 {
     var r = new Rect(parent.x + depth*NodeWidth, parent.y + length*NodeHeight, NodeWidth, NodeHeight);
     DisplaySingleDialogNode(r, d);
     var branchDepth = 1;
     var lastOptionDepth = 0;
     for (var i = 0; i < d.Options.Count; i++)
     {
         lastOptionDepth = branchDepth;
         var move = DisplayDialogOption(new Rect(r.x + NodeWidth + IndentWidth, r.y + NodeHeight*lastOptionDepth, NodeWidth + IndentWidth, NodeHeight),
             d.Options[i]);
         if (d.Options[i].NextDialog != null)
         {
             if (d.Options[i].IsRedirection)
             {
                 DisplayDialogLoop(new Rect(r.x + NodeWidth + IndentWidth*2, r.y + NodeHeight*lastOptionDepth, NodeWidth + IndentWidth, NodeHeight), d.Options[i]);
                 branchDepth += 1;
             }
             else
             {
                 branchDepth += RecurseDialogs(new Rect(parent.x + IndentWidth*2, parent.y, NodeWidth, NodeHeight), length + branchDepth, depth + 1,
                     d.Options[i].NextDialog);
             }
         }
         else
         {
             branchDepth += 1;
             if (d.Options[i].Actions.Count > 0)
             {
                 branchDepth += 1;
             }
         }
         if (move != 0)
         {
             if (move == -10)
             {
                 if (d.Options.Count > 0)
                 {
                     var dI = d.Options[i];
                     if (dI.NextDialog != null && !dI.IsRedirection)
                     {
                         DeleteCleanupDialog(dI.NextDialog);
                     }
                     for (var t = dI.Actions.Count; t-- > 0;)
                     {
                         DestroyImmediate(dI.Actions[t], true);
                     }
                     d.Options.Remove(dI);
                     DestroyImmediate(dI, true);
                 }
             }
             else if (i + move >= 0 & i + move < d.Options.Count)
             {
                 var dO = d.Options[i];
                 d.Options[i] = d.Options[i + move];
                 d.Options[i + move] = dO;
             }
         }
     }
     if (DrawOptionRegion(new Rect(r.x + NodeWidth + IndentWidth, r.y + NodeHeight, NodeWidth + IndentWidth, NodeHeight), lastOptionDepth))
     {
         var dO = CreateInstance<DialogOption>();
         AddToAsset(dO);
         d.Options.Add(dO);
     }
     branchDepth++;
     return branchDepth;
 }
コード例 #17
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
 void DeleteDialog(Dialog d)
 {
     DestroyImmediate(d, true);
     DirtyAsset();
 }
コード例 #18
0
ファイル: DialogEditor.cs プロジェクト: ValooFX/DialogSystem
        void DeleteRecurseDialog(Dialog toDelete, Dialog currentItemToCheck, bool releaseIfNotLoop)
        {
            if (currentItemToCheck == null)
            {
                return;
            }
            for (var i = currentItemToCheck.Options.Count; i-- > 0;)
            {
                if (currentItemToCheck.Options[i].NextDialog == null)
                {
                    continue;
                }

                if (currentItemToCheck.Options[i].NextDialog == toDelete | releaseIfNotLoop)
                {
                    if (!currentItemToCheck.Options[i].IsRedirection)
                    {
                        DeleteRecurseDialog(toDelete, currentItemToCheck.Options[i].NextDialog, true);
                        //clean
                        for (var r = currentItemToCheck.Options[i].NextDialog.Requirements.Count; r-- > 0;)
                        {
                            DestroyImmediate(currentItemToCheck.Options[i].NextDialog.Requirements[r], true);
                        }
                        DeleteDialog(currentItemToCheck.Options[i].NextDialog);
                        //
                    }
                    currentItemToCheck.Options[i].NextDialog = null;
                }
                else
                {
                    DeleteRecurseDialog(toDelete, currentItemToCheck.Options[i].NextDialog, false);
                }
            }
        }
コード例 #19
0
 public override void Execute(Dialog activeDialog, IDialogRelevantPlayer player, IDialogRelevantNpc npc, IDialogRelevantWorld worldInfo)
 {
     player.OnDialogCompleted(activeDialog.ID);
 }