diff --git a/Assets/KSH/DungeonPanelController.cs b/Assets/KSH/DungeonPanelController.cs index 952bad9e..684b3e7a 100644 --- a/Assets/KSH/DungeonPanelController.cs +++ b/Assets/KSH/DungeonPanelController.cs @@ -10,9 +10,9 @@ public class DungeonPanelController : MonoBehaviour [SerializeField] private Image[] _playerHealthImages; // color 값 white / black 로 조정 private int _countHealth = 0; - public void SetBossHealthBar(float hp) // hp: 0~100 + public void SetBossHealthBar(float hp) // hp: 0~300 { - float normalizedHp = hp / 100f; // 0~1 사이 값으로 조정 + float normalizedHp = hp / 300f; // 0~1 사이 값으로 조정 _bossHealthBar.value = normalizedHp; } diff --git a/Assets/KSH/PlayerStats.cs b/Assets/KSH/PlayerStats.cs index 760b6f9b..ea614d58 100644 --- a/Assets/KSH/PlayerStats.cs +++ b/Assets/KSH/PlayerStats.cs @@ -41,14 +41,19 @@ public class PlayerStats : MonoBehaviour // 결근 이벤트 관련 변수 private bool _hasWorkedToday = false; + public bool HasWorkedToday => _hasWorkedToday; private bool _hasCheckedAbsenceToday = false; // 결근 체크, 하루에 결근 여러 번 체크 안하기 위함 public event Action OnAbsent; // 결근 // 말풍선 - private GameObject messagePanelInstance; - private SpeechBubbleFollower speechBubbleFollower; - private bool isActiveBubble; - private bool hasShownBubbleToday; // 하루에 말풍선 하나만 표시하기 + private GameObject _messagePanelInstance; + private SpeechBubbleFollower _speechBubbleFollower; + private bool _isActiveBubble; + private bool _hasShownBubbleToday; // 하루에 말풍선 하나만 표시하기 + + private int _mealCount; + public int MealCount => _mealCount; + private const int MAX_MEAL_COUNT = 2; // 하루 2회 제한 private void Awake() { @@ -77,6 +82,7 @@ public class PlayerStats : MonoBehaviour CheckBubble(); SceneManager.sceneLoaded += OnSceneLoaded; // 씬 전환 이벤트 + _mealCount = 0; // 식사 횟수 0회 } #region 말풍선(Bubble) 관련 @@ -96,10 +102,10 @@ public class PlayerStats : MonoBehaviour private void LoadMessagePanel() { - if (messagePanelInstance != null) // 기존 패널 파괴 + if (_messagePanelInstance != null) // 기존 패널 파괴 { - Destroy(messagePanelInstance); - messagePanelInstance = null; + Destroy(_messagePanelInstance); + _messagePanelInstance = null; } GameObject messagePanelPrefab = Resources.Load("Prefabs/MessagePanel"); @@ -108,49 +114,57 @@ public class PlayerStats : MonoBehaviour { Canvas canvas = FindObjectOfType(); - messagePanelInstance = Instantiate(messagePanelPrefab, canvas.transform); - speechBubbleFollower = messagePanelInstance.GetComponent(); - speechBubbleFollower.SetPlayerTransform(); + _messagePanelInstance = Instantiate(messagePanelPrefab, canvas.transform); + _speechBubbleFollower = _messagePanelInstance.GetComponent(); + _speechBubbleFollower.SetPlayerTransform(); - if (speechBubbleFollower != null) + if (_speechBubbleFollower != null) { - isActiveBubble = false; - hasShownBubbleToday = false; - speechBubbleFollower.HideMessage(); + _isActiveBubble = false; + _hasShownBubbleToday = false; + _speechBubbleFollower.HideMessage(); } } } private void CheckBubble() { - if (isActiveBubble) + if (_isActiveBubble) { - isActiveBubble = false; + _isActiveBubble = false; HideBubble(); } - if (TimeStat >= 8.0f && TimeStat < 9.0f && !isActiveBubble && !hasShownBubbleToday) + if (TimeStat >= 8.0f && TimeStat < 9.0f && !_isActiveBubble && !_hasShownBubbleToday) { - hasShownBubbleToday = true; - isActiveBubble = true; + _hasShownBubbleToday = true; + _isActiveBubble = true; ShowBubble(); } } + private InteractionAnimationPanelController _interactionAnimation; + public void SetInteractionPanelController(InteractionAnimationPanelController panelController) + { + _interactionAnimation = panelController; + } + public void ShowBubble() { - if(isActiveBubble) - speechBubbleFollower.ShowMessage(); + if (_interactionAnimation.IsPanelActive()) return; + + if(_isActiveBubble) + _speechBubbleFollower.ShowMessage(); } public void HideBubble() { - speechBubbleFollower.HideMessage(); + _speechBubbleFollower.HideMessage(); } public void ShowAndHideBubble(string text) { - speechBubbleFollower.ShowAndHide(text); + _speechBubbleFollower.ShowAndHide(text); } #endregion @@ -172,13 +186,17 @@ public class PlayerStats : MonoBehaviour // 9시가 지났는데 출근하지 않은 경우 if (TimeStat >= 9.0f && !_hasWorkedToday) { - _hasCheckedAbsenceToday = true; // 결근 체크 완료 표시 - OnAbsent?.Invoke(); - - PerformAction(ActionType.Absence); // 평판 -3 - Debug.Log("결근 처리: 평판 감소" + ReputationStat); + PerformAbsent(); } } + + public void PerformAbsent() // 강제 결근 이벤트 + { + _hasCheckedAbsenceToday = true; // 결근 체크 완료 표시 + OnAbsent?.Invoke(); + + PerformAction(ActionType.Absence); // 평판 -3 + } // 행동 처리 메서드 public void PerformAction(ActionType actionType) @@ -200,6 +218,16 @@ public class PlayerStats : MonoBehaviour _hasWorkedToday = true; OnWorked?.Invoke(); } + + if (actionType == ActionType.Eat) + { + _mealCount++; + } + } + + public bool CanEat() + { + return _mealCount < MAX_MEAL_COUNT; // 식사 횟수 0,1 일 때만 true } // 출근 가능 여부 확인 메서드 @@ -271,7 +299,10 @@ public class PlayerStats : MonoBehaviour // 결근 관련 변수 초기화 _hasWorkedToday = false; _hasCheckedAbsenceToday = false; - hasShownBubbleToday = false; + _hasShownBubbleToday = false; + + // 식사 횟수 초기화 + _mealCount = 0; OnDayEnded?.Invoke(); } @@ -302,7 +333,7 @@ public class PlayerStats : MonoBehaviour { EndDay(time, actionType); } - + CheckBubble(); } diff --git a/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs b/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs index 39261270..28ec589e 100644 --- a/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs +++ b/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs @@ -12,14 +12,14 @@ public class InteractionController : MonoBehaviour [Header("UI 연동")] [SerializeField] private HousingCanvasController housingCanvasController; - [SerializeField] private InteractionAnimationPanelController interactionAnimationPanelController; - + private void Start() { PlayerStats.Instance.OnWorked += SuddenAfterWorkEventHappen; + PlayerStats.Instance.SetInteractionPanelController(interactionAnimationPanelController); } - + // 상호작용 가능한 사물 범위에 들어올 때 private void OnTriggerEnter(Collider other) { @@ -72,6 +72,12 @@ public class InteractionController : MonoBehaviour return; } } + + if (interactionType == ActionType.Eat && !PlayerStats.Instance.CanEat()) // 식사 횟수 제한 체크 + { + PlayerStats.Instance.ShowAndHideBubble("배불러서 못 먹어"); + return; + } if (interactionType == ActionType.Dungeon) { @@ -117,6 +123,20 @@ public class InteractionController : MonoBehaviour housingCanvasController.ShowSuddenEventPanel(suddenEventText, () => { + if (afterWorkEventType == AfterWorkEventType.OvertimeWork) + { + if (!PlayerStats.Instance.CanPerformByHealth(ActionType.OvertimeWork)) + { + PlayerStats.Instance.ShowAndHideBubble("체력이 없어..."); + return; + } + PlayerStats.Instance.PerformAction(ActionType.OvertimeWork); + } + else + { + PlayerStats.Instance.PerformAction(ActionType.TeamDinner); + } + housingCanvasController.ShowSuddenEventImage(afterWorkEventType); GameManager.Instance.PlaySuddenEventSound(afterWorkEventType); }); diff --git a/Assets/LIN/Scripts/UI/InteractionAnimationPanelController.cs b/Assets/LIN/Scripts/UI/InteractionAnimationPanelController.cs index db35f2c9..e255dbce 100644 --- a/Assets/LIN/Scripts/UI/InteractionAnimationPanelController.cs +++ b/Assets/LIN/Scripts/UI/InteractionAnimationPanelController.cs @@ -17,15 +17,27 @@ public class InteractionAnimationPanelController : MonoBehaviour private Coroutine _textAnimCoroutine; private Coroutine _autoHideCoroutine; private Canvas _parentCanvas; + + private bool _isAbsenceToday = false; public void SetDoingText(string text) { doingText.text = text; } + public bool IsPanelActive() + { + return panel.activeSelf; + } + public void ShowAnimationPanel(ActionType actionType, string animationText) { PlayerStats.Instance.HideBubble(); + + if (actionType == ActionType.Sleep && !PlayerStats.Instance.HasWorkedToday) // 결근 + { + _isAbsenceToday = true; + } // 1) 패널 활성화 panel.SetActive(true); @@ -110,6 +122,12 @@ public class InteractionAnimationPanelController : MonoBehaviour StopCoroutine(_autoHideCoroutine); _autoHideCoroutine = null; } + + if (_isAbsenceToday) // 결근한 경우 + { + PlayerStats.Instance.PerformAbsent(); + return; + } // 패널 닫히고 결근 체크, 상호작용 패널과 결근 엔딩 채팅창이 겹치지 않기 위함 PlayerStats.Instance.CheckAbsent(); diff --git a/Assets/Prefabs/ReHousing/Canvas.prefab b/Assets/Prefabs/ReHousing/Canvas.prefab index 195c6435..ae7b3068 100644 --- a/Assets/Prefabs/ReHousing/Canvas.prefab +++ b/Assets/Prefabs/ReHousing/Canvas.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b58d1e425ae623c58be2dc7e1b656e5b84cd237f9ddef335ca6240e3156fbee8 -size 122602 +oid sha256:8ef56bd2322d2b44a47c1693f1f411a98b87aee6e2f2dec83026a81fd6128ead +size 128216 diff --git a/Assets/Scripts/Character/CharacterBase.cs b/Assets/Scripts/Character/CharacterBase.cs index 2624d9b2..8dfb897c 100644 --- a/Assets/Scripts/Character/CharacterBase.cs +++ b/Assets/Scripts/Character/CharacterBase.cs @@ -7,7 +7,7 @@ public abstract class CharacterBase : MonoBehaviour { [Header("기본 능력치")] public string characterName; // 이름 - public int maxHP = 100; // 최대 체력 + private int maxHP = 300; // 최대 체력 public int currentHP; // 현재 체력 public float attackPower = 10f; // 공격력 public float defensePower = 5f; // 방어력