From ed6969c16ae0a3f1a23d86c9dcda16d557cc5e01 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sun, 4 May 2025 18:57:26 +0300 Subject: [PATCH] feat: progression trackers added --- .../Progression/IProgressionTracker.cs | 7 ++++ .../IReadOnlyProgressionTracker.cs | 13 +++++++ .../Helpers/Progression/ProgressionTracker.cs | 36 +++++++++++++++++++ .../Helpers/Progression/ProgressiveTask.cs | 9 +++++ 4 files changed, 65 insertions(+) create mode 100644 Engine.Core/Helpers/Progression/IProgressionTracker.cs create mode 100644 Engine.Core/Helpers/Progression/IReadOnlyProgressionTracker.cs create mode 100644 Engine.Core/Helpers/Progression/ProgressionTracker.cs create mode 100644 Engine.Core/Helpers/Progression/ProgressiveTask.cs diff --git a/Engine.Core/Helpers/Progression/IProgressionTracker.cs b/Engine.Core/Helpers/Progression/IProgressionTracker.cs new file mode 100644 index 0000000..7edd8a6 --- /dev/null +++ b/Engine.Core/Helpers/Progression/IProgressionTracker.cs @@ -0,0 +1,7 @@ +namespace Syntriax.Engine.Core; + +public interface IProgressionTracker : IReadOnlyProgressionTracker +{ + void Set(float progression, string status); + void Reset(); +} diff --git a/Engine.Core/Helpers/Progression/IReadOnlyProgressionTracker.cs b/Engine.Core/Helpers/Progression/IReadOnlyProgressionTracker.cs new file mode 100644 index 0000000..0daed26 --- /dev/null +++ b/Engine.Core/Helpers/Progression/IReadOnlyProgressionTracker.cs @@ -0,0 +1,13 @@ +namespace Syntriax.Engine.Core; + +public interface IReadOnlyProgressionTracker +{ + event ProgressionUpdatedEventHandler? OnUpdated; + event ProgressionEndedEventHandler? OnEnded; + + float Progression { get; } + string Status { get; } + + delegate void ProgressionUpdatedEventHandler(IReadOnlyProgressionTracker sender, float previousProgression, string previousStatus); + delegate void ProgressionEndedEventHandler(IReadOnlyProgressionTracker sender); +} diff --git a/Engine.Core/Helpers/Progression/ProgressionTracker.cs b/Engine.Core/Helpers/Progression/ProgressionTracker.cs new file mode 100644 index 0000000..ab87662 --- /dev/null +++ b/Engine.Core/Helpers/Progression/ProgressionTracker.cs @@ -0,0 +1,36 @@ +namespace Syntriax.Engine.Core; + +public class ProgressionTracker : IProgressionTracker +{ + public event IReadOnlyProgressionTracker.ProgressionUpdatedEventHandler? OnUpdated = null; + public event IReadOnlyProgressionTracker.ProgressionEndedEventHandler? OnEnded = null; + + public float Progression { get; private set; } = 0f; + public string Status { get; private set; } = "Default"; + + void IProgressionTracker.Set(float progression, string status) + { + if (Progression >= 1f) + return; + + float previousProgression = Progression; + string previousStatus = Status; + + Progression = progression.Clamp(Progression, 1f); + Status = status; + + OnUpdated?.InvokeSafe(this, previousProgression, previousStatus); + + if (progression >= 1f) + OnEnded?.InvokeSafe(this); + } + + void IProgressionTracker.Reset() + { + Progression = 0f; + Status = "Default"; + + OnUpdated = null; + OnEnded = null; + } +} diff --git a/Engine.Core/Helpers/Progression/ProgressiveTask.cs b/Engine.Core/Helpers/Progression/ProgressiveTask.cs new file mode 100644 index 0000000..701027c --- /dev/null +++ b/Engine.Core/Helpers/Progression/ProgressiveTask.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Syntriax.Engine.Core; + +public record struct ProgressiveTask(IReadOnlyProgressionTracker ProgressionTracker, Task Task) +{ + public static implicit operator (IReadOnlyProgressionTracker progressionTracker, Task task)(ProgressiveTask value) => (value.ProgressionTracker, value.Task); + public static implicit operator ProgressiveTask((IReadOnlyProgressionTracker progressionTracker, Task task) value) => new(value.progressionTracker, value.task); +}