private Vector2Int?SelectTargetForAttackFromPosition(List <PlayableAgent> Players, Vector2Int Pos) { if (!AbilitySystem.CanActivateAbilityByTag(MainAbility)) { return(null); } Vector2Int OriginalPosition = GridPos; GridPos = Pos; Grid.setOccupied((Vector3Int)OriginalPosition, false); Grid.setOccupied((Vector3Int)GridPos, true); PlayableAgent TargetAgent = null; foreach (PlayableAgent Player in Players) { // Can target if (AbilitySystem.CanActivateTargetAbilityByTag(MainAbility, Player.GridPos)) { // First if (TargetAgent == null) { TargetAgent = Player; } else { float BestDist = Vector2Int.Distance(GridPos, TargetAgent.GridPos); float NewDist = Vector2Int.Distance(GridPos, Player.GridPos); // Closest if (NewDist < BestDist) { TargetAgent = Player; } else if (NewDist == BestDist) { int BestHealth = TargetAgent.AbilitySystem.GetAttributeValue(Attribute.Health).Value; int NewHealth = Player.AbilitySystem.GetAttributeValue(Attribute.Health).Value; // Lowest health if (NewHealth < BestHealth) { TargetAgent = Player; } else if (BestHealth == NewHealth) { // First role if (Player.Role < TargetAgent.Role) { TargetAgent = Player; } } } } } } Grid.setOccupied((Vector3Int)GridPos, false); Grid.setOccupied((Vector3Int)OriginalPosition, true); GridPos = OriginalPosition; if (TargetAgent != null) { return(TargetAgent.GridPos); } return(null); }