BWAPI
|
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 }