BWAPI
Public Member Functions | Private Member Functions | Private Attributes
ExpansionManagerClass Class Reference

#include <ExpansionManager.h>

List of all members.

Public Member Functions

 ExpansionManagerClass ()
void update ()

Private Member Functions

void updateRefineries ()
void updateDefense ()
void updateExpands ()

Private Attributes

std::list< TaskPointermRefineryTasks
TaskPointer mPylon
std::list< TaskPointermDefenseTasks
std::list< TaskPointermExpandTasks

Detailed Description

Definition at line 8 of file ExpansionManager.h.


Constructor & Destructor Documentation

Definition at line 12 of file ExpansionManager.cpp.

{
}

Member Function Documentation

Definition at line 62 of file ExpansionManager.cpp.

References BWAPI::Broodwar, TaskTypeDef::Defense, BWAPI::Player::getRace(), BWAPI::Races::getRace(), Singleton< T >::Instance(), LOGMESSAGE, mDefenseTasks, mPylon, BWAPI::Races::Protoss, BWAPI::UnitTypes::Protoss_Photon_Cannon, BWAPI::UnitTypes::Protoss_Pylon, BWAPI::UnitType::requiresPsi(), BWAPI::Game::self(), BWAPI::UnitTypes::Terran_Missile_Turret, and BWAPI::Races::Zerg.

Referenced by update().

{
        if(BWAPI::Broodwar->self()->getRace() == BWAPI::Races::Zerg)
                return;

        BWAPI::UnitType defenseType = BWAPI::Broodwar->self()->getRace() == BWAPI::Races::Protoss ? BWAPI::UnitTypes::Protoss_Photon_Cannon : BWAPI::UnitTypes::Terran_Missile_Turret;

        if(!MacroManager::Instance().hasRequirements(defenseType))
                return;

        std::set<Base> myBases = BaseTracker::Instance().getActiveBases(true);
        if(myBases.size() >= 2)
        {
                int defensesNeeded = 0;
                int neededPerBase = PlayerTracker::Instance().isEnemyRace(BWAPI::Races::Zerg) ? 4 : 2;

                for each(Base base in myBases)
                {
                        if(base->getMinerals().empty())
                                continue;

                        bool hasPylon = defenseType.requiresPsi() ? false : true;
                        int thisCount = 0;
                        for each(Unit building in base->getBuildings())
                        {
                                if(building->getType() == defenseType)
                                        ++thisCount;

                                if(building->getType() == BWAPI::UnitTypes::Protoss_Pylon)
                                {
                                        if(building->isCompleted())
                                                hasPylon = true;
                                }
                        }

                        if(hasPylon)
                        {
                                defensesNeeded += neededPerBase;
                                defensesNeeded -= std::min(thisCount, neededPerBase);
                        }
                        else if(BWAPI::Broodwar->self()->supplyTotal() >= 380 && (!mPylon || mPylon->hasEnded()))
                                mPylon = TaskManager::Instance().build(BWAPI::UnitTypes::Protoss_Pylon, TaskType::Defense);
                }

                for(std::list<TaskPointer>::iterator it = mDefenseTasks.begin(); it != mDefenseTasks.end();)
                {
                        if((*it)->hasEnded())
                                mDefenseTasks.erase(it++);
                        else
                        {
                                if(!(*it)->inProgress())
                                        --defensesNeeded;
                                ++it;
                        }
                }

                if(defensesNeeded > 0)
                {
                        for(int i = 0; i < defensesNeeded; ++i)
                        {
                                LOGMESSAGE(String_Builder() << "Built Defense.");
                                mDefenseTasks.push_front(TaskManager::Instance().build(defenseType, TaskType::Defense));
                        }
                }
                else if(defensesNeeded < 0)
                {
                        for(int i = 0; i < defensesNeeded; ++i)
                        {
                                std::list<TaskPointer>::iterator begin = mDefenseTasks.begin();
                                LOGMESSAGE(String_Builder() << "Cancelled Defense.");
                                (*begin)->cancel();
                                mDefenseTasks.erase(begin);
                        }
                }
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 139 of file ExpansionManager.cpp.

References BWAPI::Broodwar, TaskTypeDef::Expansion, BuildingLocationDef::Expansion, BWAPI::Races::getRace(), Singleton< T >::Instance(), LOGMESSAGE, and mExpandTasks.

Referenced by update().

{
        bool unstartedTasks = false;

        for(std::list<TaskPointer>::iterator it = mExpandTasks.begin(); it != mExpandTasks.end();)
        {
                if((*it)->hasEnded())
                        mExpandTasks.erase(it++);
                else
                {
                        if(!(*it)->inProgress())
                                unstartedTasks = true;
                        ++it;
                }
        }

        if(ResourceManager::Instance().isSaturated() && !unstartedTasks)
        {
                LOGMESSAGE(String_Builder() << "Expanded because im saturated.");
                mExpandTasks.push_front(TaskManager::Instance().build(BWAPI::Broodwar->self()->getRace().getCenter(), TaskType::Expansion, BuildingLocation::Expansion));
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 28 of file ExpansionManager.cpp.

References BWAPI::Broodwar, BWAPI::Game::getFrameCount(), BWAPI::Player::getRace(), BWAPI::Races::getRace(), BWAPI::Race::getRefinery(), Singleton< T >::Instance(), mRefineryTasks, TaskTypeDef::RefineryManager, and BWAPI::Game::self().

Referenced by update().

{
        int refNeeded = 0;
        for each(Base base in BaseTracker::Instance().getActiveBases(true))
        {
                if(base->getActivateTime() < unsigned int(BWAPI::Broodwar->getFrameCount() + BWAPI::Broodwar->self()->getRace().getRefinery().buildTime()))
                        refNeeded += base->getGeysers().size();
        }

        for(std::list<TaskPointer>::iterator it = mRefineryTasks.begin(); it != mRefineryTasks.end();)
        {
                if((*it)->hasEnded())
                        mRefineryTasks.erase(it++);
                else
                {
                        if(!(*it)->inProgress())
                                --refNeeded;
                        ++it;
                }
        }

        if(ResourceManager::Instance().requiresRefineries() && refNeeded > 0 && BWAPI::Broodwar->getFrameCount() % 50 == 0)
                mRefineryTasks.push_front(TaskManager::Instance().build(BWAPI::Broodwar->self()->getRace().getRefinery(), TaskType::RefineryManager));
        else if(refNeeded < 0)
        {
                for(int i = 0; i < refNeeded; ++i)
                {
                        std::list<TaskPointer>::iterator begin = mRefineryTasks.begin();
                        (*begin)->cancel();
                        mRefineryTasks.erase(begin);
                }
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

Definition at line 20 of file ExpansionManager.h.

Referenced by updateDefense().

Definition at line 23 of file ExpansionManager.h.

Referenced by updateExpands().

Definition at line 19 of file ExpansionManager.h.

Referenced by updateDefense().

Definition at line 16 of file ExpansionManager.h.

Referenced by updateRefineries().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines