using System.Collections; using BlueWater.Audios; using BlueWater.Enemies; using BlueWater.Enemies.Bosses; using BlueWater.Uis; using BlueWater.Utility; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Maps { public class BossMapController : MapController { [SerializeField, Required] protected Transform BossSpawnTransform; [SerializeField] protected BossType BossType; [SerializeField, Required] protected BossMapTrigger BossMapTrigger; protected override void Start() { base.Start(); BossMapTrigger.OnInteractionActive += InitializeMap; BossMapTrigger.OnInteractionActive += CloseMapEntrances; } protected override void OnDestroy() { base.OnDestroy(); BossMapTrigger.OnInteractionActive -= InitializeMap; BossMapTrigger.OnInteractionActive -= CloseMapEntrances; } protected override void InitializeComponents() { base.InitializeComponents(); BossSpawnTransform = transform.Find("Spawns/BossSpawn"); BossMapTrigger = transform.Find("Props/2D/BossMapTrigger").GetComponent(); } public override void InitializeMap() { Utils.StartUniqueCoroutine(this, ref MapInitializeCoroutineInstance, InitializeMapCoroutine()); } protected virtual void InitializeBoss() { EnemyManager.Instance.InstantiateBoss(BossType, BossSpawnTransform.position, EnemyInstanceLocation); } public override void ResetMap(bool isHardReset = false) { DestroyAllObjects(); OpenMapEntrances(); switch (isHardReset) { case false when IsCleared: return; case true: IsCleared = false; break; } BossMapTrigger.ResetTrigger(); } public override void RestartMap() { StartCoroutine(RestartMapCoroutine()); } public override void ClearMap(GameObject bossObject) { IsCleared = true; StartCoroutine(ClearMapCoroutine(bossObject)); } protected virtual IEnumerator InitializeMapCoroutine() { DestroyAllObjects(); DataManager.Instance.CurrentSaveStage = SaveStage; if (!string.IsNullOrEmpty(BgmName)) { AudioManager.Instance.PlayBgm(BgmName); } CombatUiManager.Instance.FadeInOut(InitializeFadeInOutTime.x, InitializeFadeInOutTime.y); yield return new WaitForSeconds(InitializeFadeInOutTime.x + InitializeFadeInOutTime.y); InitializeBoss(); } protected virtual IEnumerator RestartMapCoroutine() { DestroyAllObjects(); DataManager.Instance.CurrentSaveStage = SaveStage; CombatUiManager.Instance.FieldBossHealthPointUi.SetActiveHpSlider(false); CombatUiManager.Instance.FadeInOut(InitializeFadeInOutTime.x, InitializeFadeInOutTime.y, new Color(0f, 0f, 0f, 0f), 1f); yield return new WaitForSeconds(InitializeFadeInOutTime.x); var currentCombatPlayer = GameManager.Instance.CurrentCombatPlayer; if (currentCombatPlayer) { Destroy(currentCombatPlayer.gameObject); } GameManager.Instance.InstantiateCombatPlayer(PlayerSpawnLocation.position, Quaternion.identity); BossMapTrigger.ResetTrigger(); OpenMapEntrances(); } protected virtual IEnumerator ClearMapCoroutine(GameObject bossObject) { GameManager.Instance.CurrentCombatPlayer.ActivateInvincibility(); VisualFeedbackManager.Instance.SetBaseTimeScale(0.1f); CombatUiManager.Instance.FadeInOut(ClearFadeInOutTime.x, ClearFadeInOutTime.y); var elapsedTime = 0f; while (elapsedTime <= 3f) { elapsedTime += Time.unscaledDeltaTime; yield return null; } DestroyAllEnemiesExceptBoss(bossObject); VisualFeedbackManager.Instance.SetBaseTimeScale(1f); elapsedTime = 0f; while (elapsedTime <= 2f) { elapsedTime += Time.unscaledDeltaTime; yield return null; } OpenMapEntrances(); GameManager.Instance.CurrentCombatPlayer.DeactivateInvincibility(); } } }