BWAPI
|
#include <Requirement.h>
Public Member Functions | |
Requirement (RequirementType type, int amount) | |
Requirement (int priority, int duration, Unit unit, Position position) | |
Requirement (int priority, int duration, UnitFilter unitFilter, Position position) | |
Requirement (TaskPointer task) | |
Requirement (BWAPI::UnitType unit) | |
Requirement (BWAPI::TechType tech) | |
Requirement (BWAPI::UpgradeType upgrade, int level) | |
int | earliestTime () |
std::map< int, int > | earliestUnitTime (int startTime, int endTime, std::set< Unit > ¤tUnits) |
void | reserve (int frameTime) |
RequirementType | getType () |
bool | unitRequirement () |
Unit | getUnit () const |
int | getDelay () |
bool | operator== (const Requirement &other) const |
bool | operator< (const Requirement &other) const |
Static Public Attributes | |
static const int | maxTime = std::numeric_limits<int>::max() |
Private Member Functions | |
int | earliestTimeForType (BWAPI::UnitType unitType) |
Private Attributes | |
RequirementType | mType |
int | mAmount |
UnitFilter | mUnitFilter |
Unit | mUnit |
Position | mPosition |
int | mPriority |
int | mDuration |
int | mDelay |
TaskPointer | mTask |
BWAPI::UnitType | mUnitType |
BWAPI::TechType | mTechType |
BWAPI::UpgradeType | mUpgradeType |
Definition at line 33 of file Requirement.h.
Requirement::Requirement | ( | RequirementType | type, |
int | amount | ||
) |
Definition at line 13 of file Requirement.cpp.
: mType(type) , mAmount(amount) , mPosition(BWAPI::Positions::None) , mUnit() , mUnitFilter() , mUnitType(BWAPI::UnitTypes::None) , mTechType(BWAPI::TechTypes::None) , mUpgradeType(BWAPI::UpgradeTypes::None) , mTask() , mPriority(0) , mDuration(0) , mDelay(0) { }
Requirement::Requirement | ( | int | priority, |
int | duration, | ||
Unit | unit, | ||
Position | position | ||
) |
Definition at line 29 of file Requirement.cpp.
: mType(RequirementType::Unit) , mAmount(1) , mPosition(position) , mUnit(unit) , mUnitFilter() , mUnitType(BWAPI::UnitTypes::None) , mTechType(BWAPI::TechTypes::None) , mUpgradeType(BWAPI::UpgradeTypes::None) , mTask() , mPriority(priority) , mDuration(duration) , mDelay(0) { }
Requirement::Requirement | ( | int | priority, |
int | duration, | ||
UnitFilter | unitFilter, | ||
Position | position | ||
) |
Definition at line 45 of file Requirement.cpp.
: mType(RequirementType::UnitFilter) , mAmount(1) , mPosition(position) , mUnit() , mUnitFilter(unitFilter) , mUnitType(BWAPI::UnitTypes::None) , mTechType(BWAPI::TechTypes::None) , mUpgradeType(BWAPI::UpgradeTypes::None) , mTask() , mPriority(priority) , mDuration(duration) , mDelay(0) { }
Requirement::Requirement | ( | TaskPointer | task | ) |
Definition at line 61 of file Requirement.cpp.
: mType(RequirementType::Task) , mAmount(0) , mPosition(BWAPI::Positions::None) , mUnit() , mUnitFilter() , mUnitType(BWAPI::UnitTypes::None) , mTechType(BWAPI::TechTypes::None) , mUpgradeType(BWAPI::UpgradeTypes::None) , mTask(task) , mPriority(0) , mDuration(0) , mDelay(0) { }
Definition at line 77 of file Requirement.cpp.
: mType(RequirementType::RequiredForUnit) , mAmount(0) , mPosition(BWAPI::Positions::None) , mUnit() , mUnitFilter() , mUnitType(unit) , mTechType(BWAPI::TechTypes::None) , mUpgradeType(BWAPI::UpgradeTypes::None) , mTask() , mPriority(0) , mDuration(0) , mDelay(0) { }
Definition at line 93 of file Requirement.cpp.
: mType(RequirementType::RequiredForTech) , mAmount(0) , mPosition(BWAPI::Positions::None) , mUnit() , mUnitFilter() , mUnitType(BWAPI::UnitTypes::None) , mTechType(tech) , mUpgradeType(BWAPI::UpgradeTypes::None) , mTask() , mPriority(0) , mDuration(0) , mDelay(0) { }
Requirement::Requirement | ( | BWAPI::UpgradeType | upgrade, |
int | level | ||
) |
Definition at line 109 of file Requirement.cpp.
: mType(RequirementType::RequiredForUpgrade) , mAmount(level) , mPosition(BWAPI::Positions::None) , mUnit() , mUnitFilter() , mUnitType(BWAPI::UnitTypes::None) , mTechType(BWAPI::TechTypes::None) , mUpgradeType(upgrade) , mTask() , mPriority(0) , mDuration(0) , mDelay(0) { }
int Requirement::earliestTime | ( | ) |
Definition at line 220 of file Requirement.cpp.
References earliestTimeForType(), RequirementTypeDef::Gas, Singleton< T >::Instance(), mAmount, maxTime, RequirementTypeDef::Mineral, mTask, mTechType, mType, mUnitType, mUpgradeType, BWAPI::UpgradeTypes::Protoss_Air_Armor, BWAPI::UpgradeTypes::Protoss_Air_Weapons, BWAPI::UnitTypes::Protoss_Cybernetics_Core, BWAPI::UnitTypes::Protoss_Fleet_Beacon, BWAPI::UpgradeTypes::Protoss_Ground_Armor, BWAPI::UpgradeTypes::Protoss_Ground_Weapons, BWAPI::UpgradeTypes::Protoss_Plasma_Shields, BWAPI::UnitTypes::Protoss_Templar_Archives, RequirementTypeDef::RequiredForTech, RequirementTypeDef::RequiredForUnit, RequirementTypeDef::RequiredForUpgrade, BWAPI::UnitType::requiredUnits(), RequirementTypeDef::Supply, RequirementTypeDef::Task, RequirementTypeDef::Time, BWAPI::TechType::whatResearches(), and BWAPI::UpgradeType::whatUpgrades().
{ if(mType == RequirementType::Mineral) return ResourceTracker::Instance().earliestMineralAvailability(mAmount); else if(mType == RequirementType::Gas) return ResourceTracker::Instance().earliestGasAvailability(mAmount); else if(mType == RequirementType::Supply) return ResourceTracker::Instance().earliestSupplyAvailability(mAmount); else if(mType == RequirementType::Time) return mAmount; else if(mType == RequirementType::Task) return mTask->getEndTime(); else if(mType == RequirementType::RequiredForUnit) { int latestTime = 0; for(std::map<BWAPI::UnitType, int>::const_iterator it = mUnitType.requiredUnits().begin(); it != mUnitType.requiredUnits().end(); ++it) latestTime = std::max(latestTime, earliestTimeForType(it->first)); return latestTime; } else if(mType == RequirementType::RequiredForUpgrade) { int latestTime = earliestTimeForType(mUpgradeType.whatUpgrades()); if(mAmount > 1) { if(mUpgradeType == BWAPI::UpgradeTypes::Protoss_Ground_Weapons || mUpgradeType == BWAPI::UpgradeTypes::Protoss_Ground_Armor) latestTime = std::max(latestTime, earliestTimeForType(BWAPI::UnitTypes::Protoss_Templar_Archives)); else if(mUpgradeType == BWAPI::UpgradeTypes::Protoss_Plasma_Shields) latestTime = std::max(latestTime, earliestTimeForType(BWAPI::UnitTypes::Protoss_Cybernetics_Core)); else if(mUpgradeType == BWAPI::UpgradeTypes::Protoss_Air_Armor || mUpgradeType == BWAPI::UpgradeTypes::Protoss_Air_Weapons) latestTime = std::max(latestTime, earliestTimeForType(BWAPI::UnitTypes::Protoss_Fleet_Beacon)); } return latestTime; } else if(mType == RequirementType::RequiredForTech) return earliestTimeForType(mTechType.whatResearches()); return Requirement::maxTime; }
int Requirement::earliestTimeForType | ( | BWAPI::UnitType | unitType | ) | [private] |
Definition at line 352 of file Requirement.cpp.
References BWAPI::Broodwar, Singleton< T >::Instance(), and maxTime.
Referenced by earliestTime().
{ int thisTime = Requirement::maxTime; for each(Unit requiredUnit in UnitTracker::Instance().selectAllUnits(unitType)) { if(requiredUnit->isCompleted()) return BWAPI::Broodwar->getFrameCount(); else { int completeTime = requiredUnit->getCompletedTime(); if(completeTime < thisTime) thisTime = completeTime; } } return thisTime; }
std::map< int, int > Requirement::earliestUnitTime | ( | int | startTime, |
int | endTime, | ||
std::set< Unit > & | currentUnits | ||
) |
Definition at line 263 of file Requirement.cpp.
References Singleton< T >::Instance(), maxTime, mDelay, mDuration, mPosition, mPriority, mType, mUnit, mUnitFilter, BWAPI::Positions::None, UnitFilter::passesFilter(), and RequirementTypeDef::Unit.
{ const bool &allowAnyBlockLength = mDuration == Requirement::maxTime; if(mType == RequirementType::Unit) { if(currentUnits.count(mUnit) > 0) return std::map<int, int>(); if(mPosition != BWAPI::Positions::None) mDelay = int((mUnit->getPosition().getApproxDistance(mPosition) * 1.6) / mUnit->getType().topSpeed()) + 15; return TaskManager::Instance().earliestFreeTimes(mUnit, mPriority, startTime - mDelay, endTime, mDuration, allowAnyBlockLength); } std::map<int, int> bestTimes; int bestStartTime = Requirement::maxTime; int bestDelay = Requirement::maxTime; for each(Unit unit in UnitTracker::Instance().selectAllUnits()) { if(currentUnits.count(unit) > 0) continue; if(!mUnitFilter.passesFilter(unit))//TODO: only checks if it currently passes the filter, but some it can tell when in the future it will pass, might be worth implementing continue; int delay = 0; if(mPosition != BWAPI::Positions::None) { if(!unit->hasPath(mPosition)) continue; delay = int((unit->getPosition().getApproxDistance(mPosition) * 1.6) / unit->getType().topSpeed()) + 15; } // If the delay for this unit pushes it outside the endtime, continue if(mDuration != Requirement::maxTime && startTime + mDuration + delay > endTime) continue; const std::map<int, int> ¤tTimes = TaskManager::Instance().earliestFreeTimes(unit, mPriority, startTime - delay, endTime, mDuration + delay, allowAnyBlockLength); if(!currentTimes.empty()) { std::map<int, int> currentTimesPlusDelay; for(std::map<int, int>::const_iterator it = currentTimes.begin(); it != currentTimes.end(); ++it) currentTimesPlusDelay[it->first + delay] = it->second; // Find the earliest time in these blocks std::map<int, int>::const_iterator it = currentTimesPlusDelay.begin(); if(it != currentTimesPlusDelay.end()) { // Save it if its the best we have found, also prefer if the delay is shorter so it // doesn't choose a unit really far away even though it will make it in time if(it->first < bestStartTime || (it->first == bestStartTime && delay < bestDelay)) { mUnit = unit; mDelay = delay; bestTimes = currentTimesPlusDelay; bestStartTime = it->first; bestDelay = delay; } } } } return bestTimes; }
int Requirement::getDelay | ( | ) | [inline] |
RequirementType Requirement::getType | ( | ) | [inline] |
Unit Requirement::getUnit | ( | ) | const [inline] |
bool Requirement::operator< | ( | const Requirement & | other | ) | const |
Definition at line 155 of file Requirement.cpp.
References mAmount, mDelay, mDuration, mPosition, mPriority, mTask, mTechType, mType, mUnit, mUnitFilter, mUnitType, and mUpgradeType.
{ if(mType < other.mType) return true; else if(mType != other.mType) return false; if(mAmount < other.mAmount) return true; else if(mAmount != other.mAmount) return false; if(mUnitFilter < other.mUnitFilter) return true; else if(mUnitFilter != other.mUnitFilter) return false; if(mUnit < other.mUnit) return true; else if(mUnit != other.mUnit) return false; if(mPosition < other.mPosition) return true; else if(mPosition != other.mPosition) return false; if(mPriority < other.mPriority) return true; else if(mPriority != other.mPriority) return false; if(mDuration < other.mDuration) return true; else if(mDuration != other.mDuration) return false; if(mDelay < other.mDelay) return true; else if(mDelay != other.mDelay) return false; if(mTask < other.mTask) return true; else if(mTask != other.mTask) return false; if(mUnitType < other.mUnitType) return true; else if(mUnitType != other.mUnitType) return false; if(mTechType < other.mTechType) return true; else if(mTechType != other.mTechType) return false; if(mUpgradeType < other.mUpgradeType) return true; else if(mUpgradeType != other.mUpgradeType) return false; return false; }
bool Requirement::operator== | ( | const Requirement & | other | ) | const |
Definition at line 125 of file Requirement.cpp.
References mAmount, mDelay, mDuration, mPosition, mPriority, mTask, mTechType, mType, mUnit, mUnitFilter, mUnitType, and mUpgradeType.
{ if(mType != other.mType) return false; else if(mAmount != other.mAmount) return false; else if(mUnitFilter != other.mUnitFilter) return false; else if(mUnit != other.mUnit) return false; else if(mPosition != other.mPosition) return false; else if(mPriority != other.mPriority) return false; else if(mDuration != other.mDuration) return false; else if(mDelay != other.mDelay) return false; else if(mTask != other.mTask) return false; else if(mUnitType != other.mUnitType) return false; else if(mTechType != other.mTechType) return false; else if(mUpgradeType != other.mUpgradeType) return false; else return true; }
void Requirement::reserve | ( | int | frameTime | ) |
Definition at line 332 of file Requirement.cpp.
References RequirementTypeDef::Gas, Singleton< T >::Instance(), mAmount, mDuration, RequirementTypeDef::Mineral, mPriority, mType, mUnit, RequirementTypeDef::Supply, SafeEnum< def, inner >::underlying(), RequirementTypeDef::Unit, and RequirementTypeDef::UnitFilter.
{ switch(mType.underlying()) { case RequirementType::Mineral: ResourceTracker::Instance().reservePlannedMinerals(frameTime, mAmount); break; case RequirementType::Gas: ResourceTracker::Instance().reservePlannedGas(frameTime, mAmount); break; case RequirementType::Supply: ResourceTracker::Instance().reservePlannedSupply(frameTime, mAmount); break; case RequirementType::Unit: case RequirementType::UnitFilter: TaskManager::Instance().reserveUnit(mUnit, frameTime, mPriority, mDuration); break; } }
bool Requirement::unitRequirement | ( | ) | [inline] |
Definition at line 52 of file Requirement.h.
References mType, RequirementTypeDef::Unit, and RequirementTypeDef::UnitFilter.
{ return mType == RequirementType::Unit || mType == RequirementType::UnitFilter; }
int Requirement::mAmount [private] |
Definition at line 65 of file Requirement.h.
Referenced by earliestTime(), operator<(), operator==(), and reserve().
const int Requirement::maxTime = std::numeric_limits<int>::max() [static] |
Definition at line 61 of file Requirement.h.
Referenced by Task::dispatchTime(), TaskManagerClass::earliestFreeTimes(), ResourceTrackerClass::earliestGasAvailability(), ResourceTrackerClass::earliestMineralAvailability(), ResourceTrackerClass::earliestSupplyAvailability(), RequirementGroup::earliestTime(), earliestTime(), earliestTimeForType(), earliestUnitTime(), TechTask::getEndTime(), TrainTask::getEndTime(), UpgradeTask::getEndTime(), IdleTask::getEndTime(), DefaultSquadTask::getEndTime(), MineBlockingMineralTask::getEndTime(), ConstructionTask::getEndTime(), GatherTask::getEndTime(), DefenseSquadTask::getEndTime(), WorkerScoutTask::getEndTime(), ObserverScoutTask::getEndTime(), ConstructionTask::preUpdate(), RequirementGroup::recurseForUnitTime(), ResourceTrackerClass::reserveCurrentGas(), ResourceTrackerClass::reserveCurrentMinerals(), ResourceTrackerClass::reserveCurrentSupply(), ResourceTrackerClass::reservePlannedGas(), ResourceTrackerClass::reservePlannedMinerals(), ResourceTrackerClass::reservePlannedSupply(), Task::startTime(), ConstructionTask::updateRequirements(), GatherTask::updateRequirements(), MineBlockingMineralTask::updateRequirements(), WorkerScoutTask::updateRequirements(), ObserverScoutTask::updateRequirements(), DefenseSquadTask::updateRequirements(), and DefaultSquadTask::updateRequirements().
int Requirement::mDelay [private] |
Definition at line 73 of file Requirement.h.
Referenced by earliestUnitTime(), getDelay(), operator<(), and operator==().
int Requirement::mDuration [private] |
Definition at line 72 of file Requirement.h.
Referenced by earliestUnitTime(), operator<(), operator==(), and reserve().
Position Requirement::mPosition [private] |
Definition at line 70 of file Requirement.h.
Referenced by earliestUnitTime(), operator<(), and operator==().
int Requirement::mPriority [private] |
Definition at line 71 of file Requirement.h.
Referenced by earliestUnitTime(), operator<(), operator==(), and reserve().
TaskPointer Requirement::mTask [private] |
Definition at line 75 of file Requirement.h.
Referenced by earliestTime(), operator<(), and operator==().
BWAPI::TechType Requirement::mTechType [private] |
Definition at line 78 of file Requirement.h.
Referenced by earliestTime(), operator<(), and operator==().
RequirementType Requirement::mType [private] |
Definition at line 64 of file Requirement.h.
Referenced by earliestTime(), earliestUnitTime(), getType(), operator<(), operator==(), reserve(), and unitRequirement().
Unit Requirement::mUnit [private] |
Definition at line 68 of file Requirement.h.
Referenced by earliestUnitTime(), getUnit(), operator<(), operator==(), and reserve().
UnitFilter Requirement::mUnitFilter [private] |
Definition at line 67 of file Requirement.h.
Referenced by earliestUnitTime(), operator<(), and operator==().
BWAPI::UnitType Requirement::mUnitType [private] |
Definition at line 77 of file Requirement.h.
Referenced by earliestTime(), operator<(), and operator==().
BWAPI::UpgradeType Requirement::mUpgradeType [private] |
Definition at line 79 of file Requirement.h.
Referenced by earliestTime(), operator<(), and operator==().