BWAPI
SPAR/AIModule/SparAIModule/UnitManager.h
Go to the documentation of this file.
00001 #pragma once
00002 #include "UnitData.h"
00003 #include "Utils/Event.h"
00004 #include <BWAPI.h>
00005 #include <list>
00006 
00007 class PrimitiveLocation;
00008 
00012 class UnitManager
00013 {
00014 public:
00015   ~UnitManager();
00016 
00017   void onStart() {}
00018 
00019   void onFrame() {}
00020 
00021   void onEnd() {}
00022 
00023   void onUnitDiscover(BWAPI::Unit*) {}
00024   void onUnitEvade(BWAPI::Unit* unit)
00025   {
00026     UnitData* unitData = reinterpret_cast<UnitData*>(unit->getClientInfo());
00027     if (unitData != NULL)
00028     {
00029       unitData->m_individualUnitEvadeEvent.raise();
00030     }
00031   }
00032   void onUnitShow(BWAPI::Unit*) {}
00033   void onUnitHide(BWAPI::Unit*) {}
00034   void onUnitCreate(BWAPI::Unit*) {}
00040   void onUnitDestroy(BWAPI::Unit* unit);
00041   void onUnitMorph(BWAPI::Unit* unit)
00042   {
00043     UnitData* unitData = reinterpret_cast<UnitData*>(unit->getClientInfo());
00044     if (unitData != NULL)
00045     {
00046       unitData->m_individualUnitMorphEvent.raise();
00047     }
00048   }
00049   void onUnitRenegade(BWAPI::Unit* unit)
00050   {
00051     UnitData* unitData = reinterpret_cast<UnitData*>(unit->getClientInfo());
00052     if (unitData != NULL)
00053     {
00054       unitData->m_individualUnitRenegadeEvent.raise();
00055     }
00056   }
00057 
00058   UnitData& getUnitData(BWAPI::Unit* unit);
00059 
00060   PrimitiveLocation* getUnitLocation(BWAPI::Unit* unit)
00061   {
00062     return getUnitData(unit).m_location;
00063   }
00064 
00065   void setUnitLocation(BWAPI::Unit* unit, PrimitiveLocation* location, void* data)
00066   {
00067     UnitData& unitData = getUnitData(unit);
00068     unitData.m_location = location;
00069     unitData.m_data = data;
00070   }
00071 
00072   typedef UnitData::OnIndividualUnitDestroy OnIndividualUnitDestroy;
00073   OnIndividualUnitDestroy::SubscriberID subscribeIndividualUnitDestroy(BWAPI::Unit* unit, OnIndividualUnitDestroy::EventHandlerType* eventHandler, void* data)
00074   {
00075     return getUnitData(unit).m_individualUnitDestroyEvent.subscribe(eventHandler, data);
00076   }
00077   void unsubscribeIndividualUnitDestroy(BWAPI::Unit* unit, OnIndividualUnitDestroy::SubscriberID& id)
00078   {
00079     UnitData* unitData = reinterpret_cast<UnitData*>(unit->getClientInfo());
00080     if (unitData != NULL)
00081     {
00082       unitData->m_individualUnitDestroyEvent.unsubscribe(id);
00083     }
00084   }
00085 
00086   typedef UnitData::OnIndividualUnitEvade OnIndividualUnitEvade;
00087   OnIndividualUnitEvade::SubscriberID subscribeIndividualUnitEvade(BWAPI::Unit* unit, OnIndividualUnitEvade::EventHandlerType* eventHandler, void* data)
00088   {
00089     return getUnitData(unit).m_individualUnitEvadeEvent.subscribe(eventHandler, data);
00090   }
00091   void unsubscribeIndividualUnitEvade(BWAPI::Unit* unit, OnIndividualUnitEvade::SubscriberID& id)
00092   {
00093     UnitData* unitData = reinterpret_cast<UnitData*>(unit->getClientInfo());
00094     if (unitData != NULL)
00095     {
00096       unitData->m_individualUnitEvadeEvent.unsubscribe(id);
00097     }
00098   }
00099 
00100   typedef UnitData::OnIndividualUnitMorph OnIndividualUnitMorph;
00101   OnIndividualUnitMorph::SubscriberID subscribeIndividualUnitMorph(BWAPI::Unit* unit, OnIndividualUnitMorph::EventHandlerType* eventHandler, void* data)
00102   {
00103     return getUnitData(unit).m_individualUnitMorphEvent.subscribe(eventHandler, data);
00104   }
00105   void unsubscribeIndividualUnitMorph(BWAPI::Unit* unit, OnIndividualUnitMorph::SubscriberID& id)
00106   {
00107     UnitData* unitData = reinterpret_cast<UnitData*>(unit->getClientInfo());
00108     if (unitData != NULL)
00109     {
00110       unitData->m_individualUnitMorphEvent.unsubscribe(id);
00111     }
00112   }
00113 
00114   typedef UnitData::OnIndividualUnitRenegade OnIndividualUnitRenegade;
00115   OnIndividualUnitRenegade::SubscriberID subscribeIndividualUnitRenegade(BWAPI::Unit* unit, OnIndividualUnitRenegade::EventHandlerType* eventHandler, void* data)
00116   {
00117     return getUnitData(unit).m_individualUnitRenegadeEvent.subscribe(eventHandler, data);
00118   }
00119   void unsubscribeIndividualUnitRenegade(BWAPI::Unit* unit, OnIndividualUnitRenegade::SubscriberID& id)
00120   {
00121     UnitData* unitData = reinterpret_cast<UnitData*>(unit->getClientInfo());
00122     if (unitData != NULL)
00123     {
00124       unitData->m_individualUnitRenegadeEvent.unsubscribe(id);
00125     }
00126   }
00127 
00128 protected:
00129   virtual UnitData* instantiateUnitData(BWAPI::Unit* unit) const = 0;
00130 
00131 private:
00132   // Optimization: chain the UnitData to each other?
00133   std::list<UnitData*> m_unitDataList;
00134 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines