Exemplo n.º 1
0
    protected bool DealDamageToEnemy(Actor_Player player, Actor_Enemy enemy, Vector3 position, float fRadius)
    {
        float fMultiplier = player.GetAttackDamageMultiplier();

        if (position.x <= Core.GetLevel().GetMeleeZoneLimit())
        {
            fMultiplier += player.minion.GetBuff(Stat.DAMAGE_MULTIPLIER_IN_MELEE_ZONE);
        }

        if (enemy.IsStunned())
        {
            fMultiplier += player.minion.GetBuff(Stat.ATTACK_DAMAGE_ON_STUNNED_ENEMIES);
        }

        if (damage.IsRadial())
        {
            Core.GetLevel().DamageRadius(damage,
                                         position,
                                         damage.fRadius * player.GetAttackRadiusMultiplier(),
                                         fMultiplier,
                                         player.GetStunTime(),
                                         player.minion.GetBuff(Stat.CRITICAL_CHANCE),
                                         player.minion.GetBuff(Stat.CRITICAL_DAMAGE),
                                         player.minion.GetBuff(Stat.VAMPIRISM),
                                         player.minion.GetBuff(Stat.ATTACK_DAMAGE_ABSOLUTE));

            return(enemy == null || enemy.IsDead());
        }
        else if (enemy != null)
        {
            if (enemy.IsDead())
            {
                return(true);
            }

            float fElementalMultiplier = Elements.GetDamageMultiplier(damage.GetElement(), enemy.minion.template.element);
            float fMod = enemy.GetInherentElementalResistanceModifier();
            if (fElementalMultiplier < 1.0f)
            {
                fElementalMultiplier = 1.0f - ((1.0f - fElementalMultiplier) * fMod);
            }

            fMultiplier *= fElementalMultiplier;

            player.OnDealtDamage(damage.fAmount * fMultiplier);

            return(enemy.Damage(damage,
                                fMultiplier,
                                player.GetStunTime(),
                                player.minion.GetBuff(Stat.CRITICAL_CHANCE),
                                player.minion.GetBuff(Stat.CRITICAL_DAMAGE),
                                player.minion.GetBuff(Stat.VAMPIRISM),
                                player.minion.GetBuff(Stat.ATTACK_DAMAGE_ABSOLUTE)));
        }

        return(true);
    }
Exemplo n.º 2
0
    public override void SimulateEnemyFixedUpdate(Actor_Enemy actor)
    {
        if (actor.IsFrozen() || actor.IsStunned())
        {
            return;
        }

        float fDistance = actor.transform.position.x - LevelController.fMIN_X_COORD;

        Vector3 diagonal = new Vector3(-1.0f, 0.0f, -0.25f * Mathf.Sign(actor.transform.position.z) / (fDistance + 1.0f));

        diagonal.Normalize();
        actor.Move(diagonal * fMoveSpeed);

        // Small delay to give player actors first strike and therefore allow zephyrs to push before damage
        if (actor.GetDistanceFromPlayerArea() <= fAttackRange && !actor.IsStunned() && actor.fTimeInMeleeZone > 0.1f)
        {
            // ---- ATTACK CODE ----
            actor.fTimeSinceLastAttack += Core.GetEnemyFixedDeltaTime();
            if (actor.fTimeSinceLastAttack >= fAttackInterval)
            {
                actor.fTimeSinceLastAttack = 0.0f;
                PlaySoundEffect(actor);

                for (int i = 0; i < numAttacks; i++)
                {
                    MeleeAttackPlayer(actor, damage);
                }
                actor.render.SetAnimStateAndNext(AnimState.ATTACK, AnimState.IDLE);
            }
        }
        else
        {
            actor.render.SetAnimState(AnimState.WALKING, false);
        }
    }
