BWAPI
SPAR/AIModule/SparAIModule/PerceptualState/Locations/Static/Map.h
Go to the documentation of this file.
00001 #pragma once
00002 #include "CompositeLocation.h"
00003 #include "BaseLocation.h"
00004 #include "Chokepoint.h"
00005 #include "Region.h"
00006 #include "AirLocation.h"
00007 #include <hash_map>
00008 
00009 class Map : public virtual CompositeLocation
00010 {
00011 public:
00012   typedef boost::transform_iterator<extract_pair_second<stdext::hash_map<const BWTA::Chokepoint*, Chokepoint*>::iterator::value_type>, 
00013                                     stdext::hash_map<const BWTA::Chokepoint*, Chokepoint*>::iterator> 
00014           chokepoint_iterator;
00015   typedef boost::transform_iterator<extract_pair_second_const<stdext::hash_map<const BWTA::Chokepoint*, Chokepoint*>::const_iterator::value_type>, 
00016                                     stdext::hash_map<const BWTA::Chokepoint*, Chokepoint*>::const_iterator> 
00017           chokepoint_const_iterator;  
00018   typedef boost::transform_iterator<extract_pair_second<stdext::hash_map<const BWTA::Region*, Region*>::iterator::value_type>, 
00019                                     stdext::hash_map<const BWTA::Region*, Region*>::iterator> 
00020           region_iterator;
00021   typedef boost::transform_iterator<extract_pair_second_const<stdext::hash_map<const BWTA::Region*, Region*>::const_iterator::value_type>, 
00022                                     stdext::hash_map<const BWTA::Region*, Region*>::const_iterator> 
00023           region_const_iterator;  
00024   typedef boost::transform_iterator<extract_pair_second<stdext::hash_map<const BWTA::BaseLocation*, BaseLocation*>::iterator::value_type>, 
00025                                     stdext::hash_map<const BWTA::BaseLocation*, BaseLocation*>::iterator> 
00026           base_location_iterator;
00027   typedef boost::transform_iterator<extract_pair_second_const<stdext::hash_map<const BWTA::BaseLocation*, BaseLocation*>::const_iterator::value_type>, 
00028                                     stdext::hash_map<const BWTA::BaseLocation*, BaseLocation*>::const_iterator> 
00029           base_location_const_iterator;
00030 
00031   template <class LocationTypes>
00032   Map(LocationTypes*)
00033     : CompositeLocation(NULL)
00034     , StaticLocation(NULL)
00035     , m_ownStartBaseLocation(NULL)
00036     , m_airLocation(LocationTypes::instantiateAirLocation(this))
00037   {
00038     addSubLocation(m_airLocation);
00039 
00040     for(std::set<BWTA::Region*>::const_iterator itRegion = BWTA::getRegions().begin(); itRegion != BWTA::getRegions().end(); ++itRegion)
00041     {
00042       Region* region = LocationTypes::instantiateRegion(*itRegion, this);
00043       m_regionsCache.insert(std::make_pair(*itRegion, region));
00044       addSubLocation(region);
00045 
00046       for (std::set<BaseLocation*>::const_iterator itBaseLocation = region->getBaseLocations().begin(); itBaseLocation != region->getBaseLocations().end(); ++itBaseLocation)
00047       {
00048         BaseLocation* baseLocation = *itBaseLocation;
00049         m_baseLocationsCache.insert(std::make_pair(baseLocation->getBWTABaseLocation(), baseLocation));
00050       }
00051     }
00052 
00053     for (std::set< BWAPI::TilePosition >::const_iterator itStartLocation = BWAPI::Broodwar->getStartLocations().begin(); itStartLocation != BWAPI::Broodwar->getStartLocations().end(); ++itStartLocation)
00054     {
00055       stdext::hash_map<const BWTA::BaseLocation*, BaseLocation*>::iterator it = m_baseLocationsCache.find(BWTA::getNearestBaseLocation(*itStartLocation));
00056       if (it != m_baseLocationsCache.end())
00057         m_startBaseLocationsCache.insert(it->second);
00058     }
00059 
00060 #ifdef _DEBUG
00061     for(std::set<BWTA::BaseLocation*>::const_iterator itBaseLocation = BWTA::getBaseLocations().begin(); itBaseLocation != BWTA::getBaseLocations().end(); ++itBaseLocation)
00062     {
00063       assert(m_baseLocationsCache.find(*itBaseLocation) != m_baseLocationsCache.end());
00064     }
00065 #endif
00066     for(std::set<BWTA::Chokepoint*>::const_iterator itChokepoint = BWTA::getChokepoints().begin(); itChokepoint != BWTA::getChokepoints().end(); ++itChokepoint)
00067     {
00068       if(
00069         // Remove chokepoint blocked by generators in benzene
00070         ((*itChokepoint)->getSides().first == BWAPI::Position(4000, 1088) && (*itChokepoint)->getSides().second == BWAPI::Position(4088, 1088))
00071         || ((*itChokepoint)->getSides().first == BWAPI::Position(0, 1064) && (*itChokepoint)->getSides().second == BWAPI::Position(88, 1064))
00072         // Remove chokepoint blocked by minerals in Destination
00073         || ((*itChokepoint)->getSides().first == BWAPI::Position(1708, 204) && (*itChokepoint)->getSides().second == BWAPI::Position(1752, 248))
00074         || ((*itChokepoint)->getSides().first == BWAPI::Position(1288, 3832) && (*itChokepoint)->getSides().second == BWAPI::Position(1331, 3870))
00075         // Remove chokepoint blocked by doors in Fortress
00076         || ((*itChokepoint)->getSides().first == BWAPI::Position(744, 3304) && (*itChokepoint)->getSides().second == BWAPI::Position(784, 3320))
00077         || ((*itChokepoint)->getSides().first == BWAPI::Position(808, 848) && (*itChokepoint)->getSides().second == BWAPI::Position(848, 840))
00078         || ((*itChokepoint)->getSides().first == BWAPI::Position(3112, 904) && (*itChokepoint)->getSides().second == BWAPI::Position(3152, 920))
00079         || ((*itChokepoint)->getSides().first == BWAPI::Position(3424, 3374) && (*itChokepoint)->getSides().second == BWAPI::Position(3472, 3368))
00080         )
00081       {
00082         //TODO: Handle those chokepoint in a better way
00083         unused(itChokepoint);
00084       } else {
00085         std::pair<BWTA::Region*, BWTA::Region*> connectedRegions = (*itChokepoint)->getRegions();
00086         Region* firstRegion = m_regionsCache.find(connectedRegions.first)->second;
00087         Region* secondRegion = m_regionsCache.find(connectedRegions.second)->second;
00088         Chokepoint* chokepoint = LocationTypes::instantiateChokepoint(*itChokepoint, firstRegion, secondRegion, this);
00089         m_chokepointsCache.insert(std::make_pair(*itChokepoint, chokepoint));
00090         firstRegion->addChokepoint(chokepoint);
00091         secondRegion->addChokepoint(chokepoint);
00092         addSubLocation(chokepoint);
00093       }
00094     }
00095 
00096     //
00097     // Add players' stuff AFTER creating the map structures (so that possible subscribers can use them)
00098     //
00099     for(std::set<BWAPI::Unit*>::const_iterator itUnit = BWAPI::Broodwar->self()->getUnits().begin(); itUnit != BWAPI::Broodwar->self()->getUnits().end(); ++itUnit)
00100     {
00101       if((*itUnit)->getType() == BWAPI::UnitTypes::Protoss_Nexus)
00102       {
00103         for (stdext::hash_map<const BWTA::BaseLocation*, BaseLocation*>::const_iterator it2 = m_baseLocationsCache.begin(); it2 != m_baseLocationsCache.end(); ++it2)
00104         {
00105           if (it2->second->getCurrentCenter() == (*itUnit)->getPosition())
00106           {
00107             assert(m_ownStartBaseLocation == NULL);
00108             m_ownStartBaseLocation = it2->second;
00109             size_t nb = m_startBaseLocationsCache.erase(m_ownStartBaseLocation);
00110             assert(nb == 1);
00111           }
00112         }
00113       }
00114     }
00115   }
00116 
00117   ~Map()
00118   {
00119     delete m_airLocation;
00120     for (stdext::hash_map<const BWTA::Region*, Region*>::iterator it = m_regionsCache.begin(); it != m_regionsCache.end(); ++it)
00121     {
00122       delete it->second;
00123     }
00124     for (stdext::hash_map<const BWTA::Chokepoint*, Chokepoint*>::iterator it = m_chokepointsCache.begin(); it != m_chokepointsCache.end(); ++it)
00125     {
00126       delete it->second;
00127     }
00128   }
00129 
00130   bool isInLocation(BWAPI::Position position) const
00131   {
00132     unused(position);
00133 
00134     return true;
00135   }
00136 
00137   virtual BWAPI::Position getCurrentCenter() const
00138   {
00139     int y = BWAPI::Broodwar->mapHeight() * TILE_SIZE;
00140     int x = BWAPI::Broodwar->mapWidth() * TILE_SIZE;
00141     return BWAPI::Position(x/2,y/2);
00142   }
00143 
00144   Chokepoint* getChokepoint(const BWTA::Chokepoint* chokepoint)
00145   {
00146     return m_chokepointsCache.find(chokepoint)->second;
00147   }
00148 
00149   Region* getRegion(const BWTA::Region* region)
00150   {
00151     return m_regionsCache.find(region)->second;
00152   }
00153 
00154   BaseLocation* getBaseLocation(const BWTA::BaseLocation* baseLocation)
00155   {
00156     return m_baseLocationsCache.find(baseLocation)->second;
00157   }
00158 
00159   const std::set<BaseLocation*>& getEnemyPossibleStartBaseLocations()
00160   {
00161     return m_startBaseLocationsCache;
00162   }
00163 
00164   BaseLocation* getOwnStartBaseLocation()
00165   {
00166     return m_ownStartBaseLocation;
00167   }
00168 
00169   AirLocation* getAirLocation() { return m_airLocation; }
00170   const AirLocation* getAirLocation() const { return m_airLocation; }
00171 
00172   chokepoint_iterator chokepointsBegin() { return chokepoint_iterator(m_chokepointsCache.begin()); }
00173   chokepoint_iterator chokepointsEnd() { return chokepoint_iterator(m_chokepointsCache.end()); }
00174   chokepoint_const_iterator chokepointsBegin() const { return chokepoint_const_iterator(m_chokepointsCache.begin()); }
00175   chokepoint_const_iterator chokepointsEnd() const { return chokepoint_const_iterator(m_chokepointsCache.end()); }
00176   size_t getNbChokepoints() const { return m_chokepointsCache.size(); }
00177 
00178   region_iterator regionsBegin() { return region_iterator(m_regionsCache.begin()); }
00179   region_iterator regionsEnd() { return region_iterator(m_regionsCache.end()); }
00180   region_const_iterator regionsBegin() const { return region_const_iterator(m_regionsCache.begin()); }
00181   region_const_iterator regionsEnd() const { return region_const_iterator(m_regionsCache.end()); }
00182   size_t getNbRegions() const { return m_regionsCache.size(); }
00183   
00184   base_location_iterator baseLocationsBegin() { return base_location_iterator(m_baseLocationsCache.begin()); }
00185   base_location_iterator baseLocationsEnd() { return base_location_iterator(m_baseLocationsCache.end()); }
00186   base_location_const_iterator baseLocationsBegin() const { return base_location_const_iterator(m_baseLocationsCache.begin()); }
00187   base_location_const_iterator baseLocationsEnd() const { return base_location_const_iterator(m_baseLocationsCache.end()); }
00188   size_t getNbBaseLocations() const { return m_baseLocationsCache.size(); }
00189 
00190   DECLARE_EVENT1(OnUnitCompleted, BWAPI::Unit*);
00191   OnUnitCompleted& getUnitCompletedEvent() const { return m_unitCompletedEvent; }
00192   DECLARE_EVENT1(OnUnitMorphCompleted, BWAPI::Unit*);
00193   OnUnitMorphCompleted& getUnitMorphCompletedEvent() const { return m_unitMorphCompletedEvent; }
00194   
00195 protected:
00196   virtual void output(std::ostream& out) const
00197   {
00198     out << "Map";
00199   }
00200 
00201   EVENT(OnUnitCompleted) m_unitCompletedEvent;
00202   EVENT(OnUnitMorphCompleted) m_unitMorphCompletedEvent;
00203 
00204   AirLocation* const m_airLocation;
00205   stdext::hash_map<const BWTA::Chokepoint*, Chokepoint*> m_chokepointsCache;
00206   stdext::hash_map<const BWTA::Region*, Region*> m_regionsCache;
00207   stdext::hash_map<const BWTA::BaseLocation*, BaseLocation*> m_baseLocationsCache;
00208   std::set<BaseLocation*> m_startBaseLocationsCache;
00209   BaseLocation* m_ownStartBaseLocation;
00210 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines