예제 #1
0
    /// <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
    }
예제 #2
0
    /// <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);
            }
        }
    }
예제 #3
0
    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);
    }
예제 #4
0
    //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
    }