Example #1
0
        private void PlayerInputOnPrimaryKeyPressed()
        {
            if (buildData.ExtractedEssences.Count <= 0)
            {
                return;
            }

            var handPos    = buildData.ConstructorObject.position;
            var buildSpots = buildData.AttractionSpots.Items.ToArray();
            var buildRange = buildData.BuildSpotDetectionRange;

            var openSpots = RangeTargetScanner.GetTargets(handPos, buildSpots, buildRange).Where(t => !t.GetComponent <AttractionSpot>().IsOccupied).ToArray();

            if (openSpots.Length <= 0)
            {
                return;
            }

            var attractionSpot = ClosestEntityFinder.GetClosestTransform(openSpots, handPos).GetComponent <AttractionSpot>();
            var essence        = buildData.ExtractedEssences.Last();

            attractionSpot.AssignEssence(essence);
            buildData.ExtractedEssences.Remove(essence);

            essence.GetComponent <Essence>().Activate();
        }
Example #2
0
        public bool CanDestroy()
        {
            if (!initialized)
            {
                return(true);
            }

            if (currentTarget != null)
            {
                previousTargets.Push(currentTarget);
            }

            var enemies          = enemiesAlive.Items.Except(previousTargets);
            var availableTargets = RangeTargetScanner.GetTargets(projectile.transform.position, enemies.ToArray(), jumpRadius);
            var shatters         = availableTargets.Length >= shatterAmount ? shatterAmount : availableTargets.Length;

            for (int i = 0; i < shatters; i++)
            {
                // spawn new projectiles, to-do: pool
                var proj = Instantiate(projectile.AttackBehaviour.ProjectileModel, transform.position, Quaternion.identity).AddComponent <Projectile>();
                proj.Initialize(shatterAttackBehaviour, availableTargets[i]);
                proj.DamageScale = damageReductionOnShatter;
            }

            return(true);
        }
        public override void AttackTarget(Transform target, Damage damage, IEnumerable <HitAbility> hitAbilities)
        {
            var targetsHit = RangeTargetScanner.GetTargets(target.transform.position, enemiesAlive.Items.ToArray(),
                                                           ExplosionRadius);

            foreach (var aoeTarget in targetsHit)
            {
                float proximity   = (target.transform.position - aoeTarget.transform.position).magnitude;
                var   damageScale = DamageDistributionPercentage.Evaluate((proximity / ExplosionRadius));
                var   unitHealth  = aoeTarget.GetComponent <UnitHealth>();
                if (unitHealth == null)
                {
                    return;
                }

                if (hitAbilities != null)
                {
                    foreach (var hitAbility in hitAbilities)
                    {
                        hitAbility.ApplyAbility(aoeTarget);
                    }
                }
                unitHealth.TakeDamage(damage);
            }
        }
Example #4
0
        protected override void ApplyAbility()
        {
            var enemiesInRange =
                RangeTargetScanner.GetTargets(transform.position, enemiesList.Items.ToArray(), attack.Range);
            var numberOfAttacks = enemiesInRange.Length > maxTargets ? maxTargets : enemiesInRange.Length;

            for (int i = 0; i < numberOfAttacks; i++)
            {
                var projectile = attack.FireProjectile(enemiesInRange[i]);
                projectile.transform.position = transform.position;
            }
        }
Example #5
0
        private void PlayerInputOnPrimaryKeyPressed()
        {
            var handPos    = buildData.ConstructorObject.position;
            var buildSpots = buildData.AttractionSpots.Items.ToArray();
            var buildRange = buildData.BuildSpotDetectionRange;

            var openSpots = RangeTargetScanner.GetTargets(handPos, buildSpots, buildRange).Where(t => !t.GetComponent <AttractionSpot>().IsOccupied).ToArray();

            if (openSpots.Length <= 0)
            {
                return;
            }
            buildData.TargetAttraction = ClosestEntityFinder.GetClosestTransform(openSpots, handPos).GetComponent <AttractionSpot>();

            stateData.ChangeState(PlayerStates.FORGING);
        }
Example #6
0
        public bool CanDestroy()
        {
            if (currentBounce > totalBounces || !initialized)
            {
                return(true);
            }

            if (currentTarget != null)
            {
                previousTargets.Push(currentTarget);
            }
            var enemies = enemiesAlive.Items.Except(previousTargets);

            currentTarget = RangeTargetScanner.GetTargets(projectile.transform.position, enemies.ToArray(), jumpRadius).LastOrDefault();
            projectile.SetTarget(currentTarget);
            projectile.DamageScale = Mathf.Pow(damageReductionPerBounce, currentBounce);
            currentBounce++;

            return(false);
        }
Example #7
0
        private Transform[] GetTargets()
        {
            var enemies = enemiesList.Items.ToArray();

            if (enemies.Length <= 0)
            {
                return(null);
            }
            var availableTargets = new Transform[attackBehaviour.TargetLimit];
            var enemiesInRange   =
                RangeTargetScanner.GetTargets(owner.position, enemies, attackBehaviour.Range);

            if (enemiesInRange.Length <= 0)
            {
                return(availableTargets);
            }
            for (int i = 0; i < Mathf.Min(attackBehaviour.TargetLimit, enemiesInRange.Length); i++)
            {
                availableTargets[i] = enemiesInRange[i];
            }

            return(availableTargets);
        }