GameFlowManager

mail@pastecode.io avatar
unknown
csharp
20 days ago
9.4 kB
2
Indexable
Never
using System.Collections;
using UnityEngine;
using UnityEngine.Playables;
using KartGame.KartSystems;
using UnityEngine.SceneManagement;
using System;
using System.IO;
using System.Collections.Generic;
using UnityEditor.UIElements;
using System.Linq;
using TMPro;
using UnityEngine.SocialPlatforms.Impl;
using PlasticGui.Configuration;
public enum GameState{Play, Won, Lost}

public class GameFlowManager : MonoBehaviour
{

    [Header("Parameters")]
    [Tooltip("Duration of the fade-to-black at the end of the game")]
    public float endSceneLoadDelay = 3f;
    [Tooltip("The canvas group of the fade-to-black screen")]
    public CanvasGroup endGameFadeCanvasGroup;
    [Header("Win")]
    [Tooltip("This string has to be the name of the scene you want to load when winning")]
    public string winSceneName = "WinScene";
    [Tooltip("Duration of delay before the fade-to-black, if winning")]
    public float delayBeforeFadeToBlack = 4f;
    [Tooltip("Duration of delay before the win message")]
    public float delayBeforeWinMessage = 2f;
    [Tooltip("Sound played on win")]
    public AudioClip victorySound;

    //public string name = "Player 1";
    public NameDef playerName;
    [Tooltip("Prefab for the win game message")]
    public DisplayMessage winDisplayMessage;

    public PlayableDirector raceCountdownTrigger;

    [Header("Lose")]
    [Tooltip("This string has to be the name of the scene you want to load when losing")]
    public string loseSceneName = "LoseScene";
    [Tooltip("Prefab for the lose game message")]
    public DisplayMessage loseDisplayMessage;

    [SerializeField] 
    public TextMeshProUGUI display_scores;
    public GameState gameState { get; private set; }

    public bool autoFindKarts = true;
    public ArcadeKart playerKart;

    ArcadeKart[] karts;
    ObjectiveManager m_ObjectiveManager;
    TimeManager m_TimeManager;
    float m_TimeLoadEndGameScene;
    string m_SceneToLoad;
    float elapsedTimeBeforeEndScene = 0;
    public bool isQuit = false;

    public int playerScore;
    //private string path = "../Piwo Kart/Assets/Karting/Scripts/high_score.txt";

    public LeaderboardManager leaderboardManager;
    int playerScoreLeaderBoard;
    void Start()
    {
        leaderboardManager = FindObjectOfType<LeaderboardManager>();
        if (autoFindKarts)
        {
            karts = FindObjectsOfType<ArcadeKart>();
            if (karts.Length > 0)
            {
                if (!playerKart) playerKart = karts[0];
            }
            DebugUtility.HandleErrorIfNullFindObject<ArcadeKart, GameFlowManager>(playerKart, this);
        }

        m_ObjectiveManager = FindObjectOfType<ObjectiveManager>();
		DebugUtility.HandleErrorIfNullFindObject<ObjectiveManager, GameFlowManager>(m_ObjectiveManager, this);

        m_TimeManager = FindObjectOfType<TimeManager>();
        DebugUtility.HandleErrorIfNullFindObject<TimeManager, GameFlowManager>(m_TimeManager, this);

        AudioUtility.SetMasterVolume(1);

        winDisplayMessage.gameObject.SetActive(false);
        loseDisplayMessage.gameObject.SetActive(false);

        m_TimeManager.StopRace();
        foreach (ArcadeKart k in karts)
        {
			k.SetCanMove(false);
        }

        //run race countdown animation
        ShowRaceCountdownAnimation();
        StartCoroutine(ShowObjectivesRoutine());

        StartCoroutine(CountdownThenStartRaceRoutine());
    }

    IEnumerator CountdownThenStartRaceRoutine() {
        yield return new WaitForSeconds(3f);
        StartRace();
    }

    void StartRace() {
        foreach (ArcadeKart k in karts)
        {
			k.SetCanMove(true);
        }
        m_TimeManager.StartRace();
    }

    void ShowRaceCountdownAnimation() {
        raceCountdownTrigger.Play();
    }

    IEnumerator ShowObjectivesRoutine() {
        while (m_ObjectiveManager.Objectives.Count == 0)
            yield return null;
        yield return new WaitForSecondsRealtime(0.2f);
        for (int i = 0; i < m_ObjectiveManager.Objectives.Count; i++)
        {
           if (m_ObjectiveManager.Objectives[i].displayMessage)m_ObjectiveManager.Objectives[i].displayMessage.Display();
           yield return new WaitForSecondsRealtime(1f);
        }
    }


