protected StoryVar visited(params string[] passageNames) { if (passageNames == null || passageNames.Length == 0) { passageNames = new string[] { this.CurrentPassage.Name } } ; int min = int.MaxValue; for (int i = 0; i < passageNames.Length; i++) { string passage = passageNames[i]; int count = PassageHistory.Where(p => p == passage).Count(); if (passage == this.CurrentPassage.Name) { count++; } if (count < min) { min = count; } } if (min == int.MaxValue) { min = 0; } return(min); }
protected StoryVar visitedTag(params string[] tags) { if (tags == null || tags.Length == 0) { return(0); } int min = int.MaxValue; for (int i = 0; i < tags.Length; i++) { string tag = tags[i]; int count = PassageHistory.Where(p => Passages[p].Tags.Contains(tag)).Count(); if (CurrentPassage.Tags.Contains(tag)) { count++; } if (count < min) { min = count; } } if (min == int.MaxValue) { min = 0; } return(min); }
protected void Init() { _state = StoryState.Idle; this.Output = new List <StoryOutput>(); NumberOfLinksDone = 0; PassageHistory.Clear(); InsertStack.Clear(); CurrentPassage = null; }
public void InitializeTwine() { _story = _ctx.twineStoryView.CradleStory; _optionsButtons = _ctx.twineStoryView.OptionsButtons; TwineStoryView.Ctx viewCtx = new TwineStoryView.Ctx { setOptionsButton = SetOptionButton, }; _ctx.twineStoryView.SetCtx(viewCtx); PassageHistory.Ctx passageHistoryCtx = new PassageHistory.Ctx { playersData = _ctx.playersData, }; _passageHistory = new PassageHistory(passageHistoryCtx); }
void Enter(string passageName) { _passageWaitingToEnter = null; _passageEnterCueInvoked = false; _timeAccumulated = 0; _timeChangedToPlay = Time.time; this.InsertStack.Clear(); this.Output.Clear(); _groupStack.Clear(); _passageUpdateCues = null; StoryPassage passage = GetPassage(passageName); this.Tags = (string[])passage.Tags.Clone(); this.CurrentPassageName = passage.Name; PassageHistory.Add(passageName); // Prepare the thread enumerator _currentThread = CollapseThread(GetPassageThread(passage).Invoke()).GetEnumerator(); CurrentLinkInAction = null; this.State = StoryState.Playing; // Invoke the general passage enter event if (this.OnPassageEnter != null) { this.OnPassageEnter(passage); } // Story was paused, wait for it to resume if (this.State == StoryState.Paused) { return; } else { CuesInvoke(CuesGet(passage.Name, "Enter")); _passageEnterCueInvoked = true; ExecuteCurrentThread(); } }
/// <summary> /// /// </summary> public void GoTo(string passageName) { if (this.State != StoryState.Idle) { throw new InvalidOperationException( // Paused this.State == StoryState.Paused ? "The story is currently paused. Resume() must be called before advancing to a different passage." : // Playing this.State == StoryState.Playing || this.State == StoryState.Exiting ? "The story can only be advanced when it is in the Idle state." : // Complete "The story is complete. Reset() must be called before it can be played again." ); } // Indicate specified passage as next _passageWaitingToEnter = passageName; if (CurrentPassage != null) { this.State = StoryState.Exiting; if (this.OnPassageExit != null) { this.OnPassageExit(this.CurrentPassage); } // invoke exit cues CuesInvoke(CuesFind(CueType.Exit, reverse: true)); // Add the passage only now that we're leaving it PassageHistory.Add(CurrentPassage.Name); } if (this.State != StoryState.Paused) { Enter(passageName); } }