BWAPI
Skynet/Skynet/BlockedPathManager.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines