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