BWAPI
|
00001 #pragma once 00002 #include "Layer3Task.h" 00003 00004 // 00005 // Input: gas/mineral ratio 00006 // 00007 00008 class ManageArmyTask : public Layer3Task 00009 { 00010 private: 00011 struct UnitPower 00012 { 00013 UnitPower() 00014 : AttackPower(0) 00015 , HitPointPower(0) 00016 {}UnitPower(double attackPower, double hitPointPower) 00017 : AttackPower(attackPower) 00018 , HitPointPower(hitPointPower) 00019 {} 00020 double AttackPower; 00021 double HitPointPower; 00022 }; 00023 00024 struct RegionWrapper 00025 { 00026 RegionWrapper(Region* region) 00027 : region(region) 00028 , lastVisitedFrame(0) 00029 , fromRegion(NULL) 00030 {} 00031 Region* region; 00032 RegionWrapper* fromRegion; 00033 int lastVisitedFrame; 00034 }; 00035 00036 public: 00037 ManageArmyTask(Layer3Script& layer3Script) 00038 : Layer3Task(layer3Script) 00039 , m_attackMoveEndedEventHandler(*this) 00040 , m_unitMorphCompletedEventHandler(*this) 00041 , m_scoutArrivedEventHandler(*this) 00042 , m_army(new PersistentUnitGroup("army"), *this) 00043 , m_defendGroup(new PersistentUnitGroup("Defenders"), *this) 00044 , m_attackGroup(new PersistentUnitGroup("Attackers"), *this) 00045 , m_highTemplars(new PersistentUnitGroup("High Templars"), *this) 00046 , m_attackingObservers(new PersistentUnitGroup("Attacking Observers"), *this) 00047 , m_defendingObservers(new PersistentUnitGroup("Defending Observers"), *this) 00048 , m_scoutingObservers(new PersistentUnitGroup("Scouting Observers"), *this) 00049 , m_attackAction(NULL) 00050 , m_defendAction(*this) 00051 , m_scout(*this) 00052 , m_mainRegion(NULL) 00053 , m_goalRegionAttack(NULL) 00054 , m_currentRegionAttack(NULL) 00055 { 00056 } 00057 00058 ~ManageArmyTask() 00059 { 00060 for(stdext::hash_map<Region*, RegionWrapper*>::iterator it = m_regionWrappers.begin(); it != m_regionWrappers.end(); ++it) 00061 delete (it->second); 00062 } 00063 00064 00065 void run(); 00066 00067 virtual void runV() 00068 { 00069 run(); 00070 } 00071 00072 void addUnit(BWAPI::Unit* unit); 00073 00074 Scout* getNewScout(BWAPI::Unit* scout); 00075 void onAttackMoveEnded(void* data); 00076 void OnUnitMorphCompleted(void* data, BWAPI::Unit* unit); 00077 void onScoutArrived(void* data, const layer2::Scout* action, StaticLocation* arrivedAtLocation, BWAPI::Unit* unit); 00078 00079 private: 00080 RegionWrapper* ManageArmyTask::getAttackLocation(RegionWrapper* fromRegion, UnitPower armyPower, bool canBeDetected, double groundRatio, double minSuperiorityRatio); 00081 ManageArmyTask::UnitPower ManageArmyTask::getUnitPower(BWAPI::UnitType unitType, bool ownUnit, bool canBeDetected, double groundOnlyRatio) const; 00082 00083 EVENT_HANDLER(ManageArmyTask, onAttackMoveEnded) m_attackMoveEndedEventHandler; 00084 Event<boost::tuples::tuple<>>::SubscriberID m_attackMoveEndedSubscriberId; 00085 EVENT_HANDLER1(ManageArmyTask, OnUnitMorphCompleted, BWAPI::Unit*) m_unitMorphCompletedEventHandler; 00086 Event<boost::tuples::tuple<BWAPI::Unit*>>::SubscriberID m_unitMorphCompletedSubscriberId; 00087 EVENT_HANDLER3(ManageArmyTask, onScoutArrived, const layer2::Scout*, StaticLocation*,BWAPI::Unit*) m_scoutArrivedEventHandler; 00088 00089 stdext::hash_map<Region*, RegionWrapper*> m_regionWrappers; 00090 RegionWrapper* m_mainRegion; 00091 RegionWrapper* m_goalRegionAttack; 00092 RegionWrapper* m_currentRegionAttack; 00093 00094 // Actions 00095 AttackMove* m_attackAction; 00096 ProcessContainer<Defend> m_defendAction; 00097 ProcessContainer<Scout> m_scout; 00098 00099 // Groups 00100 AutoPtr<PersistentUnitGroup> m_army; 00101 AutoPtr<PersistentUnitGroup> m_attackGroup; 00102 AutoPtr<PersistentUnitGroup> m_defendGroup; 00103 AutoPtr<PersistentUnitGroup> m_highTemplars; 00104 00105 AutoPtr<PersistentUnitGroup> m_attackingObservers; 00106 AutoPtr<PersistentUnitGroup> m_defendingObservers; 00107 AutoPtr<PersistentUnitGroup> m_scoutingObservers; 00108 00109 void executeScout(Scout* scout); 00110 };