using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Linq; using System; using System.Runtime.Serialization.Formatters.Binary; using System.IO; /** * @package Fungus An open source library for Unity 3D for creating graphic interactive fiction games. */ namespace Fungus { /** * Manages global game state and movement between rooms. */ [RequireComponent(typeof(Dialog))] [RequireComponent(typeof(CommandQueue))] [RequireComponent(typeof(CameraController))] [RequireComponent(typeof(PageController))] public class Game : GameController { /** * The currently active Room. * Only one Room may be active at a time. */ public Room activeRoom; /** * Automatically display links between connected Rooms. */ public bool showLinks = true; /** * Deletes all previously stored variables on launch. * Disable this if you want to have game variables persist between game launches. * It is then up to you to provide an in-game option to reset game variables. */ public bool deleteVariables = true; /** * Time for fade transition to complete when moving to a different Room. */ public float roomFadeDuration = 1f; /** * Time for fade transition to complete when hiding/showing buttons. */ public float buttonFadeDuration = 0.25f; /** * Time which must elapse before buttons will automatically hide. */ public float autoHideButtonDuration = 5f; /** * Currently active Dialog object used to display character text and menus. */ public Dialog dialog; /** * Loading image displayed when loading a scene using MoveToScene() */ public Texture2D loadingImage; [HideInInspector] public CommandQueue commandQueue; [HideInInspector] public CameraController cameraController; [HideInInspector] public PageController pageController; /** * True when executing a Wait() or WaitForTap() command */ [HideInInspector] public bool waiting; float autoHideButtonTimer; static Game instance; /** * Returns the singleton instance for the Game class */ public static Game GetInstance() { if (!instance) { instance = GameObject.FindObjectOfType(typeof(Game)) as Game; if (!instance) { Debug.LogError("There must be one active Game object in your scene."); } } return instance; } public virtual void Start() { // Acquire references to required components commandQueue = gameObject.GetComponent(); cameraController = gameObject.GetComponent(); pageController = gameObject.GetComponent(); // Auto-hide buttons should be visible at start of game autoHideButtonTimer = autoHideButtonDuration; if (activeRoom == null) { // Pick first room found if none is specified activeRoom = GameObject.FindObjectOfType(typeof(Room)) as Room; } if (activeRoom != null) { // Move to the active room commandQueue.Clear(); commandQueue.AddCommand(new Command.MoveToRoom(activeRoom)); commandQueue.Execute(); } if (deleteVariables) { Variables.DeleteAll(); } } public virtual void Update() { autoHideButtonTimer -= Time.deltaTime; autoHideButtonTimer = Mathf.Max(autoHideButtonTimer, 0f); if (Input.GetMouseButtonDown(0)) { autoHideButtonTimer = autoHideButtonDuration; } } public IDialog GetDialog() { if (dialog != null) { return dialog as IDialog; } return pageController as IDialog; } /** * Returns true if the game should display 'auto hide' buttons. * Buttons will be displayed if the game is not currently displaying story text/options, and no Wait command is in progress. */ public bool GetShowAutoButtons() { if (waiting) { return false; } IDialog dialog = GetDialog(); if (dialog == null || dialog.GetDialogMode() == DialogMode.Idle) { return (autoHideButtonTimer > 0f); } return false; } /** * Loads a new scene and displays an optional loading image. * This is useful for splitting a large Fungus game across multiple scene files to reduce peak memory usage. * All previously loaded assets (including textures and audio) will be released. * @param sceneName The filename of the scene to load. * @param saveGame Automatically save the current game state as a checkpoint. */ public void LoadScene(string sceneName, bool saveGame) { SceneLoader.LoadScene(sceneName, loadingImage, saveGame); } /** * Save the current game state to persistant storage. * Only the values, string table and current scene are stored. * @param saveName The name of the saved game data. */ [Obsolete("Use Variables.Save() instead.")] public void SaveGame(string saveName) { Variables.Save(); } /** * Loads the current game state from persistant storage. * This will cause the scene specified in the "Fungus.Scene" string to be loaded. * Each scene in your game should contain the necessary code to restore the current game state based on saved data. * @param saveName The name of the saved game data. */ public void LoadGame(string saveName = "_fungus") { Variables.SetSaveName(saveName); string sceneName = Variables.GetString("_scene"); if (sceneName.Length > 0) { MoveToScene(sceneName); } } } }