BWAPI
|
00001 #include "BaseTracker.h" 00002 00003 #include <limits> 00004 #include <cassert> 00005 00006 BaseTrackerClass::BaseTrackerClass() 00007 { 00008 } 00009 00010 Base BaseTrackerClass::createBase(std::set<TilePosition> tiles, Region region, bool startLocation, TilePosition position, const UnitGroup &resources) 00011 { 00012 Base base; 00013 if(position != BWAPI::TilePositions::None) 00014 base = Base(new BaseClass(position, resources, region, tiles, startLocation)); 00015 else 00016 base = Base(new BaseClass(region, tiles, startLocation)); 00017 00018 for each(TilePosition tile in tiles) 00019 mTileToBase[tile] = base; 00020 00021 mBases.insert(base); 00022 00023 return base; 00024 } 00025 00026 void BaseTrackerClass::update() 00027 { 00028 for each(Base base in mBases) 00029 { 00030 //TODO: track flying buildings, they can move between bases 00031 base->update(); 00032 00033 //base->drawDebugInfo(); 00034 } 00035 } 00036 00037 void BaseTrackerClass::onDiscover(Unit unit) 00038 { 00039 for each(Base base in mBases) 00040 { 00041 base->onDiscover(unit); 00042 } 00043 } 00044 00045 void BaseTrackerClass::onMorphRenegade(Unit unit, Player previousPlayer, BWAPI::UnitType previousType) 00046 { 00047 for each(Base base in mBases) 00048 { 00049 base->onMorphRenegade(unit, previousPlayer, previousType); 00050 } 00051 } 00052 00053 void BaseTrackerClass::onDestroy(Unit unit) 00054 { 00055 for each(Base base in mBases) 00056 { 00057 base->onDestroy(unit); 00058 } 00059 } 00060 00061 std::set<Base> BaseTrackerClass::getResourceBases() 00062 { 00063 std::set<Base> bases; 00064 00065 for each(Base base in mBases) 00066 { 00067 if(!base->isMinedOut()) 00068 bases.insert(base); 00069 } 00070 00071 return bases; 00072 } 00073 00074 std::set<Base> BaseTrackerClass::getActiveBases(bool activeInFuture, Player player) 00075 { 00076 std::set<Base> bases; 00077 00078 for each(Base base in mBases) 00079 { 00080 if(base->isActive(activeInFuture) && base->getPlayer() == player) 00081 bases.insert(base); 00082 } 00083 00084 return bases; 00085 } 00086 00087 std::set<Base> BaseTrackerClass::getEnemyActiveBases(bool activeInFuture) 00088 { 00089 std::set<Base> bases; 00090 00091 for each(Base base in mBases) 00092 { 00093 if(base->isActive(activeInFuture) && BWAPI::Broodwar->self()->isEnemy(base->getPlayer())) 00094 bases.insert(base); 00095 } 00096 00097 return bases; 00098 } 00099 00100 std::set<Base> BaseTrackerClass::getEnemyBases() 00101 { 00102 std::set<Base> bases; 00103 00104 for each(Base base in mBases) 00105 { 00106 if(BWAPI::Broodwar->self()->isEnemy(base->getPlayer())) 00107 bases.insert(base); 00108 } 00109 00110 return bases; 00111 } 00112 00113 std::set<Base> BaseTrackerClass::getAllyBases() 00114 { 00115 std::set<Base> bases; 00116 00117 for each(Base base in mBases) 00118 { 00119 if(BWAPI::Broodwar->self()->isAlly(base->getPlayer())) 00120 bases.insert(base); 00121 } 00122 00123 return bases; 00124 } 00125 00126 std::set<Base> BaseTrackerClass::getPlayerBases(Player player) 00127 { 00128 std::set<Base> bases; 00129 00130 for each(Base base in mBases) 00131 { 00132 if(base->getPlayer() == player) 00133 bases.insert(base); 00134 } 00135 00136 return bases; 00137 } 00138 00139 std::set<Base> BaseTrackerClass::getImportantBases(Player player) 00140 { 00141 std::set<Base> bases; 00142 00143 for each(Base base in mBases) 00144 { 00145 if(base->getPlayer() == player && (base->isActive(true) || base->getNumberOfTechBuildings() >= 2)) 00146 bases.insert(base); 00147 } 00148 00149 return bases; 00150 } 00151 00152 std::set<Base> BaseTrackerClass::getEnemyImportantBases() 00153 { 00154 std::set<Base> bases; 00155 00156 for each(Base base in mBases) 00157 { 00158 if(BWAPI::Broodwar->self()->isEnemy(base->getPlayer()) && (base->isActive(true) || base->getNumberOfTechBuildings() > 0)) 00159 bases.insert(base); 00160 } 00161 00162 return bases; 00163 }