void BattlecruiserManagerExt::setAverageEnemyPosition(const UnitVector& targets) { if (targets.empty()) { return; } BWAPI::Position sumPos(0, 0); for (int i = 0; i < targets.size(); i++) { if (targets[i]->getPosition().isValid()) { sumPos += targets[i]->getPosition(); } } int xPos = (sumPos.x() / targets.size()); int yPos = (sumPos.y() / targets.size()); BWAPI::Position avgPos(xPos, yPos); _averageEnemyPosition = avgPos; if (!_averageEnemyPosition.isValid()) { _averageEnemyPosition.makeValid(); } }
void DragoonManager::executeMicro(const UnitVector & targets, BWAPI::Position regroup) { const UnitVector & dragoons = getUnits(); // figure out targets UnitVector dragoonTargets; for (size_t i(0); i<targets.size(); i++) { // conditions for targeting if (targets[i]->isVisible()) { dragoonTargets.push_back(targets[i]); } } // for each zealot BOOST_FOREACH(BWAPI::Unit * dragoon, dragoons) { if (DRAW_UALBERTABOT_DEBUG) BWAPI::Broodwar->drawLineMap(dragoon->getPosition().x(), dragoon->getPosition().y(), dragoon->getTargetPosition().x(), dragoon->getTargetPosition().y(), BWAPI::Colors::White); // regroup if we have to regroup and we're not near an enemy if (order.type == order.Attack && regroup != BWAPI::Position(0,0))// && !unitNearEnemy(dragoon)) { if (DRAW_UALBERTABOT_DEBUG) BWAPI::Broodwar->drawCircleMap(dragoon->getPosition().x(), dragoon->getPosition().y(), 3, BWAPI::Colors::Orange, true); // if the zealot is outside the regroup area if (dragoon->getDistance(regroup) > 100) { // regroup it smartMove(dragoon, regroup); } else { smartAttackMove(dragoon, dragoon->getPosition()); } } // otherwise this unit is not regrouping else { // if the order is to attack or defend if (order.type == order.Attack || order.type == order.Defend) { // if there are targets if (!dragoonTargets.empty()) { // find the best target for this zealot BWAPI::Unit * target = getTarget(dragoon, dragoonTargets); // attack it smartAttackUnit(dragoon, target); } // if there are no targets else { // if we're not near the order position if (dragoon->getDistance(order.position) > 100) { // move to it smartAttackMove(dragoon, order.position); } } } } } }
void VultureManagerExt::executeMicro(const UnitVector & targets) { const UnitVector & selectedUnits = getUnits(); // figure out targets UnitVector selectedUnitTargets; UnitVector nearbyTargets; for (size_t i(0); i<targets.size(); i++) { // conditions for targeting if (targets[i]->isVisible() && !targets[i]->getType().isFlyer()) { selectedUnitTargets.push_back(targets[i]); } } //setAverageEnemyPosition(selectedUnitTargets); // For each unit BOOST_FOREACH(BWAPI::Unit * selectedUnit, selectedUnits) { // Avg enemy pos for (size_t i(0); i<targets.size(); i++) { // conditions for targeting if (targets[i]->isVisible() && !targets[i]->getType().isFlyer()) { if (targets[i]->getDistance(selectedUnit) < 500) { nearbyTargets.push_back(targets[i]); } } } if (!nearbyTargets.empty()) { setAverageEnemyPosition(nearbyTargets); } else { setAverageEnemyPosition(selectedUnitTargets); } // eof avg eveeny pos // if the order is to attack or defend if ((StrategyManager::Instance().getCurrentStrategy() == StrategyManager::Instance().TerranWraithRush1Port) && !isAttack()) { executeTerranWraithRush1Port(selectedUnit, selectedUnitTargets); } else if (order.type == order.Attack || order.type == order.Defend) { // if there are targets if (!selectedUnitTargets.empty()) { // find the best target for this Marine BWAPI::Unit * target = getTarget(selectedUnit, selectedUnitTargets); // attack it kiteTarget(selectedUnit, target); } // if there are no targets else { // if we're not near the order position if (selectedUnit->getDistance(order.position) > 100) { // move to it smartAttackMove(selectedUnit, order.position); } } } if (Options::Debug::DRAW_UALBERTABOT_DEBUG) { BWAPI::Broodwar->drawLineMap(selectedUnit->getPosition().x(), selectedUnit->getPosition().y(), selectedUnit->getTargetPosition().x(), selectedUnit->getTargetPosition().y(), Options::Debug::COLOR_LINE_TARGET); } } }
void WraithManagerExt::executeMicro(const UnitVector & targets) { const UnitVector & selectedUnits = getUnits(); _noTurretTargetsNo = 0; // figure out targets UnitVector selectedUnitTargets; for (size_t i(0); i<targets.size(); i++) { // conditions for targeting if (targets[i]->isVisible()) { selectedUnitTargets.push_back(targets[i]); if (!isTurret(targets[i])) { _noTurretTargetsNo++; } } } setAverageEnemyPosition(selectedUnitTargets); // For each unit BOOST_FOREACH(BWAPI::Unit * selectedUnit, selectedUnits) { // Adjust cloak to the situation manageCloak(selectedUnit, selectedUnitTargets); // if the order is to attack or defend if (order.type == order.Attack || order.type == order.Defend) { // if there are targets if (!selectedUnitTargets.empty()) { // find the best target for this unit BWAPI::Unit * target = getTarget(selectedUnit, selectedUnitTargets); // attack it kiteTarget(selectedUnit, target); } // if there are no targets else { // if we're not near the order position if (selectedUnit->getDistance(order.position) > 100) { // move to it // Border movement BWAPI::Position movePosition; if (order.type == SquadOrder::Attack && (StrategyManager::Instance().getCurrentStrategy() == StrategyManager::Instance().TerranWraithRush1Port)) { movePosition = UnitManagerExt::Instance().getMovePosition(selectedUnit); } else { movePosition = order.position; } // eof Border movement if (!movePosition.isValid()) { movePosition.makeValid(); } smartAttackMove(selectedUnit, movePosition); } } } if (Options::Debug::DRAW_UALBERTABOT_DEBUG) { BWAPI::Broodwar->drawLineMap(selectedUnit->getPosition().x(), selectedUnit->getPosition().y(), selectedUnit->getTargetPosition().x(), selectedUnit->getTargetPosition().y(), Options::Debug::COLOR_LINE_TARGET); } }
void RangedManager::executeMicro(const UnitVector & targets) { const UnitVector & rangedUnits = getUnits(); // figure out targets UnitVector rangedUnitTargets; for (size_t i(0); i<targets.size(); i++) { // conditions for targeting if (targets[i]->isVisible()) { rangedUnitTargets.push_back(targets[i]); } } // for each zealot BOOST_FOREACH(BWAPI::Unit * rangedUnit, rangedUnits) { // train sub units such as scarabs or interceptors //trainSubUnits(rangedUnit); // if the order is to attack or defend if (order.type == order.Attack || order.type == order.Defend) { // if there are targets if (!rangedUnitTargets.empty()) { // find the best target for this zealot BWAPI::Unit * target = getTarget(rangedUnit, rangedUnitTargets); /* if ( rangedUnit->getType().groundWeapon().maxRange() < target->getDistance(rangedUnit)) { if(rangedUnit->getType() == BWAPI::UnitTypes::Zerg_Lurker) { //BWAPI::Broodwar->printf("############# Lurker in distance: %d ###############", rangedUnit->getID()); LurkerBurrow(rangedUnit); } } */ // attack it kiteTarget(rangedUnit, target); } // if there are no targets else { // if we're not near the order position if (rangedUnit->getDistance(order.position) > 100) { // move to it smartAttackMove(rangedUnit, order.position); } } } if (Options::Debug::DRAW_UALBERTABOT_DEBUG) { BWAPI::Broodwar->drawLineMap(rangedUnit->getPosition().x(), rangedUnit->getPosition().y(), rangedUnit->getTargetPosition().x(), rangedUnit->getTargetPosition().y(), Options::Debug::COLOR_LINE_TARGET); } } }
void RangedManager::executeMicro(const UnitVector & targets) { const UnitVector & rangedUnits = getUnits(); // figure out targets UnitVector rangedUnitTargets; for (size_t i(0); i<targets.size(); i++) { // conditions for targeting if (targets[i]->isVisible()) { rangedUnitTargets.push_back(targets[i]); } } // for each zealot BOOST_FOREACH(BWAPI::Unit * rangedUnit, rangedUnits) { // train sub units such as scarabs or interceptors //trainSubUnits(rangedUnit); // if the order is to attack or defend if (order.type == order.Attack || order.type == order.Defend || order.type == order.Tanks || order.type == order.Vultures || order.type == order.Goliaths || order.type == order.Marines) { // if there are targets if (!rangedUnitTargets.empty()) { // find the best target for this zealot BWAPI::Unit * target = getTarget(rangedUnit, rangedUnitTargets); // attack it if (!rangedUnit->getType() == BWAPI::UnitTypes::Terran_Siege_Tank_Tank_Mode) { kiteTarget(rangedUnit, target); } else { smartPositionAndDefend(rangedUnit,order.position); } } // if there are no targets else { // if we're not in range of the position if (rangedUnit->getDistance(order.position) > rangedUnit->getInitialType().groundWeapon().maxRange()) { //unsiege tanks if they're sieged if (rangedUnit->getType() == BWAPI::UnitTypes::Terran_Siege_Tank_Siege_Mode) { rangedUnit->unsiege(); } // move to it if (! (order.type == order.Defend)) { smartAttackMove(rangedUnit, order.position); } else { smartPositionAndDefend(rangedUnit,order.position); } } //else if we're in range and we're supposed to s else if (rangedUnit->getType() == BWAPI::UnitTypes::Terran_Siege_Tank_Tank_Mode) { rangedUnit->siege(); } } } if (Options::Debug::DRAW_UALBERTABOT_DEBUG) { BWAPI::Broodwar->drawLineMap(rangedUnit->getPosition().x(), rangedUnit->getPosition().y(), rangedUnit->getTargetPosition().x(), rangedUnit->getTargetPosition().y(), Options::Debug::COLOR_LINE_TARGET); } } }