using System.Collections; using TMPro; using Unity.PlasticSCM.Editor.WebApi; using UnityEditor.UI; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.SceneManagement; using UnityEngine.UI; public class GameManager : MonoBehaviour { public enum GameState { InMainMenu, Paused, Playing, GameOver, Won } //private PlayerData playerData; //private SaveManager saveManager; public static GameManager gameManagerInstance { get; private set; } [SerializeField] AudioSource audioSource; [SerializeField] int currentOrbCounter; [SerializeField] int maximumOrbs; public GenerateOrbs generator; public TMP_InputField userSeed; public int seed; [SerializeField] TextMeshProUGUI orbCounterText; private float initialTime; [SerializeField] float timeUntilNightfall; [SerializeField] TextMeshProUGUI timerText; public bool bHasTimerStarted; [SerializeField] GameObject player; [SerializeField] Transform playerTransform; public bool bHasPlayerLanded; public bool bIsGameStarted = false; public GameState gameState = GameState.InMainMenu; private void Awake() { if(gameManagerInstance == null) { gameManagerInstance = this; initialTime = timeUntilNightfall; SceneManager.sceneLoaded += OnSceneLoaded; //saveManager = GetComponent(); //playerData = saveManager.LoadGame(); /*if (playerData != null) { SetPlayerData(); } else { playerData = new PlayerData(); }*/ DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if(scene.name == "MainMap") { bIsGameStarted = false; audioSource.mute = false; currentOrbCounter = 0; timeUntilNightfall = initialTime; playerTransform = GameObject.Find("Player").transform; player = GameObject.Find("Player"); GameObject orbObject = GameObject.Find("Orb_Text"); if (orbObject) { orbCounterText = orbObject.GetComponent(); } GameObject timerObject = GameObject.Find("Timer"); if (timerObject) { timerText = timerObject.GetComponent(); } StartCoroutine(WaitAndSpawnOrbs()); UpdateOrbUI(); UpdateTimerUI(); } else if(scene.name == "MainMenu") { if (audioSource.mute) { audioSource.mute = false; } currentOrbCounter = 0; timeUntilNightfall = initialTime; userSeed = GameObject.Find("SeedField").GetComponent(); } else if(scene.name == "VictoryScene") { audioSource.mute = true; currentOrbCounter = 0; timeUntilNightfall = initialTime; } else if(scene.name == "GameOverScene") { audioSource.mute = true; currentOrbCounter = 0; timeUntilNightfall = initialTime; } } IEnumerator WaitAndSpawnOrbs() { yield return null; yield return new WaitForFixedUpdate(); generator = GetComponent(); if (generator) generator.StartGenerating(playerTransform); } private void Update() { if (gameState == GameState.Playing && !bHasPlayerLanded) { if (playerTransform != null) { if (Physics.Raycast(playerTransform.position, Vector3.down, out RaycastHit hit, 2f)) { if (hit.collider.CompareTag("Floor")) { bHasPlayerLanded = true; } } } } if (gameState == GameState.Playing && bIsGameStarted) { HandleTimer(); } } private void HandleTimer() { if(timeUntilNightfall > 0) { timeUntilNightfall -= Time.deltaTime; UpdateTimerUI(); } else { timeUntilNightfall = 0; GameOver(); } } private void UpdateTimerUI() { if (timerText) { int minutes = Mathf.FloorToInt(timeUntilNightfall / 60); int seconds = Mathf.FloorToInt(timeUntilNightfall % 60); timerText.text = string.Format("{0:00}:{1:00}", minutes, seconds); } } public void IncreaseOrbCounter() { currentOrbCounter++; UpdateOrbUI(); CheckAllOrbsCollected(); } private void UpdateOrbUI() { if(orbCounterText != null) { orbCounterText.text = currentOrbCounter + "/" + maximumOrbs; } } private void CheckAllOrbsCollected() { if(currentOrbCounter >= maximumOrbs) { gameState = GameState.Won; SceneManager.LoadScene("VictoryScene"); } } private void GameOver() { gameState = GameState.GameOver; SceneManager.LoadScene("GameOverScene"); } public void StartGame() { gameState = GameState.Playing; bHasPlayerLanded = false; if (userSeed != null) { //PlayerData playerData = new PlayerData(); if (!int.TryParse(userSeed.text, out int number)) { System.Random randomSeed = new System.Random(); seed = randomSeed.Next(); } else { seed = number; } } else { System.Random randomSeed = new System.Random(); seed = randomSeed.Next(); } //saveManager.SaveGame(playerData); SceneManager.LoadScene("MainMap"); } /* public void LoadGame() { PlayerData playerData = saveManager.LoadGame(); if(playerData != null) { SceneManager.LoadScene("MainMap"); } else { Debug.LogError("No save found"); } }*/ public void GoBackToMainMenu() { gameState = GameState.InMainMenu; SceneManager.LoadScene("MainMenu"); } public int GetMaximumOrbs() { return maximumOrbs; } /* void GetPlayerData() { if(player != null) { playerData.playerPosition = player.transform.position; } playerData.numberOfOrbsCollected = currentOrbCounter; //playerData.orbs = generator.orbs; }*/ /* void SetPlayerData() { if(playerData.playerPosition != Vector3.zero && player != null) { player.transform.position = playerData.playerPosition; } currentOrbCounter = playerData.numberOfOrbsCollected; UpdateOrbUI(); }*/ /* public void SaveData() { GetPlayerData(); saveManager.SaveGame(playerData); }*/ }