BWAPI
|
00001 #include "MineBlockingMineralTask.h" 00002 00003 MineBlockingMineralTask::MineBlockingMineralTask(TaskType priority, UnitGroup minerals) 00004 : Task(priority) 00005 , mMinerals(minerals) 00006 { 00007 } 00008 00009 int MineBlockingMineralTask::getEndTime() const 00010 { 00011 return Requirement::maxTime; 00012 } 00013 00014 int MineBlockingMineralTask::getEndTime(Unit unit) const 00015 { 00016 return getEndTime(); 00017 } 00018 00019 int MineBlockingMineralTask::getPriority(Unit unit) const 00020 { 00021 return 35; 00022 } 00023 00024 Position MineBlockingMineralTask::getStartLocation(Unit unit) const 00025 { 00026 return unit->getPosition(); 00027 } 00028 00029 Position MineBlockingMineralTask::getEndLocation(Unit unit) const 00030 { 00031 return unit->getPosition(); 00032 } 00033 00034 bool MineBlockingMineralTask::preUpdate() 00035 { 00036 for(std::set<Unit>::iterator it = mMinerals.begin(); it != mMinerals.end();) 00037 { 00038 if((*it)->accessibility() == AccessType::Dead) 00039 mMinerals.erase(it++); 00040 else 00041 ++it; 00042 } 00043 00044 if(mMinerals.empty()) 00045 complete(); 00046 00047 return hasEnded() && mUnit; 00048 } 00049 00050 bool MineBlockingMineralTask::update() 00051 { 00052 if(mUnit) 00053 { 00054 if(mUnit->isCarryingGas() || mUnit->isCarryingMinerals()) 00055 mUnit->returnCargo(); 00056 else 00057 { 00058 Unit closestMineral; 00059 int closestDistance = std::numeric_limits<int>::max(); 00060 for each(Unit mineral in mMinerals) 00061 { 00062 int distance = mineral->getDistance(mUnit); 00063 if(distance < closestDistance) 00064 { 00065 closestMineral = mineral; 00066 closestDistance = distance; 00067 } 00068 } 00069 00070 if(closestMineral) 00071 mUnit->gather(closestMineral); 00072 } 00073 } 00074 00075 return hasEnded() && !mUnit; 00076 } 00077 00078 void MineBlockingMineralTask::updateRequirements() 00079 { 00080 clearRequirements(); 00081 00082 if(!mUnit && !shouldReturnUnit() && !mMinerals.empty()) 00083 { 00084 RequirementGroup requirementOne; 00085 requirementOne.addUnitFilterRequirement(35, Requirement::maxTime, UnitFilter(UnitFilterFlags::type(UnitFilterFlags::IsWorker | UnitFilterFlags::IsComplete)), (*mMinerals.begin())->getPosition()); 00086 00087 addRequirement(requirementOne); 00088 } 00089 } 00090 00091 bool MineBlockingMineralTask::waitingForUnit(Unit unit) const 00092 { 00093 return false; 00094 } 00095 00096 void MineBlockingMineralTask::giveUnit(Unit unit) 00097 { 00098 mUnit = unit; 00099 } 00100 00101 void MineBlockingMineralTask::returnUnit(Unit unit) 00102 { 00103 mUnit = StaticUnits::nullunit; 00104 } 00105 00106 bool MineBlockingMineralTask::morph(Unit unit, BWAPI::UnitType previousType) 00107 { 00108 return true; 00109 } 00110 00111 UnitGroup MineBlockingMineralTask::getFinishedUnits() 00112 { 00113 UnitGroup returnUnits; 00114 00115 returnUnits.insert(mUnit); 00116 00117 return returnUnits; 00118 }