BWAPI
Public Member Functions
ArbiterAction Class Reference

#include <ArbiterAction.h>

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

List of all members.

Public Member Functions

 ArbiterAction (Unit unit)
bool update (const Goal &squadGoal, const UnitGroup &squadUnitGroup)

Detailed Description

Definition at line 6 of file ArbiterAction.h.


Constructor & Destructor Documentation

ArbiterAction::ArbiterAction ( Unit  unit) [inline]

Definition at line 9 of file ArbiterAction.h.


Member Function Documentation

bool ArbiterAction::update ( const Goal squadGoal,
const UnitGroup squadUnitGroup 
) [virtual]

Implements SingleMicroActionBaseClass.

Definition at line 10 of file ArbiterAction.cpp.

References BWAPI::Broodwar, BWAPI::Orders::CastRecall, BWAPI::Orders::CastStasisField, UnitGroup::empty(), UnitGroup::getBestFittingToCircle(), UnitGroup::getCenter(), BWAPI::TechType::getWeapon(), BWAPI::Player::hasResearched(), UnitGroup::insert(), Singleton< T >::Instance(), UnitHelper::isArmyUnit(), BWAPI::UnitType::isBuilding(), BWAPI::WeaponType::maxRange(), SingleMicroActionBaseClass::mUnit, BWAPI::UnitTypes::Protoss_Arbiter, BWAPI::Game::self(), UnitGroup::size(), and BWAPI::TechTypes::Stasis_Field.

{
        if(mUnit->getOrder() == BWAPI::Orders::CastStasisField)
                return true;

        if(mUnit->getOrder() == BWAPI::Orders::CastRecall)
                return true;

        if(mUnit->getEnergy() >= 100 && BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Stasis_Field))
        {
                const int stasisSize = 48;

                bool stasisUrgently = false;
                if(UnitInformation::Instance().getUnitsTargetting(mUnit).size() >= 6 || (UnitInformation::Instance().getUnitsTargetting(mUnit).size() >= 1 && mUnit->totalHitPointFraction() < 0.3))
                        stasisUrgently = true;

                UnitGroup stasisChoices;
                for each(Unit enemy in UnitTracker::Instance().selectAllEnemy())
                {
                        if(!UnitHelper::isArmyUnit(enemy->getType()))
                                continue;

                        if(enemy->isUnderStorm() || enemy->isStasised())
                                continue;

                        const int distance = mUnit->getDistance(enemy);
                        if(distance > 250 || distance < stasisSize)
                                continue;

                        stasisChoices.insert(enemy);
                }

                if(stasisChoices.size() > 4 || (!stasisChoices.empty() && stasisUrgently))
                {
                        UnitGroup stasisTargets = stasisChoices.getBestFittingToCircle(stasisSize);

                        if(stasisTargets.size() > 4 || (!stasisTargets.empty() && stasisUrgently))
                        {
                                const Position &stasisLocation = stasisTargets.getCenter();
                                if(mUnit->getDistance(stasisLocation) <= BWAPI::TechTypes::Stasis_Field.getWeapon().maxRange())
                                {
                                        mUnit->useTech(BWAPI::TechTypes::Stasis_Field, stasisLocation);
                                        LatencyTracker::Instance().placingStasis(mUnit, stasisLocation);
                                        return true;
                                }
                                else
                                {
                                        mUnit->move(stasisLocation);
                                        return true;
                                }
                        }
                }
        }

        UnitGroup unitsToCloak;
        for each(Unit unit in squadUnitGroup)
        {
                if(!UnitHelper::isArmyUnit(unit->getType()))
                        continue;

                if(unit->getType() == BWAPI::UnitTypes::Protoss_Arbiter || unit->getType().isBuilding())
                        continue;

                if(mUnit->getDistance(unit) > 250)
                        continue;

                unitsToCloak.insert(unit);
        }

        if(!unitsToCloak.empty())
        {
                unitsToCloak = unitsToCloak.getBestFittingToCircle(136);
                if(!unitsToCloak.empty())
                {
                        Position cloakLocation = unitsToCloak.getCenter();
                        if(mUnit->getDistance(cloakLocation) > 110)
                        {
                                mUnit->move(cloakLocation);
                                return true;
                        }
                }
        }

        return false;
}

Here is the call graph for this function:


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