BWAPI
|
00001 #pragma once 00002 #include "../../Interface/Actions/Build.h" 00003 #include "../../../Layer1Reactive/FSM/Behaviors/BuildFSM.h" 00004 #include "../NewBuildingPlacer.h" 00005 #include "L2GroupTacticalAction.h" 00006 00007 // TODO: cancel building if it is about to get destroyed 00008 // TODO: build actions sometimes hang (and nothing ever happens) 00009 00010 class L2Build : public virtual layer2::Build, public L2GroupTacticalAction 00011 { 00012 public: 00019 L2Build(unsigned int priority, StaticLocation* location, BWAPI::UnitType buildingType) 00020 : Build(priority, location, buildingType) 00021 , L2GroupTacticalAction(priority) 00022 , GroupTacticalAction(priority) 00023 , TacticalAction(priority) 00024 , Process(Spar) 00025 , m_event(*this,priority,0,buildingType.buildTime()-2) 00026 , m_resourceAllocatedEventHandler(*this) 00027 , m_unitCreatedEventHandler(*this) 00028 , m_unitCompletedEventHandler(*this) 00029 , m_buildFSM(*this) 00030 , m_resourcesRequestID(m_resourceAllocatedEventHandler) 00031 , m_reservingResources(false) 00032 , m_unitDestroyedEventHandler(*this) 00033 { 00034 m_buildingPlacer = NewBuildingPlacer::getInstance(); 00035 m_building = NULL; 00036 m_worker = NULL; 00037 } 00038 00039 virtual ActionResources getPendingResourcesConsumption() const 00040 { 00041 if(m_building == NULL) 00042 { 00043 return ActionResources(Resources(m_buildingType)); 00044 } 00045 else 00046 { 00047 return ActionResources(0,0,0); 00048 } 00049 } 00050 00051 void buildingStarted() 00052 { 00053 //--m_pendingNb; 00054 } 00055 00056 void onResourcesAllocated(void* data, BWAPI::Unit* b); 00057 void onTimeout(); 00058 void onUnitCreated(void* data, OwnUnit*); 00059 void onUnitDestroyed(void* data); 00060 00061 protected: 00062 virtual void executeSpecificImpl(); 00063 virtual void cancelSpecificImpl(); 00064 virtual void terminateSpecificImpl(); 00065 00066 virtual void onUnitAddedToGroup(void*, BWAPI::Unit* unit); 00067 virtual void onUnitRemovedFromGroup(void*, BWAPI::Unit* unit); 00068 00069 bool asCommanded(BWAPI::Unit* unit); 00070 void onUnitCompleted(void* data, BWAPI::Unit* unit); 00071 void addReservation(BWAPI::TilePosition tp); 00072 BWAPI::Unit* findClosestWorker(BWAPI::TilePosition tp); 00073 00074 BWAPI::Unit* m_building; 00075 BWAPI::Unit* m_worker; 00076 BWAPI::TilePosition m_buildingTP; 00077 NewBuildingPlacer* m_buildingPlacer; 00078 bool m_reservingResources; 00079 00080 ProcessContainer<BuildFSM> m_buildFSM; 00081 SCHEDULER_EVENT(L2Build,onTimeout) m_event; 00082 Event<boost::tuples::tuple<OwnUnit*>>::SubscriberID m_unitCreatedSubscriberId; 00083 Event<boost::tuples::tuple<BWAPI::Unit*>>::SubscriberID m_unitCompletedSubscriberId; 00084 Layer2ManagersBase::ResourcesRequestID m_resourcesRequestID; 00085 Event<boost::tuples::tuple<>>::SubscriberID m_unitDestroyedSubscriberId; 00086 00087 00088 EVENT_HANDLER(L2Build, onUnitDestroyed) m_unitDestroyedEventHandler; 00089 EVENT_HANDLER1(L2Build, onResourcesAllocated, BWAPI::Unit*) m_resourceAllocatedEventHandler; 00090 EVENT_HANDLER1(L2Build, onUnitCreated, OwnUnit*) m_unitCreatedEventHandler; 00091 EVENT_HANDLER1(L2Build, onUnitCompleted, BWAPI::Unit*) m_unitCompletedEventHandler; 00092 };