using UnityEngine; using System; using System.Collections; using Fungus; // This facade class gives easy access to all game control // functionality available in Fungus public class GameController : MonoBehaviour { // // Synchronous methods // The following methods all execute immediately // // Return true if the boolean flag for the key has been set to true public bool GetFlag(string key) { GameState state = Game.GetInstance().state; return state.GetFlag(key); } // Returns the count value for the key // Returns zero if no value has been set. public int GetCounter(string key) { GameState state = Game.GetInstance().state; return state.GetCounter(key); } // Returns the inventory count value for the key // Returns zero if no inventory count has been set. public int GetInventory(string key) { GameState state = Game.GetInstance().state; return state.GetInventory(key); } // Returns true if the inventory count for the key is greater than zero public bool HasInventory(string key) { GameState state = Game.GetInstance().state; return (state.GetInventory(key) > 0); } // // Asynchronous methods // The following methods all queue commands for later execution in strict serial order // // Wait for a period of time before executing the next command public void Wait(float duration) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new WaitCommand(duration)); } // Call a delegate method provided by the client // Used to queue the execution of arbitrary code. public void Call(Action callAction) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new CallCommand(callAction)); } // Sets the currently active view immediately. // The main camera snaps to the active view. public void SetView(View view) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new SetViewCommand(view)); } // Sets the currently active page for text rendering public void SetPage(Page page) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new SetPageCommand(page)); } // Sets the title text displayed at the top of the active page public void Title(string titleText) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new TitleCommand(titleText)); } // Writes story text to the currently active page. // A 'continue' button is displayed when the text has fully appeared. public void Say(string storyText) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new SayCommand(storyText)); } // Adds an option button to the current list of options. // Use the Choose command to display added options. public void AddOption(string optionText, Action optionAction) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new AddOptionCommand(optionText, optionAction)); } // Display all previously added options as buttons, with no text prompt public void Choose() { Choose(""); } // Displays a text prompt, followed by all previously added options as buttons. public void Choose(string chooseText) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new ChooseCommand(chooseText)); } // Changes the active room to a different room public void MoveToRoom(Room room) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new MoveToRoomCommand(room)); } // Sets a global boolean flag value public void SetFlag(string key, bool value) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new SetFlagCommand(key, value)); } // Sets a global integer counter value public void SetCounter(string key, int value) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new SetCounterCommand(key, value)); } // Sets a global inventory count value // Assumes that the count value is 1 (common case) public void SetInventory(string key) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new SetInventoryCommand(key, 1)); } // Sets a global inventory count value public void SetInventory(string key, int value) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new SetInventoryCommand(key, value)); } // Sets sprite alpha to 0 immediately public void HideSprite(SpriteRenderer spriteRenderer) { FadeSprite(spriteRenderer, 0, 0, Vector2.zero); } // Sets sprite alpha to 1 immediately public void ShowSprite(SpriteRenderer spriteRenderer) { FadeSprite(spriteRenderer, 1, 0, Vector2.zero); } // Fades a sprite to a given alpha value over a period of time public void FadeSprite(SpriteRenderer spriteRenderer, float targetAlpha, float duration) { FadeSprite(spriteRenderer, targetAlpha, duration, Vector2.zero); } // Fades a sprite to a given alpha value over a period of time, and applies a sliding motion to the sprite transform public void FadeSprite(SpriteRenderer spriteRenderer, float targetAlpha, float duration, Vector2 slideOffset) { CommandQueue commandQueue = Game.GetInstance().commandQueue; Color color = spriteRenderer.color; color.a = targetAlpha; commandQueue.AddCommand(new FadeSpriteCommand(spriteRenderer, color, duration, slideOffset)); } // Makes a sprite behave as a clickable button public void AddButton(SpriteRenderer buttonSprite, Action buttonAction) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new AddButtonCommand(buttonSprite, buttonAction)); } // Makes a sprite stop behaving as a clickable button public void RemoveButton(SpriteRenderer buttonSprite) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new RemoveButtonCommand(buttonSprite)); } // Sets an animator trigger to change the animation state for an animated sprite public void SetAnimatorTrigger(Animator animator, string triggerName) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new SetAnimatorTriggerCommand(animator, triggerName)); } // Pans the camera to the target view over a period of time public void PanToView(View targetView, float duration) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new PanToViewCommand(targetView, duration)); } // Pans the camera through a sequence of target views over a period of time public void PanToPath(float duration, params View[] targetViews) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new PanToPathCommand(targetViews, duration)); } // Snaps the camera to the target view immediately public void SnapToView(View targetView) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new PanToViewCommand(targetView, 0f)); } // Fades out the current camera view, and fades in again using the target view. public void FadeToView(View targetView, float duration) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new FadeToViewCommand(targetView, duration)); } // Plays game music using an audio clip public void PlayGameMusic(AudioClip audioClip) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new PlayMusicCommand(audioClip)); } // Stops playing game music public void StopGameMusic() { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new StopMusicCommand()); } // Sets music volume immediately public void SetMusicVolume(float musicVolume) { SetMusicVolume(musicVolume, 0f); } // Fades music volume to required level over a period of time public void SetMusicVolume(float musicVolume, float duration) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new SetMusicVolumeCommand(musicVolume, duration)); } // Plays a sound effect once public void PlaySound(AudioClip audioClip) { PlaySound(audioClip, 1f); } // Plays a sound effect once, at the specified volume public void PlaySound(AudioClip audioClip, float volume) { CommandQueue commandQueue = Game.GetInstance().commandQueue; commandQueue.AddCommand(new PlaySoundCommand(audioClip, volume)); } }