Beispiel #1
0
        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);
        }