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; }
bool TrainTask::waitingForUnit(Unit unit) const { if(!shouldReturnUnit() && mProductionBuilding && mProductionBuilding->getBuildUnit() == unit) return true; return false; }
bool TrainTask::preUpdate() { if(mProducedUnit && mProducedUnit->isCompleted()) { complete(); return true; } if(mProductionBuilding && shouldReturnUnit()) return true; return false; }
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); } }
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; }