BWAPI
Skynet/Skynet/ExpansionManager.cpp
Go to the documentation of this file.
00001 #include "ExpansionManager.h"
00002 
00003 #include "BuildOrderManager.h"
00004 #include "BaseTracker.h"
00005 #include "UnitTracker.h"
00006 #include "TaskManager.h"
00007 #include "PlayerTracker.h"
00008 #include "MacroManager.h"
00009 #include "ResourceManager.h"
00010 #include "Logger.h"
00011 
00012 ExpansionManagerClass::ExpansionManagerClass()
00013 {
00014 }
00015 
00016 void ExpansionManagerClass::update()
00017 {
00018         if(BuildOrderManager::Instance().getOrder(Order::RefineryManager))
00019                 updateRefineries();
00020 
00021         if(BuildOrderManager::Instance().getOrder(Order::ExpansionManager))
00022         {
00023                 updateDefense();
00024                 updateExpands();
00025         }
00026 }
00027 
00028 void ExpansionManagerClass::updateRefineries()
00029 {
00030         int refNeeded = 0;
00031         for each(Base base in BaseTracker::Instance().getActiveBases(true))
00032         {
00033                 if(base->getActivateTime() < unsigned int(BWAPI::Broodwar->getFrameCount() + BWAPI::Broodwar->self()->getRace().getRefinery().buildTime()))
00034                         refNeeded += base->getGeysers().size();
00035         }
00036 
00037         for(std::list<TaskPointer>::iterator it = mRefineryTasks.begin(); it != mRefineryTasks.end();)
00038         {
00039                 if((*it)->hasEnded())
00040                         mRefineryTasks.erase(it++);
00041                 else
00042                 {
00043                         if(!(*it)->inProgress())
00044                                 --refNeeded;
00045                         ++it;
00046                 }
00047         }
00048 
00049         if(ResourceManager::Instance().requiresRefineries() && refNeeded > 0 && BWAPI::Broodwar->getFrameCount() % 50 == 0)
00050                 mRefineryTasks.push_front(TaskManager::Instance().build(BWAPI::Broodwar->self()->getRace().getRefinery(), TaskType::RefineryManager));
00051         else if(refNeeded < 0)
00052         {
00053                 for(int i = 0; i < refNeeded; ++i)
00054                 {
00055                         std::list<TaskPointer>::iterator begin = mRefineryTasks.begin();
00056                         (*begin)->cancel();
00057                         mRefineryTasks.erase(begin);
00058                 }
00059         }
00060 }
00061 
00062 void ExpansionManagerClass::updateDefense()
00063 {
00064         if(BWAPI::Broodwar->self()->getRace() == BWAPI::Races::Zerg)
00065                 return;
00066 
00067         BWAPI::UnitType defenseType = BWAPI::Broodwar->self()->getRace() == BWAPI::Races::Protoss ? BWAPI::UnitTypes::Protoss_Photon_Cannon : BWAPI::UnitTypes::Terran_Missile_Turret;
00068 
00069         if(!MacroManager::Instance().hasRequirements(defenseType))
00070                 return;
00071 
00072         std::set<Base> myBases = BaseTracker::Instance().getActiveBases(true);
00073         if(myBases.size() >= 2)
00074         {
00075                 int defensesNeeded = 0;
00076                 int neededPerBase = PlayerTracker::Instance().isEnemyRace(BWAPI::Races::Zerg) ? 4 : 2;
00077 
00078                 for each(Base base in myBases)
00079                 {
00080                         if(base->getMinerals().empty())
00081                                 continue;
00082 
00083                         bool hasPylon = defenseType.requiresPsi() ? false : true;
00084                         int thisCount = 0;
00085                         for each(Unit building in base->getBuildings())
00086                         {
00087                                 if(building->getType() == defenseType)
00088                                         ++thisCount;
00089 
00090                                 if(building->getType() == BWAPI::UnitTypes::Protoss_Pylon)
00091                                 {
00092                                         if(building->isCompleted())
00093                                                 hasPylon = true;
00094                                 }
00095                         }
00096 
00097                         if(hasPylon)
00098                         {
00099                                 defensesNeeded += neededPerBase;
00100                                 defensesNeeded -= std::min(thisCount, neededPerBase);
00101                         }
00102                         else if(BWAPI::Broodwar->self()->supplyTotal() >= 380 && (!mPylon || mPylon->hasEnded()))
00103                                 mPylon = TaskManager::Instance().build(BWAPI::UnitTypes::Protoss_Pylon, TaskType::Defense);
00104                 }
00105 
00106                 for(std::list<TaskPointer>::iterator it = mDefenseTasks.begin(); it != mDefenseTasks.end();)
00107                 {
00108                         if((*it)->hasEnded())
00109                                 mDefenseTasks.erase(it++);
00110                         else
00111                         {
00112                                 if(!(*it)->inProgress())
00113                                         --defensesNeeded;
00114                                 ++it;
00115                         }
00116                 }
00117 
00118                 if(defensesNeeded > 0)
00119                 {
00120                         for(int i = 0; i < defensesNeeded; ++i)
00121                         {
00122                                 LOGMESSAGE(String_Builder() << "Built Defense.");
00123                                 mDefenseTasks.push_front(TaskManager::Instance().build(defenseType, TaskType::Defense));
00124                         }
00125                 }
00126                 else if(defensesNeeded < 0)
00127                 {
00128                         for(int i = 0; i < defensesNeeded; ++i)
00129                         {
00130                                 std::list<TaskPointer>::iterator begin = mDefenseTasks.begin();
00131                                 LOGMESSAGE(String_Builder() << "Cancelled Defense.");
00132                                 (*begin)->cancel();
00133                                 mDefenseTasks.erase(begin);
00134                         }
00135                 }
00136         }
00137 }
00138 
00139 void ExpansionManagerClass::updateExpands()
00140 {
00141         bool unstartedTasks = false;
00142 
00143         for(std::list<TaskPointer>::iterator it = mExpandTasks.begin(); it != mExpandTasks.end();)
00144         {
00145                 if((*it)->hasEnded())
00146                         mExpandTasks.erase(it++);
00147                 else
00148                 {
00149                         if(!(*it)->inProgress())
00150                                 unstartedTasks = true;
00151                         ++it;
00152                 }
00153         }
00154 
00155         if(ResourceManager::Instance().isSaturated() && !unstartedTasks)
00156         {
00157                 LOGMESSAGE(String_Builder() << "Expanded because im saturated.");
00158                 mExpandTasks.push_front(TaskManager::Instance().build(BWAPI::Broodwar->self()->getRace().getCenter(), TaskType::Expansion, BuildingLocation::Expansion));
00159         }
00160 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines