Projet-IA-Madelaine/Scripts/GameHandlers/GameController.cs

165 lines
4.0 KiB
C#
Raw Permalink Normal View History

2024-06-12 21:03:42 +02:00
using Assets.Scripts;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using static GameHandler;
public class GameController : SingletonMB<GameController>
{
#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<SessionEventArgs> 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
/// <summary>
/// Initialize a new round if there are more available attempts
/// </summary>
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 <20>coul<75>");
}
}
//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
}