BWAPI
|
00001 #pragma once 00002 #include "../../../../Utils/FSM/Condition.h" 00003 00004 const double MAX_GROUP_DISTANCE_TO_DESTINATION = 128; 00005 00006 const double MAX_UNIT_DISTANCE_TO_DESTINATION = 32; 00007 00008 template<class UnitGroup> 00009 class GroupReachedDestination : public Condition 00010 { 00011 public: 00012 GroupReachedDestination(const UnitGroup* unit,BWAPI::Position destination) 00013 : m_unit(unit),m_destination(destination) 00014 { 00015 } 00016 00017 bool evaluate() const 00018 { 00019 for(UnitGroup::const_iterator it = m_unit->begin(); 00020 it != m_unit->end(); 00021 ++it) 00022 { 00023 if((*it)->getDistance(m_destination) > MAX_GROUP_DISTANCE_TO_DESTINATION) 00024 { 00025 return false; 00026 } 00027 } 00028 return true; 00029 } 00030 00031 protected: 00032 const UnitGroup* const m_unit; 00033 const BWAPI::Position m_destination; 00034 }; 00035 00036 class UnitReachedDestination : public Condition 00037 { 00038 public: 00039 UnitReachedDestination(BWAPI::Unit* unit, BWAPI::Position destination) 00040 : m_unit(unit), m_destination(destination) 00041 { 00042 maxDist = MAX_UNIT_DISTANCE_TO_DESTINATION; 00043 } 00044 00045 UnitReachedDestination(BWAPI::Unit* unit, BWAPI::Position destination, double md) 00046 : m_unit(unit), m_destination(destination) 00047 { 00048 maxDist = md; 00049 } 00050 00051 bool evaluate() const 00052 { 00053 return m_unit->getPosition().getApproxDistance(m_destination) <= maxDist; 00054 } 00055 00056 protected: 00057 const BWAPI::Unit* const m_unit; 00058 const BWAPI::Position m_destination; 00059 double maxDist; 00060 }; 00061 00062 class UnitReachedRegion : public Condition 00063 { 00064 public: 00065 UnitReachedRegion(BWAPI::Unit* unit, BWTA::Region* destination) 00066 : m_unit(unit), m_destination(destination) 00067 {} 00068 00069 bool evaluate(boost::tuple<>&) const 00070 { 00071 return evaluate(); 00072 } 00073 00074 bool evaluate() const 00075 { 00076 return m_destination->getPolygon().isInside(m_unit->getPosition()); 00077 } 00078 00079 protected: 00080 const BWAPI::Unit* const m_unit; 00081 const BWTA::Region* const m_destination; 00082 }; 00083 00084 class UnitReachedLocation : public Condition 00085 { 00086 public: 00087 UnitReachedLocation(BWAPI::Unit* unit, Location* destination) 00088 : m_unit(unit), m_destination(destination) 00089 {} 00090 00091 bool evaluate(boost::tuple<>&) const 00092 { 00093 return evaluate(); 00094 } 00095 00096 bool evaluate() const 00097 { 00098 return m_destination->isInLocation(m_unit->getPosition()); 00099 } 00100 00101 protected: 00102 const BWAPI::Unit* const m_unit; 00103 const Location* const m_destination; 00104 }; 00105 00106 template<class UnitGroup> 00107 class GroupReachedDestinationLocation : public Condition 00108 { 00109 public: 00110 GroupReachedDestinationLocation(const UnitGroup* unit,Location* destination) 00111 : m_unit(unit),m_destination(destination) 00112 { 00113 } 00114 00115 bool evaluate() const 00116 { 00117 for(UnitGroup::const_iterator it = m_unit->begin(); 00118 it != m_unit->end(); 00119 ++it) 00120 { 00121 if((*it)->getDistance(m_destination->getCurrentCenter()) > MAX_GROUP_DISTANCE_TO_DESTINATION) 00122 { 00123 return false; 00124 } 00125 } 00126 return true; 00127 } 00128 00129 protected: 00130 const UnitGroup* const m_unit; 00131 const Location* m_destination; 00132 };