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