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