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.

129 lines
3.5 KiB

// This code is part of the Fungus library (https://github.com/snozbot/fungus)
// It is released for free under the MIT open source license (https://github.com/snozbot/fungus/blob/master/LICENSE)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Fungus;
using MoonSharp.Interpreter;
namespace Fungus
{
public class LuaCondition : Condition
{
[Tooltip("Lua Environment to use to execute this Lua script (null for global)")]
[SerializeField] protected LuaEnvironment luaEnvironment;
[Tooltip("The lua comparison string to run; implicitly prepends 'return' onto this")]
[TextArea]
public string luaCompareString;
protected bool initialised;
protected string friendlyName = "";
protected Closure luaFunction;
protected override bool EvaluateCondition()
{
bool condition = false;
luaEnvironment.RunLuaFunction(luaFunction, false, (returnValue) => {
if( returnValue != null )
{
condition = returnValue.Boolean;
}
else
{
Debug.LogWarning("No return value from " + friendlyName);
}
});
return condition;
}
protected override bool HasNeededProperties()
{
return !string.IsNullOrEmpty(luaCompareString);
}
protected virtual void Start()
{
InitExecuteLua();
}
protected virtual string GetLuaString()
{
return "return not not (" + luaCompareString + ")";
}
/// <summary>
/// Initialises the Lua environment and compiles the Lua string for execution later on.
/// </summary>
protected virtual void InitExecuteLua()
{
if (initialised)
{
return;
}
// Cache a descriptive name to use in Lua error messages
friendlyName = gameObject.name + "." + ParentBlock.BlockName + "." + this.GetType().ToString() + " #" + CommandIndex.ToString();
Flowchart flowchart = GetFlowchart();
// See if a Lua Environment has been assigned to this Flowchart
if (luaEnvironment == null)
{
luaEnvironment = flowchart.LuaEnv;
}
// No Lua Environment specified so just use any available or create one.
if (luaEnvironment == null)
{
luaEnvironment = LuaEnvironment.GetLua();
}
string s = GetLuaString();
luaFunction = luaEnvironment.LoadLuaFunction(s, friendlyName);
// Add a binding to the parent flowchart
if (flowchart.LuaBindingName != "")
{
Table globals = luaEnvironment.Interpreter.Globals;
if (globals != null)
{
globals[flowchart.LuaBindingName] = flowchart;
}
}
// Always initialise when playing in the editor.
// Allows the user to edit the Lua script while the game is playing.
if ( !(Application.isPlaying && Application.isEditor) )
{
initialised = true;
}
}
#region Public members
public override string GetSummary()
{
if (string.IsNullOrEmpty(luaCompareString))
{
return "Error: no lua compare string provided";
}
return luaCompareString;
}
public override bool OpenBlock()
{
return true;
}
public override Color GetButtonColor()
{
return new Color32(253, 253, 150, 255);
}
#endregion
}
}