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