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