BWAPI
|
#include <ConstructionTask.h>
Public Member Functions | |
ConstructionTask (TaskType priority, BuildingLocation position, BWAPI::UnitType type) | |
virtual int | getEndTime () const |
virtual int | getEndTime (Unit unit) const |
virtual int | getPriority (Unit unit) const |
virtual Position | getStartLocation (Unit unit) const |
virtual Position | getEndLocation (Unit unit) const |
virtual bool | preUpdate () |
virtual bool | update () |
virtual void | updateRequirements () |
virtual bool | waitingForUnit (Unit unit) const |
virtual void | giveUnit (Unit unit) |
virtual void | returnUnit (Unit unit) |
virtual bool | morph (Unit unit, BWAPI::UnitType previousType) |
virtual UnitGroup | getFinishedUnits () |
virtual std::string | getTaskName () const |
virtual std::string | getOutputName () const |
virtual void | setRequiredSatisfyTime (RequirementGroup requirements, int time, int delay) |
virtual int | dispatchTime () const |
virtual int | startTime () const |
virtual bool | hasDispatched () const |
virtual bool | inProgress () const |
Private Member Functions | |
bool | finishedWithBuilder () |
void | reserveResources () |
void | freeResources () |
void | reserveLocation () |
void | freeLocation () |
Private Attributes | |
BWAPI::UnitType | mType |
Unit | mBuilder |
Unit | mProducedUnit |
BuildingLocation | mBuildingLocation |
ReservedLocation | mReservedLocation |
int | mRequiredSatisfyTime |
int | mRequiredDelayTime |
bool | mReservedResources |
Definition at line 8 of file ConstructionTask.h.
ConstructionTask::ConstructionTask | ( | TaskType | priority, |
BuildingLocation | position, | ||
BWAPI::UnitType | type | ||
) |
Definition at line 7 of file ConstructionTask.cpp.
: Task(priority) , mType(type) , mBuildingLocation(position) , mReservedResources(false) , mRequiredSatisfyTime(BWAPI::Broodwar->getFrameCount()) , mRequiredDelayTime(BWAPI::Broodwar->getFrameCount()) { }
virtual int ConstructionTask::dispatchTime | ( | ) | const [inline, virtual] |
Reimplemented from Task.
Definition at line 37 of file ConstructionTask.h.
References mRequiredDelayTime, and mRequiredSatisfyTime.
{ return mRequiredSatisfyTime - mRequiredDelayTime; }
bool ConstructionTask::finishedWithBuilder | ( | ) | [inline, private] |
Definition at line 57 of file ConstructionTask.h.
References BWAPI::UnitType::getRace(), inProgress(), mType, BWAPI::Races::Protoss, and Task::shouldReturnUnit().
Referenced by getFinishedUnits(), preUpdate(), and updateRequirements().
{ return shouldReturnUnit() || (inProgress() && mType.getRace() == BWAPI::Races::Protoss); }
void ConstructionTask::freeLocation | ( | ) | [private] |
Definition at line 294 of file ConstructionTask.cpp.
References BWAPI::UnitType::getName(), LOGMESSAGE, mReservedLocation, and mType.
Referenced by giveUnit(), morph(), and preUpdate().
{ if(mReservedLocation) { LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Freeing Location"); mReservedLocation->forceCompleted(); mReservedLocation.reset(); } }
void ConstructionTask::freeResources | ( | ) | [private] |
Definition at line 271 of file ConstructionTask.cpp.
References BWAPI::UnitType::gasPrice(), BWAPI::UnitType::getName(), Singleton< T >::Instance(), LOGMESSAGE, BWAPI::UnitType::mineralPrice(), mRequiredSatisfyTime, mReservedResources, mType, and BWAPI::UnitType::supplyRequired().
Referenced by giveUnit(), morph(), preUpdate(), and returnUnit().
{ if(mReservedResources) { LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Freeing Resources"); ResourceTracker::Instance().releaseCurrentMinerals(mRequiredSatisfyTime, mType.mineralPrice()); ResourceTracker::Instance().releaseCurrentGas(mRequiredSatisfyTime, mType.gasPrice()); ResourceTracker::Instance().releaseCurrentSupply(mRequiredSatisfyTime, mType.supplyRequired()); mReservedResources = false; } }
Position ConstructionTask::getEndLocation | ( | Unit | unit | ) | const [virtual] |
Implements Task.
Definition at line 55 of file ConstructionTask.cpp.
References mReservedLocation.
{ if(mReservedLocation) return mReservedLocation->getPosition(); return unit->getPosition(); }
int ConstructionTask::getEndTime | ( | ) | const [virtual] |
Implements Task.
Definition at line 17 of file ConstructionTask.cpp.
References BWAPI::Broodwar, BWAPI::UnitType::buildTime(), BWAPI::Game::getFrameCount(), Requirement::maxTime, mBuilder, mProducedUnit, mRequiredSatisfyTime, and mType.
Referenced by getEndTime().
{ if(mProducedUnit) return mProducedUnit->getCompletedTime(); if(mBuilder) return BWAPI::Broodwar->getFrameCount() + mType.buildTime(); if(mRequiredSatisfyTime == Requirement::maxTime) return mRequiredSatisfyTime; return std::max(mRequiredSatisfyTime, BWAPI::Broodwar->getFrameCount()) + mType.buildTime(); }
int ConstructionTask::getEndTime | ( | Unit | unit | ) | const [virtual] |
Implements Task.
Definition at line 31 of file ConstructionTask.cpp.
References BWAPI::Broodwar, getEndTime(), BWAPI::Game::getLatencyFrames(), BWAPI::UnitType::getRace(), Requirement::maxTime, mRequiredSatisfyTime, mType, BWAPI::Races::Protoss, and BWAPI::Races::Terran.
{ if(unit->getType() == mType || mType.getRace() == BWAPI::Races::Terran) return getEndTime(); if(mType.getRace() == BWAPI::Races::Protoss) { if(mRequiredSatisfyTime == Requirement::maxTime) return mRequiredSatisfyTime; return std::max(BWAPI::Broodwar->getFrameCount(), mRequiredSatisfyTime) + BWAPI::Broodwar->getLatencyFrames(); } return Requirement::maxTime; }
UnitGroup ConstructionTask::getFinishedUnits | ( | ) | [virtual] |
Implements Task.
Definition at line 207 of file ConstructionTask.cpp.
References finishedWithBuilder(), UnitGroup::insert(), Task::isCompleted(), mBuilder, and mProducedUnit.
{ UnitGroup returnUnits; if(mBuilder && finishedWithBuilder()) returnUnits.insert(mBuilder); if(mProducedUnit && mProducedUnit->exists() && isCompleted()) returnUnits.insert(mProducedUnit); return returnUnits; }
virtual std::string ConstructionTask::getOutputName | ( | ) | const [inline, virtual] |
Implements Task.
Definition at line 33 of file ConstructionTask.h.
References BWAPI::UnitType::getName(), and mType.
int ConstructionTask::getPriority | ( | Unit | unit | ) | const [virtual] |
Implements Task.
Definition at line 220 of file ConstructionTask.cpp.
References mProducedUnit, and mReservedLocation.
{ if(unit == mProducedUnit || (mReservedLocation && unit == mReservedLocation->getUnitPrediction())) return 100; return 40; }
Position ConstructionTask::getStartLocation | ( | Unit | unit | ) | const [virtual] |
Implements Task.
Definition at line 47 of file ConstructionTask.cpp.
References mReservedLocation.
{ if(mReservedLocation) return mReservedLocation->getPosition(); return unit->getPosition(); }
virtual std::string ConstructionTask::getTaskName | ( | ) | const [inline, virtual] |
void ConstructionTask::giveUnit | ( | Unit | unit | ) | [virtual] |
Implements Task.
Definition at line 147 of file ConstructionTask.cpp.
References freeLocation(), freeResources(), BWAPI::UnitType::getName(), LOGMESSAGE, mBuilder, mProducedUnit, mReservedLocation, mType, reserveResources(), and BWAPI::UnitType::whatBuilds().
{ if(unit->getType() == mType.whatBuilds().first) { LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Given Builder"); assert(!mBuilder); mBuilder = unit; reserveResources(); } else if(unit == mReservedLocation->getUnitPrediction() || unit->getTilePosition() == mReservedLocation->getTilePosition()) { LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Given Produced Unit"); assert(!mProducedUnit || !mProducedUnit->exists()); mProducedUnit = unit; if(mProducedUnit->exists()) { freeResources(); freeLocation(); } } else assert(false); }
virtual bool ConstructionTask::hasDispatched | ( | ) | const [inline, virtual] |
Reimplemented from Task.
Definition at line 40 of file ConstructionTask.h.
References inProgress(), and mBuilder.
{ return inProgress() || mBuilder; }
virtual bool ConstructionTask::inProgress | ( | ) | const [inline, virtual] |
Reimplemented from Task.
Definition at line 41 of file ConstructionTask.h.
References mProducedUnit.
Referenced by finishedWithBuilder(), hasDispatched(), reserveLocation(), and reserveResources().
{ return mProducedUnit && mProducedUnit->exists(); }
bool ConstructionTask::morph | ( | Unit | unit, |
BWAPI::UnitType | previousType | ||
) | [virtual] |
Implements Task.
Definition at line 191 of file ConstructionTask.cpp.
References freeLocation(), freeResources(), mBuilder, mProducedUnit, mType, and StaticUnits::nullunit.
{ if(unit == mBuilder && unit->getType() == mType) { freeLocation(); freeResources(); mProducedUnit = unit; mBuilder = StaticUnits::nullunit; return false; } return true; }
bool ConstructionTask::preUpdate | ( | ) | [virtual] |
Implements Task.
Definition at line 63 of file ConstructionTask.cpp.
References Task::complete(), finishedWithBuilder(), freeLocation(), freeResources(), BWAPI::UnitType::getRace(), Task::hasEnded(), Task::isCanceled(), Task::isPaused(), Task::isStopped(), Requirement::maxTime, mBuilder, mProducedUnit, mRequiredDelayTime, mRequiredSatisfyTime, mReservedLocation, mType, BWAPI::Races::Protoss, Task::shouldReturnUnit(), and updateRequirements().
{ 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; }
void ConstructionTask::reserveLocation | ( | ) | [private] |
Definition at line 284 of file ConstructionTask.cpp.
References BWAPI::UnitType::getName(), Task::hasEnded(), inProgress(), Singleton< T >::Instance(), LOGMESSAGE, mBuildingLocation, mReservedLocation, and mType.
Referenced by updateRequirements().
{ if(!mReservedLocation && !inProgress() && !hasEnded()) { LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Reserving Location"); mReservedLocation = BuildingPlacer::Instance().getBuildingReservation(mBuildingLocation, mType); assert(!mReservedLocation->update()); } }
void ConstructionTask::reserveResources | ( | ) | [private] |
Definition at line 258 of file ConstructionTask.cpp.
References BWAPI::UnitType::gasPrice(), BWAPI::UnitType::getName(), Task::hasEnded(), inProgress(), Singleton< T >::Instance(), LOGMESSAGE, BWAPI::UnitType::mineralPrice(), mRequiredSatisfyTime, mReservedResources, mType, and BWAPI::UnitType::supplyRequired().
Referenced by giveUnit().
{ if(!mReservedResources && !inProgress() && !hasEnded()) { LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Reserving Resources"); ResourceTracker::Instance().reserveCurrentMinerals(mRequiredSatisfyTime, mType.mineralPrice()); ResourceTracker::Instance().reserveCurrentGas(mRequiredSatisfyTime, mType.gasPrice()); ResourceTracker::Instance().reserveCurrentSupply(mRequiredSatisfyTime, mType.supplyRequired()); mReservedResources = true; } }
void ConstructionTask::returnUnit | ( | Unit | unit | ) | [virtual] |
Implements Task.
Definition at line 173 of file ConstructionTask.cpp.
References freeResources(), BWAPI::UnitType::getName(), LOGMESSAGE, mBuilder, mProducedUnit, mType, and StaticUnits::nullunit.
{ if(unit == mBuilder) { LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Returning Builder"); freeResources(); mBuilder = StaticUnits::nullunit; } else if(unit == mProducedUnit) { LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Returning Produced Unit"); freeResources(); mProducedUnit = StaticUnits::nullunit; } else assert(!unit->exists());//If it doesn't exist it was a prediction that has been replaced }
void ConstructionTask::setRequiredSatisfyTime | ( | RequirementGroup | requirements, |
int | time, | ||
int | delay | ||
) | [virtual] |
Reimplemented from Task.
Definition at line 304 of file ConstructionTask.cpp.
References BWAPI::UnitType::getName(), LOGMESSAGE, mRequiredDelayTime, mRequiredSatisfyTime, mReservedLocation, mReservedResources, and mType.
{ if(!mReservedResources) { mRequiredSatisfyTime = time; mRequiredDelayTime = delay; } else LOGMESSAGE(String_Builder() << "ConstructionTask : " << mType.getName() << " : Required Satisfy Time changed while resources are reserved"); if(mReservedLocation) mReservedLocation->setStartTime(time); }
virtual int ConstructionTask::startTime | ( | ) | const [inline, virtual] |
Reimplemented from Task.
Definition at line 38 of file ConstructionTask.h.
References mRequiredSatisfyTime.
{ return mRequiredSatisfyTime; }
bool ConstructionTask::update | ( | ) | [virtual] |
Implements Task.
Definition at line 103 of file ConstructionTask.cpp.
References BWAPI::UnitType::getName(), BWAPI::UnitType::getRace(), Task::hasEnded(), Task::isCanceled(), Task::isStopped(), LOGMESSAGE, mBuilder, mProducedUnit, mReservedLocation, mType, Task::shouldReturnUnit(), and BWAPI::Races::Terran.
{ 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; }
void ConstructionTask::updateRequirements | ( | ) | [virtual] |
Reimplemented from Task.
Definition at line 228 of file ConstructionTask.cpp.
References RequirementGroup::addGasRequirement(), RequirementGroup::addMineralRequirement(), Task::addRequirement(), RequirementGroup::addSupplyRequirement(), RequirementGroup::addTechForTypeRequirement(), RequirementGroup::addUnitFilterRequirement(), BWAPI::Broodwar, BWAPI::UnitType::buildTime(), Task::clearRequirements(), finishedWithBuilder(), BWAPI::UnitType::gasPrice(), BWAPI::Game::getLatencyFrames(), BWAPI::UnitType::getRace(), Task::hasEnded(), UnitFilterFlags::IsComplete, Requirement::maxTime, mBuilder, BWAPI::UnitType::mineralPrice(), mProducedUnit, mReservedLocation, mReservedResources, mType, BWAPI::Races::Protoss, reserveLocation(), BWAPI::UnitType::supplyRequired(), BWAPI::UnitType::whatBuilds(), and BWAPI::Races::Zerg.
Referenced by preUpdate().
{ clearRequirements(); if(!hasEnded()) { reserveLocation(); if(!finishedWithBuilder() && !mBuilder && (mProducedUnit || (mReservedLocation && mReservedLocation->isCalculated()))) { Position location = mProducedUnit ? mProducedUnit->getPosition() : mReservedLocation->getPosition(); int neededDuration = mType.getRace() == BWAPI::Races::Protoss ? BWAPI::Broodwar->getLatencyFrames() : mType.getRace() == BWAPI::Races::Zerg ? Requirement::maxTime : mType.buildTime(); RequirementGroup requiredConditions; requiredConditions.addUnitFilterRequirement(40, neededDuration, UnitFilter(mType.whatBuilds().first) && UnitFilter(UnitFilterFlags::IsComplete), location); if(!mReservedResources && (!mProducedUnit || !mProducedUnit->exists())) { requiredConditions.addTechForTypeRequirement(mType); if(mType.mineralPrice() > 0) requiredConditions.addMineralRequirement(mType.mineralPrice()); if(mType.gasPrice() > 0) requiredConditions.addGasRequirement(mType.gasPrice()); if(mType.supplyRequired() > 0) requiredConditions.addSupplyRequirement(mType.supplyRequired()); } addRequirement(requiredConditions); } } }
bool ConstructionTask::waitingForUnit | ( | Unit | unit | ) | const [virtual] |
Implements Task.
Definition at line 133 of file ConstructionTask.cpp.
References BWAPI::UnitType::isRefinery(), mReservedLocation, and mType.
{ if(mReservedLocation && mReservedLocation->isCalculated()) { if(mReservedLocation->getUnitPrediction() == unit) return true; if(mType.isRefinery() && unit->getTilePosition() == mReservedLocation->getTilePosition()) return true; } return false; }
Unit ConstructionTask::mBuilder [private] |
Definition at line 46 of file ConstructionTask.h.
Referenced by getEndTime(), getFinishedUnits(), giveUnit(), hasDispatched(), morph(), preUpdate(), returnUnit(), update(), and updateRequirements().
Definition at line 49 of file ConstructionTask.h.
Referenced by reserveLocation().
Unit ConstructionTask::mProducedUnit [private] |
Definition at line 47 of file ConstructionTask.h.
Referenced by getEndTime(), getFinishedUnits(), getPriority(), giveUnit(), inProgress(), morph(), preUpdate(), returnUnit(), update(), and updateRequirements().
int ConstructionTask::mRequiredDelayTime [private] |
Definition at line 53 of file ConstructionTask.h.
Referenced by dispatchTime(), preUpdate(), and setRequiredSatisfyTime().
int ConstructionTask::mRequiredSatisfyTime [private] |
Definition at line 52 of file ConstructionTask.h.
Referenced by dispatchTime(), freeResources(), getEndTime(), preUpdate(), reserveResources(), setRequiredSatisfyTime(), and startTime().
Definition at line 50 of file ConstructionTask.h.
Referenced by freeLocation(), getEndLocation(), getPriority(), getStartLocation(), giveUnit(), preUpdate(), reserveLocation(), setRequiredSatisfyTime(), update(), updateRequirements(), and waitingForUnit().
bool ConstructionTask::mReservedResources [private] |
Definition at line 55 of file ConstructionTask.h.
Referenced by freeResources(), reserveResources(), setRequiredSatisfyTime(), and updateRequirements().
BWAPI::UnitType ConstructionTask::mType [private] |
Definition at line 44 of file ConstructionTask.h.
Referenced by finishedWithBuilder(), freeLocation(), freeResources(), getEndTime(), getOutputName(), giveUnit(), morph(), preUpdate(), reserveLocation(), reserveResources(), returnUnit(), setRequiredSatisfyTime(), update(), updateRequirements(), and waitingForUnit().