/** * 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)); }