BWAPI
|
00001 #pragma once 00002 #include "PrimitiveLocation.h" 00003 #include "Arbitrary/CircularLocation.h" 00004 00005 class Map; 00006 class Region; 00007 00008 const int BASE_LOCATION_RADIUS = 4*TILE_SIZE; 00009 00013 class BaseLocation : public virtual PrimitiveLocation 00014 { 00015 public: 00016 template <class LocationTypes> 00017 BaseLocation(LocationTypes*, const BWTA::BaseLocation* location, Region* parent) 00018 : PrimitiveLocation(parent) 00019 , StaticLocation(parent) 00020 , m_location(location) 00021 { 00022 #ifdef _DEBUG 00023 const std::set<BWAPI::TilePosition>& geysersPosition = m_location->getGeysersPosition(); 00024 for (std::set<BWAPI::TilePosition>::const_iterator it = geysersPosition.begin(); it != geysersPosition.end(); ++it) 00025 { 00026 const std::set<BWAPI::Unit*>& unitsOnTile = BWAPI::Broodwar->getUnitsOnTile(it->x(), it->y()); 00027 if (unitsOnTile.size() > 0) // For all accessible geysers 00028 { 00029 bool found = false; 00030 for (std::set<BWAPI::Unit*>::const_iterator itUnit = unitsOnTile.begin(); itUnit != unitsOnTile.end(); ++itUnit) 00031 { 00032 if ((*unitsOnTile.begin())->getType() == BWAPI::UnitTypes::Resource_Vespene_Geyser) 00033 found = true; 00034 } 00035 assert(found); 00036 } 00037 } 00038 #endif 00039 } 00040 00041 Region* getParent(); 00042 const Region* getParent() const; 00043 00044 virtual bool isInLocation(BWAPI::Position position) const 00045 { 00046 return CircularLocation(m_location->getPosition(), BASE_LOCATION_RADIUS).isInLocation(position); 00047 } 00048 00049 virtual BWAPI::Position getCurrentCenter() const 00050 { 00051 return m_location->getPosition(); 00052 } 00053 00054 bool hasEnemyResourceDepot() const 00055 { 00056 if (BWAPI::Broodwar->enemy()->getRace() == BWAPI::Races::Protoss) 00057 { 00058 return getNbEnemyUnits(BWAPI::UnitTypes::Protoss_Nexus) > 0; 00059 } 00060 else if (BWAPI::Broodwar->enemy()->getRace() == BWAPI::Races::Terran) 00061 { 00062 return getNbEnemyUnits(BWAPI::UnitTypes::Terran_Command_Center) > 0; 00063 } 00064 else 00065 { 00066 assert(BWAPI::Broodwar->enemy()->getRace() == BWAPI::Races::Zerg); 00067 return getNbEnemyUnits(BWAPI::UnitTypes::Zerg_Hatchery) > 0 || 00068 getNbEnemyUnits(BWAPI::UnitTypes::Zerg_Lair) > 0 || 00069 getNbEnemyUnits(BWAPI::UnitTypes::Zerg_Hive) > 0; 00070 } 00071 } 00072 00073 size_t getLastKnownNbEnemyRefineries() const 00074 { 00075 if (BWAPI::Broodwar->enemy()->getRace() == BWAPI::Races::Protoss) 00076 { 00077 return getNbEnemyUnits(BWAPI::UnitTypes::Protoss_Assimilator); 00078 } 00079 else if (BWAPI::Broodwar->enemy()->getRace() == BWAPI::Races::Terran) 00080 { 00081 return getNbEnemyUnits(BWAPI::UnitTypes::Terran_Refinery); 00082 } 00083 else 00084 { 00085 assert(BWAPI::Broodwar->enemy()->getRace() == BWAPI::Races::Zerg); 00086 return getNbEnemyUnits(BWAPI::UnitTypes::Zerg_Extractor); 00087 } 00088 } 00089 00090 typedef neutral_unit_type_const_iterator crystal_iterator; 00091 std::pair<crystal_iterator, crystal_iterator> getLastKnownCrystalsLeft() const 00092 { 00093 return getNeutralUnits(BWAPI::UnitTypes::Resource_Mineral_Field); 00094 00095 //std::pair<neutral_unit_type_const_iterator, neutral_unit_type_const_iterator> units = getNeutralUnits(BWAPI::UnitTypes::Resource_Mineral_Field); 00097 //assert(getNbNeutralUnits(BWAPI::UnitTypes::Resource_Mineral_Field_Type_2) == 0); 00098 //assert(getNbNeutralUnits(BWAPI::UnitTypes::Resource_Mineral_Field_Type_3) == 0); 00099 00100 //return std::make_pair(crystal_iterator(units.first), crystal_iterator(units.second)); 00101 } 00102 00103 size_t getLastKnownNbCrystalsLeft() const 00104 { 00105 return getNbNeutralUnits(BWAPI::UnitTypes::Resource_Mineral_Field); 00106 } 00107 00108 //bool isPossibleStartLocation() const 00109 //{ 00110 // // BWTA bug? 00111 // return m_location->isStartLocation(); 00112 //} 00113 00114 size_t probesMineralsSaturation() const 00115 { 00116 return static_cast<size_t>(std::ceil(2.5 * double(getLastKnownNbCrystalsLeft()))); 00117 } 00118 00119 size_t probesGasSaturation() const 00120 { 00121 return 3 * getNbGeysers(); 00122 } 00123 00124 size_t getNbGeysers() const 00125 { 00126 return m_location->getGeysersPosition().size(); 00127 } 00128 00129 const BWTA::BaseLocation* getBWTABaseLocation() const 00130 { 00131 return m_location; 00132 } 00133 00134 virtual void output(std::ostream& out) const 00135 { 00136 out << "Base location " << m_location->getPosition(); 00137 } 00138 00139 protected: 00140 friend class Map; 00141 00142 const BWTA::BaseLocation* const m_location; 00143 };