Newer
Older
TheVengeance-Project-IADE-Unity2D / Assets / Scripts / Managers / GameStateManager.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

namespace MyCollections.Managers
{
    public class GameStateManager : MonoBehaviour
    {
        private static GameStateManager instance;
        private AudioManager audioManager;
        private GameState currentState;
        private GameState previousState;

        //List of active combat states
        private HashSet<CombatState> activeCombatStates = new HashSet<CombatState>();

        public int ActiveCombatStates => activeCombatStates.Count;

        public delegate void GameStateChangeHandler(GameState newState);

        public event GameStateChangeHandler OnGameStateChange; //Triggers when Game State Changes

        public event Action OnCombatExit;  // Trigger when player leaves combat

        public GameState PreviousState => previousState;
        public GameState CurrentState => currentState;
        public static GameStateManager Instance => instance;

        private void Awake()
        {
            
            if (instance != null && instance != this)
            {
                Destroy(gameObject);
            }
            else
            {
                instance = this;
                DontDestroyOnLoad(gameObject);
            }

            audioManager = AudioManager.Instance;
        }

        // Start is called before the first frame update
        void Start()
        {
            SetState(GameState.Normal);
            SceneManager.activeSceneChanged += OnActiveSceneChanged;
        }

        private void Update()
        {
            //Debug.Log("Active Combat States" + activeCombatStates.Count);
        }

        // Changes the game state and triggers the event
        public void SetState(GameState state)
        {
            //Saves the current state
            previousState = currentState;

            if (currentState != state)
            {
                currentState = state;
                Debug.Log($"CURRENT GAME STATE: {currentState}");
                OnGameStateChange?.Invoke(currentState);
            }
        }

        //Adds a combat state to the List
        public void AddCombatState(CombatState combat)
        {
            activeCombatStates.Add(combat);

            if (currentState != GameState.Combat)
            {
                Debug.Log($"Active Combat States: {ActiveCombatStates}");
                EnterCombatState(); //Enters in Combat State
            }
        }

        //Remove a combat state when it's finished
        public void RemoveCombatState(CombatState combat)
        {
            activeCombatStates.Remove(combat);
            Debug.Log($"Active Combat States: {ActiveCombatStates}");
            EndGameCombatState();
        }

        //Checks if the Combat Game State is finished
        private void EndGameCombatState()
        {
            if (activeCombatStates.Count != 0) return;

            OnCombatExit?.Invoke(); // Trigger combat exit event
            SetState(GameState.Normal);
        }

        // Enters combat state
        private void EnterCombatState()
        {
            SetState(GameState.Combat);
        }

        // Pauses the game
        public void PauseGame()
        {
            SetState(GameState.Paused);
            Time.timeScale = 0f; // Pause the game
        }

        // Resumes the game
        public void ResumeGame()
        {
            SetState(previousState); // Or other states as needed
            Time.timeScale = 1f; // Resume the game
        }

        private void OnActiveSceneChanged(Scene current, Scene next)
        {
            Debug.Log($"Scene changed from {current.name} to {next.name}");

            // You can trigger your custom game state change event here if necessary
            OnGameStateChange?.Invoke(GameState.Normal);
        }
    }

    public enum GameState
    {
        Paused,
        Combat,
        Normal,
        InDialogue,
        Loading,
        Cutscene
    }
}