dungeon/src/AttackEnemyNode.cpp

66 lines
1.8 KiB
C++
Raw Normal View History

2017-09-17 13:43:13 +02:00
#include "AttackEnemyNode.h"
#include "BehaviourTree.h"
#include "Actor.h"
#include "Tilemap.h"
#include "Pathfinder.h"
#include "FieldOfView.h"
2017-09-17 13:43:13 +02:00
AttackEnemyNode::AttackEnemyNode(BehaviourTreeNode * parent) : BehaviourTreeNode(parent){}
AttackEnemyNode::~AttackEnemyNode() {}
BehaviourTreeStatus AttackEnemyNode::tick(BTTick * tick) {
bool ishero = tick->target->isTypeOf(ACT_HERO);
2017-09-21 22:44:05 +02:00
auto actors = tick->target->map->get_actor_list();
2017-09-17 13:43:13 +02:00
std::vector<Actor*> visibleEnemies;
2017-09-17 20:07:38 +02:00
for (auto actor : *actors) {
2017-09-17 13:43:13 +02:00
if (actor == tick->target) continue;
if (actor->isTypeOf(ACT_HERO) != ishero) {
2017-09-21 22:44:05 +02:00
vec2i pos = actor->get_position();
if (line_of_sight(tick->target->map, tick->target->get_position(), pos)) {
2017-09-17 13:43:13 +02:00
visibleEnemies.push_back(actor);
}
}
}
if (visibleEnemies.size() == 0) {
return BT_FAILED;
}
Actor* closestActor = nullptr;
float closestDist;
2017-09-17 20:07:38 +02:00
for (Actor* actor : visibleEnemies) {
2017-09-21 22:44:05 +02:00
float dist = Pathfinder::distance(tick->target->get_position(), actor->get_position());
2017-09-17 13:43:13 +02:00
if (closestActor == nullptr ||
dist < closestDist) {
closestActor = actor;
closestDist = dist;
}
}
if (closestDist < 1.5f) {
closestActor->health -= tick->target->strength;
if (closestActor->health <= 0) {
closestActor->Kill();
return BT_SUCCEEDED;
}
return BT_RUNNING;
}
else {
2017-09-21 22:44:05 +02:00
vec2i pos = tick->target->get_position();
vec2i goal = closestActor->get_position();
2017-09-17 13:43:13 +02:00
auto path = Pathfinder::aStar(tick->target->map, pos, goal);
if (path.size() > 0) {
//path.pop_back();
vec2i dpos = path.back() - pos;
if (tick->target->Move(dpos.x, dpos.y)) {
return BT_RUNNING;
}
}
return BT_FAILED;
}
}