BWAPI
SPAR/AIModule/SparAIModule/DecisionMaking/Layer1Reactive/FSM/Conditions/ReachedDestination.h
Go to the documentation of this file.
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 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines