Esempio n. 1
0
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);
		}
	}
}
Esempio n. 2
0
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);
	//}
}
Esempio n. 3
0
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));
    }
}
Esempio n. 4
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());
	}

}