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