165 lines
4.0 KiB
C#
165 lines
4.0 KiB
C#
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
|
||
}
|