using UnityEngine; using System; using System.Collections; using System.Collections.Generic; namespace Fungus { /** * Permitted states for Dialogs. */ public enum DialogMode { /// Dialog has no pending content to display so is not shown. Idle, /// Dialog is currently writing out content. Writing, /// Dialog has finished writing out content and is waiting for player input. Waiting } /** * Interface for Dialog implementations. * This allows us to introduce new types of Dialog in future. */ public interface IDialog { /** * Returns the current state of the Dialog. */ DialogMode GetDialogMode(); /** * Display a line of story text. * If any options have previously been added using AddOption(), these will be displayed and the * user must choose an option to continue. The sayAction parameter is ignored * @param sayText The line of story text to be displayed. * @param sayAction Delegate method to call when the player taps to continue. */ void Say(string sayText, Action sayAction); /** * Clear the current list of options previously added using AddOption(). */ void ClearOptions(); /** * Add an option to the list of options to be displayed on the next call to Say(). * @param optionText Text to display on the button for the option. * @param optionAction Delegate method to call when the option button is pressed. */ void AddOption(string optionText, Action optionAction); /** * Sets a time limit for the player to choose between multiple options. * If the player fails to make a choice in time then the timeoutAction delegate method is called. * This setting only applies to the next Say() command and will be reset afterwards. * @timeoutDuration Length of time for the player to choose an option. * @timeoutAction Delegate method to call when player fails to choose an option. */ void SetTimeout(float timeoutDuration, Action timeoutAction); } [ExecuteInEditMode] public class LegacyDialog : MonoBehaviour, IDialog { /** * Padding values for each side of the dialog. * Values are in normalized screen coords [0..1] */ [Serializable] public class Layout { /** * Push the left dialog edge away from the left side of the screen. */ [Tooltip("Push the left dialog edge away from the left side of the screen.")] public bool leftSpace = false; /** * Push the top dialog edge away from the top side of the screen. */ [Tooltip("Push the top dialog edge away from the top side of the screen.")] public bool topSpace = true; /** * Push the right dialog edge away from the right side of the screen. */ [Tooltip("Push the right dialog edge away from the right side of the screen.")] public bool rightSpace = false; /** * Push the bottom dialog edge away from the bottom side of the screen. */ [Tooltip("Push the bottom dialog edge away from the bottom side of the screen.")] public bool bottomSpace = false; /** * Minimum dimensions of the dialog in normalized screen coordinates [0..1]. * The dialog may expand beyond these dimensions to fit content. */ [Tooltip("Minimum dimensions of the dialog in normalized screen coordinates [0..1].")] public Vector2 size = new Vector2(1f, 0.25f); /** * Offset the dialog relative to the top left corner of the screen. * Coordinates are in normalized screen coordinates [0..1] */ [Tooltip("Offset the dialog relative to the top left corner of the screen.")] public Vector2 offset; } /** * Layout values used to control size and position of the dialog. */ [Tooltip("Layout values used to control size and position of the dialog.")] public Layout layout; /** * Defines the dialog display properties of a game character. */ [System.Serializable] public class Character { /** * Side of screen to display character image. */ public enum ImageSide { /// Display image on the left side of the dialog. Left, /// Display image on the right side of the dialog. Right } /** * Identifier for this character for use with the SetCharacter() command. */ [Tooltip("Identifier for this character for use with the SetCharacter() command.")] public string characterID; /** * Name text to display for the character on the dialog. * If empty then the name field is not displayed. */ [Tooltip("Name text to display for the character on the dialog.")] public string name; /** * The color of the name text label. * This always overrides any color value specified in the NameStyle property. */ [Tooltip("The color of the name text label.")] public Color nameColor; /** * Image to display for the character. * If no image is specified then no character image will be displayed. */ [Tooltip("Image to display for the character.")] public Texture2D image; /** * Side of dialog where character image will be displayed. */ [Tooltip("Side of dialog where character image will be displayed.")] public ImageSide imageSide; } /** * List of game characters that can be displayed using this dialog. */ [Tooltip("List of game characters that can be displayed using this dialog.")] public Character[] characters; /** * Active character to use when displaying dialog (set using the SetCharacter() command). */ [Tooltip("Active character to use when displaying dialog.")] public int activeCharacter; /** * Writing speed for say text in characters per second. */ [Range(0, 1000)] [Tooltip("Writing speed for say text in characters per second.")] public int writingSpeed = 100; /** * Sound to play while text is being written in the dialog. */ [Tooltip("Sound to play while text is being written in the dialog.")] public AudioClip writingSound; /** * Loop the writing sound as long as text is being written. */ [Tooltip("Loop the writing sound while text is being written.")] public bool loopWritingSound = true; /** * Sound effect to play when the player taps to continue. */ [Tooltip("Sound effect to play when the player taps to continue.")] public AudioClip continueSound; /** * Icon to display under the story text when waiting for player to tap to continue. */ [Tooltip("Icon to display under the story text when waiting for player to tap to continue.")] public Texture2D continueIcon; /** * Number of buttons to display in the same row when showing multiple options. */ [Range(0, 10)] [Tooltip("Number of buttons to display in the same row when showing multiple options.")] public int buttonsPerRow = 2; /** * Minimum width of each button as a fraction of the screen width [0..1]. * This is useful to create a column of buttons with matching width. */ [Range(0, 1)] [Tooltip("Minimum width of each button as a fraction of the screen width [0..1].")] public float minButtonWidth = 0; /** * Padding values for each side of the character image. */ [System.Serializable] public class ImagePadding { /** * Padding to apply to left side of image as a fraction of screen height [-2..2]. */ [Range(-2,2)] [Tooltip("Padding to apply to left side of image as a fraction of screen height [-2..2].")] public float left; /** * Padding to apply to right side of image as a fraction of screen height [-2..2]. */ [Range(-2,2)] [Tooltip("Padding to apply to right side of image as a fraction of screen height [-2..2].")] public float right; /** * Padding to apply to top side of image as a fraction of screen height [-1..1]. */ [Range(-1,1)] [Tooltip("Padding to apply to top side of image as a fraction of screen height [-1..1].")] public float top; /** * Padding to apply to bottom side of image as a fraction of screen height [-1..1]. */ [Range(-1,1)] [Tooltip("Padding to apply to bottom side of image as a fraction of screen height [-1..1].")] public float bottom; } /** * Padding offset to apply around the character image. */ [Tooltip("Padding offset to apply around the character image.")] public ImagePadding imagePadding; /** * Scale of character image, specified as a fraction of current screen height [0..1]. */ [Range(0, 1)] [Tooltip("Scale of character image, specified as a fraction of current screen height [0..1].")] public float imageScale = 0.25f; /** * Animation frames for multiple choice time indicator. */ [Tooltip("Animation frames for multiple choice time indicator.")] public Texture2D[] timerAnimation; /** * Scale of timer image, specified as a fraction of current screen height [0..1]. */ [Range(0, 1)] [Tooltip("Scale of timer image, specified as a fraction of current screen height [0..1].")] public float timerScale = 0.2f; /** * Sound effect to play when time indicator advances. */ [Tooltip("Sound effect to play when time indicator advances.")] public AudioClip timerSound; /** * Style for dialog box background. */ [Tooltip("Style for dialog box background.")] public GUIStyle boxStyle; /** * Style for name text. */ [Tooltip("Style for name text.")] public GUIStyle nameTextStyle; /** * Style for say text. */ [Tooltip("Style for say text.")] public GUIStyle sayTextStyle; /** * Style for option buttons */ [Tooltip("Style for option buttons.")] public GUIStyle buttonStyle; DialogMode dialogMode; public DialogMode GetDialogMode() { return dialogMode; } class Option { public string optionText; public Action optionAction; public Option(string _optionText, Action _optionAction) { optionText = _optionText; optionAction = _optionAction; } } List