147 lines
4.9 KiB
C#
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})";
|
|
}
|
|
} |