BWAPI
Skynet/Skynet/MorphTask.cpp
Go to the documentation of this file.
00001 #include "MorphTask.h"
00002 
00003 #include "ResourceTracker.h"
00004 
00005 MorphTask::MorphTask(TaskType priority, BWAPI::UnitType type)
00006         : Task(priority)
00007         , mType(type)
00008         , mReservedResources(false)
00009         , mRequiredSatisfyTime(BWAPI::Broodwar->getFrameCount())
00010 {
00011 }
00012 
00013 int MorphTask::getEndTime() const
00014 {
00015         if(mUnit && (mUnit->isMorphing() || !isCompleted()))
00016                 return mUnit->getCompletedTime();
00017 
00018         return mRequiredSatisfyTime + mType.buildTime();
00019 }
00020 
00021 int MorphTask::getEndTime(Unit unit) const
00022 {
00023         return getEndTime();
00024 }
00025 
00026 Position MorphTask::getStartLocation(Unit unit) const
00027 {
00028         return unit->getPosition();
00029 }
00030 
00031 Position MorphTask::getEndLocation(Unit unit) const
00032 {
00033         return unit->getPosition();
00034 }
00035 
00036 bool MorphTask::preUpdate()
00037 {
00038         if(mUnit && mUnit->isCompleted() && mUnit->getType() == mType)
00039         {
00040                 complete();
00041                 return true;
00042         }
00043 
00044         return false;
00045 }
00046 
00047 bool MorphTask::update()
00048 {
00049         if(mUnit && mUnit->getType() != mType)
00050                 mUnit->morph(mType);
00051 
00052         return hasEnded() && !mUnit;
00053 }
00054 
00055 bool MorphTask::waitingForUnit(Unit unit) const
00056 {
00057         return false;
00058 }
00059 
00060 void MorphTask::giveUnit(Unit unit)
00061 {
00062         if(unit->getType() == mType.whatBuilds().first)
00063         {
00064                 mUnit = unit;
00065                 reserveResources();
00066         }
00067 }
00068 
00069 void MorphTask::returnUnit(Unit unit)
00070 {
00071         if(mUnit == unit)
00072         {
00073                 reserveResources();
00074                 mUnit = StaticUnits::nullunit;
00075         }
00076         else
00077                 assert(false);
00078 }
00079 
00080 bool MorphTask::morph(Unit unit, BWAPI::UnitType previousType)
00081 {
00082         if(unit->getType() == mType || unit->getBuildType() == mType)
00083         {
00084                 freeResources();
00085                 return false;
00086         }
00087 
00088         return true;
00089 }
00090 
00091 UnitGroup MorphTask::getFinishedUnits()
00092 {
00093         UnitGroup returnUnits;
00094 
00095         if(mUnit)
00096                 returnUnits.insert(mUnit);
00097 
00098         return returnUnits;
00099 }
00100 
00101 int MorphTask::getPriority(Unit unit) const
00102 {
00103         return 40;
00104 }
00105 
00106 void MorphTask::updateRequirements()
00107 {
00108         clearRequirements();
00109 
00110         if(!mUnit)
00111         {
00112                 freeResources();
00113 
00114                 RequirementGroup requiredConditions;
00115                 requiredConditions.addUnitFilterRequirement(40, mType.buildTime(), UnitFilter(mType.whatBuilds().first) && UnitFilter(UnitFilterFlags::IsComplete));
00116 
00117                 requiredConditions.addTechForTypeRequirement(mType);
00118 
00119                 if(mType.mineralPrice() > 0) requiredConditions.addMineralRequirement(mType.mineralPrice());
00120                 if(mType.gasPrice() > 0) requiredConditions.addGasRequirement(mType.gasPrice());
00121                 if(mType.supplyRequired() > 0) requiredConditions.addSupplyRequirement(mType.supplyRequired());
00122 
00123                 addRequirement(requiredConditions);
00124         }
00125 }
00126 
00127 void MorphTask::reserveResources()
00128 {
00129         if(!mReservedResources && !hasEnded())
00130         {
00131                 ResourceTracker::Instance().reserveCurrentMinerals(mRequiredSatisfyTime, mType.mineralPrice());
00132                 ResourceTracker::Instance().reserveCurrentGas(mRequiredSatisfyTime, mType.gasPrice());
00133                 ResourceTracker::Instance().reserveCurrentSupply(mRequiredSatisfyTime, mType.supplyRequired());
00134                 mReservedResources = true;
00135         }
00136 }
00137 
00138 void MorphTask::freeResources()
00139 {
00140         if(mReservedResources)
00141         {
00142                 ResourceTracker::Instance().releaseCurrentMinerals(mRequiredSatisfyTime, mType.mineralPrice());
00143                 ResourceTracker::Instance().releaseCurrentGas(mRequiredSatisfyTime, mType.gasPrice());
00144                 ResourceTracker::Instance().releaseCurrentSupply(mRequiredSatisfyTime, mType.supplyRequired());
00145                 mReservedResources = false;
00146         }
00147 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines