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; } }