BWAPI
SPAR/AIModule/SparAIModule/DecisionMaking/Layer1Reactive/FSM/Behaviors/Scout.h
Go to the documentation of this file.
00001 #pragma once
00002 #include "../UnitBehavior.h"
00003 #include "../BehaviorState.h"
00004 #include "../Arbitrator.h"
00005 #include "../Conditions/ReachedDestination.h"
00006 
00007 class ScoutFSM : public UnitBehavior<ScoutFSM>
00008 {
00009 protected:
00010   class GoToLocation;
00011   class Scouting;
00012   friend class GoToLocation;
00013   friend class Scouting;
00014 
00015   class RaiseScoutArrived : public TransitionAction
00016   {
00017   public:
00018     RaiseScoutArrived(ScoutFSM* const fsm)
00019       : m_fsm(fsm){}
00020 
00021     void execute()
00022     {
00023       m_fsm->getScoutArrivedEvent().raise();
00024     }
00025 
00026   protected:
00027     ScoutFSM* const m_fsm;
00028   };
00029 
00030 
00031   //State where the scout goes to the requested location
00032   class GoToLocation : public BehaviorState<ScoutFSM, GoToLocation>
00033   {
00034   public:
00035     GoToLocation(ScoutFSM& behavior, Location* location);
00036     void onEnterImpl();
00037     void onExitImpl(){}
00038 
00039     void onTimer()
00040     {
00041       m_transitionToScouting.testTransition(boost::make_tuple());
00042     }
00043 
00044     typedef SCHEDULER_EVENT(GoToLocation, onTimer) TimerEvent;
00045 
00046     typedef boost::tuple<
00047           TimerEvent&
00048           > Events;
00049                 Events m_events;
00050     
00051                 typedef boost::tuple<
00052           Transition<GoToLocation, UnitReachedLocation, RaiseScoutArrived, Scouting>&
00053                   > Transitions;
00054                 Transitions m_transitions;
00055 
00056         protected:
00057     //Variable
00058     //BWAPI::Position m_location;
00059     Location* const m_location;
00060 
00061     // Actions
00062                 layer1::MoveAction m_moveAction;
00063 
00064     //temp event and transition
00065     TimerEvent m_locationReached;
00066                 Transition<GoToLocation, UnitReachedLocation, RaiseScoutArrived, Scouting> m_transitionToScouting;
00067   };
00068 
00069   class Scouting : public BehaviorState<ScoutFSM, Scouting>
00070   {
00071   public:
00072     Scouting(ScoutFSM& behavior, Location* location);
00073     void onEnterImpl();
00074     void onExitImpl() {}
00075 
00076     void onTimer()
00077     {
00078       m_transitionToSelf.testTransition(boost::make_tuple());
00079     }
00080 
00081     typedef SCHEDULER_EVENT(Scouting, onTimer) TimerEvent;
00082 
00083     typedef boost::tuple<
00084         TimerEvent&
00085       > Events;
00086                 const Events m_events;
00087     
00088     typedef boost::tuple<
00089         Transition<Scouting, NoCondition, NoTransitionAction, Scouting>&
00090       > Transitions;
00091                 const Transitions m_transitions;
00092 
00093   protected:
00094     // Variables
00095     int m_maxX;
00096     int m_maxY;
00097     Location* const m_location;
00098     BWTA::Region* m_region;  //TODO: temp... switch to location!
00099 
00100     // Actions
00101     layer1::MoveAction m_moveAction;
00102 
00103     // Transitions
00104     TimerEvent m_newMove;
00105     Transition<Scouting, NoCondition, NoTransitionAction, Scouting> m_transitionToSelf;
00106 
00107     //Other
00108     BWAPI::Position getFleeDestination(double fleeX, double fleeY);
00109   };
00110 
00111 public:
00112   ScoutFSM(const Process* parent, unsigned int initialPriority, Location* location, BWAPI::Unit* scoutingUnit)
00113     : UnitBehavior(parent, initialPriority, scoutingUnit)
00114     , IUnitBehavior(parent, initialPriority, scoutingUnit)
00115     , IBehavior(parent, initialPriority)
00116     , IFSM(parent)
00117     , Process(parent)
00118     , m_scoutingState(*this, location)
00119     , m_goToLocationState(*this, location)
00120     , m_location(location)
00121     , m_states(m_goToLocationState, m_scoutingState)
00122   {
00123     //m_baseRegion = BWTA::getRegion(enemyCC.x()/TILE_SIZE, enemyCC.y()/TILE_SIZE);
00124   }
00125 
00126   virtual std::string getName() const
00127   {
00128     return "ScoutFSM (" + getObjectDescription(m_unit) + ")";
00129   }
00130 
00131   typedef boost::tuple<
00132       GoToLocation&,
00133       Scouting&
00134     > States;
00135         const States m_states;
00136 
00137     DECLARE_EVENT(OnScoutArrived);                           
00138     OnScoutArrived& getScoutArrivedEvent() const { return m_scoutArrivedEvent; }
00139 
00140     DECLARE_EVENT1(OnLocationScouted, PrimitiveLocation*);    //TODO: Not yet implemented
00141     OnLocationScouted& getLocationScoutedEvent() const { return m_locationScoutedEvent; }
00142 
00143 protected:
00144   virtual void executeImpl()
00145   {
00146     UnitBehavior::executeImpl();
00147     //m_scoutingState.onEnter();
00148     m_goToLocationState.onEnter();
00149   }
00150 
00151   // Arguments
00152 
00153   // Variables
00154   //BWAPI::Position m_enemyCC;
00155   //BWTA::Region* m_baseRegion;
00156   Location* const m_location;
00157   
00158   // Events
00159   EVENT(OnScoutArrived) m_scoutArrivedEvent;
00160   EVENT(OnLocationScouted) m_locationScoutedEvent;
00161 
00162   // States
00163   GoToLocation m_goToLocationState;
00164   Scouting m_scoutingState;
00165 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines