BWAPI
SPAR/AIModule/SparAIModule/DecisionMaking/Layer2Actions/Managers/ActionsImplementation/L2Recruit.h
Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines