/// <summary> /// spawns a burstShot to attack all enemies in range /// </summary> /// <param name="targets">list of enemies in range. The burstShot itself will catch enemies that enter the region during the attack</param> /// <param name="damageEvent">details of the attack. damageEvent.dest is ignored.</param> private void burstFire(IEnumerable <EnemyScript> targets, DamageEventData damageEvent) { //construct burst shot event BurstShotData data = new BurstShotData(); data.targetList = targets; data.burstRange = range; data.damageEvent = damageEvent; //create a burst shot and give it the data GameObject shot = Instantiate(burstShotPrefab); //create it shot.transform.position = transform.position; //center it on the tower shot.SendMessage("SetData", data); //initialize it }
/// <summary> /// spawns an explosion /// </summary> /// <param name="data">attack data for the explosion</param> /// <param name="position">where to put it</param> public void createExplosion(BurstShotData data, Vector2 position) { BurstShotScript instance = Instantiate(explosionPrefab).GetComponent <BurstShotScript>(); instance.transform.position = new Vector3(position.x, position.y, -3.0f); instance.SetData(data); //apply attackColor property, if it is present if (data.damageEvent.effects != null) { if (data.damageEvent.effects.propertyEffects.attackColor != null) { instance.SetColor(data.damageEvent.effects.propertyEffects.attackColor.Value); } } }
public override void expectedDamage(ref DamageEventData d) { //construct a damage event for the explosion DamageEventData explosionDamageEvent = new DamageEventData(); explosionDamageEvent.source = d.source; explosionDamageEvent.rawDamage = strength; explosionDamageEvent.effects = null; //dont copy effects, or we get an endless explosion chain! explosionDamageEvent.dest = null; //burstShot object ignores the destination anyway //construct burst shot data BurstShotData explosion = new BurstShotData(); explosion.damageEvent = explosionDamageEvent; explosion.burstRange = explosionRadius; explosion.targetList = EnemyManagerScript.instance.enemiesInRange(d.source.transform.position, explosion.burstRange); //call on the level manager to create the actual explosion, since this effect doesnt have a prefab reference LevelManagerScript.instance.createExplosion(explosion, d.source.transform.position); }
//init attack public void SetData(BurstShotData data) { maxScale = data.burstRange; //store attack range //warn all enemies that will be hit List <EnemyScript> toWarn = EnemyManagerScript.instance.enemiesInRange(transform.position, maxScale); //converted to list so we can iterate even if the original list changes foreach (EnemyScript e in toWarn) { DamageEventData ded = new DamageEventData(); ded.source = data.damageEvent.source; ded.dest = e; ded.effects = data.damageEvent.effects; ded.rawDamage = data.damageEvent.rawDamage; //apply effects if (ded.effects != null) { foreach (IEffect ie in ded.effects.effects) { if (ie.triggersAs(EffectType.enemyDamaged)) { ((IEffectEnemyDamaged)ie).expectedDamage(ref ded); } } } e.onExpectedDamage(ref ded); expectedToHit.Add(ded); } //play one of the sounds at random int soundToPlay = Random.Range(0, burstSounds.Length); audioSource.clip = burstSounds[soundToPlay]; if (isActiveAndEnabled) { StartCoroutine(playRespectLimit(audioSource)); //plays the sound, if we are not at the sound cap and the object is not disabled } initialized = true; //flag ready }