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.

99 lines
3.0 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 UnityEngine.UI;
using System.Collections;
using Fungus;
using MoonSharp.Interpreter;
namespace Fungus
{
public static class LuaExtensions
{
/// <summary>
/// Extension for MenuDialog that allows AddOption to call a Lua function when an option is selected.
/// </summary>
public static bool AddOption(this MenuDialog menuDialog, string text, bool interactable, LuaEnvironment luaEnvironment, Closure callBack)
{
bool addedOption = false;
foreach (Button button in menuDialog.cachedButtons)
{
if (!button.gameObject.activeSelf)
{
button.gameObject.SetActive(true);
button.interactable = interactable;
Text textComponent = button.GetComponentInChildren<Text>();
if (textComponent != null)
{
textComponent.text = text;
}
button.onClick.AddListener(delegate {
menuDialog.StopAllCoroutines(); // Stop timeout
menuDialog.Clear();
menuDialog.HideSayDialog();
if (callBack != null)
{
luaEnvironment.RunLuaFunction(callBack, true);
}
});
addedOption = true;
break;
}
}
return addedOption;
}
/// <summary>
/// Extension for MenuDialog that allows ShowTimer to call a Lua function when the timer expires.
/// </summary>
public static IEnumerator ShowTimer(this MenuDialog menuDialog, float duration, LuaEnvironment luaEnvironment, Closure callBack)
{
if (menuDialog.cachedSlider == null ||
duration <= 0f)
{
yield break;
}
menuDialog.cachedSlider.gameObject.SetActive(true);
menuDialog.StopAllCoroutines();
float elapsedTime = 0;
Slider timeoutSlider = menuDialog.GetComponentInChildren<Slider>();
while (elapsedTime < duration)
{
if (timeoutSlider != null)
{
float t = 1f - elapsedTime / duration;
timeoutSlider.value = t;
}
elapsedTime += Time.deltaTime;
yield return null;
}
menuDialog.Clear();
menuDialog.gameObject.SetActive(false);
menuDialog.HideSayDialog();
if (callBack != null)
{
luaEnvironment.RunLuaFunction(callBack, true);
}
}
}
}