internal void Initialize(Projectile projectile) { Element[] projectileElements = projectile.elements.ToArray(); damage = ElementUtility.ProjectileDamage(projectileElements); bouncesLeft = ElementUtility.Bounces(projectileElements); chainLength = ElementUtility.ChainLength(projectileElements); speed = ElementUtility.ProjectileSpeed(projectileElements); AOEDamageDealer = new AOEDamageDealer(ElementUtility.AoE(projectileElements) * projectile.areaOfEffectMultiplier, transform, projectile.elements); primaryMovementType = ElementUtility.Movement(projectile.elements.Peek()); this.projectile = projectile; switch (primaryMovementType) { case ProjectileMovementType.BounceOnGround: Parabola[] parabolas = ParabolaCalculator.CalculateFullTrajectory(transform.position, projectile.target.position, ElementUtility.ProjectileSpeed(projectileElements), transform.position.y, 0, bouncesLeft); projectileMover = new ProjectileMover(transform, parabolas, ElementUtility.ProjectileSpeed(projectile.elements.ToArray()) * projectile.speedMultiplier); break; case ProjectileMovementType.StraightChain: projectileMover = new ProjectileMover(transform, projectile.target, ElementUtility.ProjectileSpeed(projectile.elements.ToArray()) * projectile.speedMultiplier); break; case ProjectileMovementType.AOEAtTower: projectileMover = new ProjectileMover(projectile.speedMultiplier * speed, 0, transform); OnAOEAtTowerActivation(); break; } }
private void ContinueChain() { if (primaryMovementType != ProjectileMovementType.StraightChain) { primaryMovementType = ProjectileMovementType.StraightChain; } projectileMover.reassigning = true; if (chainLength > 0) { Transform closestEnemy = AOEDamageDealer.ClosestEnemy(transform.position, projectileMover.target, 5f); if (closestEnemy == null) { Destroy(gameObject); } else { chainLength--; projectileMover.target = closestEnemy; projectileMover.reassigning = false; } } else { CheckBouncesLeft(); } }
private void CheckBouncesLeft() { if (bouncesLeft <= 0) { Destroy(gameObject); } else { Vector3 bounceTargetPosition = transform.position + transform.forward * 2f; bounceTargetPosition.y = 0; bounceTargetPosition.x += 0.1f; Parabola[] parabolas = ParabolaCalculator.CalculateFullTrajectory(transform.position, bounceTargetPosition, ElementUtility.ProjectileSpeed(projectile.elements.ToArray()), transform.position.y + 1f, 0, bouncesLeft); projectileMover.SetParabolas(parabolas); primaryMovementType = ProjectileMovementType.BounceOnGround; } }