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/FungusPriorityCount.cs b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityCount.cs
new file mode 100644
index 00000000..a1aa957a
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityCount.cs
@@ -0,0 +1,34 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ /// Copy the value of the Priority Count to a local IntegerVariable, intended primarily to assist with debugging use of Priority.
+ ///
+ [CommandInfo("Priority Signals",
+ "Get Priority Count",
+ "Copy the value of the Priority Count to a local IntegerVariable, intended primarily to assist with debugging use of Priority.")]
+ public class FungusPriorityCount : Command
+ {
+ [VariableProperty(typeof(IntegerVariable))]
+ public IntegerVariable 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/FungusPriorityCount.cs.meta b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityCount.cs.meta
new file mode 100644
index 00000000..4862a858
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityCount.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: a3aeb6a9bd739484080e7965ecaab89e
+timeCreated: 1523926493
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityDecrease.cs b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityDecrease.cs
new file mode 100644
index 00000000..8461eaee
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityDecrease.cs
@@ -0,0 +1,24 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ /// 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.
+ ///
+ [CommandInfo("Priority Signals",
+ "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 FungusPriorityDecrease : Command
+ {
+ public override void OnEnter()
+ {
+ FungusPrioritySignals.DoDecreasePriorityDepth();
+
+ Continue();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityDecrease.cs.meta b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityDecrease.cs.meta
new file mode 100644
index 00000000..385cd193
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityDecrease.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: ebc295ba6aed8944fa3974a64f33cc42
+timeCreated: 1523926493
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityIncrease.cs b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityIncrease.cs
new file mode 100644
index 00000000..40282e32
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityIncrease.cs
@@ -0,0 +1,24 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ /// 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.
+ ///
+ [CommandInfo("Priority Signals",
+ "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 FungusPriorityIncrease : Command
+ {
+ public override void OnEnter()
+ {
+ FungusPrioritySignals.DoIncreasePriorityDepth();
+
+ Continue();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityIncrease.cs.meta b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityIncrease.cs.meta
new file mode 100644
index 00000000..49d7aed5
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityIncrease.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: 3d07cf5e706b13a4eb0ae53386c30fbd
+timeCreated: 1523926493
+licenseType: Free
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityReset.cs b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityReset.cs
new file mode 100644
index 00000000..d854f388
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityReset.cs
@@ -0,0 +1,22 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+namespace Fungus
+{
+ ///
+ /// Resets the FungusPriority count to zero. Useful if you are among logic that is hard to have matching increase and decreases.
+ ///
+ [CommandInfo("Priority Signals",
+ "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 FungusPriorityReset : Command
+ {
+ public override void OnEnter()
+ {
+ FungusPrioritySignals.DoResetPriority();
+
+ Continue();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityReset.cs.meta b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityReset.cs.meta
new file mode 100644
index 00000000..7929cf49
--- /dev/null
+++ b/Assets/Fungus/Scripts/Commands/Priority/FungusPriorityReset.cs.meta
@@ -0,0 +1,13 @@
+fileFormatVersion: 2
+guid: b5b98ba2a3006db49959601485049a0d
+timeCreated: 1523926493
+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:
diff --git a/Docs/command_ref/priority signals_commands.md b/Docs/command_ref/priority signals_commands.md
new file mode 100644
index 00000000..138b9fbd
--- /dev/null
+++ b/Docs/command_ref/priority signals_commands.md
@@ -0,0 +1,19 @@
+# Priority Signals commands # {#priority signals_commands}
+
+[TOC]
+# Get Priority Count # {#GetPriorityCount}
+Copy the value of the Priority Count to a local IntegerVariable, intended primarily to assist with debugging use of Priority.
+
+Defined in Fungus.FungusPriorityCount
+# Priority Down # {#PriorityDown}
+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.
+
+Defined in Fungus.FungusPriorityDecrease
+# Priority Reset # {#PriorityReset}
+Resets the FungusPriority count to zero. Useful if you are among logic that is hard to have matching increase and decreases.
+
+Defined in Fungus.FungusPriorityReset
+# Priority Up # {#PriorityUp}
+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.
+
+Defined in Fungus.FungusPriorityIncrease