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