mirror of
https://github.com/Bragin-Stepan/project-entity.git
synced 2026-03-02 22:31:10 +00:00
feat: add regen energy by percentage system
This commit is contained in:
@@ -239,7 +239,7 @@ namespace _Project.Develop.Runtime.Entities
|
||||
.AddUseEnergyRequest()
|
||||
.AddRegenEnergyEvent()
|
||||
.AddRegenEnergyRequest()
|
||||
.AddAutoRegenEnergyAmount(new ReactiveVariable<int>(5))
|
||||
.AddAutoRegenEnergyAmount(new ReactiveVariable<int>(10))
|
||||
.AddIsAutoRegenEnergy(new ReactiveVariable<bool>(true))
|
||||
.AddEnergyAutoRegenCurrentTime()
|
||||
.AddEnergyAutoRegenInitialTime(new ReactiveVariable<float>(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())
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 64b02472a4344eecb0b2d2f27d44e3a3
|
||||
timeCreated: 1771774135
|
||||
@@ -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<int> _regenEnergyRequest;
|
||||
private ReactiveEvent<int> _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()
|
||||
Reference in New Issue
Block a user