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); } } }
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(); } }
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; } }