diff --git a/gum b/gum index 34bc1b8b..feccfb87 160000 --- a/gum +++ b/gum @@ -1 +1 @@ -Subproject commit 34bc1b8bb41b85c6ee05484bc8747f9b3412ffa3 +Subproject commit feccfb87a9bbb4170e62c1809fe9aae537ff100d diff --git a/src/Murder/Core/Dialogs/CharacterRuntime.cs b/src/Murder/Core/Dialogs/CharacterRuntime.cs index 5e62ce2c..5a5dd410 100644 --- a/src/Murder/Core/Dialogs/CharacterRuntime.cs +++ b/src/Murder/Core/Dialogs/CharacterRuntime.cs @@ -473,7 +473,7 @@ private bool DoActionsForActiveDialog(World? world, Entity? target) } } - DoAction(actionEntity, tracker, action); + DoAction(world, actionEntity, tracker, action); } // If an entity has been created, trigger it immediately. @@ -517,7 +517,7 @@ private bool DoLineEvents(Entity? target, Line line) return true; } - private void DoAction(Entity? actionEntity, BlackboardTracker tracker, DialogAction action) + private void DoAction(World? world, Entity? actionEntity, BlackboardTracker tracker, DialogAction action) { if (action.ComponentValue is IComponent component) { @@ -532,21 +532,31 @@ private void DoAction(Entity? actionEntity, BlackboardTracker tracker, DialogAct switch (fact.Kind) { case FactKind.Bool: - tracker.SetBool(fact.Blackboard, fact.Name, action.Kind, action.BoolValue!.Value); + bool @bool = action.BoolValue!.Value; + + tracker.SetBool(fact.Blackboard, fact.Name, action.Kind, @bool); + tracker.OnFieldModifiedByDialogue(world, fact.Blackboard, fact.Name, action.Kind, @bool); break; case FactKind.Int: - tracker.SetInt(fact.Blackboard, fact.Name, action.Kind, action.IntValue!.Value); + int @int = action.IntValue!.Value; + + tracker.SetInt(fact.Blackboard, fact.Name, action.Kind, @int); + tracker.OnFieldModifiedByDialogue(world, fact.Blackboard, fact.Name, action.Kind, @int); break; case FactKind.Float: - tracker.SetFloat(fact.Blackboard, fact.Name, action.Kind, action.FloatValue!.Value); + float @float = action.FloatValue!.Value; + + tracker.SetFloat(fact.Blackboard, fact.Name, action.Kind, @float); + tracker.OnFieldModifiedByDialogue(world, fact.Blackboard, fact.Name, action.Kind, @float); break; case FactKind.String: tracker.SetString(fact.Blackboard, fact.Name, action.StrValue!); break; } + } /// diff --git a/src/Murder/Data/Save/BlackboardTracker.cs b/src/Murder/Data/Save/BlackboardTracker.cs index 6c6db89e..dab2e233 100644 --- a/src/Murder/Data/Save/BlackboardTracker.cs +++ b/src/Murder/Data/Save/BlackboardTracker.cs @@ -500,6 +500,15 @@ private T GetValue(string name) where T : notnull // Implemented by third-party } + /// + /// This provides custom proessing when a field is modified because of a dialogue action. + /// This can do custom behaviors to post-process the field. + /// + public virtual void OnFieldModifiedByDialogue(World? world, string? blackboardName, string fieldName, BlackboardActionKind kind, T value) where T : notnull + { + // Implemented by third-party + } + /// /// Set a variable value that is not available in any blackboard. ///