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