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