BWAPI
SPAR/AIModule/SparAIModule/PerceptualState/Unit/UnitLocationData.h
Go to the documentation of this file.
00001 #pragma once
00002 #include <BWAPI.h>
00003 #include <iostream>
00004 
00005 class PrimitiveLocation;
00006 class CompositeLocation;
00007 
00011 class UnitLocationData : public Component
00012 {
00013 public:
00014   UnitLocationData(BWAPI::Unit* unit, PrimitiveLocation* location)
00015     : m_unit(unit)
00016     , m_type(unit->getType())
00017     , m_player(unit->getPlayer())
00018     , m_location(location)
00019     , m_primitiveLocationData(NULL)
00020     , m_regionData(NULL)
00021     , m_mapData(NULL)
00022   {
00023   }
00024   virtual ~UnitLocationData() {}
00025   const BWAPI::Player* getPlayer() const { return m_player; }
00026   BWAPI::UnitType getType() const { return m_type; }
00027   PrimitiveLocation* getLocation() const { return m_location; }
00028   void updateLocation(PrimitiveLocation* newLocation) { m_location = newLocation; }
00029 protected:
00030   // ADD AN EVENT MECHANISM IF EVER THERE MAY BE MORE THAN THESE THREE SUBSCRIBERS!
00031   friend class PrimitiveLocation;
00032   friend class CompositeLocation;
00033   void* m_primitiveLocationData;
00034   void* m_regionData;
00035   void* m_mapData;
00036 
00037   BWAPI::Unit* const m_unit;
00038   const BWAPI::Player* const m_player;
00039   BWAPI::UnitType m_type;
00043   PrimitiveLocation* m_location;
00044 };
00045 
00049 class ForeignUnit : public UnitLocationData
00050 {
00051 public:
00055   class SavedState
00056   {
00057   public:
00058     SavedState(BWAPI::Unit* unit)
00059       : m_unitType(unit->getType())
00060       , m_position(unit->getPosition())
00061       , m_hitPoints(unit->getHitPoints())
00062       , m_tilePosition(unit->getTilePosition())
00063       , m_isLifted(unit->isLifted())
00064     {}
00065 
00066     BWAPI::UnitType getType() const { return m_unitType; }
00067     BWAPI::Position getPosition() const { return m_position; }
00068     BWAPI::TilePosition getTilePosition() const { return m_tilePosition; }
00069     int getHitPoints() const { return m_hitPoints; }
00070     bool isLifted() const { return m_isLifted; }
00071 
00072   private:
00073     // Add stuff here as necessary
00074     BWAPI::UnitType m_unitType;
00075     BWAPI::Position m_position;
00076     BWAPI::TilePosition m_tilePosition;
00077     int m_hitPoints;
00078     bool m_isLifted;
00079   };
00080 
00081   ForeignUnit(BWAPI::Unit* unitPtr, PrimitiveLocation* location)
00082     : UnitLocationData(unitPtr, location)
00083     , m_lastKnownState(unitPtr)
00084     , m_lastUnitEvadedFrame(-1)
00085   {}
00086 
00090   bool isAccessible() const
00091   {
00092     // Not yet evaded
00093     return m_lastUnitEvadedFrame == -1;
00094   }
00095 
00096   int getLastEvadedFrame() const
00097   {
00098     return m_lastUnitEvadedFrame;
00099   }
00100 
00101   BWAPI::UnitType getType() const { return isAccessible() ? m_unit->getType() : m_lastKnownState.getType(); }
00102   BWAPI::UnitType getLastType() const { return m_lastKnownState.getType(); }
00103   BWAPI::TilePosition getTilePosition() const { return isAccessible() ? m_unit->getTilePosition() : m_lastKnownState.getTilePosition(); }
00104   BWAPI::Position getPosition() const { return isAccessible() ? m_unit->getPosition() : m_lastKnownState.getPosition(); }
00105 
00110   BWAPI::Unit* getUnit() const
00111   {
00112     // WARNING: IF THE UNIT IS NOT ACCESSIBLE (IN FOG OF WAR) THE UNIT POINTER MAY NOT BE VALID ANY MORE
00113 
00114     // If unit is not accessible, use saved state instead.
00115     // However this can be tolerated for minerals since they always have the same pointer.
00116     assert(isAccessible() || m_lastKnownState.getType().isMineralField());
00117 
00118     return m_unit;
00119   }
00120 
00126   const SavedState& getLastKnownState() const
00127   {
00128     // If unit is accessible, use unit pointer directly
00129     assert(!isAccessible());
00130 
00131     return m_lastKnownState;
00132   }
00133 
00137   void markAsAccessible()
00138   {
00139     m_lastUnitEvadedFrame = -1;
00140   }
00141 
00145   void markAsInaccessible()
00146   {
00147     m_lastKnownState = SavedState(m_unit);
00148 
00149     m_lastUnitEvadedFrame = BWAPI::Broodwar->getFrameCount();
00150   }
00151 
00152 protected:
00153   friend class PrimitiveLocation;
00154 
00158   int m_lastUnitEvadedFrame;
00162   SavedState m_lastKnownState;
00163 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines