bool Commander::isOccupied(BWTA::Region* region) { BWTA::Polygon p = region->getPolygon(); vector<BaseAgent*> agents = AgentManager::getInstance()->getAgents(); for (int i = 0; i < (int)agents.size(); i++) { BaseAgent* agent = agents.at(i); if (agent->isAlive() && agent->getUnitType().isResourceDepot()) { BWTA::Region* aRegion = getRegion(agents.at(i)->getUnit()->getTilePosition()); Position c1 = region->getCenter(); Position c2 = aRegion->getCenter(); if (c2.x() == c1.x() && c2.y() == c1.y()) { return true; } } } //Check expansion site TilePosition expansionSite = ExplorationManager::getInstance()->getExpansionSite(); TilePosition center = TilePosition(region->getCenter()); if (expansionSite.x() >= 0) { double dist = expansionSite.getDistance(center); if (dist <= 15) { return true; } } return false; }
TilePosition ExplorationManager::getNextToExplore(Squad* squad) { TilePosition curPos = squad->getCenter(); TilePosition goal = squad->getGoal(); //Special case: No goal set if (goal.x() == -1 || goal.y() == -1) { BWTA::Region* startRegion = getRegion(curPos); goal = TilePosition(startRegion->getCenter()); return goal; } double dist = curPos.getDistance(goal); double acceptDist = 4; if (squad->isGround()) { acceptDist = 6; } if (dist <= acceptDist) { //Squad is close to goal //1. Set region to explored setExplored(goal); //2. Find new region to explore BWTA::Region* startRegion = getRegion(goal); BWTA::Region* bestRegion = startRegion; if (bestRegion != NULL) { int bestLastVisitFrame = getLastVisitFrame(bestRegion); if (!squad->isAir()) { //Ground explorers for(set<BWTA::Region*>::const_iterator i=startRegion->getReachableRegions().begin();i!=startRegion->getReachableRegions().end();i++) { int cLastVisitFrame = getLastVisitFrame((*i)); TilePosition c = TilePosition((*i)->getCenter()); if (cLastVisitFrame <= bestLastVisitFrame) { bestLastVisitFrame = cLastVisitFrame; bestRegion = (*i); } } } else { //Air explorers double bestDist = 100000; for(set<BWTA::Region*>::const_iterator i=getRegions().begin();i!=getRegions().end();i++) { int cLastVisitFrame = getLastVisitFrame((*i)); TilePosition c = TilePosition((*i)->getCenter()); double dist = c.getDistance(curPos); if (cLastVisitFrame < bestLastVisitFrame) { bestLastVisitFrame = cLastVisitFrame; bestRegion = (*i); bestDist = dist; } if (cLastVisitFrame == bestLastVisitFrame && dist < bestDist) { bestLastVisitFrame = cLastVisitFrame; bestRegion = (*i); bestDist = dist; } } } TilePosition newGoal = TilePosition(bestRegion->getCenter()); return newGoal; //Broodwar->printf("Explorer: new goal (%d,%d) I am at (%d,%d) agentGoal (%d,%d)", newGoal.x(), newGoal.y(), curPos.x(), curPos.y(), agent->getGoal().x(), agent->getGoal().y()); } } return TilePosition(-1, -1); }
void CombatCommander::updateScoutDefenseSquad() { if (_combatUnits.empty()) { return; } // if the current squad has units in it then we can ignore this Squad & scoutDefenseSquad = _squadData.getSquad("ScoutDefense"); // get the region that our base is located in BWTA::Region * myRegion = BWTA::getRegion(BWAPI::Broodwar->self()->getStartLocation()); if (!myRegion && myRegion->getCenter().isValid()) { return; } // get all of the enemy units in this region BWAPI::Unitset enemyUnitsInRegion; for (auto & unit : BWAPI::Broodwar->enemy()->getUnits()) { if (BWTA::getRegion(BWAPI::TilePosition(unit->getPosition())) == myRegion) { enemyUnitsInRegion.insert(unit); } } // if there's an enemy worker in our region then assign someone to chase him bool assignScoutDefender = enemyUnitsInRegion.size() == 1 && (*enemyUnitsInRegion.begin())->getType().isWorker(); // if our current squad is empty and we should assign a worker, do it if (scoutDefenseSquad.isEmpty() && assignScoutDefender) { // the enemy worker that is attacking us BWAPI::Unit enemyWorker = *enemyUnitsInRegion.begin(); // get our worker unit that is mining that is closest to it BWAPI::Unit workerDefender = findClosestWorkerToTarget(_combatUnits, enemyWorker); if (enemyWorker && workerDefender) { // grab it from the worker manager and put it in the squad if (_squadData.canAssignUnitToSquad(workerDefender, scoutDefenseSquad)) { WorkerManager::Instance().setCombatWorker(workerDefender); _squadData.assignUnitToSquad(workerDefender, scoutDefenseSquad); } } } // if our squad is not empty and we shouldn't have a worker chasing then take him out of the squad else if (!scoutDefenseSquad.isEmpty() && !assignScoutDefender) { for (auto & unit : scoutDefenseSquad.getUnits()) { unit->stop(); if (unit->getType().isWorker()) { WorkerManager::Instance().finishedWithWorker(unit); } } scoutDefenseSquad.clear(); } }