BWAPI
Skynet/Skynet/SquadManager.cpp
Go to the documentation of this file.
00001 #include "SquadManager.h"
00002 #include "TaskManager.h"
00003 #include "BuildOrderManager.h"
00004 #include "BaseTracker.h"
00005 
00006 #include "DefaultSquad.h"
00007 
00008 SquadManagerClass::SquadManagerClass()
00009 {
00010         mDefaultSquad = createSquad(SquadType::DefaultSquad);
00011 }
00012 
00013 void SquadManagerClass::update()
00014 {
00015         for(std::map<Base, DefenseSquadPointer>::iterator it = mDefenseSquads.begin(); it != mDefenseSquads.end();)
00016         {
00017                 if(it->first->getEnemyThreats().empty() || (it->first->isMinedOut() && it->first->getNumberOfTechBuildings() == 0))
00018                         it->second->cancel();
00019 
00020                 if(it->second->hasEnded())
00021                         mDefenseSquads.erase(it++);
00022                 else
00023                         ++it;
00024         }
00025 
00026         for each(Base base in BaseTracker::Instance().getPlayerBases())
00027         {
00028                 if(!base->getEnemyThreats().empty() && (base->getNumberOfTechBuildings() > 0 || (!base->isMinedOut() && base->getResourceDepot())) && mDefenseSquads.count(base) == 0)
00029                 {
00030                         DefenseSquadPointer squad = std::tr1::static_pointer_cast<DefenseSquadTask>(createSquad(SquadType::DefenseSquad));
00031                         squad->setGoal(Goal(ActionType::Defend, base));
00032                         mDefenseSquads[base] = squad;
00033                 }
00034         }
00035 }
00036 
00037 void SquadManagerClass::onChangeBuild()
00038 {
00039         const std::map<SquadType, int> &squads = BuildOrderManager::Instance().getCurrentBuild().getSquads();
00040         for(std::map<SquadType, int>::const_iterator it = squads.begin(); it != squads.end(); ++it)
00041         {
00042                 if(it->first == SquadType::DefaultSquad || it->first == SquadType::DefenseSquad)
00043                         continue;
00044 
00045                 int numNeeded = it->second - mSquads[it->first].size();
00046                 while(numNeeded != 0)
00047                 {
00048                         if(numNeeded < 0)
00049                         {
00050                                 ++numNeeded;
00051 
00052                                 int smallest = std::numeric_limits<int>::max();
00053                                 BaseSquadTaskPointer smallestSquad;
00054                                 for each(BaseSquadTaskPointer squad in mSquads[it->first])
00055                                 {
00056                                         int size = squad->controlSize();
00057                                         if(size < smallest)
00058                                         {
00059                                                 smallest = size;
00060                                                 smallestSquad = squad;
00061                                         }
00062                                 }
00063 
00064                                 if(smallestSquad)
00065                                 {
00066                                         smallestSquad->cancel();
00067                                         mSquads[it->first].erase(smallestSquad);
00068                                 }
00069                         }
00070                         else
00071                         {
00072                                 --numNeeded;
00073                                 createSquad(it->first);
00074                         }
00075                 }
00076         }
00077 
00078         for(std::map<SquadType, std::set<BaseSquadTaskPointer>>::iterator o = mSquads.begin(); o != mSquads.end();)
00079         {
00080                 if(o->first != SquadType::DefaultSquad && o->first != SquadType::DefenseSquad && squads.find(o->first) == squads.end())
00081                 {
00082                         for each(BaseSquadTaskPointer task in o->second)
00083                         {
00084                                 task->cancel();
00085                         }
00086 
00087                         mSquads.erase(o++);
00088                 }
00089                 else ++o;
00090         }
00091 
00092         mCurrentBehaviour = BuildOrderManager::Instance().getCurrentBuild().getArmyBehaiour();
00093         for(std::map<SquadType, std::set<BaseSquadTaskPointer>>::iterator o = mSquads.begin(); o != mSquads.end(); ++o)
00094         {
00095                 for each(BaseSquadTaskPointer squad in o->second)
00096                 {
00097                         squad->changeBehaviour(mCurrentBehaviour);
00098                 }
00099         }
00100 }
00101 
00102 BaseSquadTaskPointer SquadManagerClass::createSquad(SquadType type)
00103 {
00104         BaseSquadTaskPointer task;
00105 
00106         switch(type.underlying())
00107         {
00108         case SquadType::DefaultSquad:
00109                 task = BaseSquadTaskPointer(new DefaultSquadTask(mCurrentBehaviour));
00110                 break;
00111         case SquadType::DefenseSquad:
00112                 task = BaseSquadTaskPointer(new DefenseSquadTask(mCurrentBehaviour));
00113                 break;
00114         case SquadType::ReaverDropSquad:
00115                 //task = BaseSquadTaskPointer(new ReaverDropSquad());
00116                 break;
00117         case SquadType::DarkTemplerSquad:
00118                 //task = BaseSquadTaskPointer(new DarkTemplerSquad());
00119                 break;
00120         case SquadType::CorsairSquad:
00121                 //task = BaseSquadTaskPointer(new CorsairSquad());
00122                 break;
00123         }
00124 
00125         if(task)
00126         {
00127                 mSquads[type].insert(task);
00128                 TaskManager::Instance().addTask(task);
00129         }
00130 
00131         return task;
00132 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines