BWAPI
Public Member Functions | Private Attributes
DefaultSquadTask Class Reference

#include <DefaultSquad.h>

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

List of all members.

Public Member Functions

 DefaultSquadTask (ArmyBehaviour behaviour)
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 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
unsigned int controlSize ()
virtual void updateRequirements ()

Private Attributes

UnitGroup mUnits
std::map< Unit, BehaviourmUnitBehaviours
Unit mObserver
Goal mLastGoal
bool mEngageFull

Detailed Description

Definition at line 8 of file DefaultSquad.h.


Constructor & Destructor Documentation

Definition at line 11 of file DefaultSquad.cpp.

        : BaseSquadTask(behaviour)
        , mEngageFull(false)
{
}

Member Function Documentation

unsigned int DefaultSquadTask::controlSize ( ) [inline, virtual]

Implements BaseSquadTask.

Definition at line 33 of file DefaultSquad.h.

References mUnits, and UnitGroup::size().

{ return mUnits.size(); }

Here is the call graph for this function:

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

Implements BaseSquadTask.

Definition at line 37 of file DefaultSquad.cpp.

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

Implements BaseSquadTask.

Definition at line 17 of file DefaultSquad.cpp.

References Requirement::maxTime.

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

Implements BaseSquadTask.

Definition at line 22 of file DefaultSquad.cpp.

References Requirement::maxTime.

Implements BaseSquadTask.

Definition at line 297 of file DefaultSquad.cpp.

References mUnits.

{
        return mUnits;
}
virtual std::string DefaultSquadTask::getOutputName ( ) const [inline, virtual]

Implements BaseSquadTask.

Definition at line 31 of file DefaultSquad.h.

{ return ""; }
int DefaultSquadTask::getPriority ( Unit  unit) const [virtual]

Implements BaseSquadTask.

Definition at line 27 of file DefaultSquad.cpp.

{
        return unit->getType().isWorker() ? 5 : 20;
}

Implements BaseSquadTask.

Definition at line 32 of file DefaultSquad.cpp.

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

Implements BaseSquadTask.

Definition at line 30 of file DefaultSquad.h.

{ return "Default Squad"; }
void DefaultSquadTask::giveUnit ( Unit  unit) [virtual]

Implements BaseSquadTask.

Definition at line 271 of file DefaultSquad.cpp.

References UnitGroup::insert(), mObserver, mUnitBehaviours, mUnits, and BWAPI::UnitTypes::Protoss_Observer.

{
        if(unit->getType() == BWAPI::UnitTypes::Protoss_Observer)
                mObserver = unit;
        
        mUnits.insert(unit);

        mUnitBehaviours[unit] = Behaviour(unit);
}

Here is the call graph for this function:

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

Implements BaseSquadTask.

Definition at line 292 of file DefaultSquad.cpp.

{
        return false;
}
bool DefaultSquadTask::preUpdate ( ) [virtual]

Implements BaseSquadTask.

Definition at line 42 of file DefaultSquad.cpp.

References Task::hasEnded(), and updateRequirements().

{
        updateRequirements();

        return hasEnded();
}

Here is the call graph for this function:

void DefaultSquadTask::returnUnit ( Unit  unit) [virtual]

Implements BaseSquadTask.

Definition at line 281 of file DefaultSquad.cpp.

References UnitGroup::erase(), mObserver, mUnitBehaviours, mUnits, and StaticUnits::nullunit.

{
        mUnits.erase(unit);

        mUnitBehaviours[unit].onDeleted();
        mUnitBehaviours.erase(unit);

        if(unit == mObserver)
                mObserver = StaticUnits::nullunit;
}

Here is the call graph for this function:

bool DefaultSquadTask::update ( ) [virtual]

Implements BaseSquadTask.

Definition at line 66 of file DefaultSquad.cpp.

References ArmyBehaviourDef::Aggresive, ActionTypeDef::Attack, GoalTypeDef::Base, BWAPI::Broodwar, UnitGroup::canMajorityAttack(), ActionTypeDef::Defend, PositionTypeDef::DefenseChokepoint, UnitGroup::empty(), Goal::getActionType(), Goal::getBase(), BWAPI::Player::getForce(), Goal::getGoalType(), getLargestChoke(), Task::hasEnded(), ActionTypeDef::Hold, Singleton< T >::Instance(), UnitGroup::isAnyInRange(), UnitHelper::isStaticDefense(), UnitGroup::isWorthEngaging(), BWAPI::UpgradeTypes::Leg_Enhancements, AccessTypeDef::Lost, BaseSquadTask::mArmyBehaviour, BorderPosition::mChoke, mEngageFull, UnitGroup::minDistanceBetween(), mLastGoal, mUnitBehaviours, mUnits, GoalTypeDef::None, BWAPI::BulletTypes::None, UnitGroup::ratingDifference(), BWAPI::Game::self(), UnitGroup::size(), BWAPI::Player::supplyUsed(), BWAPI::TechTypes::Tank_Siege_Mode, PositionTypeDef::TechDefenseChokepoint, StateTypeDef::TechHigh, and BWAPI::Races::Terran.

{
        Goal squadsGoal;

        // Just attack if its not mining anywhere
        bool hasMiningBases = false;
        int techStructures = 0;
        Base baseToDefend;
        bool baseUnderAttack = false;
        const int mySupply = BWAPI::Broodwar->self()->supplyUsed();
        for each(Base base in BaseTracker::Instance().getPlayerBases())
        {
                const int techBuildings = base->getNumberOfTechBuildings();
                if(!base->getEnemyThreats().empty() && (techBuildings > 0 || (!base->isMinedOut() && base->getResourceDepot())))
                {
                        bool thisUnderAttack = base->isUnderAttack();
                        if((thisUnderAttack && !baseUnderAttack) || (thisUnderAttack == baseUnderAttack && techBuildings > techStructures))
                        {
                                baseUnderAttack = thisUnderAttack;
                                baseToDefend = base;
                                techStructures = techBuildings;
                        }
                }

                if(!base->getMinerals().empty() && base->getResourceDepot() && base->getResourceDepot()->exists())
                        hasMiningBases = true;
        }

        UnitGroup avoidGroup;
        UnitGroup engageGroup;
        for each(const UnitGroup &unitGroup in PlayerTracker::Instance().getEnemyClusters())
        {
                if(!hasMiningBases && mUnits.canMajorityAttack(unitGroup))
                {
                        engageGroup += unitGroup;
                        continue;
                }

                if(mUnits.minDistanceBetween(unitGroup) > 540)
                        continue;

                const int rating = mUnits.ratingDifference(unitGroup);
                if(mySupply < 360 && ((!mEngageFull && rating < -350) || rating < -1000))
                        avoidGroup += unitGroup;
                else if(mUnits.canMajorityAttack(unitGroup) && (mUnits.isWorthEngaging(unitGroup) || unitGroup.isAnyInRange(mUnits)))
                        engageGroup += unitGroup;
        }

        mEngageFull = !engageGroup.empty();
        if(mEngageFull)
                squadsGoal = Goal(ActionType::Attack, engageGroup, avoidGroup);
        else if(baseUnderAttack)
        {
                const int rating = mUnits.ratingDifference(baseToDefend->getEnemyThreats());
                if(rating >= 0 || (rating > -1000 && baseUnderAttack))
                        squadsGoal = Goal(ActionType::Defend, baseToDefend->getEnemyThreats(), avoidGroup);
        }

        if(squadsGoal.getGoalType() == GoalType::None)
        {
                for each(Base base in BaseTracker::Instance().getPlayerBases())
                {
                        if(base->isContested())
                        {
                                for each(Unit building in base->getBuildings())
                                {
                                        if(BWAPI::Broodwar->self()->isEnemy(building->getPlayer()))
                                        {
                                                squadsGoal = Goal(ActionType::Attack, building, engageGroup, avoidGroup);
                                                break;
                                        }
                                }
                        }

                        if(squadsGoal.getGoalType() != GoalType::None)
                                break;
                }
        }

        if(squadsGoal.getGoalType() == GoalType::None)
        {
                int enemyKnownSupply = 0;
                int enemyGuessSupply = 0;

                for each(Unit unit in UnitTracker::Instance().selectAllEnemy())
                {
                        int supply = unit->getType().supplyRequired();
                        if(UnitHelper::isStaticDefense(unit->getType()))
                                supply = 7;

                        if(unit->accessibility() != AccessType::Lost)
                                enemyKnownSupply += supply;

                        enemyGuessSupply += supply;
                }

                int alliesSize = 1;
                std::map<BWAPI::Force*, int> enemyForces;
                for each(Player player in BWAPI::Broodwar->getPlayers())
                {
                        if(player == BWAPI::Broodwar->self())
                                continue;

                        if(BWAPI::Broodwar->self()->isAlly(player))
                                ++alliesSize;

                        if(BWAPI::Broodwar->self()->isEnemy(player))
                                ++enemyForces[player->getForce()];
                }

                int maxEnemiesSize = 0;
                for each(std::pair<BWAPI::Force*, int> force in enemyForces)
                {
                        if(force.second > maxEnemiesSize)
                                maxEnemiesSize = force.second;
                }

                bool shouldAttackBase = !hasMiningBases;
                if(mUnits.size() >= 3)
                {
                        if(mySupply > 380)
                                shouldAttackBase = true;
                        else if(GameProgressDetection::Instance().getState() != StateType::TechHigh)
                        {
                                // If its a terran with siege tanks don't attack a base without leg speed and also ensure we are better matched as siege tanks can hurt
                                bool isTerranWithSiege = PlayerTracker::Instance().isEnemyRace(BWAPI::Races::Terran) && PlayerTracker::Instance().enemyHasReseached(BWAPI::TechTypes::Tank_Siege_Mode);
                                if(isTerranWithSiege && BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Leg_Enhancements) > 0 && mUnits.size() > 45 && mySupply > (enemyGuessSupply * 4))
                                        shouldAttackBase = true;
                                else if(!isTerranWithSiege && mUnits.size() > 35 && mySupply > (enemyKnownSupply * 4))
                                        shouldAttackBase = true;
                                else if(mArmyBehaviour <= ArmyBehaviour::Aggresive)
                                {
                                        if(maxEnemiesSize <= alliesSize)
                                                shouldAttackBase = true;
                                }

                                // Agains't weak opponents it can usually attack when these pass
                                // how ever against stronger opponents, or terran with siege tanks it will just lose a few units time and again then lose to a push
                                // easier to just sit back and turtle alittle
                                /*else if(mArmyBehaviour <= ArmyBehaviour::Default)
                                {
                                        if(mySupply > (enemyGuessSupply * 4))
                                                shouldAttackBase = true;
                                }
                                else if(mArmyBehaviour == ArmyBehaviour::Defensive)
                                {
                                        if(mySupply > (enemyGuessSupply * 5))
                                                shouldAttackBase = true;
                                }*/
                        }
                }

                if(shouldAttackBase)
                {
                        Base bestBaseToAttack;
                        if(mLastGoal.getGoalType() == GoalType::Base && mLastGoal.getActionType() == ActionType::Attack && mLastGoal.getBase()->isEnemyBase())
                                bestBaseToAttack = mLastGoal.getBase();

                        for each(Base base in BaseTracker::Instance().getEnemyBases())
                        {
                                if(!bestBaseToAttack || base->getBuildings().size() < bestBaseToAttack->getBuildings().size())
                                        bestBaseToAttack = base;
                        }

                        if(bestBaseToAttack)
                                squadsGoal = Goal(ActionType::Attack, bestBaseToAttack, engageGroup, avoidGroup);
                }
        }

        if(squadsGoal.getGoalType() == GoalType::None && baseToDefend && mUnits.canMajorityAttack(baseToDefend->getEnemyThreats()))
                squadsGoal = Goal(ActionType::Defend, baseToDefend->getCenterLocation(), engageGroup, avoidGroup);

        if(squadsGoal.getGoalType() == GoalType::None)
        {
                if(!BorderTracker::Instance().getBorderPositions(PositionType::TechDefenseChokepoint).empty())
                        squadsGoal = Goal(ActionType::Hold, getLargestChoke(BorderTracker::Instance().getBorderPositions(PositionType::TechDefenseChokepoint)).mChoke->getCenter(), engageGroup, avoidGroup);
        }

        if(squadsGoal.getGoalType() == GoalType::None)
        {
                if(!BorderTracker::Instance().getBorderPositions(PositionType::DefenseChokepoint).empty())
                        squadsGoal = Goal(ActionType::Hold, getLargestChoke(BorderTracker::Instance().getBorderPositions(PositionType::DefenseChokepoint)).mChoke->getCenter(), engageGroup, avoidGroup);
        }

        if(squadsGoal.getGoalType() == GoalType::None)
                squadsGoal = Goal(ActionType::Attack, Position(BWAPI::Broodwar->mapWidth()*24, BWAPI::Broodwar->mapHeight()*16), engageGroup, avoidGroup);

        if(!mEngageFull && !avoidGroup.empty() && squadsGoal.getActionType() == ActionType::Attack && squadsGoal.getGoalType() == GoalType::Base)
                squadsGoal = Goal(ActionType::Attack, avoidGroup.getCenter(), engageGroup, avoidGroup);

        mLastGoal = squadsGoal;
        if(squadsGoal.getGoalType() != GoalType::None)
        {
                for(std::map<Unit, Behaviour>::iterator it = mUnitBehaviours.begin(); it != mUnitBehaviours.end(); ++it)
                        it->second.update(squadsGoal, mUnits);
        }

        return hasEnded() && mUnits.empty();
}