Exemplo n.º 3
0
    public override void SimulateEnemyFixedUpdate(Actor_Enemy actor)
    {
        if (actor.IsFrozen() || actor.IsStunned())
        {
            return;
        }

        actor.fTimeSinceLastAttack += Core.GetPlayerDeltaTime();

        float fMin = Core.GetLevel().GetRangedZoneMin();         //GetTargetRangeMin();
        float fMax = Core.GetLevel().GetRangedZoneMax();         //GetTargetRangeMax();

        fMax -= (fMax - fMin) * 0.25f;

        bool bInRange = fMin <= actor.transform.position.x && actor.transform.position.x <= fMax;

        if (bInRange)
        {
            if (actor.fTimeSinceLastAttack >= fAttackInterval * actor.GetAttackSpeedMultiplier())
            {
                actor.fTimeSinceLastAttack = 0.0f;

                PlaySoundEffect(actor);

                // Zap both player ranged characters
                RangedAttackPlayer(actor, damage, MinionSlot.RANGED_1);
                RangedAttackPlayer(actor, damage, MinionSlot.RANGED_2);

                List <Vector3> pfxPositions = new List <Vector3> ();
                pfxPositions.Add(actor.transform.position + new Vector3(0.0f, fProjectileLaunchHeight, 0.0f));

                int firstHit = Random.Range(0, 2);

                // Add a line
                Vector3      prevPos         = pfxPositions [pfxPositions.Count - 1];
                Actor_Player firstPlayerHit  = Core.GetLevel().playerActors[(int)MinionSlot.RANGED_1 + firstHit];
                Actor_Player secondPlayerHit = Core.GetLevel().playerActors[(int)MinionSlot.RANGED_1 + (1 - firstHit)];
                Vector3      newPos          = firstPlayerHit.transform.position + new Vector3(0.0f, fProjectileLaunchHeight, 0.0f);
                Vector3      dPos            = newPos - prevPos;
                float        fLength         = dPos.magnitude;
                // If it is longer than 2 units, split it into segments
                if (fLength >= 2.0f)
                {
                    dPos.Normalize();
                    int numSegments = Mathf.FloorToInt(fLength / 2.0f);
                    for (int i = 0; i < numSegments; i++)
                    {
                        Vector3 pos    = prevPos + dPos * 2.0f * (i + 1);
                        Vector3 offset = Random.onUnitSphere;
                        offset.y = 0.0f;
                        pos     += offset;
                        pfxPositions.Add(pos);
                    }
                }
                pfxPositions.Add(firstPlayerHit.transform.position);
                pfxPositions.Add(secondPlayerHit.transform.position);

                actor.render.SetChainPFXActive(fChainPFXDuration, pfxPositions.ToArray());
                actor.render.SetAnimStateAndNext(AnimState.ATTACK, AnimState.IDLE);
            }
            else if (actor.fTimeSinceLastAttack >= fAttackInterval * actor.GetAttackSpeedMultiplier() * 0.5f)
            {
                float fSpeed = fMoveSpeed;
                if (actor.transform.position.x - fMin < 1.0f)
                {
                    fSpeed *= (actor.transform.position.x - fMin);
                }

                actor.Move(new Vector3(-fSpeed, 0.0f, 0.0f));
                actor.render.SetAnimState(AnimState.WALKING, false);
            }
        }
        else
        {
            actor.Move(new Vector3(-fMoveSpeed, 0.0f, 0.0f));
            actor.render.SetAnimState(AnimState.WALKING, false);
        }
    }
Exemplo n.º 4
0
    public override void SimulateEnemyFixedUpdate(Actor_Enemy actor)
    {
        if (actor.fTargetX == 0.0f)
        {
            actor.fTargetX = Random.Range(Core.GetLevel().GetRangedZoneMin(), Core.GetLevel().GetRangedZoneMax());
        }

        if (actor.IsStunned() || actor.IsFrozen())
        {
            return;
        }

        actor.fTimeSinceLastAttack += Core.GetPlayerDeltaTime();

        float fMin = actor.fTargetX;
        float fMax = Core.GetLevel().GetRangedZoneMax();

        fMax -= (fMax - fMin) * 0.25f;

        bool bInRange = actor.transform.position.x <= fMax;

        if (bInRange)
        {
            actor.render.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
            if (actor.fTimeSinceLastAttack >= fAttackInterval * actor.GetAttackSpeedMultiplier())
            {
                actor.fTimeSinceLastAttack = 0.0f;
                // Spawn a projectile
                for (int i = 0; i < numAttacks; i++)
                {
                    Projectile projectile = Instantiate <Projectile>(projectilePrefab);
                    projectile.firer              = actor;
                    projectile.firerTemplate      = this;
                    projectile.launchPos          = actor.transform.position + new Vector3(0.5f * i, fProjectileLaunchHeight, 0.0f);
                    projectile.fProgress          = i * 0.1f;
                    projectile.target             = Core.GetLevel().GetRangedTarget();
                    projectile.transform.position = projectile.launchPos;
                }

                PlaySoundEffect(actor);

                actor.render.SetAnimStateAndNext(AnimState.ATTACK, AnimState.IDLE);
            }
            else if (actor.fTimeSinceLastAttack >= fAttackInterval * actor.GetAttackSpeedMultiplier() * 0.5f)
            {
                float fSpeed = fMoveSpeed;
                if (actor.transform.position.x - fMin < 1.0f)
                {
                    fSpeed *= (actor.transform.position.x - fMin);
                }

                // Cap backwards speed to prevent magnetic bugs being useless
                if (fSpeed < 0.0f)
                {
                    fSpeed = -1.0f;
                }

                actor.Move(new Vector3(-fSpeed, 0.0f, 0.0f));
                actor.render.SetAnimState(AnimState.WALKING, false);
                actor.render.transform.localScale = new Vector3(fSpeed > 0.0f ? 1.0f : -1.0f, 1.0f, 1.0f);
            }
        }
        else
        {
            actor.Move(new Vector3(-fMoveSpeed, 0.0f, 0.0f));
            actor.render.SetAnimState(AnimState.WALKING, false);
        }
    }
