BWAPI
SPAR/AIModule/SparAIModule/DecisionMaking/Layer1Reactive/FSM/Behaviors/BuildFSM.h
Go to the documentation of this file.
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 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines