diff --git a/Assets/Fungus/Scripts/Commands/Priority.meta b/Assets/Fungus/Scripts/Commands/Priority.meta
new file mode 100644
index 00000000..f6aaeb61
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: 61d2004f0aa3f1847beb167296c897d8
+folderAsset: yes
+timeCreated: 1523180219
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityCurrentCount.cs b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityCurrentCount.cs
new file mode 100644
index 00000000..c2a3aeef
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityCurrentCount.cs
@@ -0,0 +1,32 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ ///
+ [CommandInfo("Scripting",
+ "Priority Count",
+ "Resets the FungusPriority count to zero. Useful if you are among logic that is hard to have matching increase and decreases.")]
+ public class FungusPrirorityCurrentCount : Command
+ {
+ public FloatVar outVar;
+
+ public override void OnEnter()
+ {
+ outVar.Value = FungusPrioritySignals.CurrentPriorityDepth;
+
+ Continue();
+ }
+
+ public override string GetSummary()
+ {
+ if(outVar == null)
+ {
+ return "Error: No out var supplied";
+ }
+ return outVar.Key;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityCurrentCount.cs.meta b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityCurrentCount.cs.meta
new file mode 100644
index 00000000..cb0f4932
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityCurrentCount.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 9cf8648fa41dd274ea08513e0e09751a
+timeCreated: 1523180726
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityDecrease.cs b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityDecrease.cs
new file mode 100644
index 00000000..59f02ffe
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityDecrease.cs
@@ -0,0 +1,22 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ ///
+ [CommandInfo("Scripting",
+ "Priority Down",
+ "Decrease the FungusPriority count, causing the related FungusPrioritySignals to fire. " +
+ "Intended to be used to notify external systems that fungus is doing something important and they should perhaps resume.")]
+ public class FungusPrirorityDecrease : Command
+ {
+ public override void OnEnter()
+ {
+ FungusPrioritySignals.DoDecreasePriorityDepth();
+
+ Continue();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityDecrease.cs.meta b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityDecrease.cs.meta
new file mode 100644
index 00000000..e194da3d
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityDecrease.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 7c145feff04914a4381eed102db730f9
+timeCreated: 1523180528
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityIncrease.cs b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityIncrease.cs
new file mode 100644
index 00000000..2ec01a37
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityIncrease.cs
@@ -0,0 +1,22 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ ///
+ [CommandInfo("Scripting",
+ "Priority Up",
+ "Increases the FungusPriority count, causing the related FungusPrioritySignals to fire. " +
+ "Intended to be used to notify external systems that fungus is doing something important and they should perhaps pause.")]
+ public class FungusPrirorityIncrease : Command
+ {
+ public override void OnEnter()
+ {
+ FungusPrioritySignals.DoIncreasePriorityDepth();
+
+ Continue();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityIncrease.cs.meta b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityIncrease.cs.meta
new file mode 100644
index 00000000..89a97d3c
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityIncrease.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 5205fc5ce9948364994bf9075b2fa803
+timeCreated: 1523180260
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityReset.cs b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityReset.cs
new file mode 100644
index 00000000..811ff875
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityReset.cs
@@ -0,0 +1,21 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ ///
+ [CommandInfo("Scripting",
+ "Priority Reset",
+ "Resets the FungusPriority count to zero. Useful if you are among logic that is hard to have matching increase and decreases.")]
+ public class FungusPrirorityReset : Command
+ {
+ public override void OnEnter()
+ {
+ FungusPrioritySignals.DoResetPriority();
+
+ Continue();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityReset.cs.meta b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityReset.cs.meta
new file mode 100644
index 00000000..3eff5ec7
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPrirorityReset.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 130c56669cb437d4d80996fba8aa50dd
+timeCreated: 1523180528
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Signals/FungusActiveSignals.cs b/Assets/Fungus/Scripts/Signals/FungusActiveSignals.cs
new file mode 100644
index 00000000..f28f75bd
--- /dev/null
+++ b/Assets/Fungus/Scripts/Signals/FungusActiveSignals.cs
@@ -0,0 +1,96 @@
+namespace Fungus
+{
+ ///
+ /// 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.
+ ///
+ public static class FungusPrioritySignals
+ {
+ #region Public members
+ ///
+ /// used by increase and decrease active depth functions.
+ ///
+ 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);
+
+ ///
+ /// Adds 1 to the theactiveDepth. If it was zero causes the OnFungusPriorityStart
+ ///
+ public static void DoIncreasePriorityDepth()
+ {
+ if(activeDepth == 0)
+ {
+ if (OnFungusPriorityStart != null)
+ {
+ OnFungusPriorityStart();
+ }
+ }
+ if(OnFungusPriorityChange != null)
+ {
+ OnFungusPriorityChange(activeDepth, activeDepth + 1);
+ }
+ activeDepth++;
+ }
+
+ ///
+ /// Subtracts 1 to the theactiveDepth. If it reaches zero causes the OnFungusPriorityEnd
+ ///
+ public static void DoDecreasePriorityDepth()
+ {
+ if (OnFungusPriorityChange != null)
+ {
+ OnFungusPriorityChange(activeDepth, activeDepth - 1);
+ }
+ if(activeDepth == 1)
+ {
+ if(OnFungusPriorityEnd != null)
+ {
+ OnFungusPriorityEnd();
+ }
+ }
+ activeDepth--;
+ }
+
+ ///
+ /// Forces active depth back to 0. If already 0 fires no signals.
+ ///
+ public static void DoResetPriority()
+ {
+ if (activeDepth == 0)
+ return;
+
+ if (OnFungusPriorityChange != null)
+ {
+ OnFungusPriorityChange(activeDepth, 0);
+ }
+ if (OnFungusPriorityEnd != null)
+ {
+ OnFungusPriorityEnd();
+ }
+ activeDepth = 0;
+ }
+ #endregion
+ }
+}
diff --git a/Assets/Fungus/Scripts/Signals/FungusActiveSignals.cs.meta b/Assets/Fungus/Scripts/Signals/FungusActiveSignals.cs.meta
new file mode 100644
index 00000000..3d081ea0
--- /dev/null
+++ b/Assets/Fungus/Scripts/Signals/FungusActiveSignals.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: fd542ada4b268ba49bcab2fd4d8e465e
+timeCreated: 1523173334
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Tests/Signals/Editor.meta b/Assets/Tests/Signals/Editor.meta
new file mode 100644
index 00000000..930d2f4f
--- /dev/null
+++ b/Assets/Tests/Signals/Editor.meta
@@ -0,0 +1,10 @@
+fileFormatVersion: 2
+guid: b38a1b95ff88ff34abb4a8a15679fdf5
+folderAsset: yes
+timeCreated: 1523182215
+licenseType: Free
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Tests/Signals/Editor/FungusPrioritySignalsTest.cs b/Assets/Tests/Signals/Editor/FungusPrioritySignalsTest.cs
new file mode 100644
index 00000000..8a54946a
--- /dev/null
+++ b/Assets/Tests/Signals/Editor/FungusPrioritySignalsTest.cs
@@ -0,0 +1,89 @@
+using UnityEngine;
+using UnityEditor;
+using UnityEngine.TestTools;
+using NUnit.Framework;
+using System.Collections;
+
+public class FungusPrioritySignalsTest {
+
+ private int changeCallCount, startCallCount, endCallCount;
+
+ [Test]
+ public void CountsAndSignals()
+ {
+ Fungus.FungusPrioritySignals.OnFungusPriorityStart += FungusPrioritySignals_OnFungusPriorityStart;
+ Fungus.FungusPrioritySignals.OnFungusPriorityEnd += FungusPrioritySignals_OnFungusPriorityEnd;
+ Fungus.FungusPrioritySignals.OnFungusPriorityChange += FungusPrioritySignals_OnFungusPriorityChange;
+
+ Assert.Zero(Fungus.FungusPrioritySignals.CurrentPriorityDepth);
+
+ Fungus.FungusPrioritySignals.DoIncreasePriorityDepth();
+ //one start, one change, no end, 1 depth
+ Assert.AreEqual(0, endCallCount);
+ Assert.AreEqual(1, startCallCount);
+ Assert.AreEqual(1, changeCallCount);
+ Assert.AreEqual(1, Fungus.FungusPrioritySignals.CurrentPriorityDepth);
+
+
+
+ Fungus.FungusPrioritySignals.DoIncreasePriorityDepth();
+ //one start, 2 change, no end, 2 depth
+ Assert.AreEqual(0, endCallCount);
+ Assert.AreEqual(1, startCallCount);
+ Assert.AreEqual(2, changeCallCount);
+ Assert.AreEqual(2, Fungus.FungusPrioritySignals.CurrentPriorityDepth);
+
+
+ Fungus.FungusPrioritySignals.DoIncreasePriorityDepth();
+ //one start, 3 change, no end, 3 depth
+ Assert.AreEqual(0, endCallCount);
+ Assert.AreEqual(1, startCallCount);
+ Assert.AreEqual(3, changeCallCount);
+ Assert.AreEqual(3, Fungus.FungusPrioritySignals.CurrentPriorityDepth);
+
+
+ Fungus.FungusPrioritySignals.DoDecreasePriorityDepth();
+ //one start, 4 change, no end, 2 depth
+ Assert.AreEqual(0, endCallCount);
+ Assert.AreEqual(1, startCallCount);
+ Assert.AreEqual(4, changeCallCount);
+ Assert.AreEqual(2, Fungus.FungusPrioritySignals.CurrentPriorityDepth);
+
+
+ Fungus.FungusPrioritySignals.DoDecreasePriorityDepth();
+ Fungus.FungusPrioritySignals.DoDecreasePriorityDepth();
+ //one start, 6 change, 1 end, 0 depth
+ Assert.AreEqual(1, endCallCount);
+ Assert.AreEqual(1, startCallCount);
+ Assert.AreEqual(6, changeCallCount);
+ Assert.AreEqual(0, Fungus.FungusPrioritySignals.CurrentPriorityDepth);
+
+ Fungus.FungusPrioritySignals.OnFungusPriorityStart -= FungusPrioritySignals_OnFungusPriorityStart;
+ Fungus.FungusPrioritySignals.OnFungusPriorityEnd -= FungusPrioritySignals_OnFungusPriorityEnd;
+ Fungus.FungusPrioritySignals.OnFungusPriorityChange -= FungusPrioritySignals_OnFungusPriorityChange;
+
+ //unsubbed so all the same
+ Fungus.FungusPrioritySignals.DoIncreasePriorityDepth();
+ Fungus.FungusPrioritySignals.DoDecreasePriorityDepth();
+ //one start, 6 change, 1 end, 0 depth
+ Assert.AreEqual(1, endCallCount);
+ Assert.AreEqual(1, startCallCount);
+ Assert.AreEqual(6, changeCallCount);
+ Assert.AreEqual(0, Fungus.FungusPrioritySignals.CurrentPriorityDepth);
+ }
+
+ private void FungusPrioritySignals_OnFungusPriorityChange(int previousActiveDepth, int newActiveDepth)
+ {
+ changeCallCount++;
+ }
+
+ private void FungusPrioritySignals_OnFungusPriorityEnd()
+ {
+ endCallCount++;
+ }
+
+ private void FungusPrioritySignals_OnFungusPriorityStart()
+ {
+ startCallCount++;
+ }
+}
diff --git a/Assets/Tests/Signals/Editor/FungusPrioritySignalsTest.cs.meta b/Assets/Tests/Signals/Editor/FungusPrioritySignalsTest.cs.meta
new file mode 100644
index 00000000..2f1edd07
--- /dev/null
+++ b/Assets/Tests/Signals/Editor/FungusPrioritySignalsTest.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 4b20617e7666fda46bd85a41ce882f9d
+timeCreated: 1523182238
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant: