Ejemplo n.º 1
0
    /// <summary>
    /// spawns a directionalShot to attack all enemies in a straight line
    /// </summary>
    /// <param name="targets">list of enemies in range.  The DirectionalShot itself will find other enemies on its own as it goes by</param>
    /// <param name="damageEvent">details of the attack.  damageEvent.dest is ignored.</param>
    /// <param name="attackDir">direction the attack should travel</param>
    private void directionalShot(List <EnemyScript> targets, DamageEventData damageEvent, Vector2 attackDir)
    {
        //construct event
        DirectionalShotData data = new DirectionalShotData();

        data.attackDir   = attackDir;
        data.damageEvent = damageEvent;
        data.targetList  = targets;

        //spawn it
        GameObject shot = Instantiate(directionalShotPrefab);

        shot.transform.position = transform.position;   //center it on the tower
        shot.SendMessage("SetData", data);              //initialize it
    }
    //initializes the attack
    public void SetData(DirectionalShotData data)
    {
        attackDir          = data.attackDir;
        transform.rotation = Quaternion.FromToRotation(Vector2.up, attackDir);
        baseDamageEvent    = data.damageEvent;

        //put the initial target list on the expected list and inform those enemies
        foreach (EnemyScript t in data.targetList)
        {
            //build event
            DamageEventData ded = new DamageEventData();
            ded.source    = baseDamageEvent.source;
            ded.rawDamage = baseDamageEvent.rawDamage;
            ded.effects   = baseDamageEvent.effects;
            ded.dest      = t;

            //trigger effects
            if (ded.effects != null)
            {
                foreach (IEffect ie in ded.effects.effects)
                {
                    if (ie.triggersAs(EffectType.enemyDamaged))
                    {
                        ((IEffectEnemyDamaged)ie).expectedDamage(ref ded);
                    }
                }
            }

            //warn enemy
            t.onExpectedDamage(ref ded);
            expectedToHit.Add(ded);
        }

        //play sound
        int soundToPlay = Random.Range(0, attackSounds.Length);

        audioSource.clip   = attackSounds[soundToPlay];
        audioSource.volume = MessageHandlerScript.instance.SFXVolumeSetting;
        audioSource.Play();

        initialized = true; //flag ready
    }