BWAPI
|
00001 #pragma once 00002 #include <BWAPI.h> 00003 #include <BWTA.h> 00004 #include <windows.h> 00005 #include <math.h> 00006 #include "Micro/Units/BayesianUnit.h" 00007 #include "Micro/Formations.h" 00008 #include "Utils/Vec.h" 00009 #include <set> 00010 #include <boost/bimap/bimap.hpp> 00011 #include "Intelligence/EUnitsFilter.h" 00012 00013 #define _UNITS_DEBUG 1 00014 00015 struct Dmg 00016 { 00017 Dmg(int d, BWAPI::Unit* u, int h) 00018 : dmg(d) 00019 , unit(u) 00020 , hp(h) 00021 { } 00022 Dmg(const Dmg& d) 00023 : dmg(d.dmg) 00024 , unit(d.unit) 00025 , hp(d.hp) 00026 { } 00027 int dmg; 00028 int hp; 00029 BWAPI::Unit* unit; 00030 bool operator<(const Dmg& d) const { return ((this->hp - this->dmg) < (d.hp - d.dmg) || (this->hp - this->dmg == d.hp - d.dmg) && this->unit < d.unit); } 00031 Dmg operator-=(int i) { this->dmg -= i; return *this; } 00032 Dmg operator+=(int i) { this->dmg += i; return *this; } 00033 }; 00034 00035 typedef boost::bimaps::bimap<BWAPI::Unit*, Dmg> UnitDmgBimap; 00036 typedef UnitDmgBimap::relation UnitDmg; 00037 00038 class Formation; 00039 00040 struct i_dist 00041 { 00042 unsigned int ind; 00043 double dist; 00044 i_dist(unsigned int i, double d): ind(i), dist(d) {} 00045 //bool operator<(i_dist& ext) { return (ext.dist < dist); } 00046 }; 00047 00048 struct BasicUnitsGroup // should derive from vector<pBayesianUnit> 00049 { 00050 std::vector<pBayesianUnit> units; 00051 virtual void update(); 00052 bool emptyUnits(); 00053 int size() const; 00054 }; 00055 00056 class UnitsGroup : public BasicUnitsGroup 00057 { 00058 private: 00059 int _totalHP; 00060 int _totalMinPrice; 00061 int _totalGasPrice; 00062 int _totalSupply; 00063 int _backFrame; 00064 int _offensiveFrame; 00065 double _maxRange; 00066 EUnitsFilter* _eUnitsFilter; 00067 std::set<BWAPI::Unit*> _mergersHT; 00068 bool _hasDetection; 00069 inline void updateNearbyEnemyUnitsFromFilter(BWAPI::Position p, double radius = 400.0); 00070 double evaluateForces(); 00071 inline std::vector<BWAPI::Position> findRangePositions(); 00072 inline void activeUnit(pBayesianUnit bu); 00073 bool removeUnit(BWAPI::Unit* u); 00074 bool removeArrivingUnit(BWAPI::Unit* u); 00075 #ifndef __RELEASE_OPTIM__ 00076 void displayTargets(); // debug purpose 00077 #endif 00078 public: 00080 double force; 00081 bool enemiesDefinedByGoal; 00082 std::list<pBayesianUnit> arrivingUnits; 00083 std::vector<BWAPI::Position> ppath; 00084 UnitDmgBimap unitDamages; 00085 pBayesianUnit leadingUnit; 00086 BWAPI::Unit* defaultTargetEnemy; 00087 BWAPI::Position groupTargetPosition; 00088 double distToTarget; 00089 BWTA::Chokepoint* nearestChoke; 00090 double distToNearestChoke; 00091 Vec centerSpeed; 00092 std::map<BWAPI::UnitSizeType, int> sizes; 00093 bool isFighting; 00094 bool suicide; 00095 bool readyToAttack; 00097 int nonFlyers; 00098 unit_mode groupMode; 00099 BWAPI::Position center; 00100 int groupAltitude; 00101 double stdDevRadius, maxRadius; 00103 BWAPI::Position enemiesCenter; 00104 bool enemyStatic; 00105 int enemiesAltitude; 00106 std::map<BWAPI::Unit*, BWAPI::Position> enemies; 00107 00109 UnitsGroup(); 00110 virtual ~UnitsGroup(); 00111 void update(); 00112 #ifndef __RELEASE_OPTIM__ 00113 void display(); 00114 #endif 00115 00116 void move(BWAPI::Position& p); 00117 virtual void formation(pFormation f); 00118 void switchMode(unit_mode um); 00119 void idle(); 00121 void dispatchCompleteUnit(pBayesianUnit bu); 00122 void giveUpControl(BWAPI::Unit* u); 00124 virtual void onUnitDestroy(BWAPI::Unit* u); 00125 virtual void onUnitShow(BWAPI::Unit* u); 00126 virtual void onUnitHide(BWAPI::Unit* u); 00128 inline void updateArrivingUnits(); 00129 inline void chooseLeadingUnit(); 00130 inline void updateCenter(); 00131 inline void updateOurStats(); 00132 inline void updateEnemiesCenter(); 00134 virtual BWAPI::Position getCenter() const; 00135 inline double getDistance(BWAPI::Unit* u) const; 00136 double getDistance(BWAPI::Position p) const; 00137 int getTotalHP() const; 00138 std::vector<pBayesianUnit>* getUnits(); // a baaad getter, keep an eye 00139 const BayesianUnit& operator[](ptrdiff_t i); 00141 inline void templarMergingStuff(); 00142 void signalMerge(BWAPI::Unit* u); 00143 #ifndef __RELEASE_OPTIM__ 00144 void selectedUnits(std::set<pBayesianUnit>& u); 00145 #endif 00146 }; 00147