BWAPI
|
#include <WorkerScoutTask.h>
Classes | |
struct | ScoutStateDef |
Public Member Functions | |
WorkerScoutTask (TaskType priority, ScoutData data) | |
virtual int | getEndTime () const |
virtual int | getEndTime (Unit unit) const |
virtual int | getPriority (Unit unit) const |
virtual Position | getStartLocation (Unit unit) const |
virtual Position | getEndLocation (Unit unit) const |
virtual bool | preUpdate () |
virtual bool | update () |
virtual void | updateRequirements () |
virtual bool | waitingForUnit (Unit unit) const |
virtual void | giveUnit (Unit unit) |
virtual void | returnUnit (Unit unit) |
virtual bool | morph (Unit unit, BWAPI::UnitType previousType) |
virtual UnitGroup | getFinishedUnits () |
virtual std::string | getTaskName () const |
virtual std::string | getOutputName () const |
bool | isFinishedScouting () |
Private Types | |
typedef SafeEnum< ScoutStateDef > | ScoutState |
Private Member Functions | |
void | getNewData () |
Private Attributes | |
Unit | mUnit |
ScoutData | mData |
int | mFailTime |
int | mHarrasTimer |
ScoutState | mCurrentState |
BuildTilePath | mTilePath |
UnitGroup | mLastUnitsTargetting |
Definition at line 11 of file WorkerScoutTask.h.
typedef SafeEnum<ScoutStateDef> WorkerScoutTask::ScoutState [private] |
Definition at line 56 of file WorkerScoutTask.h.
WorkerScoutTask::WorkerScoutTask | ( | TaskType | priority, |
ScoutData | data | ||
) |
Definition at line 9 of file WorkerScoutTask.cpp.
: Task(priority) , mData(data) , mFailTime(Requirement::maxTime) { }
Position WorkerScoutTask::getEndLocation | ( | Unit | unit | ) | const [virtual] |
int WorkerScoutTask::getEndTime | ( | ) | const [virtual] |
Implements Task.
Definition at line 16 of file WorkerScoutTask.cpp.
References Requirement::maxTime.
Referenced by getEndTime().
{ return Requirement::maxTime; }
int WorkerScoutTask::getEndTime | ( | Unit | unit | ) | const [virtual] |
Implements Task.
Definition at line 21 of file WorkerScoutTask.cpp.
References getEndTime().
{ return getEndTime(); }
UnitGroup WorkerScoutTask::getFinishedUnits | ( | ) | [virtual] |
Implements Task.
Definition at line 299 of file WorkerScoutTask.cpp.
References UnitGroup::insert(), and mUnit.
void WorkerScoutTask::getNewData | ( | ) | [private] |
Definition at line 330 of file WorkerScoutTask.cpp.
References BWAPI::Broodwar, Task::complete(), ScoutTypeDef::CouldNotReachWithGround, BWAPI::Game::getFrameCount(), Singleton< T >::Instance(), mCurrentState, mData, mFailTime, and mUnit.
Referenced by preUpdate().
{ mData = ScoutManager::Instance().getScoutData(ScoutUnitType::Worker); if(!mData) complete(); else if(mUnit && !mUnit->hasPath(mData->getNextPosition(mUnit->getPosition()))) { ScoutManager::Instance().updateLastScoutType(mData, ScoutType::CouldNotReachWithGround); getNewData(); } else { mFailTime = BWAPI::Broodwar->getFrameCount() + 24*60; mCurrentState = ScoutState::Searching; } }
virtual std::string WorkerScoutTask::getOutputName | ( | ) | const [inline, virtual] |
Implements Task.
Definition at line 36 of file WorkerScoutTask.h.
References mCurrentState.
{ return mCurrentState == ScoutState::Searching ? "Searching" : mCurrentState == ScoutState::Harassing ? "Harassing" : "Double Checking"; }
int WorkerScoutTask::getPriority | ( | Unit | unit | ) | const [virtual] |
Implements Task.
Definition at line 308 of file WorkerScoutTask.cpp.
References mCurrentState, and mUnit.
{ if(unit == mUnit && mCurrentState != ScoutState::Harassing) return 50; else return 30; }
Position WorkerScoutTask::getStartLocation | ( | Unit | unit | ) | const [virtual] |
virtual std::string WorkerScoutTask::getTaskName | ( | ) | const [inline, virtual] |
void WorkerScoutTask::giveUnit | ( | Unit | unit | ) | [virtual] |
Implements Task.
Definition at line 274 of file WorkerScoutTask.cpp.
References BWAPI::Broodwar, BWAPI::Game::getFrameCount(), mFailTime, mUnit, and StaticUnits::nullunit.
{ assert(mUnit == StaticUnits::nullunit); mUnit = unit; mFailTime = BWAPI::Broodwar->getFrameCount() + 24*60; }
bool WorkerScoutTask::isFinishedScouting | ( | ) | [inline] |
Definition at line 38 of file WorkerScoutTask.h.
References Task::hasEnded(), mCurrentState, and mData.
{ return hasEnded() || mCurrentState == ScoutState::Harassing || !mData; }
bool WorkerScoutTask::morph | ( | Unit | unit, |
BWAPI::UnitType | previousType | ||
) | [virtual] |
bool WorkerScoutTask::preUpdate | ( | ) | [virtual] |
Implements Task.
Definition at line 42 of file WorkerScoutTask.cpp.
References Task::complete(), ScoutTypeDef::CouldNotReachWithGround, getNewData(), Task::hasEnded(), ScoutTypeDef::InitialBaseLocationScout, Singleton< T >::Instance(), MapHelper::isAnyVisible(), mCurrentState, mData, mUnit, and BWAPI::UnitTypes::Terran_Command_Center.
{ if(!mData) { complete(); } else if(mCurrentState == ScoutState::Searching) { if(mData->isAchieved()) { if(mData->getBase()->isEnemyBase()) mCurrentState = ScoutState::Harassing; else if(mData->getType() == ScoutType::InitialBaseLocationScout && !mData->getBase()->isEnemyBase()) mCurrentState = ScoutState::DoubleCheck; else getNewData(); } else if(mFailTime < BWAPI::Broodwar->getFrameCount()) { ScoutManager::Instance().updateLastScoutType(mData, ScoutType::CouldNotReachWithGround); getNewData(); } } else if(mCurrentState == ScoutState::Harassing) { if(!mData->getBase()->isEnemyBase() || (mUnit && BaseTracker::Instance().getBase(mUnit->getTilePosition()) != mData->getBase())) complete(); } else if(mCurrentState == ScoutState::DoubleCheck) { if(mData->getBase()->isEnemyBase()) mCurrentState = ScoutState::Harassing; else if(MapHelper::isAnyVisible(mData->getBase()->getCenterBuildLocation(), BWAPI::UnitTypes::Terran_Command_Center)) getNewData(); } return hasEnded() && mUnit; }
void WorkerScoutTask::returnUnit | ( | Unit | unit | ) | [virtual] |
Implements Task.
Definition at line 281 of file WorkerScoutTask.cpp.
References ScoutTypeDef::BaseSearch, BWAPI::Broodwar, Task::complete(), ScoutTypeDef::FailedWithGroundHigh, ScoutTypeDef::FailedWithGroundLow, Singleton< T >::Instance(), mCurrentState, mData, mUnit, and StaticUnits::nullunit.
{ assert(mUnit == unit); if(mData && !mUnit->exists()) { ScoutManager::Instance().updateLastScoutType(mData, mCurrentState == ScoutState::Harassing ? ScoutType::BaseSearch : BWAPI::Broodwar->getFrameCount() < 8000 ? ScoutType::FailedWithGroundLow : ScoutType::FailedWithGroundHigh); complete(); } mUnit = StaticUnits::nullunit; }
bool WorkerScoutTask::update | ( | ) | [virtual] |
Implements Task.
Definition at line 81 of file WorkerScoutTask.cpp.
References BWAPI::Broodwar, BWAPI::Game::getFrameCount(), Task::hasEnded(), Singleton< T >::Instance(), BuildTilePath::isComplete, BuildTilePath::isStillValid(), mCurrentState, mData, mHarrasTimer, mLastUnitsTargetting, mTilePath, mUnit, BWAPI::Positions::None, Vector::normalise(), BuildTilePath::path, UnitGroup::size(), and TILE_SIZE.
{ //if(mData) // mData->drawDebug(BWAPI::Colors::Blue); //if(mUnit) // mUnit->drawUnitPosition(); //TODO: change to use goal / behavior system that squads use if(mUnit && mData) { if(mCurrentState == ScoutState::Searching) { Position target = mData->getNextPosition(mUnit->getPosition()); if(target != BWAPI::Positions::None) mUnit->move(target); } else if(mCurrentState == ScoutState::Harassing) { bool doneSomething = false; const UnitGroup &targetting = UnitInformation::Instance().getUnitsTargetting(mUnit); bool targetsChanged = mLastUnitsTargetting != targetting; if(targetsChanged) mLastUnitsTargetting = targetting; //TODO: add units that could be targetting it, including enemy workers so it thinks they are scary and doesn't get surrounded attacking one of them if(mLastUnitsTargetting.size() > 0) { mHarrasTimer = 72; int targettingSupply = 0; for each(Unit unit in mLastUnitsTargetting) { if(!unit->getType().isWorker() && (unit->getType().groundWeapon().maxRange() > 32 || unit->getType().topSpeed() > mUnit->getType().topSpeed())) targettingSupply += unit->getType().supplyRequired(); } //TODO: fight back against other workers if it has the advantage if(!doneSomething) { bool isEnemyToClose = false; for each(Unit unit in mLastUnitsTargetting) { if(unit->isInRange(mUnit)) { isEnemyToClose = true; break; } } //If the enemy is too close, don't use the path as it lacks precision if(!isEnemyToClose) { if(targetsChanged || mTilePath.path.size() <= 7 || !mTilePath.isComplete || !mTilePath.isStillValid()) { bool stickToRegion = targettingSupply == 0; if(mData->getBase()->getNumberOfTechBuildings() == 0 && BWAPI::Broodwar->getFrameCount() > 24*60*4) stickToRegion = false; mTilePath = PathFinder::Instance().CreateAdvancedFleePath(mUnit->getTilePosition(), mLastUnitsTargetting, stickToRegion); } if(mTilePath.isComplete) { while(!mTilePath.path.empty()) { std::list<TilePosition>::iterator currentTile = mTilePath.path.begin(); const Position pos(currentTile->x()*32 + 16, currentTile->y()*32 + 16); if(pos.getApproxDistance(mUnit->getPosition()) <= 64) mTilePath.path.erase(currentTile); else { mUnit->move(pos); doneSomething = true; //BWAPI::Broodwar->drawTextMap(mUnit->getPosition().x(), mUnit->getPosition().y() - 10, "Fleeing with path"); //mTilePath.drawPath(); break; } } } } } // If we haven't done anything to avoid targets, steer away from them if(!doneSomething) { mTilePath.path.clear(); mTilePath.isComplete = false; //TODO: dont just use the the group center, Vector direction = mUnit->getPosition() - mLastUnitsTargetting.getCenter(); direction.normalise(); direction *= float(TILE_SIZE * 4); direction += Vector(mUnit->getPosition()); //BWAPI::Broodwar->drawLineMap(mUnit->getPosition().x(), mUnit->getPosition().y(), (int)direction.x, (int)direction.y, BWAPI::Colors::Red); mUnit->move(direction); doneSomething = true; //BWAPI::Broodwar->drawTextMap(mUnit->getPosition().x(), mUnit->getPosition().y() - 10, "Fleeing with vectors"); } } if(!doneSomething) { mTilePath.path.clear(); mTilePath.isComplete = false; // If we have been provoking units for abit plain out attack them if(mHarrasTimer == 0) { //TODO: change when better unit search functions are added bool oneConstructing = false; Unit closestUnit; double minDist = std::numeric_limits<double>::max(); for each(Unit unit in UnitTracker::Instance().selectAllUnits(mData->getBase()->getPlayer()->getRace().getWorker(), mData->getBase()->getPlayer())) { if(mData->getBase() != BaseTracker::Instance().getBase(unit->getTilePosition())) continue; if(!oneConstructing || unit->isConstructing()) { double thisDist = mUnit->getPosition().getDistance(unit->getPosition()); if(thisDist < minDist || (oneConstructing && unit->isConstructing())) { oneConstructing = unit->isConstructing(); closestUnit = unit; minDist = thisDist; } } } if(closestUnit) { doneSomething = true; mUnit->attack(closestUnit); //BWAPI::Broodwar->drawTextMap(mUnit->getPosition().x(), mUnit->getPosition().y() - 10, "Attacking Unit"); } } } if(!doneSomething) { if(mUnit->getDistance(mData->getBase()->getCenterLocation()) > 320) { doneSomething = true; mUnit->move(mData->getBase()->getCenterLocation()); //BWAPI::Broodwar->drawTextMap(mUnit->getPosition().x(), mUnit->getPosition().y() - 10, "Moving Closer to base"); } } if(!doneSomething) { Unit unit = mData->getBase()->getClosestEnemyBuilding(mData->getBase()->getCenterLocation()); if(unit) { if(mUnit->isInRange(unit)) { doneSomething = true; mUnit->attack(unit); } else { doneSomething = true; mHarrasTimer = 72; mUnit->move(unit->getPosition()); } if(mHarrasTimer > 0) --mHarrasTimer; } } } else if(mCurrentState == ScoutState::DoubleCheck) mUnit->move(mData->getBase()->getCenterLocation()); } return hasEnded() && !mUnit; }
void WorkerScoutTask::updateRequirements | ( | ) | [virtual] |
Reimplemented from Task.
Definition at line 316 of file WorkerScoutTask.cpp.
References Task::addRequirement(), RequirementGroup::addUnitFilterRequirement(), BWAPI::Broodwar, Task::clearRequirements(), BWAPI::Game::getFrameCount(), UnitFilterFlags::IsComplete, UnitFilterFlags::IsWorker, Requirement::maxTime, mData, mFailTime, mUnit, and Task::shouldReturnUnit().
{ clearRequirements(); if(!mUnit && !shouldReturnUnit() && mData) { mFailTime = BWAPI::Broodwar->getFrameCount() + 24*10; RequirementGroup requirementOne; requirementOne.addUnitFilterRequirement(30, Requirement::maxTime, UnitFilter(UnitFilterFlags::IsWorker) && UnitFilter(UnitFilterFlags::IsComplete), mData->getNextPosition()); addRequirement(requirementOne); } }
bool WorkerScoutTask::waitingForUnit | ( | Unit | unit | ) | const [virtual] |
ScoutState WorkerScoutTask::mCurrentState [private] |
Definition at line 58 of file WorkerScoutTask.h.
Referenced by getNewData(), getOutputName(), getPriority(), isFinishedScouting(), preUpdate(), returnUnit(), and update().
ScoutData WorkerScoutTask::mData [private] |
Definition at line 43 of file WorkerScoutTask.h.
Referenced by getEndLocation(), getNewData(), getStartLocation(), isFinishedScouting(), preUpdate(), returnUnit(), update(), and updateRequirements().
int WorkerScoutTask::mFailTime [private] |
Definition at line 44 of file WorkerScoutTask.h.
Referenced by getNewData(), giveUnit(), and updateRequirements().
int WorkerScoutTask::mHarrasTimer [private] |
Definition at line 45 of file WorkerScoutTask.h.
Referenced by update().
Definition at line 61 of file WorkerScoutTask.h.
Referenced by update().
BuildTilePath WorkerScoutTask::mTilePath [private] |
Definition at line 60 of file WorkerScoutTask.h.
Referenced by update().
Unit WorkerScoutTask::mUnit [private] |
Definition at line 41 of file WorkerScoutTask.h.
Referenced by getFinishedUnits(), getNewData(), getPriority(), giveUnit(), preUpdate(), returnUnit(), update(), and updateRequirements().