diff options
Diffstat (limited to 'sim/src/systems.cpp')
-rw-r--r-- | sim/src/systems.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/sim/src/systems.cpp b/sim/src/systems.cpp new file mode 100644 index 0000000..114ed2f --- /dev/null +++ b/sim/src/systems.cpp @@ -0,0 +1,49 @@ +#include <kurator/sim/systems.h> + +#include <kurator/engine/Context.h> +#include <kurator/sim/components.h> +#include <kurator/sim/events.h> +#include <kurator/sim/HitPoints.h> +#include <kurator/stats/events.h> +#include <kurator/universe/UniqueIdentifier.h> + + +namespace kurator +{ +namespace sim +{ + + +void +keep_at_range(engine::Context& ctx) +{ + auto view = ctx.registry.view<Transform, AIState>(); + for (auto&& [entity, self, ai] : view.each()) { + if (!ctx.registry.valid(ai.target)) + continue; + const auto target = ctx.registry.get<Transform>(ai.target); + const auto offset = target.position - self.position; + ai.destination = target.position - offset.normalized().scale(ai.keep_at_range); + } +} + + +void +kill_off_dead(engine::Context& ctx) +{ + auto view = ctx.registry.view<HitPoints>(); + for (auto&& [entity, points] : view.each()) { + if (points.is_alive()) + continue; + if (ctx.registry.all_of<universe::UniqueIdentifier, Team>(entity)) { + const auto& [identifier, team] = ctx.registry.get<universe::UniqueIdentifier, Team>(entity); + ctx.dispatcher.trigger(stats::ShipLeft{ctx.clock.game, identifier, team.id, true}); + ctx.dispatcher.trigger(Destroyed{entity}); + } + ctx.registry.destroy(entity); + } +} + + +} // namespace sim +} // namespace kurator |