BWAPI
|
00001 #include "PlayerTracker.h" 00002 00003 #include <sstream> 00004 00005 #include "UnitTracker.h" 00006 #include "BaseTracker.h" 00007 #include "UnitHelper.h" 00008 00009 void PlayerTrackerClass::onBegin() 00010 { 00011 updatePlayers(); 00012 } 00013 00014 void PlayerTrackerClass::update() 00015 { 00016 if(mShowDebugInfo) 00017 { 00018 std::stringstream ss; 00019 ss << "There are "; 00020 00021 if(mEnemyRaceInfo[BWAPI::Races::Zerg]) 00022 ss << "[Zerg]"; 00023 00024 if(mEnemyRaceInfo[BWAPI::Races::Terran]) 00025 ss << "[Terran]"; 00026 00027 if(mEnemyRaceInfo[BWAPI::Races::Protoss]) 00028 ss << "[Protoss]"; 00029 00030 ss << " Enemy Races"; 00031 00032 BWAPI::Broodwar->drawText(BWAPI::CoordinateType::Screen, 15, 5, "%s", ss.str().c_str()); 00033 00034 int y = 20; 00035 if(!getEnemies().empty()) 00036 { 00037 BWAPI::Broodwar->drawTextScreen(5, y, "Enemies:"); 00038 for each(Player player in getEnemies()) 00039 { 00040 y += 10; 00041 BWAPI::Broodwar->drawTextScreen(15, y, "%s", player->getName().c_str()); 00042 } 00043 } 00044 00045 if(!getAllies().empty()) 00046 { 00047 y += 10; 00048 BWAPI::Broodwar->drawTextScreen(5, y, "Allies:"); 00049 for each(Player player in getAllies()) 00050 { 00051 y+=10; 00052 BWAPI::Broodwar->drawTextScreen(15, y, "%s", player->getName().c_str()); 00053 } 00054 } 00055 } 00056 00057 if(BWAPI::Broodwar->getFrameCount() % 240 == 0) 00058 updatePlayers(); 00059 00060 UnitGroup allEnemyUnits; 00061 for each(Unit unit in UnitTracker::Instance().selectAllEnemy()) 00062 { 00063 if(unit->accessibility() == AccessType::Lost) 00064 continue; 00065 00066 const BWAPI::UnitType &type = unit->getType(); 00067 if(type.isBuilding() && !UnitHelper::isStaticDefense(type)) 00068 continue; 00069 00070 if(type.isWorker() || type == BWAPI::UnitTypes::Terran_Vulture_Spider_Mine || type == BWAPI::UnitTypes::Zerg_Overlord || type == BWAPI::UnitTypes::Zerg_Larva || type == BWAPI::UnitTypes::Zerg_Egg) 00071 continue; 00072 00073 allEnemyUnits.insert(unit); 00074 } 00075 00076 mEnemyClusters = UnitHelper::getClusters(allEnemyUnits, 384, 1); 00077 } 00078 00079 void PlayerTrackerClass::onPlayerLeft(Player player) 00080 { 00081 updatePlayers(); 00082 } 00083 00084 void PlayerTrackerClass::onDiscover(Unit unit) 00085 { 00086 if(unit->getType() == BWAPI::UnitTypes::Terran_Siege_Tank_Siege_Mode) 00087 mResearched[unit->getPlayer()].insert(BWAPI::TechTypes::Tank_Siege_Mode); 00088 else if(unit->getType() == BWAPI::UnitTypes::Terran_Vulture_Spider_Mine) 00089 mResearched[unit->getPlayer()].insert(BWAPI::TechTypes::Spider_Mines); 00090 } 00091 00092 void PlayerTrackerClass::onMorphRenegade(Unit unit, Player previousPlayer, BWAPI::UnitType previousType) 00093 { 00094 onDiscover(unit); 00095 } 00096 00097 void PlayerTrackerClass::updatePlayers() 00098 { 00099 mEnemies.clear(); 00100 mAllies.clear(); 00101 mEnemyRaceInfo.clear(); 00102 00103 for each(Player player in BWAPI::Broodwar->getPlayers()) 00104 { 00105 if(player->leftGame()) 00106 continue; 00107 00108 if(player == BWAPI::Broodwar->self()) 00109 continue; 00110 00111 if(BWAPI::Broodwar->self()->isEnemy(player)) 00112 { 00113 mEnemies.insert(player); 00114 mEnemyRaceInfo[player->getRace()] = true; 00115 } 00116 else if(BWAPI::Broodwar->self()->isAlly(player)) 00117 mAllies.insert(player); 00118 } 00119 } 00120 00121 bool PlayerTrackerClass::isEnemyRace(BWAPI::Race race) 00122 { 00123 return mEnemyRaceInfo[race]; 00124 } 00125 00126 bool PlayerTrackerClass::playerHasReseached(Player player, BWAPI::TechType tech) 00127 { 00128 return mResearched[player].find(tech) != mResearched[player].end(); 00129 } 00130 00131 bool PlayerTrackerClass::enemyHasReseached(BWAPI::TechType tech) 00132 { 00133 for each(Player enemy in getEnemies()) 00134 { 00135 if(playerHasReseached(enemy, tech)) 00136 return true; 00137 } 00138 00139 return false; 00140 } 00141 00142 std::set<Player> PlayerTrackerClass::getEnemies(Player player) const 00143 { 00144 if(player == BWAPI::Broodwar->self()) 00145 return mEnemies; 00146 00147 std::set<Player> enemies; 00148 for each(Player enemy in BWAPI::Broodwar->getPlayers()) 00149 { 00150 if(player->isEnemy(enemy)) 00151 enemies.insert(enemy); 00152 } 00153 00154 return enemies; 00155 } 00156 00157 std::set<Player> PlayerTrackerClass::getAllies(Player player) const 00158 { 00159 if(player == BWAPI::Broodwar->self()) 00160 return mAllies; 00161 00162 std::set<Player> allies; 00163 for each(Player ally in BWAPI::Broodwar->getPlayers()) 00164 { 00165 if(player->isAlly(ally)) 00166 allies.insert(ally); 00167 } 00168 00169 return allies; 00170 } 00171 00172 int PlayerTrackerClass::playerUnitCount(BWAPI::UnitType unit, Player player) const 00173 { 00174 return UnitTracker::Instance().selectAllUnits(unit, player).size(); 00175 } 00176 00177 int PlayerTrackerClass::enemyUnitCount(BWAPI::UnitType unit, Player player) const 00178 { 00179 int count = 0; 00180 for each(Player enemy in getEnemies(player)) 00181 { 00182 count += playerUnitCount(unit, enemy); 00183 } 00184 00185 return count; 00186 }