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(); }
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); } }
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; } }
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); }
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); }
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); }