Example #1
0
        IEnumerable <TwineOutput> ExecutePassage(TwinePassage passage)
        {
            foreach (TwineOutput output in passage.Execute())
            {
                if (output is TwineDisplay)
                {
                    var display       = (TwineDisplay)output;
                    var displayParams = (TwineVar[])display.Parameters.Clone();
                    this.PassageParameters = displayParams;

                    TwinePassage displayPassage = GetPassage(display.PassageName);
                    yield return(displayPassage);

                    foreach (TwineOutput innerOutput in ExecutePassage(displayPassage))
                    {
                        yield return(innerOutput);

                        this.PassageParameters = displayParams;                         // do this again because inner display macros can override this
                    }
                    PassageParameters = null;
                }
                else
                {
                    yield return(output);
                }
            }
        }
Example #2
0
        void Enter(string passageName)
        {
            _passageWaitingToEnter = null;

            this.Output.Clear();
            this.Text.Clear();
            this.Links.Clear();
            this.PassageParameters = null;
            _passageUpdateHooks    = null;

            TwinePassage passage = GetPassage(passageName);

            this.Tags = (string[])passage.Tags.Clone();
            this.PreviousPassageName = this.CurrentPassageName;
            this.CurrentPassageName  = passage.Name;

            // Update visited counters for passages and tags
            int visitedPassage;

            if (!_visitedCountPassages.TryGetValue(passageName, out visitedPassage))
            {
                visitedPassage = 0;
            }
            _visitedCountPassages[passageName] = visitedPassage + 1;

            for (int i = 0; i < passage.Tags.Length; i++)
            {
                string tag = passage.Tags[i];
                int    visitedTag;
                if (!_visitedCountTags.TryGetValue(tag, out visitedTag))
                {
                    visitedTag = 0;
                }
                _visitedCountTags[tag] = visitedTag + 1;
            }

            // Add output (and trigger hooks)
            this.Output.Add(passage);

            // Prepare the enumerator
            _passageExecutor = ExecutePassage(passage).GetEnumerator();

            // Get update hooks for calling during update
            _passageUpdateHooks = HooksFind("Update", reverse: false, allowCoroutines: false).ToArray();

            this.State = TwineStoryState.Playing;
            SendOutput(passage);
            HooksInvoke(HooksFind("Enter", maxLevels: 1));

            // Story was paused, wait for it to resume
            if (this.State == TwineStoryState.Paused)
            {
                return;
            }
            else
            {
                Execute();
            }
        }
Example #3
0
        IEnumerable<TwineOutput> ExecutePassage(TwinePassage passage)
        {
            foreach(TwineOutput output in passage.Execute())
            {
                if (output is TwineDisplay)
                {
                    yield return output;
                    var display = (TwineDisplay) output;
                    var displayParams = (TwineVar[])display.Parameters.Clone();
                    this.PassageParameters = displayParams;

                    TwinePassage displayPassage = GetPassage(display.PassageName);
                    yield return displayPassage;
                    foreach (TwineOutput innerOutput in ExecutePassage(displayPassage))
                    {
                        yield return innerOutput;
                        this.PassageParameters = displayParams; // do this again because inner display macros can override this
                    }
                    PassageParameters = null;
                }
                else
                    yield return output;
            }
        }