using UnityEngine;
using OctoCore.Save.Data;
namespace OctoCore.Dialogue
{
///
/// Condition for dialogue choices.
/// Supports OctoDataBool, OctoDataInt, and OctoDataFloat.
///
[System.Serializable]
public class OctoDialogueCondition
{
///
/// Source data to evaluate (OctoDataBool, OctoDataInt, or OctoDataFloat).
///
[Tooltip("Source data to evaluate")]
public OctoData Source;
///
/// Operation to perform.
///
[Tooltip("Operation to perform")]
public OctoDialogueOperation Operation = OctoDialogueOperation.Equal;
///
/// Value to compare against.
/// For bool: 0 = false, 1 = true
/// For int/float: direct comparison
///
[Tooltip("Value to compare against (bool: 0=false, 1=true)")]
public float Value;
///
/// Evaluate if the condition is met.
///
public bool Evaluate()
{
if (Source == null)
return true; // No condition = always true
float sourceValue = GetSourceValue();
switch (Operation)
{
case OctoDialogueOperation.Equal:
return Mathf.Approximately(sourceValue, Value);
case OctoDialogueOperation.NotEqual:
return !Mathf.Approximately(sourceValue, Value);
case OctoDialogueOperation.GreaterThan:
return sourceValue > Value;
case OctoDialogueOperation.GreaterOrEqual:
return sourceValue >= Value;
case OctoDialogueOperation.LessThan:
return sourceValue < Value;
case OctoDialogueOperation.LessOrEqual:
return sourceValue <= Value;
default:
return true;
}
}
private float GetSourceValue()
{
if (!OctoCore.Instance)
return 0f;
if (Source is OctoDataBool dataBool)
{
return OctoCore.Instance.Save.Get(dataBool) ? 1f : 0f;
}
else if (Source is OctoDataInt dataInt)
{
return OctoCore.Instance.Save.Get(dataInt);
}
else if (Source is OctoDataFloat dataFloat)
{
return OctoCore.Instance.Save.Get(dataFloat);
}
Debug.LogWarning("[OctoDialogueCondition] Unsupported data type: " + Source.GetType().Name);
return 0f;
}
}
}