void ExampleAIModule::updateTrainSCV(){ for(Unitset::iterator cmd = commandCenters.begin(); cmd != commandCenters.end(); ++cmd){ Unitset mineralsAround = Broodwar->getUnitsInRadius(cmd->getPosition(), BASE_RADIUS, Filter::IsMineralField); Unitset scvAround = Broodwar->getUnitsInRadius(cmd->getPosition(), BASE_RADIUS, Filter::IsWorker && Filter::IsOwned); trainSCVIncentives[*cmd] = max(0.0f, 1.0f - (scvAround.size() / (2.5f * mineralsAround.size()))); /* from medic-branch if(scvMap.size() < 110){ trainSCVIncentives[*cmd] = max(0.0f, 1.0f - (scvAround.size() / (2.5f * mineralsAround.size()))); } else{ trainSCVIncentives[*cmd] = 0.0f; }*/ } //Broodwar->getu }
bool Bases::needsAssimilator() { Unitset us; for (auto br : bRec) { if (br.AssimilatorID == -1) { us = Broodwar->getUnitsInRadius(Broodwar->getUnit(br.NexusID)->getPosition(), 480, Filter::IsWorker); if (us.size() > 10) return true; } } return false; }
//---------------------------------------------------------------------------------------------- MapArea StarCraftMap::GetSpecialBuildingPosition(EntityClassType p_buildingType) const { if (!m_isOnline) DEBUG_THROW(InvalidOperationException(XcptHere)); MapArea candidatePosition = MapArea::Null(); // Get the player base tile position MapArea colony = g_Game->Self()->GetColonyMapArea(); Vector2 colonyTile = colony.Pos(); // Get the unit type object UnitType type; TID unitTypeId; string typeName; unitTypeId = g_Database.EntityMapping.GetBySecond(p_buildingType); typeName = g_Database.EntityIdentMapping.GetByFirst(unitTypeId); type = BWAPI::UnitType::getType(typeName); if (type.isRefinery()) { int bestDistance = INT_MAX; Unitset geysers = Broodwar->getGeysers(); Unit currentGeyser; for (unsigned i = 0; i < geysers.size(); ++i) { currentGeyser = geysers[i]; Vector2 currentPosition = Vector2( UnitPositionFromTilePosition(currentGeyser->getTilePosition().x), UnitPositionFromTilePosition(currentGeyser->getTilePosition().y)); int currentDistance = colonyTile.Distance(currentPosition); if (currentDistance <= bestDistance) { bestDistance = currentDistance; candidatePosition = MapArea( currentPosition, type.tileWidth(), type.tileHeight()); } } _ASSERTE(CanBuildHere(candidatePosition.Pos(), p_buildingType)); } return candidatePosition; }
/** * Create new Tasks for each enemy units not covered by attack tasks * Cleans up attack tasks whose targets are not in position anymore * AttackTasks are added at onUnitDiscover() */ void ExampleAIModule::updateAttack(){ //traverse the task list to check if positions are visible and still have enemies vector<Task>* preserved = new vector<Task>(); //stores the tasks that should not be removed UnitType marineType = UnitTypes::Terran_Marine; //Broodwar->drawTextScreen(200,120,"marine seek: %d // sight: %d", marineType.seekRange(), marineType.sightRange()); for(auto task = allTasks[Attack]->begin(); task != allTasks[Attack]->end(); task++){ if(Broodwar->isVisible(task->getPosition().x / TILE_SIZE , task->getPosition().y / TILE_SIZE)){ Unitset inRange = Broodwar->getUnitsInRadius(task->getPosition(), marineType.groundWeapon().maxRange(), Filter::IsEnemy); //Broodwar->sendText("%d in range of attack task.", inRange.size()); // Check if the unit can be reached by the marines // Sometimes cloacked or burrowed units can be marked as enemy but it cannot be attacked bool onlyCloackedUnits = true; for(auto u = inRange.begin(); u != inRange.end(); ++u) { if(!u->isCloaked() && !u->isBurrowed() & !u->isInvincible()){ onlyCloackedUnits = false; break; } } if (inRange.size() == 0 || onlyCloackedUnits) { Broodwar->sendText("Attack task removed"); //toDelete.push_back(*task); } else { preserved->push_back(*task); } } else { //keeps invisible attack targets, so that they can be investigated preserved->push_back(*task); } } //brings preserved tasks to the main task vector allTasks[Attack]->swap(*preserved); delete preserved; //hope this doesn't invalidates tasks... //in this point, tasks whose targets are not visible were removed // --- Now, adds new tasks for enemy units not covered by existent attack tasks --- //obtains a list with all enemies from all players Playerset foes = Broodwar->enemies(); Unitset enemyUnits; enemyUnits.clear(); for(auto foe = foes.begin(); foe != foes.end(); ++foe){ enemyUnits += foe->getUnits(); } //Broodwar->drawTextScreen(250,45, "#foes: %d", enemyUnits.size()); //adds a task with a position for every enemy unit in the task list for(auto foeUnit = enemyUnits.begin(); foeUnit != enemyUnits.end(); ++foeUnit) { bool inRange = false; //tests if unit is already included in the area of another 'attack' task for(auto task = allTasks[Attack]->begin(); task != allTasks[Attack]->end(); task++){ //task-> //foeUnit->getType().groundWeapon().maxRange(); //PositionTask* atk = static_cast<PositionTask* >( &(*task)) ; if(foeUnit->getDistance(task->getPosition()) < marineType.groundWeapon().maxRange()){ inRange = true; break; } } // Hector : extra validation to ignore unreachable targets //TODO: test is reachable Position foePos = foeUnit->getPosition(); if(! inRange && !foeUnit->isCloaked() && !foeUnit->isBurrowed() && !foeUnit->isInvincible() && Broodwar->isWalkable(foePos.x / 8, foePos.y / 8)){ Task* atk = new Task(Attack, .8f, foeUnit->getPosition()); allTasks[Attack]->push_back(*atk); //Broodwar->sendText("Attack task added, pos=%d,%d // %d,%d ", unit->getPosition().x, unit->getPosition().y, atk->getPosition().x, atk->getPosition().y); } } /* //if unit is enemy, adds it to 'attack' task list, if it isn't in range of an attack task //it seems that it works only for buildings... must check for mobile enemy units if(unit->getPlayer() != Broodwar->self() && unit->getPlayer() != Broodwar->neutral()){ bool inRange = false; //tests if unit is already included in the area of another 'attack' task for(auto task = allTasks[Attack]->begin(); task != allTasks[Attack]->end(); task++){ //task-> //PositionTask* atk = static_cast<PositionTask* >( &(*task)) ; if(unit->getDistance(task->getPosition()) < 6*TILE_SIZE){ inRange = true; break; } } if(! inRange){ Task* atk = new Task(Attack, .8f, unit->getPosition()); allTasks[Attack]->push_back(*atk); Broodwar->sendText("Attack task added, pos=%d,%d // %d,%d ", unit->getPosition().x, unit->getPosition().y, atk->getPosition().x, atk->getPosition().y); for(auto task = allTasks[Attack]->begin(); task != allTasks[Attack]->end(); task++){ //PositionTask* atk = static_cast<PositionTask* >( &(*task)) ; Broodwar->sendText("pos=%d,%d", task->getPosition().x, task->getPosition().y); } } } */ }