Add LightFootedEffect and StatusManager for player capabilities management

This commit is contained in:
2025-12-12 22:35:39 +01:00
parent 3774fb9900
commit 1cfcd09928
11 changed files with 140 additions and 2 deletions

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6787efe77d5b42eabca4db1f4e8f9601
timeCreated: 1765575039

View File

@@ -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()
{
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3569c07e1bba489d8835de24488cfef8
timeCreated: 1765575047

View 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();
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 08db161381444423960b7deec94f48c1
timeCreated: 1765574975

View 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
};
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6c868f630ebc4cccad39e452e03e1025
timeCreated: 1765574915

View 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;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8e8580a304be4347a63e7dc0060fdc7b
timeCreated: 1765575109