dungeon/src/RangedAttackNode.cpp

46 lines
1.2 KiB
C++
Raw Normal View History

2017-09-17 13:43:13 +02:00
#include "RangedAttackNode.h"
#include "BehaviourTree.h"
#include "Actor.h"
#include "Tilemap.h"
#include "FieldOfView.h"
2017-09-17 13:43:13 +02:00
RangedAttackNode::RangedAttackNode(BehaviourTreeNode* parent) : BehaviourTreeNode(parent) {}
2017-09-26 15:49:11 +02:00
RangedAttackNode::~RangedAttackNode() = default;
2017-09-17 13:43:13 +02:00
BehaviourTreeStatus RangedAttackNode::tick(BTTick * tick) {
2017-09-26 15:49:11 +02:00
bool ishero = tick->target->is_type_of(ACT_HERO);
vec2i targetpos = tick->target->get_position();
2017-09-17 13:43:13 +02:00
2018-01-09 21:59:05 +01:00
auto actors = tick->map->get_actors(targetpos.x, targetpos.y, 6);
2017-09-17 13:43:13 +02:00
std::vector<Actor*> enemies;
for (Actor* actor : actors) {
2017-09-17 13:43:13 +02:00
if (actor == tick->target) continue;
2017-09-26 15:49:11 +02:00
if (actor->is_type_of(ACT_HERO) != ishero) {
2017-09-21 22:44:05 +02:00
vec2i pos = actor->get_position();
2018-01-09 21:59:05 +01:00
if (line_of_sight(tick->map, tick->target->get_position(), pos)) {
2017-09-17 13:43:13 +02:00
enemies.push_back(actor);
}
}
}
2017-09-26 15:49:11 +02:00
if (enemies.empty()) {
2017-09-17 13:43:13 +02:00
return BT_FAILED;
}
Actor* lowestHpActor = nullptr;
int lowestHp;
2017-09-17 20:07:38 +02:00
for (Actor* actor : enemies) {
2017-09-26 15:49:11 +02:00
if (lowestHpActor == nullptr || actor->get_health() < lowestHp) {
2017-09-17 13:43:13 +02:00
lowestHpActor = actor;
2017-09-26 15:49:11 +02:00
lowestHp = actor->get_health();
2017-09-17 13:43:13 +02:00
}
}
2017-09-26 15:49:11 +02:00
tick->target->attack(lowestHpActor);
2017-09-17 13:43:13 +02:00
return BT_SUCCEEDED;
}