bool ConstructionTask::update()
{
	if(mBuilder)
	{
		if(shouldReturnUnit())
		{
			if(!mBuilder->cancel())
				mBuilder->stop();
		}
		else
		{
			if(!mProducedUnit || !mProducedUnit->exists())
			{
				if(mReservedLocation && mReservedLocation->isCalculated())
					mBuilder->build(mReservedLocation->getTilePosition(), mType);
			}
			else if(mType.getRace() == BWAPI::Races::Terran && (!mBuilder->isConstructing() || !mProducedUnit->isBeingConstructed()))
				mBuilder->build(mProducedUnit);
		}
	}

	if((isStopped() || isCanceled()) && mProducedUnit && mProducedUnit->exists())
	{
		LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Attempting to cancel build");
		mProducedUnit->cancel();
	}

	return hasEnded() && !mBuilder && !mProducedUnit;
}
Beispiel #2
0
bool TrainTask::waitingForUnit(Unit unit) const
{
	if(!shouldReturnUnit() && mProductionBuilding && mProductionBuilding->getBuildUnit() == unit)
		return true;

	return false;
}
Beispiel #3
0
bool TrainTask::preUpdate()
{
	if(mProducedUnit && mProducedUnit->isCompleted())
	{
		complete();
		return true;
	}

	if(mProductionBuilding && shouldReturnUnit())
		return true;

	return false;
}
Beispiel #4
0
void TechTask::updateRequirements()
{
	clearRequirements();

	if(!mUnit && !shouldReturnUnit())
	{
		RequirementGroup requiredConditions;

		assert(mReservedResources == false);
		requiredConditions.addTechForTypeRequirement(mType);
		requiredConditions.addUnitFilterRequirement(40, mType.researchTime(), UnitFilter(mType.whatResearches()) && UnitFilter(UnitFilterFlags::IsComplete));
		requiredConditions.addMineralRequirement(mType.mineralPrice());
		requiredConditions.addGasRequirement(mType.gasPrice());

		addRequirement(requiredConditions);
	}
}
Beispiel #5
0
bool TechTask::update()
{
	if(mUnit)
	{
		if(mUnit->isResearching())
		{
			if(mUnit->getTech() != mType || isStopped() || isPaused() || isCanceled())
				mUnit->cancel();
			else if(mReservedResources)
			{
				ResourceTracker::Instance().releaseCurrentMinerals(mRequiredSatisfyTime, mType.mineralPrice());
				ResourceTracker::Instance().releaseCurrentGas(mRequiredSatisfyTime, mType.gasPrice());
				mReservedResources = false;
			}
		}
		else if(!shouldReturnUnit())
			mUnit->research(mType);
	}

	return hasEnded() && !mUnit;
}
bool ConstructionTask::preUpdate()
{
	if(mProducedUnit)
	{
		if(mProducedUnit->exists())
		{
			freeResources();
			freeLocation();
		}

		if(!isStopped() && !isCanceled() && mProducedUnit->isCompleted())
		{
			complete();
			return true;
		}
	}

	if(mReservedLocation)
	{
		if(hasEnded())
			freeLocation();
		else if(isPaused() || isStopped())
		{
			freeResources();

			mRequiredSatisfyTime = Requirement::maxTime;
			mRequiredDelayTime = Requirement::maxTime;
			mReservedLocation->setStartTime(Requirement::maxTime);
		}
	}

	if(!shouldReturnUnit())
		updateRequirements();

	if(mBuilder && finishedWithBuilder() && (mType.getRace() == BWAPI::Races::Protoss || !mBuilder->isConstructing()))
		return true;

	return false;
}