/**
     * Apply the effects of the ranger tower
     */
    protected override void ApplyTowerEffect()
    {
        Collider[] fishermenColliders = Physics.OverlapSphere(transform.position, GetEffectRadius(), LayerMask.GetMask(Layers.PLACED_OBJECTS))
                                        .Where((collider) => {
            return(collider.GetComponentInChildren <FishermanTower>() != null && collider.GetComponentInChildren <FishermanTower>().TowerActive);
        }).ToArray();


        foreach (Collider fishermanCollider in fishermenColliders)
        {
            FishermanTower fishermanTower = fishermanCollider.GetComponent <FishermanTower>();

            RegulateFisherman(fishermanTower);
        }
    }
    /**
     * Display attempt to catch fish
     */
    private IEnumerator RegulateFishermanCoroutine(FishermanTower fishermanTower)
    {
        // figure out whether the fisherman will be stopped or not
        bool caught = Random.Range(0f, 1f) <= regulationSuccessRate;

        GameObject   g  = Instantiate(lineRendererPrefab, transform);
        LineRenderer lr = g.GetComponent <LineRenderer>();

        lr.material = caught ? hitLineMaterial : missLineMaterial;

        lr.enabled = true;

        towerEffectLineRenderers.Add(lr);

        Vector3 towerEffectPosition = fishermanTower.transform.position;

        towerEffectPositions.Add(towerEffectPosition);

        // handle fish being caught
        if (caught)
        {
            // want this variable so we can make the fisherman flash, regardless of what mode we're in
            MeshRenderer fishermanTowerRenderer = fishermanTower.flashRenderer;

            // how we handle this depends on what mode the ranger is in
            switch (mode)
            {
            case Mode.Kill:
                // make the fisherman inactive
                fishermanTower.TowerActive = false;

                // make the fisherman flash for a bit
                for (int i = 0; i < numFlashesPerCatch; i++)
                {
                    Material oldMaterial = null;
                    if (fishermanTowerRenderer != null)
                    {
                        oldMaterial = fishermanTowerRenderer.material;
                        fishermanTowerRenderer.material = flashMaterial;
                    }
                    yield return(new WaitForSeconds((float)timePerApplyEffect / numFlashesPerCatch / 2f));

                    if (fishermanTowerRenderer != null)
                    {
                        Destroy(fishermanTowerRenderer.material);
                        fishermanTowerRenderer.material = oldMaterial;
                    }
                    yield return(new WaitForSeconds((float)timePerApplyEffect / numFlashesPerCatch / 2f));
                }

                // remove the fisherman tower
                if (fishermanTower != null)
                {
                    Destroy(fishermanTower.transform.root.gameObject);
                }
                break;

            case Mode.Slowdown:
                // apply the affect to the angler
                fishermanTower.AffectCatchRate(slowdownEffectSmall, slowdownEffectMedium, slowdownEffectLarge, timePerApplyEffect);

                // make the fisherman flash  for a bit
                for (int i = 0; i < numFlashesPerCatch; i++)
                {
                    Material oldMaterial = null;
                    if (fishermanTowerRenderer != null)
                    {
                        oldMaterial = fishermanTowerRenderer.material;
                        fishermanTowerRenderer.material = flashMaterial;
                    }
                    yield return(new WaitForSeconds((float)timePerApplyEffect / numFlashesPerCatch / 2f));

                    if (fishermanTowerRenderer != null)
                    {
                        Destroy(fishermanTowerRenderer.material);
                        fishermanTowerRenderer.material = oldMaterial;
                    }
                    yield return(new WaitForSeconds((float)timePerApplyEffect / numFlashesPerCatch / 2f));
                }
                break;
            }
        }
        // fish escaped -- just wait for end of action
        else
        {
            yield return(new WaitForSeconds(timePerApplyEffect));
        }

        // end the catch attempt line
        towerEffectPositions.Remove(towerEffectPosition);
        towerEffectLineRenderers.Remove(lr);
        Destroy(g);
    }
 /**
  * Attempt to regulate an angler
  */
 private void RegulateFisherman(FishermanTower fishermanTower)
 {
     StartCoroutine(RegulateFishermanCoroutine(fishermanTower));
 }