Exemplo n.º 5
0
    public override void SimulateEnemyFixedUpdate(Actor_Enemy actor)
    {
        // Wurm acts like a support, but teleports between spots. Go stand in a player zone, leave it, stand in it, repeat
        if (actor.IsFrozen() || actor.IsStunned())
        {
            return;
        }

        actor.fTimeSinceLastAttack += Core.GetEnemyDeltaTime();
        if (actor.GetDistanceFromPlayerArea() <= fAttackRange && actor.fTimeSinceLastAttack >= fAttackInterval)
        {
            // ---- ATTACK CODE ----
            if (actor.fTimeSinceLastAttack >= fAttackInterval)
            {
                PlaySoundEffect(actor);

                actor.fTimeSinceLastAttack = 0.0f;
                MeleeAttackPlayer(actor, damage, MinionSlot.MELEE_1);
                MeleeAttackPlayer(actor, damage, MinionSlot.MELEE_2);
                RangedAttackPlayer(actor, damage, MinionSlot.RANGED_1);
                RangedAttackPlayer(actor, damage, MinionSlot.RANGED_2);
                actor.render.SetAnimStateAndNext(AnimState.ATTACK, AnimState.IDLE);
                if (actor.render.attackParticles != null)
                {
                    actor.render.attackParticles.Play();
                }
            }
        }
        // If we are waiting, do that.
        else if (actor.fTimeToNextMove > 0.0f)
        {
            actor.fTimeToNextMove -= Core.GetEnemyDeltaTime();
            if (actor.fTimeToNextMove <= 0.0f && actor.render.GetAnimState() != AnimState.ATTACK)
            {
                if (actor.bPickedPositionInPlayerZone)
                {
                    // Last pick was in a zone, so wherever is fine this time.
                    actor.target = new Vector3(Random.Range(LevelController.fMIN_X_COORD, Core.GetLevel().GetRangedZoneMax() + 3.0f), 0.0f, Random.Range(LevelController.fMIN_Z_COORD, LevelController.fMAX_Z_COORD));
                }
                else
                {
                    // We just wandered off wherever, so make sure we walk back through a zone this time.
                    if (Random.Range(0, 2) == 0)
                    {
                        actor.target = new Vector3(Random.Range(LevelController.fMIN_X_COORD, Core.GetLevel().GetMeleeZoneLimit()), 0.0f, Random.Range(LevelController.fMIN_Z_COORD, LevelController.fMAX_Z_COORD));
                    }
                    else
                    {
                        actor.target = new Vector3(Random.Range(Core.GetLevel().GetRangedZoneMin(), Core.GetLevel().GetRangedZoneMax()), 0.0f, Random.Range(LevelController.fMIN_Z_COORD, LevelController.fMAX_Z_COORD));
                    }
                }

                actor.bPickedPositionInPlayerZone = !actor.bPickedPositionInPlayerZone;

                actor.render.SetAnimStateAndNext(AnimState.WALKING, AnimState.IDLE);
                if (actor.render.moveParticles != null)
                {
                    actor.render.moveParticles.Play();
                }
            }
        }
        // Else, we made it to idle, so teleport and re-emerge by playing a reverse walk
        else if (actor.render.GetAnimState() == AnimState.IDLE)
        {
            actor.Move(actor.target - actor.transform.position, true);
            actor.render.SetAnimStateAndNext(AnimState.WALKING, AnimState.IDLE);
            actor.render.SetReverse(true);
            actor.fTimeToNextMove = 2.0f;
        }
    }