using System; using UnityEngine; using UnityEngine.UI; namespace EscapeRoomEngine.Engine.Runtime { public enum GameState { Stopped, Paused, Running } public class GameControl : MonoBehaviour { private const int InitialTime = 5 * 60; [SerializeField] private Button startButton, stopButton, pauseButton, resumeButton, addMinuteButton, removeMinuteButton; [SerializeField] private Text timeText; [HideInInspector] public GameState gameState = GameState.Stopped; public float TimeRemaining => _totalTime - _timeElapsed; private float _timeElapsed, _totalTime; private void Start() { SetGamemasterTimeText(_totalTime); } private void Update() { // Update time if (gameState == GameState.Running) { if (Time.deltaTime <= TimeRemaining) { _timeElapsed += Time.deltaTime; } else { _timeElapsed = _totalTime; StopGame(); } SetGamemasterTimeText(TimeRemaining); } // Enable or disable buttons startButton.interactable = gameState == GameState.Stopped; stopButton.interactable = gameState != GameState.Stopped; pauseButton.interactable = gameState == GameState.Running; resumeButton.interactable = gameState == GameState.Paused; addMinuteButton.interactable = gameState != GameState.Stopped; removeMinuteButton.interactable = gameState != GameState.Stopped && TimeRemaining >= 60; } #region Time Controls public void StartGame() { gameState = GameState.Running; _totalTime = InitialTime; _timeElapsed = 0; } public void StopGame() { gameState = GameState.Stopped; } public void PauseGame() { gameState = GameState.Paused; } public void ResumeGame() { gameState = GameState.Running; } /// /// Change the allowed time by a specified amount of seconds. /// /// The amount of seconds that will be added to the time. Can be negative to remove time. public void ChangeTime(int seconds) { if (_totalTime + seconds >= 0) { _totalTime += seconds; } } private void SetGamemasterTimeText(float time) { if (timeText != null) { timeText.text = TimeToText(time); } } private static string TimeToText(float time) { var minutes = (int) (time / 60); var seconds = (int) Math.Ceiling(time - minutes * 60); if (seconds == 60) { minutes += 1; seconds = 0; } return $"{minutes:D2}:{seconds:D2}"; } #endregion public void ExitGame() { StopGame(); #if UNITY_STANDALONE Application.Quit(); #endif #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #endif } } }