private TimedDialogueNode VisitTimedDialogueNode(DialogueNode pPrevious) { #if DEBUG_WRITE Console.WriteLine("VisitTimedDialogueNode()"); #endif Token speakerToken = match(Token.TokenType.NAME); string speaker = speakerToken.getTokenString(); Token lineToken = match(Token.TokenType.QUOTED_STRING); string line = lineToken.getTokenString(); TimedDialogueNode n = _dialogueRunner.Create <TimedDialogueNode>(_conversationName, _language, (_nodeCounter++).ToString() + "_line_" + lineToken.LineNr); // + " (" + line + ")"); n.speaker = speaker; n.line = line; n.CalculateAndSetTimeBasedOnLineLength(false); if (lookAheadType(1) == Token.TokenType.BRACKET_LEFT) { match(Token.TokenType.BRACKET_LEFT); string nodeCustomName = match(Token.TokenType.NAME).getTokenString(); n.name = nodeCustomName; match(Token.TokenType.BRACKET_RIGHT); } #if DEBUG_WRITE Console.WriteLine("Added TimedDialogueNode with name '" + n.name + "' and line '" + n.line + "'"); #endif AddLinkFromPreviousNode(pPrevious, n); return(n); }
private string[] VisitFunctionCall(out string pFunctionName) { List <string> arguments = new List <string>(); if (lookAheadType(2) == Token.TokenType.DOT) { // Function looks like this: cat.foo("dog") Token tokenBeforeDot = match(Token.TokenType.NAME); string arg0 = tokenBeforeDot.getTokenString(); arguments.Add(arg0); #if DEBUG_WRITE Console.WriteLine("Added argument 0 based on token before dot: " + arg0); #endif match(Token.TokenType.DOT); } Token functionNameToken = match(Token.TokenType.NAME); pFunctionName = functionNameToken.getTokenString(); match(Token.TokenType.PARANTHESIS_LEFT); while (true) { if (lookAheadType(1) == Token.TokenType.PARANTHESIS_RIGHT) { break; } else if (lookAheadType(1) == Token.TokenType.NEW_LINE) { match(Token.TokenType.NEW_LINE); } else { string argumentString = GetAStringFromNextToken(true, true); #if DEBUG_WRITE Console.WriteLine("Matched argument " + argumentString); #endif arguments.Add(argumentString); if (lookAheadType(1) == Token.TokenType.COMMA) { match(Token.TokenType.COMMA); } else { break; } } } match(Token.TokenType.PARANTHESIS_RIGHT); return(arguments.ToArray()); }
DialogueNode VisitCancelDialogueNode(DialogueNode pPrevious) { #if DEBUG_WRITE Console.WriteLine("VisitCancelDialogueNode()"); #endif match(Token.TokenType.CANCEL); Token handleNameToken = match(Token.TokenType.NAME); CancelDialogueNode n = _dialogueRunner.Create <CancelDialogueNode>(_conversationName, _language, (_nodeCounter++).ToString() + "(cancel)"); n.handle = handleNameToken.getTokenString(); AddLinkFromPreviousNode(pPrevious, n); return(n); }
private TimedWaitDialogueNode VisitTimedWaitDialogueNode(DialogueNode pPrevious) { #if DEBUG_WRITE Console.WriteLine("TimedWaitDialogueNode()"); #endif match(Token.TokenType.WAIT); Token time = match(Token.TokenType.NUMBER); TimedWaitDialogueNode node = _dialogueRunner.Create <TimedWaitDialogueNode>(_conversationName, _language, (_nodeCounter++) + " (timed wait node)"); node.timer = node.timerStartValue = Convert.ToSingle(time.getTokenString()); #if DEBUG_WRITE Console.WriteLine("Added TimedWaitDialogueNode() with name '" + node.name + "'"); #endif AddLinkFromPreviousNode(pPrevious, node); return(node); }
private GotoDialogueNode VisitGotoDialogueNode(DialogueNode pPrevious) { #if DEBUG_WRITE Console.WriteLine("GotoDialogueNode()"); #endif match(Token.TokenType.GOTO); Token targetNameToken = match(Token.TokenType.NAME); GotoDialogueNode n = _dialogueRunner.Create <GotoDialogueNode>(_conversationName, _language, (_nodeCounter++) + " (goto)"); n.linkedNode = targetNameToken.getTokenString(); #if DEBUG_WRITE Console.WriteLine("Added GotoDialogueNode() with name '" + n.name + "'"); #endif AddLinkFromPreviousNode(pPrevious, n); return(n); }
private DialogueNode VisitOption(DialogueNode pScopeEndNode) { #if DEBUG_WRITE Console.WriteLine("VisitOption()"); #endif Token t = match(Token.TokenType.QUOTED_STRING); match(Token.TokenType.COLON); TimedDialogueNode optionNode = _dialogueRunner.Create <TimedDialogueNode>(_conversationName, _language, (_nodeCounter++).ToString()); optionNode.line = t.getTokenString(); optionNode.speaker = _playerCharacterName; optionNode.CalculateAndSetTimeBasedOnLineLength(true); #if DEBUG_WRITE Console.WriteLine("Created an option node with the name '" + optionNode.name + "'" + " and line " + "'" + optionNode.line + "'"); #endif Nodes(optionNode, pScopeEndNode); return(optionNode); }
private void Languages() { #if DEBUG_WRITE Console.WriteLine("Languages()"); #endif _language = Language.DEFAULT; while (lookAheadType(1) != Token.TokenType.EOF) { if (lookAheadType(1) == Token.TokenType.LANGUAGE) { match(Token.TokenType.LANGUAGE); Token languageNameToken = match(Token.TokenType.NAME); string languageName = languageNameToken.getTokenString(); switch (languageName.ToLower()) { case "swedish": _language = Language.SWEDISH; break; case "english": _language = Language.ENGLISH; break; default: throw new GrimmException("Can't handle language '" + languageName + "'"); } } #if DEBUG_WRITE Console.WriteLine("Creating dialogue nodes for language " + _language); #endif CreateTreeOfDialogueNodes(); } }
private WaitDialogueNode VisitWaitDialogueNode(DialogueNode pPrevious) { #if DEBUG_WRITE Console.WriteLine("WaitDialogueNode()"); #endif match(Token.TokenType.WAIT); WaitDialogueNode n = _dialogueRunner.Create <WaitDialogueNode>(_conversationName, _language, (_nodeCounter++) + " (start commando)"); List <ExpressionDialogueNode> expressionNodes = new List <ExpressionDialogueNode>(); bool hasEventListener = false; while (true) { if (lookAheadType(1) == Token.TokenType.NAME) { string expressionName = ""; string[] args = VisitFunctionCall(out expressionName); ExpressionDialogueNode expressionNode = _dialogueRunner.Create <ExpressionDialogueNode>(_conversationName, _language, (_nodeCounter++) + " (expression)"); expressionNode.expression = expressionName; expressionNode.args = args; expressionNodes.Add(expressionNode); } else if (lookAheadType(1) == Token.TokenType.AND) { ConsumeCurrentToken(); } else if (lookAheadType(1) == Token.TokenType.LISTEN) { if (hasEventListener) { throw new GrimmException(_conversationName + " already has a event listener attached to the wait statement on line " + lookAhead(1).LineNr); } ConsumeCurrentToken(); n.eventName = match(Token.TokenType.NAME).getTokenString(); hasEventListener = true; #if DEBUG_WRITE Console.WriteLine("This WaitDialogueNode has an event called " + n.eventName); #endif } else { break; } } n.expressions = expressionNodes.ToArray(); string handleName = ""; if (lookAheadType(1) == Token.TokenType.BRACKET_LEFT) { match(Token.TokenType.BRACKET_LEFT); Token handleToken = match(Token.TokenType.NAME); handleName = handleToken.getTokenString(); match(Token.TokenType.BRACKET_RIGHT); } n.handle = handleName; if (_loopStack.Count > 0) { // Add this listening dialogue node to the scope of the loop so that it is automatically removed when the loop ends n.scopeNode = _loopStack.Peek().name; } #if DEBUG_WRITE Console.WriteLine("Added WaitDialogueNode() with name '" + n.name + "'"); #endif //if(!_dialogueRunner.HasExpression(expressionName)) { //throw new GrimmException("There is no '" + expressionName + "' expression registered in the dialogue runner"); //} SilentDialogueNode silentEndNode = _dialogueRunner.Create <SilentDialogueNode>(_conversationName, _language, (_nodeCounter++).ToString() + "(silent stop node)"); AllowLineBreak(); if (lookAheadType(1) == Token.TokenType.BLOCK_BEGIN) { _loopStack.Push(n); ImmediateNode eventBranchStartNode = _dialogueRunner.Create <ImmediateNode>(_conversationName, _language, (_nodeCounter++).ToString() + "(waitBranchStartNode)"); n.branchNode = eventBranchStartNode.name; n.hasBranch = true; match(Token.TokenType.BLOCK_BEGIN); Nodes(eventBranchStartNode, silentEndNode); match(Token.TokenType.BLOCK_END); _loopStack.Pop(); } else { #if DEBUG_WRITE Console.WriteLine("this wait dialogue node had no body"); #endif } AddLinkFromPreviousNode(pPrevious, n); return(n); }
DialogueNode VisitListeningDialogueNode(DialogueNode pPrevious) { #if DEBUG_WRITE Console.WriteLine("VisitListeningDialogueNode()"); #endif match(Token.TokenType.LISTEN); string eventName = GetAStringFromNextToken(false, false); string handleName = ""; if (lookAheadType(1) == Token.TokenType.BRACKET_LEFT) { match(Token.TokenType.BRACKET_LEFT); Token handleToken = match(Token.TokenType.NAME); handleName = handleToken.getTokenString(); match(Token.TokenType.BRACKET_RIGHT); } else if ( (lookAheadType(1) != Token.TokenType.EOF) && (lookAheadType(1) != Token.TokenType.NEW_LINE) && (lookAheadType(1) != Token.TokenType.BLOCK_BEGIN)) { throw new GrimmException("Can't follow LISTEN statement with token of type " + lookAheadType(1) + " at line " + lookAhead(1).LineNr + " and position " + lookAhead(1).LinePosition + " in " + _conversationName); } ListeningDialogueNode n = _dialogueRunner.Create <ListeningDialogueNode>(_conversationName, _language, (_nodeCounter++).ToString() + "(event listener)"); n.eventName = eventName; n.handle = handleName; if (_loopStack.Count > 0) { // Add this listening dialogue node to the scope of the loop so that it is automatically removed as a listener when the loop ends n.scopeNode = _loopStack.Peek().name; } SilentDialogueNode silentNode = _dialogueRunner.Create <SilentDialogueNode>(_conversationName, _language, (_nodeCounter++).ToString() + "(silent stop node)"); AllowLineBreak(); if (lookAheadType(1) == Token.TokenType.BLOCK_BEGIN) { _loopStack.Push(n); ImmediateNode eventBranchStartNode = _dialogueRunner.Create <ImmediateNode>(_conversationName, _language, (_nodeCounter++).ToString() + "(eventBranchStartNode)"); n.branchNode = eventBranchStartNode.name; n.hasBranch = true; match(Token.TokenType.BLOCK_BEGIN); Nodes(eventBranchStartNode, silentNode); match(Token.TokenType.BLOCK_END); _loopStack.Pop(); } else { #if DEBUG_WRITE Console.WriteLine("this listening dialogue node had no body"); #endif } AddLinkFromPreviousNode(pPrevious, n); return(n); }