// ConditionalEventTrigger.cs
using UnityEngine;
using UnityEngine.Events;
using PixelCrushers.DialogueSystem;
using PixelCrushers;
namespace Beyond
{
///
/// A generic, saveable trigger that checks a Lua condition on start or load,
/// and fires a UnityEvent based on the result.
///
[AddComponentMenu("Pixel Crushers/Dialogue System/Trigger/Conditional Event Trigger")]
public class ConditionalEventTrigger : Saver
{
[Header("Condition")]
[Tooltip("The Lua condition to check.")]
public Condition condition = new Condition();
[Tooltip("If ticked, the events will only be fired the first time the condition is met. This state is saved and loaded.")]
public bool fireOnce = true;
[Header("Events")]
[Tooltip("Actions to perform if the condition is true.")]
public UnityEvent onConditionTrue;
[Tooltip("Actions to perform if the condition is false.")]
public UnityEvent onConditionFalse;
// This field is used by the custom editor for the Lua wizard.
[HideInInspector]
public DialogueDatabase selectedDatabase = null;
[Tooltip("How often to check the condition (in seconds). If zero, only checks on start/load.")]
public float CheckInterval = 1.0f;
private bool hasFired = false;
///
/// On game start, check the condition. Handles new games or scene loads.
///
public override void Start()
{
base.Start();
CheckConditionAndExecute();
if (CheckInterval > 0)
InvokeRepeating("CheckConditionAndExecute", CheckInterval + (Random.value * CheckInterval), CheckInterval);
}
///
/// Called by the Save System when saving a game. Records if this trigger has already fired.
///
public override string RecordData()
{
return SaveSystem.Serialize(hasFired);
}
///
/// Called by the Save System when loading a game. Restores the fired state
/// and then re-evaluates the condition.
///
public override void ApplyData(string s)
{
hasFired = !string.IsNullOrEmpty(s) ? SaveSystem.Deserialize(s) : false;
CheckConditionAndExecute();
}
///
/// Evaluates the Lua condition and invokes the appropriate UnityEvent.
///
public void CheckConditionAndExecute()
{
if (fireOnce && hasFired)
{
if (DialogueDebug.logInfo) Debug.Log($"Dialogue System: ConditionalEventTrigger '{name}' will not fire again because Fire Once is true and it has already fired.", this);
return;
}
bool conditionResult = condition.IsTrue(null);
if (DialogueDebug.logInfo) Debug.Log($"Dialogue System: ConditionalEventTrigger '{name}' condition is {conditionResult}. Invoking events.", this);
if (conditionResult)
{
onConditionTrue.Invoke();
hasFired = true; // Mark as fired if the condition was met
}
else
{
onConditionFalse.Invoke();
}
}
}
}