Refactor character attributes system; replace individual attributes with a dictionary-based approach for better scalability and maintainability
This commit is contained in:
@@ -1,13 +1,14 @@
|
||||
using System;
|
||||
using Data;
|
||||
using Interfaces;
|
||||
using Attribute = Data.Attribute;
|
||||
|
||||
namespace Modifiers
|
||||
{
|
||||
[Serializable]
|
||||
public class FlatStatModifier : IStatModifier
|
||||
{
|
||||
public Stat stat;
|
||||
public Attribute stat;
|
||||
public float value;
|
||||
public string Description => BuildDescription();
|
||||
|
||||
@@ -30,35 +31,35 @@ namespace Modifiers
|
||||
{
|
||||
switch (stat)
|
||||
{
|
||||
case Stat.Health:
|
||||
attributes.ModifyHealth(value);
|
||||
case Attribute.Health:
|
||||
attributes.Modify(Attribute.Health, value);
|
||||
break;
|
||||
case Stat.MaxHealth:
|
||||
attributes.ModifyMaxHealth(value);
|
||||
case Attribute.MaxHealth:
|
||||
attributes.Modify(Attribute.MaxHealth, value);
|
||||
break;
|
||||
case Stat.MoveSpeed:
|
||||
attributes.ModifyMoveSpeed(value);
|
||||
case Attribute.MoveSpeed:
|
||||
attributes.Modify(Attribute.MoveSpeed, value);
|
||||
break;
|
||||
case Stat.Luck:
|
||||
attributes.ModifyLuck(value);
|
||||
case Attribute.Luck:
|
||||
attributes.Modify(Attribute.Luck, value);
|
||||
break;
|
||||
case Stat.Armor:
|
||||
attributes.ModifyArmor(value);
|
||||
case Attribute.Armor:
|
||||
attributes.Modify(Attribute.Armor, value);
|
||||
break;
|
||||
case Stat.Damage:
|
||||
attributes.ModifyDamage(value);
|
||||
case Attribute.Damage:
|
||||
attributes.Modify(Attribute.Damage, value);
|
||||
break;
|
||||
case Stat.RangedDamage:
|
||||
attributes.ModifyRangedDamage(value);
|
||||
case Attribute.RangedDamage:
|
||||
attributes.Modify(Attribute.RangedDamage, value);
|
||||
break;
|
||||
case Stat.MeleeDamage:
|
||||
attributes.ModifyMeleeDamage(value);
|
||||
case Attribute.MeleeDamage:
|
||||
attributes.Modify(Attribute.MeleeDamage, value);
|
||||
break;
|
||||
case Stat.AttackRange:
|
||||
attributes.ModifyAttackRange(value);
|
||||
case Attribute.AttackRange:
|
||||
attributes.Modify(Attribute.AttackRange, value);
|
||||
break;
|
||||
case Stat.AttackSpeed:
|
||||
attributes.ModifyAttackSpeed(value);
|
||||
case Attribute.AttackSpeed:
|
||||
attributes.Modify(Attribute.AttackSpeed, value);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
|
@@ -3,6 +3,7 @@ using Data;
|
||||
using Interfaces;
|
||||
using Systems;
|
||||
using UnityEngine;
|
||||
using Attribute = Data.Attribute;
|
||||
|
||||
namespace Modifiers
|
||||
{
|
||||
@@ -19,7 +20,7 @@ namespace Modifiers
|
||||
public void OnKill(GameObject killer, GameObject victim)
|
||||
{
|
||||
killer.TryGetComponent(out Character character);
|
||||
character?.attributes.ModifyHealth(value);
|
||||
character?.attributes.Modify(Attribute.Health, value);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using Data;
|
||||
using Interfaces;
|
||||
using Attribute = Data.Attribute;
|
||||
|
||||
namespace Modifiers
|
||||
{
|
||||
@@ -9,51 +10,20 @@ namespace Modifiers
|
||||
{
|
||||
private float lastAppliedAmount;
|
||||
|
||||
public Stat stat;
|
||||
public Attribute stat;
|
||||
public float percent;
|
||||
public string Description => GetDescription();
|
||||
|
||||
public void Apply(CharacterAttributes attributes)
|
||||
{
|
||||
var baseValue = GetBaseValue<float>(attributes);
|
||||
var baseValue = attributes.Get(stat);
|
||||
lastAppliedAmount = baseValue * percent;
|
||||
|
||||
var flatModifier = new FlatStatModifier
|
||||
{
|
||||
value = lastAppliedAmount,
|
||||
stat = stat
|
||||
};
|
||||
|
||||
flatModifier.Apply(attributes);
|
||||
attributes.Modify(stat, lastAppliedAmount);
|
||||
}
|
||||
|
||||
public void Remove(CharacterAttributes attributes)
|
||||
{
|
||||
var flatModifier = new FlatStatModifier
|
||||
{
|
||||
value = -lastAppliedAmount,
|
||||
stat = stat
|
||||
};
|
||||
|
||||
flatModifier.Apply(attributes);
|
||||
}
|
||||
|
||||
private T GetBaseValue<T>(CharacterAttributes attributes)
|
||||
{
|
||||
return stat switch
|
||||
{
|
||||
Stat.Health => (T)(object)attributes.Health,
|
||||
Stat.MaxHealth => (T)(object)attributes.MaxHealth,
|
||||
Stat.MoveSpeed => (T)(object)attributes.MoveSpeed,
|
||||
Stat.Luck => (T)(object)attributes.Luck,
|
||||
Stat.Armor => (T)(object)attributes.Armor,
|
||||
Stat.Damage => (T)(object)attributes.Damage,
|
||||
Stat.RangedDamage => (T)(object)attributes.RangedDamage,
|
||||
Stat.MeleeDamage => (T)(object)attributes.MeleeDamage,
|
||||
Stat.AttackRange => (T)(object)attributes.AttackRange,
|
||||
Stat.AttackSpeed => (T)(object)attributes.AttackSpeed,
|
||||
_ => throw new System.ArgumentOutOfRangeException()
|
||||
};
|
||||
attributes.Modify(stat, -lastAppliedAmount);
|
||||
}
|
||||
|
||||
private string GetDescription()
|
||||
|
Reference in New Issue
Block a user