BWAPI
|
00001 #pragma once 00002 #include "../../../../Utils/Utils.h" 00003 #include "../../../Utils/Utils.h" 00004 #include "../../../Utils/Component.h" 00005 #include "../Location.h" 00006 #include "StaticLocationBase.h" 00007 // Necessary to hack iterator 00008 #include "PrimitiveLocationBase.h" 00009 #include "CompositeLocationBase.h" 00010 00011 class CompositeLocation; 00012 00016 class StaticLocation : public Location, public Component, public virtual StaticLocationBase 00017 { 00018 public: 00019 typedef general_iterator<PrimitiveLocationBase::own_unit_const_iterator, 00020 CompositeLocationBase::own_unit_const_iterator> own_unit_const_iterator; 00021 typedef general_iterator<PrimitiveLocationBase::own_unit_type_const_iterator, 00022 CompositeLocationBase::own_unit_type_const_iterator> own_unit_type_const_iterator; 00023 typedef general_iterator<PrimitiveLocationBase::own_building_const_iterator, 00024 CompositeLocationBase::own_building_const_iterator> own_building_const_iterator; 00025 00026 typedef general_iterator<PrimitiveLocationBase::enemy_unit_iterator, 00027 CompositeLocationBase::enemy_unit_iterator> enemy_unit_iterator; 00028 typedef general_iterator<PrimitiveLocationBase::enemy_unit_const_iterator, 00029 CompositeLocationBase::enemy_unit_const_iterator> enemy_unit_const_iterator; 00030 typedef general_iterator<PrimitiveLocationBase::enemy_unit_type_iterator, 00031 CompositeLocationBase::enemy_unit_type_iterator> enemy_unit_type_iterator; 00032 typedef general_iterator<PrimitiveLocationBase::enemy_unit_type_const_iterator, 00033 CompositeLocationBase::enemy_unit_type_const_iterator> enemy_unit_type_const_iterator; 00034 typedef general_iterator<PrimitiveLocationBase::enemy_building_iterator, 00035 CompositeLocationBase::enemy_building_iterator> enemy_building_iterator; 00036 typedef general_iterator<PrimitiveLocationBase::enemy_building_const_iterator, 00037 CompositeLocationBase::enemy_building_const_iterator> enemy_building_const_iterator; 00038 00039 typedef general_iterator<PrimitiveLocationBase::neutral_unit_iterator, 00040 CompositeLocationBase::neutral_unit_iterator> neutral_unit_iterator; 00041 typedef general_iterator<PrimitiveLocationBase::neutral_unit_const_iterator, 00042 CompositeLocationBase::neutral_unit_const_iterator> neutral_unit_const_iterator; 00043 typedef general_iterator<PrimitiveLocationBase::neutral_unit_type_iterator, 00044 CompositeLocationBase::neutral_unit_type_iterator> neutral_unit_type_iterator; 00045 typedef general_iterator<PrimitiveLocationBase::neutral_unit_type_const_iterator, 00046 CompositeLocationBase::neutral_unit_type_const_iterator> neutral_unit_type_const_iterator; 00047 typedef general_iterator<PrimitiveLocationBase::neutral_building_iterator, 00048 CompositeLocationBase::neutral_building_iterator> neutral_building_iterator; 00049 typedef general_iterator<PrimitiveLocationBase::neutral_building_const_iterator, 00050 CompositeLocationBase::neutral_building_const_iterator> neutral_building_const_iterator; 00051 00056 StaticLocation(CompositeLocation* parent) 00057 : m_id(s_id++) 00058 , m_parent(parent) 00059 { 00060 } 00061 00065 size_t getId() const 00066 { 00067 return m_id; 00068 } 00069 00073 CompositeLocation* getParent() 00074 { 00075 return m_parent; 00076 } 00077 00082 bool isIn(const CompositeLocation* compositeLocation) const; 00083 00084 #pragma region Own_Units 00085 00086 std::pair<own_unit_const_iterator, own_unit_const_iterator> 00087 getOwnUnits() const; 00088 00093 std::pair<own_unit_type_const_iterator, own_unit_type_const_iterator> 00094 getOwnUnits(BWAPI::UnitType unitType) const; 00095 00096 std::pair<own_building_const_iterator, own_building_const_iterator> 00097 getOwnBuildings() const; 00098 00099 size_t getNbOwnUnits() const 00100 { 00101 return getNbOwnUnitsV(); 00102 } 00103 00108 size_t getNbOwnUnits(BWAPI::UnitType unitType) const 00109 { 00110 return getNbOwnUnitsV(unitType); 00111 } 00116 size_t getNbOwnBuildings() const 00117 { 00118 return getNbOwnBuildingsV(); 00119 } 00120 00121 void updateOwnUnits() 00122 { 00123 updateOwnUnitsV(); 00124 } 00125 00126 // #################### ADD-ON #################### 00127 // Copy-paste this stuff in PrimitiveLocation.h and CompositeLocation.h for better performance ;-) 00128 00129 //template <class Predicate> 00130 //std::pair<boost::filter_iterator<Predicate, own_unit_const_iterator>, boost::filter_iterator<Predicate, own_unit_const_iterator>> 00131 // getOwnUnits(Predicate predicate) const 00132 //{ 00133 // std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits(); 00134 // return std::make_pair(boost::filter_iterator<Predicate, own_unit_const_iterator>(predicate, ownUnits.first, ownUnits.second), 00135 // boost::filter_iterator<Predicate, own_unit_const_iterator>(predicate, ownUnits.second, ownUnits.second)); 00136 //} 00137 00138 //template <class Predicate> 00139 //std::pair<boost::filter_iterator<Predicate, own_unit_const_iterator>, boost::filter_iterator<Predicate, own_unit_const_iterator>> 00140 // getOwnUnits(BWAPI::UnitType unitType, Predicate predicate) const 00141 //{ 00142 // std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits(unitType); 00143 // return std::make_pair(boost::filter_iterator<Predicate, own_unit_const_iterator>(predicate, ownUnits.first, ownUnits.second), 00144 // boost::filter_iterator<Predicate, own_unit_const_iterator>(predicate, ownUnits.second, ownUnits.second)); 00145 //} 00146 00147 //typedef boost::filter_iterator<IsCompleted, own_unit_const_iterator> own_completed_unit_const_iterator; 00148 //std::pair<own_completed_unit_const_iterator, own_completed_unit_const_iterator> 00149 // getCompletedOwnUnits() const 00150 //{ 00151 // std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits(); 00152 // return std::make_pair(own_completed_unit_const_iterator(IsCompleted(), ownUnits.first, ownUnits.second), 00153 // own_completed_unit_const_iterator(IsCompleted(), ownUnits.second, ownUnits.second)); 00154 //} 00155 00156 typedef boost::filter_iterator<IsCompleted<OwnUnit>, own_unit_const_iterator> own_completed_unit_const_iterator; 00157 std::pair<own_completed_unit_const_iterator, own_completed_unit_const_iterator> 00158 getCompletedOwnUnits(BWAPI::UnitType unitType) const 00159 { 00160 std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits(unitType); 00161 return std::make_pair(own_completed_unit_const_iterator(IsCompleted<OwnUnit>(), ownUnits.first, ownUnits.second), 00162 own_completed_unit_const_iterator(IsCompleted<OwnUnit>(), ownUnits.second, ownUnits.second)); 00163 } 00164 00165 //typedef boost::filter_iterator<IsCompletedBuilding, own_unit_const_iterator> own_completed_building_const_iterator; 00166 //std::pair<own_completed_building_const_iterator, own_completed_building_const_iterator> 00167 // getCompletedOwnBuildings() const 00168 //{ 00169 // std::pair<own_unit_const_iterator, own_unit_const_iterator> ownUnits = getOwnUnits(); 00170 // return std::make_pair(own_completed_building_const_iterator(IsCompletedBuilding(), ownUnits.first, ownUnits.second), 00171 // own_completed_building_const_iterator(IsCompletedBuilding(), ownUnits.second, ownUnits.second)); 00172 //} 00173 00174 //size_t getNbCompletedOwnUnits() const 00175 //{ 00176 // std::pair<own_completed_unit_const_iterator, own_completed_unit_const_iterator> ownUnits = 00177 // getCompletedOwnUnits(); 00178 // return std::distance(ownUnits.first, ownUnits.second); 00179 //} 00180 00181 size_t getNbCompletedOwnUnits(BWAPI::UnitType unitType) const 00182 { 00183 std::pair<own_completed_unit_const_iterator, own_completed_unit_const_iterator> ownUnits = 00184 getCompletedOwnUnits(unitType); 00185 return std::distance(ownUnits.first, ownUnits.second); 00186 } 00187 00188 //size_t getNbCompletedOwnBuildings() const 00189 //{ 00190 // std::pair<own_completed_building_const_iterator, own_completed_building_const_iterator> ownBuildings = 00191 // getCompletedOwnBuildings(); 00192 // return std::distance(ownBuildings.first, ownBuildings.second); 00193 //} 00194 00195 #pragma endregion Own_Units 00196 00197 #pragma region Enemy_Units 00198 00199 std::pair<enemy_unit_iterator, enemy_unit_iterator> 00200 getEnemyUnits(); 00201 00202 std::pair<enemy_unit_const_iterator, enemy_unit_const_iterator> 00203 getEnemyUnits() const; 00204 00205 std::pair<enemy_unit_type_iterator, enemy_unit_type_iterator> 00206 getEnemyUnits(BWAPI::UnitType unitType); 00207 00208 std::pair<enemy_unit_type_const_iterator, enemy_unit_type_const_iterator> 00209 getEnemyUnits(BWAPI::UnitType unitType) const; 00210 00211 std::pair<enemy_building_iterator, enemy_building_iterator> 00212 getEnemyBuildings(); 00213 00214 std::pair<enemy_building_const_iterator, enemy_building_const_iterator> 00215 getEnemyBuildings() const; 00216 00217 size_t getNbEnemyUnits() const 00218 { 00219 return getNbEnemyUnitsV(); 00220 } 00221 00222 size_t getNbEnemyUnits(BWAPI::UnitType unitType) const 00223 { 00224 return getNbEnemyUnitsV(unitType); 00225 } 00226 00227 size_t getNbEnemyBuildings() const 00228 { 00229 return getNbEnemyBuildingsV(); 00230 } 00231 00232 void updateEnemyBuildings() 00233 { 00234 updateEnemyBuildingsV(); 00235 } 00236 00237 void updateEnemyUnits() 00238 { 00239 updateEnemyUnitsV(); 00240 } 00241 00242 #pragma endregion Enemy_Units 00243 00244 #pragma region Neutral_Units 00245 00246 std::pair<neutral_unit_iterator, neutral_unit_iterator> 00247 getNeutralUnits(); 00248 00249 std::pair<neutral_unit_const_iterator, neutral_unit_const_iterator> 00250 getNeutralUnits() const; 00251 00252 std::pair<neutral_unit_type_iterator, neutral_unit_type_iterator> 00253 getNeutralUnits(BWAPI::UnitType unitType); 00254 00255 std::pair<neutral_unit_type_const_iterator, neutral_unit_type_const_iterator> 00256 getNeutralUnits(BWAPI::UnitType unitType) const; 00257 00258 std::pair<neutral_building_iterator, neutral_building_iterator> 00259 getNeutralBuildings(); 00260 00261 std::pair<neutral_building_const_iterator, neutral_building_const_iterator> 00262 getNeutralBuildings() const; 00263 00264 size_t getNbNeutralUnits() const 00265 { 00266 return getNbNeutralUnitsV(); 00267 } 00268 00269 size_t getNbNeutralUnits(BWAPI::UnitType unitType) const 00270 { 00271 return getNbNeutralUnitsV(unitType); 00272 } 00273 00274 size_t getNbNeutralBuildings() const 00275 { 00276 return getNbNeutralBuildingsV(); 00277 } 00278 00279 void updateNeutralBuildings() 00280 { 00281 updateNeutralBuildingsV(); 00282 } 00283 00284 void updateNeutralUnits() 00285 { 00286 updateNeutralUnitsV(); 00287 } 00288 00289 #pragma endregion Neutral_Units 00290 00295 DECLARE_EVENT1(OnOwnUnitAdded, OwnUnit*); 00296 OnOwnUnitAdded& getOwnUnitAddedEvent() const { return m_ownUnitAddedEvent; } 00301 DECLARE_EVENT1(OnOwnUnitRemoved, OwnUnit*); 00302 OnOwnUnitRemoved& getOwnUnitRemovedEvent() const { return m_ownUnitRemovedEvent; } 00303 00309 DECLARE_EVENT1(OnEnemyUnitAdded, EnemyUnit*); 00310 OnEnemyUnitAdded& getEnemyUnitAddedEvent() const { return m_enemyUnitAddedEvent; } 00314 DECLARE_EVENT1(OnEnemyUnitRemoved, EnemyUnit*); 00315 OnEnemyUnitRemoved& getEnemyUnitRemovedEvent() const { return m_enemyUnitRemovedEvent; } 00316 00317 DECLARE_EVENT1(OnNeutralUnitAdded, NeutralUnit*); 00318 OnNeutralUnitAdded& getNeutralUnitAddedEvent() const { return m_neutralUnitAddedEvent; } 00319 00320 DECLARE_EVENT1(OnNeutralUnitRemoved, NeutralUnit*); 00321 OnNeutralUnitRemoved& getNeutralUnitRemovedEvent() const { return m_neutralUnitRemovedEvent; } 00322 00323 protected: 00324 template <class UnitType> 00325 struct UnitManagement 00326 { 00327 }; 00328 template <> 00329 struct UnitManagement<OwnUnit> 00330 { 00331 static BWAPI::UnitType getUnitType(const OwnUnit* ownUnit) 00332 { 00333 return ownUnit->getUnit()->getType(); 00334 } 00335 static Event1<OwnUnit*>& getUnitAddedEvent(StaticLocation* location) 00336 { 00337 return location->m_ownUnitAddedEvent; 00338 } 00339 static Event1<OwnUnit*>& getUnitRemovedEvent(StaticLocation* location) 00340 { 00341 return location->m_ownUnitRemovedEvent; 00342 } 00343 }; 00344 template <> 00345 struct UnitManagement<EnemyUnit> 00346 { 00347 static BWAPI::UnitType getUnitType(const EnemyUnit* enemyUnit) 00348 { 00349 if (enemyUnit->isAccessible()) 00350 return enemyUnit->getUnit()->getType(); 00351 else 00352 return enemyUnit->getLastKnownState().getType(); 00353 } 00354 static Event1<EnemyUnit*>& getUnitAddedEvent(StaticLocation* location) 00355 { 00356 return location->m_enemyUnitAddedEvent; 00357 } 00358 static Event1<EnemyUnit*>& getUnitRemovedEvent(StaticLocation* location) 00359 { 00360 return location->m_enemyUnitRemovedEvent; 00361 } 00362 }; 00363 template <> 00364 struct UnitManagement<NeutralUnit> 00365 { 00366 static BWAPI::UnitType getUnitType(const NeutralUnit* neutralUnit) 00367 { 00368 if (neutralUnit->isAccessible()) 00369 return neutralUnit->getUnit()->getType(); 00370 else 00371 return neutralUnit->getLastKnownState().getType(); 00372 } 00373 static Event1<NeutralUnit*>& getUnitAddedEvent(StaticLocation* location) 00374 { 00375 return location->m_neutralUnitAddedEvent; 00376 } 00377 static Event1<NeutralUnit*>& getUnitRemovedEvent(StaticLocation* location) 00378 { 00379 return location->m_neutralUnitRemovedEvent; 00380 } 00381 }; 00382 template <class UnitType> friend struct UnitManagement; 00383 00384 virtual size_t getNbOwnUnitsV() const = 0; 00385 virtual size_t getNbOwnUnitsV(BWAPI::UnitType unitType) const = 0; 00386 virtual size_t getNbOwnBuildingsV() const = 0; 00387 00388 virtual size_t getNbEnemyUnitsV() const = 0; 00389 virtual size_t getNbEnemyUnitsV(BWAPI::UnitType unitType) const = 0; 00390 virtual size_t getNbEnemyBuildingsV() const = 0; 00391 00392 virtual size_t getNbNeutralUnitsV() const = 0; 00393 virtual size_t getNbNeutralUnitsV(BWAPI::UnitType unitType) const = 0; 00394 virtual size_t getNbNeutralBuildingsV() const = 0; 00395 00396 virtual void updateOwnUnitsV() = 0; 00397 virtual void updateEnemyBuildingsV() = 0; 00398 virtual void updateEnemyUnitsV() = 0; 00399 virtual void updateNeutralBuildingsV() = 0; 00400 virtual void updateNeutralUnitsV() = 0; 00401 00405 const size_t m_id; 00409 CompositeLocation* const m_parent; 00410 00411 EVENT(OnOwnUnitAdded) m_ownUnitAddedEvent; 00412 EVENT(OnOwnUnitRemoved) m_ownUnitRemovedEvent; 00413 00414 EVENT(OnEnemyUnitAdded) m_enemyUnitAddedEvent; 00415 EVENT(OnEnemyUnitRemoved) m_enemyUnitRemovedEvent; 00416 00417 EVENT(OnNeutralUnitAdded) m_neutralUnitAddedEvent; 00418 EVENT(OnNeutralUnitRemoved) m_neutralUnitRemovedEvent; 00419 private: 00420 static size_t s_id; 00421 };