BWAPI
SPAR/AIModule/SparAIModule/PerceptualState/Locations/Static/BaseLocation.h
Go to the documentation of this file.
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 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines