BWAPI
Classes | Public Member Functions | Private Types | Private Member Functions | Private Attributes
WorkerScoutTask Class Reference

#include <WorkerScoutTask.h>

Inheritance diagram for WorkerScoutTask:
Inheritance graph
[legend]
Collaboration diagram for WorkerScoutTask:
Collaboration graph
[legend]

List of all members.

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< ScoutStateDefScoutState

Private Member Functions

void getNewData ()

Private Attributes

Unit mUnit
ScoutData mData
int mFailTime
int mHarrasTimer
ScoutState mCurrentState
BuildTilePath mTilePath
UnitGroup mLastUnitsTargetting

Detailed Description

Definition at line 11 of file WorkerScoutTask.h.


Member Typedef Documentation

Definition at line 56 of file WorkerScoutTask.h.


Constructor & Destructor Documentation

Definition at line 9 of file WorkerScoutTask.cpp.

        : Task(priority)
        , mData(data)
        , mFailTime(Requirement::maxTime)
{
}

Member Function Documentation

Position WorkerScoutTask::getEndLocation ( Unit  unit) const [virtual]

Implements Task.

Definition at line 34 of file WorkerScoutTask.cpp.

References mData.

{
        if(mData)
                return mData->getLastPosition(unit->getPosition());

        return unit->getPosition();
}
int WorkerScoutTask::getEndTime ( ) const [virtual]

Implements Task.

Definition at line 16 of file WorkerScoutTask.cpp.

References Requirement::maxTime.

Referenced by getEndTime().

Here is the caller graph for this function:

int WorkerScoutTask::getEndTime ( Unit  unit) const [virtual]

Implements Task.

Definition at line 21 of file WorkerScoutTask.cpp.

References getEndTime().

{
        return getEndTime();
}

Here is the call graph for this function:

Implements Task.

Definition at line 299 of file WorkerScoutTask.cpp.

References UnitGroup::insert(), and mUnit.

{
        UnitGroup returnUnits;

        returnUnits.insert(mUnit);

        return returnUnits;
}

Here is the call graph for this function:

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;
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

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]

Implements Task.

Definition at line 26 of file WorkerScoutTask.cpp.

References mData.

{
        if(mData)
                return mData->getNextPosition(unit->getPosition());

        return unit->getPosition();
}
virtual std::string WorkerScoutTask::getTaskName ( ) const [inline, virtual]

Implements Task.

Definition at line 35 of file WorkerScoutTask.h.

{ return "Worker Scout"; }
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.

Here is the call graph for this function:

Definition at line 38 of file WorkerScoutTask.h.

References Task::hasEnded(), mCurrentState, and mData.

{ return hasEnded() || mCurrentState == ScoutState::Harassing || !mData; }

Here is the call graph for this function:

bool WorkerScoutTask::morph ( Unit  unit,
BWAPI::UnitType  previousType 
) [virtual]

Implements Task.

Definition at line 294 of file WorkerScoutTask.cpp.

{
        return true;
}
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;
}

Here is the call graph for this function:

void WorkerScoutTask::returnUnit ( Unit  unit) [virtual]
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;
}

Here is the call graph for this function:

bool WorkerScoutTask::waitingForUnit ( Unit  unit) const [virtual]

Implements Task.

Definition at line 269 of file WorkerScoutTask.cpp.

{
        return false;
}

Member Data Documentation

Definition at line 44 of file WorkerScoutTask.h.

Referenced by getNewData(), giveUnit(), and updateRequirements().

Definition at line 45 of file WorkerScoutTask.h.

Referenced by update().

Definition at line 61 of file WorkerScoutTask.h.

Referenced by update().

Definition at line 60 of file WorkerScoutTask.h.

Referenced by update().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines