BWAPI
SPAR/AIModule/SparAIModule/SparAIModule.h
Go to the documentation of this file.
00001 #pragma once
00002 #include "SparAIContainer.h"
00003 #include "PerceptualState/PerceptualState.h"
00004 #include "Scheduler/Scheduler.h"
00005 #include "Scheduler/Timer.h"
00006 #include "SparObserver.h"
00007 #include "UnitManagerImpl.h"
00008 #include "Utils/Logger.h"
00009 #include "Scheduler/Timer.h"
00010 
00011 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00012 class SparAIModule : public SparAIContainer
00013 {
00014 public:
00015   SparAIModule();
00016   ~SparAIModule();
00017 
00018   S1& getS1() { return *m_layer1SituationAnalysis; }
00019   S2& getS2() { return *m_layer2SituationAnalysis; }
00020   S3& getS3() { return *m_layer3SituationAnalysis; }
00021   S4& getS4() { return *m_layer4SituationAnalysis; }
00022 
00023   D1& getD1() { return m_layer1DecisionMaking; }
00024   D2& getD2() { return m_layer2DecisionMaking; }
00025   D3& getD3() { return m_layer3DecisionMaking; }
00026   D4& getD4() { return m_layer4DecisionMaking; }
00027 
00028   void addObserver(SparObserver* observer)
00029   {
00030     m_observers.push_back(observer);
00031   }
00032 
00033   virtual void onStart();
00034   virtual void onEnd(bool isWinner);
00035   virtual void onFrame();
00036   virtual void onSendText(std::string text);
00037 
00038   virtual void onUnitDiscover(BWAPI::Unit* unit);
00039   virtual void onUnitEvade(BWAPI::Unit* unit);
00040   virtual void onUnitShow(BWAPI::Unit* unit);
00041   virtual void onUnitHide(BWAPI::Unit* unit);
00042   virtual void onUnitCreate(BWAPI::Unit* unit);
00043   virtual void onUnitDestroy(BWAPI::Unit* unit);
00044   virtual void onUnitMorph(BWAPI::Unit* unit);
00045   virtual void onUnitRenegade(BWAPI::Unit* unit);
00046 
00047   void showStats();
00048   void showPlayers();
00049   void showForces();
00050 
00052   // GUI //
00054   virtual std::set<BWAPI::Unit*> getCommandedUnits() const
00055   {
00056     return std::set<BWAPI::Unit*>();
00057   }
00058 
00059 protected:
00060 
00061 #pragma region SparLocations
00062 
00063   struct LocationTypes
00064   {
00065     class SparAirLocation : public D2::LocationTypes<AirLocation>::Type, 
00066                             public D3::LocationTypes<AirLocation>::Type,
00067                             public virtual AirLocation
00068     {
00069     public:
00070       SparAirLocation(Map* parent)
00071         : D2::LocationTypes<AirLocation>::Type((LocationTypes*)NULL, parent)
00072         , D3::LocationTypes<AirLocation>::Type((LocationTypes*)NULL, parent)
00073         , AirLocation((LocationTypes*)NULL, parent)
00074         , PrimitiveLocation(parent)
00075         , StaticLocation(parent)
00076       {}
00077       virtual BWAPI::Position getCurrentCenter() const { return AirLocation::getCurrentCenter(); }
00078     protected:
00079       //virtual void output(std::ostream& out) const { AirLocation::output(out); }
00080     };
00081 
00082     class SparBaseLocation : public D2::LocationTypes<BaseLocation>::Type, 
00083                              public D3::LocationTypes<BaseLocation>::Type,
00084                              public virtual BaseLocation
00085     {
00086     public:
00087       SparBaseLocation(const BWTA::BaseLocation* location, Region* parent)
00088         : D2::LocationTypes<BaseLocation>::Type((LocationTypes*)NULL, location, parent)
00089         , D3::LocationTypes<BaseLocation>::Type((LocationTypes*)NULL, location, parent)
00090         , BaseLocation((LocationTypes*)NULL, location, parent)
00091         , PrimitiveLocation(parent)
00092         , StaticLocation(parent)
00093       {}
00094       virtual BWAPI::Position getCurrentCenter() const { return BaseLocation::getCurrentCenter(); }
00095     protected:
00096       //virtual void output(std::ostream& out) const { BaseLocation::output(out); }
00097     };
00098 
00099     class SparChokepoint : public D2::LocationTypes<Chokepoint>::Type, 
00100                            public D3::LocationTypes<Chokepoint>::Type,
00101                            public virtual Chokepoint
00102     {
00103     public:
00104       SparChokepoint(BWTA::Chokepoint* chokepoint, Region* firstRegion, Region* secondRegion, Map* parent)
00105         : D2::LocationTypes<Chokepoint>::Type((LocationTypes*)NULL, chokepoint, firstRegion, secondRegion, parent)
00106         , D3::LocationTypes<Chokepoint>::Type((LocationTypes*)NULL, chokepoint, firstRegion, secondRegion, parent)
00107         , Chokepoint((LocationTypes*)NULL, chokepoint, firstRegion, secondRegion, parent)
00108         , PrimitiveLocation(parent)
00109         , StaticLocation(parent)
00110       {}
00111       virtual BWAPI::Position getCurrentCenter() const { return Chokepoint::getCurrentCenter(); }
00112     protected:
00113       //virtual void output(std::ostream& out) const { Chokepoint::output(out); }
00114     };
00115 
00116     class SparRegion : public D2::LocationTypes<Region>::Type, 
00117                        public D3::LocationTypes<Region>::Type,
00118                        public virtual Region
00119     {
00120     public:
00121       SparRegion(BWTA::Region* region, Map* parent)
00122         : D2::LocationTypes<Region>::Type((LocationTypes*)NULL, region, parent)
00123         , D3::LocationTypes<Region>::Type((LocationTypes*)NULL, region, parent)
00124         , Region((LocationTypes*)NULL, region, parent)
00125         , CompositeLocation(parent)
00126         , StaticLocation(parent)
00127       {}
00128       virtual BWAPI::Position getCurrentCenter() const { return Region::getCurrentCenter(); }
00129     protected:
00130       //virtual void output(std::ostream& out) const { Region::output(out); }
00131     };
00132 
00133     class SparRegionLocation : public D2::LocationTypes<RegionLocation>::Type, 
00134                                public D3::LocationTypes<RegionLocation>::Type,
00135                                public virtual RegionLocation
00136     {
00137     public:
00138       SparRegionLocation(Region* parent)
00139         : D2::LocationTypes<RegionLocation>::Type((LocationTypes*)NULL, parent)
00140         , D3::LocationTypes<RegionLocation>::Type((LocationTypes*)NULL, parent)
00141         , RegionLocation((LocationTypes*)NULL, parent)
00142         , PrimitiveLocation(parent)
00143         , StaticLocation(parent)
00144       {}
00145       virtual BWAPI::Position getCurrentCenter() const { return RegionLocation::getCurrentCenter(); }
00146     protected:
00147       //virtual void output(std::ostream& out) const { RegionLocation::output(out); }
00148     };
00149 
00150     class SparMap : public D2::LocationTypes<Map>::Type, 
00151                          public D3::LocationTypes<Map>::Type,
00152                          public virtual Map
00153     {
00154     public:
00155       SparMap()
00156         : D2::LocationTypes<Map>::Type((LocationTypes*)NULL)
00157         , D3::LocationTypes<Map>::Type((LocationTypes*)NULL)
00158         , Map((LocationTypes*)NULL)
00159         , CompositeLocation(NULL)
00160         , StaticLocation(NULL)
00161       {}
00162       virtual BWAPI::Position getCurrentCenter() const { return Map::getCurrentCenter(); }
00163     protected:
00164       //virtual void output(std::ostream& out) const { Map::output(out); }
00165     };
00166 
00167     static AirLocation* instantiateAirLocation(Map* map) {
00168       SparAirLocation* sparAirLocation = new SparAirLocation(map);
00169       assert(dynamic_cast<Location*>(sparAirLocation) != NULL);
00170       assert(dynamic_cast<StaticLocation*>(sparAirLocation) != NULL);
00171       //assert(dynamic_cast<UnitsContainer*>(sparAirLocation) != NULL);
00172       assert(dynamic_cast<PrimitiveLocation*>(sparAirLocation) != NULL);
00173       assert(dynamic_cast<D2::LocationTypes<AirLocation>::Type*>(sparAirLocation) != NULL);
00174       assert(dynamic_cast<D3::LocationTypes<AirLocation>::Type*>(sparAirLocation) != NULL);
00175 
00176       Location* sparLocation = dynamic_cast<Location*>(sparAirLocation);
00177       assert(dynamic_cast<Location*>(sparLocation) != NULL);
00178       assert(dynamic_cast<StaticLocation*>(sparLocation) != NULL);
00179       //assert(dynamic_cast<UnitsContainer*>(sparLocation) != NULL);
00180       assert(dynamic_cast<PrimitiveLocation*>(sparLocation) != NULL);
00181       assert(dynamic_cast<D2::LocationTypes<AirLocation>::Type*>(sparLocation) != NULL);
00182       assert(dynamic_cast<D3::LocationTypes<AirLocation>::Type*>(sparLocation) != NULL);
00183 
00184       return sparAirLocation;
00185     }
00186 
00187     static BaseLocation* instantiateBaseLocation(const BWTA::BaseLocation* location, Region* parentRegion) {
00188       SparBaseLocation* sparBaseLocation = new SparBaseLocation(location, parentRegion);
00189       assert(dynamic_cast<Location*>(sparBaseLocation) != NULL);
00190       assert(dynamic_cast<StaticLocation*>(sparBaseLocation) != NULL);
00191       //assert(dynamic_cast<UnitsContainer*>(sparBaseLocation) != NULL);
00192       assert(dynamic_cast<PrimitiveLocation*>(sparBaseLocation) != NULL);
00193       assert(dynamic_cast<D2::LocationTypes<BaseLocation>::Type*>(sparBaseLocation) != NULL);
00194       assert(dynamic_cast<D3::LocationTypes<BaseLocation>::Type*>(sparBaseLocation) != NULL);
00195 
00196       Location* sparLocation = dynamic_cast<Location*>(sparBaseLocation);
00197       assert(dynamic_cast<Location*>(sparLocation) != NULL);
00198       assert(dynamic_cast<StaticLocation*>(sparLocation) != NULL);
00199       //assert(dynamic_cast<UnitsContainer*>(sparLocation) != NULL);
00200       assert(dynamic_cast<PrimitiveLocation*>(sparLocation) != NULL);
00201       assert(dynamic_cast<D2::LocationTypes<BaseLocation>::Type*>(sparLocation) != NULL);
00202       assert(dynamic_cast<D3::LocationTypes<BaseLocation>::Type*>(sparLocation) != NULL);
00203 
00204       return sparBaseLocation;
00205     }
00206 
00207     static Chokepoint* instantiateChokepoint(BWTA::Chokepoint* chokepoint, Region* firstRegion, Region* secondRegion, Map* parent) {
00208       SparChokepoint* sparChokepoint = new SparChokepoint(chokepoint, firstRegion, secondRegion,  parent);
00209       assert(dynamic_cast<Location*>(sparChokepoint) != NULL);
00210       assert(dynamic_cast<StaticLocation*>(sparChokepoint) != NULL);
00211       //assert(dynamic_cast<UnitsContainer*>(sparChokepoint) != NULL);
00212       assert(dynamic_cast<PrimitiveLocation*>(sparChokepoint) != NULL);
00213       assert(dynamic_cast<D2::LocationTypes<Chokepoint>::Type*>(sparChokepoint) != NULL);
00214       assert(dynamic_cast<D3::LocationTypes<Chokepoint>::Type*>(sparChokepoint) != NULL);
00215 
00216       Location* sparLocation = dynamic_cast<Location*>(sparChokepoint);
00217       assert(dynamic_cast<Location*>(sparLocation) != NULL);
00218       assert(dynamic_cast<StaticLocation*>(sparLocation) != NULL);
00219       //assert(dynamic_cast<UnitsContainer*>(sparLocation) != NULL);
00220       assert(dynamic_cast<PrimitiveLocation*>(sparLocation) != NULL);
00221       assert(dynamic_cast<D2::LocationTypes<Chokepoint>::Type*>(sparLocation) != NULL);
00222       assert(dynamic_cast<D3::LocationTypes<Chokepoint>::Type*>(sparLocation) != NULL);
00223 
00224       return sparChokepoint;
00225     }
00226 
00227     static Region* instantiateRegion(BWTA::Region* region, Map* parent) {
00228       SparRegion* sparRegion = new SparRegion(region, parent);
00229       assert(dynamic_cast<Location*>(sparRegion) != NULL);
00230       assert(dynamic_cast<StaticLocation*>(sparRegion) != NULL);
00231       assert(dynamic_cast<CompositeLocation*>(sparRegion) != NULL);
00232       assert(dynamic_cast<D2::LocationTypes<Region>::Type*>(sparRegion) != NULL);
00233       assert(dynamic_cast<D3::LocationTypes<Region>::Type*>(sparRegion) != NULL);
00234 
00235       Location* sparLocation = dynamic_cast<Location*>(sparRegion);
00236       assert(dynamic_cast<Location*>(sparLocation) != NULL);
00237       assert(dynamic_cast<StaticLocation*>(sparLocation) != NULL);
00238       assert(dynamic_cast<CompositeLocation*>(sparLocation) != NULL);
00239       assert(dynamic_cast<D2::LocationTypes<Region>::Type*>(sparLocation) != NULL);
00240       assert(dynamic_cast<D3::LocationTypes<Region>::Type*>(sparLocation) != NULL);
00241 
00242       return sparRegion;
00243     }
00244 
00245     static RegionLocation* instantiateRegionLocation(Region* parent) {
00246       SparRegionLocation* sparRegionLocation = new SparRegionLocation(parent);
00247       assert(dynamic_cast<Location*>(sparRegionLocation) != NULL);
00248       assert(dynamic_cast<StaticLocation*>(sparRegionLocation) != NULL);
00249       assert(dynamic_cast<PrimitiveLocation*>(sparRegionLocation) != NULL);
00250       //assert(dynamic_cast<UnitsContainer*>(sparRegionLocation) != NULL);
00251       assert(dynamic_cast<D2::LocationTypes<RegionLocation>::Type*>(sparRegionLocation) != NULL);
00252       assert(dynamic_cast<D3::LocationTypes<RegionLocation>::Type*>(sparRegionLocation) != NULL);
00253 
00254       Location* sparLocation = dynamic_cast<Location*>(sparRegionLocation);
00255       assert(dynamic_cast<Location*>(sparLocation) != NULL);
00256       assert(dynamic_cast<StaticLocation*>(sparLocation) != NULL);
00257       assert(dynamic_cast<PrimitiveLocation*>(sparLocation) != NULL);
00258       //assert(dynamic_cast<UnitsContainer*>(sparLocation) != NULL);
00259       assert(dynamic_cast<D2::LocationTypes<RegionLocation>::Type*>(sparLocation) != NULL);
00260       assert(dynamic_cast<D3::LocationTypes<RegionLocation>::Type*>(sparLocation) != NULL);
00261 
00262       return sparRegionLocation;
00263     }
00264 
00265     static Map* instantiateMap() {
00266       SparMap* sparMap = new SparMap();
00267       assert(dynamic_cast<Location*>(sparMap) != NULL);
00268       assert(dynamic_cast<StaticLocation*>(sparMap) != NULL);
00269       assert(dynamic_cast<CompositeLocation*>(sparMap) != NULL);
00270       assert(dynamic_cast<D2::LocationTypes<Map>::Type*>(sparMap) != NULL);
00271       assert(dynamic_cast<D3::LocationTypes<Map>::Type*>(sparMap) != NULL);
00272 
00273       Location* sparLocation = dynamic_cast<Location*>(sparMap);
00274       assert(dynamic_cast<Location*>(sparLocation) != NULL);
00275       assert(dynamic_cast<StaticLocation*>(sparLocation) != NULL);
00276       assert(dynamic_cast<CompositeLocation*>(sparLocation) != NULL);
00277       assert(dynamic_cast<D2::LocationTypes<Map>::Type*>(sparLocation) != NULL);
00278       assert(dynamic_cast<D3::LocationTypes<Map>::Type*>(sparLocation) != NULL);
00279 
00280       return sparMap;
00281     }
00282   };
00283 
00284 #pragma endregion SparLocations
00285 
00286   class SparUnitData : public D1::L1UnitData, 
00287                        public D2::L2UnitData,
00288                        public D3::L3UnitData,
00289                        public virtual UnitData
00290   {
00291   public:
00292     SparUnitData(BWAPI::Unit* unit)
00293       : D1::L1UnitData(unit)
00294       , D2::L2UnitData(unit)
00295       , D3::L3UnitData(unit)
00296       , UnitData(unit)
00297     {}
00298 
00299     static UnitData* instantiate(BWAPI::Unit* unit)
00300     {
00301       UnitData* unitData = new SparUnitData(unit);
00302       assert(dynamic_cast<D1::L1UnitData*>(unitData) != NULL);
00303       assert(dynamic_cast<D2::L2UnitData*>(unitData) != NULL);
00304       assert(dynamic_cast<D3::L3UnitData*>(unitData) != NULL);
00305       
00306       return unitData;
00307     }
00308   };
00309 
00310 #pragma region SparTechs
00311 
00312   struct TechTypes
00313   {
00314     class SparUnitTypeTech : public D3::TechTypes<UnitTypeTech>::Type, 
00315                              public D4::TechTypes<UnitTypeTech>::Type,
00316                              public virtual UnitTypeTech
00317     {
00318     public:
00319       SparUnitTypeTech(BWAPI::UnitType unitType)
00320         : D3::TechTypes<UnitTypeTech>::Type(unitType)
00321         , D4::TechTypes<UnitTypeTech>::Type(unitType)
00322         , UnitTypeTech(unitType)
00323       {}
00324     };
00325     class SparTechTypeTech : public D3::TechTypes<TechTypeTech>::Type, 
00326                              public D4::TechTypes<TechTypeTech>::Type,
00327                              public virtual TechTypeTech
00328     {
00329     public:
00330       SparTechTypeTech(BWAPI::TechType techType)
00331         : D3::TechTypes<TechTypeTech>::Type(techType)
00332         , D4::TechTypes<TechTypeTech>::Type(techType)
00333         , TechTypeTech(techType)
00334       {}
00335     };
00336     class SparUpgradeTypeTech : public D3::TechTypes<UpgradeTypeTech>::Type, 
00337                                 public D4::TechTypes<UpgradeTypeTech>::Type,
00338                                 public virtual UpgradeTypeTech
00339     {
00340     public:
00341       SparUpgradeTypeTech(BWAPI::UpgradeType upgradeType)
00342         : D3::TechTypes<UpgradeTypeTech>::Type(upgradeType)
00343         , D4::TechTypes<UpgradeTypeTech>::Type(upgradeType)
00344         , UpgradeTypeTech(upgradeType)
00345       {}
00346       SparUpgradeTypeTech(BWAPI::UpgradeType upgradeType, int level)
00347         : D3::TechTypes<UpgradeTypeTech>::Type(upgradeType, level)
00348         , D4::TechTypes<UpgradeTypeTech>::Type(upgradeType, level)
00349         , UpgradeTypeTech(upgradeType, level)
00350       {}
00351     };
00352 
00353     static UnitTypeTech* instantiateUnitTypeTech(BWAPI::UnitType unitType) {
00354       return new SparUnitTypeTech(unitType);
00355     }
00356     static TechTypeTech* instantiateTechTypeTech(BWAPI::TechType techType) {
00357       return new SparTechTypeTech(techType);
00358     }
00359     static UpgradeTypeTech* instantiateUpgradeTypeTech(BWAPI::UpgradeType upgradeType) {
00360       return new SparUpgradeTypeTech(upgradeType);
00361     }
00362     static UpgradeTypeTech* instantiateUpgradeTypeTech(BWAPI::UpgradeType upgradeType, int level) {
00363       return new SparUpgradeTypeTech(upgradeType, level);
00364     }
00365   };
00366 
00367 #pragma endregion SparTechs
00368 
00369   // NOTE: UnitManager must be declared BEFORE the layers so that it is destructed AFTER them
00370   UnitManagerImpl<SparUnitData> m_unitManager;
00371   // Keep m_scheduler BEFORE m_perceptualState (else deleting locations will fail on Component::verifyPendingTasks())
00372   Timer m_timer;
00373   Scheduler m_scheduler;
00374   PerceptualState m_perceptualState;
00375   Config m_configuration;
00376 
00377   // Situation analysis
00378   S1 m_layer1SituationAnalysis;
00379   S2 m_layer2SituationAnalysis;
00380   S3 m_layer3SituationAnalysis;
00381   S4 m_layer4SituationAnalysis;
00382 
00383   // Decision making
00384   D1 m_layer1DecisionMaking;
00385   D2 m_layer2DecisionMaking;
00386   D3 m_layer3DecisionMaking;
00387   D4 m_layer4DecisionMaking;
00388 
00389 #ifdef USE_SPAR_GUI
00390   std::list<SparObserver*> m_observers;
00391 #endif
00392 };
00393 
00394 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00395 SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::SparAIModule()
00396   : SparAIContainer(&m_scheduler, &m_perceptualState, &m_unitManager, &m_timer, &m_configuration)
00397   , m_layer1DecisionMaking(m_layer1SituationAnalysis)
00398   , m_layer2DecisionMaking(m_layer2SituationAnalysis, m_layer1DecisionMaking)
00399   , m_layer3DecisionMaking(m_layer3SituationAnalysis, m_layer2DecisionMaking)
00400   , m_layer4DecisionMaking(m_layer4SituationAnalysis, m_layer3DecisionMaking)
00401   , m_layer1SituationAnalysis()
00402   , m_layer2SituationAnalysis(m_layer1SituationAnalysis)
00403   , m_layer3SituationAnalysis(m_layer2SituationAnalysis)
00404   , m_layer4SituationAnalysis(m_layer3SituationAnalysis)
00405 {
00406   SPAR_LOG(LogTypes::GENERAL, "SPAR AI created");
00407 }
00408 
00409 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00410 SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::~SparAIModule()
00411 {
00412   SPAR_LOG(LogTypes::GENERAL, "SPAR AI destroyed");
00413 #ifdef USE_SPAR_GUI
00414   for (std::list<SparObserver*>::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
00415   {
00416     delete *it;
00417   }
00418 #endif
00419 }
00420 
00421 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00422 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onStart()
00423 {
00424   SparAIContainer::onStart();
00425 
00426   SPAR_LOG(LogTypes::GENERAL, "Game started");
00427   if (BWAPI::Broodwar->isReplay()) return;
00428   // Enable some cheat flags
00429   BWAPI::Broodwar->enableFlag(BWAPI::Flag::UserInput);
00430 
00431   //BWAPI::Broodwar->setGUI(false);
00432   //BWAPI::Broodwar->enableFlag(Flag::CompleteMapInformation);
00433   SPAR_LOG(LogTypes::GENERAL, "Analyzing map...");
00434   BWTA::readMap();
00435   BWTA::analyze();
00436   SPAR_LOG(LogTypes::GENERAL, "Done.");
00437 
00438   m_unitManager.onStart();
00439 
00440   m_perceptualState.onStart<LocationTypes, TechTypes>();
00441 
00442   m_layer1DecisionMaking.onStart();
00443   m_layer2DecisionMaking.onStart();
00444   m_layer3DecisionMaking.onStart();
00445   m_layer4DecisionMaking.onStart();
00446 
00447   m_layer1SituationAnalysis.onStart();
00448   m_layer2SituationAnalysis.onStart();
00449   m_layer3SituationAnalysis.onStart();
00450   m_layer4SituationAnalysis.onStart();
00451 
00452 #ifdef USE_SPAR_GUI
00453   for (std::list<SparObserver*>::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
00454   {
00455     (*it)->onStart();
00456   }
00457 #endif
00458 }
00459 
00460 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00461 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onEnd(bool isWinner)
00462 {
00463   if(isWinner)
00464     SPAR_LOG(LogTypes::GENERAL, "Game won");
00465   else
00466     SPAR_LOG(LogTypes::GENERAL, "Game lost");
00467 
00468 #ifdef USE_SPAR_GUI
00469   for (std::list<SparObserver*>::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
00470   {
00471     (*it)->close();
00472   }
00473 #endif
00474 
00475   // Inverse order of onStart()
00476 
00477   SparAIContainer::onEnd(isWinner);
00478 
00479   m_layer4SituationAnalysis.onEnd();
00480   m_layer3SituationAnalysis.onEnd();
00481   m_layer2SituationAnalysis.onEnd();
00482   m_layer1SituationAnalysis.onEnd();
00483 
00484   m_layer4DecisionMaking.onEnd();
00485   m_layer3DecisionMaking.onEnd();
00486   m_layer2DecisionMaking.onEnd();
00487   m_layer1DecisionMaking.onEnd();
00488 
00489   m_perceptualState.onEnd();
00490 
00491   m_unitManager.onEnd();
00492 
00493   deleteZombieComponents();
00494 }
00495 
00496 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00497 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onFrame()
00498 {
00499 #ifdef DRAW_ON_SCREEN
00500   BWAPI::Broodwar->drawTextScreen(10, 10, "AVG %0.4f\nFPS %d\nAPM %d\nPos (%d,%d)\nTile (%d,%d)", 
00501     BWAPI::Broodwar->getAverageFPS(), 
00502     BWAPI::Broodwar->getFPS(),
00503     int(BWAPI::Broodwar->getAPM()),
00504     (BWAPI::Broodwar->getScreenPosition() + BWAPI::Broodwar->getMousePosition()).x(), (BWAPI::Broodwar->getScreenPosition() + BWAPI::Broodwar->getMousePosition()).y(),
00505     BWAPI::TilePosition(BWAPI::Broodwar->getScreenPosition() + BWAPI::Broodwar->getMousePosition()).x(), BWAPI::TilePosition(BWAPI::Broodwar->getScreenPosition() + BWAPI::Broodwar->getMousePosition()).y());
00506 #endif
00507 
00508   SPAR_LOG(LogTypes::ON_FRAME, "onFrame()");
00509 
00510   if (BWAPI::Broodwar->isReplay()) return;
00511   
00512   //Timer::value_type t0 = Spar->getTimer().currentTime();
00513   SparAIContainer::onFrame();
00514   //Timer::value_type t1 = Spar->getTimer().currentTime();
00515 
00516   m_perceptualState.onFrame();
00517   //Timer::value_type t2 = Spar->getTimer().currentTime();
00518 
00519   m_layer4SituationAnalysis.onFrame();
00520   //Timer::value_type t3 = Spar->getTimer().currentTime();
00521   m_layer3SituationAnalysis.onFrame();
00522   //Timer::value_type t4 = Spar->getTimer().currentTime();
00523   m_layer2SituationAnalysis.onFrame();
00524   //Timer::value_type t5 = Spar->getTimer().currentTime();
00525   m_layer1SituationAnalysis.onFrame();
00526   //Timer::value_type t6 = Spar->getTimer().currentTime();
00527 
00528   m_layer4DecisionMaking.onFrame();
00529   //Timer::value_type t7 = Spar->getTimer().currentTime();
00530   m_layer3DecisionMaking.onFrame();
00531   //Timer::value_type t8 = Spar->getTimer().currentTime();
00532   m_layer2DecisionMaking.onFrame();
00533   //Timer::value_type t9 = Spar->getTimer().currentTime();
00534   m_layer1DecisionMaking.onFrame();
00535   //Timer::value_type t10 = Spar->getTimer().currentTime();
00536 
00537   m_unitManager.onFrame();
00538   //Timer::value_type t11 = Spar->getTimer().currentTime();
00539 
00540   //Timer::value_type t12 = Spar->getTimer().currentTime();
00541 
00542   Spar->getScheduler().onFrame();
00543   //Timer::value_type t13 = Spar->getTimer().currentTime();
00544 
00545   //SPAR_LOG(LogTypes::GENERAL_ERROR, "AIC %I64d PS %I64d 4A %I64d 3A %I64d 2A %I64d 1A %I64d 4D %I64d 3D %I64d 2D %I64d 1D %I64d UM %I64d GUI %I64d S %I64d"
00546   //  , t1 - t0, t2 - t1, t3 - t2, t4 - t3, t5 - t4, t6 - t5, t7 - t6, t8 - t7, t9 - t8, t10 - t9, t11 - t10, t12 - t11, t13 - t12);
00547 
00548   // We may need to move the GUI before the scheduler, but in this case some stuff may be produce errors
00549   // (techs not acquired, for example).
00550 #ifdef USE_SPAR_GUI
00551   for (std::list<SparObserver*>::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
00552   {
00553     (*it)->onFrame();
00554   }
00555 #endif
00556 }
00557 
00558 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00559 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onUnitDiscover(BWAPI::Unit* unit)
00560 {
00561   SPAR_LOG(LogTypes::ON_DISCOVER, "onUnitDiscover(0x%x): %s %s %d", unit,
00562     (unit->getPlayer() == BWAPI::Broodwar->self() ? "Own" : (unit->getPlayer()->isNeutral() ? "Neutral" : "Enemy")),
00563     unit->getType().getName().c_str(), unit->getID());
00564   
00565   if (BWAPI::Broodwar->isReplay()) return;
00566 
00567   m_perceptualState.onUnitDiscover(unit);
00568 
00569   m_unitManager.onUnitDiscover(unit);
00570 }
00571 
00572 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00573 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onUnitEvade(BWAPI::Unit* unit)
00574 {
00575   SPAR_LOG(LogTypes::ON_EVADE, "onUnitEvade(0x%x): %s %s %d", unit,
00576     (unit->getPlayer() == BWAPI::Broodwar->self() ? "Own" : (unit->getPlayer()->isNeutral() ? "Neutral" : "Enemy")),
00577     unit->getType().getName().c_str(), unit->getID());
00578 
00579   if (BWAPI::Broodwar->isReplay()) return;
00580 
00581   m_perceptualState.onUnitEvade(unit);
00582 
00583   m_unitManager.onUnitEvade(unit);
00584 }
00585 
00586 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00587 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onUnitShow(BWAPI::Unit* unit)
00588 {
00589   SPAR_LOG(LogTypes::ON_SHOW, "onUnitShow(0x%x): %s %s %d", unit,
00590     (unit->getPlayer() == BWAPI::Broodwar->self() ? "Own" : (unit->getPlayer()->isNeutral() ? "Neutral" : "Enemy")),
00591     unit->getType().getName().c_str(), unit->getID());
00592 
00593   if (BWAPI::Broodwar->isReplay()) return;
00594 
00595   m_perceptualState.onUnitShow(unit);
00596 
00597   m_unitManager.onUnitShow(unit);
00598 }
00599 
00600 
00601 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00602 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onUnitHide(BWAPI::Unit* unit)
00603 {
00604   SPAR_LOG(LogTypes::ON_HIDE, "onUnitHide(0x%x): %s %s %d", unit,
00605     (unit->getPlayer() == BWAPI::Broodwar->self() ? "Own" : (unit->getPlayer()->isNeutral() ? "Neutral" : "Enemy")),
00606     unit->getType().getName().c_str(), unit->getID());
00607 
00608   if (BWAPI::Broodwar->isReplay()) return;
00609 
00610   m_perceptualState.onUnitHide(unit);
00611 
00612   m_unitManager.onUnitHide(unit);
00613 }
00614 
00615 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00616 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onUnitCreate(BWAPI::Unit* unit)
00617 {
00618   SPAR_LOG(LogTypes::ON_CREATE, "onUnitCreate(0x%x): %s %s %d", unit,
00619     (unit->getPlayer() == BWAPI::Broodwar->self() ? "Own" : (unit->getPlayer()->isNeutral() ? "Neutral" : "Enemy")),
00620     unit->getType().getName().c_str(), unit->getID());
00621 
00622   if (BWAPI::Broodwar->isReplay()) return;
00623 
00624   m_perceptualState.onUnitCreate(unit);
00625 
00626   m_unitManager.onUnitCreate(unit);
00627 }
00628 
00629 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00630 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onUnitDestroy(BWAPI::Unit* unit)
00631 {
00632   SPAR_LOG(LogTypes::ON_DESTROY, "onUnitDestroy(0x%x): %s %s %d", unit,
00633     (unit->getPlayer() == BWAPI::Broodwar->self() ? "Own" : (unit->getPlayer()->isNeutral() ? "Neutral" : "Enemy")),
00634     unit->getType().getName().c_str(), unit->getID());
00635 
00636   if (BWAPI::Broodwar->isReplay()) return;
00637 
00638   m_perceptualState.onUnitDestroy(unit);
00639 
00640   // This call must stay at the end, else subscribers may use deleted unit data
00641   m_unitManager.onUnitDestroy(unit);
00642 }
00643 
00644 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00645 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onUnitMorph(BWAPI::Unit* unit)
00646 {
00647   SPAR_LOG(LogTypes::ON_MORPH, "onUnitMorph(0x%x): %s %s %d", unit,
00648     (unit->getPlayer() == BWAPI::Broodwar->self() ? "Own" : (unit->getPlayer()->isNeutral() ? "Neutral" : "Enemy")),
00649     unit->getType().getName().c_str(), unit->getID());
00650 
00651   if (BWAPI::Broodwar->isReplay()) return;
00652 
00653   m_perceptualState.onUnitMorph(unit);
00654 
00655   m_unitManager.onUnitMorph(unit);
00656 }
00657 
00658 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00659 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onUnitRenegade(BWAPI::Unit* unit)
00660 {
00661   SPAR_LOG(LogTypes::ON_RENEGADE, "onUnitRenegade(0x%x): %s %s %d", unit,
00662     (unit->getPlayer() == BWAPI::Broodwar->self() ? "Own" : (unit->getPlayer()->isNeutral() ? "Neutral" : "Enemy")),
00663     unit->getType().getName().c_str(), unit->getID());
00664 
00665   if (BWAPI::Broodwar->isReplay()) return;
00666 
00667   m_perceptualState.onUnitRenegade(unit);
00668 
00669   m_unitManager.onUnitRenegade(unit);
00670 }
00671 
00672 template <class S1, class S2, class S3, class S4, class D1, class D2, class D3, class D4>
00673 void SparAIModule<S1, S2, S3, S4, D1, D2, D3, D4>::onSendText(std::string text)
00674 {
00675   BWAPI::Broodwar->sendText("%s",text.c_str());
00676   if (BWAPI::Broodwar->isReplay()) return;
00677 
00678   m_layer1SituationAnalysis.onSendText(text);
00679   m_layer2SituationAnalysis.onSendText(text);
00680   m_layer3SituationAnalysis.onSendText(text);
00681   m_layer4SituationAnalysis.onSendText(text);
00682   m_layer1DecisionMaking.onSendText(text);
00683   m_layer2DecisionMaking.onSendText(text);
00684   m_layer3DecisionMaking.onSendText(text);
00685   m_layer4DecisionMaking.onSendText(text);
00686 
00687   if (text == "actions")
00688   {
00689     BWAPI::Broodwar->drawTextScreen(5, 0, "Currently %u actions:", getNbChildProcesses());
00690     struct PrintChildProcess
00691     {
00692       PrintChildProcess() : m_line(0)
00693       {}
00694       SafeListBase::ConstFunctionReturn operator()(const Process* process) const
00695       {
00696         BWAPI::Broodwar->drawTextScreen(5, 16*m_line, "%d. %s", m_line, getObjectDescription(process).c_str());
00697         ++m_line;
00698 
00699         return SafeListBase::ConstFunctionReturn();
00700       }
00701     private:
00702       mutable int m_line;
00703     };
00704     for_each_child_process(PrintChildProcess());
00705   }
00706 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines