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.

165 lines
2.9 KiB

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace Fungus
{
// Manages movement between rooms and global game state
[RequireComponent (typeof (CommandQueue))]
[RequireComponent (typeof (CameraController))]
public class Game : MonoBehaviour
{
public bool showLinks = true;
public Room activeRoom;
[HideInInspector]
public View activeView;
[HideInInspector]
public Page activePage;
public GameState state = new GameState();
protected Dictionary<string, string> stringTable = new Dictionary<string, string>();
private static Game instance;
CameraController cameraController;
public float fadeDuration = 1f;
public string continueText = "Continue";
public int charactersPerSecond = 60;
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()
{
cameraController = GetComponent<CameraController>();
if (activeRoom == null)
{
// Pick first room found if none is specified
activeRoom = GameObject.FindObjectOfType(typeof(Room)) as Room;
}
if (activeRoom != null)
{
MoveToRoom(activeRoom);
}
}
public Room GetCurrentRoom()
{
return GetInstance().activeRoom;
}
public void MoveToRoom(Room room)
{
if (room == null)
{
Debug.LogError("Failed to move to room. Room must not be null.");
return;
}
// Fade out screen
cameraController.Fade(0f, fadeDuration / 2f, delegate {
if (activeRoom != null)
{
activeRoom.Leave();
}
activeRoom = room;
activeRoom.Enter();
// Fade in screen
cameraController.Fade(1f, fadeDuration / 2f, null);
});
}
public void Restart()
{
// TODO: Reload scene
}
public void ClearFlags()
{
state.ClearFlags();
}
public bool GetFlag(string key)
{
return state.GetFlag(key);
}
public void SetFlag(string key, bool value)
{
state.SetFlag(key, value);
}
public void ClearCounters()
{
state.ClearCounters();
}
public int GetCounter(string key)
{
return state.GetCounter(key);
}
public void SetCounter(string key, int value)
{
state.SetCounter(key, value);
}
public void ClearInventory()
{
state.ClearInventory();
}
public int GetInventory(string key)
{
return state.GetInventory(key);
}
public void SetInventory(string key, int value)
{
state.SetInventory(key, value);
}
public void ClearStringTable()
{
stringTable.Clear();
}
public string GetString(string key)
{
if (stringTable.ContainsKey(key))
{
return stringTable[key];
}
return "";
}
public void SetString(string key, string value)
{
stringTable[key] = value;
}
}
}