Beispiel #1
0
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;
}
Beispiel #2
0
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);
			}
		}
	}
}
Beispiel #3
0
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;
}
Beispiel #4
0
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());
	}
}
Beispiel #5
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);
	//}
}
Beispiel #6
0
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;
}
Beispiel #8
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));
    }
}
Beispiel #9
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());
	}

}