// Assets/_Project/Scripts/Gameplay/Draft/TowerUpgradeDraftOption.cs using UnityEngine; using TD.Towers; namespace TD.Gameplay.Draft { /// /// Draft choice — "upgrade a tower you already have". Replaces /// with in the player's : every /// tower of that type placed from now on is the upgraded version. Already-placed towers /// are unaffected. /// /// /// Mirrors , but swaps rather than adds. Only offered /// while the player currently has unlocked — once taken, /// is removed from the deck, which automatically makes this option /// (and any sibling upgrade branching off the same base) invalid for future drafts. /// [CreateAssetMenu(fileName = "TowerUpgradeOption", menuName = "TD/Draft/Tower Upgrade Option")] public class TowerUpgradeDraftOption : DraftOption { [Header("Payload")] [Tooltip("The tower this option upgrades from. Must be present in the player's deck " + "for this option to be offered.")] public TowerDefinition BaseTower; [Tooltip("The tower this option upgrades to. Must also be present in the " + "TowerPlacementManager catalog (that's where its TowerTypeId comes from).")] public TowerDefinition UpgradedTower; public override bool IsValidFor(ulong clientId) { var deck = PlayerTowerDeck.GetForClient(clientId); var pm = TowerPlacementManager.Instance; if (deck == null || pm == null || BaseTower == null || UpgradedTower == null) return false; if (!pm.TryGetTypeId(BaseTower, out int baseTypeId)) return false; return deck.Contains(baseTypeId); } public override bool ServerApply(ulong clientId) { var deck = PlayerTowerDeck.GetForClient(clientId); var pm = TowerPlacementManager.Instance; if (deck == null || pm == null || BaseTower == null || UpgradedTower == null) return false; if (!pm.TryGetTypeId(BaseTower, out int baseTypeId)) { Debug.LogError($"[TowerUpgradeDraftOption] '{BaseTower.name}' is not in the tower " + $"catalog; cannot apply. Add it to TowerPlacementManager.towerDefinitions."); return false; } if (!pm.TryGetTypeId(UpgradedTower, out int upgradedTypeId)) { Debug.LogError($"[TowerUpgradeDraftOption] '{UpgradedTower.name}' is not in the " + $"tower catalog; cannot apply. Add it to " + $"TowerPlacementManager.towerDefinitions."); return false; } return deck.ServerUpgradeTower(baseTypeId, upgradedTypeId); } /// Inherits the upgraded tower's icon unless this option assigns an override. public override Sprite ResolveIcon() => Icon != null ? Icon : (UpgradedTower != null ? UpgradedTower.Icon : null); } }