GameManager.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. using UnityEngine;
  2. using System.Collections;
  3. public class GameManager : MonoBehaviour
  4. {
  5. public static GameManager Instance { get; private set; }
  6. [Header("References")]
  7. public TeamCohesionManager cohesionManager;
  8. public CheckpointSystem checkpointSystem;
  9. public DeathScreenUI deathScreenUI;
  10. public GridMovement playerMovement;
  11. [Header("Death & Respawn Settings")]
  12. public float deathDelay = 2f;
  13. public float respawnFadeTime = 1f;
  14. public bool resetMonstersOnRespawn = false;
  15. [Header("Optional Penalties")]
  16. public bool applyGoldPenalty = false;
  17. public float goldPenaltyPercent = 0f;
  18. private bool isPlayerDead = false;
  19. private CanvasGroup fadeCanvasGroup;
  20. private void Awake()
  21. {
  22. if (Instance != null && Instance != this)
  23. {
  24. Destroy(gameObject);
  25. return;
  26. }
  27. Instance = this;
  28. CreateFadeOverlay();
  29. }
  30. private void Start()
  31. {
  32. FindReferences();
  33. ValidateSetup();
  34. }
  35. private void FindReferences()
  36. {
  37. if (cohesionManager == null)
  38. cohesionManager = FindFirstObjectByType<TeamCohesionManager>();
  39. if (checkpointSystem == null)
  40. checkpointSystem = FindFirstObjectByType<CheckpointSystem>();
  41. if (deathScreenUI == null)
  42. deathScreenUI = FindFirstObjectByType<DeathScreenUI>();
  43. if (playerMovement == null)
  44. playerMovement = FindFirstObjectByType<GridMovement>();
  45. }
  46. private void ValidateSetup()
  47. {
  48. bool hasAllReferences = cohesionManager != null && checkpointSystem != null &&
  49. deathScreenUI != null && playerMovement != null;
  50. }
  51. public void OnPartyWiped()
  52. {
  53. if (isPlayerDead) return;
  54. isPlayerDead = true;
  55. StartCoroutine(HandleDeathSequence());
  56. }
  57. private IEnumerator HandleDeathSequence()
  58. {
  59. if (playerMovement != null)
  60. playerMovement.enabled = false;
  61. StopAllMonsterAttacks();
  62. yield return new WaitForSeconds(deathDelay);
  63. yield return StartCoroutine(FadeToBlack(respawnFadeTime));
  64. if (deathScreenUI != null)
  65. {
  66. deathScreenUI.Show();
  67. }
  68. else
  69. {
  70. RespawnParty();
  71. }
  72. }
  73. public void RespawnParty()
  74. {
  75. StartCoroutine(RespawnSequence());
  76. }
  77. private IEnumerator RespawnSequence()
  78. {
  79. if (deathScreenUI != null)
  80. deathScreenUI.Hide();
  81. yield return new WaitForSeconds(0.2f);
  82. if (checkpointSystem != null)
  83. {
  84. checkpointSystem.LoadCheckpoint();
  85. }
  86. else
  87. {
  88. BasicRespawn();
  89. }
  90. if (applyGoldPenalty && goldPenaltyPercent > 0)
  91. ApplyGoldPenalty();
  92. if (resetMonstersOnRespawn)
  93. ResetMonsters();
  94. yield return new WaitForSeconds(0.3f);
  95. yield return StartCoroutine(FadeFromBlack(respawnFadeTime));
  96. if (playerMovement != null)
  97. playerMovement.enabled = true;
  98. isPlayerDead = false;
  99. }
  100. private void BasicRespawn()
  101. {
  102. if (cohesionManager == null || cohesionManager.groupMembers == null) return;
  103. foreach (var character in cohesionManager.groupMembers)
  104. {
  105. character.currentHP = character.maxHP;
  106. character.currentFatigue = character.maxFatigue;
  107. character.currentMana = character.maxMana;
  108. UIUpdater.Instance?.UpdateCharacterHP(character);
  109. UIUpdater.Instance?.UpdateCharacterFatigue(character);
  110. }
  111. }
  112. private void StopAllMonsterAttacks()
  113. {
  114. MonsterFormationGroup[] monsterGroups = FindObjectsByType<MonsterFormationGroup>(FindObjectsSortMode.None);
  115. foreach (var group in monsterGroups)
  116. {
  117. group.StopAllCoroutines();
  118. group.isChasing = false;
  119. group.hasDetectedPlayer = false;
  120. foreach (var monster in group.frontRow)
  121. {
  122. if (monster != null)
  123. monster.StopMove();
  124. }
  125. foreach (var monster in group.backRow)
  126. {
  127. if (monster != null)
  128. monster.StopMove();
  129. }
  130. }
  131. }
  132. private void ResetMonsters()
  133. {
  134. MonsterFormationGroup[] monsterGroups = FindObjectsByType<MonsterFormationGroup>(FindObjectsSortMode.None);
  135. foreach (var group in monsterGroups)
  136. {
  137. group.StopAllCoroutines();
  138. group.isChasing = false;
  139. group.hasDetectedPlayer = false;
  140. }
  141. }
  142. private void ApplyGoldPenalty()
  143. {
  144. // TODO: Implement gold penalty when currency system exists
  145. }
  146. private void CreateFadeOverlay()
  147. {
  148. GameObject fadeObj = new GameObject("FadeOverlay");
  149. fadeObj.transform.SetParent(transform);
  150. Canvas canvas = fadeObj.AddComponent<Canvas>();
  151. canvas.renderMode = RenderMode.ScreenSpaceOverlay;
  152. canvas.sortingOrder = 100;
  153. fadeCanvasGroup = fadeObj.AddComponent<CanvasGroup>();
  154. fadeCanvasGroup.alpha = 0f;
  155. fadeCanvasGroup.interactable = false;
  156. fadeCanvasGroup.blocksRaycasts = false;
  157. GameObject panel = new GameObject("BlackPanel");
  158. panel.transform.SetParent(fadeObj.transform, false);
  159. UnityEngine.UI.Image image = panel.AddComponent<UnityEngine.UI.Image>();
  160. image.color = Color.black;
  161. RectTransform rect = panel.GetComponent<RectTransform>();
  162. rect.anchorMin = Vector2.zero;
  163. rect.anchorMax = Vector2.one;
  164. rect.sizeDelta = Vector2.zero;
  165. }
  166. private IEnumerator FadeToBlack(float duration)
  167. {
  168. float elapsed = 0f;
  169. while (elapsed < duration)
  170. {
  171. elapsed += Time.deltaTime;
  172. fadeCanvasGroup.alpha = Mathf.Lerp(0f, 1f, elapsed / duration);
  173. yield return null;
  174. }
  175. fadeCanvasGroup.alpha = 1f;
  176. }
  177. private IEnumerator FadeFromBlack(float duration)
  178. {
  179. float elapsed = 0f;
  180. while (elapsed < duration)
  181. {
  182. elapsed += Time.deltaTime;
  183. fadeCanvasGroup.alpha = Mathf.Lerp(1f, 0f, elapsed / duration);
  184. yield return null;
  185. }
  186. fadeCanvasGroup.alpha = 0f;
  187. }
  188. public bool IsPlayerDead() => isPlayerDead;
  189. }