Here is the call graph for this function:

Reimplemented from BaseSquadTask.

Definition at line 302 of file DefaultSquad.cpp.

References Task::addRequirement(), RequirementGroup::addUnitFilterRequirement(), RequirementGroup::addUnitRequirement(), BWAPI::Broodwar, Task::clearRequirements(), UnitGroup::count(), Task::hasEnded(), Singleton< T >::Instance(), BWAPI::UnitType::isAddon(), BWAPI::UnitType::isBuilding(), UnitFilterFlags::IsComplete, BWAPI::UnitType::isWorker(), Requirement::maxTime, mObserver, mUnits, BWAPI::UnitTypes::Protoss_Interceptor, BWAPI::UnitTypes::Protoss_Observer, BWAPI::UnitTypes::Protoss_Scarab, BWAPI::UnitTypes::Zerg_Egg, and BWAPI::UnitTypes::Zerg_Larva.

Referenced by preUpdate().

{
        clearRequirements();

        if(!hasEnded())
        {
                for each(Unit unit in UnitTracker::Instance().selectAllUnits())
                {
                        if(!unit->isCompleted())
                                continue;

                        if(mUnits.count(unit) != 0)
                                continue;

                        const BWAPI::UnitType &type = unit->getType();
                        if(type.isBuilding())
                                continue;
                        if(type.isAddon())
                                continue;
                        if(type == BWAPI::Broodwar->self()->getRace().getSupplyProvider())
                                continue;
                        if(type == BWAPI::UnitTypes::Zerg_Egg)
                                continue;
                        if(type == BWAPI::UnitTypes::Protoss_Interceptor)
                                continue;
                        if(type == BWAPI::UnitTypes::Zerg_Larva)
                                continue;
                        if(type == BWAPI::UnitTypes::Protoss_Scarab)
                                continue;
                        if(type == BWAPI::UnitTypes::Protoss_Observer)
                                continue;

                        RequirementGroup req;

                        req.addUnitRequirement(unit, type.isWorker() ? 5 : 20, Requirement::maxTime);

                        addRequirement(req);
                }

                if(!mObserver)
                {
                        RequirementGroup req;

                        req.addUnitFilterRequirement(20, Requirement::maxTime, UnitFilter(BWAPI::UnitTypes::Protoss_Observer) && UnitFilter(UnitFilterFlags::IsComplete));

                        addRequirement(req);
                }
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

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

Implements BaseSquadTask.

Definition at line 266 of file DefaultSquad.cpp.

{
        return false;
}

Member Data Documentation

Definition at line 44 of file DefaultSquad.h.

Referenced by update().

Definition at line 43 of file DefaultSquad.h.

Referenced by update().

Definition at line 41 of file DefaultSquad.h.

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

Definition at line 39 of file DefaultSquad.h.

Referenced by giveUnit(), returnUnit(), and update().


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