    void Update()
    {

        if (gameState != GameState.Play)
        {
            elapsedTimeBeforeEndScene += Time.deltaTime;
            if(elapsedTimeBeforeEndScene >= endSceneLoadDelay)
            {

                float timeRatio = 1 - (m_TimeLoadEndGameScene - Time.time) / endSceneLoadDelay;
                endGameFadeCanvasGroup.alpha = timeRatio;

                float volumeRatio = Mathf.Abs(timeRatio);
                float volume = Mathf.Clamp(1 - volumeRatio, 0, 1);
                AudioUtility.SetMasterVolume(volume);

                // See if it's time to load the end scene (after the delay)
                if (Time.time >= m_TimeLoadEndGameScene)
                {
                    SceneManager.LoadScene(m_SceneToLoad);
                    gameState = GameState.Play;
                }
            }
        }
        else
        {
            if (m_ObjectiveManager.AreAllObjectivesCompleted())
                EndGame(true);

            if (m_TimeManager.IsFinite && m_TimeManager.IsOver)
                EndGame(false);
        }
    }
    [System.Serializable]
    public class ScoreEntry
    {
        public string playerName;
        public int score;
    }

    public void EndGame(bool win)
    {
        
        // unlocks the cursor before leaving the scene, to be able to click buttons
        Cursor.lockState = CursorLockMode.None;
        Cursor.visible = true;

        m_TimeManager.StopRace();

        // Remember that we need to load the appropriate end scene after a delay
        gameState = win ? GameState.Won : GameState.Lost;
        gameObject.SetActive(true);
        if (win)
        {
            playerScoreLeaderBoard = (int)Math.Round(m_TimeManager.TotalTime - m_TimeManager.TimeRemaining);
            PlayerPrefs.SetInt("PlayerScore", playerScoreLeaderBoard);
            PlayerPrefs.SetString("PlayerName", playerName.name);
        
            
            /*
            float current_score = m_TimeManager.TotalTime - m_TimeManager.TimeRemaining;
            Dictionary<String,float> score_board = new Dictionary<string, float>();
            using (System.IO.StreamReader outputFile = new System.IO.StreamReader(Path.Combine(Application.persistentDataPath, "Assets/Karting/Scripts/high_score.txt"))){
                for(int i = 0; i < 5; i ++){
                    string line = outputFile.ReadLine();
                    string[] splitted_line = line.Split(' ');
                    score_board.Add(splitted_line[0], float.Parse(splitted_line[1]));
                }
            } 
            score_board.Add("Mateusz9856u0",current_score);
            Dictionary<String,float> sorted_score_board = new Dictionary<string, float>();
            for(int i = 0; i < 5; i++){
                float min = float.MaxValue;
                string min_name = "";
                foreach(KeyValuePair<String,float> pair in score_board){
                    if(pair.Value < min){
                        min_name = pair.Key;
                        min = pair.Value;
                    }
                }
                sorted_score_board.Add(min_name,min);
                score_board.Remove(min_name);
            }
            using (System.IO.StreamWriter outputFile = new System.IO.StreamWriter(Path.Combine(Application.persistentDataPath, "Assets/Karting/Scripts/high_score.txt")))
            {
                string display_scores_string = "";
                foreach(KeyValuePair<String,float> pair in sorted_score_board){
                    outputFile.WriteLine(pair.Key + " " + pair.Value);
                    display_scores_string += pair.Key + " " + pair.Value + "\n";
                }
                display_scores.SetText(display_scores_string);
                
            }
            */ 
            

            
            m_SceneToLoad = winSceneName;
            m_TimeLoadEndGameScene = Time.time + endSceneLoadDelay + delayBeforeFadeToBlack;

            // play a sound on win
            var audioSource = gameObject.AddComponent<AudioSource>();
            audioSource.clip = victorySound;
            audioSource.playOnAwake = false;
            audioSource.outputAudioMixerGroup = AudioUtility.GetAudioGroup(AudioUtility.AudioGroups.HUDVictory);
            audioSource.PlayScheduled(AudioSettings.dspTime + delayBeforeWinMessage);
            
            // create a game message
            winDisplayMessage.delayBeforeShowing = delayBeforeWinMessage;
            winDisplayMessage.gameObject.SetActive(true);
        }
        else
        {
            m_SceneToLoad = loseSceneName;
            m_TimeLoadEndGameScene = Time.time + endSceneLoadDelay + delayBeforeFadeToBlack;

            // create a game message
            loseDisplayMessage.delayBeforeShowing = delayBeforeWinMessage;
            loseDisplayMessage.gameObject.SetActive(true);
        }
    }
}
Leave a Comment