mirror of
https://github.com/Bragin-Stepan/project-entity.git
synced 2026-03-05 07:41:10 +00:00
feat: add state machine
This commit is contained in:
@@ -3,7 +3,7 @@ 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;
|
||||
using UnityEngine;
|
||||
|
||||
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
|
||||
{
|
||||
@@ -11,52 +11,52 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
|
||||
{
|
||||
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;
|
||||
|
||||
int regenAmount= (int)math.floor(_maxEnergy.Value * (percentage / 100f));
|
||||
|
||||
|
||||
int regenAmount = (int)Mathf.Floor(_maxEnergy.Value * (percentage / 100f));
|
||||
|
||||
if (regenAmount < 1 && _maxEnergy.Value > 0)
|
||||
regenAmount = 1;
|
||||
|
||||
int valueAdded = math.min(regenAmount, energyDifference);
|
||||
|
||||
int valueAdded = Mathf.Min(regenAmount, energyDifference);
|
||||
|
||||
_currentEnergy.Value += valueAdded;
|
||||
|
||||
|
||||
_regenEnergyEvent.Invoke(valueAdded);
|
||||
}
|
||||
|
||||
|
||||
public void OnDispose()
|
||||
{
|
||||
_regenRequestDispose.Dispose();
|
||||
|
||||
@@ -3,7 +3,6 @@ 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;
|
||||
using UnityEngine;
|
||||
|
||||
namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
|
||||
@@ -12,47 +11,47 @@ namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Energy.Systems
|
||||
{
|
||||
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 value)
|
||||
{
|
||||
if (value <= 0)
|
||||
throw new ArgumentException("Energy regen value must be positive", nameof(value));
|
||||
|
||||
|
||||
if (_canRegen.Evaluate() == false)
|
||||
return;
|
||||
|
||||
|
||||
int energyDifference = _maxEnergy.Value - _currentEnergy.Value;
|
||||
|
||||
|
||||
if (energyDifference <= 0)
|
||||
return;
|
||||
|
||||
int valueAdded = math.min(value, energyDifference);
|
||||
|
||||
|
||||
int valueAdded = Mathf.Min(value, energyDifference);
|
||||
|
||||
_currentEnergy.Value += valueAdded;
|
||||
|
||||
|
||||
_regenEnergyEvent.Invoke(valueAdded);
|
||||
}
|
||||
|
||||
|
||||
public void OnDispose()
|
||||
{
|
||||
_regenRequestDispose.Dispose();
|
||||
|
||||
Reference in New Issue
Block a user