BWAPI
SnippyHolloW-BroodwarBotQ-f01ab56/src/Regions/MapManager.h
Go to the documentation of this file.
00001 #pragma once
00002 #include <BWAPI.h>
00003 #include <BWTA.h>
00004 #include "Utils/CSingleton.h"
00005 #include "Intelligence/EUnitsFilter.h"
00006 #include <vector>
00007 #include "Utils/Vec.h"
00008 
00009 #include <windows.h>
00010 #include <process.h>
00011 
00012 class BayesianUnit;
00013 
00014 struct PathfindWork
00015 {
00016         BayesianUnit* bunit;
00017         BWAPI::Unit* unit;
00018         BWAPI::TilePosition start;
00019         BWAPI::TilePosition end;
00020         int damages;
00021         bool flyer;
00022         std::vector<BWAPI::TilePosition> btpath;
00023         PathfindWork(BayesianUnit* ptr, BWAPI::Unit* u, BWAPI::TilePosition s, BWAPI::TilePosition e, int dmg, bool f = false)
00024                 : bunit(ptr)
00025                 , unit(u)
00026                 , start(s)
00027                 , end(e)
00028                 , damages(dmg)
00029                 , flyer(f)
00030         {
00031         }
00032 };
00033 
00039 // #define __BUILDINGS_WT_STRICT__
00040 
00041 // TODO improve storms with units movements (interpolate)
00042 // TODO improve storms by scoring on UnitTypes
00043 // TODO improve the damage map by considering DPS
00044 // TOCHECK perhaps problem when we lift a terran building (we should call onUnitDestroy)
00045 class MapManager : public CSingleton<MapManager>
00046 {
00047     friend class CSingleton<MapManager>;
00048     EUnitsFilter* _eUnitsFilter;
00049     std::map<BWAPI::Unit*, BWAPI::Position> _ourUnits;
00050     std::map<BWAPI::Unit*, BWAPI::Position> _trackedUnits;
00051     std::map<BWAPI::Bullet*, BWAPI::Position> _trackedStorms;
00052     HANDLE _stormPosMutex;
00053     HANDLE _signalLaunchStormUpdate;
00054         HANDLE _stormThread;
00055     static unsigned __stdcall StaticLaunchUpdateStormPos(void* obj);
00056     DWORD LaunchUpdateStormPos();
00057     HANDLE _pathfindingMutex;
00058     HANDLE _signalLaunchPathfinding;
00059     HANDLE _pathfindingThread;
00060     static unsigned __stdcall StaticLaunchPathfinding(void* obj);
00061     DWORD LaunchPathfinding();
00062     int _lastStormUpdateFrame;
00063     std::map<Position, int> _stormPosBuf;
00064     std::map<Position, int> _dontReStorm;
00065     std::map<Position, int> _dontReStormBuf;
00066     std::multimap<double, BWAPI::Unit*> _rangeEnemiesBuf;
00067     std::map<BWAPI::Unit*, BWAPI::Position> _alliedUnitsPosBuf;
00068     std::map<BWAPI::Unit*, BWAPI::Position> _enemyUnitsPosBuf;
00069     std::map<BWAPI::Unit*, std::pair<BWAPI::UnitType, BWAPI::Position> > _invisibleUnitsBuf;
00070     inline void updateStormPos();
00071     int _width;
00072     int _height;
00073     int _pix_width;
00074     int _pix_height;
00075     MapManager();
00076     ~MapManager();
00077     inline void modifyBuildings(BWAPI::Unit* u, bool b);
00078     inline void addBuilding(BWAPI::Unit* u);
00079     inline void addAlliedUnit(BWAPI::Unit* u);
00080     inline void removeBuilding(BWAPI::Unit* u);
00081     inline void removeAlliedUnit(BWAPI::Unit* u);
00082     inline void modifyDamages(int* tab, Position p, int minRadius, int maxRadius, int damages);
00083     inline void updateDamagesGrad(Vec* grad, int* tab, Position p, int minRadius, int maxRadius);
00084     inline void removeDmg(BWAPI::UnitType ut, BWAPI::Position p);
00085     inline void removeDmgStorm(BWAPI::Position p);
00086     inline void addDmg(BWAPI::UnitType ut, BWAPI::Position p);
00087     inline void addDmgWithoutGrad(BWAPI::UnitType ut, BWAPI::Position p);
00088     inline void addDmgStorm(BWAPI::Position p);
00089     inline int additionalRangeGround(BWAPI::UnitType ut);
00090     inline int additionalRangeAir(BWAPI::UnitType ut);
00091 
00092         inline void registerPathfindWork(BayesianUnit* ptr, BWAPI::Unit* u, BWAPI::TilePosition start, BWAPI::TilePosition end, int damages);
00093         std::list<PathfindWork> _pathfindWorks;
00094         PathfindWork _currentPathfindWork;
00095         bool _currentPathfindWorkAborded;
00096     bool* _buildingsBuf;            // low res => building tiless
00097     int* _groundDamagesBuf;         // build tiles
00098     int* _airDamagesBuf;            // build tiles
00099     bool* _lowResWalkability;       // low res => building tiles
00100         std::map<BWTA::BaseLocation*, std::vector<BWAPI::TilePosition> > _pathsFromHomeToSL;
00101 
00102     void buildingsAwarePathFind(std::vector<BWAPI::TilePosition>& btpath, 
00103         const BWAPI::TilePosition& start, const BWAPI::TilePosition& end);
00104     void damagesAwarePathFindAir(std::vector<BWAPI::TilePosition>& btpath, 
00105         const BWAPI::TilePosition& start, const BWAPI::TilePosition& end, int damages);
00106     void damagesAwarePathFindGround(std::vector<BWAPI::TilePosition>& btpath, 
00107         const BWAPI::TilePosition& start, const BWAPI::TilePosition& end, int damages);
00108     //void quickPathFind(std::vector<BWAPI::TilePosition>& btpath, // works only with correct Regions
00109     //    const BWAPI::TilePosition& start,                               // often not the case on custom maps
00110     //    const BWAPI::TilePosition& end);
00111     // void pathFind(std::vector<WalkTilePosition>& path, 
00112     //    const BWAPI::Position& p_start, const BWAPI::Position& p_end);
00113     void straightLine(std::vector<BWAPI::TilePosition>& btpath, 
00114         const BWAPI::TilePosition& start, const BWAPI::TilePosition& end);
00115 
00116 public:
00117     bool* walkability;          // walk tiles
00118     bool* buildings_wt;         // walk tiles
00119 #ifdef __BUILDINGS_WT_STRICT__
00120     bool* buildings_wt_strict;  // walk tiles
00121 #endif
00122     bool* buildings;            // low res => building tiless
00123     int* groundDamages;         // build tiles
00124     int* airDamages;            // build tiles
00125     Vec* groundDamagesGrad;     // build tiles
00126     Vec* airDamagesGrad;        // build tiles
00127         std::map<BWTA::Region*, BWAPI::Position> regionsPFCenters; // Pathfinding wise region centers
00128         std::map<BWTA::Region*, std::map<BWTA::Region*, double> > distRegions; // distRegions[R1][R2] w.r.t regionsPFCenters
00129         std::map<BWTA::Region*, std::map<double, BWTA::Region*> > regionsByDist; // regionsByDust[R] ordered by distance w.r.t. regionsPFCenters too
00130         std::map<BWTA::BaseLocation*, std::map<BWTA::BaseLocation*, double> > distBaseToBase;
00131         std::map<BWTA::Region*, BWAPI::TilePosition> regionsInsideCenter; // Centers of the regions that are inside
00132     std::map<Position, int> stormPos;
00133     void onUnitCreate(BWAPI::Unit* u);
00134     void onUnitDestroy(BWAPI::Unit* u);
00135     void onUnitShow(BWAPI::Unit* u);
00136     void onUnitHide(BWAPI::Unit* u);
00137     void justStormed(BWAPI::Position p);
00138         void pathfind(BayesianUnit* ptr, BWAPI::Unit* u, BWAPI::TilePosition start, BWAPI::TilePosition end);
00139         void threatAwarePathfind(BayesianUnit* ptr, BWAPI::Unit* u, BWAPI::TilePosition start, BWAPI::TilePosition end, int damages);
00140         void cancelPathfind(BayesianUnit* ptr);
00141         const std::vector<BWAPI::TilePosition>& getPathFromHomeToSL(BWTA::BaseLocation* b);
00142     void update();
00143     const std::map<BWAPI::Unit*, BWAPI::Position> & getOurUnits();
00144     const std::map<BWAPI::Unit*, BWAPI::Position> & getTrackedUnits();
00145     const std::map<BWAPI::Bullet*, BWAPI::Position> & getTrackedStorms();
00146     BWAPI::Position closestWalkabableSameRegionOrConnected(BWAPI::Position p);
00147     BWAPI::TilePosition closestWalkabableSameRegionOrConnected(BWAPI::TilePosition tp);
00148         bool isBTWalkable(int x, int y);
00149         bool isBTWalkable(const BWAPI::TilePosition& tp);
00150     void drawBuildings();           // debug
00151     void drawBuildingsStrict();     // debug
00152     void drawWalkability();         // debug
00153     void drawLowResWalkability();   // debug
00154     void drawLowResBuildings();     // debug
00155     void drawGroundDamages();       // debug
00156     void drawAirDamages();          // debug
00157     void drawGroundDamagesGrad();   // debug
00158     void drawAirDamagesGrad();      // debug
00159     void drawBestStorms();          // debug
00160 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines