BWAPI
|
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 };