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