BWAPI
SPAR/AIModule/SparAIModule/DecisionMaking/Layer2Actions/Managers/ActionsImplementation/L2Defend.h
Go to the documentation of this file.
00001 #pragma once
00002 #include "../../Interface/Actions/Defend.h"
00003 #include "../../../Layer1Reactive/FSM/Behaviors/EngageEnemies/GroupAttack.h"
00004 #include "L2GroupTacticalAction.h"
00005 
00006 // TODO: possibly more than two locations so units can patrol?
00007 
00008 class L2Defend : public virtual layer2::Defend, public L2GroupTacticalAction
00009 {
00010 public:
00011   L2Defend(unsigned int priority, const PersistentUnitGroup* initialGroup, Location* location)
00012     : Defend(priority, initialGroup, location)
00013     , L2GroupTacticalAction(priority, initialGroup)
00014     , GroupTacticalAction(priority, initialGroup)
00015     , TacticalAction(priority)
00016     , Process(Spar)
00017     , m_groupAttackFSM(*this)
00018     , m_onEnemyAddedEventHandler(*this)
00019     , m_onBuildingAddedEventHandler(*this)
00020     , m_onEnemyRemovedEventHandler(*this)
00021   {
00022     m_currentLocation = NULL;
00023     m_currentPosition = NULL;
00024   }
00025 
00026   ~L2Defend()
00027   {
00028     delete m_currentPosition;
00029   }
00030 
00031   //void onTerminate(void* data);
00032   void onEnemyAdded(void* data, EnemyUnit*);
00033   StaticLocation* regionAttackedByEnemy();
00034   void onBuildingAdded(void* data, OwnUnit*);
00035   void onEnemyRemoved(void* data, EnemyUnit*);
00036 
00037 protected:
00038   virtual void executeSpecificImpl();
00039   virtual void cancelSpecificImpl();
00040   virtual void terminateSpecificImpl();
00041   virtual void onUnitAddedToGroup(void*, BWAPI::Unit* unit);
00042   virtual void onUnitRemovedFromGroup(void*, BWAPI::Unit* unit);
00043   void unsubscribeAllEnemyUnitAdded();
00044   void subscribeEnemyUnitAdded(StaticLocation* cl);
00045   void subscribeBegin();
00046 
00047   Event<boost::tuples::tuple<OwnUnit*>>::SubscriberID m_onBuildingAddedSubscriberId;
00048   Event<boost::tuples::tuple<EnemyUnit*>>::SubscriberID m_onEnemyAddedSubscriberId;
00049   Event<boost::tuples::tuple<EnemyUnit*>>::SubscriberID m_onEnemyRemovedSubscriberId;
00050   //Event<boost::tuples::tuple<>>::SubscriberID m_onTerminateSubscriberId;
00051 
00052   EVENT_HANDLER1(L2Defend, onBuildingAdded, OwnUnit*) m_onBuildingAddedEventHandler;
00053   EVENT_HANDLER1(L2Defend, onEnemyAdded, EnemyUnit*) m_onEnemyAddedEventHandler;
00054   EVENT_HANDLER1(L2Defend, onEnemyRemoved, EnemyUnit*) m_onEnemyRemovedEventHandler;
00055   //EVENT_HANDLER(L2Defend, onTerminate) m_onTerminateEventHandle;
00056 
00057 private:
00058   ProcessContainer<GroupAttack> m_groupAttackFSM;
00059   bool waiting;
00060   StaticLocation* m_currentLocation;
00061   BWAPI::Position* m_currentPosition;
00062   EnemyUnit* m_currentTarget;
00063   std::map<StaticLocation*,Event<boost::tuples::tuple<EnemyUnit*>>::SubscriberID> mapSubscription;
00064 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines