UpgradeManager.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using UnityEngine;
  2. /// <summary>
  3. /// Handles applying upgrades to ball effect definitions.
  4. /// Creates modified copies of definitions with upgrade values applied.
  5. /// </summary>
  6. public static class UpgradeManager
  7. {
  8. /// <summary>
  9. /// Apply current upgrades to a definition and return a modified version.
  10. /// Creates a temporary modified definition without altering the original asset.
  11. /// </summary>
  12. public static BallEffectDefinition ApplyUpgrades(BallEffectDefinition definition, UpgradeState upgrades)
  13. {
  14. if (definition == null || upgrades == null)
  15. return definition;
  16. // Create a modified copy based on the effect type
  17. switch (definition.EffectType)
  18. {
  19. case BallEffectType.Explosive:
  20. return ApplyExplosiveUpgrades(definition as ExplosiveHitEffectDefinition, upgrades);
  21. case BallEffectType.TripleSplit:
  22. return ApplySplitUpgrades(definition as TripleSplitEffectDefinition, upgrades);
  23. case BallEffectType.Piercing:
  24. return ApplyPiercingUpgrades(definition as PiercingEffectDefinition, upgrades);
  25. case BallEffectType.Homing:
  26. return ApplyHomingUpgrades(definition as HomingEffectDefinition, upgrades);
  27. case BallEffectType.Teleport:
  28. return ApplyTeleportUpgrades(definition as TeleportEffectDefinition, upgrades);
  29. default:
  30. return definition;
  31. }
  32. }
  33. private static BallEffectDefinition ApplyExplosiveUpgrades(
  34. ExplosiveHitEffectDefinition original, UpgradeState upgrades)
  35. {
  36. if (original == null)
  37. return null;
  38. // Create a runtime copy
  39. ExplosiveHitEffectDefinition upgraded = ScriptableObject.CreateInstance<ExplosiveHitEffectDefinition>();
  40. upgraded.name = original.name + " (Upgraded)";
  41. upgraded.CopyBaseFrom(original);
  42. // Apply upgrades
  43. upgraded.SetRadius(original.Radius + upgrades.ExplosiveRadiusBonus);
  44. upgraded.SetMaxDamageAtCenter(original.MaxDamageAtCenter * upgrades.ExplosiveDamageMultiplier);
  45. upgraded.SetMinDamageAtEdge(original.MinDamageAtEdge * upgrades.ExplosiveDamageMultiplier);
  46. return upgraded;
  47. }
  48. private static BallEffectDefinition ApplySplitUpgrades(
  49. TripleSplitEffectDefinition original, UpgradeState upgrades)
  50. {
  51. if (original == null)
  52. return null;
  53. TripleSplitEffectDefinition upgraded = ScriptableObject.CreateInstance<TripleSplitEffectDefinition>();
  54. upgraded.name = original.name + " (Upgraded)";
  55. upgraded.CopyBaseFrom(original);
  56. upgraded.SetSplitOnlyOnce(original.SplitOnlyOnce);
  57. upgraded.SetSplitAngle(original.SplitAngle + upgrades.SplitAngleBonus);
  58. upgraded.SetChildScaleMultiplier(original.ChildScaleMultiplier);
  59. upgraded.SetChildSpeedMultiplier(original.ChildSpeedMultiplier * upgrades.SplitSpeedMultiplier);
  60. upgraded.SetChildDamageMultiplier(original.ChildDamageMultiplier * upgrades.SplitDamageMultiplier);
  61. return upgraded;
  62. }
  63. private static BallEffectDefinition ApplyPiercingUpgrades(
  64. PiercingEffectDefinition original, UpgradeState upgrades)
  65. {
  66. if (original == null)
  67. return null;
  68. PiercingEffectDefinition upgraded = ScriptableObject.CreateInstance<PiercingEffectDefinition>();
  69. upgraded.name = original.name + " (Upgraded)";
  70. upgraded.CopyBaseFrom(original);
  71. upgraded.SetPierceHits(original.PierceHits + upgrades.PiercingHitsBonus);
  72. return upgraded;
  73. }
  74. private static BallEffectDefinition ApplyHomingUpgrades(
  75. HomingEffectDefinition original, UpgradeState upgrades)
  76. {
  77. if (original == null)
  78. return null;
  79. HomingEffectDefinition upgraded = ScriptableObject.CreateInstance<HomingEffectDefinition>();
  80. upgraded.name = original.name + " (Upgraded)";
  81. upgraded.CopyBaseFrom(original);
  82. upgraded.SetTurnRateDegreesPerSecond(original.TurnRateDegreesPerSecond * upgrades.HomingTurnRateMultiplier);
  83. upgraded.SetRetargetInterval(original.RetargetInterval);
  84. return upgraded;
  85. }
  86. private static BallEffectDefinition ApplyTeleportUpgrades(
  87. TeleportEffectDefinition original, UpgradeState upgrades)
  88. {
  89. if (original == null)
  90. return null;
  91. TeleportEffectDefinition upgraded = ScriptableObject.CreateInstance<TeleportEffectDefinition>();
  92. upgraded.name = original.name + " (Upgraded)";
  93. upgraded.CopyBaseFrom(original);
  94. upgraded.SetIntervalSeconds(original.IntervalSeconds);
  95. upgraded.SetTeleportDistance(original.TeleportDistance * upgrades.TeleportDistanceMultiplier);
  96. upgraded.SetOverlapCheckRadius(original.OverlapCheckRadius);
  97. return upgraded;
  98. }
  99. }