BWAPI
Skynet/Skynet/ArbiterAction.cpp
Go to the documentation of this file.
00001 #include "ArbiterAction.h"
00002 
00003 #include <limits>
00004 
00005 #include "UnitTracker.h"
00006 #include "UnitInformation.h"
00007 #include "UnitHelper.h"
00008 #include "LatencyTracker.h"
00009 
00010 bool ArbiterAction::update(const Goal &squadGoal, const UnitGroup &squadUnitGroup)
00011 {
00012         if(mUnit->getOrder() == BWAPI::Orders::CastStasisField)
00013                 return true;
00014 
00015         if(mUnit->getOrder() == BWAPI::Orders::CastRecall)
00016                 return true;
00017 
00018         if(mUnit->getEnergy() >= 100 && BWAPI::Broodwar->self()->hasResearched(BWAPI::TechTypes::Stasis_Field))
00019         {
00020                 const int stasisSize = 48;
00021 
00022                 bool stasisUrgently = false;
00023                 if(UnitInformation::Instance().getUnitsTargetting(mUnit).size() >= 6 || (UnitInformation::Instance().getUnitsTargetting(mUnit).size() >= 1 && mUnit->totalHitPointFraction() < 0.3))
00024                         stasisUrgently = true;
00025 
00026                 UnitGroup stasisChoices;
00027                 for each(Unit enemy in UnitTracker::Instance().selectAllEnemy())
00028                 {
00029                         if(!UnitHelper::isArmyUnit(enemy->getType()))
00030                                 continue;
00031 
00032                         if(enemy->isUnderStorm() || enemy->isStasised())
00033                                 continue;
00034 
00035                         const int distance = mUnit->getDistance(enemy);
00036                         if(distance > 250 || distance < stasisSize)
00037                                 continue;
00038 
00039                         stasisChoices.insert(enemy);
00040                 }
00041 
00042                 if(stasisChoices.size() > 4 || (!stasisChoices.empty() && stasisUrgently))
00043                 {
00044                         UnitGroup stasisTargets = stasisChoices.getBestFittingToCircle(stasisSize);
00045 
00046                         if(stasisTargets.size() > 4 || (!stasisTargets.empty() && stasisUrgently))
00047                         {
00048                                 const Position &stasisLocation = stasisTargets.getCenter();
00049                                 if(mUnit->getDistance(stasisLocation) <= BWAPI::TechTypes::Stasis_Field.getWeapon().maxRange())
00050                                 {
00051                                         mUnit->useTech(BWAPI::TechTypes::Stasis_Field, stasisLocation);
00052                                         LatencyTracker::Instance().placingStasis(mUnit, stasisLocation);
00053                                         return true;
00054                                 }
00055                                 else
00056                                 {
00057                                         mUnit->move(stasisLocation);
00058                                         return true;
00059                                 }
00060                         }
00061                 }
00062         }
00063 
00064         UnitGroup unitsToCloak;
00065         for each(Unit unit in squadUnitGroup)
00066         {
00067                 if(!UnitHelper::isArmyUnit(unit->getType()))
00068                         continue;
00069 
00070                 if(unit->getType() == BWAPI::UnitTypes::Protoss_Arbiter || unit->getType().isBuilding())
00071                         continue;
00072 
00073                 if(mUnit->getDistance(unit) > 250)
00074                         continue;
00075 
00076                 unitsToCloak.insert(unit);
00077         }
00078 
00079         if(!unitsToCloak.empty())
00080         {
00081                 unitsToCloak = unitsToCloak.getBestFittingToCircle(136);
00082                 if(!unitsToCloak.empty())
00083                 {
00084                         Position cloakLocation = unitsToCloak.getCenter();
00085                         if(mUnit->getDistance(cloakLocation) > 110)
00086                         {
00087                                 mUnit->move(cloakLocation);
00088                                 return true;
00089                         }
00090                 }
00091         }
00092 
00093         return false;
00094 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines