BWAPI
|
00001 #pragma once 00002 #include "../../../../Scheduler/SchedulerTask.h" 00003 #include "../../Interface/Actions/Recruit.h" 00004 #include "L2TacticalAction.h" 00005 #include "../Layer2ManagersBase.h" 00006 00007 class L2IndividualRecruit; 00008 00009 class L2Recruit : public virtual layer2::Recruit, public L2TacticalAction 00010 { 00011 friend L2IndividualRecruit; 00012 public: 00013 static const size_t RECRUIT_TIMEOUT = 20; 00014 00015 typedef std::list<L2IndividualRecruit*> RecruitListType; 00016 typedef RecruitListType::iterator RecruitListID; 00017 00018 L2Recruit(unsigned int priority, StaticLocation* location, const std::map<BWAPI::UnitType, size_t>& unitTypes, bool isInfinite = false) 00019 : Recruit(priority, location, unitTypes, isInfinite) 00020 , L2TacticalAction(priority) 00021 , TacticalAction(priority) 00022 , Process(Spar) 00023 , m_canceled(false) 00024 , m_isInfinite(isInfinite) 00025 {} 00026 00027 L2Recruit(unsigned int priority, StaticLocation* location, BWAPI::UnitType unitType, bool isInfinite = false) 00028 : Recruit(priority, location, unitType, isInfinite) 00029 , L2TacticalAction(priority) 00030 , TacticalAction(priority) 00031 , Process(Spar) 00032 , m_canceled(false) 00033 , m_isInfinite(isInfinite) 00034 {} 00035 00036 ~L2Recruit(); 00037 00038 protected: 00039 virtual void executeSpecificImpl(); 00040 virtual void cancelSpecificImpl(); 00041 virtual void terminateSpecificImpl(); 00042 00043 void individualRecruitTerminated(RecruitListID id); 00044 void individualRecruitStarted(RecruitListID id); 00045 00046 bool m_isInfinite; 00047 bool m_canceled; 00048 00049 RecruitListType m_individualRecruits; 00050 }; 00051 00052 class L2IndividualRecruit : public Component 00053 { 00054 public: 00055 L2IndividualRecruit(L2Recruit* l2Recruit, BWAPI::UnitType unitType) 00056 : Component() 00057 , m_timeoutEvent(*this, Scheduler::SCHEDULING_MEDIUM_PRIORITY,1,0) 00058 , m_l2Recruit(l2Recruit) 00059 , m_unitToBuild(unitType) 00060 , m_resourceAllocatedEventHandler(*this) 00061 , m_unitCreatedEventHandler(*this) 00062 , m_unitCompletedEventHandler(*this) 00063 , m_unitDestroyedEventHandler(*this) 00064 , m_buildingDestroyedEventHandler(*this) 00065 , m_buildingToUse(NULL) 00066 , m_unitInConstruction(NULL) 00067 , m_currentState(UNINITIALIZED) 00068 , m_canceled(false) 00069 , m_resourcesRequestID(m_resourceAllocatedEventHandler) 00070 {} 00071 00072 void execute(L2Recruit::RecruitListID it); 00073 void cancel(bool cancelCurrentUnit); 00074 void terminate(); 00075 BWAPI::UnitType getUnitToBuild() { return m_unitToBuild; } 00076 00077 void onResourcesAllocated(void* data, BWAPI::Unit* building); 00078 void onTimeout(); 00079 void onUnitCreated(void* data, BWAPI::Unit* unit); 00080 void onUnitCompleted(void* data, BWAPI::Unit* unit); 00081 void onUnitDestroyed(void* data); 00082 void onBuildingDestroyed(void* data); 00083 00084 protected: 00085 void requestResources(); 00086 void recruitDone(); 00087 void recruitFailed(); 00088 00089 enum RecruitState 00090 { 00091 UNINITIALIZED, 00092 WAITING_FOR_TECH, 00093 WAITING_FOR_RESOURCES, 00094 ACTION_SENT, 00095 UNIT_CREATED, 00096 WAITING_TO_FINISH, 00097 TERMINATED 00098 }; 00099 00100 RecruitState m_currentState; 00101 bool m_canceled; 00102 BWAPI::Unit* m_buildingToUse; 00103 BWAPI::UnitType m_unitToBuild; 00104 BWAPI::Unit* m_unitInConstruction; 00105 L2Recruit* m_l2Recruit; 00106 L2Recruit::RecruitListID m_id; 00107 00108 SCHEDULER_EVENT(L2IndividualRecruit,onTimeout) m_timeoutEvent; 00109 Event<boost::tuples::tuple<BWAPI::Unit*>>::SubscriberID m_unitCreatedSubscriberId; 00110 Event<boost::tuples::tuple<BWAPI::Unit*>>::SubscriberID m_unitCompletedSubscriberId; 00111 Event<boost::tuples::tuple<>>::SubscriberID m_unitDestroyedSubscriberId; 00112 Event<boost::tuples::tuple<>>::SubscriberID m_buildingDestroyedSubscriberId; 00113 Layer2ManagersBase::ResourcesRequestID m_resourcesRequestID; 00114 00115 EVENT_HANDLER1(L2IndividualRecruit, onResourcesAllocated, BWAPI::Unit*) m_resourceAllocatedEventHandler; 00116 EVENT_HANDLER1(L2IndividualRecruit, onUnitCreated, BWAPI::Unit*) m_unitCreatedEventHandler; 00117 EVENT_HANDLER1(L2IndividualRecruit, onUnitCompleted, BWAPI::Unit*) m_unitCompletedEventHandler; 00118 EVENT_HANDLER(L2IndividualRecruit, onUnitDestroyed) m_unitDestroyedEventHandler; 00119 EVENT_HANDLER(L2IndividualRecruit, onBuildingDestroyed) m_buildingDestroyedEventHandler; 00120 }; 00121