public override IEnumerator Execute(GameAgent attacker, Damageable target)
    {
        //while (attacking) yield return null;
        attacking = true;

        attacker.transform.LookAt((target as DungeonObject).transform);
        attacker.playAttackAnimation();
        attacker.playAttackNoise("Bow");

        while (attacker.animating)
        {
            yield return(null);
        }

        var arrow = MapManager.AnimateProjectile(attacker.grid_pos, (target as DungeonObject).grid_pos, "arrow");

        while (!(arrow == null))
        {
            yield return(null);
        }

        try {
            target.playHitAnimation();
            target.playHitNoise("Bow");
            target.take_damage((int)(attacker.stats.DealDamage() * damageModifier));
        }
        catch (Exception e) {
            // swallow the error
        }

        attacking = false;
    }
    public override IEnumerator Execute(GameAgent attacker, Damageable target)
    {
        while (attacking)
        {
            yield return(null);
        }
        if (attacker.stats.currentMagicPoints < 4)
        {
            yield break;
        }
        attacker.stats.currentMagicPoints = Mathf.Max((attacker.stats.currentMagicPoints - 4), 0);
        int count = attacker.stats.GetMultiHitCount();

        while (count > 0)
        {
            attacking = true;

            attacker.transform.LookAt((target as DungeonObject).transform);
            attacker.playAttackAnimation();
            attacker.playAttackNoise("Bow");

            while (attacker.animating)
            {
                yield return(null);
            }

            Projectile arrow = MapManager.AnimateProjectile(attacker.grid_pos, (target as DungeonObject).grid_pos, "arrow");

            while (!(arrow == null))
            {
                yield return(null);
            }

            try
            {
                target.playHitAnimation();
                target.playHitNoise("Bow");
                target.take_damage((int)(attacker.stats.DealDamage() * damageModifier));
            }
            catch (Exception e)
            {
                // swallow the error
            }

            // if Damageable is dead, stop loop
            // implement this


            count--;
        }
        attacking = false;
        Debug.Log("After while loop");
    }
    public override IEnumerator Execute(GameAgent attacker, Damageable target)
    {
        while (attacking)
        {
            yield return(null);
        }
        if (attacker.stats.currentMagicPoints < 3)
        {
            yield break;
        }
        attacker.stats.currentMagicPoints = Mathf.Max((attacker.stats.currentMagicPoints - 3), 0);
        attacking = true;

        attacker.transform.LookAt((target as DungeonObject).transform);
        attacker.playAttackAnimation();
        attacker.playAttackNoise("Lightning");

        while (attacker.animating)
        {
            yield return(null);
        }

        Projectile lightning = MapManager.AnimateProjectile(attacker.grid_pos, (target as DungeonObject).grid_pos, "lightning");

        while (!(lightning == null))
        {
            yield return(null);
        }

        try
        {
            target.playHitAnimation();
            target.playHitNoise("Fire");
            target.take_damage((int)(attacker.stats.DealDamage() * damageModifier));
        }
        catch (Exception e)
        {
            // swallow the error
        }

        attacking = false;
    }