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