BWAPI
|
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 };