TilePosition Squad::getNextStartLocation() { for(set<BaseLocation*>::const_iterator i=getStartLocations().begin();i!=getStartLocations().end();i++) { TilePosition basePos = (*i)->getTilePosition(); if (!isVisible(basePos)) { return basePos; } else { if ((int)agents.size() > 0) { UnitAgent* uagent = (UnitAgent*)agents.at(0); int eCnt = uagent->enemyUnitsWithinRange(10 * 32); if (eCnt > 0) { return TilePosition(-1, -1); } } hasVisited.push_back(basePos); } } return TilePosition(-1, -1); }
TilePosition StructureAgent::getNextScanLocation() { TilePosition ePos = ExplorationManager::getInstance()->getClosestSpottedBuilding(Broodwar->self()->getStartLocation()); if (ePos.x() > -1) { //Already found enemy base return TilePosition(-1, -1); } for(set<BaseLocation*>::const_iterator i=getStartLocations().begin();i!=getStartLocations().end();i++) { TilePosition basePos = (*i)->getTilePosition(); bool needScan = true; //1. Check previous scans for (int i = 0; i < (int)hasScanned.size(); i++) { if (hasScanned.at(i).x() == basePos.x() && hasScanned.at(i).y() == basePos.y()) { needScan = false; } } //2. Check if we have this base vector<BaseAgent*> agents = AgentManager::getInstance()->getAgents(); for (int i = 0; i < (int)agents.size(); i++) { if (agents.at(i)->isAlive()) { double dist = basePos.getDistance(agents.at(i)->getUnit()->getTilePosition()); if (dist <= 10) { needScan = false; break; } } } //3. Check if enemy units are near for(set<Unit*>::const_iterator j=Broodwar->enemy()->getUnits().begin();j!=Broodwar->enemy()->getUnits().end();j++) { if ((*j)->exists()) { double dist = basePos.getDistance((*j)->getTilePosition()); if (dist <= 10) { needScan = false; break; } } } if (needScan) { return basePos; } } return TilePosition(-1, -1); }
TilePosition Squad::getClosestStartLocation(TilePosition pos) { TilePosition sloc = pos; double bestDist = 10000; for(set<BaseLocation*>::const_iterator i=getStartLocations().begin();i!=getStartLocations().end();i++) { TilePosition basePos = (*i)->getTilePosition(); double dist = pos.getDistance(basePos); if (dist < bestDist) { bestDist = dist; sloc = basePos; } } return sloc; }