Add LightFootedEffect and StatusManager for player capabilities management
This commit is contained in:
3
Assets/Scripts/Core/Domain/Status/Effects.meta
Normal file
3
Assets/Scripts/Core/Domain/Status/Effects.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6787efe77d5b42eabca4db1f4e8f9601
|
||||
timeCreated: 1765575039
|
||||
@@ -0,0 +1,33 @@
|
||||
namespace Core.Domain.Status.Effects
|
||||
{
|
||||
public class LightFootedEffect : IStatusEffect
|
||||
{
|
||||
private float _duration;
|
||||
|
||||
public bool IsExpired => _duration <= 0;
|
||||
|
||||
public LightFootedEffect(float duration)
|
||||
{
|
||||
_duration = duration;
|
||||
}
|
||||
|
||||
public void Tick(float deltaTime)
|
||||
{
|
||||
_duration -= deltaTime;
|
||||
}
|
||||
|
||||
public void ModifyCapabilities(ref PlayerCapabilities caps)
|
||||
{
|
||||
caps.CanTriggerDecay = false;
|
||||
caps.SpeedMultiplier = 1.2f;
|
||||
}
|
||||
|
||||
public void OnApply()
|
||||
{
|
||||
}
|
||||
|
||||
public void OnRemove()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3569c07e1bba489d8835de24488cfef8
|
||||
timeCreated: 1765575047
|
||||
11
Assets/Scripts/Core/Domain/Status/IStatusEffect.cs
Normal file
11
Assets/Scripts/Core/Domain/Status/IStatusEffect.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
namespace Core.Domain.Status
|
||||
{
|
||||
public interface IStatusEffect
|
||||
{
|
||||
bool IsExpired { get; }
|
||||
void Tick(float deltaTime);
|
||||
void ModifyCapabilities(ref PlayerCapabilities caps);
|
||||
void OnApply();
|
||||
void OnRemove();
|
||||
}
|
||||
}
|
||||
3
Assets/Scripts/Core/Domain/Status/IStatusEffect.cs.meta
Normal file
3
Assets/Scripts/Core/Domain/Status/IStatusEffect.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 08db161381444423960b7deec94f48c1
|
||||
timeCreated: 1765574975
|
||||
14
Assets/Scripts/Core/Domain/Status/PlayerCapabilities.cs
Normal file
14
Assets/Scripts/Core/Domain/Status/PlayerCapabilities.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace Core.Domain.Status
|
||||
{
|
||||
public struct PlayerCapabilities
|
||||
{
|
||||
public bool CanTriggerDecay;
|
||||
public float SpeedMultiplier;
|
||||
|
||||
public static PlayerCapabilities Default => new PlayerCapabilities
|
||||
{
|
||||
CanTriggerDecay = true,
|
||||
SpeedMultiplier = 1f
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6c868f630ebc4cccad39e452e03e1025
|
||||
timeCreated: 1765574915
|
||||
50
Assets/Scripts/Core/Domain/Status/StatusManager.cs
Normal file
50
Assets/Scripts/Core/Domain/Status/StatusManager.cs
Normal file
@@ -0,0 +1,50 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Core.Domain.Status
|
||||
{
|
||||
public class StatusManager
|
||||
{
|
||||
private readonly List<IStatusEffect> _activeEffects = new();
|
||||
|
||||
public PlayerCapabilities CurrentCapabilities { get; private set; }
|
||||
|
||||
public StatusManager()
|
||||
{
|
||||
Recalculate();
|
||||
}
|
||||
|
||||
public void AddEffect(IStatusEffect effect)
|
||||
{
|
||||
_activeEffects.Add(effect);
|
||||
effect.OnApply();
|
||||
Recalculate();
|
||||
}
|
||||
|
||||
public void Tick(float deltaTime)
|
||||
{
|
||||
for (var i = _activeEffects.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var effect = _activeEffects[i];
|
||||
effect.Tick(deltaTime);
|
||||
|
||||
if (!effect.IsExpired) continue;
|
||||
|
||||
effect.OnRemove();
|
||||
_activeEffects.RemoveAt(i);
|
||||
Recalculate();
|
||||
}
|
||||
}
|
||||
|
||||
private void Recalculate()
|
||||
{
|
||||
var caps = PlayerCapabilities.Default;
|
||||
|
||||
foreach (var effect in _activeEffects)
|
||||
{
|
||||
effect.ModifyCapabilities(ref caps);
|
||||
}
|
||||
|
||||
CurrentCapabilities = caps;
|
||||
}
|
||||
}
|
||||
}
|
||||
3
Assets/Scripts/Core/Domain/Status/StatusManager.cs.meta
Normal file
3
Assets/Scripts/Core/Domain/Status/StatusManager.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8e8580a304be4347a63e7dc0060fdc7b
|
||||
timeCreated: 1765575109
|
||||
Reference in New Issue
Block a user