using System.Collections.Generic; using GeometryTD.Entity; using GeometryTD.UI; using UnityEngine; namespace GeometryTD.Map { public sealed class TowerSelectionPresenter { private bool _hasSelectedFoundationCell; private Vector3Int _selectedFoundationCell; private int _selectedTowerEntityId; private int _attackRangeVisibleTowerEntityId; public void ApplySelectedObject(CombatSelectFormUserData userData) { if (userData == null) { ClearSelectedObject(); return; } switch (userData.ClickObjectType) { case CombatSelectClickObjectType.Foundation: _hasSelectedFoundationCell = true; _selectedFoundationCell = userData.CellPosition; _selectedTowerEntityId = 0; break; case CombatSelectClickObjectType.Tower: _hasSelectedFoundationCell = true; _selectedFoundationCell = userData.CellPosition; _selectedTowerEntityId = userData.TowerEntityId; break; default: ClearSelectedObject(); return; } UpdateTowerAttackRangeDisplay(_selectedTowerEntityId); } public void SelectTower(Vector3Int foundationCell, int towerEntityId) { _hasSelectedFoundationCell = true; _selectedFoundationCell = foundationCell; _selectedTowerEntityId = towerEntityId; UpdateTowerAttackRangeDisplay(_selectedTowerEntityId); } public bool TryGetSelectedFoundationCell(out Vector3Int foundationCell) { foundationCell = default; if (!_hasSelectedFoundationCell) { return false; } foundationCell = _selectedFoundationCell; return true; } public bool TryGetSelectedTower(IReadOnlyDictionary foundationCellByTowerEntityId, out int towerEntityId, out Vector3Int foundationCell) { towerEntityId = 0; foundationCell = default; if (_selectedTowerEntityId == 0 || foundationCellByTowerEntityId == null) { return false; } if (!foundationCellByTowerEntityId.TryGetValue(_selectedTowerEntityId, out foundationCell)) { return false; } towerEntityId = _selectedTowerEntityId; return true; } public void ClearSelectedObject() { UpdateTowerAttackRangeDisplay(0); _hasSelectedFoundationCell = false; _selectedFoundationCell = default; _selectedTowerEntityId = 0; } private void UpdateTowerAttackRangeDisplay(int towerEntityId) { if (_attackRangeVisibleTowerEntityId != 0 && _attackRangeVisibleTowerEntityId != towerEntityId) { SetTowerAttackRangeVisible(_attackRangeVisibleTowerEntityId, false); _attackRangeVisibleTowerEntityId = 0; } if (towerEntityId == 0) { if (_attackRangeVisibleTowerEntityId != 0) { SetTowerAttackRangeVisible(_attackRangeVisibleTowerEntityId, false); _attackRangeVisibleTowerEntityId = 0; } return; } if (SetTowerAttackRangeVisible(towerEntityId, true)) { _attackRangeVisibleTowerEntityId = towerEntityId; } } private static bool SetTowerAttackRangeVisible(int towerEntityId, bool visible) { if (towerEntityId == 0 || GameEntry.Entity == null) { return false; } EntityBase gameEntity = GameEntry.Entity.GetGameEntity(towerEntityId); if (gameEntity is not TowerEntity towerEntity) { return false; } towerEntity.SetAttackRangeVisible(visible); return true; } } }