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