BWAPI
SPAR/AIModule/SparAIModule/DecisionMaking/Layer1Reactive/FSM/Behavior.h
Go to the documentation of this file.
00001 #pragma once
00002 #include "../../../Utils/FSM/FSM.h"
00003 #include "../../../Utils/Functors.hpp"
00004 // Some centralized header file inclusions...
00005 #include "../../../Common.h"
00006 #include "../../../PerceptualState/PerceptualState.h"
00007 #include "../../../PerceptualState/Locations/Common.h"
00008 #include "Actions/AttackMoveAction.h"
00009 #include "Actions/BuildAction.h"
00010 #include "Actions/AttackUnitAction.h"
00011 #include "Actions/MoveAction.h"
00012 #include "Actions/StopAction.h"
00013 #include "Actions/LoadUnit.h"
00014 #include "Actions/UnloadAllUnitsAtPosition.h"
00015 
00016 class Layer1FSM;
00017 
00028 class IBehavior : public virtual IFSM
00029 // protected inheritance to avoid exposing FSM-named methods, will change to public if it causes problems
00030 {
00031 public:
00032   template <class FSM, class DerivedState> friend class FSMState;
00033   template <class Behavior, class DerivedState> friend class BehaviorState;
00034   //typedef boost::transform_iterator<convert_fsm_to_behavior, sub_fsm_const_iterator> sub_behavior_const_iterator;
00035   //typedef boost::transform_iterator<convert_fsm_to_behavior, sub_fsm_iterator> sub_behavior_iterator;
00036 
00042   IBehavior(const Process* parent, unsigned int initialPriority)
00043     : IFSM(parent)
00044     , Process(parent)
00045     , m_id(s_nextId++)
00046     , m_currentPriority(initialPriority)
00047   {
00048   }
00049 
00053   virtual ~IBehavior() {}
00054 
00058   virtual std::string getName() const = 0;
00059 
00060   // DON'T CALL THESE METHODS IF A SUB-BEHAVIOR MAY BE ADDED/REMOVED!
00061   //sub_behavior_const_iterator subBehaviorBegin() const { return sub_behavior_const_iterator(FSM::subFSMBegin()); }
00062   //sub_behavior_const_iterator subBehaviorEnd() const { return sub_behavior_const_iterator(FSM::subFSMEnd()); }
00063 
00067   unsigned int getCurrentPriority() const
00068   {
00069     return m_currentPriority;
00070   }
00071 
00072 protected:
00073   virtual void output(std::ostream& out) const
00074   {
00075     out << "#" << m_id << " (P" << m_currentPriority << ")- " << getName();
00076   }
00077 
00081   virtual void executeImpl()
00082   {
00083     SPAR_LOG(LogTypes::LAYER_1_DECISION, "Starting behavior: \"%s\"", getName().c_str());
00084     IFSM::executeImpl();
00085   }
00086 
00087   virtual void terminateImpl()
00088   {
00089     SPAR_LOG(LogTypes::LAYER_1_DECISION, "Terminating behavior: \"%s\"", getName().c_str());
00090     IFSM::terminateImpl();
00091   }
00092 
00093   // DON'T CALL THESE METHODS IF A SUB-BEHAVIOR MAY BE ADDED/REMOVED!
00094   //sub_behavior_iterator subBehaviorBegin() { return sub_behavior_iterator(FSM::subFSMBegin()); }
00095   //sub_behavior_iterator subBehaviorEnd() { return sub_behavior_iterator(FSM::subFSMEnd()); }
00096 
00097   template <class Function>
00098   Function for_each_sub_behavior(Function function)
00099   {
00100     return for_each_child_process(function);
00101   }
00102 
00103   //
00104   // Variables
00105   //
00106 
00110   unsigned int m_currentPriority;
00111 
00112   const unsigned int m_id;
00113 
00114 private:
00115   static unsigned int s_nextId;
00116 
00117   IBehavior(const IBehavior& other);
00118 };
00119 
00120 template <class DerivedBehavior>
00121 class Behavior : public virtual IBehavior, public FSM<DerivedBehavior>
00122 {
00123 public:
00124   Behavior(const Process* parent, unsigned int initialPriority)
00125     : IBehavior(parent, initialPriority)
00126     , FSM(parent)
00127     , IFSM(parent)
00128     , Process(parent)
00129   {
00130   }
00131 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines