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