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.

96 lines
3.0 KiB

namespace Fungus
{
/// <summary>
/// Fungus Priority event signalling system.
/// A common point for Fungus core systems and user Commands to signal to external code that a
/// Fungus system is currently doing something important.
///
/// One intended use case for this system is to have your code listen to this to know when to
/// stop player movement or camera movement etc. when the player is engaged in a conversation
/// with an NPC.
/// </summary>
public static class FungusPrioritySignals
{
#region Public members
/// <summary>
/// used by increase and decrease active depth functions.
/// </summary>
private static int activeDepth;
public static int CurrentPriorityDepth
{
get
{
return activeDepth;
}
}
public static event FungusPriorityStartHandler OnFungusPriorityStart;
public delegate void FungusPriorityStartHandler();
public static event FungusPriorityEndHandler OnFungusPriorityEnd;
public delegate void FungusPriorityEndHandler();
public static event FungusPriorityChangeHandler OnFungusPriorityChange;
public delegate void FungusPriorityChangeHandler(int previousActiveDepth, int newActiveDepth);
/// <summary>
/// Adds 1 to the theactiveDepth. If it was zero causes the OnFungusPriorityStart
/// </summary>
public static void DoIncreasePriorityDepth()
{
if(activeDepth == 0)
{
if (OnFungusPriorityStart != null)
{
OnFungusPriorityStart();
}
}
if(OnFungusPriorityChange != null)
{
OnFungusPriorityChange(activeDepth, activeDepth + 1);
}
activeDepth++;
}
/// <summary>
/// Subtracts 1 to the theactiveDepth. If it reaches zero causes the OnFungusPriorityEnd
/// </summary>
public static void DoDecreasePriorityDepth()
{
if (OnFungusPriorityChange != null)
{
OnFungusPriorityChange(activeDepth, activeDepth - 1);
}
if(activeDepth == 1)
{
if(OnFungusPriorityEnd != null)
{
OnFungusPriorityEnd();
}
}
activeDepth--;
}
/// <summary>
/// Forces active depth back to 0. If already 0 fires no signals.
/// </summary>
public static void DoResetPriority()
{
if (activeDepth == 0)
return;
if (OnFungusPriorityChange != null)
{
OnFungusPriorityChange(activeDepth, 0);
}
if (OnFungusPriorityEnd != null)
{
OnFungusPriorityEnd();
}
activeDepth = 0;
}
#endregion
}
}