Example #1
0
    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;
        }
    }
Example #2
0
 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();
     }
 }
Example #3
0
 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;
     }
 }