|
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().
1.7.6.1