feat: add regen energy by percentage system

This commit is contained in:
Bragin Stepan
2026-02-22 20:39:26 +05:00
parent 63cae4cf60
commit 542a7a17c2
5 changed files with 75 additions and 5 deletions

View File

@@ -239,7 +239,7 @@ namespace _Project.Develop.Runtime.Entities
.AddUseEnergyRequest() .AddUseEnergyRequest()
.AddRegenEnergyEvent() .AddRegenEnergyEvent()
.AddRegenEnergyRequest() .AddRegenEnergyRequest()
.AddAutoRegenEnergyAmount(new ReactiveVariable<int>(5)) .AddAutoRegenEnergyAmount(new ReactiveVariable<int>(10))
.AddIsAutoRegenEnergy(new ReactiveVariable<bool>(true)) .AddIsAutoRegenEnergy(new ReactiveVariable<bool>(true))
.AddEnergyAutoRegenCurrentTime() .AddEnergyAutoRegenCurrentTime()
.AddEnergyAutoRegenInitialTime(new ReactiveVariable<float>(3)) .AddEnergyAutoRegenInitialTime(new ReactiveVariable<float>(3))
@@ -283,7 +283,8 @@ namespace _Project.Develop.Runtime.Entities
entity entity
.AddSystem(new TeleportByInputSystem(_playerInput)) .AddSystem(new TeleportByInputSystem(_playerInput))
.AddSystem(new RegenEnergySystem()) // .AddSystem(new RegenEnergyByValueSystem())
.AddSystem(new RegenEnergyByPercentageSystem())
.AddSystem(new UseEnergySystem()) .AddSystem(new UseEnergySystem())
.AddSystem(new AutoRegenEnergyTimerSystem()) .AddSystem(new AutoRegenEnergyTimerSystem())

View File

@@ -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<int> _regenEnergyRequest;
private ReactiveEvent<int> _regenEnergyEvent;
private ReactiveVariable<int> _currentEnergy;
private ReactiveVariable<int> _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();
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 64b02472a4344eecb0b2d2f27d44e3a3
timeCreated: 1771774135

View File

@@ -8,7 +8,7 @@ using UnityEngine;
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
{ {
public class RegenEnergySystem : IInitializableSystem, IDisposableSystem public class RegenEnergyByValueSystem : IInitializableSystem, IDisposableSystem
{ {
private ReactiveEvent<int> _regenEnergyRequest; private ReactiveEvent<int> _regenEnergyRequest;
private ReactiveEvent<int> _regenEnergyEvent; private ReactiveEvent<int> _regenEnergyEvent;
@@ -36,7 +36,7 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
private void OnRegenRequest(int value) private void OnRegenRequest(int value)
{ {
if (value <= 0) 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) if (_canRegen.Evaluate() == false)
return; return;
@@ -50,7 +50,7 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
_currentEnergy.Value += valueAdded; _currentEnergy.Value += valueAdded;
_regenEnergyEvent.Invoke(value); _regenEnergyEvent.Invoke(valueAdded);
} }
public void OnDispose() public void OnDispose()