public override Result Execute(EnemyBehaviorTree EBT) { if (EBT.patrolSpot[EBT.randomPatrolSpot] != null) { EBT.transform.LookAt(EBT.patrolSpot[EBT.randomPatrolSpot].position); //Debug.Log("Patrolling, Looking at target spot"); } EBT.transform.position = Vector3.MoveTowards(EBT.transform.position, EBT.patrolSpot[EBT.randomPatrolSpot].position, EBT.speed * Time.deltaTime); Debug.Log("Moving towards target spot"); if (Vector3.Distance(EBT.transform.position, EBT.patrolSpot[EBT.randomPatrolSpot].position) <= 1) { if (EBT.waitTimeCounter <= 0) { //Debug.Log("Wait time is finished."); EBT.randomPatrolSpot = Random.Range(0, EBT.patrolSpot.Length); EBT.waitTimeCounter = EBT.waitTimeDuration; } else { //Debug.Log("Wait time refreshed"); EBT.waitTimeCounter -= Time.deltaTime; } } Debug.Log("Patrol success"); return(Result.success); }
public override Result Execute(EnemyBehaviorTree EBT) { if (EBT.knockedBack) { EBT.knockbackCounter -= Time.deltaTime; } if (EBT.knockbackCounter <= 0) { EBT.knockedBack = false; EBT.knockbackCounter = EBT.knockbackDuration; } else if (EBT.thornsSkill.thornsActive && EBT.EnemyOnPlayer()) { EBT.knockedBack = true; EBT.stunned = true; Debug.Log("Knockback Node Running"); EBT.rb.velocity = Vector3.zero; EBT.direction = EBT.transform.position - EBT.player.transform.position; EBT.direction.y = 0; EBT.direction = EBT.direction.normalized + Vector3.up; EBT.rb.AddForce(EBT.direction.normalized * EBT.knockbackForce, ForceMode.Impulse); Debug.Log("Knockback success"); return(Result.success); } Debug.Log("Knockback failed"); return(Result.failure); }
public override Result Execute(EnemyBehaviorTree EBT) { if (!EBT.SporeInRange()) { Debug.Log("Distracted Failed"); return(Result.failure); } else if (EBT.SporeInRange()) { EBT.transform.LookAt(EBT.sporeSkill.intSpore.transform.position); //Debug.Log("Distracted, looking at spore"); EBT.transform.position = Vector3.MoveTowards(EBT.transform.position, EBT.sporeSkill.intSpore.transform.position, EBT.speed * Time.deltaTime); EBT.speed = 2; Debug.Log("Distracted, moving towards spore"); if (Vector3.Distance(EBT.sporeSkill.intSpore.transform.position, EBT.transform.position) <= 1) { EBT.speed = 0; } else if (EBT.sporeSkill.intSpore == null) { Debug.Log("Distracted duration ended"); EBT.speed = 2; } return(Result.running); } Debug.Log("Distracted Success"); return(Result.running); }
public Result Execute(EnemyBehaviorTree tree) { var state = tree.NodeAndState[this]; if (state == EnemyBehaviorTree.NodeState.RUNNING) { return(new Result(true)); } if (state == EnemyBehaviorTree.NodeState.COMPUTING) { Node chosen = ChooseByRandom(leafArrayAndChance); tree.NodeAndState[this] = EnemyBehaviorTree.NodeState.WAITING; tree.NodeAndState[chosen] = EnemyBehaviorTree.NodeState.IN_QUEUE; foreach (var item in leafArrayAndChance) { if (item.Key != chosen) { tree.NodeAndState[item.Key] = EnemyBehaviorTree.NodeState.IGNORE; } } } return(new Result(true)); }
public Result Execute(EnemyBehaviorTree tree) { var state = tree.NodeAndState[this]; if (state == EnemyBehaviorTree.NodeState.RUNNING) { return(new Result(true)); } int resultInt = conditionFunction(tree).IntegerResult; if (state == EnemyBehaviorTree.NodeState.RUNNING) { return(new Result(true)); } for (var i = 0; i < leafArray.Count(); i++) { if (i == resultInt) { tree.NodeAndState[leafArray[i]] = EnemyBehaviorTree.NodeState.IN_QUEUE; } else { tree.NodeAndState[leafArray[i]] = EnemyBehaviorTree.NodeState.IGNORE; } } return(new Result(resultInt)); }
public Result Execute(EnemyBehaviorTree tree) { var state = tree.NodeAndState[this]; if (state == EnemyBehaviorTree.NodeState.RUNNING) { return(new Result(true)); } Result outcome = conditionFunction(tree); if (state == EnemyBehaviorTree.NodeState.RUNNING) { return(new Result(true)); } if (outcome.BooleanResult) { tree.NodeAndState[leafIfTrue] = EnemyBehaviorTree.NodeState.IN_QUEUE; tree.NodeAndState[leafIfFalse] = EnemyBehaviorTree.NodeState.IGNORE; } else { tree.NodeAndState[leafIfTrue] = EnemyBehaviorTree.NodeState.IGNORE; tree.NodeAndState[leafIfFalse] = EnemyBehaviorTree.NodeState.IN_QUEUE; } return(outcome); }
public override Result Execute(EnemyBehaviorTree EBT) { if (EBT.stunned) { EBT.stunnedCounter -= Time.deltaTime; } if (EBT.stunnedCounter <= 0) { EBT.stunned = false; EBT.knockbackCounter = EBT.knockbackDuration; } if (!EBT.stunned) { Debug.Log("Stunned failed"); return(Result.failure); } //else //{ // EBT.rb.constraints = RigidbodyConstraints.FreezeRotation; //} return(Result.success); }
public void Start() { currentHP = Mathf.Clamp(currentHP, 0, 200); currentStamina = Mathf.Clamp(currentStamina, 0, 100); currentHP = baseHP; currentStamina = baseStamina; tree = BuildTree(); }
public Result IfMiddleHP(EnemyBehaviorTree tree) { if (IsBetweenOneQuarterAndThreeQuartersHP()) { MiddleHPStatus = true; } else { MiddleHPStatus = false; } return(new Result(MiddleHPStatus)); }
public Result IfLowHp(EnemyBehaviorTree tree) { if (IsBelowOneQuarterHP()) { LowHpStatus = true; } else { LowHpStatus = false; } return(new Result(LowHpStatus)); }
// Node and Function to check first turn in HP state public Result IfFirstTurnInHpState(EnemyBehaviorTree tree) { if (IsFirstTurnInHPState()) { FirstTurnStatus = true; } else { FirstTurnStatus = false; } return(new Result(FirstTurnStatus)); }
// Nodes for HP Level Check public Result IfHighHP(EnemyBehaviorTree tree) { if (IsAboveThreeQuartersHP()) { HighHPStatus = true; } else { HighHPStatus = false; } return(new Result(HighHPStatus)); }
public override Result Execute(EnemyBehaviorTree EBT) { if (EBT.enemyHealth > 0) { Debug.Log("Enemy Alivee"); return(Result.failure); } else if (EBT.enemyHealth <= 0) { Debug.Log("Enemy Dead"); EBT.speed = 0; EBT.puzzle4.enemiesKilled++; EBT.GetComponent <EnemyBehaviorTree>().enabled = false; } return(Result.success); }
public override Result Execute(EnemyBehaviorTree EBT) { for (int i = 0; i < childNode.Count; i++) { if (childNode[i].Execute(EBT) == Result.running) { childNode[i].Execute(EBT); return(Result.running); } else if (childNode[i].Execute(EBT) == Result.failure) { return(Result.failure); } } return(Result.success); }
// Node for Stamina Check public Result IfHasStamina(EnemyBehaviorTree tree) // checks stamina, assigns a number which determines the possible moveset { switch (StaminaCheck) { case 1: return(new Result(1)); case 2: return(new Result(2)); case 3: return(new Result(3)); case 0: return(new Result(0)); default: return(new Result(0)); } }
public override Result Execute(EnemyBehaviorTree EBT) { for (int i = 0; i < childNode.Count; i++) { Result nodeResult = childNode[i].Execute(EBT); if (nodeResult == Result.success) { //currentResult = Result.success; return(Result.success); } else if (nodeResult == Result.running) { //currentResult = Result.running; return(Result.running); } } //currentResult = Result.failure; return(Result.failure); }
public override Result Execute(EnemyBehaviorTree EBT) { // STOP CHASING --- Check if the enemy finished chasing the player if (EBT.PlayerInRange() && EBT.EnemyOnPlayer()) { Debug.Log("Chase Succeed"); return(Result.success); } // CHASE --- Check if the enemy is in range to start chasing the player if (EBT.PlayerInRange()) { Debug.Log("Player in Range"); Debug.Log("Enemy on Player" + EBT.EnemyOnPlayer()); EBT.transform.LookAt(EBT.player.transform); Vector3 enemyPosition = (EBT.player.gameObject.transform.position - EBT.transform.position).normalized; Vector3 Distance = new Vector3(enemyPosition.x, 0, enemyPosition.z); Debug.Log("Chasing Player"); EBT.transform.position += Distance * EBT.speed * Time.deltaTime; return(Result.running); } return(Result.failure); }
public virtual Result Execute(EnemyBehaviorTree EBT) { return(Result.running); }
/* * // Function for checking player's previous move * public int CheckPlayerPrevMoveSelect() * { * if (mtp.PlayerPrevMoveSelected == 1) * return 1; * else if (mtp.PlayerPrevMoveSelected == 2) * return 2; * else if (mtp.PlayerPrevMoveSelected == 3) * return 3; * else if (mtp.PlayerPrevMoveSelected == 4) * return 4; * else * return 0; * } */ public EnemyBehaviorTree BuildTree() { Scene currentScene = SceneManager.GetActiveScene(); string sceneName = currentScene.name; if (sceneName == "FIGHT3") { Dictionary <Node, float> OneTwoSixMoveset = new Dictionary <Node, float> { { new Leaf(EnemyMove1inTree), 0.3F }, { new Leaf(EnemyMove2inTree), 0.3F }, { new Leaf(EnemyMove6inTree), 0.4F } }; Dictionary <Node, float> TwoThreeSixMoveset = new Dictionary <Node, float> { { new Leaf(EnemyMove3inTree), 0.2F }, { new Leaf(EnemyMove2inTree), 0.2F }, { new Leaf(EnemyMove6inTree), 0.6F } }; Dictionary <Node, float> AllMoveset = new Dictionary <Node, float> { { new Leaf(EnemyMove1inTree), 0.25F }, { new Leaf(EnemyMove2inTree), 0.25F }, { new Leaf(EnemyMove6inTree), 0.25F }, { new ChainLeaf(EnemySkipInTree, new Leaf(EnemyMove4inTree)), 0.25F } }; var SelectorForOneTwoSix = new SelectorRandomArray(OneTwoSixMoveset.Shuffle()); var SelectorForTwoThreeSix = new SelectorRandomArray(TwoThreeSixMoveset.Shuffle()); var SelectorForAllMoves = new SelectorRandomArray(AllMoveset.Shuffle()); Node[] HighHPMovelist = { SelectorForOneTwoSix, new Leaf(EnemyMove1inTree) }; Node[] BeginMidHPMovelist = { SelectorForOneTwoSix, new Leaf(EnemyMove1inTree) }; Node[] MiddleHPMovelist = { SelectorForTwoThreeSix, new Leaf(EnemyMove1inTree), SelectorForOneTwoSix }; Node[] BeginLowHPMovelist = { SelectorForAllMoves, new Leaf(EnemyMove1inTree), SelectorForOneTwoSix, SelectorForTwoThreeSix }; Node[] LowHPMovelist = { SelectorForAllMoves, new Leaf(EnemyMove1inTree), SelectorForOneTwoSix, SelectorForTwoThreeSix }; var CheckStaminaAtHighHP = new SelectorArray(IfHasStamina, HighHPMovelist); var CheckStaminaAtBeginMidHP = new SelectorArray(IfHasStamina, BeginMidHPMovelist); var CheckStaminaAtMiddleHP = new SelectorArray(IfHasStamina, MiddleHPMovelist); var CheckStaminaAtBeginLowHP = new SelectorArray(IfHasStamina, BeginLowHPMovelist); var CheckStaminaAtLowHP = new SelectorArray(IfHasStamina, LowHPMovelist); var FirstTurnAtLowHP = new Selector(IfFirstTurnInHpState, CheckStaminaAtBeginLowHP, CheckStaminaAtLowHP); var FirstTurnAtMiddleHP = new Selector(IfFirstTurnInHpState, CheckStaminaAtBeginMidHP, CheckStaminaAtMiddleHP); var CheckHPIsLow = new Selector(IfLowHp, FirstTurnAtLowHP, new Leaf(DummyNode)); var CheckHPIsMedium = new Selector(IfMiddleHP, FirstTurnAtMiddleHP, CheckHPIsLow); var CheckHPIsHigh = new Selector(IfHighHP, CheckStaminaAtHighHP, CheckHPIsMedium); EnemyBehaviorTree TempTree = new EnemyBehaviorTree(CheckHPIsHigh, 1000); //EnemyBehaviorTree TempTree = new EnemyBehaviorTree(new Leaf(EnemyMove6inTree), 1000); Debug.Log("Enemy Behavior Tree 3 is built."); return(TempTree); } else if (sceneName == "FIGHT2") { Dictionary <Node, float> OneTwoFiveMoveset = new Dictionary <Node, float> { { new Leaf(EnemyMove1inTree), 0.3F }, { new Leaf(EnemyMove2inTree), 0.3F }, { new Leaf(EnemyMove5inTree), 0.4F } }; Dictionary <Node, float> TwoThreeFiveMoveset = new Dictionary <Node, float> { { new Leaf(EnemyMove2inTree), 0.2F }, { new Leaf(EnemyMove3inTree), 0.2F }, { new Leaf(EnemyMove5inTree), 0.6F } }; Dictionary <Node, float> AllMoveset = new Dictionary <Node, float> { { new Leaf(EnemyMove1inTree), 0.25F }, { new Leaf(EnemyMove2inTree), 0.25F }, { new Leaf(EnemyMove5inTree), 0.25F }, { new ChainLeaf(EnemySkipInTree, new Leaf(EnemyMove4inTree)), 0.25F } }; var SelectorForOneTwoFive = new SelectorRandomArray(OneTwoFiveMoveset.Shuffle()); var SelectorForTwoThreeFive = new SelectorRandomArray(TwoThreeFiveMoveset.Shuffle()); var SelectorForAllMoves = new SelectorRandomArray(AllMoveset.Shuffle()); Node[] HighHPMovelist = { SelectorForOneTwoFive, new Leaf(EnemyMove1inTree) }; Node[] BeginMidHPMovelist = { SelectorForOneTwoFive, new Leaf(EnemyMove1inTree) }; Node[] MiddleHPMovelist = { SelectorForTwoThreeFive, new Leaf(EnemyMove1inTree), SelectorForOneTwoFive }; Node[] BeginLowHPMovelist = { SelectorForAllMoves, new Leaf(EnemyMove1inTree), SelectorForOneTwoFive, SelectorForTwoThreeFive }; Node[] LowHPMovelist = { SelectorForAllMoves, new Leaf(EnemyMove1inTree), SelectorForOneTwoFive, SelectorForTwoThreeFive }; var CheckStaminaAtHighHP = new SelectorArray(IfHasStamina, HighHPMovelist); var CheckStaminaAtBeginMidHP = new SelectorArray(IfHasStamina, BeginMidHPMovelist); var CheckStaminaAtMiddleHP = new SelectorArray(IfHasStamina, MiddleHPMovelist); var CheckStaminaAtBeginLowHP = new SelectorArray(IfHasStamina, BeginLowHPMovelist); //* var CheckStaminaAtLowHP = new SelectorArray(IfHasStamina, LowHPMovelist); var FirstTurnAtLowHP = new Selector(IfFirstTurnInHpState, CheckStaminaAtBeginLowHP, CheckStaminaAtLowHP); var FirstTurnAtMiddleHP = new Selector(IfFirstTurnInHpState, CheckStaminaAtBeginMidHP, CheckStaminaAtMiddleHP); var CheckHPIsLow = new Selector(IfLowHp, FirstTurnAtLowHP, new Leaf(DummyNode)); var CheckHPIsMedium = new Selector(IfMiddleHP, FirstTurnAtMiddleHP, CheckHPIsLow); var CheckHPIsHigh = new Selector(IfHighHP, CheckStaminaAtHighHP, CheckHPIsMedium); EnemyBehaviorTree TempTree = new EnemyBehaviorTree(CheckHPIsHigh, 1000); //EnemyBehaviorTree TempTree = new EnemyBehaviorTree(CheckStaminaAtLowHP, 1000); //EnemyBehaviorTree TempTree = new EnemyBehaviorTree(new Leaf(EnemyMove6inTree), 1000); Debug.Log("Enemy Behavior Tree 2 is built."); return(TempTree); } else { Dictionary <Node, float> OneTwoMoveset = new Dictionary <Node, float> { { new Leaf(EnemyMove1inTree), 0.5F }, { new Leaf(EnemyMove2inTree), 0.5F } }; Dictionary <Node, float> TwoThreeMoveset = new Dictionary <Node, float> { { new Leaf(EnemyMove2inTree), 0.5F }, { new Leaf(EnemyMove3inTree), 0.5F }, }; Dictionary <Node, float> AllMoveset = new Dictionary <Node, float> { { new Leaf(EnemyMove1inTree), 0.25F }, { new Leaf(EnemyMove2inTree), 0.25F }, { new Leaf(EnemyMove3inTree), 0.25F }, { new ChainLeaf(EnemySkipInTree, new Leaf(EnemyMove4inTree)), 0.25F } }; var SelectorForOneTwo = new SelectorRandomArray(OneTwoMoveset.Shuffle()); var SelectorForTwoThree = new SelectorRandomArray(TwoThreeMoveset.Shuffle()); var SelectorForAllMoves = new SelectorRandomArray(AllMoveset.Shuffle()); Node[] HighHPMovelist = { SelectorForOneTwo, new Leaf(EnemyMove1inTree) }; Node[] BeginMidHPMovelist = { SelectorForOneTwo, new Leaf(EnemyMove1inTree) }; Node[] MiddleHPMovelist = { SelectorForTwoThree, new Leaf(EnemyMove1inTree), SelectorForOneTwo }; Node[] BeginLowHPMovelist = { SelectorForAllMoves, new Leaf(EnemyMove1inTree), SelectorForOneTwo, SelectorForTwoThree }; Node[] LowHPMovelist = { SelectorForAllMoves, new Leaf(EnemyMove1inTree), SelectorForOneTwo, SelectorForTwoThree }; var CheckStaminaAtHighHP = new SelectorArray(IfHasStamina, HighHPMovelist); var CheckStaminaAtBeginMidHP = new SelectorArray(IfHasStamina, BeginMidHPMovelist); var CheckStaminaAtMiddleHP = new SelectorArray(IfHasStamina, MiddleHPMovelist); var CheckStaminaAtBeginLowHP = new SelectorArray(IfHasStamina, BeginLowHPMovelist); var CheckStaminaAtLowHP = new SelectorArray(IfHasStamina, LowHPMovelist); var FirstTurnAtLowHP = new Selector(IfFirstTurnInHpState, CheckStaminaAtBeginLowHP, CheckStaminaAtLowHP); var FirstTurnAtMiddleHP = new Selector(IfFirstTurnInHpState, CheckStaminaAtBeginMidHP, CheckStaminaAtMiddleHP); var CheckHPIsLow = new Selector(IfLowHp, FirstTurnAtLowHP, new Leaf(DummyNode)); var CheckHPIsMedium = new Selector(IfMiddleHP, FirstTurnAtMiddleHP, CheckHPIsLow); var CheckHPIsHigh = new Selector(IfHighHP, CheckStaminaAtHighHP, CheckHPIsMedium); EnemyBehaviorTree TempTree = new EnemyBehaviorTree(CheckHPIsHigh, 1000);// 1000 is an arbitrary high number for the tree to cycle again //EnemyBehaviorTree TempTree = new EnemyBehaviorTree(CheckStaminaAtLowHP, 1000); Debug.Log("Enemy Behavior Tree 1 is built."); return(TempTree); } }
public Result DummyNode(EnemyBehaviorTree tree) { mte.EnemyMove1(); return(new Result(true)); }
public Result Execute(EnemyBehaviorTree tree) { return(action(tree)); }
public Result EnemySkipInTree(EnemyBehaviorTree tree) { mte.EnemySkipTurn(); return(new Result(true)); }
private void Start() { EBT = FindObjectOfType <EnemyBehaviorTree>(); Physics.IgnoreLayerCollision(10, 11); //Compares bulletRB = this.GetComponent <Rigidbody>(); }
public Result EnemyMove6inTree(EnemyBehaviorTree tree) { mte.EnemyMove6(); return(new Result(true)); }
public Result Execute(EnemyBehaviorTree tree) { tree.NodeAndState[this] = EnemyBehaviorTree.NodeState.WAITING; tree.NodeAndState[leafArray[0]] = EnemyBehaviorTree.NodeState.IN_QUEUE; return(new Result(true)); }