// ============================================================================ // 2. ABILITY MODIFIER SYSTEM - Enhanced with Source Tracking // ============================================================================ using UnityEngine; [System.Serializable] public class AbilityModifier { [Header("Resource Cost Modifiers")] public float manaCostMultiplier = 1f; public float manaCostFlat = 0f; public float healthCostMultiplier = 1f; public float healthCostFlat = 0f; public float classResourceCostMultiplier = 1f; public float classResourceCostFlat = 0f; [Header("Timing Modifiers")] public float castTimeMultiplier = 1f; public float cooldownMultiplier = 1f; [Header("Effect Modifiers")] public float damageMultiplier = 1f; public float healingMultiplier = 1f; public float durationMultiplier = 1f; public float rangeMultiplier = 1f; [Header("Meta Info")] public string modifierName = "Unnamed Modifier"; public string description = ""; public float duration = -1f; // -1 = permanent // Source tracking - matches StatModifier pattern public readonly object Source; // ======================================================================== // CONSTRUCTORS - Multiple overloads like StatModifier // ======================================================================== // Default constructor (for serialization) public AbilityModifier() { Source = null; } // Constructor with source public AbilityModifier(object source) { Source = source; } // Copy constructor with new source public AbilityModifier(AbilityModifier original, object newSource) { // Copy all values manaCostMultiplier = original.manaCostMultiplier; manaCostFlat = original.manaCostFlat; healthCostMultiplier = original.healthCostMultiplier; healthCostFlat = original.healthCostFlat; classResourceCostMultiplier = original.classResourceCostMultiplier; classResourceCostFlat = original.classResourceCostFlat; castTimeMultiplier = original.castTimeMultiplier; cooldownMultiplier = original.cooldownMultiplier; damageMultiplier = original.damageMultiplier; healingMultiplier = original.healingMultiplier; durationMultiplier = original.durationMultiplier; rangeMultiplier = original.rangeMultiplier; modifierName = original.modifierName; description = original.description; duration = original.duration; // Set new source Source = newSource; } // ======================================================================== // FACTORY METHODS - Enhanced with source support // ======================================================================== public static AbilityModifier CreateDamageBoost(float multiplier, string name = "Damage Boost", object source = null) { var modifier = new AbilityModifier(source) { damageMultiplier = multiplier, modifierName = name }; return modifier; } public static AbilityModifier CreateCooldownReduction(float reductionPercent, string name = "Cooldown Reduction", object source = null) { var modifier = new AbilityModifier(source) { cooldownMultiplier = 1f - (reductionPercent / 100f), modifierName = name }; return modifier; } public static AbilityModifier CreateManaCostReduction(float reductionPercent, string name = "Mana Cost Reduction", object source = null) { var modifier = new AbilityModifier(source) { manaCostMultiplier = 1f - (reductionPercent / 100f), modifierName = name }; return modifier; } public static AbilityModifier CreateCastTimeReduction(float reductionPercent, string name = "Cast Time Reduction", object source = null) { var modifier = new AbilityModifier(source) { castTimeMultiplier = 1f - (reductionPercent / 100f), modifierName = name }; return modifier; } public static AbilityModifier CreateHealingBoost(float multiplier, string name = "Healing Boost", object source = null) { var modifier = new AbilityModifier(source) { healingMultiplier = multiplier, modifierName = name }; return modifier; } // ======================================================================== // UTILITY METHODS // ======================================================================== public bool HasSource(object source) { return Source != null && Source.Equals(source); } public override string ToString() { string sourceStr = Source?.ToString() ?? "No Source"; return $"{modifierName} (Source: {sourceStr})"; } }