BWAPI
BasicAIModule/source/Managers/GasManager.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines