#include "BaseBattle.h" #include #include #include #include #include #include #include #include #include #include #include "Builder.h" #include "RandomSpawner.h" namespace kurator { namespace sim { static void setup_scenario(entt::registry& registry, const campaign::Scenario& scenario); BaseBattle::BaseBattle(const campaign::Scenario& scenario) : _registry {} { setup_scenario(_registry, scenario); manager.extend(_registry); } void setup_scenario(entt::registry& registry, const campaign::Scenario& scenario) { RandomSpawner spawner {scenario.last_team(), scenario.radius, 0.1}; Builder build {registry, spawner}; for (const auto& ship : scenario.ships) { const auto entity = build(ship.loadout.type, ship.team); registry.emplace(entity, ship.identifier); auto& state = registry.get(entity); for (const auto& turret_type : ship.loadout.turrets) { build(turret_type, entity); state.keep_at_range = std::min(state.keep_at_range, turret_type.optimal_range); } } } entt::registry& BaseBattle::registry() { return _registry; } entt::dispatcher& BaseBattle::dispatcher() { return _dispatcher; } void BaseBattle::update(engine::Context& ctx) { pick_random_targets(); keep_at_range(ctx); FloatingMovement::update(ctx); TurretControl::update(ctx); kill_off_dead(ctx); manager.update(ctx); } void BaseBattle::pick_random_targets() { auto view = _registry.view(); for (auto&& [entity, team, ai] : view.each()) { if (!_registry.valid(ai.target)) ai.target = manager.random(team.id); } } } // namespace sim } // namespace kurator