From 975339d07aeb193564221adff31b55a913d92a1e Mon Sep 17 00:00:00 2001 From: Aki Date: Sun, 23 Apr 2023 12:54:14 +0200 Subject: Separated Turret from AI, shuffled their units --- sim/src/ai.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 sim/src/ai.cpp (limited to 'sim/src/ai.cpp') diff --git a/sim/src/ai.cpp b/sim/src/ai.cpp new file mode 100644 index 0000000..1f2a4ec --- /dev/null +++ b/sim/src/ai.cpp @@ -0,0 +1,60 @@ +#include "ai.h" + +#include +#include +#include + +#include "TeamManager.h" + + +namespace kurator +{ +namespace sim +{ + + +void +pick_random_targets(State& ctx, TeamManager& manager) +{ + auto view = ctx.registry.view(); + for (auto&& [entity, team, ai] : view.each()) { + if (!ctx.registry.valid(ai.target)) + ai.target = manager.random(team.id); + } +} + + +void +keep_at_range(State& ctx) +{ + auto view = ctx.registry.view(); + for (auto&& [entity, self, ai] : view.each()) { + if (!ctx.registry.valid(ai.target)) + continue; + const auto target = ctx.registry.get(ai.target); + const auto offset = target.position - self.position; + ai.destination = target.position - offset.normalized().scale(ai.keep_at_range); + } +} + + +void +shoot_at_targets(State& ctx) +{ + auto view = ctx.registry.view(); + for (auto&& [entity, turret] : view.each()) { + if (!ctx.registry.all_of(turret.owner)) + continue; + const auto& [state, transform] = ctx.registry.get(turret.owner); + if (!ctx.registry.valid(state.target)) + continue; + const auto& target = ctx.registry.get(state.target); + const auto distance = transform.position.distance(target.position); + if (distance <= turret.type.effective_range()) + turret.shoot_at(ctx, state.target, distance); // passing distance here is wrong + } +} + + +} // namespace sim +} // namespace kurator -- cgit v1.1