// My method for generating HTN tree
    void initializeHTN()
    {
        beAMonster = new HTNTask("beAMonster", true, new List <HTNTask>());
        // Idle tasks
        idle        = new HTNTask("idle", true, new List <HTNTask>());
        moveToLeft  = new HTNTask("moveToLeft", false, new List <HTNTask>());
        moveToRight = new HTNTask("moveToRight", false, new List <HTNTask>());
        // Attack tasks
        attack         = new HTNTask("attack", true, new List <HTNTask>());
        moveToObstacle = new HTNTask("moveToObstacle", false, new List <HTNTask>());
        throwObstacle  = new HTNTask("throwObstacle", false, new List <HTNTask>());
        //recover = new HTNTask("recover", false, new List<HTNTask>());
        beAMonster.subtasks.Add(idle);
        idle.subtasks.Add(moveToLeft);
        idle.subtasks.Add(moveToRight);
        beAMonster.subtasks.Add(attack);
        attack.subtasks.Add(moveToObstacle);
        attack.subtasks.Add(throwObstacle);

        moveToLeft.precondition.playerInRange = PlayerInRange.no;
        moveToLeft.precondition.playerDead    = PlayerDead.noCare;
        moveToLeft.precondition.hasObstacle   = HasObstacle.noCare;
        moveToLeft.precondition.atObstacle    = AtObstacle.noCare;

        moveToRight.precondition.playerInRange = PlayerInRange.no;
        moveToRight.precondition.playerDead    = PlayerDead.noCare;
        moveToRight.precondition.hasObstacle   = HasObstacle.noCare;
        moveToRight.precondition.atObstacle    = AtObstacle.noCare;

        moveToObstacle.precondition.playerInRange = PlayerInRange.yes;
        moveToObstacle.precondition.playerDead    = PlayerDead.no;
        moveToObstacle.precondition.hasObstacle   = HasObstacle.yes;
        moveToObstacle.precondition.atObstacle    = AtObstacle.no;

        throwObstacle.precondition.playerInRange = PlayerInRange.yes;
        throwObstacle.precondition.playerDead    = PlayerDead.no;
        throwObstacle.precondition.hasObstacle   = HasObstacle.yes;
        throwObstacle.precondition.atObstacle    = AtObstacle.yes;

        SimperForwardPlanner();
    }
    // My methof for main planner
    // basically followed by what Clark taught in class
    void SimperForwardPlanner()
    {
        plan = new List <HTNTask>();

        pickup        = false;
        findPlayer    = false;
        throwFinished = false;

        HTNTasks = new Stack <HTNTask>();
        HTNTasks.Push(beAMonster);
        while (HTNTasks.Count != 0)
        {
            HTNTask hTNTask = HTNTasks.Pop();
            if (hTNTask.isCompound)
            {
                List <HTNTask> foundTasks = hTNTask.addSubtasks();
                if (foundTasks.Count > 0)
                {
                    for (int i = foundTasks.Count - 1; i >= 0; i--)
                    {
                        HTNTasks.Push(foundTasks[i]);
                    }
                }
                else
                {
                    resotreWorldState();
                }
            }
            else
            {
                if (hTNTask.checkPre(worldState))
                {
                    plan.Add(hTNTask);
                }
                else
                {
                    resotreWorldState();
                }
            }
        }
    }