bool Commander::checkWorkersAttack(BaseAgent *base) { int noAttack = 0; for(set<Unit*>::const_iterator i=Broodwar->enemy()->getUnits().begin();i!=Broodwar->enemy()->getUnits().end();i++) { if ((*i)->exists() && (*i)->getType().isWorker()) { double dist = (*i)->getTilePosition().getDistance(base->getUnit()->getTilePosition()); if (dist <= 12) { //Enemy unit discovered. Attack with some workers. vector<BaseAgent*> agents = AgentManager::getInstance()->getAgents(); for (int j = 0; j < (int)agents.size(); j++) { BaseAgent* agent = agents.at(j); if (agent->isAlive() && agent->isWorker() && noAttack < 1) { WorkerAgent* wAgent = (WorkerAgent*) agent; wAgent->setState(WorkerAgent::ATTACKING); agent->getUnit()->attack((*i)); noAttack++; } } } } } if (noAttack > 0) { return true; } return false; }
void RefineryAgent::computeActions() { for (int i = 0; i < (int)assignedWorkers.size(); i++) { if (!assignedWorkers.at(i)->isAlive()) { assignedWorkers.erase(assignedWorkers.begin() + i); return; } if (!assignedWorkers.at(i)->getUnit()->isGatheringGas()) { assignedWorkers.erase(assignedWorkers.begin() + i); return; } } if ((int)assignedWorkers.size() < Commander::getInstance()->getWorkersPerRefinery()) { if (!unit->isBeingConstructed() && unit->getPlayer()->getID() == Broodwar->self()->getID()) { WorkerAgent* worker = (WorkerAgent*)AgentManager::getInstance()->findClosestFreeWorker(unit->getTilePosition()); if (worker != NULL) { worker->getUnit()->rightClick(unit); worker->setState(WorkerAgent::GATHER_GAS); assignedWorkers.push_back(worker); } } } }
bool Commander::checkWorkersAttack(BaseAgent *base) { int noAttack = 0; for (auto &u : Broodwar->enemy()->getUnits()) { if (u->exists() && u->getType().isWorker()) { double dist = u->getTilePosition().getDistance(base->getUnit()->getTilePosition()); if (dist <= 12) { //Enemy unit discovered. Attack with some workers. Agentset agents = AgentManager::getInstance()->getAgents(); for (auto &a : agents) { if (a->isAlive() && a->isWorker() && noAttack < 1) { WorkerAgent* wAgent = (WorkerAgent*)a; wAgent->setState(WorkerAgent::ATTACKING); a->getUnit()->attack(u); noAttack++; } } } } } if (noAttack > 0) { return true; } return false; }
void Commander::finishBuild(BaseAgent* baseAgent) { //First we must check if someone is repairing this building if(AgentManager::getInstance()->isAnyAgentRepairingThisAgent(baseAgent)) return; BaseAgent* repUnit = AgentManager::getInstance()->findClosestFreeWorker(baseAgent->getUnit()->getTilePosition()); if (repUnit != NULL) { WorkerAgent* w = (WorkerAgent*)repUnit; w->assignToRepair(baseAgent->getUnit()); } }
void ZergBuildPlanner::computeActions() { buildOverlordIfNeeded(); buildHatcheryIfNeeded(); //NOTE: No need to change this unless some special logic //shall be added. if (AgentManager::getInstance()->getNoWorkers() == 0) { //No workers so cant do anything return; } if (locked) { if (Broodwar->getFrameCount() - lockedFrame > getLockedTimer(buildOrder.at(0))) { //Locked timeout. Reset it. locked = false; Broodwar->printf("[BuildPlanner] Locked timeout. Resetting."); //Reset the worker to do it AgentManager* agentManager = AgentManager::getInstance(); for (int i = 0; i < (int)agentManager->size(); i++) { BaseAgent* agent = agentManager->at(i); if (agent->isAlive() && agent->isWorker()) { WorkerAgent* worker = (WorkerAgent*)agent; if (worker->isConstructing(buildOrder.at(0))) { //Reset the worker worker->reset(); } } AgentManager::release(agent); } } else { return; } } //Try to execute first in the list if ((int)buildOrder.size() > 0) { if (executeOrder(buildOrder.at(0))) { locked = true; lockedFrame = Broodwar->getFrameCount(); } } //if (mineralsRunningLow()) { //buildOrder.insert(buildOrder.begin(), UnitTypes::Zerg_Hatchery); //} }
int AgentManager::noMiningWorkers() { int cnt = 0; for (auto &a : agents) { if (a->isAlive() && a->isWorker()) { WorkerAgent* w = (WorkerAgent*)a; if (w->getState() == WorkerAgent::GATHER_MINERALS) { cnt++; } } } return cnt; }
int AgentManager::noMiningWorkers() { int cnt = 0; for (int i = 0; i < (int)agents.size(); i++) { BaseAgent* agent = agents.at(i); if (agent->isWorker() && agent->isAlive()) { WorkerAgent* w = (WorkerAgent*)agent; if (w->getState() == WorkerAgent::GATHER_MINERALS) { cnt++; } } } return cnt; }
void Constructor::computeActions() { //Check if we need more supply buildings if (isTerran() || isProtoss()) { if (shallBuildSupply()) { buildPlan.insert(buildPlan.begin(), Broodwar->self()->getRace().getSupplyProvider()); } } //Check if we need to expand if (!hasResourcesLeft()) { expand(Broodwar->self()->getRace().getCenter()); } if (buildPlan.size() == 0 && buildQueue.size() == 0) { //Nothing to do return; } //Dont call too often int cFrame = Broodwar->getFrameCount(); if (cFrame - lastCallFrame < 10) { return; } lastCallFrame = cFrame; if (AgentManager::getInstance()->getNoWorkers() == 0) { //No workers so cant do anything return; } //Check if we have possible "locked" items in the buildqueue for (int i = 0; i < (int)buildQueue.size(); i++) { int elapsed = cFrame - buildQueue.at(i).assignedFrame; if (elapsed >= 2000) { //Reset the build request WorkerAgent* worker = (WorkerAgent*)AgentManager::getInstance()->getAgent(buildQueue.at(i).assignedWorkerId); if (worker != NULL) { worker->reset(); } buildPlan.insert(buildPlan.begin(), buildQueue.at(i).toBuild); ResourceManager::getInstance()->unlockResources(buildQueue.at(i).toBuild); buildQueue.erase(buildQueue.begin() + i); return; } } //Check if we can build next building in the buildplan if ((int)buildPlan.size() > 0) { executeOrder(buildPlan.at(0)); } }
void BuildPlanner::computeActions() { //Dont call too often int cFrame = Broodwar->getFrameCount(); if (cFrame - lastCallFrame < 40) { return; } lastCallFrame = cFrame; if (AgentManager::getInstance()->getNoWorkers() == 0) { //No workers so cant do anything return; } //Check if we have possible "locked" items in the buildqueue for (int i = 0; i < (int)buildQueue.size(); i++) { int elapsed = cFrame - buildQueue.at(i).assignedFrame; if (elapsed >= 2000) { Broodwar->printf("Failed to build %s in time, resetting order", buildQueue.at(i).toBuild.getName().c_str()); //Reset the build request WorkerAgent* worker = (WorkerAgent*)AgentManager::getInstance()->getAgent(buildQueue.at(i).assignedWorkerId); if (worker != NULL) { worker->reset(); } addBuildingFirst(buildQueue.at(i).toBuild); ResourceManager::getInstance()->unlockResources(buildQueue.at(i).toBuild); buildQueue.erase(buildQueue.begin() + i); return; } } //Check if we need more supply buildings if (isTerran() || isProtoss()) { if (shallBuildSupply()) { addBuildingFirst(Broodwar->self()->getRace().getSupplyProvider()); } } //Check if we can build next building in the buildorder if ((int)buildOrder.size() > 0) { BuildPlan plan = buildOrder.at(0); if (plan.frameDelay <= Broodwar->getFrameCount()) { executeOrder(plan.type); } } if (!hasResourcesLeft() || ResourceManager::getInstance()->hasResources(2000, 0, false)) { expand(Broodwar->self()->getRace().getCenter()); } }