#include "BehaviorTargeting.h" #include "CargoComponent.h" #include "EntityAdmin.h" #include "FactionComponent.h" #include "HealthComponent.h" #include "HqProxyComponent.h" #include "PositionComponent.h" #include "ShipIdentityComponent.h" #include "StationBodyComponent.h" std::vector buildRepairables(EntityAdmin& admin) { std::vector repairables; admin.forEach( [&repairables](entt::entity e, const ShipIdentityComponent& /*si*/, const PositionComponent& pos, const FactionComponent& f, const HealthComponent& h) { repairables.push_back({e, pos.value, f.isEnemy, true, h.hp, h.maxHp}); }); admin.forEach( [&repairables, &admin](entt::entity e, const StationBodyComponent& /*sb*/, const PositionComponent& pos, const FactionComponent& f, const HealthComponent& h) { // The HQ is not a repair target — only ships and defence stations are // (REQ-SHP-REPAIR). In the balancing arena the HQ is spawned as a station, // so it is identified by its HqProxyComponent tag. if (admin.hasAll(e)) { return; } repairables.push_back({e, pos.value, f.isEnemy, false, h.hp, h.maxHp}); }); return repairables; } std::vector buildCombatants(EntityAdmin& admin) { std::vector combatants; admin.forEach( [&combatants](entt::entity e, const PositionComponent& pos, const FactionComponent& f, const ShipIdentityComponent& /*si*/) { combatants.push_back({e, pos.value, f.isEnemy, false}); }); admin.forEach( [&combatants](entt::entity e, const PositionComponent& pos, const FactionComponent& f, const StationBodyComponent& /*sb*/) { combatants.push_back({e, pos.value, f.isEnemy, true}); }); admin.forEach( [&combatants, &admin](entt::entity e, const PositionComponent& pos, const FactionComponent& f, const HqProxyComponent& /*hq*/) { // An arena HQ carries both StationBodyComponent and HqProxyComponent; it // is already listed by the station pass above, so skip it here to avoid // counting it twice. if (admin.hasAll(e)) { return; } combatants.push_back({e, pos.value, f.isEnemy, true}); }); return combatants; } std::unordered_map buildCargoByShip(EntityAdmin& admin) { std::unordered_map cargoByShip; admin.forEach( [&cargoByShip](entt::entity ship, const CargoComponent& c) { cargoByShip[ship] = CargoState{c.current, c.maxCapacity}; }); return cargoByShip; } bool isCargoFull(const CargoState& cargo) { return cargo.capacity > 0 && cargo.current >= cargo.capacity; }