BWAPI
|
00001 #include "BlockedPathManager.h" 00002 00003 #include "UnitTracker.h" 00004 #include "BaseTracker.h" 00005 #include "MapHelper.h" 00006 #include "TerrainAnaysis.h" 00007 #include "MineBlockingMineralTask.h" 00008 #include "TaskManager.h" 00009 #include "BuildingPlacer.h" 00010 #include "BuildOrderManager.h" 00011 00012 BlockedPathManagerClass::BlockedPathManagerClass() 00013 { 00014 } 00015 00016 void BlockedPathManagerClass::onBegin() 00017 { 00018 for each(Unit mineral in UnitTracker::Instance().getMinerals()) 00019 { 00020 if(mineral->getResources() <= 1) 00021 { 00022 const TilePosition &mineralTile = mineral->getTilePosition(); 00023 Base base = BaseTracker::Instance().getBase(mineralTile); 00024 00025 bool isBlocking = false; 00026 if(base) 00027 { 00028 const TilePosition &baseTile = base->getCenterBuildLocation(); 00029 00030 isBlocking = (mineralTile.x() > baseTile.x() - 5 && 00031 mineralTile.y() > baseTile.y() - 4 && 00032 mineralTile.x() < baseTile.x() + 7 && 00033 mineralTile.y() < baseTile.y() + 6); 00034 } 00035 00036 if(!isBlocking) 00037 { 00038 const Position &mineralPos = mineral->getPosition(); 00039 00040 Chokepoint closestChoke; 00041 int closestDistance = std::numeric_limits<int>::max(); 00042 for each(Chokepoint chokepoint in TerrainAnaysis::Instance().getChokepoints()) 00043 { 00044 int distance = chokepoint->getCenter().getApproxDistance(mineralPos); 00045 if(distance < closestDistance) 00046 { 00047 closestChoke = chokepoint; 00048 closestDistance = distance; 00049 } 00050 } 00051 00052 if(closestChoke) 00053 { 00054 std::set<Base> bases; 00055 bases.insert(closestChoke->getRegions().first->getBases().begin(), closestChoke->getRegions().first->getBases().end()); 00056 bases.insert(closestChoke->getRegions().second->getBases().begin(), closestChoke->getRegions().second->getBases().end()); 00057 00058 Base closestBase; 00059 int closestDistance = std::numeric_limits<int>::max(); 00060 for each(Base base in bases) 00061 { 00062 if(base->isStartLocation()) 00063 continue; 00064 00065 if(base->getCenterBuildLocation() == BWAPI::TilePositions::None) 00066 continue; 00067 00068 int distance = Position(base->getCenterBuildLocation()).getApproxDistance(mineralPos); 00069 if(distance < closestDistance) 00070 { 00071 closestDistance = distance; 00072 closestBase = base; 00073 } 00074 } 00075 00076 if(closestBase) 00077 { 00078 base = closestBase; 00079 isBlocking = true; 00080 } 00081 } 00082 } 00083 00084 if(isBlocking) 00085 mBlockingMinerals[base].insert(mineral); 00086 } 00087 } 00088 } 00089 00090 void BlockedPathManagerClass::update() 00091 { 00092 const std::set<Base> &myBases = BaseTracker::Instance().getActiveBases(true); 00093 if(myBases != mMyBases) 00094 { 00095 mMyBases = myBases; 00096 00097 for each(Base base in mMyBases) 00098 { 00099 if(mBlockingMinerals.count(base) != 0) 00100 { 00101 TaskPointer task = TaskPointer(new MineBlockingMineralTask(TaskType::Expansion, mBlockingMinerals[base])); 00102 TaskManager::Instance().addTask(task); 00103 00104 mBlockingMinerals.erase(base); 00105 } 00106 } 00107 00108 Base nextExpansion = BuildingPlacer::Instance().getExpandLocation().second; 00109 if(nextExpansion) 00110 { 00111 if(mBlockingMinerals.count(nextExpansion) != 0) 00112 { 00113 TaskPointer task = TaskPointer(new MineBlockingMineralTask(TaskType::Expansion, mBlockingMinerals[nextExpansion])); 00114 TaskManager::Instance().addTask(task); 00115 00116 mBlockingMinerals.erase(nextExpansion); 00117 } 00118 } 00119 } 00120 }