using UnityEngine;
///
/// Handles applying upgrades to ball effect definitions.
/// Creates modified copies of definitions with upgrade values applied.
///
public static class UpgradeManager
{
///
/// Apply current upgrades to a definition and return a modified version.
/// Creates a temporary modified definition without altering the original asset.
///
public static BallEffectDefinition ApplyUpgrades(BallEffectDefinition definition, UpgradeState upgrades)
{
if (definition == null || upgrades == null)
return definition;
// Create a modified copy based on the effect type
switch (definition.EffectType)
{
case BallEffectType.Explosive:
return ApplyExplosiveUpgrades(definition as ExplosiveHitEffectDefinition, upgrades);
case BallEffectType.TripleSplit:
return ApplySplitUpgrades(definition as TripleSplitEffectDefinition, upgrades);
case BallEffectType.Piercing:
return ApplyPiercingUpgrades(definition as PiercingEffectDefinition, upgrades);
case BallEffectType.Homing:
return ApplyHomingUpgrades(definition as HomingEffectDefinition, upgrades);
case BallEffectType.Teleport:
return ApplyTeleportUpgrades(definition as TeleportEffectDefinition, upgrades);
default:
return definition;
}
}
private static BallEffectDefinition ApplyExplosiveUpgrades(
ExplosiveHitEffectDefinition original, UpgradeState upgrades)
{
if (original == null)
return null;
// Create a runtime copy
ExplosiveHitEffectDefinition upgraded = ScriptableObject.CreateInstance();
upgraded.name = original.name + " (Upgraded)";
upgraded.CopyBaseFrom(original);
// Apply upgrades
upgraded.SetRadius(original.Radius + upgrades.ExplosiveRadiusBonus);
upgraded.SetMaxDamageAtCenter(original.MaxDamageAtCenter * upgrades.ExplosiveDamageMultiplier);
upgraded.SetMinDamageAtEdge(original.MinDamageAtEdge * upgrades.ExplosiveDamageMultiplier);
return upgraded;
}
private static BallEffectDefinition ApplySplitUpgrades(
TripleSplitEffectDefinition original, UpgradeState upgrades)
{
if (original == null)
return null;
TripleSplitEffectDefinition upgraded = ScriptableObject.CreateInstance();
upgraded.name = original.name + " (Upgraded)";
upgraded.CopyBaseFrom(original);
upgraded.SetSplitOnlyOnce(original.SplitOnlyOnce);
upgraded.SetSplitAngle(original.SplitAngle + upgrades.SplitAngleBonus);
upgraded.SetChildScaleMultiplier(original.ChildScaleMultiplier);
upgraded.SetChildSpeedMultiplier(original.ChildSpeedMultiplier * upgrades.SplitSpeedMultiplier);
upgraded.SetChildDamageMultiplier(original.ChildDamageMultiplier * upgrades.SplitDamageMultiplier);
return upgraded;
}
private static BallEffectDefinition ApplyPiercingUpgrades(
PiercingEffectDefinition original, UpgradeState upgrades)
{
if (original == null)
return null;
PiercingEffectDefinition upgraded = ScriptableObject.CreateInstance();
upgraded.name = original.name + " (Upgraded)";
upgraded.CopyBaseFrom(original);
upgraded.SetPierceHits(original.PierceHits + upgrades.PiercingHitsBonus);
return upgraded;
}
private static BallEffectDefinition ApplyHomingUpgrades(
HomingEffectDefinition original, UpgradeState upgrades)
{
if (original == null)
return null;
HomingEffectDefinition upgraded = ScriptableObject.CreateInstance();
upgraded.name = original.name + " (Upgraded)";
upgraded.CopyBaseFrom(original);
upgraded.SetTurnRateDegreesPerSecond(original.TurnRateDegreesPerSecond * upgrades.HomingTurnRateMultiplier);
upgraded.SetRetargetInterval(original.RetargetInterval);
return upgraded;
}
private static BallEffectDefinition ApplyTeleportUpgrades(
TeleportEffectDefinition original, UpgradeState upgrades)
{
if (original == null)
return null;
TeleportEffectDefinition upgraded = ScriptableObject.CreateInstance();
upgraded.name = original.name + " (Upgraded)";
upgraded.CopyBaseFrom(original);
upgraded.SetIntervalSeconds(original.IntervalSeconds);
upgraded.SetTeleportDistance(original.TeleportDistance * upgrades.TeleportDistanceMultiplier);
upgraded.SetOverlapCheckRadius(original.OverlapCheckRadius);
return upgraded;
}
}