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()
|
.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())
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
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()
|
||||||
Reference in New Issue
Block a user