An easy to use Unity 3D library for creating illustrated Interactive Fiction games and more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
3.8 KiB

// 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
{
/// <summary>
/// Standard comparison operators.
/// </summary>
public enum CompareOperator
{
/// <summary> == mathematical operator.</summary>
Equals,
/// <summary> != mathematical operator.</summary>
NotEquals,
/// <summary> < mathematical operator.</summary>
LessThan,
/// <summary> > mathematical operator.</summary>
GreaterThan,
/// <summary> <= mathematical operator.</summary>
LessThanOrEquals,
/// <summary> >= mathematical operator.</summary>
GreaterThanOrEquals
}
/// <summary>
/// Scope types for Variables.
/// </summary>
public enum VariableScope
{
/// <summary> Can only be accessed by commands in the same Flowchart. </summary>
Private,
/// <summary> Can be accessed from any command in any Flowchart. </summary>
Public
}
/// <summary>
/// Attribute class for variables.
/// </summary>
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; }
}
/// <summary>
/// Attribute class for variable properties.
/// </summary>
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 = "<None>";
public Type[] VariableTypes { get; set; }
}
/// <summary>
/// Abstract base class for variables.
/// </summary>
[RequireComponent(typeof(Flowchart))]
public abstract class Variable : MonoBehaviour
{
[SerializeField] protected VariableScope scope;
[SerializeField] protected string key = "";
#region Public methods
/// <summary>
/// Visibility scope for the variable.
/// </summary>
public virtual VariableScope Scope { get { return scope; } }
/// <summary>
/// String identifier for the variable.
/// </summary>
public virtual string Key { get { return key; } set { key = value; } }
/// <summary>
/// Callback to reset the variable if the Flowchart is reset.
/// </summary>
public abstract void OnReset();
#endregion
}
/// <summary>
/// Generic concrete base class for variables.
/// </summary>
public abstract class VariableBase<T> : Variable
{
[SerializeField] protected T value;
public virtual T Value { get { return this.value; } set { this.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;
}
}
}