BWAPI
|
00001 /* 00002 * GasManager.cpp 00003 * 00004 * This manager sends it's workers to build refineries and gather gas 00005 */ 00006 #include "GasManager.h" 00007 #include "Common.h" 00008 #include "Agent.h" 00009 00010 #include <BWAPI.h> 00011 00012 using namespace BWAPI; 00013 00014 00015 GasManager::GasManager() 00016 : refineryCount(0) 00017 , refineryConstructingCount(0) 00018 , workersConstructing(0) 00019 , newRefineries(0) 00020 { } 00021 00022 void GasManager::update() 00023 { 00024 // TODO: the refineries could be persistently stores by the GasMgr 00025 // so we can see who is gathering from where, and whether its exhausted 00026 // TODO: worry about gas steal? 00027 AgentSet refineries(getAgentsOfType(UnitTypes::Terran_Refinery)); 00028 00029 // Get a count on new refineries 00030 newRefineries = static_cast<int>(refineries.size()) - refineryCount; 00031 refineryCount = static_cast<int>(refineries.size()); 00032 00033 // Keep the workers constructing count up to date 00034 // TODO: remove this? is this responsibility being delegated to the BuildMgr? 00035 //* 00036 if( newRefineries > 0 ) 00037 { 00038 // refineryConstructingCount -= newRefineries; 00039 workersConstructing -= newRefineries; 00040 } 00041 //*/ 00042 00043 AgentSet workers(getAgentsOfType(UnitTypes::Terran_SCV)); 00044 00045 // Set a worker to build a refinery if we need to (for now just grab the first one) 00046 // TODO: remove this? is this responsibility being delegated to the BuildMgr? 00047 //* 00048 if( refineries.empty() && !workers.empty() && workersConstructing == 0 ) 00049 { 00050 //Broodwar->sendText("Gas manager, search for agent out of %d\n", (int)workers.size()); 00051 Agent* worker = *(workers.begin()); 00052 worker->setState(BuildState); 00053 worker->setUnitTypeTarget(UnitTypes::Terran_Refinery); 00054 // TODO - worker->setPositionTarget() to where? 00055 // how does this worker know where to build? 00056 ++workersConstructing; 00057 } 00058 //*/ 00059 00060 // Get our workers gathering from our refineries 00061 for(AgentSetIter worker = workers.begin(); worker != workers.end(); ++worker) 00062 { 00063 Unit& unit = (*worker)->getUnit(); 00064 if( !unit.isGatheringGas() && !unit.isConstructing() ) 00065 { 00066 for(AgentSetIter refinery = refineries.begin(); refinery != refineries.end(); refinery++) 00067 { 00068 Unit& refineryUnit = (*refinery)->getUnit(); 00069 (*worker)->setState(GatherState); 00070 (*worker)->setUnitTarget(&refineryUnit); 00071 (*worker)->setUnitTypeTarget(UnitTypes::Terran_Refinery); 00072 (*worker)->setPositionTarget(refineryUnit.getPosition()); 00073 } 00074 } 00075 } 00076 00077 // Update all agents, very important! 00078 Manager::update(); 00079 } 00080 00081 int GasManager::getGasRate() const 00082 { 00083 // TODO 00084 return 0; 00085 } 00086 00087 int GasManager::getNumWorkersGathering() const 00088 { 00089 int count = 0; 00090 AgentSetConstIter it = agents.begin(); 00091 AgentSetConstIter end = agents.end(); 00092 for(; it != end;) 00093 { 00094 Agent *agent = *it; 00095 if( agent->getUnit().isGatheringGas() ) 00096 { 00097 ++count; 00098 } 00099 } 00100 return count; 00101 } 00102 00103 void GasManager::draw() 00104 { 00105 Broodwar->drawTextScreen(2, 30, "\x10 GM : (SCV=%d)", numAgents(UnitTypes::Terran_SCV)); 00106 Manager::draw(); 00107 }