dungeon/src/BehaviourTreeNode.cpp

57 lines
1.1 KiB
C++

#include "BehaviourTreeNode.h"
#include "BehaviourTree.h"
BehaviourTreeNode::BehaviourTreeNode(BehaviourTreeNode* parent) {
if (parent != nullptr) {
parent->AddChild(this);
}
isOpen = false;
}
BehaviourTreeNode::~BehaviourTreeNode() {
for (BehaviourTreeNode* child : children) {
delete child;
}
}
BehaviourTreeStatus BehaviourTreeNode::execute(BTTick* tick) {
enter(tick);
if (!isOpen) {
_open(tick);
}
BehaviourTreeStatus status = this->tick(tick);
if (status != BT_RUNNING) {
_close(tick);
}
exit(tick);
return status;
}
void BehaviourTreeNode::_open(BTTick * tick) {
if (!isOpen) {
isOpen = true;
tick->openNodes.push_back(this);
open(tick);
}
}
void BehaviourTreeNode::_close(BTTick * tick) {
if (isOpen) {
isOpen = false;
if (tick->openNodes.size() > 0) { // Patchwork, no idea why the vector is empty to begin with at times.
tick->openNodes.pop_back();
}
close(tick);
}
}
void BehaviourTreeNode::AddChild(BehaviourTreeNode* node) {
children.push_back(node);
}