bool BuildingPlacer::canBuildHereWithSpace(BWAPI::TilePosition position, BWAPI::UnitType type) const { if (!this->canBuildHere(position, type)) return false; int width=type.tileWidth(); int height=type.tileHeight(); if (type==BWAPI::UnitTypes::Terran_Command_Center || type==BWAPI::UnitTypes::Terran_Factory || type==BWAPI::UnitTypes::Terran_Starport || type==BWAPI::UnitTypes::Terran_Science_Facility) { width+=2; } int startx = position.x() - buildDistance; if (startx<0) startx=0; int starty = position.y() - buildDistance; if (starty<0) starty=0; int endx = position.x() + width + buildDistance; if (endx>BWAPI::Broodwar->mapWidth()) endx=BWAPI::Broodwar->mapWidth(); int endy = position.y() + height + buildDistance; if (endy>BWAPI::Broodwar->mapHeight()) endy=BWAPI::Broodwar->mapHeight(); for(int x = startx; x < endx; x++) for(int y = starty; y < endy; y++) if (!type.isRefinery()) if (!buildable(x, y)) return false; if (position.x()>3) { int startx2=startx-2; if (startx2<0) startx2=0; for(int x = startx2; x < startx; x++) for(int y = starty; y < endy; y++) { std::set<BWAPI::Unit*> units = BWAPI::Broodwar->unitsOnTile(x, y); for(std::set<BWAPI::Unit*>::iterator i = units.begin(); i != units.end(); i++) { if (!(*i)->isLifted()) { BWAPI::UnitType type=(*i)->getType(); if (type==BWAPI::UnitTypes::Terran_Command_Center || type==BWAPI::UnitTypes::Terran_Factory || type==BWAPI::UnitTypes::Terran_Starport || type==BWAPI::UnitTypes::Terran_Science_Facility) { return false; } } } } } return true; }
// UnitType constructor ActionTypeData::ActionTypeData(BWAPI::UnitType t, const ActionID id) : type (UnitType) , unit (t) , raceID (GetRaceID(t.getRace())) , actionID (id) , mineralPriceVal (t.mineralPrice() * Constants::RESOURCE_SCALE) , gasPriceVal (t.gasPrice() * Constants::RESOURCE_SCALE) , supplyRequiredVal (t.supplyRequired()) , supplyProvidedVal (t.supplyProvided()) , buildTimeVal (t.buildTime()) , numberProduced (1) , name (t.getName()) , metaName (t.getName()) , building (t.isBuilding()) , worker (t.isWorker()) , refinery (t.isRefinery()) , resourceDepot (t.isResourceDepot()) , supplyProvider (t.supplyProvided() > 0 && !t.isResourceDepot()) , canProduceBool (t.isBuilding() && t.canProduce()) , canAttackBool (t.canAttack()) , whatBuildsUnitType (t.whatBuilds().first) , addon (t.isAddon()) , morphed (false) , reqAddon (false) , reqAddonID (0) { if (t == BWAPI::UnitTypes::Zerg_Zergling || t == BWAPI::UnitTypes::Zerg_Scourge) { numberProduced = 2; } if (t == BWAPI::UnitTypes::Zerg_Lair || t == BWAPI::UnitTypes::Zerg_Hive || t == BWAPI::UnitTypes::Zerg_Greater_Spire || t == BWAPI::UnitTypes::Zerg_Lurker || t == BWAPI::UnitTypes::Zerg_Guardian || t == BWAPI::UnitTypes::Zerg_Sunken_Colony || t == BWAPI::UnitTypes::Zerg_Spore_Colony) { morphed = true; } setShortName(); }
bool BuildingPlacer::canBuildHereWithSpace(BWAPI::TilePosition position, BWAPI::UnitType type, int buildDist) const { //returns true if we can build this type of unit here with the specified amount of space. //space value is stored in this->buildDistance. //if we can't build here, we of course can't build here with space if (!this->canBuildHere(position, type)) return false; int width=type.tileWidth(); int height=type.tileHeight(); //make sure we leave space for add-ons. These types of units can have addons: if (type==BWAPI::UnitTypes::Terran_Command_Center || type==BWAPI::UnitTypes::Terran_Factory || type==BWAPI::UnitTypes::Terran_Starport || type==BWAPI::UnitTypes::Terran_Science_Facility) { width+=2; } int startx = position.x() - buildDist; if (startx<0) return false; int starty = position.y() - buildDist; if (starty<0) return false; int endx = position.x() + width + buildDist; if (endx>BWAPI::Broodwar->mapWidth()) return false; int endy = position.y() + height + buildDist; if (endy>BWAPI::Broodwar->mapHeight()) return false; if (!type.isRefinery()) { for(int x = startx; x < endx; x++) for(int y = starty; y < endy; y++) if (!buildable(x, y) || reserveMap[x][y]) return false; } if (position.x()>3) { int startx2=startx-2; if (startx2<0) startx2=0; for(int x = startx2; x < startx; x++) for(int y = starty; y < endy; y++) { std::set<BWAPI::Unit*> units = BWAPI::Broodwar->getUnitsOnTile(x, y); for(std::set<BWAPI::Unit*>::iterator i = units.begin(); i != units.end(); i++) { if (!(*i)->isLifted()) { BWAPI::UnitType type=(*i)->getType(); if (type==BWAPI::UnitTypes::Terran_Command_Center || type==BWAPI::UnitTypes::Terran_Factory || type==BWAPI::UnitTypes::Terran_Starport || type==BWAPI::UnitTypes::Terran_Science_Facility) { return false; } } } } } return true; }