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