BWAPI
|
00001 #pragma once 00002 #include "Macro/RectangleArray.h" 00003 #include "Macro/ReservedMap.h" 00004 #include <list> 00005 #include <set> 00006 #include "Defines.h" 00007 00008 struct BuildingsCluster 00009 { 00010 BWAPI::TilePosition center; 00011 int size; 00012 bool vertical; 00013 BuildingsCluster() 00014 : size(0) 00015 {} 00016 }; 00017 00018 struct PositionAccountant 00019 { 00020 BWAPI::UnitType ut; 00021 std::list<BWAPI::TilePosition> pos; 00022 std::set<BWAPI::TilePosition> givenPos; 00023 void cleanUp(); // because maps suck? 00024 BWAPI::TilePosition reservePos(); 00025 BWAPI::TilePosition reservePos(BWAPI::TilePosition tp); 00026 BWAPI::TilePosition findClosest(BWAPI::TilePosition seed); 00027 inline void freePos(const BWAPI::TilePosition& tp) 00028 { 00029 givenPos.erase(tp); 00030 } 00031 inline void usedPos(const BWAPI::TilePosition& tp) 00032 { 00033 pos.remove(tp); 00034 givenPos.erase(tp); 00035 } 00036 inline bool empty() const 00037 { 00038 return pos.empty(); 00039 } 00040 inline void addPos(const BWAPI::TilePosition& tp) 00041 { 00042 pos.push_back(tp); 00043 TheReservedMap->reserveTiles(tp, ut, ut.tileWidth(), ut.tileHeight()); 00044 } 00045 inline void addAsSecondPos(const BWAPI::TilePosition& tp) 00046 { 00047 if (pos.empty()) 00048 pos.push_front(tp); 00049 else 00050 { 00051 std::list<BWAPI::TilePosition>::const_iterator it = pos.begin(); 00052 pos.insert(++it, tp); // put in second position 00053 } 00054 TheReservedMap->reserveTiles(tp, ut, ut.tileWidth(), ut.tileHeight()); 00055 } 00056 PositionAccountant(BWAPI::UnitType type) 00057 : ut(type) 00058 { 00059 } 00060 }; 00061 00062 class SimCityBuildingPlacer 00063 { 00064 public: 00065 SimCityBuildingPlacer(); 00066 BWAPI::TilePosition getTilePosition(const BWAPI::UnitType& ut, BWAPI::TilePosition seed = BWAPI::TilePositions::None); 00067 BWAPI::TilePosition getPylonTilePositionCovering(const BWAPI::TilePosition& tp); 00068 void releaseTilePosition(const BWAPI::TilePosition& tp, const BWAPI::UnitType& ut); 00069 void usedTilePosition(const BWAPI::TilePosition& tp, const BWAPI::UnitType& ut); 00070 #ifdef __DEBUG__ 00071 void update(); 00072 #endif 00073 void onUnitDestroy(BWAPI::Unit* unit); 00074 void makeCannonsMinerals(BWTA::BaseLocation* home, bool quick=false); 00075 void makeCannonChoke(BWTA::Region* inter, BWTA::Chokepoint* chok, bool quick=false); 00076 static bool blockedBySomething(BWAPI::TilePosition position, BWAPI::UnitType type); 00077 static bool inMineralLine(BWTA::BaseLocation* b, BWAPI::TilePosition tp); 00078 private: 00079 std::list<BWAPI::TilePosition> existingPylons; 00080 PositionAccountant pylons; 00081 PositionAccountant gates; 00082 PositionAccountant cannons; 00083 PositionAccountant tech; 00084 BWTA::BaseLocation* home; 00085 BWTA::Chokepoint* frontChoke; 00086 std::set<BWTA::Chokepoint*> backdoorChokes; 00087 int nbClusters; 00088 bool _noMoreClustersAtHome; 00089 bool _canNoLongerGenerateClusters; 00090 std::set<BWTA::BaseLocation*> _searchedForClustersAtBase; 00091 std::set<BWTA::Region*> _searchedForClustersAtRegion; 00092 inline void searchedAtBase(BWTA::BaseLocation* b); 00093 00094 inline BuildingsCluster searchForCluster(BWTA::BaseLocation* b); 00095 inline BuildingsCluster searchForCluster(BWTA::Region* r); 00096 inline BuildingsCluster searchForCluster(int minX, int maxX, int minY, int maxY, BWTA::Region* r); 00097 inline bool canBuildCluster(BWAPI::TilePosition center, bool vertical, int size); 00098 inline int canBuildCluster(const BWAPI::TilePosition& center, bool vertical); 00099 inline int makeCluster(const BWAPI::TilePosition& center, 00100 int nbTechBuildings, bool vertical, int cSize=0); 00101 BWAPI::TilePosition closestBuildableSameRegion(const BWAPI::TilePosition& tp); 00102 BWAPI::TilePosition closestBuildableSameRegionNotTP2(const BWAPI::TilePosition& tp, const BWAPI::TilePosition& tp2); 00103 inline void generate(int min_size = 1); 00104 inline void generateGatesPos(); 00105 inline void generateTechPos(); 00106 inline void generateCannonsPos(); 00107 inline void generatePylonsPos(); 00108 inline std::set<BWAPI::Unit*> checkPower(const std::set<BWAPI::Unit*>& buildings); 00109 inline bool powerBuildings(const std::set<BWAPI::Unit*>& buildings); 00110 bool canBuildHere(BWAPI::Unit* builder, BWAPI::TilePosition position, BWAPI::UnitType type) const; 00111 bool fullCanBuildHere(BWAPI::Unit* builder, BWAPI::TilePosition position, BWAPI::UnitType type) const; // double checks (map init?) 00112 };