From 50460fd5b6b258f88389d283d1dc2a3992f453dc Mon Sep 17 00:00:00 2001 From: LP Date: Sat, 7 Jun 2025 10:36:05 +0100 Subject: [PATCH] Separated out the Rx specific portion from AdviceEngine --- .../Advisors/AdviceHandler.cs | 5 ++-- .../Factories/DefaultAdviceHandlerFactory.cs | 6 +++-- .../Considerations/ConsiderationHandler.cs | 9 ++++---- .../DefaultConsiderationHandlerFactory.cs | 6 +++-- .../Handlers/DefaultRefreshScheduler.cs | 10 ++++---- .../OpenRpg.AdviceEngine.Rx.csproj | 23 +++++++++++++++++++ .../Applicators/DefaultAdviceApplicator.cs | 1 - .../Extensions/IAgentExtensions.cs | 3 +-- .../Considerations/IConsiderationHandler.cs | 3 +-- .../Handlers/IRefreshScheduler.cs | 3 +-- .../OpenRpg.AdviceEngine.csproj | 1 - .../OpenRpg.Demos.Web.csproj | 1 + .../Pages/AdviceEngine/ExampleSetup.razor | 3 +++ src/OpenRpg.sln | 7 ++++++ 14 files changed, 58 insertions(+), 23 deletions(-) rename src/{OpenRpg.AdviceEngine/Handlers => OpenRpg.AdviceEngine.Rx}/Advisors/AdviceHandler.cs (95%) rename src/{OpenRpg.AdviceEngine/Handlers => OpenRpg.AdviceEngine.Rx}/Advisors/Factories/DefaultAdviceHandlerFactory.cs (70%) rename src/{OpenRpg.AdviceEngine/Handlers => OpenRpg.AdviceEngine.Rx}/Considerations/ConsiderationHandler.cs (95%) rename src/{OpenRpg.AdviceEngine/Handlers => OpenRpg.AdviceEngine.Rx}/Considerations/Factories/DefaultConsiderationHandlerFactory.cs (70%) rename src/{OpenRpg.AdviceEngine => OpenRpg.AdviceEngine.Rx}/Handlers/DefaultRefreshScheduler.cs (61%) create mode 100644 src/OpenRpg.AdviceEngine.Rx/OpenRpg.AdviceEngine.Rx.csproj diff --git a/src/OpenRpg.AdviceEngine/Handlers/Advisors/AdviceHandler.cs b/src/OpenRpg.AdviceEngine.Rx/Advisors/AdviceHandler.cs similarity index 95% rename from src/OpenRpg.AdviceEngine/Handlers/Advisors/AdviceHandler.cs rename to src/OpenRpg.AdviceEngine.Rx/Advisors/AdviceHandler.cs index 25498cc..6fc1b9f 100644 --- a/src/OpenRpg.AdviceEngine/Handlers/Advisors/AdviceHandler.cs +++ b/src/OpenRpg.AdviceEngine.Rx/Advisors/AdviceHandler.cs @@ -3,10 +3,11 @@ using System.Linq; using OpenRpg.AdviceEngine.Advisors; using OpenRpg.AdviceEngine.Extensions; +using OpenRpg.AdviceEngine.Handlers; +using OpenRpg.AdviceEngine.Handlers.Advisors; using OpenRpg.AdviceEngine.Variables; -using OpenRpg.Core.Common; -namespace OpenRpg.AdviceEngine.Handlers.Advisors +namespace OpenRpg.AdviceEngine.Rx.Advisors { public class AdviceHandler : IAdviceHandler { diff --git a/src/OpenRpg.AdviceEngine/Handlers/Advisors/Factories/DefaultAdviceHandlerFactory.cs b/src/OpenRpg.AdviceEngine.Rx/Advisors/Factories/DefaultAdviceHandlerFactory.cs similarity index 70% rename from src/OpenRpg.AdviceEngine/Handlers/Advisors/Factories/DefaultAdviceHandlerFactory.cs rename to src/OpenRpg.AdviceEngine.Rx/Advisors/Factories/DefaultAdviceHandlerFactory.cs index 41119ad..40edbac 100644 --- a/src/OpenRpg.AdviceEngine/Handlers/Advisors/Factories/DefaultAdviceHandlerFactory.cs +++ b/src/OpenRpg.AdviceEngine.Rx/Advisors/Factories/DefaultAdviceHandlerFactory.cs @@ -1,7 +1,9 @@ +using OpenRpg.AdviceEngine.Handlers; +using OpenRpg.AdviceEngine.Handlers.Advisors; +using OpenRpg.AdviceEngine.Handlers.Advisors.Factories; using OpenRpg.AdviceEngine.Variables; -using OpenRpg.Core.Common; -namespace OpenRpg.AdviceEngine.Handlers.Advisors.Factories +namespace OpenRpg.AdviceEngine.Rx.Advisors.Factories { public class DefaultAdviceHandlerFactory : IAdviceHandlerFactory { diff --git a/src/OpenRpg.AdviceEngine/Handlers/Considerations/ConsiderationHandler.cs b/src/OpenRpg.AdviceEngine.Rx/Considerations/ConsiderationHandler.cs similarity index 95% rename from src/OpenRpg.AdviceEngine/Handlers/Considerations/ConsiderationHandler.cs rename to src/OpenRpg.AdviceEngine.Rx/Considerations/ConsiderationHandler.cs index fa6acdf..5ee5e5c 100644 --- a/src/OpenRpg.AdviceEngine/Handlers/Considerations/ConsiderationHandler.cs +++ b/src/OpenRpg.AdviceEngine.Rx/Considerations/ConsiderationHandler.cs @@ -1,16 +1,17 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reactive; using System.Reactive.Disposables; using System.Reactive.Linq; using OpenRpg.AdviceEngine.Considerations; using OpenRpg.AdviceEngine.Extensions; +using OpenRpg.AdviceEngine.Handlers; +using OpenRpg.AdviceEngine.Handlers.Considerations; using OpenRpg.AdviceEngine.Keys; using OpenRpg.AdviceEngine.Variables; using OpenRpg.Core.Variables; -namespace OpenRpg.AdviceEngine.Handlers.Considerations +namespace OpenRpg.AdviceEngine.Rx.Considerations { public class ConsiderationHandler : IConsiderationHandler { @@ -34,7 +35,7 @@ public ConsiderationHandler(IRefreshScheduler scheduler, IUtilityVariables utili public void StartHandler() => _isRunning = true; public void StopHandler() => _isRunning = false; - public void AddConsideration(IConsideration consideration, IObservable explicitUpdateTrigger = null) + public void AddConsideration(IConsideration consideration, IObservable explicitUpdateTrigger = null) { _considerations.Add(consideration.UtilityId, consideration); UtilityVariables[consideration.UtilityId] = 0; @@ -66,7 +67,7 @@ public void ClearConsiderations() { RemoveConsideration(key); } } - private void HandleSchedulingForConsideration(IConsideration consideration, IObservable explicitUpdateTrigger = null) + private void HandleSchedulingForConsideration(IConsideration consideration, IObservable explicitUpdateTrigger = null) { if (explicitUpdateTrigger != null) { diff --git a/src/OpenRpg.AdviceEngine/Handlers/Considerations/Factories/DefaultConsiderationHandlerFactory.cs b/src/OpenRpg.AdviceEngine.Rx/Considerations/Factories/DefaultConsiderationHandlerFactory.cs similarity index 70% rename from src/OpenRpg.AdviceEngine/Handlers/Considerations/Factories/DefaultConsiderationHandlerFactory.cs rename to src/OpenRpg.AdviceEngine.Rx/Considerations/Factories/DefaultConsiderationHandlerFactory.cs index 7dd6721..01cbea9 100644 --- a/src/OpenRpg.AdviceEngine/Handlers/Considerations/Factories/DefaultConsiderationHandlerFactory.cs +++ b/src/OpenRpg.AdviceEngine.Rx/Considerations/Factories/DefaultConsiderationHandlerFactory.cs @@ -1,7 +1,9 @@ +using OpenRpg.AdviceEngine.Handlers; +using OpenRpg.AdviceEngine.Handlers.Considerations; +using OpenRpg.AdviceEngine.Handlers.Considerations.Factories; using OpenRpg.AdviceEngine.Variables; -using OpenRpg.Core.Common; -namespace OpenRpg.AdviceEngine.Handlers.Considerations.Factories +namespace OpenRpg.AdviceEngine.Rx.Considerations.Factories { public class DefaultConsiderationHandlerFactory : IConsiderationHandlerFactory { diff --git a/src/OpenRpg.AdviceEngine/Handlers/DefaultRefreshScheduler.cs b/src/OpenRpg.AdviceEngine.Rx/Handlers/DefaultRefreshScheduler.cs similarity index 61% rename from src/OpenRpg.AdviceEngine/Handlers/DefaultRefreshScheduler.cs rename to src/OpenRpg.AdviceEngine.Rx/Handlers/DefaultRefreshScheduler.cs index d2f02ec..bc69153 100644 --- a/src/OpenRpg.AdviceEngine/Handlers/DefaultRefreshScheduler.cs +++ b/src/OpenRpg.AdviceEngine.Rx/Handlers/DefaultRefreshScheduler.cs @@ -1,20 +1,20 @@ using System; -using System.Reactive; using System.Reactive.Linq; +using OpenRpg.AdviceEngine.Handlers; -namespace OpenRpg.AdviceEngine.Handlers +namespace OpenRpg.AdviceEngine.Rx.Handlers { public class DefaultRefreshScheduler : IRefreshScheduler { - public IObservable PreBuiltScheduler; + public IObservable PreBuiltScheduler; public DefaultRefreshScheduler(float defaultFrequency = 0.5f) { PreBuiltScheduler = Observable .Timer(TimeSpan.FromSeconds(defaultFrequency), TimeSpan.FromSeconds(defaultFrequency)) - .Select(x => Unit.Default); + .Select(x => true); } - public IObservable DefaultRefreshPeriod => PreBuiltScheduler; + public IObservable DefaultRefreshPeriod => PreBuiltScheduler; } } \ No newline at end of file diff --git a/src/OpenRpg.AdviceEngine.Rx/OpenRpg.AdviceEngine.Rx.csproj b/src/OpenRpg.AdviceEngine.Rx/OpenRpg.AdviceEngine.Rx.csproj new file mode 100644 index 0000000..2150f82 --- /dev/null +++ b/src/OpenRpg.AdviceEngine.Rx/OpenRpg.AdviceEngine.Rx.csproj @@ -0,0 +1,23 @@ + + + + 0.0.0 + OpenRpg.AdviceEngine.Rx + Grofit (LP) + https://github.com/openrpg/OpenRpg/blob/master/LICENSE + https://github.com/openrpg/OpenRpg + A Utility AI flavoured framework to provide advice about what entities should do + rpg game-development xna monogame unity godot rx + netstandard2.1 + 8 + + + + + + + + + + + diff --git a/src/OpenRpg.AdviceEngine/Advisors/Applicators/DefaultAdviceApplicator.cs b/src/OpenRpg.AdviceEngine/Advisors/Applicators/DefaultAdviceApplicator.cs index 560a9c9..0575c0b 100644 --- a/src/OpenRpg.AdviceEngine/Advisors/Applicators/DefaultAdviceApplicator.cs +++ b/src/OpenRpg.AdviceEngine/Advisors/Applicators/DefaultAdviceApplicator.cs @@ -1,6 +1,5 @@ using OpenRpg.AdviceEngine.Applicators; using OpenRpg.Core.Requirements; -using OpenRpg.Entities.Requirements; namespace OpenRpg.AdviceEngine.Advisors.Applicators { diff --git a/src/OpenRpg.AdviceEngine/Extensions/IAgentExtensions.cs b/src/OpenRpg.AdviceEngine/Extensions/IAgentExtensions.cs index 50a5df0..f3f3de8 100644 --- a/src/OpenRpg.AdviceEngine/Extensions/IAgentExtensions.cs +++ b/src/OpenRpg.AdviceEngine/Extensions/IAgentExtensions.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reactive; using OpenRpg.AdviceEngine.Advisors; using OpenRpg.AdviceEngine.Considerations; using OpenRpg.AdviceEngine.Keys; @@ -10,7 +9,7 @@ namespace OpenRpg.AdviceEngine.Extensions { public static class IAgentExtensions { - public static void AddConsideration(this IAgent agent, IConsideration consideration, IObservable explicitUpdateTrigger = null) + public static void AddConsideration(this IAgent agent, IConsideration consideration, IObservable explicitUpdateTrigger = null) { agent.ConsiderationHandler.AddConsideration(consideration, explicitUpdateTrigger); } public static void RemoveConsideration(this IAgent agent, int utilityId) diff --git a/src/OpenRpg.AdviceEngine/Handlers/Considerations/IConsiderationHandler.cs b/src/OpenRpg.AdviceEngine/Handlers/Considerations/IConsiderationHandler.cs index b892144..4b1d3b2 100644 --- a/src/OpenRpg.AdviceEngine/Handlers/Considerations/IConsiderationHandler.cs +++ b/src/OpenRpg.AdviceEngine/Handlers/Considerations/IConsiderationHandler.cs @@ -1,5 +1,4 @@ using System; -using System.Reactive; using OpenRpg.AdviceEngine.Considerations; using OpenRpg.AdviceEngine.Keys; using OpenRpg.AdviceEngine.Variables; @@ -14,7 +13,7 @@ public interface IConsiderationHandler : IDisposable void StartHandler(); void StopHandler(); - void AddConsideration(IConsideration consideration, IObservable explicitUpdateTrigger = null); + void AddConsideration(IConsideration consideration, IObservable explicitUpdateTrigger = null); void RemoveConsideration(UtilityKey utilityKey); void ClearConsiderations(); } diff --git a/src/OpenRpg.AdviceEngine/Handlers/IRefreshScheduler.cs b/src/OpenRpg.AdviceEngine/Handlers/IRefreshScheduler.cs index 9a6c1b8..8e55094 100644 --- a/src/OpenRpg.AdviceEngine/Handlers/IRefreshScheduler.cs +++ b/src/OpenRpg.AdviceEngine/Handlers/IRefreshScheduler.cs @@ -1,10 +1,9 @@ using System; -using System.Reactive; namespace OpenRpg.AdviceEngine.Handlers { public interface IRefreshScheduler { - IObservable DefaultRefreshPeriod { get; } + IObservable DefaultRefreshPeriod { get; } } } \ No newline at end of file diff --git a/src/OpenRpg.AdviceEngine/OpenRpg.AdviceEngine.csproj b/src/OpenRpg.AdviceEngine/OpenRpg.AdviceEngine.csproj index 37ec7fa..57e5c18 100644 --- a/src/OpenRpg.AdviceEngine/OpenRpg.AdviceEngine.csproj +++ b/src/OpenRpg.AdviceEngine/OpenRpg.AdviceEngine.csproj @@ -15,7 +15,6 @@ - diff --git a/src/OpenRpg.Demos.Web/OpenRpg.Demos.Web.csproj b/src/OpenRpg.Demos.Web/OpenRpg.Demos.Web.csproj index 8c25607..8843961 100644 --- a/src/OpenRpg.Demos.Web/OpenRpg.Demos.Web.csproj +++ b/src/OpenRpg.Demos.Web/OpenRpg.Demos.Web.csproj @@ -14,6 +14,7 @@ + diff --git a/src/OpenRpg.Demos.Web/Pages/AdviceEngine/ExampleSetup.razor b/src/OpenRpg.Demos.Web/Pages/AdviceEngine/ExampleSetup.razor index e08e8b5..d6f56f6 100644 --- a/src/OpenRpg.Demos.Web/Pages/AdviceEngine/ExampleSetup.razor +++ b/src/OpenRpg.Demos.Web/Pages/AdviceEngine/ExampleSetup.razor @@ -18,6 +18,9 @@ @using OpenRpg.AdviceEngine.Extensions @using OpenRpg.AdviceEngine.Handlers.Advisors.Factories @using OpenRpg.AdviceEngine.Handlers.Considerations.Factories +@using OpenRpg.AdviceEngine.Rx.Advisors.Factories +@using OpenRpg.AdviceEngine.Rx.Considerations.Factories +@using OpenRpg.AdviceEngine.Rx.Handlers @using OpenRpg.AdviceEngine.Variables @using OpenRpg.Core.Requirements @using OpenRpg.Entities.Requirements diff --git a/src/OpenRpg.sln b/src/OpenRpg.sln index bb8d684..cea1991 100644 --- a/src/OpenRpg.sln +++ b/src/OpenRpg.sln @@ -76,6 +76,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRpg.Editor", "OpenRpg.E EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRpg.Entities", "OpenRpg.Entities\OpenRpg.Entities.csproj", "{776F3D4B-B89F-4407-BAA7-5E367F643B69}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenRpg.AdviceEngine.Rx", "OpenRpg.AdviceEngine.Rx\OpenRpg.AdviceEngine.Rx.csproj", "{EBA05F43-4988-4B73-9E11-23360C1BF9A1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -182,6 +184,10 @@ Global {776F3D4B-B89F-4407-BAA7-5E367F643B69}.Debug|Any CPU.Build.0 = Debug|Any CPU {776F3D4B-B89F-4407-BAA7-5E367F643B69}.Release|Any CPU.ActiveCfg = Release|Any CPU {776F3D4B-B89F-4407-BAA7-5E367F643B69}.Release|Any CPU.Build.0 = Release|Any CPU + {EBA05F43-4988-4B73-9E11-23360C1BF9A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBA05F43-4988-4B73-9E11-23360C1BF9A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBA05F43-4988-4B73-9E11-23360C1BF9A1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBA05F43-4988-4B73-9E11-23360C1BF9A1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {86FD715B-0B33-40EB-B8AC-25EE62398A66} = {6BE3D2A4-F53A-4879-868E-A7522A445FE9} @@ -209,5 +215,6 @@ Global {4BF19FBA-6C19-486B-A87D-D588581DC40E} = {8BEAB2AD-426F-41A7-8378-8D29B8C07D26} {A71DC9D4-43E8-4E3C-B294-29B0C2E87C39} = {8BEAB2AD-426F-41A7-8378-8D29B8C07D26} {776F3D4B-B89F-4407-BAA7-5E367F643B69} = {6BE3D2A4-F53A-4879-868E-A7522A445FE9} + {EBA05F43-4988-4B73-9E11-23360C1BF9A1} = {9ABACD9E-828C-48B7-985D-CFC03A05DF8D} EndGlobalSection EndGlobal