diff --git a/3d Prototyp/Assets/Scripts/GameManager.cs b/3d Prototyp/Assets/Scripts/GameManager.cs index 5eec86e3..2e883f96 100644 --- a/3d Prototyp/Assets/Scripts/GameManager.cs +++ b/3d Prototyp/Assets/Scripts/GameManager.cs @@ -19,9 +19,12 @@ public class GameManager : MonoBehaviour [SerializeField] private List _developers = new(); + + [SerializeField] + private MultiFalsableBool _gameRunning = new(false); /// - /// Wie weit das Spiel bereits fortgeschritten ist, in Prozent. + /// Wie weit das Spiel bereits fortgeschritten ist. /// public double GameProgress => 1.0 - (_remainingGameDurationSeconds / _baseGameDurationSeconds); @@ -31,9 +34,11 @@ public class GameManager : MonoBehaviour public double CurrentEfficiency => _currentEfficiency; /// - /// Wie viele Sekunden das Spiel voraussichtlich noch dauern wird, würden die Effizienz sich nicht verändern. + /// Wie viele Sekunden das Spiel voraussichtlich noch dauern wird, würde die Effizienz sich nicht verändern. /// public double ExpectedRemainingGameDuration => _remainingGameDurationSeconds / _currentEfficiency; + + public bool IsGameRunning => _gameRunning.IsTrue; private void Awake() { @@ -46,15 +51,49 @@ public class GameManager : MonoBehaviour Debug.LogError("GameManager already exists. Deleting duplicate."); Destroy(gameObject); } - - InvokeRepeating(nameof(UpdateProgress), 0.0f, 1.0f); } private void Start() { - _remainingGameDurationSeconds = _baseGameDurationSeconds; + StartGame(); } + + /// + /// Startet ein neues Spiel. + /// + [ContextMenu("Start Game")] + private void StartGame() + { + _remainingGameDurationSeconds = _baseGameDurationSeconds; + + ResumeGame(); + } + + /// + /// Hebt eine Pausierung auf und setzt das Spiel fort, wenn alle Pausierungen aufgehoben wurden. + /// + /// Hinweis: Für jedes PauseGame muss ein ResumeGame aufgerufen werden. + [ContextMenu("Resume Game")] + public void ResumeGame() + { + if (_gameRunning.MakeTruer()) + { + InvokeRepeating(nameof(UpdateProgress), 0.0f, 1.0f); + } + } + + /// + /// Pausiert das Spiel. Ist Stapelbar. + /// + /// Hinweis: Für jedes PauseGame muss ein ResumeGame aufgerufen werden. + [ContextMenu("Pause Game")] + public void PauseGame() + { + _gameRunning.MakeFalslier(); + CancelInvoke(nameof(UpdateProgress)); + } + void UpdateProgress() { UpdateEfficiency();