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