/// <returns>A value 1 higher than the highest item/quest ID in the database.</returns> public int GetNextQuestID(DialogueDatabase database) { return(GetNextItemID(database)); }
/// <returns>A value 1 higher than the highest actor ID in the database.</returns> public int GetNextActorID(DialogueDatabase database) { return((database != null) ? GetNextAssetID <Actor>(database.actors) : 0); }
/// <returns>A value 1 higher than the highest item/quest ID in the database.</returns> public int GetNextItemID(DialogueDatabase database) { return((database != null) ? GetNextAssetID <Item>(database.items) : 0); }
public static void Export(DialogueDatabase database, string filename, bool exportActors, bool exportItems, bool exportLocations, bool exportVariables, bool exportConversations, bool includeCanvasRect = false) { ChatMapperProject cmp = DatabaseToChatMapperProject(database, exportActors, exportItems, exportLocations, exportVariables, exportConversations, includeCanvasRect); SaveChatMapperProject(filename, cmp); }
private static void ExportSubtree(DialogueDatabase database, string language, Dictionary <int, string> actorNames, Dictionary <int, int> numLinksToEntry, List <DialogueEntry> visited, DialogueEntry entry, int siblingIndex, StreamWriter file) { if (entry == null) { return; } visited.Add(entry); if (entry.id > 0) { // Write this entry (the root of the subtree). // Write entry ID if necessary: if (siblingIndex == -1) { file.WriteLine(string.Format("\tUnconnected entry [{0}]:", entry.id)); file.WriteLine(string.Empty); } else if ((siblingIndex == 0 && !string.IsNullOrEmpty(entry.conditionsString)) || (siblingIndex > 0) || (numLinksToEntry.ContainsKey(entry.id) && numLinksToEntry[entry.id] > 1)) { if (string.IsNullOrEmpty(entry.conditionsString)) { file.WriteLine(string.Format("\tEntry [{0}]:", entry.id)); } else { file.WriteLine(string.Format("\tEntry [{0}]: ({1})", entry.id, entry.conditionsString)); } file.WriteLine(string.Empty); } if (!actorNames.ContainsKey(entry.ActorID)) { Actor actor = database.GetActor(entry.ActorID); actorNames.Add(entry.ActorID, (actor != null) ? actor.Name.ToUpper() : "ACTOR"); } file.WriteLine(string.Format("\t\t\t\t{0}", actorNames[entry.ActorID])); var description = Field.LookupValue(entry.fields, "Description"); if (!string.IsNullOrEmpty(description)) { file.WriteLine(string.Format("\t\t\t({0})", description)); } var lineText = string.IsNullOrEmpty(language) ? entry.subtitleText : Field.LookupValue(entry.fields, language); if (entry.isGroup) { // Group entries use Title: lineText = Field.LookupValue(entry.fields, "Title"); lineText = !string.IsNullOrEmpty(lineText) ? ("(" + lineText + ")") : "(Group entry; no dialogue)"; } file.WriteLine(string.Format("\t\t{0}", lineText)); file.WriteLine(string.Empty); } // Handle link summary: if (entry.outgoingLinks.Count == 0) { file.WriteLine("\t\t\t\t[END]"); file.WriteLine(string.Empty); } else if (entry.outgoingLinks.Count > 1) { var s = "\tResponses: "; var first = true; for (int i = 0; i < entry.outgoingLinks.Count; i++) { if (!first) { s += ", "; } first = false; var link = entry.outgoingLinks[i]; if (link.destinationConversationID == entry.conversationID) { s += "[" + link.destinationDialogueID + "]"; } else { var destConversation = database.GetConversation(link.destinationConversationID); if (destConversation != null) { s += "[" + destConversation.Title.ToUpper() + ":" + link.destinationDialogueID + "]"; } else { s += "[Other Conversation]"; } } } file.WriteLine(s); file.WriteLine(string.Empty); } // Follow each outgoing link as a subtree: for (int i = 0; i < entry.outgoingLinks.Count; i++) { var child = database.GetDialogueEntry(entry.outgoingLinks[i]); if (!visited.Contains(child)) { ExportSubtree(database, language, actorNames, numLinksToEntry, visited, child, i, file); } } }
public static void DrawReferenceDatabase(Rect rect) { selectedDatabase = EditorGUI.ObjectField(rect, new GUIContent("Reference Database", "Database to use for pop-up menus. Assumes this database will be in memory at runtime."), selectedDatabase, typeof(DialogueDatabase), true) as DialogueDatabase; }
/// <summary> /// Attempts to make a character bark. This is a coroutine; you must start it using /// StartCoroutine() or Unity will hang. Shows a line from the named conversation, plays /// the sequence, and sends OnBarkStart/OnBarkEnd messages to the participants. /// </summary> /// <param name='conversationTitle'> /// Title of conversation to pull bark lines from. /// </param> /// <param name='speaker'> /// Speaker performing the bark. /// </param> /// <param name='listener'> /// Listener that the bark is directed to; may be <c>null</c>. /// </param> /// <param name='barkHistory'> /// Bark history used to keep track of the most recent bark so this method can iterate /// through them in a specified order. /// </param> /// <param name='database'> /// The dialogue database to use. If <c>null</c>, uses DialogueManager.MasterDatabase. /// </param> public static IEnumerator Bark(string conversationTitle, Transform speaker, Transform listener, BarkHistory barkHistory, DialogueDatabase database = null, bool stopAtFirstValid = false) { if (CheckDontBarkDuringConversation()) { yield break; } bool barked = false; if (string.IsNullOrEmpty(conversationTitle) && DialogueDebug.logWarnings) { Debug.Log(string.Format("{0}: Bark (speaker={1}, listener={2}): conversation title is blank", new System.Object[] { DialogueDebug.Prefix, speaker, listener }), speaker); } if (speaker == null) { speaker = DialogueManager.instance.FindActorTransformFromConversation(conversationTitle, "Actor"); } if ((speaker == null) && DialogueDebug.logWarnings) { Debug.LogWarning(string.Format("{0}: Bark (speaker={1}, listener={2}): '{3}' speaker is null", new System.Object[] { DialogueDebug.Prefix, speaker, listener, conversationTitle })); } if (string.IsNullOrEmpty(conversationTitle) || (speaker == null)) { yield break; } IBarkUI barkUI = DialogueActor.GetBarkUI(speaker); //speaker.GetComponentInChildren(typeof(IBarkUI)) as IBarkUI; if ((barkUI == null) && DialogueDebug.logWarnings) { Debug.LogWarning(string.Format("{0}: Bark (speaker={1}, listener={2}): '{3}' speaker has no bark UI", new System.Object[] { DialogueDebug.Prefix, speaker, listener, conversationTitle }), speaker); } var firstValid = stopAtFirstValid || ((barkHistory == null) ? false : barkHistory.order == (BarkOrder.FirstValid)); ConversationModel conversationModel = new ConversationModel(database ?? DialogueManager.masterDatabase, conversationTitle, speaker, listener, DialogueManager.allowLuaExceptions, DialogueManager.isDialogueEntryValid, -1, firstValid); ConversationState firstState = conversationModel.firstState; if ((firstState == null) && DialogueDebug.logWarnings) { Debug.LogWarning(string.Format("{0}: Bark (speaker={1}, listener={2}): '{3}' has no START entry", new System.Object[] { DialogueDebug.Prefix, speaker, listener, conversationTitle }), speaker); } if ((firstState != null) && !firstState.hasAnyResponses && DialogueDebug.logWarnings) { Debug.LogWarning(string.Format("{0}: Bark (speaker={1}, listener={2}): '{3}' has no valid bark at this time", new System.Object[] { DialogueDebug.Prefix, speaker, listener, conversationTitle }), speaker); } if ((firstState != null) && firstState.hasAnyResponses) { try { Response[] responses = firstState.hasNPCResponse ? firstState.npcResponses : firstState.pcResponses; int index = (barkHistory ?? new BarkHistory(BarkOrder.Random)).GetNextIndex(responses.Length); DialogueEntry barkEntry = responses[index].destinationEntry; if ((barkEntry == null) && DialogueDebug.logWarnings) { Debug.LogWarning(string.Format("{0}: Bark (speaker={1}, listener={2}): '{3}' bark entry is null", new System.Object[] { DialogueDebug.Prefix, speaker, listener, conversationTitle }), speaker); } if (barkEntry != null) { var priority = GetEntryBarkPriority(barkEntry); if (priority < GetSpeakerCurrentBarkPriority(speaker)) { if (DialogueDebug.logInfo) { Debug.Log(string.Format("{0}: Bark (speaker={1}, listener={2}): '{3}' currently barking a higher priority bark", new System.Object[] { DialogueDebug.Prefix, speaker, listener, conversationTitle }), speaker); } yield break; } SetSpeakerCurrentBarkPriority(speaker, priority); barked = true; InformParticipants(DialogueSystemMessages.OnBarkStart, speaker, listener); ConversationState barkState = conversationModel.GetState(barkEntry, false); if (barkState == null) { if (DialogueDebug.logWarnings) { Debug.LogWarning(string.Format("{0}: Bark (speaker={1}, listener={2}): '{3}' can't find a valid dialogue entry", new System.Object[] { DialogueDebug.Prefix, speaker, listener, conversationTitle }), speaker); } yield break; } if (firstState.hasNPCResponse) { CharacterInfo tempInfo = barkState.subtitle.speakerInfo; barkState.subtitle.speakerInfo = barkState.subtitle.listenerInfo; barkState.subtitle.listenerInfo = tempInfo; } if (DialogueDebug.logInfo) { Debug.Log(string.Format("{0}: Bark (speaker={1}, listener={2}): '{3}'", new System.Object[] { DialogueDebug.Prefix, speaker, listener, barkState.subtitle.formattedText.text }), speaker); } InformParticipantsLine(DialogueSystemMessages.OnBarkLine, speaker, barkState.subtitle); // Show the bark subtitle: if (((barkUI == null) || !(barkUI as MonoBehaviour).enabled) && DialogueDebug.logWarnings) { Debug.LogWarning(string.Format("{0}: Bark (speaker={1}, listener={2}): '{3}' bark UI is null or disabled", new System.Object[] { DialogueDebug.Prefix, speaker, listener, barkState.subtitle.formattedText.text }), speaker); } if ((barkUI != null) && (barkUI as MonoBehaviour).enabled) { barkUI.Bark(barkState.subtitle); } // Start the sequence: var sequencer = PlayBarkSequence(barkState.subtitle, speaker, listener); LastSequencer = sequencer; // Wait until the sequence and subtitle are done: while (((sequencer != null) && sequencer.isPlaying) || ((barkUI != null) && barkUI.isPlaying)) { yield return(null); } if (sequencer != null) { GameObject.Destroy(sequencer); } } } finally { if (barked) { InformParticipants(DialogueSystemMessages.OnBarkEnd, speaker, listener); SetSpeakerCurrentBarkPriority(speaker, 0); } } } }
public override string Draw(string currentValue, DialogueDatabase dataBase) { var enumValue = GetCurrentArrangementActionType(currentValue); return(EditorGUILayout.EnumPopup(enumValue).ToString()); }