BWAPI
Skynet/Skynet/PlayerTracker.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines