|
BWAPI
|
#include <ArbiterAction.h>


Public Member Functions | |
| ArbiterAction (Unit unit) | |
| bool | update (const Goal &squadGoal, const UnitGroup &squadUnitGroup) |
Definition at line 6 of file ArbiterAction.h.
| ArbiterAction::ArbiterAction | ( | Unit | unit | ) | [inline] |
Definition at line 9 of file ArbiterAction.h.
: SingleMicroActionBaseClass(unit) {}
| 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;
}
1.7.6.1