147 lines
4.9 KiB
C#

// ============================================================================
// 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})";
}
}