Exemple #1
0
    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);
    }
Exemple #2
0
    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);
    }
Exemple #4
0
    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));
    }
Exemple #5
0
    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));
    }
Exemple #6
0
    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);
    }
Exemple #7
0
    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);
    }
Exemple #8
0
 public void Start()
 {
     currentHP      = Mathf.Clamp(currentHP, 0, 200);
     currentStamina = Mathf.Clamp(currentStamina, 0, 100);
     currentHP      = baseHP;
     currentStamina = baseStamina;
     tree           = BuildTree();
 }
Exemple #9
0
 public Result IfMiddleHP(EnemyBehaviorTree tree)
 {
     if (IsBetweenOneQuarterAndThreeQuartersHP())
     {
         MiddleHPStatus = true;
     }
     else
     {
         MiddleHPStatus = false;
     }
     return(new Result(MiddleHPStatus));
 }
Exemple #10
0
 public Result IfLowHp(EnemyBehaviorTree tree)
 {
     if (IsBelowOneQuarterHP())
     {
         LowHpStatus = true;
     }
     else
     {
         LowHpStatus = false;
     }
     return(new Result(LowHpStatus));
 }
Exemple #11
0
 // 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));
 }
Exemple #12
0
 // Nodes for HP Level Check
 public Result IfHighHP(EnemyBehaviorTree tree)
 {
     if (IsAboveThreeQuartersHP())
     {
         HighHPStatus = true;
     }
     else
     {
         HighHPStatus = false;
     }
     return(new Result(HighHPStatus));
 }
Exemple #13
0
 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);
 }
Exemple #14
0
    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);
    }
Exemple #15
0
    // 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));
        }
    }
Exemple #16
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);
    }
Exemple #17
0
    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);
    }
Exemple #18
0
 public virtual Result Execute(EnemyBehaviorTree EBT)
 {
     return(Result.running);
 }
Exemple #19
0
    /*
     * // 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);
        }
    }
Exemple #20
0
 public Result DummyNode(EnemyBehaviorTree tree)
 {
     mte.EnemyMove1();
     return(new Result(true));
 }
Exemple #21
0
 public Result Execute(EnemyBehaviorTree tree)
 {
     return(action(tree));
 }
Exemple #22
0
 public Result EnemySkipInTree(EnemyBehaviorTree tree)
 {
     mte.EnemySkipTurn();
     return(new Result(true));
 }
Exemple #23
0
 private void Start()
 {
     EBT = FindObjectOfType <EnemyBehaviorTree>();
     Physics.IgnoreLayerCollision(10, 11); //Compares
     bulletRB = this.GetComponent <Rigidbody>();
 }
Exemple #24
0
 public Result EnemyMove6inTree(EnemyBehaviorTree tree)
 {
     mte.EnemyMove6();
     return(new Result(true));
 }
Exemple #25
0
 public Result Execute(EnemyBehaviorTree tree)
 {
     tree.NodeAndState[this]         = EnemyBehaviorTree.NodeState.WAITING;
     tree.NodeAndState[leafArray[0]] = EnemyBehaviorTree.NodeState.IN_QUEUE;
     return(new Result(true));
 }