BWAPI
SnippyHolloW-BroodwarBotQ-f01ab56/src/Macro/SimCityBuildingPlacer.h
Go to the documentation of this file.
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 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines