2017-09-17 20:07:38 +02:00
|
|
|
#include <cstdlib>
|
2017-09-17 13:43:13 +02:00
|
|
|
#include "WanderNode.h"
|
|
|
|
#include "BehaviourTree.h"
|
|
|
|
#include "Actor.h"
|
|
|
|
#include "Tilemap.h"
|
|
|
|
|
|
|
|
WanderNode::WanderNode(BehaviourTreeNode* parent) : BehaviourTreeNode(parent){}
|
|
|
|
|
|
|
|
|
2017-09-26 15:49:11 +02:00
|
|
|
WanderNode::~WanderNode() = default;
|
2017-09-17 13:43:13 +02:00
|
|
|
|
|
|
|
BehaviourTreeStatus WanderNode::tick(BTTick * tick) {
|
2017-09-21 22:44:05 +02:00
|
|
|
vec2i pos = tick->target->get_position();
|
2017-09-26 15:49:11 +02:00
|
|
|
std::vector<vec2i> neighbours = tick->target->get_map()->getNeighbours(pos.x, pos.y);
|
2017-09-17 13:43:13 +02:00
|
|
|
while (true) {
|
2017-09-26 15:49:11 +02:00
|
|
|
if (neighbours.empty()) {
|
2017-09-17 13:43:13 +02:00
|
|
|
previous.clear();
|
|
|
|
return BT_FAILED;
|
|
|
|
}
|
|
|
|
int i = rand() % neighbours.size();
|
|
|
|
vec2i dp = neighbours[i] - pos;
|
|
|
|
bool valid = true;
|
2017-09-17 20:07:38 +02:00
|
|
|
for (vec2i var : previous) {
|
2017-09-17 13:43:13 +02:00
|
|
|
if (var == neighbours[i]) {
|
|
|
|
valid = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2017-09-26 15:49:11 +02:00
|
|
|
if (valid && tick->target->move(dp.x, dp.y)) {
|
2017-09-17 13:43:13 +02:00
|
|
|
previous.push_back(neighbours[i]);
|
|
|
|
if (previous.size() > 5) {
|
|
|
|
previous.erase(previous.begin());
|
|
|
|
}
|
|
|
|
return BT_SUCCEEDED;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
neighbours.erase(neighbours.begin() + i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|