BWAPI
Skynet/Skynet/GatherTask.cpp
Go to the documentation of this file.
00001 #include "GatherTask.h"
00002 
00003 #include "ResourceManager.h"
00004 
00005 GatherTask::GatherTask(Unit resource, Base base)
00006         : Task(TaskType::Medium)
00007         , mResource(resource)
00008         , mBase(base)
00009 {
00010 }
00011 
00012 int GatherTask::getEndTime() const
00013 {
00014         return Requirement::maxTime;
00015 }
00016 
00017 int GatherTask::getEndTime(Unit unit) const
00018 {
00019         return getEndTime();
00020 }
00021 
00022 Position GatherTask::getStartLocation(Unit unit) const
00023 {
00024         return unit->getPosition();
00025 }
00026 
00027 Position GatherTask::getEndLocation(Unit unit) const
00028 {
00029         return unit->getPosition();
00030 }
00031 
00032 bool GatherTask::preUpdate()
00033 {
00034         if(hasEnded())
00035                 return true;
00036 
00037         updateRequirements();
00038 
00039         return false;
00040 }
00041 
00042 bool GatherTask::update()
00043 {
00044         if(mWorkerOne)
00045                 updateWorker(mWorkerOne);
00046         if(mWorkerTwo)
00047                 updateWorker(mWorkerTwo);
00048         if(mWorkerThree)
00049                 updateWorker(mWorkerThree);
00050 
00051         return hasEnded() && !mWorkerOne && !mWorkerTwo && !mWorkerThree;
00052 }
00053 
00054 bool GatherTask::waitingForUnit(Unit unit) const
00055 {
00056         return false;
00057 }
00058 
00059 void GatherTask::giveUnit(Unit unit)
00060 {
00061         if(!mWorkerOne)
00062                 mWorkerOne = unit;
00063         else if(!mWorkerTwo)
00064                 mWorkerTwo = unit;
00065         else if(!mWorkerThree)
00066                 mWorkerThree = unit;
00067         else
00068                 assert(false);
00069 }
00070 
00071 void GatherTask::returnUnit(Unit unit)
00072 {
00073         if(mWorkerOne == unit)
00074         {
00075                 mWorkerOne = mWorkerTwo;
00076                 mWorkerTwo = mWorkerThree;
00077                 mWorkerThree = StaticUnits::nullunit;
00078         }
00079         else if(mWorkerTwo == unit)
00080         {
00081                 mWorkerTwo = mWorkerThree;
00082                 mWorkerThree = StaticUnits::nullunit;
00083         }
00084         else if(mWorkerThree == unit)
00085         {
00086                 mWorkerThree = StaticUnits::nullunit;
00087         }
00088         else
00089                 assert(false);
00090 }
00091 
00092 bool GatherTask::morph(Unit unit, BWAPI::UnitType previousType)
00093 {
00094         return true;
00095 }
00096 
00097 UnitGroup GatherTask::getFinishedUnits()
00098 {
00099         UnitGroup returnUnits;
00100 
00101         if(mWorkerOne)
00102                 returnUnits.insert(mWorkerOne);
00103         if(mWorkerTwo)
00104                 returnUnits.insert(mWorkerTwo);
00105         if(mWorkerThree)
00106                 returnUnits.insert(mWorkerThree);
00107 
00108         return returnUnits;
00109 }
00110 
00111 int GatherTask::getPriority(Unit unit) const
00112 {
00113         if(!mWorkerOne || unit == mWorkerOne)
00114                 return workerPriority(1);
00115         else if(!mWorkerTwo || unit == mWorkerTwo)
00116                 return workerPriority(2);
00117         else if(!mWorkerThree || unit == mWorkerThree)
00118                 return workerPriority(3);
00119 
00120         assert(false);
00121         return 10;
00122 }
00123 
00124 void GatherTask::updateWorker(Unit worker)
00125 {
00126         if(worker->isCarryingGas() || worker->isCarryingMinerals())
00127         {
00128                 Unit resourceDepot = mBase->getResourceDepot();
00129                 if(resourceDepot)
00130                         worker->returnCargo(resourceDepot);
00131         }
00132         else
00133                 worker->gather(mResource);
00134 }
00135 
00136 void GatherTask::updateRequirements()
00137 {
00138         clearRequirements();
00139 
00140         //TODO: any worker will do that i can control, dont limit to my races workers
00141         Unit resourceDepot = mBase->getResourceDepot();
00142         if(resourceDepot)
00143         {
00144                 int completeTime = 0;
00145                 if(!resourceDepot->isCompleted())
00146                         completeTime = resourceDepot->getCompletedTime();
00147 
00148                 if(mResource->getType().isRefinery() && !mResource->isCompleted())
00149                         completeTime = std::max(completeTime, mResource->getCompletedTime());
00150 
00151                 if(!mWorkerOne)
00152                 {
00153                         RequirementGroup requirementOne;
00154                         requirementOne.addUnitFilterRequirement(workerPriority(1), Requirement::maxTime, UnitFilter(UnitFilterFlags::IsWorker) && UnitFilter(UnitFilterFlags::IsComplete), mResource->getPosition());
00155                         if(completeTime > 0)
00156                                 requirementOne.addTimeRequirement(completeTime);
00157                         addRequirement(requirementOne);
00158                 }
00159 
00160                 if(!mWorkerTwo)
00161                 {
00162                         RequirementGroup requirementTwo;
00163                         requirementTwo.addUnitFilterRequirement(workerPriority(2), Requirement::maxTime, UnitFilter(UnitFilterFlags::IsWorker) && UnitFilter(UnitFilterFlags::IsComplete), mResource->getPosition());
00164                         if(completeTime > 0)
00165                                 requirementTwo.addTimeRequirement(completeTime);
00166                         addRequirement(requirementTwo);
00167                 }
00168 
00169                 if(!mWorkerThree)
00170                 {
00171                         RequirementGroup requirementThree;
00172                         requirementThree.addUnitFilterRequirement(workerPriority(3), Requirement::maxTime, UnitFilter(UnitFilterFlags::IsWorker) && UnitFilter(UnitFilterFlags::IsComplete), mResource->getPosition());
00173                         if(completeTime > 0)
00174                                 requirementThree.addTimeRequirement(completeTime);
00175                         addRequirement(requirementThree);
00176                 }
00177         }
00178 }
00179 
00180 double GatherTask::getMineralRate()
00181 {
00182         if(mResource->getType().isRefinery())
00183                 return 0.0;
00184 
00185         if(mWorkerThree)
00186                 return 3 * 8/180.0;
00187 
00188         if(mWorkerTwo)
00189                 return 2 * 8/180.0;
00190 
00191         if(mWorkerOne)
00192                 return 8/180.0;
00193 
00194         return 0.0;
00195 }
00196 
00197 double GatherTask::getGasRate()
00198 {
00199         if(!mResource->getType().isRefinery())
00200                 return 0.0;
00201 
00202         if(mWorkerThree)
00203                 return 3 * 8/180.0;
00204 
00205         if(mWorkerTwo)
00206                 return 2 * 8/180.0;
00207 
00208         if(mWorkerOne)
00209                 return 8/180.0;
00210 
00211         return 0.0;
00212 }
00213 
00214 int GatherTask::workerPriority(int workerNumber) const
00215 {
00216         if(mResource->getType().isRefinery())
00217         {
00218                 int gLevel = ResourceManager::Instance().getGasLevel();
00219                 if(gLevel == 8)
00220                         return 25;
00221                 else if(workerNumber == 1)
00222                 {
00223                         if(gLevel > 3)
00224                                 return 25;
00225                         else if(gLevel > 2)
00226                                 return 20;
00227                         else if(gLevel > 1)
00228                                 return 15;
00229                         else if(gLevel > 0)
00230                                 return 10;
00231                         else
00232                                 return 0;
00233                 }
00234                 else if(workerNumber == 2)
00235                 {
00236                         if(gLevel > 5)
00237                                 return 25;
00238                         else if(gLevel > 4)
00239                                 return 20;
00240                         else if(gLevel > 3)
00241                                 return 15;
00242                         else if(gLevel > 2)
00243                                 return 10;
00244                         else
00245                                 return 0;
00246                 }
00247                 else if(workerNumber == 3)
00248                 {
00249                         if(gLevel > 7)
00250                                 return 25;
00251                         else if(gLevel > 6)
00252                                 return 20;
00253                         else if(gLevel > 5)
00254                                 return 15;
00255                         else if(gLevel > 4)
00256                                 return 10;
00257                         else
00258                                 return 0;
00259                 }
00260 
00261         }
00262         else if(workerNumber == 1)
00263                 return 20;
00264         else if(workerNumber == 2)
00265                 return 15;
00266         else if(workerNumber == 3)
00267                 return 10;
00268 
00269         return 0;
00270 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines