using UnityEngine; using System.Collections.Generic; using UnityEngine.Events; using UnityEngine.InputSystem; public class TurretsShop : MonoBehaviour { [SerializeField] private GameManager _gameManager; [SerializeField] private Wallet _wallet; [SerializeField] private BlockDetector _blockDetector; [SerializeField] private Transform _turretsHolder; [SerializeField] private InputAction _deselectAction; [SerializeField] private TurretShopItem[] _turretShopItems; [SerializeField] private UnityEvent _onBlockSelected; [SerializeField] private UnityEvent _onBlockDeselected; public IReadOnlyCollection TurretShopItems => _turretShopItems; public event UnityAction OnBlockSelected { add => _onBlockSelected.AddListener(value); remove => _onBlockSelected.RemoveListener(value); } public event UnityAction OnBlockDeselected { add => _onBlockDeselected.AddListener(value); remove => _onBlockDeselected.RemoveListener(value); } private BlockScript _selectedBlock; private void OnEnable() { if (_deselectAction != null) { _deselectAction.Enable(); _deselectAction.performed += DeselectActionPerformed; } _blockDetector.OnBlockClicked += OnBlockClicked; } private void OnDisable() { if (_deselectAction != null) { _deselectAction.performed -= DeselectActionPerformed; _deselectAction.Disable(); } _blockDetector.OnBlockClicked -= OnBlockClicked; } private void Start() { if (_turretsHolder == null) _turretsHolder = transform; } private void OnBlockClicked(BlockScript block) { if (_selectedBlock == block) { DeselectBlock(); return; } if (_gameManager.CurrentState != GameManager.GameState.BuildingPath && block.CompareTag("GrassBlock")) SelectBlock(block); } public void BuyTurret(TurretShopItem item) { if (_selectedBlock == null || _wallet.Money < item.Price) return; _wallet.TakeMoney(item.Price); Instantiate(item.TurretPrefab, _selectedBlock.transform.position + Vector3.up, Quaternion.identity, _turretsHolder); DeselectBlock(); } public void SelectBlock(BlockScript block) { _selectedBlock = block; _onBlockSelected?.Invoke(block); } public void DeselectBlock() { _selectedBlock = null; _onBlockDeselected?.Invoke(); } private void DeselectActionPerformed(InputAction.CallbackContext _) => DeselectBlock(); }