BWAPI
|
00001 #pragma once 00002 #include "../../../Scheduler/Scheduler.h" 00003 #include "../../../SituationAnalysis/Layer1GameState/Layer1GameState.h" 00004 #include "../../../Utils/SafeListAdaptor.h" 00005 #include "../Layer1Reactive.h" 00006 #include "Layer1FSMUnitData.h" 00007 #include "Arbitrator.h" 00008 00009 class Layer1FSM : public Layer1Reactive<Layer1GameState> 00010 { 00011 protected: 00012 // struct BehaviorWrapper 00013 // { 00014 // BehaviorWrapper(IBehavior* behavior) 00015 // : m_behavior(behavior) 00016 // { 00017 // } 00018 // SafeList<BehaviorWrapper>::iterator m_id; 00019 // IBehavior* m_behavior; 00020 //#ifdef _DEBUG_COMPONENT 00021 // IFSM::OnTerminate::SubscriberID m_subscriberID; 00022 //#endif 00023 // }; 00024 // struct extract_behavior : std::unary_function<BehaviorWrapper,const IBehavior*> 00025 // { 00026 // const IBehavior* operator()(const BehaviorWrapper& behaviorWrapper) const 00027 // { 00028 // return behaviorWrapper.m_behavior; 00029 // } 00030 // }; 00031 public: 00032 Layer1FSM(Layer1GameState& layer1GameState) 00033 : Layer1Reactive(layer1GameState) 00034 //, m_behaviorTerminateEventHandler(*this) 00035 { 00036 s_instance = this; 00037 } 00038 ~Layer1FSM() 00039 { 00040 //assert(m_behaviors.empty()); 00041 } 00042 void onStart() 00043 { 00044 Layer1Reactive::onStart(); 00045 m_arbitrator.onStart(); 00046 } 00047 void onFrame() 00048 { 00049 Layer1Reactive::onFrame(); 00050 m_arbitrator.onFrame(); 00051 } 00052 void onEnd() 00053 { 00054 Layer1Reactive::onEnd(); 00055 m_arbitrator.onEnd(); 00056 00057 //m_behaviors.for_each(TerminateBehavior()); 00058 } 00059 void onSendText(std::string text) 00060 { 00061 } 00062 00063 Arbitration& getArbitrator() { return m_arbitrator; } 00064 static Layer1FSM& getInstance() { return *s_instance; } 00065 00066 typedef Layer1FSMUnitData L1UnitData; 00067 00068 //void onBehaviorStarted(IBehavior* behavior); 00069 00070 //void onBehaviorTerminate(void* data); 00071 00073 // GUI // 00075 //typedef boost::transform_iterator<extract_behavior, ConstSafeListAdaptor<BehaviorWrapper>::const_iterator> BehaviorIterator; 00076 //std::pair<BehaviorIterator, BehaviorIterator> getCurrentBehaviors() const 00077 //{ 00078 // ConstSafeListAdaptor<BehaviorWrapper> adaptor(m_behaviors); 00079 // return std::make_pair(BehaviorIterator(adaptor.unsafe_begin()), BehaviorIterator(adaptor.unsafe_end())); 00080 //} 00081 00082 protected: 00083 //struct TerminateBehavior 00084 //{ 00085 // SafeListBase::ConstFunctionReturn operator()(const BehaviorWrapper& behaviorWrapper) const 00086 // { 00087 // behaviorWrapper.m_behavior->externalTerminate(); 00088 // return SafeListBase::ConstFunctionReturn(); 00089 // } 00090 //}; 00091 00092 // I know I know this is bad design... but I don't feel like passing the instance around. 00093 static Layer1FSM* s_instance; 00094 00095 Arbitration m_arbitrator; 00096 00097 //EVENT_HANDLER(Layer1FSM, onBehaviorTerminate) m_behaviorTerminateEventHandler; 00098 00099 //SafeList<BehaviorWrapper> m_behaviors; 00100 };