using Sirenix.OdinInspector;
using UnityEngine;
namespace SLSUtilities.Narrative
{
///
/// 通用剧情触发器基类。
/// 仅负责管理触发状态(oneShot, hasFired)与全局故事 ID(storyId)。
/// 具体触发的时机与条件由派生类(子类)自行重写并定义。
///
public abstract class NarrativeTrigger : MonoBehaviour
{
///
/// 全局静态触发事件。当任何剧情触发器被激活时触发。
/// 用于彻底解耦 SLSUtilities 核心程序集与 MainGame 层的 StoryDirector。
///
public static System.Action OnNarrativeTriggerFired;
[TitleGroup("Trigger Settings", "剧情触发器核心配置", Alignment = TitleAlignments.Centered)]
[SerializeField]
[Required]
[Tooltip("要触发的 NarrativeEntry 的 storyId")]
protected string storyId;
[SerializeField]
[Tooltip("是否仅能触发一次")]
protected bool oneShot = true;
[ShowInInspector]
[ReadOnly]
[Tooltip("该触发器当前是否已经激活过")]
protected bool hasFired;
/// 获取触发的目标故事 ID。
public string StoryId => storyId;
/// 是否是一次性触发器。
public bool OneShot => oneShot;
/// 该触发器是否已经激活过。
public bool HasFired => hasFired;
///
/// 激活触发器,通知订阅者启动剧情。
///
[Button("测试触发 (Fire)", ButtonSizes.Small)]
[GUIColor(0.3f, 0.8f, 1f)]
public virtual void Fire()
{
if (oneShot && hasFired)
{
return;
}
if (string.IsNullOrEmpty(storyId))
{
Debug.LogWarning($"[NarrativeTrigger] {gameObject.name} 触发失败:未配置 storyId。");
return;
}
hasFired = true;
OnNarrativeTriggerFired?.Invoke(storyId);
}
///
/// 重置触发状态(允许在 oneShot 模式下重新触发)。
///
[Button("重置激活状态 (Reset)", ButtonSizes.Small)]
public virtual void ResetTrigger()
{
hasFired = false;
}
}
}