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