public void Fire(Unit damageSource)
        {
            IEnumerable <RaycastHit2D> hits = Cast();

            var ends         = new List <Vector3>();
            var damagedUnits = new HashSet <Unit>();

            foreach (var hit in hits)
            {
                ends.Add(OffsetEndRandomly(hit));

                Unit unit = hit.transform.GetComponentInParent <Unit>();
                if (unit != null && !damagedUnits.Contains(unit))
                {
                    unit.ApplyDamage(singleHitDamage, damageSource);
                    damagedUnits.Add(unit);
                }
            }

            bool noHit = false;

            if (ends.Count == 0)
            {
                noHit = true;
                Vector3 forwardShift = transform.up * Random.Range(2.1f, 2.8f);
                Vector3 sideShift    = transform.right * Random.Range(-0.2f, 0.2f);
                ends.Add(transform.position + forwardShift + sideShift);
            }
            var ends1 = new List <Vector3>();
            var ends2 = new List <Vector3>();

            foreach (var end in ends)
            {
                if (Random.value < 0.5f)
                {
                    ends1.Add(end);
                    ends2.Add(end);
                }
                else
                {
                    (Random.value < 0.5f ? ends1 : ends2).Add(end);
                }
            }
            bool noHit1 = noHit || ends1.Count == 0;
            bool noHit2 = noHit || ends2.Count == 0;

            lightning.GenerateAsRoot(transform.position, ends1, noHit1);
            secondLightning.GenerateAsRoot(transform.position, ends2, noHit2);

            StartCoroutine(Strike(noHit));

            dischargeAudio.PlayOneShot(dischargeSounds.GetRandomItem());
            if (!noHit)
            {
                zapAudio.transform.position = ends[0];
                zapAudio.PlayOneShot(zapSounds.GetRandomItem());
            }
        }
Esempio n. 2
0
    protected override void Fire()
    {
        base.Fire();
        cooldownTimer *= Random.Range(cooldownMultiplier.x, cooldownMultiplier.y);

        IEnumerable <RaycastHit2D> hits = Cast();

        var ends         = new List <Vector3>();
        var damagedUnits = new HashSet <Unit>();

        foreach (var hit in hits)
        {
            ends.Add(OffsetEndRandomly(hit));

            Unit unit = hit.transform.GetComponentInParent <Unit>();
            if (unit != null && !damagedUnits.Contains(unit))
            {
                unit.ApplyDamage(singleHitDamage, owner);
                damagedUnits.Add(unit);
            }
        }

        Transform lightningTransform = lightning.transform;
        bool      noHit = false;

        if (ends.Count == 0)
        {
            noHit = true;
            Vector3 forwardShift = lightningTransform.up * Random.Range(1f, 4f);
            Vector3 sideShift    = lightningTransform.right * Random.Range(-2f, 2f);
            ends.Add(lightningTransform.position + forwardShift + sideShift);
        }
        var ends1 = new List <Vector3>();
        var ends2 = new List <Vector3>();

        foreach (var end in ends)
        {
            if (Random.value < 0.5f)
            {
                ends1.Add(end);
                ends2.Add(end);
            }
            else
            {
                (Random.value < 0.5f ? ends1 : ends2).Add(end);
            }
        }
        bool noHit1 = noHit || ends1.Count == 0;
        bool noHit2 = noHit || ends2.Count == 0;

        lightning.GenerateAsRoot(lightningTransform.position, ends1, noHit1);
        secondLightning.GenerateAsRoot(lightningTransform.position, ends2, noHit2);

        StartCoroutine(Strike());

        bool noAmmo = ammo <= 0;

        shotAudioSource.mute  = noAmmo;
        clickSoundSource.mute = noAmmo || noHit;
        dischargeAudioSource.PlayOneShot(dischargeSounds.GetRandomItem());
        if (!noHit)
        {
            zapSoundSource.transform.position = ends[0];
            zapSoundSource.PlayOneShot(zapSounds.GetRandomItem());
        }
    }