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