using BumpCombat.Player; using BumpCombat.Core; using UnityEngine; namespace BumpCombat.Progression { [CreateAssetMenu( fileName = "ModifierDefinition", menuName = "BumpCombat/Progression/Modifier Definition")] public sealed class ModifierDefinition : ScriptableObject { [SerializeField] private string modifierId; [SerializeField] private string displayName; [SerializeField] private CharacterStat stat; [SerializeField] private ModifierOperation operation; [SerializeField] private float value; [SerializeField, Min(1)] private int maximumStacks = 1; [SerializeField, Min(0f)] private float healOnApply; public string ModifierId => modifierId; public string DisplayName => displayName; public CharacterStat Stat => stat; public ModifierOperation Operation => operation; public float Value => value; public int MaximumStacks => maximumStacks; public float HealOnApply => healOnApply; public bool CanApply(PlayerStats playerStats) { return playerStats != null && playerStats.GetStackCount(modifierId, stat) < maximumStacks; } public bool TryApply( PlayerStats playerStats, PlayerHealth playerHealth) { if (!CanApply(playerStats) || !playerStats.AddModifier(new StatModifier( modifierId, stat, operation, value, maximumStacks))) { return false; } if (healOnApply > 0f && playerHealth != null) { playerHealth.Heal(healOnApply); } return true; } #if UNITY_EDITOR public void Configure( string id, string label, CharacterStat targetStat, ModifierOperation modifierOperation, float modifierValue, int maxStacks, float immediateHeal = 0f) { modifierId = id; displayName = label; stat = targetStat; operation = modifierOperation; value = modifierValue; maximumStacks = Mathf.Max(1, maxStacks); healOnApply = Mathf.Max(0f, immediateHeal); } #endif } }