BWAPI
Skynet/Skynet/TechTask.cpp
Go to the documentation of this file.
00001 #include "TechTask.h"
00002 
00003 #include "ResourceTracker.h"
00004 
00005 TechTask::TechTask(TaskType priority, BWAPI::TechType type)
00006         : Task(priority)
00007         , mType(type)
00008         , mReservedResources(false)
00009         , mRequiredSatisfyTime(BWAPI::Broodwar->getFrameCount())
00010 {
00011 }
00012 
00013 int TechTask::getEndTime() const
00014 {
00015         if(mUnit)
00016                 return BWAPI::Broodwar->getFrameCount() + mUnit->getRemainingResearchTime();
00017 
00018         if(mRequiredSatisfyTime == Requirement::maxTime)
00019                 return mRequiredSatisfyTime;
00020 
00021         return mRequiredSatisfyTime + mType.researchTime();
00022 }
00023 
00024 int TechTask::getEndTime(Unit unit) const
00025 {
00026         return getEndTime();
00027 }
00028 
00029 Position TechTask::getStartLocation(Unit unit) const
00030 {
00031         return unit->getPosition();
00032 }
00033 
00034 Position TechTask::getEndLocation(Unit unit) const
00035 {
00036         return unit->getPosition();
00037 }
00038 
00039 bool TechTask::preUpdate()
00040 {
00041         if(BWAPI::Broodwar->self()->hasResearched(mType))
00042                 complete();
00043 
00044         if((isStopped() || isCanceled() || isCompleted()) && mUnit && !mUnit->isResearching())
00045                 return true;
00046 
00047         updateRequirements();
00048 
00049         return false;
00050 }
00051 
00052 bool TechTask::update()
00053 {
00054         if(mUnit)
00055         {
00056                 if(mUnit->isResearching())
00057                 {
00058                         if(mUnit->getTech() != mType || isStopped() || isPaused() || isCanceled())
00059                                 mUnit->cancel();
00060                         else if(mReservedResources)
00061                         {
00062                                 ResourceTracker::Instance().releaseCurrentMinerals(mRequiredSatisfyTime, mType.mineralPrice());
00063                                 ResourceTracker::Instance().releaseCurrentGas(mRequiredSatisfyTime, mType.gasPrice());
00064                                 mReservedResources = false;
00065                         }
00066                 }
00067                 else if(!shouldReturnUnit())
00068                         mUnit->research(mType);
00069         }
00070 
00071         return hasEnded() && !mUnit;
00072 }
00073 
00074 bool TechTask::waitingForUnit(Unit unit) const
00075 {
00076         return false;
00077 }
00078 
00079 void TechTask::giveUnit(Unit unit)
00080 {
00081         if(unit->getType() == mType.whatResearches())
00082         {
00083                 mUnit = unit;
00084                 assert(mReservedResources == false);
00085                 ResourceTracker::Instance().reserveCurrentMinerals(mRequiredSatisfyTime, mType.mineralPrice());
00086                 ResourceTracker::Instance().reserveCurrentGas(mRequiredSatisfyTime, mType.gasPrice());
00087                 mReservedResources = true;
00088         }
00089 }
00090 
00091 void TechTask::returnUnit(Unit unit)
00092 {
00093         if(mUnit == unit)
00094         {
00095                 mUnit = StaticUnits::nullunit;
00096 
00097                 if(mReservedResources)
00098                 {
00099                         ResourceTracker::Instance().releaseCurrentMinerals(mRequiredSatisfyTime, mType.mineralPrice());
00100                         ResourceTracker::Instance().releaseCurrentGas(mRequiredSatisfyTime, mType.gasPrice());
00101                         mReservedResources = false;
00102                 }
00103         }
00104         else
00105                 assert(false);
00106 }
00107 
00108 bool TechTask::morph(Unit unit, BWAPI::UnitType previousType)
00109 {
00110         return true;
00111 }
00112 
00113 UnitGroup TechTask::getFinishedUnits()
00114 {
00115         UnitGroup returnUnits;
00116 
00117         if(mUnit)
00118                 returnUnits.insert(mUnit);
00119 
00120         return returnUnits;
00121 }
00122 
00123 int TechTask::getPriority(Unit unit) const
00124 {
00125         return 40;
00126 }
00127 
00128 void TechTask::updateRequirements()
00129 {
00130         clearRequirements();
00131 
00132         if(!mUnit && !shouldReturnUnit())
00133         {
00134                 RequirementGroup requiredConditions;
00135 
00136                 assert(mReservedResources == false);
00137                 requiredConditions.addTechForTypeRequirement(mType);
00138                 requiredConditions.addUnitFilterRequirement(40, mType.researchTime(), UnitFilter(mType.whatResearches()) && UnitFilter(UnitFilterFlags::IsComplete));
00139                 requiredConditions.addMineralRequirement(mType.mineralPrice());
00140                 requiredConditions.addGasRequirement(mType.gasPrice());
00141 
00142                 addRequirement(requiredConditions);
00143         }
00144 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines