////////////////////////////////////////////////////////////////////////// // // This file is part of the BWEM Library. // BWEM is free software, licensed under the MIT/X11 License. // A copy of the license is provided with the library in the LICENSE file. // Copyright (c) 2015, 2017, Igor Dimitrijevic // ////////////////////////////////////////////////////////////////////////// #ifndef BWEM_BASE_H #define BWEM_BASE_H #include #include "utils.h" #include "defs.h" namespace BWEM { class Ressource; class Mineral; class Geyser; class Area; class Map; ////////////////////////////////////////////////////////////////////////////////////////////// // // // class Base // // ////////////////////////////////////////////////////////////////////////////////////////////// // // After Areas and ChokePoints, Bases are the third kind of object BWEM automatically computes from Brood War's maps. // A Base is essentially a suggested location (intended to be optimal) to put a Command Center, Nexus, or Hatchery. // It also provides information on the ressources available, and some statistics. // A Base alway belongs to some Area. An Area may contain zero, one or several Bases. // Like Areas and ChokePoints, the number and the addresses of Base instances remain unchanged. // // Bases inherit utils::UserData, which provides free-to-use data. class Base : public utils::UserData { public: // Tells whether this Base's location is contained in Map::StartingLocations() // Note: all players start at locations taken from Map::StartingLocations(), // which doesn't mean all the locations in Map::StartingLocations() are actually used. bool Starting() const { return m_starting; } // Returns the Area this Base belongs to. const Area * GetArea() const { return m_pArea; } // Returns the location of this Base (top left Tile position). // If Starting() == true, it is guaranteed that the loction corresponds exactly to one of Map::StartingLocations(). const BWAPI::TilePosition & Location() const { return m_location; } // Returns the location of this Base (center in pixels). const BWAPI::Position & Center() const { return m_center; } // Returns the available Minerals. // These Minerals are assigned to this Base (it is guaranteed that no other Base provides them). // Note: The size of the returned list may decrease, as some of the Minerals may get destroyed. const std::vector & Minerals() const { return m_Minerals; } // Returns the available Geysers. // These Geysers are assigned to this Base (it is guaranteed that no other Base provides them). // Note: The size of the returned list may NOT decrease, as Geysers never get destroyed. const std::vector & Geysers() const { return m_Geysers; } // Returns the blocking Minerals. // These Minerals are special ones: they are placed at the exact location of this Base (or very close), // thus blocking the building of a Command Center, Nexus, or Hatchery. // So before trying to build this Base, one have to finish gathering these Minerals first. // Fortunately, these are guaranteed to have their InitialAmount() <= 8. // As an example of blocking Minerals, see the two islands in Andromeda.scx. // Note: if Starting() == true, an empty list is returned. // Note Base::BlockingMinerals() should not be confused with ChokePoint::BlockingNeutral() and Neutral::Blocking(): // the last two refer to a Neutral blocking a ChokePoint, not a Base. const std::vector & BlockingMinerals() const { return m_BlockingMinerals; } Base & operator=(const Base &) = delete; //////////////////////////////////////////////////////////////////////////// // Details: The functions below are used by the BWEM's internals Base(Area * pArea, const BWAPI::TilePosition & location, const std::vector & AssignedRessources, const std::vector & BlockingMinerals); Base(const Base & Other); void SetStartingLocation(const BWAPI::TilePosition & actualLocation); void OnMineralDestroyed(const Mineral * pMineral); private: Map * GetMap() const { return m_pMap; } Map * GetMap() { return m_pMap; } Map * const m_pMap; Area * const m_pArea; BWAPI::TilePosition m_location; BWAPI::Position m_center; std::vector m_Minerals; std::vector m_Geysers; std::vector m_BlockingMinerals; bool m_starting = false; }; } // namespace BWEM #endif