diff --git a/Assets/Examples/BasicConversation/ExampleConversation.asset b/Assets/Examples/BasicConversation/ExampleConversation.asset index d04ad65..a07fb5e 100644 --- a/Assets/Examples/BasicConversation/ExampleConversation.asset +++ b/Assets/Examples/BasicConversation/ExampleConversation.asset @@ -425,7 +425,7 @@ MonoBehaviour: - {fileID: -1807495471838374980} - {fileID: -7347677369531188231} root: {fileID: 426936237664981933} - scrollPosition: {x: 49972.676, y: 49968} + scrollPosition: {x: 51095.676, y: 50006} --- !u!114 &373158185418196577 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Examples/BasicConversation/Scripts/ExampleDialoguePlayback.cs b/Assets/Examples/BasicConversation/Scripts/ExampleDialoguePlayback.cs index 5761777..c94e00e 100644 --- a/Assets/Examples/BasicConversation/Scripts/ExampleDialoguePlayback.cs +++ b/Assets/Examples/BasicConversation/Scripts/ExampleDialoguePlayback.cs @@ -46,6 +46,10 @@ private void Awake () { speakerContainer.SetActive(false); }); + _ctrl.Events.NodeEnter.AddListener((node) => { + Debug.Log($"Node Enter: {node.GetType()} - {node.UniqueId}"); + }); + _ctrl.Play(dialogue); } diff --git a/Assets/com.fluid.dialogue/Runtime/DialogueController.cs b/Assets/com.fluid.dialogue/Runtime/DialogueController.cs index 6faf09c..99427d6 100644 --- a/Assets/com.fluid.dialogue/Runtime/DialogueController.cs +++ b/Assets/com.fluid.dialogue/Runtime/DialogueController.cs @@ -3,6 +3,7 @@ using CleverCrow.Fluid.Databases; using CleverCrow.Fluid.Dialogues.Choices; using CleverCrow.Fluid.Dialogues.Graphs; +using CleverCrow.Fluid.Dialogues.Nodes; namespace CleverCrow.Fluid.Dialogues { public interface IDialogueController { @@ -28,6 +29,7 @@ public void Play (IDialoguePlayback playback) { playback.Events.Speak.AddListener(TriggerSpeak); playback.Events.Choice.AddListener(TriggerChoice); + playback.Events.NodeEnter.AddListener(TriggerEnterNode); playback.Events.Begin.AddListener(TriggerBegin); playback.Events.End.AddListener(TriggerEnd); @@ -52,6 +54,7 @@ public void PlayChild (IDialoguePlayback playback) { }); playback.Events.Speak.AddListener(TriggerSpeak); playback.Events.Choice.AddListener(TriggerChoice); + playback.Events.NodeEnter.AddListener(TriggerEnterNode); _activeDialogue.Push(playback); playback.Play(); @@ -79,6 +82,10 @@ private void TriggerChoice (IActor actor, string text, List choices) { Events.Choice.Invoke(actor, text, choices); } + private void TriggerEnterNode (INode node) { + Events.NodeEnter.Invoke(node); + } + public void Next () { ActiveDialogue?.Next(); } diff --git a/Assets/com.fluid.dialogue/Runtime/Graphs/Events/DialogueEvents.cs b/Assets/com.fluid.dialogue/Runtime/Graphs/Events/DialogueEvents.cs index 13b06ec..4b81c43 100644 --- a/Assets/com.fluid.dialogue/Runtime/Graphs/Events/DialogueEvents.cs +++ b/Assets/com.fluid.dialogue/Runtime/Graphs/Events/DialogueEvents.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using CleverCrow.Fluid.Dialogues.Choices; +using CleverCrow.Fluid.Dialogues.Nodes; using CleverCrow.Fluid.Utilities.UnityEvents; namespace CleverCrow.Fluid.Dialogues { @@ -8,5 +9,6 @@ public class DialogueEvents : IDialogueEvents { public IUnityEvent End { get; } = new UnityEventPlus(); public IUnityEvent Speak { get; } = new UnityEventPlus(); public IUnityEvent> Choice { get; } = new UnityEventPlus>(); + public IUnityEvent NodeEnter { get; } = new UnityEventPlus(); } } diff --git a/Assets/com.fluid.dialogue/Runtime/Graphs/Events/IDialogueEvents.cs b/Assets/com.fluid.dialogue/Runtime/Graphs/Events/IDialogueEvents.cs index d0e6b4f..2c5af77 100644 --- a/Assets/com.fluid.dialogue/Runtime/Graphs/Events/IDialogueEvents.cs +++ b/Assets/com.fluid.dialogue/Runtime/Graphs/Events/IDialogueEvents.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using CleverCrow.Fluid.Dialogues.Choices; +using CleverCrow.Fluid.Dialogues.Nodes; using CleverCrow.Fluid.Utilities.UnityEvents; namespace CleverCrow.Fluid.Dialogues { @@ -8,5 +9,6 @@ public interface IDialogueEvents { IUnityEvent End { get; } IUnityEvent Speak { get; } IUnityEvent> Choice { get; } + IUnityEvent NodeEnter { get; } } } diff --git a/Assets/com.fluid.dialogue/Runtime/Nodes/ChoiceHub/NodeChoiceHubData.cs b/Assets/com.fluid.dialogue/Runtime/Nodes/ChoiceHub/NodeChoiceHubData.cs index 7ae2701..f34abf8 100644 --- a/Assets/com.fluid.dialogue/Runtime/Nodes/ChoiceHub/NodeChoiceHubData.cs +++ b/Assets/com.fluid.dialogue/Runtime/Nodes/ChoiceHub/NodeChoiceHubData.cs @@ -10,7 +10,7 @@ public class NodeChoiceHubData : NodeDataChoiceBase { public override INode GetRuntime (IGraph graphRuntime, IDialogueController dialogue) { var runtimeChoices = choices.Select(c => c.GetRuntime(graphRuntime, dialogue)).ToList(); return new NodeChoiceHub( - null, + UniqueId, runtimeChoices, conditions.Select(c => c.GetRuntime(graphRuntime, dialogue)).ToList()); } diff --git a/Assets/com.fluid.dialogue/Runtime/Nodes/Dialogue/NodeDialogue.cs b/Assets/com.fluid.dialogue/Runtime/Nodes/Dialogue/NodeDialogue.cs index 2eafc7a..c67ad28 100644 --- a/Assets/com.fluid.dialogue/Runtime/Nodes/Dialogue/NodeDialogue.cs +++ b/Assets/com.fluid.dialogue/Runtime/Nodes/Dialogue/NodeDialogue.cs @@ -29,17 +29,18 @@ public NodeDialogue ( _choices = choices; } - private List GetValidChoices () { + private List GetValidChoices (IDialoguePlayback playback) { var child = Next(); if (_choices.Count == 0 && child?.HubChoices != null && child.HubChoices.Count > 0) { + playback.Events.NodeEnter.Invoke(child); return child.HubChoices; } return _choices.Where(c => c.IsValid).ToList(); } - public override void Play (IDialoguePlayback playback) { - _emittedChoices = GetValidChoices(); + protected override void OnPlay (IDialoguePlayback playback) { + _emittedChoices = GetValidChoices(playback); if (_emittedChoices.Count > 0) { playback.Events.Choice.Invoke(_actor, _dialogue, _emittedChoices); return; diff --git a/Assets/com.fluid.dialogue/Runtime/Nodes/NodeBase.cs b/Assets/com.fluid.dialogue/Runtime/Nodes/NodeBase.cs index 8ce94cf..503f7a3 100644 --- a/Assets/com.fluid.dialogue/Runtime/Nodes/NodeBase.cs +++ b/Assets/com.fluid.dialogue/Runtime/Nodes/NodeBase.cs @@ -43,7 +43,12 @@ public INode Next () { return Children.Find(n => n.IsValid); } - public virtual void Play (IDialoguePlayback playback) { + public void Play (IDialoguePlayback playback) { + playback.Events.NodeEnter.Invoke(this); + OnPlay(playback); + } + + protected virtual void OnPlay (IDialoguePlayback playback) { playback.Next(); } diff --git a/Assets/com.fluid.dialogue/Runtime/Nodes/NodeDataBase.cs b/Assets/com.fluid.dialogue/Runtime/Nodes/NodeDataBase.cs index 6f98793..29240a5 100644 --- a/Assets/com.fluid.dialogue/Runtime/Nodes/NodeDataBase.cs +++ b/Assets/com.fluid.dialogue/Runtime/Nodes/NodeDataBase.cs @@ -20,7 +20,7 @@ public interface IConnectionChildCollection { } public abstract class NodeDataBase : ScriptableObject, INodeData { - [HideInInspector] + // [HideInInspector] [SerializeField] private string _uniqueId; diff --git a/Assets/com.fluid.dialogue/Runtime/Nodes/PlayGraph/NodePlayGraph.cs b/Assets/com.fluid.dialogue/Runtime/Nodes/PlayGraph/NodePlayGraph.cs index 797c34b..160bcc4 100644 --- a/Assets/com.fluid.dialogue/Runtime/Nodes/PlayGraph/NodePlayGraph.cs +++ b/Assets/com.fluid.dialogue/Runtime/Nodes/PlayGraph/NodePlayGraph.cs @@ -19,7 +19,7 @@ public NodePlayGraph ( _graph = graph; } - public override void Play (IDialoguePlayback playback) { + protected override void OnPlay (IDialoguePlayback playback) { playback.ParentCtrl.PlayChild(_graph); } } diff --git a/Assets/com.fluid.dialogue/Tests/Editor/DialoguePlaybackTest.cs b/Assets/com.fluid.dialogue/Tests/Editor/DialoguePlaybackTest.cs index f2031d9..b095c21 100644 --- a/Assets/com.fluid.dialogue/Tests/Editor/DialoguePlaybackTest.cs +++ b/Assets/com.fluid.dialogue/Tests/Editor/DialoguePlaybackTest.cs @@ -35,6 +35,8 @@ public void It_should_trigger_a_Begin_event () { [Test] public void It_should_trigger_a_speak_event_with_the_root_child_dialogue () { var node = A.Node.Build(); + node.Play(Arg.Do(p => p.Events.Speak.Invoke(null, null))); + _graph = A.Graph .WithNextResult(node) .Build(); @@ -42,7 +44,7 @@ public void It_should_trigger_a_speak_event_with_the_root_child_dialogue () { _playback.Play(); - node.Received(1).Play(_playback); + _playback.Events.Speak.ReceivedWithAnyArgs(1).Invoke(null, null); } [Test] diff --git a/Assets/com.fluid.dialogue/Tests/Editor/Nodes/NodeDialogueTest.cs b/Assets/com.fluid.dialogue/Tests/Editor/Nodes/NodeDialogueTest.cs index 741fb69..de429b6 100644 --- a/Assets/com.fluid.dialogue/Tests/Editor/Nodes/NodeDialogueTest.cs +++ b/Assets/com.fluid.dialogue/Tests/Editor/Nodes/NodeDialogueTest.cs @@ -90,6 +90,18 @@ public void It_should_trigger_a_speak_event () { } } + public class NodeEnterEvents : NodeDialogueTest { + [Test] + public void It_should_trigger_a_NodeEnter_event () { + var node = CreateNodeDialogue(); + var playback = Substitute.For(); + + node.Play(playback); + + playback.Events.NodeEnter.Received(1).Invoke(node); + } + } + public class ChoiceEvents { public class InternalChoices : NodeDialogueTest { [Test] @@ -156,6 +168,22 @@ public void It_should_use_choices_from_next_child_if_its_a_choice_hub () { playback.Events.Choice.Received(1).Invoke(_actor, DIALOGUE, choiceHub.HubChoices); } + [Test] + public void It_should_trigger_enter_node_on_a_used_choice_hub () { + var playback = Substitute.For(); + var choice = A.Choice.Build(); + var choiceHub = A.Node + .WithHubChoice(choice) + .Build(); + var choiceHubData = A.NodeData.WithNode(choiceHub).Build(); + _children.Add(choiceHubData); + + var node = CreateNodeDialogue(); + node.Play(playback); + + playback.Events.NodeEnter.Received(1).Invoke(choiceHub); + } + [Test] public void It_should_not_use_a_choice_hub_if_choices_are_present () { var playback = Substitute.For();