dungeon/src/WanderNode.cpp

41 lines
1 KiB
C++
Raw Normal View History

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();
2018-01-09 21:59:05 +01:00
std::vector<vec2i> neighbours = tick->map->get_neighbours(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;
}
}
2018-01-09 21:59:05 +01:00
if (valid && tick->target->move(dp.x, dp.y, tick->map)) {
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);
}
}
}