DEG-168 [FEAT] 돌발이벤트 후 강제숙면, 생활 능력치 업그레이드 #61

Merged
jay merged 6 commits from DEG-168-돌발이벤트-후-강제숙면-생활-능력치-업그레이드 into main 2025-05-14 09:06:39 +00:00
6 changed files with 88 additions and 16 deletions
Showing only changes of commit c3ade04d2d - Show all commits

View File

@ -39,6 +39,11 @@ public class PlayerStats : MonoBehaviour,ISaveable
public static PlayerStats Instance;
private float additionalMaxHealth = 0f;
public float MaxHealth => _gameConstants.maxHealth + additionalMaxHealth;
public ActionType LastAction { get; private set; }
// 결근 이벤트 관련 변수
private bool _hasWorkedToday = false;
public bool HasWorkedToday => _hasWorkedToday;
@ -203,16 +208,29 @@ public class PlayerStats : MonoBehaviour,ISaveable
{
// 액션에 따른 스탯 소모 값 가져오기
ActionEffect effect = _valueByAction.GetActionEffect(actionType);
// 스탯 변경 적용
LastAction = actionType;
// 선 처리: 특수 보상 먼저 (야근, 회식)
if (actionType == ActionType.OvertimeWork)
{
additionalMaxHealth += 1f;
}
else if (actionType == ActionType.TeamDinner)
{
ModifyReputation(1f);
}

Mathf.Abs(effect.reputationChange) > 0.01f를 하신 이유가 있을까요?
0값인 경우에는 계산을 안하기 위함인가요?

Mathf.Abs(effect.reputationChange) > 0.01f를 하신 이유가 있을까요? 0값인 경우에는 계산을 안하기 위함인가요?
Outdated
Review

넵 맞습니다 이전에 결근 이벤트가 자동 적용되어서 자꾸 -3일때 값이 들어가는걸 막으려고 처리했었습니다.

넵 맞습니다 이전에 결근 이벤트가 자동 적용되어서 자꾸 -3일때 값이 들어가는걸 막으려고 처리했었습니다.

그럼 반대로 결근 이벤트가 제대로 작동하지 않는 문제는 없나요?

그럼 반대로 결근 이벤트가 제대로 작동하지 않는 문제는 없나요?
Outdated
Review

오 생각치 못한 부분이네요 결근 이벤트는 따로 호출하는걸로 보여서 저렇게 처리했던건데 저기서 처리하나요?..그러면 해당 처리 수정하겠습니다

오 생각치 못한 부분이네요 결근 이벤트는 따로 호출하는걸로 보여서 저렇게 처리했던건데 저기서 처리하나요?..그러면 해당 처리 수정하겠습니다
// 순수 스탯 변경 적용
ModifyTime(effect.timeChange, actionType);
ModifyHealth(effect.healthChange);
ModifyReputation(effect.reputationChange);
// 스탯 변경 이벤트 (UI 업데이트용)
if (Mathf.Abs(effect.reputationChange) > 0.01f)
{
ModifyReputation(effect.reputationChange);
}
// UI 업데이트용
OnStatsChanged?.Invoke(new StatsChangeData(TimeStat, HealthStat, ReputationStat));
// 스탯 - 시간이 변경된 이후 퇴근 이벤트 발생
// 출근 후 퇴근 이벤트 발생
if (actionType == ActionType.Work)
{
_hasWorkedToday = true;
@ -223,8 +241,16 @@ public class PlayerStats : MonoBehaviour,ISaveable
{
_mealCount++;

ActionType이 OvertimeWork 이나 TeamDinner이면 시간에 강제값(_gameConstants.forcedValue)을 부여하지 않나요? 강제값 부여하면 알아서 다음 날로 처리되는데 해당 메서드를 작성하신 이유가 있을까용??

ActionType이 OvertimeWork 이나 TeamDinner이면 시간에 강제값(_gameConstants.forcedValue)을 부여하지 않나요? 강제값 부여하면 알아서 다음 날로 처리되는데 해당 메서드를 작성하신 이유가 있을까용??
Outdated
Review

다음날 처리가 안되어서 해당 메서드 작성했습니다..
-> 처리 되는 거 확인해서 해당 부분 삭제 push했습니다!

다음날 처리가 안되어서 해당 메서드 작성했습니다.. -> 처리 되는 거 확인해서 해당 부분 삭제 push했습니다!

오잉?? 시간 값을 _gameConstants.forcedValue로 설정하여도 안되나요..? 메인에서는 회식 시에 다음날로 잘 넘어가는데(미리 처리) 다른 문제가 있는 걸까요

오잉?? 시간 값을 _gameConstants.forcedValue로 설정하여도 안되나요..? 메인에서는 회식 시에 다음날로 잘 넘어가는데(미리 처리) 다른 문제가 있는 걸까요
}
// 다음 날로 넘기기 처리
bool shouldForceEndDay = actionType == ActionType.OvertimeWork || actionType == ActionType.TeamDinner;
if (shouldForceEndDay || TimeStat >= _gameConstants.maxTime)
{
EndDay(effect.timeChange, actionType);
}
}
public bool CanEat()
{
return _mealCount < MAX_MEAL_COUNT; // 식사 횟수 0,1 일 때만 true
@ -245,7 +271,7 @@ public class PlayerStats : MonoBehaviour,ISaveable
bool isDayEnded = false;
// 수면 행동 처리
if (actionType == ActionType.Sleep || actionType == ActionType.TeamDinner) // 다음 날 오전 8시 기상
if (actionType == ActionType.Sleep || actionType == ActionType.TeamDinner || actionType == ActionType.OvertimeWork) // 다음 날 오전 8시 기상
{
// 다음 날 오전 8시 - 현재 시간 값
float nowTime = TimeStat - time;
@ -356,9 +382,9 @@ public class PlayerStats : MonoBehaviour,ISaveable
Exhaustion?.Invoke();
}
if (HealthStat > _gameConstants.maxHealth)
if (HealthStat > MaxHealth)
{
HealthStat = _gameConstants.maxHealth;
HealthStat = MaxHealth;
}
}

View File

@ -54,8 +54,8 @@ public class StatPanelController : MonoBehaviour
private void SetStat(float time, float reputation, float health)
{
healthBarImage.fillAmount = health / _gameConstants.maxHealth;
healthText.text = $"{health}/{_gameConstants.maxHealth}";
healthBarImage.fillAmount = health / PlayerStats.Instance.MaxHealth;
healthText.text = $"{health}/{PlayerStats.Instance.MaxHealth}";
reputationBarImage.fillAmount = reputation / _gameConstants.maxReputation;
reputationText.text = $"{reputation}/{_gameConstants.maxReputation}";

View File

@ -40,7 +40,7 @@ public class ValueByAction
{ ActionType.Work, new ActionEffect(+10.0f, -3.0f, +0.2f) }, // 8to6: 10시간
{ ActionType.Dungeon, new ActionEffect(+3.0f, -3.0f, 0) },
{ ActionType.Housework, new ActionEffect(+1.0f, -1.0f, +0.2f) },
{ ActionType.OvertimeWork, new ActionEffect(+4.0f, -5.0f, +1.0f) },
{ ActionType.OvertimeWork, new ActionEffect(_gameConstants.forcedValue, -5.0f, +1.0f) },
Review

이전 PR에서는 OvertimeWork의 시간 값이 _gameConstants.forcedValue 였던 것 같은데 충돌 처리 때문에 이전으로 잠시 돌리신 건가용?

이전 PR에서는 OvertimeWork의 시간 값이 _gameConstants.forcedValue 였던 것 같은데 충돌 처리 때문에 이전으로 잠시 돌리신 건가용?
Review

맞습니다!

맞습니다!
{ ActionType.TeamDinner, new ActionEffect(_gameConstants.forcedValue, _gameConstants.forcedValue, 0) }, // 수면 강제(8시 기상) 후 최대 체력
{ ActionType.Absence, new ActionEffect(0, 0, -3.0f) }
};

View File

@ -137,11 +137,19 @@ public class InteractionController : MonoBehaviour
PlayerStats.Instance.PerformAction(ActionType.TeamDinner);
}
housingCanvasController.ShowSuddenEventImage(afterWorkEventType);
GameManager.Instance.PlaySuddenEventSound(afterWorkEventType);
// 야근 or 회식 돌발 이벤트 실행 시
housingCanvasController.ShowSuddenEventImageWithCallback(afterWorkEventType, () =>
{
// 이미지 다 보여진 후 실행
interactionAnimationPanelController.ShowAnimationPanel(
ActionType.Sleep,
"너무 피곤해서 그대로 잠들어 버렸다..."
);
});
});
}
#endregion
}

