diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs index 32c8021..3a8703c 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs @@ -239,7 +239,7 @@ namespace _Project.Develop.Runtime.Entities .AddUseEnergyRequest() .AddRegenEnergyEvent() .AddRegenEnergyRequest() - .AddAutoRegenEnergyAmount(new ReactiveVariable(5)) + .AddAutoRegenEnergyAmount(new ReactiveVariable(10)) .AddIsAutoRegenEnergy(new ReactiveVariable(true)) .AddEnergyAutoRegenCurrentTime() .AddEnergyAutoRegenInitialTime(new ReactiveVariable(3)) @@ -283,7 +283,8 @@ namespace _Project.Develop.Runtime.Entities entity .AddSystem(new TeleportByInputSystem(_playerInput)) - .AddSystem(new RegenEnergySystem()) + // .AddSystem(new RegenEnergyByValueSystem()) + .AddSystem(new RegenEnergyByPercentageSystem()) .AddSystem(new UseEnergySystem()) .AddSystem(new AutoRegenEnergyTimerSystem()) diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergyByPercentageSystem.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergyByPercentageSystem.cs new file mode 100644 index 0000000..ba5925c --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergyByPercentageSystem.cs @@ -0,0 +1,66 @@ +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 RegenEnergyByPercentageSystem : 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 percentage) + { + if (percentage <= 0) + throw new ArgumentException("Energy regen percentage must be positive", nameof(percentage)); + + if (_canRegen.Evaluate() == false) + return; + + int energyDifference = _maxEnergy.Value - _currentEnergy.Value; + + if (energyDifference <= 0) + return; + + float regenAmountFloat = _maxEnergy.Value * (percentage / 100f); + int regenAmount = (int)math.floor(regenAmountFloat); + + if (regenAmount < 1 && _maxEnergy.Value > 0) + regenAmount = 1; + + int valueAdded = math.min(regenAmount, energyDifference); + + _currentEnergy.Value += valueAdded; + + _regenEnergyEvent.Invoke(valueAdded); + } + + public void OnDispose() + { + _regenRequestDispose.Dispose(); + } + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergyByPercentageSystem.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergyByPercentageSystem.cs.meta new file mode 100644 index 0000000..790afd2 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergyByPercentageSystem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 64b02472a4344eecb0b2d2f27d44e3a3 +timeCreated: 1771774135 \ 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/RegenEnergyByValueSystem.cs similarity index 87% rename from Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs rename to Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergyByValueSystem.cs index 1643214..a563f6f 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergyByValueSystem.cs @@ -8,7 +8,7 @@ using UnityEngine; namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems { - public class RegenEnergySystem : IInitializableSystem, IDisposableSystem + public class RegenEnergyByValueSystem : IInitializableSystem, IDisposableSystem { private ReactiveEvent _regenEnergyRequest; private ReactiveEvent _regenEnergyEvent; @@ -36,7 +36,7 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems private void OnRegenRequest(int value) { if (value <= 0) - throw new ArgumentException($"Energy regen value must be positive. Received: {value}", nameof(value)); + throw new ArgumentException("Energy regen value must be positive", nameof(value)); if (_canRegen.Evaluate() == false) return; @@ -50,7 +50,7 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems _currentEnergy.Value += valueAdded; - _regenEnergyEvent.Invoke(value); + _regenEnergyEvent.Invoke(valueAdded); } public void OnDispose() 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/RegenEnergyByValueSystem.cs.meta similarity index 100% rename from Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergySystem.cs.meta rename to Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Energy/Systems/RegenEnergyByValueSystem.cs.meta