using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using TMPro; public class GameController : MonoBehaviour { int progressAmount; // Tracks coin progress toward level completion public Slider progressSlider; // Reference to UI slider showing progress public TMP_Text survivedText; // Text UI for how many levels the player survived public TMP_Text levelText; // UI text that displays the current level public GameObject player; // Reference to the player GameObject public GameObject LoadCanvas; // UI canvas shown when player can load next level public List levels; // List of all levels in the game private int currentLevelIndex = 0; // Current level index in the levels list public GameObject gameOverScreen; // UI canvas shown on game over private int survivedLevelsCount; // Number of levels the player has survived public static event Action OnReset; // Event called when game resets void Start() { progressAmount = 0; progressSlider.value = 0; // Subscribe to events Coin.OnCoinCollect += IncreaseProgressAmount; HoldToLoadLevel.OnHoldComplete += LoadNextLevel; PlayerHealth.OnPlayerDied += HandlePlayerDeath; LoadCanvas.SetActive(false); // Hide load UI at start gameOverScreen.SetActive(false); // Hide game over screen at start Time.timeScale = 1; // Resume time (in case game was paused before) // Set initial level text levelText.text = "LEVEL " + (currentLevelIndex + 1); } void HandlePlayerDeath() { GameOverScreen(); // Show game over screen when player dies } void GameOverScreen() { gameOverScreen.SetActive(true); // Show game over UI survivedText.text = "YOU SURVIVED " + survivedLevelsCount + " LEVEL"; if (survivedLevelsCount != 1) survivedText.text += "S"; // Pluralize if needed Time.timeScale = 0; // Pause the game } public void ResetGame() { gameOverScreen.SetActive(false); // Hide game over screen survivedLevelsCount = 0; // Reset survived counter LoadLevel(0, false); // Reload first level OnReset?.Invoke(); // Trigger reset event Time.timeScale = 1; // Resume time levelText.text = "LEVEL " + (currentLevelIndex + 1); // Reset level text } public void LoadMainMenu() { Time.timeScale = 1; // Ensure game isn't paused when loading menu SceneManager.LoadScene("StartScenes"); // Load start scene } public void ExitGame() { #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; // Stop play mode in editor #else Application.Quit(); // Quit application in build #endif } void OnDestroy() { // Unsubscribe from events to prevent memory leaks Coin.OnCoinCollect -= IncreaseProgressAmount; HoldToLoadLevel.OnHoldComplete -= LoadNextLevel; PlayerHealth.OnPlayerDied -= HandlePlayerDeath; } void IncreaseProgressAmount(int amount) { progressAmount += amount; // Add collected coin amount progressSlider.value = progressAmount; // Update progress bar if (progressAmount >= 60) { LoadCanvas.SetActive(true); // Show load level prompt Debug.Log("Level Complete!"); } } void LoadLevel(int level, bool wantSurvivedIncrease) { LoadCanvas.SetActive(false); // Hide load UI levels[currentLevelIndex].SetActive(false); // Deactivate current level levels[level].SetActive(true); // Activate next level player.transform.position = new Vector3(-6.62f, -1.58f, 0f); // Reset player position currentLevelIndex = level; // Update level index progressAmount = 0; // Reset progress progressSlider.value = 0; levelText.text = "LEVEL " + (level + 1); // Update level display if (wantSurvivedIncrease) survivedLevelsCount++; // Increment survived counter if applicable } void LoadNextLevel() { int nextLevelIndex = currentLevelIndex + 1; Debug.Log($"Trying to load level {nextLevelIndex} / total levels {levels.Count}"); if (nextLevelIndex < levels.Count) { LoadLevel(nextLevelIndex, true); // Load next level and count as survived } else { Debug.Log("Final level completed or no more levels to load."); GameOverScreen(); // Show game over if no more levels } } }