View File

@ -125,6 +125,43 @@ public class HousingCanvasController : MonoBehaviour
_autoHideCoroutine = StartCoroutine(AutoHideSuddenImage(afterWorkEventType));
}
public void ShowSuddenEventImageWithCallback(AfterWorkEventType afterWorkEventType, Action onComplete)
{
if (_autoHideCoroutine != null)
StopCoroutine(_autoHideCoroutine);
switch (afterWorkEventType)
{
case AfterWorkEventType.OvertimeWork:
suddenEventImages[0].SetActive(true);
break;
case AfterWorkEventType.TeamGathering:
suddenEventImages[1].SetActive(true);
break;
}
_autoHideCoroutine = StartCoroutine(AutoHideSuddenImageWithCallback(afterWorkEventType, onComplete));
}
private IEnumerator AutoHideSuddenImageWithCallback(AfterWorkEventType type, Action onComplete)
{
float startTime = Time.time;
while (Time.time - startTime < HousingConstants.SUDDENEVENT_IAMGE_SHOW_TIME)
{
if (Input.touchCount > 0 || Input.GetMouseButtonDown(0))
break;
yield return null;
}
HideSuddenEventImage();
HideSuddenEventPanel();
GameManager.Instance.StopSuddenEventSound(type);
_autoHideCoroutine = null;
onComplete?.Invoke();
}
public void HideSuddenEventImage()
{

View File

@ -33,8 +33,9 @@ public class InteractionAnimationPanelController : MonoBehaviour
public void ShowAnimationPanel(ActionType actionType, string animationText)
{
PlayerStats.Instance.HideBubble();
if (actionType == ActionType.Sleep && !PlayerStats.Instance.HasWorkedToday) // 결근
if (actionType == ActionType.Sleep && !PlayerStats.Instance.HasWorkedToday
&& PlayerStats.Instance.LastAction != ActionType.TeamDinner
&& PlayerStats.Instance.LastAction != ActionType.OvertimeWork) // 결근
Review

TeamDinner나 OvertimeWork는 다음날로 자동으로 넘어가기 때문에 이렇게 추가하신 건가요?

TeamDinner나 OvertimeWork는 다음날로 자동으로 넘어가기 때문에 이렇게 추가하신 건가요?
Review

해당 부분으로 막지 않으면 돌발 이벤트 때 결근 메서드가 호출됩니다. 그래서 두번 돌발이벤트 뜨면 해고 엔딩 나오길래 막기 위해 추가했습니다.

해당 부분으로 막지 않으면 돌발 이벤트 때 결근 메서드가 호출됩니다. 그래서 두번 돌발이벤트 뜨면 해고 엔딩 나오길래 막기 위해 추가했습니다.
{
_isAbsenceToday = true;
}