From 809958ec3504814e42b322b7328d57afcbe21275 Mon Sep 17 00:00:00 2001 From: Bragin Stepan Date: Sun, 22 Feb 2026 15:03:12 +0500 Subject: [PATCH] feat: add energy system --- .../Gameplay/Entities/Generated/EntityAPI.cs | 278 ++++++++++++++++++ .../Logic/Gameplay/Features/Energy.meta | 3 + .../Features/Energy/EnergyComponents.cs | 23 ++ .../Features/Energy/EnergyComponents.cs.meta | 3 + .../Gameplay/Features/Energy/Systems.meta | 3 + .../Systems/AutoRegenEnergyTimerSystem.cs | 43 +++ .../AutoRegenEnergyTimerSystem.cs.meta | 3 + .../Energy/Systems/RegenEnergySystem.cs | 60 ++++ .../Energy/Systems/RegenEnergySystem.cs.meta | 3 + .../Energy/Systems/UseEnergySystem.cs | 50 ++++ .../Energy/Systems/UseEnergySystem.cs.meta | 3 + 11 files changed, 472 insertions(+) create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/EnergyComponents.cs create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/EnergyComponents.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/AutoRegenEnergyTimerSystem.cs create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/AutoRegenEnergyTimerSystem.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/UseEnergySystem.cs create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/UseEnergySystem.cs.meta diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs index 6b6cdf5..c61aed7 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs @@ -628,6 +628,284 @@ namespace _Project.Develop.Runtime.Entities return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Lifetime.DisableCollidersOnDeath() {Value = value}); } + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CurrentEnergy CurrentEnergyC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CurrentEnergy>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable CurrentEnergy => CurrentEnergyC.Value; + + public bool TryGetCurrentEnergy(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CurrentEnergy component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddCurrentEnergy() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CurrentEnergy() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddCurrentEnergy(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CurrentEnergy() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.MaxEnergy MaxEnergyC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.MaxEnergy>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable MaxEnergy => MaxEnergyC.Value; + + public bool TryGetMaxEnergy(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.MaxEnergy component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddMaxEnergy() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.MaxEnergy() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddMaxEnergy(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.MaxEnergy() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanUseEnergy CanUseEnergyC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanUseEnergy>(); + + public _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition CanUseEnergy => CanUseEnergyC.Value; + + public bool TryGetCanUseEnergy(out _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanUseEnergy component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddCanUseEnergy(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanUseEnergy() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyRequest UseEnergyRequestC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyRequest>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent UseEnergyRequest => UseEnergyRequestC.Value; + + public bool TryGetUseEnergyRequest(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyRequest component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddUseEnergyRequest() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyRequest() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddUseEnergyRequest(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyRequest() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyEvent UseEnergyEventC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyEvent>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent UseEnergyEvent => UseEnergyEventC.Value; + + public bool TryGetUseEnergyEvent(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyEvent component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddUseEnergyEvent() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyEvent() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddUseEnergyEvent(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.UseEnergyEvent() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanRegenEnergy CanRegenEnergyC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanRegenEnergy>(); + + public _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition CanRegenEnergy => CanRegenEnergyC.Value; + + public bool TryGetCanRegenEnergy(out _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanRegenEnergy component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddCanRegenEnergy(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.CanRegenEnergy() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyRequest RegenEnergyRequestC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyRequest>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent RegenEnergyRequest => RegenEnergyRequestC.Value; + + public bool TryGetRegenEnergyRequest(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyRequest component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddRegenEnergyRequest() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyRequest() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddRegenEnergyRequest(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyRequest() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyEvent RegenEnergyEventC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyEvent>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent RegenEnergyEvent => RegenEnergyEventC.Value; + + public bool TryGetRegenEnergyEvent(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyEvent component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddRegenEnergyEvent() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyEvent() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddRegenEnergyEvent(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.RegenEnergyEvent() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.AutoRegenEnergyAmount AutoRegenEnergyAmountC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.AutoRegenEnergyAmount>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable AutoRegenEnergyAmount => AutoRegenEnergyAmountC.Value; + + public bool TryGetAutoRegenEnergyAmount(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.AutoRegenEnergyAmount component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddAutoRegenEnergyAmount() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.AutoRegenEnergyAmount() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddAutoRegenEnergyAmount(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.AutoRegenEnergyAmount() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.InAutoRegenEnergy InAutoRegenEnergyC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.InAutoRegenEnergy>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable InAutoRegenEnergy => InAutoRegenEnergyC.Value; + + public bool TryGetInAutoRegenEnergy(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.InAutoRegenEnergy component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddInAutoRegenEnergy() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.InAutoRegenEnergy() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddInAutoRegenEnergy(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.InAutoRegenEnergy() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenInitialTime EnergyAutoRegenInitialTimeC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenInitialTime>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable EnergyAutoRegenInitialTime => EnergyAutoRegenInitialTimeC.Value; + + public bool TryGetEnergyAutoRegenInitialTime(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenInitialTime component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddEnergyAutoRegenInitialTime() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenInitialTime() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddEnergyAutoRegenInitialTime(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenInitialTime() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenCurrentTime EnergyAutoRegenCurrentTimeC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenCurrentTime>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable EnergyAutoRegenCurrentTime => EnergyAutoRegenCurrentTimeC.Value; + + public bool TryGetEnergyAutoRegenCurrentTime(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenCurrentTime component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddEnergyAutoRegenCurrentTime() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenCurrentTime() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddEnergyAutoRegenCurrentTime(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.EnergyAutoRegenCurrentTime() {Value = value}); + } + public _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageRequest TakeDamageRequestC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Damage.TakeDamageRequest>(); public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent TakeDamageRequest => TakeDamageRequestC.Value; diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy.meta new file mode 100644 index 0000000..953982f --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c78247f0460346b9ac065e10c8200ad1 +timeCreated: 1771750078 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/EnergyComponents.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/EnergyComponents.cs new file mode 100644 index 0000000..19eb98a --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/EnergyComponents.cs @@ -0,0 +1,23 @@ +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Utilities.Conditions; +using _Project.Develop.Runtime.Utils.ReactiveManagement; +using _Project.Develop.Runtime.Utils.ReactiveManagement.Event; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy +{ + public class CurrentEnergy : IEntityComponent { public ReactiveVariable Value; } + public class MaxEnergy : IEntityComponent { public ReactiveVariable Value; } + + public class CanUseEnergy : IEntityComponent { public ICompositeCondition Value; } + public class UseEnergyRequest : IEntityComponent { public ReactiveEvent Value; } + public class UseEnergyEvent : IEntityComponent { public ReactiveEvent Value; } + + public class CanRegenEnergy : IEntityComponent { public ICompositeCondition Value; } + public class RegenEnergyRequest : IEntityComponent { public ReactiveEvent Value; } + public class RegenEnergyEvent : IEntityComponent { public ReactiveEvent Value; } + + public class AutoRegenEnergyAmount : IEntityComponent { public ReactiveVariable Value; } + public class InAutoRegenEnergy : IEntityComponent { public ReactiveVariable Value; } + public class EnergyAutoRegenInitialTime : IEntityComponent { public ReactiveVariable Value; } + public class EnergyAutoRegenCurrentTime : IEntityComponent { public ReactiveVariable Value; } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/EnergyComponents.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/EnergyComponents.cs.meta new file mode 100644 index 0000000..53b4959 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/EnergyComponents.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a68596f1e7224a52a8b0fd4f8fa6d615 +timeCreated: 1771750088 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems.meta new file mode 100644 index 0000000..c6748e2 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 42c288d27514401b8476a278887ed7b2 +timeCreated: 1771750377 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/AutoRegenEnergyTimerSystem.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/AutoRegenEnergyTimerSystem.cs new file mode 100644 index 0000000..0832e0d --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/AutoRegenEnergyTimerSystem.cs @@ -0,0 +1,43 @@ +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Utils.ReactiveManagement; +using _Project.Develop.Runtime.Utils.ReactiveManagement.Event; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems +{ + public class AutoRegenEnergyTimerSystem : IInitializableSystem, IUpdatableSystem + { + private ReactiveEvent _regenEnergyRequest; + + private ReactiveVariable _initialTime; + private ReactiveVariable _currentTime; + + private ReactiveVariable _regenAmount; + + private ReactiveVariable _inAutoRegen; + + public void OnInit(Entity entity) + { + _inAutoRegen = entity.InAutoRegenEnergy; + _regenAmount = entity.AutoRegenEnergyAmount; + + _initialTime = entity.EnergyAutoRegenInitialTime; + _currentTime = entity.EnergyAutoRegenCurrentTime; + } + + public void OnUpdate(float deltaTime) + { + if (_inAutoRegen.Value == false) + return; + + _currentTime.Value += deltaTime; + + if (TimeIsDone(_currentTime.Value)) + { + _currentTime.Value = 0; + _regenEnergyRequest.Invoke(_regenAmount.Value); + } + } + + private bool TimeIsDone(float currentTime) => currentTime >= _initialTime.Value; + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/AutoRegenEnergyTimerSystem.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/AutoRegenEnergyTimerSystem.cs.meta new file mode 100644 index 0000000..1d6289a --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/AutoRegenEnergyTimerSystem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 13f11edf9c9548bbbe68d2762342dfac +timeCreated: 1771751485 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs new file mode 100644 index 0000000..d45a660 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs @@ -0,0 +1,60 @@ +using System; +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Utilities.Conditions; +using _Project.Develop.Runtime.Utils.ReactiveManagement; +using _Project.Develop.Runtime.Utils.ReactiveManagement.Event; +using Unity.Mathematics; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems +{ + public class RegenEnergySystem : IInitializableSystem, IDisposableSystem + { + private ReactiveEvent _regenEnergyRequest; + private ReactiveEvent _regenEnergyEvent; + + private ReactiveVariable _currentEnergy; + private ReactiveVariable _maxEnergy; + + private ICompositeCondition _canRegen; + + private IDisposable _regenRequestDispose; + + public void OnInit(Entity entity) + { + _currentEnergy = entity.CurrentEnergy; + _maxEnergy = entity.MaxEnergy; + + _regenEnergyRequest = entity.RegenEnergyRequest; + _regenEnergyEvent = entity.RegenEnergyEvent; + + _canRegen = entity.CanRegenEnergy; + + _regenRequestDispose = _regenEnergyRequest.Subscribe(OnRegenRequest); + } + + private void OnRegenRequest(int value) + { + if (value <= 0) + throw new ArgumentException($"Energy regen value must be positive. Received: {value}", nameof(value)); + + if (_canRegen.Evaluate() == false) + return; + + int energyDifference = _maxEnergy.Value - _currentEnergy.Value; + + if (energyDifference <= 0f) + return; + + int valueAdded = math.min(value, energyDifference); + + _currentEnergy.Value += valueAdded; + + _regenEnergyEvent.Invoke(value); + } + + public void OnDispose() + { + _regenRequestDispose.Dispose(); + } + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs.meta new file mode 100644 index 0000000..70ebcc3 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8ca447304efc4cf89e9aa4255df05e93 +timeCreated: 1771754143 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/UseEnergySystem.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/UseEnergySystem.cs new file mode 100644 index 0000000..e35226f --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/UseEnergySystem.cs @@ -0,0 +1,50 @@ +using System; +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Utilities.Conditions; +using _Project.Develop.Runtime.Utils.ReactiveManagement; +using _Project.Develop.Runtime.Utils.ReactiveManagement.Event; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems +{ + public class UseEnergySystem : IInitializableSystem, IDisposableSystem + { + private ReactiveEvent _useEnergyRequest; + private ReactiveEvent _useEnergyEvent; + + private ReactiveVariable _currentEnergy; + + private ICompositeCondition _canUse; + + private IDisposable _useRequestDispose; + + public void OnInit(Entity entity) + { + _currentEnergy = entity.CurrentEnergy; + + _useEnergyRequest = entity.RegenEnergyRequest; + _useEnergyEvent = entity.RegenEnergyEvent; + + _canUse = entity.CanRegenEnergy; + + _useRequestDispose = _useEnergyRequest.Subscribe(OnRegenRequest); + } + + private void OnRegenRequest(int value) + { + if (value <= 0) + throw new ArgumentException($"Energy use value must be positive. Received: {value}", nameof(value)); + + if (_canUse.Evaluate() == false || _currentEnergy.Value < value) + return; + + _currentEnergy.Value -= value; + + _useEnergyEvent.Invoke(value); + } + + public void OnDispose() + { + _useRequestDispose.Dispose(); + } + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/UseEnergySystem.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/UseEnergySystem.cs.meta new file mode 100644 index 0000000..1140782 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/UseEnergySystem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8fd8b95b8162461c995fd1c494efc614 +timeCreated: 1771754446 \ No newline at end of file