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