An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

215 lines
5.3 KiB

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<CommandQueue>();
cameraController = gameObject.GetComponent<CameraController>();
pageController = gameObject.GetComponent<PageController>();
// 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);
}
}
}
}