diff options
author | Aki <please@ignore.pl> | 2023-05-04 00:07:51 +0200 |
---|---|---|
committer | Aki <please@ignore.pl> | 2024-04-05 19:41:19 +0200 |
commit | 52b0bdaba5b38790d144bf1e800ea34be937ded0 (patch) | |
tree | c2215cb7848e421b9c96fcc5cf4beb83b3a75c97 /sim | |
parent | 61d16477b01bcfbe8c3a481a232658ac60309f57 (diff) | |
download | kurator-52b0bdaba5b38790d144bf1e800ea34be937ded0.zip kurator-52b0bdaba5b38790d144bf1e800ea34be937ded0.tar.gz kurator-52b0bdaba5b38790d144bf1e800ea34be937ded0.tar.bz2 |
Refactored Actions to be owned by registry
Registry is now also responsible for switching between the actions and
each action is expected to have one system. Technically an std::variant
could be used here, but let's wait a bit and see how this part evolves.
Diffstat (limited to 'sim')
-rw-r--r-- | sim/include/kurator/sim/ai.h | 13 | ||||
-rw-r--r-- | sim/src/BaseSimulation.cpp | 3 | ||||
-rw-r--r-- | sim/src/ai.cpp | 55 | ||||
-rw-r--r-- | sim/src/ai.h | 3 |
4 files changed, 27 insertions, 47 deletions
diff --git a/sim/include/kurator/sim/ai.h b/sim/include/kurator/sim/ai.h index 0ffa1cc..4953d4f 100644 --- a/sim/include/kurator/sim/ai.h +++ b/sim/include/kurator/sim/ai.h @@ -1,7 +1,5 @@ #pragma once -#include <functional> - #include <entt/entt.hpp> #include <kurator/engine/Point.h> @@ -15,16 +13,19 @@ namespace sim { -using Action = std::function<void()>; - - struct AIShip { - Action action; engine::Point destination; entt::entity target = entt::null; }; +struct KeepAtRange +{ + double distance; + entt::entity target = entt::null; +}; + + } // namespace sim } // namespace kurator diff --git a/sim/src/BaseSimulation.cpp b/sim/src/BaseSimulation.cpp index 2731c67..ffd43f9 100644 --- a/sim/src/BaseSimulation.cpp +++ b/sim/src/BaseSimulation.cpp @@ -16,6 +16,7 @@ namespace sim BaseSimulation::BaseSimulation(State& ctx) { + setup_ai_components(ctx); manager.extend(ctx); } @@ -24,7 +25,7 @@ void BaseSimulation::operator()(State& ctx) { pick_random_targets(ctx, manager); - take_actions(ctx); + keep_at_range(ctx); FloatingMovement::update(ctx); update_turrets(ctx); shoot_at_targets(ctx); diff --git a/sim/src/ai.cpp b/sim/src/ai.cpp index 7a0f637..7b6f700 100644 --- a/sim/src/ai.cpp +++ b/sim/src/ai.cpp @@ -1,7 +1,6 @@ #include "ai.h" #include <algorithm> -#include <utility> #include <entt/entt.hpp> @@ -21,37 +20,11 @@ namespace sim static double find_worst_range(State& ctx, entt::entity ship); -class KeepAtRange +void +setup_ai_components(State&) { -public: - KeepAtRange(State& ctx_, AIShip& ai_, entt::entity self_, entt::entity target_, double distance_) : - ctx {ctx_}, - ai {ai_}, - self {std::move(self_)}, - target {std::move(target_)}, - distance {distance_} - { - } - - void operator()() - { - if (!ctx.registry.valid(target)) { - if (ctx.registry.valid(ai.target)) - ai.action = KeepAtRange(ctx, ai, self, ai.target, distance); - return; - } - const auto here = ctx.registry.get<Transform>(self).position; - const auto there = ctx.registry.get<Transform>(target).position; - const auto offset = there - here; - ai.destination = there - offset.normalized().scale(distance); - } -private: - State& ctx; - AIShip& ai; - entt::entity self; - entt::entity target; - double distance; -}; + // e.g., remove other actions if new one is inserted. +} void @@ -59,21 +32,25 @@ pick_random_targets(State& ctx, TeamManager& manager) { auto view = ctx.registry.view<Team, AIShip>(); for (auto&& [entity, team, ai] : view.each()) { - if (!ctx.registry.valid(ai.target)) + if (!ctx.registry.valid(ai.target)) { ai.target = manager.random(team.id); - if (!ai.action) - ai.action = KeepAtRange(ctx, ai, entity, ai.target, find_worst_range(ctx, entity)); + ctx.registry.emplace_or_replace<KeepAtRange>(entity, find_worst_range(ctx, entity), ai.target); + } } } void -take_actions(State& ctx) +keep_at_range(State& ctx) { - auto view = ctx.registry.view<AIShip>(); - for (auto&& [_, ai] : view.each()) { - if (ai.action) - ai.action(); + auto view = ctx.registry.view<AIShip, KeepAtRange>(); + for (auto&& [entity, ai, action] : view.each()) { + if (!ctx.registry.valid(action.target)) + continue; + const auto here = ctx.registry.get<Transform>(entity).position; + const auto there = ctx.registry.get<Transform>(action.target).position; + const auto offset = there - here; + ai.destination = there - offset.normalized().scale(action.distance); } } diff --git a/sim/src/ai.h b/sim/src/ai.h index d1e9c29..e306be1 100644 --- a/sim/src/ai.h +++ b/sim/src/ai.h @@ -12,8 +12,9 @@ namespace sim { +void setup_ai_components(State& ctx); void pick_random_targets(State& ctx, TeamManager& manager); -void take_actions(State& ctx); +void keep_at_range(State& ctx); void shoot_at_targets(State& ctx); |