62 lines
2.3 KiB
C++
62 lines
2.3 KiB
C++
#include "AttackExecutor.h"
|
|
|
|
#include "AttackBehavior.h"
|
|
#include "BehaviorKind.h"
|
|
#include "EntityAdmin.h"
|
|
#include "ModuleOwnerComponent.h"
|
|
#include "MovementIntentComponent.h"
|
|
#include "PositionComponent.h"
|
|
#include "SelectedBehaviorComponent.h"
|
|
#include "tracing.h"
|
|
#include "WeaponComponent.h"
|
|
|
|
void AttackExecutor::execute(EntityAdmin& admin)
|
|
{
|
|
TRACE();
|
|
|
|
// Ships: move toward the behavior target.
|
|
admin.forEach<AttackBehavior, SelectedBehaviorComponent, PositionComponent,
|
|
MovementIntentComponent>(
|
|
[&](entt::entity /*e*/, const AttackBehavior& attack,
|
|
const SelectedBehaviorComponent& selected, const PositionComponent& pos,
|
|
MovementIntentComponent& intent)
|
|
{
|
|
if (selected.winner != BehaviorKind::Attack) { return; }
|
|
if (!attack.currentTarget) { return; }
|
|
|
|
const entt::entity t = *attack.currentTarget;
|
|
QVector2D dest = pos.value;
|
|
if (admin.isValid(t) && admin.hasAll<PositionComponent>(t))
|
|
{
|
|
dest = admin.get<PositionComponent>(t).value;
|
|
}
|
|
intent = MovementIntentComponent{true, dest};
|
|
});
|
|
|
|
// Weapons: assign the behavior target only if it is within this weapon's range.
|
|
admin.forEach<WeaponComponent, ModuleOwnerComponent>(
|
|
[&](entt::entity /*we*/, WeaponComponent& weapon, const ModuleOwnerComponent& owner)
|
|
{
|
|
if (!admin.hasAll<AttackBehavior, SelectedBehaviorComponent>(owner.owner))
|
|
{
|
|
return;
|
|
}
|
|
const SelectedBehaviorComponent& selected =
|
|
admin.get<SelectedBehaviorComponent>(owner.owner);
|
|
if (selected.winner != BehaviorKind::Attack) { return; }
|
|
|
|
const AttackBehavior& attack = admin.get<AttackBehavior>(owner.owner);
|
|
if (!attack.currentTarget) { return; }
|
|
|
|
const entt::entity t = *attack.currentTarget;
|
|
if (!admin.isValid(t) || !admin.hasAll<PositionComponent>(t)) { return; }
|
|
|
|
const QVector2D ownerPos = admin.get<PositionComponent>(owner.owner).value;
|
|
const float dist = (admin.get<PositionComponent>(t).value - ownerPos).length();
|
|
if (dist <= weapon.range_tiles)
|
|
{
|
|
weapon.currentTarget = t;
|
|
}
|
|
});
|
|
}
|