using UnityEngine; using Core.Lifecycle; namespace Minigames.BirdPooper { /// /// Central game manager for Bird Pooper minigame. /// Manages game flow, UI, obstacle spawning, and reacts to player events. /// Singleton pattern for easy access. /// public class BirdPooperGameManager : ManagedBehaviour { private static BirdPooperGameManager _instance; public static BirdPooperGameManager Instance => _instance; [Header("References")] [SerializeField] private BirdPlayerController player; [SerializeField] private ObstacleSpawner obstacleSpawner; [SerializeField] private GameOverScreen gameOverScreen; internal override void OnManagedAwake() { base.OnManagedAwake(); // Set singleton instance if (_instance != null && _instance != this) { Debug.LogWarning("[BirdPooperGameManager] Multiple instances detected! Destroying duplicate."); Destroy(gameObject); return; } _instance = this; // Validate references if (player == null) { Debug.LogError("[BirdPooperGameManager] Player reference not assigned!"); } if (obstacleSpawner == null) { Debug.LogError("[BirdPooperGameManager] ObstacleSpawner reference not assigned!"); } if (gameOverScreen == null) { Debug.LogError("[BirdPooperGameManager] GameOverScreen reference not assigned!"); } else { // Hide game over screen on start gameOverScreen.gameObject.SetActive(false); } } internal override void OnManagedStart() { base.OnManagedStart(); // Subscribe to player events if (player != null) { player.OnPlayerDamaged.AddListener(HandlePlayerDamaged); Debug.Log("[BirdPooperGameManager] Subscribed to player damaged event"); } // Start obstacle spawning if (obstacleSpawner != null) { obstacleSpawner.StartSpawning(); Debug.Log("[BirdPooperGameManager] Started obstacle spawning"); } } internal override void OnManagedDestroy() { // Unsubscribe from player events if (player != null) { player.OnPlayerDamaged.RemoveListener(HandlePlayerDamaged); } // Clear singleton if (_instance == this) { _instance = null; } base.OnManagedDestroy(); } /// /// Called when player takes damage/dies. /// Shows game over screen. /// private void HandlePlayerDamaged() { Debug.Log("[BirdPooperGameManager] Player damaged - showing game over screen"); // Stop spawning obstacles if (obstacleSpawner != null) { obstacleSpawner.StopSpawning(); } // Show game over screen if (gameOverScreen != null) { gameOverScreen.Show(); } else { Debug.LogError("[BirdPooperGameManager] GameOverScreen reference missing!"); } } } }