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); } }
void InspectOptionNode(DialogOption o) { _activeSubDialog = null; _activeOptionNode = o; }
void InspectDialogNode(Dialog d) { _activeOptionNode = null; _activeSubDialog = d; }
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); } }
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(); }
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(); }
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; }
public abstract void Execute(Dialog activeDialog, IDialogRelevantPlayer player, IDialogRelevantNpc npc, IDialogRelevantWorld worldInfo);
void DeleteCollectionDialog(Dialog d) { if (SourceCollection.Dialogs.Remove(d)) { DeleteDialog(d); } }
void DeleteCleanupDialog(Dialog toDelete) { DeleteRecurseDialog(toDelete, _activeDialog, false); CleanupUnreferencedAssets(); }
void CloseSubInspector() { _activeSubDialog = null; _activeOptionNode = null; _activeStringEditor = null; }
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; }
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; }
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; }
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; }
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; }
void DeleteDialog(Dialog d) { DestroyImmediate(d, true); DirtyAsset(); }
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); } } }
public override void Execute(Dialog activeDialog, IDialogRelevantPlayer player, IDialogRelevantNpc npc, IDialogRelevantWorld worldInfo) { player.OnDialogCompleted(activeDialog.ID); }