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