Пример #1
0
 public OptionLink(YarnSpinnerV1Parser.OptionLinkContext context)
     : this()
 {
     this.Context    = context;
     this.Conditions = new List <(YarnSpinnerV1Parser.ExpressionContext expression, bool requiredTruthValue)>();
 }
Пример #2
0
 /// <summary>
 /// Exit a parse tree produced by the <c>OptionLink</c>
 /// labeled alternative in <see cref="YarnSpinnerV1Parser.option_statement"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitOptionLink([NotNull] YarnSpinnerV1Parser.OptionLinkContext context)
 {
 }
Пример #3
0
            public override int VisitOptionLink([NotNull] YarnSpinnerV1Parser.OptionLinkContext context)
            {
                var link = new OptionLink(context);

                // Walk up the tree until we hit a NodeContext, looking for
                // if-clauses, else-if clauses, and end-if clauses.
                var parent = context.Parent;

                while (parent != null && parent is YarnSpinnerV1Parser.NodeContext == false)
                {
                    if (parent is YarnSpinnerV1Parser.If_clauseContext ifClause)
                    {
                        // The option is inside an 'if' clause. The
                        // expression must evaluate to true in order for
                        // this option to run.
                        link.Conditions.Add((ifClause.expression(), true));
                    }
                    else if (parent is YarnSpinnerV1Parser.Else_if_clauseContext elseIfContext)
                    {
                        // The option is inside an 'else if' clause. The
                        // expression must evaluate to true, and all of the
                        // preceding if and else-if clauses in this if
                        // statement must evaluate to false, in order for
                        // this option to run.
                        link.Conditions.Add((elseIfContext.expression(), true));

                        var parentIfClause = elseIfContext.Parent as YarnSpinnerV1Parser.If_statementContext;

                        foreach (var siblingClause in parentIfClause.children)
                        {
                            // Stop if we've reached ourself
                            if (siblingClause == elseIfContext)
                            {
                                break;
                            }

                            switch (siblingClause)
                            {
                            case YarnSpinnerV1Parser.If_clauseContext siblingIfClause:
                                link.Conditions.Add((siblingIfClause.expression(), false));
                                break;

                            case YarnSpinnerV1Parser.Else_if_clauseContext siblingElseIfClause:
                                link.Conditions.Add((siblingElseIfClause.expression(), false));
                                break;
                            }
                        }
                    }
                    else if (parent is YarnSpinnerV1Parser.Else_clauseContext elseContext)
                    {
                        // The option is inside an 'else' clause. All of the
                        // preceding if and else-if clauses in this if
                        // statement must evaluate to false, in order for
                        // this option to run.
                        var parentIfClause = elseContext.Parent as YarnSpinnerV1Parser.If_statementContext;

                        foreach (var siblingClause in parentIfClause.children)
                        {
                            // Stop if we've hit ourself (probably not an
                            // issue since an else statement occurs at the
                            // end anyway, but good to check imo)
                            if (siblingClause == elseContext)
                            {
                                break;
                            }

                            switch (siblingClause)
                            {
                            case YarnSpinnerV1Parser.If_clauseContext siblingIfClause:
                                link.Conditions.Add((siblingIfClause.expression(), false));
                                break;

                            case YarnSpinnerV1Parser.Else_if_clauseContext siblingElseIfClause:
                                link.Conditions.Add((siblingElseIfClause.expression(), false));
                                break;
                            }
                        }
                    }

                    // Step up the tree
                    parent = parent.Parent;
                }

                this.currentNodeOptionLinks.Add(link);

                return(base.VisitOptionLink(context));
            }
 /// <summary>
 /// Visit a parse tree produced by the <c>OptionLink</c>
 /// labeled alternative in <see cref="YarnSpinnerV1Parser.option_statement"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitOptionLink([NotNull] YarnSpinnerV1Parser.OptionLinkContext context)
 {
     return(VisitChildren(context));
 }