package com.mygdx.game.utilities;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.ai.btree.BehaviorTree;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.mygdx.game.objects.DogCharacter;
import com.mygdx.game.objects.dog.*;
import io.piotrjastrzebski.bte.AIEditor;
public class BehaviorTreeController {
private final AIEditor btreeEditor;
private DogCharacter currentDog;
public BehaviorTreeController () {
btreeEditor = createDogBTEditor();
}
public void step(DogCharacter dog, float deltaTime) {
if (currentDog == dog) {
btreeEditor.update(deltaTime);
}
else {
try {
dog.tree.step();
} catch (Exception ex) {
Gdx.app.log("BehaviorTreeController", "Exception from dog '" + dog.dogName + "': " + ex.getMessage());
}
}
}
public void toggleEditorWindow(Group group, TextButton toggle) {
btreeEditor.toggleWindow(group);
toggle.setText(btreeEditor.isWindowVisible() ? "Hide Editor" : "Show Editor");
}
public void setCurrentDog(DogCharacter dog) {
currentDog = dog;
btreeEditor.getWindow().getTitleLabel().setText(dog.dogName);
btreeEditor.initialize(dog.tree);
}
public void reset() {
currentDog = null;
btreeEditor.reset();
}
private static AIEditor createDogBTEditor() {
AIEditor editor = new AIEditor();
// add default task classes to task drawer with default tags
editor.addDefaultTaskClasses();
editor.setUpdateStrategy(new AIEditor.BehaviorTreeStepStrategy() {
@Override public boolean shouldStep (@SuppressWarnings("rawtypes") BehaviorTree behaviorTree, float v) {
return true;
}
});
// Add dog-specific tasks
editor.addTaskClass("dog", AlreadyCriedForHumanDeathCondition.class);
editor.addTaskClass("dog", CalculatePathToHumanTask.class);
editor.addTaskClass("dog", CalculatePathToStickTask.class);
editor.addTaskClass("dog", FollowPathTask.class);
editor.addTaskClass("dog", GiveStickTask.class);
editor.addTaskClass("dog", HumanWantToPlayCondition.class);
editor.addTaskClass("dog", IsHumanDeadCondition.class);
editor.addTaskClass("dog", IsHumanInRangeCondition.class);
editor.addTaskClass("dog", LieDownTask.class);
editor.addTaskClass("dog", PissTask.class);
editor.addTaskClass("dog", PickUpStickTask.class);
editor.addTaskClass("dog", SetAlreadyCriedForHumanDeathTask.class);
editor.addTaskClass("dog", SetThrowButtonTask.class);
editor.addTaskClass("dog", SitTask.class);
editor.addTaskClass("dog", SpinAroundTask.class);
editor.addTaskClass("dog", SpinAroundToFaceHumanTask.class);
editor.addTaskClass("dog", StandTask.class);
editor.addTaskClass("dog", StickThrownCondition.class);
editor.addTaskClass("dog", WanderTask.class);
editor.addTaskClass("dog", WhineTask.class);
return editor;
}
}