TilePosition ExplorationManager::scanForVulnerableBase() { TilePosition spot = TilePosition(-1, -1); for (int i = 0; i < (int)spottedBuildings.size(); i++) { if (spottedBuildings.at(i)->isActive()) { SpottedObject* obj = spottedBuildings.at(i); if (obj->getType().isResourceDepot()) { if (!isDetectorCovering(obj->getTilePosition())) { //Broodwar->printf("Found probable vulnerable base at (%d,%d)", obj->getTilePosition().x(), obj->getTilePosition().y()); spot = obj->getTilePosition(); } } } } if (spot.x() < 0) { //Broodwar->printf("Scan: No vulnerable base found"); } return spot; }
bool ExplorationManager::isDetectorCovering(Position pos) { for (int i = 0; i < (int)spottedBuildings.size(); i++) { if (spottedBuildings.at(i)->isActive()) { SpottedObject* obj = spottedBuildings.at(i); if (obj->getType().isDetector()) { double dist = obj->getPosition().getDistance(pos); if (dist <= obj->getType().sightRange()) { return true; } } } } return false; }
TilePosition Commander::getClosestEnemyBuilding(TilePosition start) { Unit* closestBuilding = NULL; SpottedObject* closestObj = NULL; double bestDist = -1; for(set<Unit*>::const_iterator i=Broodwar->enemy()->getUnits().begin();i!=Broodwar->enemy()->getUnits().end();i++) { if ((*i)->getType().isBuilding()) { //V2 double cDist = start.getDistance((*i)->getTilePosition()); //V1 - TODO: Better, but too damn slow //vector<TilePosition> path = BWTA::getShortestPath(start, (*i)->getTilePosition()); //double cDist = (double)path.size(); if (!ExplorationManager::canReach(start, (*i)->getTilePosition())) { cDist = -1; } if (bestDist < 0 || cDist < bestDist) { bestDist = cDist; closestBuilding = (*i); } } } if (closestBuilding != NULL) { //Broodwar->printf("[TSC]: Closest enemy building is %s", closestBuilding->getType().getName().c_str()); return closestBuilding->getTilePosition(); } else if (ExplorationManager::getInstance()->isActive()) { bestDist = -1; vector<SpottedObject*> units = ExplorationManager::getInstance()->getSpottedBuildings(); for (int i = 0; i < (int)units.size(); i++) { SpottedObject* obj = units.at(i); if (obj->getType().isBuilding() && obj->isActive()) { double cDist = obj->getDistance(start); if (bestDist < 0 || cDist < bestDist) { bestDist = cDist; closestObj = obj; } } } //Broodwar->printf("[TSC]: using ExpManager. Closest is %s", closestObj.getType().getName().c_str()); } else { //Broodwar->printf("[TSC]: No enemy building found"); return TilePosition(-1, -1); } return closestObj->getTilePosition(); }
TilePosition Commander::getClosestEnemyBuilding(TilePosition start) { Unit* closestBuilding = NULL; SpottedObject* closestObj = NULL; double bestDist = -1; for(set<Unit*>::const_iterator i=Broodwar->enemy()->getUnits().begin();i!=Broodwar->enemy()->getUnits().end();i++) { if ((*i)->getType().isBuilding()) { double cDist = start.getDistance((*i)->getTilePosition()); if (!ExplorationManager::canReach(start, (*i)->getTilePosition())) { //cDist = -1; } if (bestDist < 0 || cDist < bestDist) { bestDist = cDist; closestBuilding = (*i); } } } if (closestBuilding != NULL) { //Broodwar->printf("[TSC]: Closest enemy building is %s", closestBuilding->getType().getName().c_str()); return closestBuilding->getTilePosition(); } if (ExplorationManager::getInstance()->isActive()) { bestDist = -1; vector<SpottedObject*> units = ExplorationManager::getInstance()->getSpottedBuildings(); for (int i = 0; i < (int)units.size(); i++) { SpottedObject* obj = units.at(i); if (obj->getType().isBuilding() && obj->isActive()) { double cDist = obj->getDistance(start); if (bestDist < 0 || cDist < bestDist) { bestDist = cDist; closestObj = obj; } } } if (closestObj != NULL) { //Broodwar->printf("[TSC]: Closest enemy building is %s", closestBuilding->getType().getName().c_str()); return closestObj->getTilePosition(); } } //No building has been spotted. Move towards a starting point. for (int i = 0; i < (int)squads.size(); i++) { if (squads.at(i)->isOffensive() && squads.at(i)->getSize() > 0) { TilePosition nextArea = squads.at(i)->getNextStartLocation(); return nextArea; } } return TilePosition(-1,-1); }