//returns enemy units, current unit can attack public ICollection <Unit> GetAttackedUnits() { if (CurrentUnit == null) { UnityEngine.Debug.LogError("attacking unit is not assigned"); return(null); } HashSet <Unit> attackedUnits = new HashSet <Unit>(); int group = CurrentUnit.Group; ISet <Tile> attackedTiles = BattleMovementUtils.FindAttackedTiles (new HashSet <Tile> { CurrentUnit.OccupiedTile }, CurrentUnit.GetWeaponsRanges()); foreach (Tile tile in attackedTiles) { if (tile.IsOccupied()) { int enemyGroup = tile.Occupier.Group; if (group != enemyGroup && !_battleTurnManager.InAlliance(group, enemyGroup)) { attackedUnits.Add(tile.Occupier); } } } return(attackedUnits); }
//returns removed tiles public ISet <Tile> UpdateTrackedTiles() { var trackedTiles = new HashSet <Tile>(); foreach (Unit unit in TrackedUnits) { var moveableTiles = BattleMovementUtils.FindViableMoves(unit); var attackableTiles = BattleMovementUtils.FindAttackedTiles(moveableTiles, unit.GetWeaponsRanges()); trackedTiles.UnionWith(attackableTiles); } TrackedTiles.ExceptWith(trackedTiles); var diff = new HashSet <Tile>(TrackedTiles); TrackedTiles = trackedTiles; return(diff); }
//disables overlays then if unit occupies the tile, calculates move overlays for it public void OnNewTile(Tile tile) { CurrentUnit = null; _overlaysManager.DisableTemporaryOverlays(); if (tile.IsOccupied()) { CurrentUnit = tile.Occupier; if (_battleTurnManager.IsInActiveGroup(CurrentUnit)) { UnitMoveTiles = BattleMovementUtils.FindViableMoves(CurrentUnit); AttackedTiles = BattleMovementUtils.FindAttackedTiles(UnitMoveTiles, CurrentUnit.GetWeaponsRanges()); _overlaysManager.EnablePlayerMoveOverlays(UnitMoveTiles); _overlaysManager.EnableAttackedOverlays(AttackedTiles); } else { EnemyTiles = BattleMovementUtils.FindViableMoves(CurrentUnit); EnemyTiles.UnionWith(BattleMovementUtils.FindAttackedTiles(EnemyTiles, CurrentUnit.GetWeaponsRanges())); _overlaysManager.EnableEnemyOverlays(EnemyTiles); } } }