BWAPI
|
#include <BuildManager.h>
Public Member Functions | |
void | update () |
void | draw () |
void | build (BWAPI::UnitType type, bool immediate=false) |
void | build (BWAPI::UnitType type, BWAPI::TilePosition goalPosition, bool immediate=false) |
virtual const std::string & | getName () const |
Private Member Functions | |
void | drawDebugText () |
Private Attributes | |
queue< BuildReq > | buildQueue |
stack< BuildReq > | buildStack |
Definition at line 31 of file BuildManager.h.
void BuildManager::build | ( | BWAPI::UnitType | type, |
bool | immediate = false |
||
) |
void BuildManager::build | ( | BWAPI::UnitType | type, |
BWAPI::TilePosition | goalPosition, | ||
bool | immediate = false |
||
) |
void BuildManager::draw | ( | ) | [virtual] |
Reimplemented from Manager.
Definition at line 258 of file BuildManager.cpp.
References BWAPI::Broodwar, and Manager::draw().
{ Broodwar->drawTextScreen(2, 40, "\x07 BM : (SCV=%d) (CC=%d)", numAgents(UnitTypes::Terran_SCV), numAgents(UnitTypes::Terran_Command_Center)); drawDebugText(); Manager::draw(); }
void BuildManager::drawDebugText | ( | ) | [private] |
Definition at line 214 of file BuildManager.cpp.
References BWAPI::Broodwar, BuildReq::type, and UnitTypeStrings.
{ const int starty = 60; int x = 2; int y = starty; Broodwar->drawTextScreen(x, y, "BuildMgr - queue (%d)", (int)buildQueue.size()); deque<BuildReq> tempq; while(!buildQueue.empty()) { BuildReq req = buildQueue.front(); buildQueue.pop(); Broodwar->drawTextScreen(x, y += 10, "-%s", UnitTypeStrings[req.type.getID()]); tempq.push_back(req); } while(!tempq.empty()) { BuildReq req = tempq.front(); tempq.pop_front(); buildQueue.push(req); } tempq.clear(); x = 150; y = starty; Broodwar->drawTextScreen(x, y, "BuildMgr - stack (%d)", (int)buildStack.size()); while(!buildStack.empty()) { BuildReq req = buildStack.top(); buildStack.pop(); Broodwar->drawTextScreen(x, y += 10, "-%s", UnitTypeStrings[req.type.getID()]); tempq.push_front(req); } while(!tempq.empty()) { BuildReq req = tempq.front(); tempq.pop_front(); buildStack.push(req); } }
virtual const std::string& BuildManager::getName | ( | ) | const [inline, virtual] |
Reimplemented from Manager.
Definition at line 46 of file BuildManager.h.
{ static const std::string name("BuildMgr"); return name; }
void BuildManager::update | ( | ) | [virtual] |
Reimplemented from Manager.
Definition at line 25 of file BuildManager.cpp.
References BWAPI::Broodwar, BuildReq::builder, BuildState, COMPLETE, Agent::getState(), IdleState, ISSUED, ResourceManager::makeAgentGatherMinerals(), NEW, STARTED, BuildReq::state, TrainState, BuildReq::type, and Manager::update().
{ // Update Agents Manager::update(); // Done with the current request? if (buildStack.empty()) { // Try to start a new request if (!buildQueue.empty()) { buildStack.push(buildQueue.front()); buildQueue.pop(); } } // Process requests if there are any if (buildStack.empty()) return; BuildReq &req = buildStack.top(); UnitType type = req.type; switch (req.state) { case NEW: { //Broodwar->sendText("Trying to build: %s", type.c_str()); // Check reqs int mineralsNeeded = type.mineralPrice(); int gasNeeded = type.gasPrice(); int mineralsOwned = Broodwar->self()->minerals(); int gasOwned = Broodwar->self()->gas(); // Required supply? int supplyOwned = Broodwar->self()->supplyTotal() - Broodwar->self()->supplyUsed(); if (supplyOwned < type.supplyRequired()) { break; } // Required units? map<UnitType, int> requiredUnits = type.requiredUnits(); for (map<UnitType, int>::iterator i = requiredUnits.begin(); i != requiredUnits.end(); i++) { UnitType rt = (*i).first; int rc = (*i).second; if (Broodwar->self()->visibleUnitCount(rt) < rc) { build(rt, true); Broodwar->sendText("%s pushed: prereq to build %s", rt.c_str(), type.c_str()); break; } } // Required builder? UnitType builderType = type.whatBuilds().first; if (Broodwar->self()->visibleUnitCount(builderType) < 1) { build(builderType, true); // TODO: I've had several crashes here... // they seem to stem from the calls to c_str(), they must be returning a bad pointer... // commenting it out has stopped the crashes here for me so far. // Broodwar->sendText("%s pushed: Need a %s to build %s", builderType.c_str(), type.c_str()); break; } // Required resources? if (mineralsOwned < mineralsNeeded || gasOwned < gasNeeded) { break; } // OK - requirements met, let's build it! // Find an idle builder for (AgentSetIter i = agents.begin(); i != agents.end(); i++) { if ((*i)->getUnit().getType().getID() == builderType.getID() && (*i)->getState() != BuildState && (*i)->getState() != TrainState) { // Found one, build it (this works for addons too) if (type.isBuilding()) (*i)->setState(BuildState); else (*i)->setState(TrainState); (*i)->setUnitTypeTarget(type); // Remember we issued the command req.builder = &(*i)->getUnit(); req.state = ISSUED; Broodwar->sendText("BM: Worker found, building %s", type.c_str()); break; } } // Wait if we didn't find a builder if (req.builder == NULL) { break; } } break; case ISSUED: { /* We need to determine if the order has been started (i.e. resources spent) */ Unit* builder = req.builder; if (builder->getType().isBuilding()) { if (builder->isTraining()) { req.state = STARTED; } } else if (builder->getType().isWorker()) { /* * We can't check if a builder is *really* building using ->isConstructing(), * but we can see if a structure is being built by our builder */ UnitSet ownedUnits = Broodwar->self()->getUnits(); for (UnitSetConstIter i = ownedUnits.begin(); i != ownedUnits.end(); i++) { if ((*i)->getBuildUnit() == builder && (*i)->isVisible()) { req.state = STARTED; } } } break; } case STARTED: /* * TODO: Monitor the orders we have started, and verify them to completion. * In the case of a killed SCV doing a build, we may want to restart the * order. */ buildStack.pop(); break; case COMPLETE: break; } // Keep our workers busy when they aren't building AgentSet workers(getAgentsOfType(UnitTypes::Terran_SCV)); for(AgentSetIter worker = workers.begin(); worker != workers.end(); ++worker) { Agent& agent = **worker; if( agent.getState() == IdleState ) { ResourceManager::makeAgentGatherMinerals(agent); } } }
queue<BuildReq> BuildManager::buildQueue [private] |
Definition at line 34 of file BuildManager.h.
stack<BuildReq> BuildManager::buildStack [private] |
Definition at line 35 of file BuildManager.h.