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