void Slave::work(int &argc, char** &argv) { int64_t size = 0; int tag = 0; while(doWork) { waitForOrder(order); doWork = order.doWork; size = 0; if(true == order.doWork) { // printf("Received order %d: %d, %d, %d, %d, %d, %d, %lf, %lf, %lf\n", // order.orderID, // order.pictureWidth, // order.pictureHeight, // order.beginX, // order.beginY, // order.count, // order.doWork, // order.dotSize, // order.fractalX, // order.fractalY); size = executeOrder(order, resultArray); // if(rank > 2) // cout << "\n\nPoliczone!\n\n"; if(size > 0) { // for(auto i : resultArray) // cout<< i <<" "; int64_t id = order.orderID; // cout << "Wysyłanie...\n\n"; sendResult(id, resultArray, size); } else { // printf("Slave %d: Received size <= 0, stopping work.\n", rank); // printf("Received order %d: %d, %d, %d, %d, %d, %d\n", // rank, // order.pictureWidth, // order.pictureHeight, // order.beginX, // order.beginY, // order.count, // order.doWork); doWork = false; } } else { // printf("Slave %d: Received DIETAG, stopping work.\n", rank); } } }
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); //} }
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()); } }