87 lines
3.5 KiB
C#
87 lines
3.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
// DialogGroup 하나가 활성화되기 위한 조건 묶음. 모든 항목을 만족해야 한다(AND).
|
|
// 값이 0이거나 목록이 비어있으면 그 항목은 조건 없음으로 통과된다.
|
|
[Serializable]
|
|
public class DialogCondition
|
|
{
|
|
[Tooltip("메인 진행도가 이 값 이상이어야 함 (0 = 조건 없음)")]
|
|
[Min(0)] public int MinMainProgress;
|
|
|
|
[Tooltip("메인 진행도가 이 값 이하여야 함 (0 = 조건 없음). " +
|
|
"예: NPC 선택 상황에서 수락 시 진행도를 올리면, 이 상한을 건 다른 NPC들의 선택 대화가 일괄 비활성화된다")]
|
|
[Min(0)] public int MaxMainProgress;
|
|
|
|
[Tooltip("이 NPC의 호감도가 이 값 이상이어야 함 (0 = 조건 없음)")]
|
|
[Min(0)] public int MinAffection;
|
|
|
|
[Tooltip("먼저 완료했어야 하는 대화들 (전부 완료 필요)")]
|
|
public List<DialogGroup> RequiredDialogs = new();
|
|
|
|
[Tooltip("골랐어야 하는 선택지 Code들 (전부 필요)")]
|
|
public List<string> RequiredChoiceCodes = new();
|
|
|
|
[Tooltip("완료했어야 하는 미션 Id들 (전부 필요)")]
|
|
public List<string> RequiredMissionIds = new();
|
|
|
|
[Tooltip("완료되면 이 대화가 비활성화되는 미션 Id들 (하나라도 완료됐으면 비활성화). " +
|
|
"예: 미션 진행 중에만 나오는 안내 대사")]
|
|
public List<string> ExcludedMissionIds = new();
|
|
|
|
[Tooltip("밟았어야 하는 이벤트존 Id들 (전부 필요)")]
|
|
public List<string> RequiredZoneIds = new();
|
|
|
|
[Tooltip("밟으면 이 대화가 비활성화되는 이벤트존 Id들 (하나라도 밟았으면 비활성화)")]
|
|
public List<string> ExcludedZoneIds = new();
|
|
|
|
[Tooltip("켜져 있어야 하는 StoryTrigger Id들 (전부 필요). 예: 계약서 서명 트리거")]
|
|
public List<string> RequiredTriggerIds = new();
|
|
|
|
// affectionTarget: 호감도 조건을 검사할 캐릭터 (보통 대화를 거는 NPC 자신)
|
|
public bool IsMet(CharacterData affectionTarget)
|
|
{
|
|
var story = StoryManager.Instance;
|
|
|
|
if (story.MainProgress < MinMainProgress)
|
|
return false;
|
|
|
|
if (MaxMainProgress > 0 && story.MainProgress > MaxMainProgress)
|
|
return false;
|
|
|
|
if (MinAffection > 0 && story.GetAffection(affectionTarget) < MinAffection)
|
|
return false;
|
|
|
|
foreach (var group in RequiredDialogs)
|
|
if (group != null && !story.IsDialogCompleted(group.name))
|
|
return false;
|
|
|
|
foreach (var code in RequiredChoiceCodes)
|
|
if (!string.IsNullOrEmpty(code) && !story.HasChosen(code))
|
|
return false;
|
|
|
|
foreach (var missionId in RequiredMissionIds)
|
|
if (!string.IsNullOrEmpty(missionId) && !story.IsMissionCompleted(missionId))
|
|
return false;
|
|
|
|
foreach (var missionId in ExcludedMissionIds)
|
|
if (!string.IsNullOrEmpty(missionId) && story.IsMissionCompleted(missionId))
|
|
return false;
|
|
|
|
foreach (var zoneId in RequiredZoneIds)
|
|
if (!string.IsNullOrEmpty(zoneId) && !story.HasTriggeredZone(zoneId))
|
|
return false;
|
|
|
|
foreach (var zoneId in ExcludedZoneIds)
|
|
if (!string.IsNullOrEmpty(zoneId) && story.HasTriggeredZone(zoneId))
|
|
return false;
|
|
|
|
foreach (var triggerId in RequiredTriggerIds)
|
|
if (!string.IsNullOrEmpty(triggerId) && !StoryTrigger.IsActive(triggerId))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
}
|