// This code is part of the Fungus library (http://fungusgames.com) maintained by Chris Gregan (http://twitter.com/gofungus).
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)
using UnityEngine;
using System;
namespace Fungus
{
///
/// Standard comparison operators.
///
public enum CompareOperator
{
/// == mathematical operator.
Equals,
/// != mathematical operator.
NotEquals,
/// < mathematical operator.
LessThan,
/// > mathematical operator.
GreaterThan,
/// <= mathematical operator.
LessThanOrEquals,
/// >= mathematical operator.
GreaterThanOrEquals
}
///
/// Mathematical operations that can be performed on variables.
///
public enum SetOperator
{
/// = operator.
Assign,
/// =! operator.
Negate,
/// += operator.
Add,
/// -= operator.
Subtract,
/// *= operator.
Multiply,
/// /= operator.
Divide
}
///
/// Scope types for Variables.
///
public enum VariableScope
{
/// Can only be accessed by commands in the same Flowchart.
Private,
/// Can be accessed from any command in any Flowchart.
Public,
/// Creates and/or references a global variable of that name, all variables of this name and scope share the same underlying fungus variable and exist for the duration of the instance of Unity.
Global,
}
///
/// Attribute class for variables.
///
public class VariableInfoAttribute : Attribute
{
public VariableInfoAttribute(string category, string variableType, int order = 0)
{
this.Category = category;
this.VariableType = variableType;
this.Order = order;
}
public string Category { get; set; }
public string VariableType { get; set; }
public int Order { get; set; }
}
///
/// Attribute class for variable properties.
///
public class VariablePropertyAttribute : PropertyAttribute
{
public VariablePropertyAttribute (params System.Type[] variableTypes)
{
this.VariableTypes = variableTypes;
}
public VariablePropertyAttribute (string defaultText, params System.Type[] variableTypes)
{
this.defaultText = defaultText;
this.VariableTypes = variableTypes;
}
public String defaultText = "";
public Type[] VariableTypes { get; set; }
}
///
/// Abstract base class for variables.
///
[RequireComponent(typeof(Flowchart))]
public abstract class Variable : MonoBehaviour
{
[SerializeField] protected VariableScope scope;
[SerializeField] protected string key = "";
#region Public members
///
/// Visibility scope for the variable.
///
public virtual VariableScope Scope { get { return scope; } set { scope = value; } }
///
/// String identifier for the variable.
///
public virtual string Key { get { return key; } set { key = value; } }
///
/// Callback to reset the variable if the Flowchart is reset.
///
public abstract void OnReset();
#endregion
}
///
/// Generic concrete base class for variables.
///
public abstract class VariableBase : Variable
{
//caching mechanism for global static variables
private VariableBase _globalStaicRef;
private VariableBase globalStaicRef
{
get
{
if (_globalStaicRef != null)
{
return _globalStaicRef;
}
else if(Application.isPlaying)
{
return _globalStaicRef = FungusManager.Instance.GlobalVariables.GetOrAddVariable(Key, value, this.GetType());
}
else
{
return null;
}
}
}
[SerializeField] protected T value;
public virtual T Value
{
get
{
if (scope != VariableScope.Global || !Application.isPlaying)
{
return this.value;
}
else
{
return globalStaicRef.value;
}
}
set
{
if (scope != VariableScope.Global || !Application.isPlaying)
{
this.value = value;
}
else
{
globalStaicRef.Value = value;
}
}
}
protected T startValue;
public override void OnReset()
{
Value = startValue;
}
public override string ToString()
{
return Value.ToString();
}
protected virtual void Start()
{
// Remember the initial value so we can reset later on
startValue = Value;
}
public virtual void Apply(SetOperator setOperator, T value) {
Debug.LogError("Variable doesn't have any operators.");
}
}
}