|
BWAPI
|
00001 #pragma once 00002 #include "../Layer1FSM.h" 00003 #include "../Conditions/ReachedDestination.h" 00004 #include "../Conditions/BuildingStarted.h" 00005 #include "../UnitBehavior.h" 00006 #include "../BehaviorState.h" 00007 #include "../Arbitrator.h" 00008 00012 class BuildFSM : public UnitBehavior<BuildFSM> 00013 { 00014 protected: 00015 class Goto; 00016 class Clear; 00017 class Build; 00018 class Finish; 00019 friend class Goto; 00020 friend class Clear; 00021 friend class Build; 00022 friend class Finish; 00023 00024 class Goto : public BehaviorState<BuildFSM, Goto> 00025 { 00026 public: 00027 Goto(BuildFSM& behavior); 00028 void onEnterImpl(); 00029 void onExitImpl() {} 00030 00031 void onTimer() 00032 { 00033 Layer1FSM::getInstance().getArbitrator().submitAction(m_context.m_unit, m_moveAction, Arbitration::ActionImportance(*this)); 00034 m_transitionToBuildState.testTransition(boost::make_tuple()); 00035 } 00036 00037 typedef SCHEDULER_EVENT(Goto, onTimer) TimerEvent; 00038 00039 typedef boost::tuple< 00040 TimerEvent& 00041 > Events; 00042 const Events m_events; 00043 00044 typedef boost::tuple< 00045 Transition<Goto, UnitReachedDestination, NoTransitionAction, Build>& 00046 > Transitions; 00047 const Transitions m_transitions; 00048 00049 protected: 00050 // Variables 00051 00052 // Actions 00053 layer1::MoveAction m_moveAction; 00054 00055 // Transitions 00056 TimerEvent m_timerEvent; 00057 Transition<Goto, UnitReachedDestination, NoTransitionAction, Build> m_transitionToBuildState; 00058 }; 00059 00060 class Build : public BehaviorState<BuildFSM, Build> 00061 { 00062 public: 00063 Build(BuildFSM& behavior); 00064 void onEnterImpl(); 00065 void onExitImpl() {} 00066 00067 void onTimer() 00068 { 00069 m_transitionToFinishState.testTransition(boost::make_tuple()); 00070 m_transitionToBuildState.testTransition(boost::make_tuple()); 00071 } 00072 00073 typedef SCHEDULER_EVENT(Build, onTimer) TimerEvent; 00074 00075 typedef boost::tuple< 00076 TimerEvent& 00077 > Events; 00078 const Events m_events; 00079 00080 typedef boost::tuple< 00081 Transition<Build, Not<BuildingStarted>, NoTransitionAction, Build>&, 00082 Transition<Build, BuildingStarted, NoTransitionAction, Finish>& 00083 > Transitions; 00084 const Transitions m_transitions; 00085 protected: 00086 // Variables 00087 00088 // Actions 00089 layer1::BuildAction m_buildAction; 00090 00091 // Transitions 00092 TimerEvent m_timerEvent; 00093 Transition<Build, Not<BuildingStarted>, NoTransitionAction, Build> m_transitionToBuildState; 00094 Transition<Build, BuildingStarted, NoTransitionAction, Finish> m_transitionToFinishState; 00095 }; 00096 00097 /*class Clear : public BehaviorState<BuildFSM, Clear> 00098 { 00099 public: 00100 Clear(BuildFSM& behavior); 00101 void onEnterImpl(); 00102 void onExitImpl() {} 00103 00104 void onTimer() 00105 {} 00106 };*/ 00107 00108 class Finish : public BehaviorState<BuildFSM, Finish> 00109 { 00110 public: 00111 Finish(BuildFSM& behavior); 00112 void onEnterImpl(); 00113 void onExitImpl() {} 00114 00115 void onTimer() 00116 { 00117 m_context.terminate(m_context.Success); 00118 } 00119 00120 typedef SCHEDULER_EVENT(Finish, onTimer) TimerEvent; 00121 00122 typedef boost::tuple< 00123 TimerEvent& 00124 > Events; 00125 const Events m_events; 00126 00127 protected: 00128 // Variables 00129 00130 // Actions 00131 00132 // Transitions 00133 TimerEvent m_timerEvent; 00134 }; 00135 00136 public: 00137 BuildFSM(const Process* parent, unsigned int initialPriority, BWAPI::Unit* buildingUnit, BWAPI::TilePosition buildingTP, BWAPI::UnitType buildingType) 00138 : UnitBehavior(parent, initialPriority, buildingUnit), 00139 IUnitBehavior(parent, initialPriority, buildingUnit), 00140 IBehavior(parent, initialPriority), 00141 IFSM(parent), 00142 Process(parent), 00143 m_gotoState(*this), 00144 m_buildState(*this), 00145 //m_clearState(*this), 00146 m_finishState(*this), 00147 m_buildingTP(buildingTP), 00148 m_buildingType(buildingType), 00149 m_states(m_gotoState, m_buildState, m_finishState) 00150 { 00151 } 00152 00153 virtual std::string getName() const 00154 { 00155 return "Building " + getObjectDescription(m_buildingType) + " with (" + getObjectDescription(m_unit) + ")"; 00156 } 00157 00158 typedef boost::tuple< 00159 Goto&, 00160 Build&, 00161 Finish& 00162 > States; 00163 const States m_states; 00164 00165 protected: 00166 virtual void executeImpl() 00167 { 00168 UnitBehavior::executeImpl(); 00169 m_gotoState.onEnter(); 00170 } 00171 00172 // Variables 00173 BWAPI::TilePosition m_buildingTP; 00174 BWAPI::UnitType m_buildingType; 00175 00176 // States 00177 Goto m_gotoState; 00178 Build m_buildState; 00179 //Clear m_clearState; 00180 Finish m_finishState; 00181 };
1.7.6.1