diff --git a/Assets/KSH/PlayerStats.cs b/Assets/KSH/PlayerStats.cs index 2438671d..3af888fa 100644 --- a/Assets/KSH/PlayerStats.cs +++ b/Assets/KSH/PlayerStats.cs @@ -91,6 +91,24 @@ public class PlayerStats : MonoBehaviour,ISaveable GameManager.Instance.SetEvents(); SceneManager.sceneLoaded += OnSceneLoaded; // 씬 전환 이벤트 _mealCount = 0; // 식사 횟수 0회 + + var panel = FindObjectOfType(); + if (panel != null) + { + PlayerStats.Instance.SetInteractionPanelController(panel); + } + } + + private void TriggerExhaustion() + { + if (HealthStat > 0) return; + + Exhaustion?.Invoke(); // 탈진 이벤트 발생 + } + + public InteractionAnimationPanelController GetInteractionPanelController() + { + return _interactionAnimation; } #region 말풍선(Bubble) 관련 @@ -373,7 +391,8 @@ public class PlayerStats : MonoBehaviour,ISaveable // 탈진 이벤트 발생 Debug.Log("탈진! 체력 0"); - Exhaustion?.Invoke(); + GameManager.Instance.gotoBed = true; + Invoke(nameof(TriggerExhaustion), 2f); } if (HealthStat > MaxHealth) diff --git a/Assets/Scripts/Common/Dialogue/ChatWindowController.cs b/Assets/Scripts/Common/Dialogue/ChatWindowController.cs index 8e4c61be..3c9147ba 100644 --- a/Assets/Scripts/Common/Dialogue/ChatWindowController.cs +++ b/Assets/Scripts/Common/Dialogue/ChatWindowController.cs @@ -66,13 +66,19 @@ public class ChatWindowController : MonoBehaviour, IPointerClickHandler private void Start() { _dialogueManager = new FairyDialogueManager(this); - + onComplete += SetCompleteEvent; + /*onComplete = () => { // 대화문 종료 call back Debug.Log("대화가 완료되었습니다."); };*/ } + private void SetCompleteEvent() + { + GameManager.Instance.gotoBed = true; + } + // 외부 호출용 함수 (대화 시작) public void SetGamePhase(GamePhase phase) { diff --git a/Assets/Scripts/Common/GameManager.cs b/Assets/Scripts/Common/GameManager.cs index 85bd6035..422baaf7 100644 --- a/Assets/Scripts/Common/GameManager.cs +++ b/Assets/Scripts/Common/GameManager.cs @@ -26,6 +26,10 @@ public partial class GameManager : Singleton,ISaveable private PanelManager panelManager; public PanelManager PanelManager => panelManager; + //탈진 관련 + [HideInInspector] + public bool gotoBed = false; + private void Start() { // 오디오 초기화 @@ -34,11 +38,18 @@ public partial class GameManager : Singleton,ISaveable //패널 매니저 생성 panelManager = Instantiate(Resources.Load("Prefabs/PanelManager")).GetComponent(); } + + private IEnumerator DelayedForcedSleep(float delay) + { + yield return new WaitForSeconds(delay); + PlayerStats.Instance.PerformAction(ActionType.ForcedSleep); + } #region 대화 관련 public void StartNPCDialogue(GamePhase phase) // intro, gameplay, end 존재 { + gotoBed = false; StartCoroutine(StartNPCDialogueCoroutine(phase)); } @@ -77,6 +88,7 @@ public partial class GameManager : Singleton,ISaveable { PlayerStats.Instance.OnDayEnded += AdvanceDay; // 날짜 변경 PlayerStats.Instance.ZeroReputation += ZeroReputationEnd; // 평판 0 엔딩 + PlayerStats.Instance.Exhaustion += ExhaustionToSleep; // 탈진 이벤트 } // 날짜 진행 @@ -92,20 +104,72 @@ public partial class GameManager : Singleton,ISaveable } } + // 탈진 + private void ExhaustionToSleep() + { + StartCoroutine(WaitOtherEvents()); + } + + private IEnumerator WaitOtherEvents() + { + yield return new WaitForSeconds(Time.deltaTime); + + if (gotoBed) + { + var panel = PlayerStats.Instance.GetInteractionPanelController(); + + if (panel != null) + { + panel.ShowAnimationPanel(ActionType.Sleep, "탈진했습니다"); + GameManager.Instance.StartCoroutine(DelayedForcedSleep(2.0f)); // 애니메이션 끝나고 강제 수면 처리 + } + else + { + PlayerStats.Instance.PerformAction(ActionType.ForcedSleep); + } + + gotoBed = false; + } + else + { + StartCoroutine(WaitOtherEvents()); + } + } + public void ChangeToGameScene() { tryStageCount++; // 던전 시도 횟수 증가 SceneManager.LoadScene("ReDungeon"); // 던전 Scene HandleSceneAudio("Dungeon"); + StartCoroutine(CheckDungeonScene()); + } + private IEnumerator CheckDungeonScene() + { + yield return new WaitForSeconds(Time.deltaTime); + + if (SceneManager.GetActiveScene().name == "ReDungeon") + gotoBed = false; + else + StartCoroutine(CheckHomeScene()); } public void ChangeToHomeScene() { SceneManager.LoadScene("ReHousing"); // Home Scene HandleSceneAudio("Housing"); - + StartCoroutine(CheckHomeScene()); if (tryStageCount >= 3) FailEnd(); // 엔딩 } + + private IEnumerator CheckHomeScene() + { + yield return new WaitForSeconds(Time.deltaTime); + + if (SceneManager.GetActiveScene().name == "ReHousing") + gotoBed = true; + else + StartCoroutine(CheckHomeScene()); + } // TODO: Open Setting Panel 등 Panel 처리