using UnityEngine; using UnityEngine.UI; // Needed for UI using System.Collections; using TMPro; // Optional, if you want "Sweet Dreams" text public class WinZone : MonoBehaviour { [Header("UI Settings")] public GameObject blackScreenPanel; public TextMeshProUGUI winText; // Assign a TMP text that says "Sweet Dreams" public float fadeDuration = 3f; [Header("Audio")] public AudioSource playerAudioSource; // To stop footsteps/breathing public AudioClip winSound; // Gentle lullaby or peaceful sound private bool hasWon = false; void OnTriggerEnter(Collider other) { if (other.CompareTag("Player") && !hasWon) { // Only win if lights are OFF (optional check) if (GameManager.Instance != null && !GameManager.Instance.AreAnyLightsOn()) { StartCoroutine(WinSequence(other.gameObject)); } } } IEnumerator WinSequence(GameObject player) { hasWon = true; Debug.Log("Player reached the top! Winning..."); // 1. Disable Player Controls immediately PlayerController pc = player.GetComponent(); if (pc != null) pc.enabled = false; // 2. Disable the Staircase Curse so they don't die while fading StaircaseCurse curse = FindObjectOfType(); if (curse != null) curse.enabled = false; // 3. Play Win Sound if (playerAudioSource != null && winSound != null) playerAudioSource.PlayOneShot(winSound); // 4. Fade to Black if (blackScreenPanel != null) { blackScreenPanel.SetActive(true); CanvasGroup cg = blackScreenPanel.GetComponent(); // If no CanvasGroup exists, add one if (cg == null) cg = blackScreenPanel.AddComponent(); float timer = 0f; while (timer < fadeDuration) { timer += Time.deltaTime; cg.alpha = timer / fadeDuration; // Fade from 0 to 1 yield return null; } cg.alpha = 1f; } // 5. Show Text if (winText != null) winText.gameObject.SetActive(true); // 6. Quit Game (or wait and load menu) yield return new WaitForSeconds(3f); Debug.Log("Quitting Application..."); Application.Quit(); } }