BWAPI
Public Member Functions | Private Member Functions | Private Attributes
ConstructionTask Class Reference

#include <ConstructionTask.h>

Inheritance diagram for ConstructionTask:
Inheritance graph
[legend]
Collaboration diagram for ConstructionTask:
Collaboration graph
[legend]

List of all members.

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

Detailed Description

Definition at line 8 of file ConstructionTask.h.


Constructor & Destructor Documentation

Definition at line 7 of file ConstructionTask.cpp.

        : Task(priority)
        , mType(type)
        , mBuildingLocation(position)
        , mReservedResources(false)
        , mRequiredSatisfyTime(BWAPI::Broodwar->getFrameCount())
        , mRequiredDelayTime(BWAPI::Broodwar->getFrameCount())
{
}

Member Function Documentation

virtual int ConstructionTask::dispatchTime ( ) const [inline, virtual]

Reimplemented from Task.

Definition at line 37 of file ConstructionTask.h.

References mRequiredDelayTime, and mRequiredSatisfyTime.

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().

Here is the call graph for this function:

Here is the caller graph for this function:

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();
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

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;
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

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();
}

Here is the call graph for this function:

Here is the caller graph for this function:

int ConstructionTask::getEndTime ( Unit  unit) const [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;
}

Here is the call graph for this function:

virtual std::string ConstructionTask::getOutputName ( ) const [inline, virtual]

Implements Task.

Definition at line 33 of file ConstructionTask.h.

References BWAPI::UnitType::getName(), and mType.

{ return mType.getName(); }

Here is the call graph for this function:

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;
}

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]

Implements Task.

Definition at line 32 of file ConstructionTask.h.

{ return "Constructing"; }
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);
}

Here is the call graph for this function:

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; }

Here is the call graph for this function:

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(); }

Here is the caller graph for this function:

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;
}

Here is the call graph for this function:

bool ConstructionTask::preUpdate ( ) [virtual]

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());
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

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;
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

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
}

Here is the call graph for this function:

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);
}

Here is the call graph for this function:

virtual int ConstructionTask::startTime ( ) const [inline, virtual]

Reimplemented from Task.

Definition at line 38 of file ConstructionTask.h.

References 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;
}

Here is the call graph for this function:

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);
                }
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

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;
}

Here is the call graph for this function:


Member Data Documentation

Definition at line 49 of file ConstructionTask.h.

Referenced by reserveLocation().

Definition at line 53 of file ConstructionTask.h.

Referenced by dispatchTime(), preUpdate(), and setRequiredSatisfyTime().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines