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
|
|||
|
}
|