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