using UnityEngine; using System; using System.Collections; namespace Fungus { /** * Command classes have their own namespace to prevent them popping up in code completion. */ namespace Command { /** * Call a delegate method on execution. * This command can be used to schedule arbitrary script code. */ public class Call : CommandQueue.Command { Action onExecute; public Call(Action callAction) { if (callAction == null) { Debug.LogError("Action must not be null."); return; } onExecute = callAction; } public override void Execute(CommandQueue commandQueue, Action onComplete) { if (onExecute != null) onExecute(); if (onComplete != null) onComplete(); } } /** * Wait for a period of time. */ public class Wait : CommandQueue.Command { float duration; public Wait(float _duration) { duration = _duration; } public override void Execute(CommandQueue commandQueue, Action onComplete) { Game.GetInstance().waiting = true; commandQueue.StartCoroutine(WaitCoroutine(duration, onComplete)); } IEnumerator WaitCoroutine(float duration, Action onComplete) { yield return new WaitForSeconds(duration); if (onComplete != null) { Game.GetInstance().waiting = false; onComplete(); } } } /** * Wait for a player tap/click/key press */ public class WaitForInput : CommandQueue.Command { public override void Execute(CommandQueue commandQueue, Action onComplete) { Game.GetInstance().waiting = true; commandQueue.StartCoroutine(WaitCoroutine(onComplete)); } IEnumerator WaitCoroutine(Action onComplete) { while (true) { if (Input.GetMouseButtonDown(0) || Input.anyKeyDown) { break; } yield return null; } if (onComplete != null) { Game.GetInstance().waiting = false; onComplete(); } } } /** * Changes the active room to a different room */ public class MoveToRoom : CommandQueue.Command { Action onExecute; public MoveToRoom(Room room) { if (room == null) { Debug.LogError("Room must not be null."); return; } onExecute = delegate { Game game = Game.GetInstance(); game.waiting = true; // Fade out screen game.cameraController.Fade(0f, game.roomFadeDuration / 2f, delegate { game.activeRoom = room; // Notify room script that the Room is being entered // Calling private method on Room to hide implementation game.activeRoom.gameObject.SendMessage("Enter"); // Fade in screen game.cameraController.Fade(1f, game.roomFadeDuration / 2f, delegate { game.waiting = false; }); }); }; } public override void Execute(CommandQueue commandQueue, Action onComplete) { if (onExecute != null) onExecute(); // This command resets the command queue so no need to call onComplete } } /** * Switches to a different scene. */ public class MoveToScene : CommandQueue.Command { Action onExecute; public MoveToScene(string sceneName) { if (sceneName == "") { Debug.LogError("Scene name must not be empty"); return; } onExecute = delegate { Game game = Game.GetInstance(); game.waiting = true; // Fade out screen game.cameraController.Fade(0f, game.roomFadeDuration / 2f, delegate { Game.GetInstance().LoadScene(sceneName, true); }); }; } public override void Execute(CommandQueue commandQueue, Action onComplete) { if (onExecute != null) onExecute(); // This command resets the command queue so no need to call onComplete } } } }