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