Files
2026-07-24 18:20:02 +09:00

63 lines
2.6 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
// DialogGroup 하나가 활성화되기 위한 조건 묶음. 모든 항목을 만족해야 한다(AND).
// 진행도/호감도는 범위(양끝 포함)로 지정한다. 기본 범위 = 조건 없음. 트리거 목록은 비워두면 조건 없음.
[Serializable]
public class DialogCondition : ISerializationCallbackReceiver
{
const int MaxProgressDefault = 9999;
const int MaxAffectionDefault = 100;
[Tooltip("메인 진행도가 이 범위 안이어야 함 (양끝 포함). 기본 0~9999 = 조건 없음")]
public IntRange MainProgress = new(0, MaxProgressDefault);
[Tooltip("이 NPC의 호감도가 이 범위 안이어야 함 (양끝 포함). 기본 0~100 = 조건 없음. " +
"예: 0~10 = 호감도가 낮을 때만, 50~100 = 호감도가 쌓인 뒤에만")]
public IntRange Affection = new(0, MaxAffectionDefault);
[Tooltip("켜져 있어야 하는 트리거 Id들 (전부 필요). StoryManager.SetTrigger로 켠다")]
public List<string> RequiredTriggerIds = new();
[Tooltip("켜지면 이 대화가 비활성화되는 트리거 Id들 (하나라도 켜졌으면 비활성화). " +
"예: 특정 사건 이후엔 더 못 보는 대사")]
public List<string> ExcludedTriggerIds = new();
// 인스펙터에서 리스트에 새로 추가된 항목은 필드 초기화식이 무시되고 전부 0으로 생성된다.
// 그대로면 범위가 0~0(사실상 잠긴 대화)이 되므로, 처음 만들어진 인스턴스에만 기본 범위를 넣어준다.
[SerializeField, HideInInspector] private bool _initialized = true;
public void OnBeforeSerialize() { }
public void OnAfterDeserialize()
{
if (_initialized) return;
_initialized = true;
MainProgress = new IntRange(0, MaxProgressDefault);
Affection = new IntRange(0, MaxAffectionDefault);
}
// affectionTarget: 호감도 조건을 검사할 캐릭터 (보통 대화를 거는 NPC 자신)
public bool IsMet(CharacterData affectionTarget)
{
var story = StoryManager.Instance;
if (!MainProgress.Contains(story.MainProgress))
return false;
if (!Affection.Contains(story.GetAffection(affectionTarget)))
return false;
foreach (var id in RequiredTriggerIds)
if (!string.IsNullOrEmpty(id) && !story.HasTrigger(id))
return false;
foreach (var id in ExcludedTriggerIds)
if (!string.IsNullOrEmpty(id) && story.HasTrigger(id))
return false;
return true;
}
}