BWAPI
Skynet/Skynet/MineBlockingMineralTask.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines