private void DrawAliases() { StartBox(Styles.DarkGrey); EditorGUILayout.BeginHorizontal(); showAliases = EditorGUILayout.Foldout(showAliases, "Actor Aliases", true, EditorStyles.foldout); if (showAliases & aliases != null) { if (GUILayout.Button("+", EditorStyles.miniButton, GUILayout.Width(20))) { aliases.aliases.Add(new ActorAliases.Alias()); } } aliases = (ActorAliases)EditorGUILayout.ObjectField(aliases, typeof(ActorAliases), false); if (aliases != null) { EditorGUILayout.LabelField("Case Sensitive", GUILayout.Width(80)); aliases.caseSensitive = EditorGUILayout.Toggle(aliases.caseSensitive, GUILayout.Width(20)); } EditorGUILayout.EndHorizontal(); if (showAliases && aliases != null) { foreach (ActorAliases.Alias a in aliases.aliases) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Actor:", GUILayout.Width(40)); if (GUILayout.Button(a.actorName, EditorStyles.popup, GUILayout.MaxWidth(140))) { ActorSelector(a.actorName, (x) => { a.actorName = x; }); EditorUtility.SetDirty(aliases); } EditorGUILayout.LabelField("Alias:", GUILayout.Width(40)); a.alias = EditorGUILayout.TextField(a.alias); if (GUILayout.Button("-", EditorStyles.miniButton, GUILayout.Width(20))) { aliases.aliases.Remove(a); EditorUtility.SetDirty(aliases); GUIUtility.ExitGUI(); } EditorGUILayout.EndHorizontal(); } GUILayout.Space(5); } EndBox(); }
public List <ParsedConversation> ParseConversations(string conversationString, ActorAliases abbreviationList) { parsedConversations.Clear(); aliases = abbreviationList; currentConversation = null; try { StringReader documentReader = new StringReader(conversationString); string line; documentRow = 1; lastNodeID = 0; depthLevel = 0; mainBranch = new Branch("Main", 0, 0); bool tieUpLooseEnds = false; string comment = string.Empty; while ((line = documentReader.ReadLine()) != null) { documentRow++; documentColumn = 1; if (IsNullOrWhiteSpace(line)) { continue; } line.Trim(); StringReader lineReader = new StringReader(line); ParseWhitespace(lineReader); if (IsStartOfNewConversation(lineReader)) { int conversationID = ParseConversationID(lineReader); string conversationTitle = ParseConversationTitle(lineReader); currentConversation = new ParsedConversation(conversationID, conversationTitle); parsedConversations.Add(currentConversation); lastNodeID = 0; if (!string.IsNullOrEmpty(comment)) { currentConversation.description = comment; comment = string.Empty; } continue; } if (isCommenting || IsComment(lineReader, line)) { comment += ParseComment(lineReader); if (isCommenting) { comment += "\n"; //retain new line for multi-line comments } //if(lastNodeID == 0) currentConversation.description += comment; //else currentConversation.nodes[currentConversation.NodeCount-1].description += comment; continue; } if (IsSequence(lineReader)) // this is a sequence for the last node that was moved to a new line in the document { string sequence = ParseSequence(lineReader); currentConversation.nodes[currentConversation.NodeCount - 1].sequence = sequence; continue; } if (IsBranchName(lineReader)) { string branchName = ParseBranchName(lineReader); Branch currentBranch = mainBranch.GetActiveBranch(); if (branchName == currentBranch.name) //End of active branch { currentBranch.complete = true; lastNodeID = currentBranch.startNode; tieUpLooseEnds = true; depthLevel--; } else { depthLevel++; Branch b = new Branch(branchName, lastNodeID, depthLevel); currentBranch.children.Add(b); menuText = branchName; if (currentBranch.children.Count == 1) { //Check for response menu sequence string responseMenuSequence = ParseSequence(lineReader); currentConversation.nodes[currentConversation.NodeCount - 1].responseMenuSequence = responseMenuSequence; } tieUpLooseEnds = false; } } else { //PROCESS DIALOGUE ENTRY if (currentConversation == null) { throw new ParserException("No conversation ID/Title found."); } int nodeID = currentConversation.NodeCount + 1; ParsedDialogueEntry node = ParseEntry(lineReader, nodeID); if (node != null) { currentConversation.nodes.Add(node); if (tieUpLooseEnds) { ReconnectBranch(mainBranch, nodeID); if (depthLevel <= 0) { mainBranch.children.Clear(); } tieUpLooseEnds = false; } else { currentConversation.AddLink(lastNodeID, nodeID); if (!string.IsNullOrEmpty(menuText)) { node.menuText = menuText; menuText = string.Empty; } } Branch currentBranch = mainBranch.GetActiveBranch(); currentBranch.endNodeID = nodeID; lastNodeID = nodeID; if (!string.IsNullOrEmpty(comment)) { node.description = comment; comment = string.Empty; } } } } foreach (Branch b in mainBranch.children) { foreach (Branch branch in b.children) { if (!branch.complete) { throw new ParserException("No end tag found for Branch: \"" + branch.name + "\""); } } } foreach (ParsedConversation c in parsedConversations) { c.AutoFillActorNames(); } } catch (ParserException e) { Debug.LogWarning("Syntax error " + e.Message + "at line " + documentRow + ", " + documentColumn); parsedConversations.Clear(); } return(parsedConversations); }