Ejemplo n.º 1
0
    /// <summary>
    /// Attack an enemy AI if it is within range, a powerup will increase the damage done
    /// </summary>
    /// <param name="target">The target to attack</param>
    public void AttackEnemy(GameObject target)
    {
        // Only attack the enemy
        if (target.CompareTag(_agentData.EnemyTeamTag))
        {
            // Only do damage if we're within attack range
            if (_agentSenses.IsInAttackRange(target))
            {
                // Swing the sword
                _swordAnimator.SetTrigger(AttackAnimationTrigger);

                // We may not always hit
                if (UnityEngine.Random.value < _agentData.HitProbability)
                {
                    int actualDamage = _agentData.NormalAttackDamage;

                    // Tell the enemy we hit them
                    if (_agentData.IsPoweredUp)
                    {
                        actualDamage *= _agentData.PowerUpAmount;
                    }
                    target.GetComponent <AgentData>().TakeDamage(actualDamage);
                }
            }
        }
    }
    protected override IEnumerator Execute()
    {
        SetState(NodeState.RUNNING);

        nearbyEnemies = senses.GetEnemiesInView();

        // If no enemy visible exit node
        if (nearbyEnemies.Count <= 0)
        {
            Debug.Log("FAIL");
            SetState(NodeState.FAILURE);
            yield break;
        }

        // Delay before agent can attack again
        yield return(attackTimer);

        // Attack the nearby enemy
        for (int i = 0; i < nearbyEnemies.Count; i++)
        {
            if (senses.IsInAttackRange(nearbyEnemies[i]))
            {
                actions.AttackEnemy(nearbyEnemies[i]);
            }
        }

        SetState(NodeState.SUCCESS);

        yield return(null);
    }
Ejemplo n.º 3
0
 private void Battle()
 {
     if (!_agentData.HasEnemyFlag)
     {
         GameObject checkFlag;
         if (_agentSenses.GetEnemiesInView().Count > 0)
         {
             for (int i = 0; i < _agentSenses.GetEnemiesInView().Count; i++)
             {
                 if (_agentData.CurrentHitPoints > 50)
                 {
                     if (_agentSenses.IsInAttackRange(_agentSenses.GetEnemiesInView()[i]))
                     {
                         inBattle = true;
                         _agentActions.UseItem(_agentInventory.GetItem(Names.PowerUp));
                         _agentActions.AttackEnemy(_agentSenses.GetEnemiesInView()[i]);
                     }
                     else if (this.tag == Tags.BlueTeam)
                     {
                         checkFlag = _agentSenses.GetObjectInViewByName(Names.RedFlag);
                         if (checkFlag != null)
                         {
                             if (Vector3.Distance(transform.position, checkFlag.transform.position) < Vector3.Distance(transform.position, _agentSenses.GetEnemiesInView()[i].transform.position))
                             {
                                 _agentActions.MoveTo(checkFlag);
                             }
                         }
                         else
                         {
                             inBattle = true;
                             _agentActions.MoveTo(_agentSenses.GetEnemiesInView()[i]);
                         }
                     }
                     else if (this.tag == Tags.RedTeam)
                     {
                         checkFlag = _agentSenses.GetObjectInViewByName(Names.BlueFlag);
                         if (checkFlag != null)
                         {
                             if (Vector3.Distance(transform.position, checkFlag.transform.position) < Vector3.Distance(transform.position, _agentSenses.GetEnemiesInView()[i].transform.position))
                             {
                                 _agentActions.MoveTo(checkFlag);
                             }
                         }
                         else
                         {
                             inBattle = true;
                             _agentActions.MoveTo(_agentSenses.GetEnemiesInView()[i]);
                         }
                     }
                 }
                 else if (_agentData.CurrentHitPoints <= 10)
                 {
                     if (_agentData.IsPoweredUp)
                     {
                         inBattle = true;
                         _agentActions.AttackEnemy(_agentSenses.GetEnemiesInView()[i]);
                     }
                     else
                     {
                         int RandomChanceToAttack = Random.Range(0, 100) + 1;
                         if (RandomChanceToAttack > 35)
                         {
                             inBattle = true;
                             _agentActions.AttackEnemy(_agentSenses.GetEnemiesInView()[i]);
                         }
                         else
                         {
                             inBattle = false;
                             _agentActions.Flee(_agentSenses.GetEnemiesInView()[i]);
                         }
                     }
                 }
                 else
                 {
                     if (_agentSenses.IsInAttackRange(_agentSenses.GetEnemiesInView()[i]))
                     {
                         int RandomChanceToAttack = Random.Range(0, 2);
                         if (RandomChanceToAttack == 0)
                         {
                             inBattle = true;
                             _agentActions.UseItem(_agentInventory.GetItem(Names.PowerUp));
                             _agentActions.AttackEnemy(_agentSenses.GetEnemiesInView()[i]);
                         }
                         else
                         {
                             if (_agentData.IsPoweredUp)
                             {
                                 inBattle = true;
                                 _agentActions.AttackEnemy(_agentSenses.GetEnemiesInView()[i]);
                             }
                             else
                             {
                                 int RandomChanceToFlee = Random.Range(0, 2);
                                 if (RandomChanceToFlee == 0)
                                 {
                                     _agentActions.MoveToRandomLocation();
                                 }
                                 else
                                 {
                                     _agentActions.Flee(_agentSenses.GetEnemiesInView()[i]);
                                 }
                                 inBattle = false;
                             }
                         }
                     }
                     else
                     {
                         inBattle = false;
                     }
                 }
             }
         }
         else
         {
             inBattle = false;
         }
     }
     else
     {
         inBattle = false;
     }
 }