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