using Assets.Scripts; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using static GameHandler; public class GameController : SingletonMB { #region PROPERTIES public bool IsExiting { get; private set; } public SessionData Session { get; private set; } = new SessionData(); #endregion #region VARIABLES private GameHandler _gameHandler; private ScoreHandler _scoreHandler; private LevelSpawner _LevelSpawner; private PlayersHandler _playerHandler; private DataBearer _dataBearer; private int maxSessionTime; private float currentSessionTime; private int maxAttempts; private int currentAttempts; #endregion #region EVENTS public event EventHandler OnSessionEnded; public class SessionEventArgs : EventArgs { public SessionData session; public SessionEventArgs(SessionData session) { this.session = session; } } private void ProcessNextAttempt_OnAttemptEnded(object sender, AttemptEventArgs args) { if(!IsExiting) { PrepareNextRound(); } } #endregion #region METHODS /// /// Initialize a new round if there are more available attempts /// public void PrepareNextRound() { currentAttempts+=1; if(maxAttempts == 0 || _dataBearer.Session.Attempts.Count < maxAttempts) { _gameHandler.InitAttempt(); } else { ExitToMenu("Nombre maximum d'essais atteint"); } } public void ExitToMenu(string message) { IsExiting = true; Debug.Log("Session END"); //StartCoroutine(ExitToMenuCoroutine(message)); _gameHandler.ResumeGame(); //yield return null; if (!_gameHandler.AttemptEnding) _gameHandler.HaltAttempt(message); Clean(); SceneManager.LoadScene("MainMenu"); _dataBearer.ResetSession(); } //private IEnumerator ExitToMenuCoroutine(string message) //{ // _gameHandler.ResumeGame(); // //yield return null; // if(!_gameHandler.AttemptEnding) _gameHandler.HaltAttempt(message); // _dataBearer.ResetSession(); // Clean(); // SceneManager.LoadScene("MainMenu"); //} #endregion #region LIFECYCLE // Start is called before the first frame update private void Start() { Debug.Log($"Start session for {Session.Rules.MaxAttempts} rounds"); _dataBearer.RecordSessionDate(DateTime.Now); currentSessionTime = 0f; PrepareNextRound(); } // Awake is called before Start protected override void Awake() { base.Awake(); _gameHandler = GameHandler.Instance; _scoreHandler = ScoreHandler.Instance; _playerHandler = PlayersHandler.Instance; _dataBearer = DataBearer.Instance; _gameHandler.OnAttemptEnded += ProcessNextAttempt_OnAttemptEnded; maxAttempts = _dataBearer.Rules.MaxAttempts; maxSessionTime = _dataBearer.Rules.MaxSessionTime; currentAttempts = 0; } // Update is called once per frame void Update() { currentSessionTime += Time.deltaTime; _dataBearer.RecordSessionTime(currentSessionTime); if (maxSessionTime > 0 && currentSessionTime >= maxSessionTime) { currentSessionTime = maxSessionTime; _dataBearer.RecordSessionTime(currentSessionTime); ExitToMenu("Temps �coul�"); } } //Unsubscribe events, save databearer; private void OnDestroy() { Clean(); } private void OnApplicationQuit() { Clean(); } public void Clean() { _gameHandler.OnAttemptEnded -= ProcessNextAttempt_OnAttemptEnded; if (!_dataBearer.DataSaved) { //datasaving logic _dataBearer.RecordSessionTime(currentSessionTime); _dataBearer.SaveData(); } } #endregion }