void CombatCommander::updateDefenseSquadUnits(Squad & defenseSquad, const size_t & flyingDefendersNeeded, const size_t & groundDefendersNeeded) { auto & squadUnits = defenseSquad.getUnits(); // TODO: right now this will assign arbitrary defenders, change this so that we make sure they can attack air/ground // if there's nothing left to defend, clear the squad if (flyingDefendersNeeded == 0 && groundDefendersNeeded == 0) { defenseSquad.clear(); return; } size_t defendersNeeded = flyingDefendersNeeded + groundDefendersNeeded; size_t defendersAdded = 0; while (defendersNeeded > defendersAdded) { UnitTag defenderToAdd = findClosestDefender(defenseSquad, defenseSquad.getSquadOrder().getPosition()); if (defenderToAdd) { m_squadData.assignUnitToSquad(defenderToAdd, defenseSquad); defendersAdded++; } else { break; } } }
void CombatCommander::updateDefenseSquadUnits(Squad & defenseSquad, const size_t & flyingDefendersNeeded, const size_t & groundDefendersNeeded) { int zerglingsInOurBase = numZerglingsInOurBase(); bool zerglingRush = zerglingsInOurBase > 0 && BWAPI::Broodwar->getFrameCount() < 5000; const BWAPI::Unitset & squadUnits = defenseSquad.getUnits(); size_t flyingDefendersInSquad = std::count_if(squadUnits.begin(), squadUnits.end(), UnitUtil::CanAttackAir); size_t groundDefendersInSquad = std::count_if(squadUnits.begin(), squadUnits.end(), UnitUtil::CanAttackGround); // if there's nothing left to defend, clear the squad if (flyingDefendersNeeded == 0 && groundDefendersNeeded == 0) { defenseSquad.clear(); return; } // add flying defenders if we still need them size_t flyingDefendersAdded = 0; while (flyingDefendersNeeded > flyingDefendersInSquad + flyingDefendersAdded) { BWAPI::Unit defenderToAdd = findClosestDefender(defenseSquad, defenseSquad.getSquadOrder().getPosition(), true); // if we find a valid flying defender, add it to the squad if (defenderToAdd) { _squadData.assignUnitToSquad(defenderToAdd, defenseSquad); ++flyingDefendersAdded; } // otherwise we'll never find another one so break out of this loop else { break; } } // add ground defenders if we still need them size_t groundDefendersAdded = 0; while (groundDefendersNeeded > groundDefendersInSquad + groundDefendersAdded) { BWAPI::Unit defenderToAdd = findClosestDefender(defenseSquad, defenseSquad.getSquadOrder().getPosition(), false); // if we find a valid ground defender add it if (defenderToAdd) { _squadData.assignUnitToSquad(defenderToAdd, defenseSquad); ++groundDefendersAdded; } // otherwise we'll never find another one so break out of this loop else { break; } } }