#include "TeamManager.h" #include #include #include #include #include #include #include #include #include namespace kurator { namespace sim { TeamManager::TeamManager() : teams {}, generator {std::random_device{}()} { } void TeamManager::extend(entt::registry& registry) { auto ships = registry.view(); for (const auto& [entity, type, team] : ships.each()) add(team.id, entity); } void TeamManager::add(int team, entt::entity entity) { for (int i = teams.size(); i < team + 1; ++i) teams.emplace_back(); teams.at(team).push_back(std::move(entity)); } entt::entity TeamManager::random(const int exclude) { std::vector open; open.resize(teams.size()); std::iota(open.begin(), open.end(), 0); auto is_closed = [&](const int team){ return team == exclude || teams.at(team).empty(); }; open.erase(std::remove_if(open.begin(), open.end(), is_closed), open.end()); if (open.empty()) return entt::null; std::uniform_int_distribution team{0, open.size() - 1}; const auto& members = teams.at(open.at(team(generator))); std::uniform_int_distribution member{0, members.size() - 1}; return members.at(member(generator)); } void TeamManager::update(engine::Context& ctx) { for (auto& members : teams) { auto is_valid = [&](entt::entity entity){ return !ctx.registry.valid(entity); }; members.erase(std::remove_if(members.begin(), members.end(), is_valid), members.end()); } const auto left = std::count_if(teams.begin(), teams.end(), [](const Team& team){ return team.size() > 0; }); if (left < 2) ctx.dispatcher.trigger(End{}); } } // namespace sim } // namespace kurator