using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; public class UpgradeManager : MonoBehaviour { public GameObject[] normalUpgradePrefabs; public GameObject[] specialUpgradePrefabs; [HideInInspector] public List unlockedUpgrades = new List(); public Transform specialUpgradeSpawnParent; public float specialUpgradeSpacing = 2f; public Tower tower; public int bits = 5; public TextMeshProUGUI bitsText; private readonly Dictionary upgradeLevels = new Dictionary(); private readonly Dictionary upgradeCosts = new Dictionary(); private readonly Dictionary activeCards = new Dictionary(); private RectTransform upgradeDock; private RectTransform upgradeCardRow; private GameObject specialOverlay; private static readonly UpgradeCard.UpgradeType[] NormalUpgradeTypes = { UpgradeCard.UpgradeType.FireRate, UpgradeCard.UpgradeType.Range, UpgradeCard.UpgradeType.Damage }; private static readonly UpgradeCard.UpgradeType[] SpecialUpgradeTypes = { UpgradeCard.UpgradeType.MultiShot, UpgradeCard.UpgradeType.Homing, UpgradeCard.UpgradeType.Ricochet }; void Start() { EnsureUpgradeDock(); InitializeUpgrades(); UpdateBitsText(); } public void EnemyKilled() { bits++; UpdateBitsText(); UpdateUpgradeCards(); } void InitializeUpgrades() { foreach (UpgradeCard.UpgradeType type in Enum.GetValues(typeof(UpgradeCard.UpgradeType))) { if (!upgradeLevels.ContainsKey(type)) upgradeLevels[type] = 0; if (!upgradeCosts.ContainsKey(type)) upgradeCosts[type] = GetBaseCost(type); } foreach (UpgradeCard.UpgradeType type in NormalUpgradeTypes) { SpawnUpgradeCard(type, 0f); } } void SpawnUpgradeCard(UpgradeCard.UpgradeType upgradeType, float xPos) { if (activeCards.ContainsKey(upgradeType)) return; EnsureUpgradeDock(); int currentLevel = upgradeLevels[upgradeType] + 1; GameObject cardObject = CreateUpgradeCardObject(upgradeType, upgradeCardRow, false); UpgradeCard upgradeCard = cardObject.GetComponent(); upgradeCard.upgradeType = upgradeType; upgradeCard.upgradeLevel = currentLevel; upgradeCard.upgradeCost = upgradeCosts[upgradeType]; upgradeCard.upgradeManager = this; upgradeCard.UpdateUpgradeUI(); Button button = cardObject.GetComponent