BWAPI
|
#include <ResourceManager.h>
Public Member Functions | |
ResourceManagerClass () | |
void | update () |
void | onDestroy (Unit unit) |
bool | isSaturated () |
bool | requiresRefineries () |
int | getGasLevel () |
Private Attributes | |
std::map< Unit, Base > | mResourceToBase |
std::map< Base, std::map< Unit, GatherTaskPointer > > | mResourceTasks |
std::set< Base > | mMyActiveBases |
TaskPump | mTaskPump |
bool | mSaturated |
int | mGasLevel |
int | mTimeAllowGasChange |
Definition at line 10 of file ResourceManager.h.
Definition at line 9 of file ResourceManager.cpp.
: mTaskPump(BWAPI::Broodwar->self()->getRace().getWorker(), TaskType::Worker) , mSaturated(false) , mGasLevel(0) , mTimeAllowGasChange(0) { }
int ResourceManagerClass::getGasLevel | ( | ) | [inline] |
bool ResourceManagerClass::isSaturated | ( | ) | [inline] |
void ResourceManagerClass::onDestroy | ( | Unit | unit | ) |
Definition at line 157 of file ResourceManager.cpp.
References mResourceTasks, and mResourceToBase.
{ std::map<Unit, Base>::iterator baseIT = mResourceToBase.find(unit); if(baseIT != mResourceToBase.end()) { std::map<Unit, GatherTaskPointer>::iterator resourceIT = mResourceTasks[baseIT->second].find(unit); if(resourceIT != mResourceTasks[baseIT->second].end()) { resourceIT->second->cancel(); mResourceTasks[baseIT->second].erase(unit); mResourceToBase.erase(baseIT); } } }
bool ResourceManagerClass::requiresRefineries | ( | ) | [inline] |
void ResourceManagerClass::update | ( | ) |
Definition at line 17 of file ResourceManager.cpp.
References BWAPI::Broodwar, TaskPump::changeTargetQuantity(), UnitGroup::count(), BWAPI::Game::getFrameCount(), BWAPI::Orders::getOrder(), BWAPI::Races::getRace(), Singleton< T >::Instance(), mGasLevel, mMyActiveBases, mResourceTasks, mResourceToBase, mSaturated, mTaskPump, mTimeAllowGasChange, BWAPI::Game::self(), OrderDef::TrainWorkers, and TaskPump::update().
{ std::set<Base> bases = BaseTracker::Instance().getActiveBases(true); if(mMyActiveBases != bases) { for each(Base base in mMyActiveBases) { std::set<Base>::iterator it = bases.find(base); if(it == bases.end()) { for(std::map<Unit, GatherTaskPointer>::iterator resourceIT = mResourceTasks[base].begin(); resourceIT != mResourceTasks[base].end(); ++resourceIT) resourceIT->second->cancel(); mResourceTasks.erase(base); } } mMyActiveBases = bases; } unsigned int neededWorkers = 0; for each(Base base in mMyActiveBases) { if(!base->getResourceDepot() || !base->getResourceDepot()->exists()) continue; const UnitGroup &minerals = base->getMinerals(); const UnitGroup &refineries = base->getRefineries(); for(std::map<Unit, GatherTaskPointer>::iterator resourceIT = mResourceTasks[base].begin(); resourceIT != mResourceTasks[base].end();) { if(minerals.count(resourceIT->first) == 0 && refineries.count(resourceIT->first) == 0) { resourceIT->second->cancel(); mResourceToBase.erase(resourceIT->first); mResourceTasks[base].erase(resourceIT++); } else ++resourceIT; } for each(Unit mineral in minerals) { neededWorkers += 2; if(mResourceTasks[base].count(mineral) == 0) { GatherTaskPointer gatherTask(new GatherTask(mineral, base)); TaskManager::Instance().addTask(gatherTask); mResourceTasks[base][mineral] = gatherTask; mResourceToBase[mineral] = base; } } for each(Unit refinery in refineries) { if(refinery->getPlayer() == BWAPI::Broodwar->self()) { neededWorkers += 3; if(mResourceTasks[base].count(refinery) == 0 && refinery->exists()) { GatherTaskPointer gatherTask(new GatherTask(refinery, base)); TaskManager::Instance().addTask(gatherTask); mResourceTasks[base][refinery] = gatherTask; mResourceToBase[refinery] = base; } } } } if(!BuildOrderManager::Instance().getOrder(Order::TrainWorkers)) neededWorkers = 0; unsigned int numWorkers = UnitTracker::Instance().selectAllUnits(BWAPI::Broodwar->self()->getRace().getWorker()).size(); mSaturated = numWorkers >= neededWorkers; neededWorkers = std::min(neededWorkers, 50u); neededWorkers -= std::min(numWorkers, neededWorkers); neededWorkers = std::min(neededWorkers, UnitTracker::Instance().selectAllUnits(BWAPI::Broodwar->self()->getRace().getWorker().whatBuilds().first).size() + 1); mTaskPump.changeTargetQuantity(neededWorkers); mTaskPump.update(); double mineralRate = 0; double gasRate = 0; for(std::map<Base, std::map<Unit, GatherTaskPointer>>::iterator it = mResourceTasks.begin(); it != mResourceTasks.end(); ++it) { for(std::map<Unit, GatherTaskPointer>::iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2) { mineralRate += it2->second->getMineralRate(); gasRate += it2->second->getGasRate(); } } ResourceTracker::Instance().setMineralRate(mineralRate); ResourceTracker::Instance().setGasRate(gasRate); int futureMinerals = ResourceTracker::Instance().availableMineralAtTime(BWAPI::Broodwar->getFrameCount() + 450); int futureGas = ResourceTracker::Instance().availableGasAtTime(BWAPI::Broodwar->getFrameCount() + 450); if(mTimeAllowGasChange < BWAPI::Broodwar->getFrameCount()) { int newLevel = 0; if(UnitTracker::Instance().selectAllUnits(BWAPI::Broodwar->self()->getRace().getRefinery()).size() == 0) newLevel = 8; else if(futureMinerals != 0) { float ratio = float(futureGas) / float(futureMinerals); if(ratio > 2.5f) newLevel = 0; else if(ratio > 1.9f) newLevel = 1; else if(ratio > 1.3f) newLevel = 2; else if(ratio > 1.0f) newLevel = 3; else if(ratio > 0.95f) newLevel = 4; else if(ratio > 0.9f) newLevel = 5; else if(ratio > 0.85f) newLevel = 6; else if(ratio > 0.4f) newLevel = 7; else newLevel = 8; } if(mGasLevel != newLevel) { mTimeAllowGasChange = BWAPI::Broodwar->getFrameCount() + 24; if(mGasLevel > newLevel) --mGasLevel; else if(newLevel > mGasLevel) ++mGasLevel; } } }
int ResourceManagerClass::mGasLevel [private] |
Definition at line 31 of file ResourceManager.h.
Referenced by getGasLevel(), requiresRefineries(), and update().
std::set<Base> ResourceManagerClass::mMyActiveBases [private] |
Definition at line 26 of file ResourceManager.h.
Referenced by update().
std::map<Base, std::map<Unit, GatherTaskPointer> > ResourceManagerClass::mResourceTasks [private] |
Definition at line 25 of file ResourceManager.h.
Referenced by onDestroy(), and update().
std::map<Unit, Base> ResourceManagerClass::mResourceToBase [private] |
Definition at line 24 of file ResourceManager.h.
Referenced by onDestroy(), and update().
bool ResourceManagerClass::mSaturated [private] |
Definition at line 30 of file ResourceManager.h.
Referenced by isSaturated(), and update().
TaskPump ResourceManagerClass::mTaskPump [private] |
Definition at line 28 of file ResourceManager.h.
Referenced by update().
int ResourceManagerClass::mTimeAllowGasChange [private] |
Definition at line 32 of file ResourceManager.h.
Referenced by update().