BWAPI
Skynet/Skynet/WallTracker.cpp
Go to the documentation of this file.
00001 #include "WallTracker.h"
00002 
00003 #include <regex>
00004 
00005 #include "UnitTracker.h"
00006 #include "BuildingPlacer.h"
00007 #include "DrawBuffer.h"
00008 #include "MapHelper.h"
00009 #include "Logger.h"
00010 
00011 void WallTrackerClass::onBegin()
00012 {
00013         if(BWAPI::Broodwar->self()->getRace() == BWAPI::Races::Protoss)
00014         {
00015                 if(MapHelper::mapIs("Python"))
00016                 {
00017                         LOGMESSAGE("Python Detected");
00018                         if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(83, 6))//12 o'clock
00019                         {
00020                                 LOGMESSAGE("12 o'clock");
00021                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(58, 12));
00022                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(57, 14));
00023                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(54, 11));
00024                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(51, 10));
00025                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(58, 10));
00026                         }
00027                         else if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(116, 40))//3 o'clock
00028                         {
00029                                 LOGMESSAGE("3 o'clock");
00030                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(114, 62));
00031                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(111, 62));
00032                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(108, 59));
00033                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(117, 64));
00034                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(112, 60));
00035                         }
00036                         else if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(42, 119))//6 o'clock
00037                         {
00038                                 LOGMESSAGE("6 o'clock");
00039                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(73, 117));
00040                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(66, 116));
00041                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(68, 113));
00042                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(69, 116));
00043                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(73, 119));
00044                         }
00045                         else if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(8, 85))//9 o'clock
00046                         {
00047                                 LOGMESSAGE("9 o'clock");
00048                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(7, 63));
00049                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(12, 65));
00050                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(11, 62));
00051                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(9, 60));
00052                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(11, 59));
00053                         }
00054                         else
00055                         {
00056                                 LOGMESSAGE("Error 1");
00057                         }
00058                 }
00059                 else if(MapHelper::mapIs("Destination"))
00060                 {
00061                         LOGMESSAGE("Destination Detected");
00062                         if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(31, 7))//11 o'clock
00063                         {
00064                                 LOGMESSAGE("11 o'clock");
00065                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(60, 18));
00066                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(59, 22));
00067                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(56, 19));
00068                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(64, 17));
00069                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(60, 20));
00070                         }
00071                         else if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(64, 118))//5 o'clock
00072                         {
00073                                 LOGMESSAGE("5 o'clock");
00074                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(35, 110));
00075                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(39, 110));
00076                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(36, 107));
00077                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(31, 110));
00078                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(37, 110));
00079                         }
00080                         else
00081                         {
00082                                 LOGMESSAGE("Error 1");
00083                         }
00084                 }
00085                 else if(MapHelper::mapIs("Heartbreak"))
00086                 {
00087                         LOGMESSAGE("Heartbreak Ridge Detected");
00088                         if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(117, 56))//2 o'clock
00089                         {
00090                                 LOGMESSAGE("2 o'clock");
00091                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(108, 29));
00092                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(104, 27));
00093                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(106, 24));
00094                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(108, 31));
00095                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(107, 27));
00096                         }
00097                         else if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(7, 37))//8 o'clock
00098                         {
00099                                 LOGMESSAGE("8 o'clock");
00100                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(18, 66));
00101                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(18, 70));
00102                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(20, 67));
00103                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(18, 64));
00104                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(18, 68));
00105                         }
00106                         else
00107                         {
00108                                 LOGMESSAGE("Error 1");
00109                         }
00110                 }
00111                 else if(MapHelper::mapIs("Tau"))
00112                 {
00113                         LOGMESSAGE("Tau Cross Detected");
00114                         if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(117, 9))//2 o'clock
00115                         {
00116                                 LOGMESSAGE("2 o'clock");
00117                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(102, 43));
00118                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(104, 44));
00119                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(108, 43));
00120                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(105, 42));
00121                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(108, 41));
00122                         }
00123                         else if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(93, 118))//5 o'clock
00124                         {
00125                                 LOGMESSAGE("5 o'clock");
00126                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(55, 108));
00127                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(50, 108));
00128                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(52, 105));
00129                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(53, 108));
00130                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(55, 110));
00131                         }
00132                         else if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(7, 44))//10 o'clock
00133                         {
00134                                 LOGMESSAGE("10 o'clock");
00135                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(24, 15));
00136                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(26, 19));
00137                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(26, 16));
00138                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(24, 17));
00139                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(22, 15));
00140                         }
00141                         else
00142                         {
00143                                 LOGMESSAGE("Error 1");
00144                         }
00145                 }
00146                 else if(MapHelper::mapIs("Andromeda"))
00147                 {
00148                         LOGMESSAGE("Andromeda Detected");
00149                         if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(117, 7))//1 o'clock
00150                         {
00151                                 LOGMESSAGE("1 o'clock");
00152                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(98, 28));
00153                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(103, 31));
00154                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(100, 28));
00155                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(104, 29));
00156                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(103, 24));
00157                         }
00158                         else if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(117, 119))//5 o'clock
00159                         {
00160                                 LOGMESSAGE("5 o'clock");
00161                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(99, 100));
00162                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(101, 99));
00163                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(102, 96));
00164                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(104, 99));
00165                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(104, 103));
00166                         }
00167                         else if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(7, 118))//7 o'clock
00168                         {
00169                                 LOGMESSAGE("7 o'clock");
00170                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(27, 100));
00171                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(24, 99));
00172                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(22, 96));
00173                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(22, 99));
00174                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(22, 103));
00175                         }
00176                         else if(BWAPI::Broodwar->self()->getStartLocation() == TilePosition(7, 6))//11 o'clock
00177                         {
00178                                 LOGMESSAGE("11 o'clock");
00179                                 mWallPositions[BWAPI::UnitTypes::Protoss_Pylon].push_back(TilePosition(28, 28));
00180                                 mWallPositions[BWAPI::UnitTypes::Protoss_Forge].push_back(TilePosition(22, 31));
00181                                 mWallPositions[BWAPI::UnitTypes::Protoss_Gateway].push_back(TilePosition(24, 28));
00182                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(22, 29));
00183                                 mWallPositions[BWAPI::UnitTypes::Protoss_Photon_Cannon].push_back(TilePosition(23, 24));
00184                         }
00185                         else
00186                         {
00187                                 LOGMESSAGE("Error 1");
00188                         }
00189                 }
00190                 else
00191                 {
00192                         LOGMESSAGE("Error 2");
00193                 }
00194 
00195                 if(!mWallPositions.empty())
00196                 {
00197                         bool oneHasFailed = false;
00198                         for(std::map<BWAPI::UnitType, std::list<TilePosition>>::iterator it = mWallPositions.begin(); it != mWallPositions.end(); ++it)
00199                         {
00200                                 for(std::list<TilePosition>::iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2)
00201                                 {
00202                                         if(!BuildingPlacer::Instance().isTileBuildable(*it2, it->first, true))
00203                                                 oneHasFailed = true;
00204                                 }
00205                         }
00206 
00207                         if(oneHasFailed)
00208                         {
00209                                 LOGMESSAGE("Error 3");
00210                                 mWallPositions.clear();
00211                         }
00212                 }
00213         }
00214 }
00215 
00216 TilePosition WallTrackerClass::getWallPosition(BWAPI::UnitType type)
00217 {
00218         for each(TilePosition tile in mWallPositions[type])
00219         {
00220                 if(BuildingPlacer::Instance().isReserved(tile))
00221                         continue;
00222 
00223                 int isUsed = false;
00224                 for each(Unit unit in UnitTracker::Instance().getUnitsOnTile(tile.x(), tile.y()))
00225                 {
00226                         if(unit->getType().isBuilding())
00227                                 isUsed = true;
00228                 }
00229 
00230                 if(!isUsed)
00231                         return tile;
00232         }
00233 
00234         return BWAPI::TilePositions::None;
00235 }
00236 
00237 bool WallTrackerClass::canForgeExpand()
00238 {
00239         return !mWallPositions.empty();
00240 }
00241 
00242 std::map<TilePosition, BWAPI::UnitType> WallTrackerClass::getWallTiles()
00243 {
00244         std::map<TilePosition, BWAPI::UnitType> tiles;
00245 
00246         for each(std::pair<BWAPI::UnitType, std::list<TilePosition>> wallPair in mWallPositions)
00247         {
00248                 for each(TilePosition tile in wallPair.second)
00249                 {
00250                         for(int x = tile.x(); x < tile.x()+wallPair.first.tileWidth(); ++x)
00251                                 for(int y = tile.y(); y < tile.y()+wallPair.first.tileHeight(); ++y)
00252                                         tiles[TilePosition(x, y)] = wallPair.first;
00253                 }
00254         }
00255 
00256         return tiles;
00257 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines