diff --git a/Assets/Scripts/Data/CharacterAttributes.cs b/Assets/Scripts/Data/CharacterAttributes.cs index 79e1a1c..892a9c5 100644 --- a/Assets/Scripts/Data/CharacterAttributes.cs +++ b/Assets/Scripts/Data/CharacterAttributes.cs @@ -4,6 +4,20 @@ using Sirenix.Serialization; namespace Data { + public enum Stat + { + Health, + MaxHealth, + MoveSpeed, + Luck, + Armor, + Damage, + RangedDamage, + MeleeDamage, + AttackRange, + AttackSpeed + } + [Serializable] public class CharacterAttributes { diff --git a/Assets/Scripts/Modifiers.meta b/Assets/Scripts/Modifiers.meta new file mode 100644 index 0000000..8c23be5 --- /dev/null +++ b/Assets/Scripts/Modifiers.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6c74671c1ef5489984cf2ed331bd4877 +timeCreated: 1752266781 \ No newline at end of file diff --git a/Assets/Scripts/Modifiers/FlatStatModifier.cs b/Assets/Scripts/Modifiers/FlatStatModifier.cs new file mode 100644 index 0000000..4dac451 --- /dev/null +++ b/Assets/Scripts/Modifiers/FlatStatModifier.cs @@ -0,0 +1,69 @@ +using System; +using Data; +using Interfaces; + +namespace Modifiers +{ + [Serializable] + public class FlatStatModifier : IStatModifier + { + public Stat stat; + public float value; + public string Description => $"{stat} +{value}"; + + public void Apply(CharacterAttributes attributes) + { + ModifyAttributes(attributes, value); + } + + public void Remove(CharacterAttributes attributes) + { + Apply(attributes, -value); + } + + private void Apply(CharacterAttributes attributes, float value) + { + ModifyAttributes(attributes, value); + } + + private void ModifyAttributes(CharacterAttributes attributes, float value) + { + switch (stat) + { + case Stat.Health: + attributes.ModifyHealth(value); + break; + case Stat.MaxHealth: + attributes.ModifyMaxHealth(value); + break; + case Stat.MoveSpeed: + attributes.ModifyMoveSpeed(value); + break; + case Stat.Luck: + attributes.ModifyLuck(value); + break; + case Stat.Armor: + attributes.ModifyArmor(value); + break; + case Stat.Damage: + attributes.ModifyDamage(value); + break; + case Stat.RangedDamage: + attributes.ModifyRangedDamage(value); + break; + case Stat.MeleeDamage: + attributes.ModifyMeleeDamage(value); + break; + case Stat.AttackRange: + attributes.ModifyAttackRange(value); + break; + case Stat.AttackSpeed: + attributes.ModifyAttackSpeed(value); + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + } +} \ No newline at end of file diff --git a/Assets/Scripts/Modifiers/FlatStatModifier.cs.meta b/Assets/Scripts/Modifiers/FlatStatModifier.cs.meta new file mode 100644 index 0000000..2ce5206 --- /dev/null +++ b/Assets/Scripts/Modifiers/FlatStatModifier.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a042ddb31fa24a1d9e50e1016922b2bc +timeCreated: 1752266791 \ No newline at end of file diff --git a/Assets/Scripts/Modifiers/PercentStatModifier.cs b/Assets/Scripts/Modifiers/PercentStatModifier.cs new file mode 100644 index 0000000..981e012 --- /dev/null +++ b/Assets/Scripts/Modifiers/PercentStatModifier.cs @@ -0,0 +1,57 @@ +using Data; +using Interfaces; + +namespace Modifiers +{ + public class PercentStatModifier : IStatModifier + { + private float lastAppliedAmount; + + public Stat Stat { get; set; } + public float Percent { get; set; } + public string Description => $"{Stat} +{Percent * 100}%"; + + public void Apply(CharacterAttributes attributes) + { + var baseValue = GetBaseValue(attributes); + lastAppliedAmount = baseValue * Percent; + + var flatModifier = new FlatStatModifier + { + value = lastAppliedAmount, + stat = Stat + }; + + flatModifier.Apply(attributes); + } + + public void Remove(CharacterAttributes attributes) + { + var flatModifier = new FlatStatModifier + { + value = -lastAppliedAmount, + stat = Stat + }; + + flatModifier.Apply(attributes); + } + + private T GetBaseValue(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() + }; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Modifiers/PercentStatModifier.cs.meta b/Assets/Scripts/Modifiers/PercentStatModifier.cs.meta new file mode 100644 index 0000000..2143527 --- /dev/null +++ b/Assets/Scripts/Modifiers/PercentStatModifier.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d0a1bf6263e84c8cab3312fec117b3fa +timeCreated: 1752267326 \ No newline at end of file diff --git a/Assets/Scripts/Systems/CharacterModifierManager.cs b/Assets/Scripts/Systems/CharacterModifierManager.cs new file mode 100644 index 0000000..e873714 --- /dev/null +++ b/Assets/Scripts/Systems/CharacterModifierManager.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using Data; +using Interfaces; +using Sirenix.Serialization; +using UnityEngine; + +namespace Systems +{ + public class CharacterModifierManager : MonoBehaviour + { + [OdinSerialize] private List activeModifiers = new(); + + [SerializeField] private Character character; + + public void EquipItem(IStatModifier modifier) + { + activeModifiers.Add(modifier); + modifier.Apply(character.attributes); + } + + public void UnequipItem(IStatModifier modifier) + { + if (activeModifiers.Remove(modifier)) + { + modifier.Remove(character.attributes); + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Systems/CharacterModifierManager.cs.meta b/Assets/Scripts/Systems/CharacterModifierManager.cs.meta new file mode 100644 index 0000000..b904aac --- /dev/null +++ b/Assets/Scripts/Systems/CharacterModifierManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1c860b1e8855495097022a829e769fcc +timeCreated: 1752267836 \ No newline at end of file