BWAPI
Skynet/Skynet/ScoutData.cpp
Go to the documentation of this file.
00001 #include "ScoutData.h"
00002 #include "MapHelper.h"
00003 #include "BaseTracker.h"
00004 
00005 #include <limits>
00006 
00007 ScoutDataClass::ScoutDataClass()
00008         : mType(ScoutType::None)
00009         , mBase()
00010 {
00011 }
00012 
00013 ScoutDataClass::ScoutDataClass(Base base, ScoutType type)
00014         : mType(type)
00015         , mBase(base)
00016 {
00017         loadPositions();
00018 }
00019 
00020 void ScoutDataClass::update()
00021 {
00022         checkPositions();
00023 }
00024 
00025 bool ScoutDataClass::isAchieved()
00026 {
00027         return mPositions.empty();
00028 }
00029 
00030 double ScoutDataClass::getDistance(Unit unit)
00031 {
00032         if(mPositions.size() == 1)
00033                 return (*mPositions.begin()).getApproxDistance(unit->getPosition());
00034         else
00035                 return getNextPosition(unit->getPosition()).getApproxDistance(unit->getPosition());
00036 }
00037 
00038 Position ScoutDataClass::getNextPosition(Position pos)
00039 {
00040         if(mPositions.size() == 1)
00041                 return *mPositions.begin();
00042         else if(mPositions.empty())
00043                 return pos;
00044         else
00045         {
00046                 Position closestPosition = BWAPI::Positions::None;
00047                 double closestDistance = std::numeric_limits<double>::max();
00048 
00049                 for each(Position position in mPositions)
00050                 {
00051                         double distance = pos == BWAPI::Positions::None ? position.getApproxDistance(mBase->getCenterLocation()) : position.getApproxDistance(pos);
00052                         if(distance < closestDistance)
00053                         {
00054                                 closestDistance = distance;
00055                                 closestPosition = position;
00056                         }
00057                 }
00058 
00059                 return closestPosition;
00060         }
00061 }
00062 
00063 Position ScoutDataClass::getLastPosition(Position pos)
00064 {
00065         if(mPositions.size() == 1)
00066                 return *mPositions.begin();
00067         else if(mPositions.empty())
00068                 return pos;
00069         else
00070         {
00071                 Position closestPosition = BWAPI::Positions::None;
00072                 double closestDistance = 0;
00073 
00074                 for each(Position position in mPositions)
00075                 {
00076                         double distance = pos == BWAPI::Positions::None ? position.getApproxDistance(mBase->getCenterLocation()) : position.getApproxDistance(pos);
00077                         if(distance > closestDistance)
00078                         {
00079                                 closestDistance = distance;
00080                                 closestPosition = position;
00081                         }
00082                 }
00083 
00084                 return closestPosition;
00085         }
00086 }
00087 
00088 void ScoutDataClass::loadPositions()
00089 {
00090         switch(mType.underlying())
00091         {
00092         case ScoutType::InitialBaseLocationScout:
00093                 {
00094                         mPositions.insert(Position(mBase->getCenterBuildLocation().x()*32+16, mBase->getCenterBuildLocation().y()*32+16));
00095                         break;
00096                 }
00097         case ScoutType::TechSearch:
00098         case ScoutType::BaseSearch:
00099         case ScoutType::BaseScout:
00100                 {
00101                         mPositions.insert(mBase->getCenterLocation());
00102                         break;
00103                 }
00104         case ScoutType::ThoroughSearch:
00105                 {
00106                         for each(TilePosition tile in mBase->getTiles())
00107                         {
00108                                 if(BWAPI::Broodwar->isBuildable(tile))
00109                                         mPositions.insert(Position(tile.x()*32+16, tile.y()*32+16));
00110                         }
00111                         break;
00112                 }
00113         }
00114 
00115         checkPositions();
00116 }
00117 
00118 void ScoutDataClass::checkPositions()
00119 {
00120         for(std::set<Position>::iterator it = mPositions.begin(); it != mPositions.end();)
00121         {
00122                 if(mType == ScoutType::InitialBaseLocationScout)
00123                 {
00124                         if(MapHelper::isAnyVisible(mBase->getCenterBuildLocation(), BWAPI::UnitTypes::Terran_Command_Center) || !BaseTracker::Instance().getEnemyBases().empty())
00125                                 mPositions.erase(it++);
00126                         else
00127                                 ++it;
00128                 }
00129                 else
00130                 {
00131                         if(BWAPI::Broodwar->isVisible(TilePosition(*it)))
00132                                 mPositions.erase(it++);
00133                         else
00134                                 ++it;
00135                 }
00136         }
00137 }
00138 
00139 void ScoutDataClass::drawDebug(BWAPI::Color colour)
00140 {
00141         for each(Position position in mPositions)
00142         {
00143                 BWAPI::Broodwar->drawCircleMap(position.x(), position.y(), 16, colour);
00144         }
00145 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines