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

#include <BuildOrderManager.h>

Collaboration diagram for BuildOrderManagerClass:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 BuildOrderManagerClass ()
void onBegin ()
void update ()
bool BuildOrderFinished ()
bool getOrder (Order type) const
const BuildOrdergetCurrentBuild ()
void toggleDebugInfo ()
std::string getOrderName (Order type)

Private Member Functions

void handleBuildItem (const BuildItem &item)
void handleOrderItem (const OrderItem &item)
void checkBuildStatus ()
void LoadProtossBuilds ()
void LoadTerranBuilds ()
void LoadZergBuilds ()
void LoadOtherBuilds ()
void changeCurrentBuild (BuildOrderID ID)
void toggleOrder (Order type)
void BuildCallback (int buildID, CallBackType callbackType)

Private Attributes

std::map< CallBackType,
std::map< TaskPointer, int > > 
mWaitingItems
std::list< BuildItemmItemsWaiting
std::list< OrderItemmOrdersWaiting
std::map< BuildOrderID,
BuildOrder
mBuildOrders
BuildOrderID mCurrentBuild
std::map< Order, bool > mControlValues
bool mShowDebugInfo
bool mFinishedBuild
int mBuildFinishTime

Detailed Description

Definition at line 8 of file BuildOrderManager.h.


Constructor & Destructor Documentation

Definition at line 10 of file BuildOrderManager.cpp.


Member Function Documentation

void BuildOrderManagerClass::BuildCallback ( int  buildID,
CallBackType  callbackType 
) [private]

Definition at line 92 of file BuildOrderManager.cpp.

References handleBuildItem(), handleOrderItem(), mItemsWaiting, and mOrdersWaiting.

Referenced by checkBuildStatus(), and handleBuildItem().

{
        for(std::list<BuildItem>::iterator buildItem = mItemsWaiting.begin(); buildItem != mItemsWaiting.end();)
        {
                buildItem->removeCallback(buildID, callbackType);

                if(buildItem->isFulfilled())
                {
                        handleBuildItem(*buildItem);
                        mItemsWaiting.erase(buildItem++);
                }
                else
                        ++buildItem;
        }

        for(std::list<OrderItem>::iterator orderItem = mOrdersWaiting.begin(); orderItem != mOrdersWaiting.end();)
        {
                orderItem->removeCallback(buildID, callbackType);

                if(orderItem->isFulfilled())
                {
                        handleOrderItem(*orderItem);
                        mOrdersWaiting.erase(orderItem++);
                }
                else
                        ++orderItem;
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 121 of file BuildOrderManager.cpp.

References mItemsWaiting, and mOrdersWaiting.

Referenced by update().

{
        return mItemsWaiting.empty() && mOrdersWaiting.empty();
}

Here is the caller graph for this function:

Definition at line 126 of file BuildOrderManager.cpp.

References BWAPI::Broodwar, BuildOrder::getName(), BWAPI::Races::getRace(), handleBuildItem(), handleOrderItem(), Singleton< T >::Instance(), BuildItem::isFulfilled(), OrderItem::isFulfilled(), LOGMESSAGE, LOGMESSAGEWARNING, mBuildOrders, mControlValues, mCurrentBuild, mFinishedBuild, mItemsWaiting, mOrdersWaiting, BuildOrderIDDef::None, BWAPI::Races::Unknown, and BuildOrderIDDef::Unknown.

Referenced by update().

{
        if(mBuildOrders.find(ID) == mBuildOrders.end())
        {
                LOGMESSAGEWARNING(String_Builder() << "Couldn't find Build Order");
                changeCurrentBuild(BuildOrderID::Unknown);
                return;
        }

        if(mBuildOrders[ID].getRace() != BWAPI::Broodwar->self()->getRace() && mBuildOrders[ID].getRace() != BWAPI::Races::Unknown)
        {
                LOGMESSAGE(String_Builder() << "Build " << mBuildOrders[ID].getName() << " is for " << mBuildOrders[ID].getRace().getName());
                return;
        }

        mFinishedBuild = false;
        mItemsWaiting.clear();
        mOrdersWaiting.clear();
        mControlValues.clear();

        const BuildOrder &order = mBuildOrders[ID];

        if(ID != BuildOrderID::Unknown)
                LOGMESSAGEWARNING(String_Builder() << ((mCurrentBuild == BuildOrderID::None) ? "Opening with " : "Transitioning to ") << order.getName());

        mCurrentBuild = ID;

        for each(const OrderItem &item in order.getOrderItems())
        {
                if(item.isFulfilled())
                        handleOrderItem(item);
                else
                        mOrdersWaiting.push_back(item);
        }

        for each(const BuildItem &item in order.getBuildItems())
        {
                if(item.isFulfilled())
                        handleBuildItem(item);
                else
                        mItemsWaiting.push_back(item);
        }

        MacroManager::Instance().onChangeBuild();
        SquadManager::Instance().onChangeBuild();
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 191 of file BuildOrderManager.cpp.

References BuildCallback(), and mWaitingItems.

Referenced by update().

{
        for(std::map<CallBackType, std::map<TaskPointer, int>>::iterator i = mWaitingItems.begin(); i != mWaitingItems.end();)
        {
                for(std::map<TaskPointer, int>::iterator u = i->second.begin(); u != i->second.end();)
                {
                        if(i->first == CallBackType::onDispatched && u->first->hasDispatched())
                        {
                                BuildCallback(u->second, CallBackType::onDispatched);
                                i->second.erase(u++);
                        }
                        else if(i->first == CallBackType::onStarted && u->first->inProgress())
                        {
                                BuildCallback(u->second, CallBackType::onStarted);
                                i->second.erase(u++);
                        }
                        else if(i->first == CallBackType::onCompleted && u->first->isCompleted())
                        {
                                BuildCallback(u->second, CallBackType::onCompleted);
                                i->second.erase(u++);
                        }
                        else
                                ++u;
                }

                if(i->second.empty())
                        mWaitingItems.erase(i++);
                else
                        ++i;
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 20 of file BuildOrderManager.h.

References mBuildOrders, and mCurrentBuild.

bool BuildOrderManagerClass::getOrder ( Order  type) const [inline]

Definition at line 18 of file BuildOrderManager.h.

References mControlValues.

Referenced by handleOrderItem().

{ return (mControlValues.count(type) != 0 ? mControlValues.find(type)->second : false); }

Here is the caller graph for this function:

Definition at line 240 of file BuildOrderManager.cpp.

References OrderDef::CanRemoveSquads, OrderDef::ExpansionManager, OrderDef::MacroArmyProduction, OrderDef::MacroCanTech, OrderDef::MacroProductionFacilities, OrderDef::RefineryManager, OrderDef::Scout, OrderDef::SupplyManager, OrderDef::TrainWorkers, and SafeEnum< def, inner >::underlying().

Referenced by handleOrderItem(), and update().

{
        switch(type.underlying())
        {
        case Order::TrainWorkers:
                return "Train Workers";
        case Order::Scout:
                return "Scout";
        case Order::SupplyManager:
                return "Supply Manager";
        case Order::RefineryManager:
                return "Refinery Manager";
        case Order::MacroArmyProduction:
                return "Army Train Manager";
        case Order::CanRemoveSquads:
                return "Can Remove Squads";
        case Order::ExpansionManager:
                return "Expansion Manager";
        case Order::MacroProductionFacilities:
                return "Macro : Can Produce Production Facilities";
        case Order::MacroCanTech:
                return "Macro : Can Tech";
        }
        return "None";
}

Here is the call graph for this function:

Here is the caller graph for this function:

void BuildOrderManagerClass::handleBuildItem ( const BuildItem item) [private]

Definition at line 223 of file BuildOrderManager.cpp.

References BuildCallback(), BuildItem::createTask(), BuildItem::getID(), and mWaitingItems.

Referenced by BuildCallback(), and changeCurrentBuild().

{
        TaskPointer ptr = item.createTask();
        if(ptr)
        {
                mWaitingItems[CallBackType::onDispatched][ptr] = item.getID();
                mWaitingItems[CallBackType::onStarted][ptr] = item.getID();
                mWaitingItems[CallBackType::onCompleted][ptr] = item.getID();
        }
        else
        {
                BuildCallback(item.getID(), CallBackType::onDispatched);
                BuildCallback(item.getID(), CallBackType::onStarted);
                BuildCallback(item.getID(), CallBackType::onCompleted);
        }
}

Here is the call graph for this function:

Here is the caller graph for this function:

void BuildOrderManagerClass::handleOrderItem ( const OrderItem item) [private]

Definition at line 173 of file BuildOrderManager.cpp.

References getOrder(), getOrderName(), OrderItem::getType(), LOGMESSAGE, and toggleOrder().

Referenced by BuildCallback(), and changeCurrentBuild().

{
        toggleOrder(item.getType());

        LOGMESSAGE(String_Builder() << "Handled Order " << getOrderName(item.getType()) << (getOrder(item.getType()) ? ": Set to True" : ": Set to False"));
        LOGMESSAGE(String_Builder() );
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 5 of file LoadOtherBuilds.cpp.

References BWAPI::Broodwar, OrderDef::CanRemoveSquads, ArmyBehaviourDef::Default, OrderDef::ExpansionManager, BWAPI::Races::getRace(), Singleton< T >::Instance(), OrderDef::MacroArmyProduction, OrderDef::MacroCanTech, OrderDef::MacroProductionFacilities, mBuildOrders, BWAPI::BulletTypes::None, BuildOrderIDDef::None, BWAPI::Races::Protoss, BWAPI::UnitTypes::Protoss_Arbiter, BWAPI::UnitTypes::Protoss_Dragoon, BWAPI::UnitTypes::Protoss_High_Templar, BWAPI::UnitTypes::Protoss_Zealot, OrderDef::RefineryManager, OrderDef::Scout, OrderDef::SupplyManager, BWAPI::Races::Terran, BWAPI::UnitTypes::Terran_Firebat, BWAPI::UnitTypes::Terran_Marine, BWAPI::UnitTypes::Terran_Medic, BWAPI::UnitTypes::Terran_Science_Vessel, OrderDef::TrainWorkers, BWAPI::BulletTypes::Unknown, BuildOrderIDDef::Unknown, BWAPI::Races::Zerg, and BWAPI::UnitTypes::Zerg_Zergling.

Referenced by onBegin().

{
        using namespace BWAPI::Races;
        using namespace BWAPI::UnitTypes;
        using namespace BWAPI::UpgradeTypes;
        using namespace BWAPI::TechTypes;

        int ID_1 = 0;
        int ID_2 = 0;
        int ID_3 = 0;

        mBuildOrders[BuildOrderID::Unknown] = BuildOrder(BuildOrderID::Unknown, "Unknown");
        mBuildOrders[BuildOrderID::Unknown].setArmyBehaviour(ArmyBehaviour::Default);
        mBuildOrders[BuildOrderID::Unknown].addSquad(SquadType::DefaultSquad, 1);

        mBuildOrders[BuildOrderID::Unknown].addOrder(Order::TrainWorkers);
        mBuildOrders[BuildOrderID::Unknown].addOrder(Order::Scout);
        mBuildOrders[BuildOrderID::Unknown].addOrder(Order::SupplyManager);
        mBuildOrders[BuildOrderID::Unknown].addOrder(Order::RefineryManager);
        mBuildOrders[BuildOrderID::Unknown].addOrder(Order::MacroArmyProduction);
        mBuildOrders[BuildOrderID::Unknown].addOrder(Order::CanRemoveSquads);
        mBuildOrders[BuildOrderID::Unknown].addOrder(Order::ExpansionManager);
        mBuildOrders[BuildOrderID::Unknown].addOrder(Order::MacroProductionFacilities);
        mBuildOrders[BuildOrderID::Unknown].addOrder(Order::MacroCanTech);

        if(BWAPI::Broodwar->self()->getRace() == BWAPI::Races::Protoss)
        {
                mBuildOrders[BuildOrderID::Unknown].addProduce(BWAPI::UnitTypes::Protoss_Zealot, 2);
                mBuildOrders[BuildOrderID::Unknown].addProduce(BWAPI::UnitTypes::Protoss_Dragoon, 3);
                mBuildOrders[BuildOrderID::Unknown].addProduce(BWAPI::UnitTypes::Protoss_High_Templar, 1);
                mBuildOrders[BuildOrderID::Unknown].addProduce(BWAPI::UnitTypes::Protoss_Arbiter, 1);
        }
        else if(BWAPI::Broodwar->self()->getRace() == BWAPI::Races::Terran)
        {
                mBuildOrders[BuildOrderID::Unknown].addProduce(BWAPI::UnitTypes::Terran_Marine, 5);
                mBuildOrders[BuildOrderID::Unknown].addProduce(BWAPI::UnitTypes::Terran_Medic, 1);
                if(PlayerTracker::Instance().isEnemyRace(BWAPI::Races::Zerg))
                        mBuildOrders[BuildOrderID::Unknown].addProduce(BWAPI::UnitTypes::Terran_Firebat, 1);
                mBuildOrders[BuildOrderID::Unknown].addProduce(BWAPI::UnitTypes::Terran_Science_Vessel, 1);
        }
        else if(BWAPI::Broodwar->self()->getRace() == BWAPI::Races::Zerg)
        {
                mBuildOrders[BuildOrderID::Unknown].addProduce(BWAPI::UnitTypes::Zerg_Zergling, 1);
        }

        mBuildOrders[BuildOrderID::None] = BuildOrder(BuildOrderID::None, "None");

//      BuildOrder testBuild(Protoss, BuildOrderID::Test, "Test Build");
// 
//      testBuild.addStartingCondition(Condition(ConditionType::defaultCondition));
// 
//      mBuildOrders[BuildOrderID::Test] = testBuild;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 3 of file LoadProtossBuilds.cpp.

References BuildOrder::addItem(), BuildOrderIDDef::AdditionalGateWays, BuildOrder::addNextBuild(), BuildOrder::addOrder(), BuildOrder::addProduce(), BuildOrder::addSquad(), ArmyBehaviourDef::Aggresive, BuildOrderIDDef::ArconTiming, TaskTypeDef::Army, BuildingLocationDef::BaseChoke, ConditionTestDef::canForgeExpand, OrderDef::CanRemoveSquads, CB(), BuildOrderIDDef::CitadelFirst, BuildOrderIDDef::CoreIntoStargate, ArmyBehaviourDef::Default, ArmyBehaviourDef::Defensive, ConditionTestDef::enemyHasResearched, ConditionTestDef::enemyUnitCountGreaterEqualThan, TaskTypeDef::Expansion, BuildingLocationDef::Expansion, BuildingLocationDef::ExpansionGas, OrderDef::ExpansionManager, BuildOrderIDDef::ForgeExpand, BuildOrderIDDef::FourGateGoon, BuildOrderIDDef::FourteenNexus, TaskTypeDef::Highest, ConditionTestDef::isEnemyProtoss, ConditionTestDef::isEnemyTerran, ConditionTestDef::isEnemyZerg, ConditionTestDef::isResearching, BWAPI::UpgradeTypes::Leg_Enhancements, OrderDef::MacroArmyProduction, OrderDef::MacroCanTech, TaskTypeDef::MacroExtraProduction, OrderDef::MacroProductionFacilities, TaskTypeDef::MacroUrgent, ConditionTestDef::mapSize, mBuildOrders, ConditionTestDef::myPlannedUnitTotalGreaterEqualThan, ConditionTestDef::myPlannedUnitTotalLessThan, ConditionTestDef::myUnitTotalBuildCountLessThan, BuildOrderIDDef::Nexus, ConditionTestDef::numberOfEnemies, BuildOrderIDDef::OneGateCore, BWAPI::Races::Protoss, BWAPI::UnitTypes::Protoss_Arbiter, BWAPI::UnitTypes::Protoss_Archon, BWAPI::UnitTypes::Protoss_Assimilator, BWAPI::UnitTypes::Protoss_Carrier, BWAPI::UnitTypes::Protoss_Citadel_of_Adun, BWAPI::UnitTypes::Protoss_Corsair, BWAPI::UnitTypes::Protoss_Cybernetics_Core, BWAPI::UnitTypes::Protoss_Dragoon, BWAPI::UnitTypes::Protoss_Forge, BWAPI::UnitTypes::Protoss_Gateway, BWAPI::UpgradeTypes::Protoss_Ground_Weapons, BWAPI::UnitTypes::Protoss_High_Templar, BWAPI::UnitTypes::Protoss_Nexus, BWAPI::UnitTypes::Protoss_Observatory, BWAPI::UnitTypes::Protoss_Observer, BWAPI::UnitTypes::Protoss_Photon_Cannon, BWAPI::UnitTypes::Protoss_Probe, BWAPI::UnitTypes::Protoss_Pylon, BWAPI::UnitTypes::Protoss_Reaver, BWAPI::UnitTypes::Protoss_Robotics_Facility, BWAPI::UnitTypes::Protoss_Robotics_Support_Bay, BWAPI::UnitTypes::Protoss_Shuttle, BWAPI::UnitTypes::Protoss_Stargate, BWAPI::UnitTypes::Protoss_Templar_Archives, BWAPI::UnitTypes::Protoss_Zealot, BWAPI::BulletTypes::Psionic_Storm, BuildOrderIDDef::PvPEndGame, BuildOrderIDDef::PvPMidGame, BuildOrderIDDef::PvTCarrierSwitch, BuildOrderIDDef::PvTEndGame, BuildOrderIDDef::PvTMidGame, BuildOrderIDDef::PvZEndGame, OrderDef::RefineryManager, BuildOrderIDDef::RoboVsProtoss, BuildOrderIDDef::RoboVsTerran, OrderDef::Scout, BuildOrder::setArmyBehaviour(), BuildOrder::setDefaultBuild(), BuildOrder::setStartingCondition(), BWAPI::UpgradeTypes::Singularity_Charge, BuildOrderIDDef::StargateArcon, TaskTypeDef::Supply, OrderDef::SupplyManager, BWAPI::TechTypes::Tank_Siege_Mode, OrderDef::TrainWorkers, BuildOrderIDDef::TwoGate, TaskTypeDef::Worker, and BWAPI::UnitTypes::Zerg_Mutalisk.

Referenced by onBegin().

{
        using namespace BWAPI::Races;
        using namespace BWAPI::UnitTypes;
        using namespace BWAPI::UpgradeTypes;
        using namespace BWAPI::TechTypes;

        int ID_1 = 0;
        int ID_2 = 0;
        int ID_3 = 0;

        /**************************************************************************************************/
        /* Against Zerg                                                                                   */
        /**************************************************************************************************/

        Condition corsairBuildCondition(Condition(ConditionTest::myUnitTotalBuildCountLessThan, Protoss_Corsair, 12) || (Condition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Corsair, 12) && Condition(ConditionTest::enemyUnitCountGreaterEqualThan, Zerg_Mutalisk, 12)));
        Condition corsairStargateCondition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Stargate, 2);

        /************************************************************************/
        /* Forge Expand                                                         */
        /************************************************************************/

        BuildOrder forgeExpand(Protoss, BuildOrderID::ForgeExpand, "Forge Expand");

        //Starting Conditions
        forgeExpand.setStartingCondition(Condition(ConditionTest::numberOfEnemies, 1) && Condition(ConditionTest::isEnemyZerg) && Condition(ConditionTest::canForgeExpand));
        //Condition(ConditionType::minDistanceBetweenMainsGreaterThan, double(BWAPI::UnitTypes::Protoss_Photon_Cannon.buildTime()*BWAPI::UnitTypes::Zerg_Zergling.topSpeed())); //meh, if we know how to forge expand, must be viable

        forgeExpand.setArmyBehaviour(ArmyBehaviour::Defensive);

        forgeExpand.setDefaultBuild(BuildOrderID::StargateArcon);

        //Units to Produce
        forgeExpand.addProduce(Protoss_Zealot, 1);

        // Build Order
                        forgeExpand.addItem(Protoss_Probe, 4, TaskType::Highest);
        ID_1 =  forgeExpand.addItem(Protoss_Pylon, 1, BuildingLocation::BaseChoke, TaskType::Highest); //Pylon on 8
                        forgeExpand.addOrder(Order::Scout, CB(ID_1, CallBackType::onStarted));

                        forgeExpand.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
        ID_1 =  forgeExpand.addItem(Protoss_Forge, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::BaseChoke); //Forge on 10
                        forgeExpand.addOrder(Order::TrainWorkers, CB(ID_1, CallBackType::onDispatched));
                        forgeExpand.addOrder(Order::SupplyManager, CB(ID_1, CallBackType::onDispatched));

        ID_1 =  forgeExpand.addItem(Protoss_Photon_Cannon, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::BaseChoke);
        ID_1 =  forgeExpand.addItem(Protoss_Photon_Cannon, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::BaseChoke);
        ID_1 =  forgeExpand.addItem(Protoss_Nexus, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::ExpansionGas);
        ID_1 =  forgeExpand.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::BaseChoke);

        // Add
        // TODO: don't forge ecpand for competition, doesn't force army / defense at all and if they go mass muta it wont always get
        // enough anti air out in time
        //mBuildOrders[BuildOrderID::ForgeExpand] = forgeExpand;

        /************************************************************************/
        /* Stargate Arcon                                                       */
        /************************************************************************/

        BuildOrder starArcon(Protoss, BuildOrderID::StargateArcon, "Stargate into Arcon");

        starArcon.addNextBuild(BuildOrderID::ArconTiming, Condition(ConditionTest::myPlannedUnitTotalGreaterEqualThan, Protoss_Archon, 3));//go to timing attack if i have 2 arcons
        starArcon.setDefaultBuild(BuildOrderID::ArconTiming, 24*60*4);//or 4 mins have passed

        starArcon.setArmyBehaviour(ArmyBehaviour::Defensive);

        // Constants
        starArcon.addOrder(Order::TrainWorkers);
        starArcon.addOrder(Order::MacroArmyProduction);
        starArcon.addOrder(Order::SupplyManager);
        starArcon.addOrder(Order::Scout);

        // Squads
        starArcon.addSquad(SquadType::CorsairSquad);

        //Units to Produce
        starArcon.addProduce(Protoss_High_Templar, 2, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
        starArcon.addProduce(Protoss_Corsair, 3, 100, corsairBuildCondition, corsairStargateCondition);
        starArcon.addProduce(Protoss_Zealot, 1);
        starArcon.addProduce(Protoss_Dragoon, 1);

        // Build Order
                        starArcon.addItem(Protoss_Zealot, 6, TaskType::Army);
                        starArcon.addItem(Protoss_Assimilator);
        ID_1 =  starArcon.addItem(Protoss_Cybernetics_Core);
                        starArcon.addItem(Protoss_Stargate, 1, TaskType::Highest);
                        starArcon.addItem(Protoss_Corsair, 2, TaskType::Highest);

                        starArcon.addOrder(Order::RefineryManager, CB(ID_1, CallBackType::onDispatched));
                        starArcon.addItem(Protoss_Ground_Weapons, 1, CB(ID_1, CallBackType::onDispatched));
                        starArcon.addItem(Protoss_Gateway, TaskType::MacroExtraProduction, CB(ID_1, CallBackType::onDispatched));
        ID_1 =  starArcon.addItem(Protoss_Citadel_of_Adun, TaskType::Army, CB(ID_1, CallBackType::onDispatched));
                        starArcon.addItem(Protoss_Photon_Cannon, TaskType::Army, CB(ID_1, CallBackType::onDispatched), 4);
                        

                        starArcon.addItem(Leg_Enhancements, 1, TaskType::MacroUrgent, CB(ID_1, CallBackType::onDispatched));
                        starArcon.addItem(Protoss_Templar_Archives, TaskType::Army, CB(ID_1, CallBackType::onDispatched));
                        starArcon.addItem(Psionic_Storm, TaskType::MacroUrgent, CB(ID_1, CallBackType::onDispatched));

                        starArcon.addOrder(Order::MacroProductionFacilities,  CB(ID_1, CallBackType::onDispatched));
        

        // Add
        mBuildOrders[BuildOrderID::StargateArcon] = starArcon;

        /************************************************************************/
        /* Arcon Timing                                                         */
        /************************************************************************/

        BuildOrder ArconTiming(Protoss, BuildOrderID::ArconTiming, "Arcon Timing Attack");

        // Constants
        ArconTiming.addOrder(Order::TrainWorkers);
        ArconTiming.addOrder(Order::SupplyManager);
        ArconTiming.addOrder(Order::MacroArmyProduction);
        ArconTiming.addOrder(Order::RefineryManager);
        ArconTiming.addOrder(Order::MacroProductionFacilities);
        ArconTiming.addOrder(Order::MacroCanTech);
        ArconTiming.addOrder(Order::ExpansionManager);
        ArconTiming.addOrder(Order::Scout);

        ArconTiming.setDefaultBuild(BuildOrderID::PvZEndGame, 24*60*1);

        // Squads
        ArconTiming.addSquad(SquadType::CorsairSquad);

        //Units to Produce
        ArconTiming.addProduce(Protoss_High_Templar, 2, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
        ArconTiming.addProduce(Protoss_Corsair, 3, 100, corsairBuildCondition, corsairStargateCondition);
        ArconTiming.addProduce(Protoss_Zealot, 1);
        ArconTiming.addProduce(Protoss_Dragoon, 1);

        ArconTiming.setArmyBehaviour(ArmyBehaviour::Aggresive);

        // Add
        mBuildOrders[BuildOrderID::ArconTiming] = ArconTiming;

        /************************************************************************/
        /* PvZ End Game                                                         */
        /************************************************************************/

        BuildOrder pvzEnd(Protoss, BuildOrderID::PvZEndGame, "PvZ End Game");

        // Constants
        pvzEnd.addOrder(Order::TrainWorkers);
        pvzEnd.addOrder(Order::SupplyManager);
        pvzEnd.addOrder(Order::MacroArmyProduction);
        pvzEnd.addOrder(Order::RefineryManager);
        pvzEnd.addOrder(Order::MacroProductionFacilities);
        pvzEnd.addOrder(Order::MacroCanTech);
        pvzEnd.addOrder(Order::ExpansionManager);
        pvzEnd.addOrder(Order::Scout);

        pvzEnd.setArmyBehaviour(ArmyBehaviour::Default);

        // Squads
        pvzEnd.addSquad(SquadType::CorsairSquad);

        //Units to Produce
        pvzEnd.addProduce(Protoss_High_Templar, 2, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
        pvzEnd.addProduce(Protoss_Corsair, 3, 100, corsairBuildCondition, corsairStargateCondition);
        pvzEnd.addProduce(Protoss_Zealot, 1);
        pvzEnd.addProduce(Protoss_Dragoon, 1);

        // Add
        mBuildOrders[BuildOrderID::PvZEndGame] = pvzEnd;

        /************************************************************************/
        /* Two Gate                                                             */
        /************************************************************************/

        BuildOrder twoGate(Protoss, BuildOrderID::TwoGate, "2 Gate");

        //Starting Conditions
        twoGate.setStartingCondition(Condition(ConditionTest::isEnemyZerg) || Condition(ConditionTest::isEnemyProtoss));

        // Follow Ups
        twoGate.addNextBuild(BuildOrderID::CoreIntoStargate, Condition(ConditionTest::isEnemyZerg));
        twoGate.addNextBuild(BuildOrderID::FourGateGoon, Condition(ConditionTest::isEnemyProtoss));

        //Units to Produce
        twoGate.addProduce(Protoss_Zealot, 1);

        //Army Behaviour
        twoGate.setArmyBehaviour(ArmyBehaviour::Aggresive);

        // Build Order
        ID_1 =  twoGate.addItem(Protoss_Probe, 4);
        ID_1 =  twoGate.addItem(Protoss_Pylon, CB(ID_1, CallBackType::onDispatched)); //Pylon on 8
                        twoGate.addOrder(Order::Scout, CB(ID_1, CallBackType::onStarted));

        ID_1 =  twoGate.addItem(Protoss_Probe, CB(ID_1, CallBackType::onDispatched), 2);
        ID_1 =  twoGate.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched)); //Gateway on 10
        ID_1 =  twoGate.addItem(Protoss_Probe, CB(ID_1, CallBackType::onDispatched), 2);
        ID_1 =  twoGate.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched)); //Gateway on 12
        ID_1 =  twoGate.addItem(Protoss_Probe, CB(ID_1, CallBackType::onDispatched));
        ID_1 =  twoGate.addItem(Protoss_Zealot, CB(ID_1, CallBackType::onDispatched));//Zealot on 13
        ID_1 =  twoGate.addItem(Protoss_Pylon, CB(ID_1, CallBackType::onDispatched));
        ID_1 =  twoGate.addItem(Protoss_Probe, CB(ID_1, CallBackType::onDispatched), 2);
        ID_1 =  twoGate.addItem(Protoss_Zealot, CB(ID_1, CallBackType::onDispatched), 2);

        twoGate.addOrder(Order::TrainWorkers, CB(ID_1, CallBackType::onDispatched));
        twoGate.addOrder(Order::SupplyManager, CB(ID_1, CallBackType::onDispatched));

        // Add
        mBuildOrders[BuildOrderID::TwoGate] = twoGate;

        /************************************************************************/
        /* Core into Stargate                                                   */
        /************************************************************************/

        BuildOrder coreStar(Protoss, BuildOrderID::CoreIntoStargate, "Cybernetics Core into Stargate");

        // Follow Ups
        coreStar.setDefaultBuild(BuildOrderID::PvZEndGame, 24*60*1);

        // Constants
        coreStar.addOrder(Order::TrainWorkers);
        coreStar.addOrder(Order::SupplyManager);
        coreStar.addOrder(Order::MacroArmyProduction);
        coreStar.addOrder(Order::Scout);

        // Squads
        coreStar.addSquad(SquadType::CorsairSquad);

        //Units to Produce
        coreStar.addProduce(Protoss_Zealot, 1);
        coreStar.addProduce(Protoss_Dragoon, 1);
        coreStar.addProduce(Protoss_Corsair, 2, 100, corsairBuildCondition, corsairStargateCondition);

        //Army Behaviour
        coreStar.setArmyBehaviour(ArmyBehaviour::Aggresive);

        // Build Order
        ID_1 =  coreStar.addItem(Protoss_Assimilator);
                        coreStar.addOrder(Order::RefineryManager, CB(ID_1, CallBackType::onDispatched));

        ID_1 =  coreStar.addItem(Protoss_Cybernetics_Core);
                        coreStar.addItem(Protoss_Stargate, CB(ID_1, CallBackType::onDispatched));

        coreStar.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));
        

        // Add
        mBuildOrders[BuildOrderID::CoreIntoStargate] = coreStar;

        /**************************************************************************************************/
        /* Against Terran                                                                                 */
        /**************************************************************************************************/

        /************************************************************************/
        /* 14 Nexus                                                             */
        /************************************************************************/

        BuildOrder fourteenNexus(Protoss, BuildOrderID::FourteenNexus, "14 Nexus");

        //Starting Conditions
        fourteenNexus.setStartingCondition(Condition(ConditionTest::isEnemyTerran) && Condition(ConditionTest::numberOfEnemies, 1) && Condition(ConditionTest::mapSize, 4));

        fourteenNexus.setDefaultBuild(BuildOrderID::CitadelFirst, 24*60*2);

        //Units to Produce
        fourteenNexus.addProduce(Protoss_Dragoon, 6);
        fourteenNexus.addProduce(Protoss_Zealot, 1);

        //Army Behaviour
        fourteenNexus.setArmyBehaviour(ArmyBehaviour::Defensive);

        // Build Order
        ID_1 =  fourteenNexus.addItem(Protoss_Probe, 4, TaskType::Highest);
        ID_1 =  fourteenNexus.addItem(Protoss_Pylon, TaskType::Supply, CB(ID_1, CallBackType::onDispatched)); //Pylon on 8
                        fourteenNexus.addOrder(Order::Scout, CB(ID_1, CallBackType::onStarted));
        ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 5);
        ID_1 =  fourteenNexus.addItem(Protoss_Nexus, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::Expansion);
        ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched));
        ID_1 =  fourteenNexus.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched)); //Gateway on 14
        ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched));
        ID_1 =  fourteenNexus.addItem(Protoss_Assimilator, CB(ID_1, CallBackType::onDispatched)); //Gas on 15
        ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
        ID_1 =  fourteenNexus.addItem(Protoss_Cybernetics_Core, CB(ID_1, CallBackType::onDispatched)); //core on 17
        ID_1 =  fourteenNexus.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched)); //gate on 17
        ID_1 =  fourteenNexus.addItem(Protoss_Zealot, TaskType::Army, CB(ID_1, CallBackType::onDispatched)); //zealot on 17
        ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
        ID_1 =  fourteenNexus.addItem(Protoss_Pylon, TaskType::Supply, CB(ID_1, CallBackType::onDispatched)); //pylon on 21
        ID_1 =  fourteenNexus.addItem(Protoss_Dragoon, TaskType::Army, CB(ID_1, CallBackType::onDispatched), 2);//2 Dragoon on 21
        ID_1 =  fourteenNexus.addItem(Singularity_Charge, 1, CB(ID_1, CallBackType::onDispatched));//range on 25
        ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
        ID_1 =  fourteenNexus.addItem(Protoss_Pylon, TaskType::Supply, CB(ID_1, CallBackType::onDispatched)); //pylon on 27
        ID_1 =  fourteenNexus.addItem(Protoss_Dragoon, TaskType::Army, CB(ID_1, CallBackType::onDispatched), 2);//2 Dragoon on 27
        ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
        ID_1 =  fourteenNexus.addItem(Protoss_Pylon, TaskType::Supply, CB(ID_1, CallBackType::onDispatched)); //pylon on 33
        ID_1 =  fourteenNexus.addItem(Protoss_Dragoon, TaskType::Army, CB(ID_1, CallBackType::onDispatched), 2);//2 Dragoon on 35

        fourteenNexus.addOrder(Order::TrainWorkers, CB(ID_1, CallBackType::onDispatched));
        fourteenNexus.addOrder(Order::SupplyManager, CB(ID_1, CallBackType::onDispatched));
        fourteenNexus.addOrder(Order::MacroArmyProduction, CB(ID_1, CallBackType::onDispatched));
        fourteenNexus.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));

        // Add
        mBuildOrders[BuildOrderID::FourteenNexus] = fourteenNexus;

        /************************************************************************/
        /* One Gate Core                                                        */
        /************************************************************************/

        BuildOrder oneGateCore(Protoss, BuildOrderID::OneGateCore, "1 Gate Core");

        //Starting Conditions
        oneGateCore.setStartingCondition(Condition(ConditionTest::isEnemyTerran) || Condition(ConditionTest::isEnemyProtoss));

        //oneGateCore.addNextBuild(buildRoboVsTerran, Condition(ConditionType::isEnemyTerran));
        oneGateCore.addNextBuild(BuildOrderID::AdditionalGateWays, Condition(ConditionTest::isEnemyTerran));
        oneGateCore.addNextBuild(BuildOrderID::RoboVsProtoss, Condition(ConditionTest::isEnemyProtoss));

        //Army Behaviour
        oneGateCore.setArmyBehaviour(ArmyBehaviour::Aggresive);

        // Build Order
                        oneGateCore.addItem(Protoss_Probe, 4, TaskType::Highest);
        ID_1 =  oneGateCore.addItem(Protoss_Pylon, 1); //Pylon on 8
                        oneGateCore.addOrder(Order::TrainWorkers, CB(ID_1, CallBackType::onDispatched));
                        oneGateCore.addOrder(Order::Scout, CB(ID_1, CallBackType::onStarted));
        ID_1 =  oneGateCore.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched)); //Gateway on 10
        //ID_1 =        oneGateCore.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
        ID_1 =  oneGateCore.addItem(Protoss_Assimilator, CB(ID_1, CallBackType::onDispatched)); //gas on 12
        //ID_1 =        oneGateCore.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 1);//build a zealot based on some conditions? gas steal or is pvp
        //ID_1 =        oneGateCore.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 1);
        ID_1 =  oneGateCore.addItem(Protoss_Cybernetics_Core, CB(ID_1, CallBackType::onDispatched)); //core on 14
        //ID_1 =        oneGateCore.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched));
        ID_1 =  oneGateCore.addItem(Protoss_Pylon, TaskType::Supply, CB(ID_1, CallBackType::onDispatched)); //pylon on 15
        //ID_1 =        oneGateCore.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched));

        oneGateCore.addOrder(Order::SupplyManager, CB(ID_1, CallBackType::onDispatched));
        oneGateCore.addOrder(Order::RefineryManager, CB(ID_1, CallBackType::onDispatched));

        // Add
        mBuildOrders[BuildOrderID::OneGateCore] = oneGateCore;

        /************************************************************************/
        /* Robo First                                                           */
        /************************************************************************/

        BuildOrder roboPvT(Protoss, BuildOrderID::RoboVsTerran, "Robotics Facility First");

        // Constants
        roboPvT.addOrder(Order::TrainWorkers);
        roboPvT.addOrder(Order::RefineryManager);
        roboPvT.addOrder(Order::Scout);

        roboPvT.setArmyBehaviour(ArmyBehaviour::Defensive);

        roboPvT.addNextBuild(BuildOrderID::CitadelFirst, Condition(ConditionTest::myPlannedUnitTotalGreaterEqualThan, Protoss_Reaver, 1) && Condition(ConditionTest::myPlannedUnitTotalGreaterEqualThan, Protoss_Shuttle, 1));

        // Follow Ups
        roboPvT.setDefaultBuild(BuildOrderID::CitadelFirst, 24*60*2);

        // Squads
        roboPvT.addSquad(SquadType::ReaverDropSquad);

        //Units to Produce
        roboPvT.addProduce(Protoss_Dragoon, 1);

        // Build Order
        ID_3 =  roboPvT.addItem(Protoss_Dragoon, 4, TaskType::Army);
                        roboPvT.addOrder(Order::MacroArmyProduction, CB(ID_3, CallBackType::onDispatched));
        ID_1 =  roboPvT.addItem(Protoss_Pylon, 1, TaskType::Supply);
        ID_1 =  roboPvT.addItem(Protoss_Robotics_Facility, CB(ID_1, CallBackType::onStarted));
                        roboPvT.addItem(Singularity_Charge, 1, CB(ID_1, CallBackType::onDispatched));
        ID_1 =  roboPvT.addItem(Protoss_Observatory, CB(ID_1, CallBackType::onCompleted));
        ID_2 =  roboPvT.addItem(Protoss_Observer, CB(ID_1, CallBackType::onStarted));
        ID_1 =  roboPvT.addItem(Protoss_Nexus, TaskType::Expansion, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::Expansion);
                        roboPvT.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));
                        roboPvT.addOrder(Order::SupplyManager, CB(ID_1, CallBackType::onDispatched));
        ID_2 =  roboPvT.addItem(Protoss_Shuttle, CB(ID_2, CallBackType::onDispatched));
                        roboPvT.addItem(Protoss_Reaver, CB(ID_2, CallBackType::onDispatched));
        ID_1 =  roboPvT.addItem(Protoss_Robotics_Support_Bay, CB(ID_1, CallBackType::onDispatched));

        // Add
        mBuildOrders[BuildOrderID::RoboVsTerran] = roboPvT;

        /************************************************************************/
        /* Branch 1: Additional Gateways                                        */
        /************************************************************************/

        BuildOrder gateways(Protoss, BuildOrderID::AdditionalGateWays, "Additional Gateways");

        // Constants
        gateways.addOrder(Order::TrainWorkers);
        gateways.addOrder(Order::SupplyManager);
        gateways.addOrder(Order::Scout);

        gateways.setArmyBehaviour(ArmyBehaviour::Aggresive);

        // Follow Ups
        gateways.setDefaultBuild(BuildOrderID::Nexus, 24*60*4);

        gateways.addNextBuild(BuildOrderID::Nexus, Condition(ConditionTest::enemyHasResearched, BWAPI::TechTypes::Tank_Siege_Mode));

        //Units to Produce
        gateways.addProduce(Protoss_Dragoon, 1);

        // Build Order
        ID_1 =  gateways.addItem(Protoss_Dragoon, 1, TaskType::Army);
                        gateways.addOrder(Order::MacroArmyProduction, CB(ID_1, CallBackType::onDispatched, CB(ID_1, CallBackType::onDispatched)));
                        
        ID_1 =  gateways.addItem(Protoss_Gateway, 1, TaskType::MacroExtraProduction);
                        gateways.addItem(Singularity_Charge, 1, TaskType::MacroUrgent, CB(ID_1, CallBackType::onDispatched));
                        gateways.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));

        // Add
        mBuildOrders[BuildOrderID::AdditionalGateWays] = gateways;

        /************************************************************************/
        /* Branch 2: Nexus                                                      */
        /************************************************************************/

        BuildOrder nexus(Protoss, BuildOrderID::Nexus, "Nexus");

        // Constants
        nexus.addOrder(Order::TrainWorkers);
        nexus.addOrder(Order::SupplyManager);
        nexus.addOrder(Order::MacroArmyProduction);
        nexus.addOrder(Order::MacroProductionFacilities);
        nexus.addOrder(Order::Scout);

        // Follow Ups
        nexus.addNextBuild(BuildOrderID::PvPMidGame, Condition(ConditionTest::isEnemyProtoss));
        
        nexus.setDefaultBuild(BuildOrderID::CitadelFirst, 24*50*2);

        //Units to Produce
        nexus.addProduce(Protoss_Dragoon, 6);
        nexus.addProduce(Protoss_Zealot, 1);

        // Build Order
        ID_1 =  nexus.addItem(Protoss_Nexus, 1, TaskType::Expansion, BuildingLocation::Expansion);

        // Add
        mBuildOrders[BuildOrderID::Nexus] = nexus;

        /************************************************************************/
        /* Citadel First                                                        */
        /************************************************************************/

        BuildOrder citadel(Protoss, BuildOrderID::CitadelFirst, "Citadel First");

        // Constants
        citadel.addOrder(Order::TrainWorkers);
        citadel.addOrder(Order::SupplyManager);
        citadel.addOrder(Order::RefineryManager);
        citadel.addOrder(Order::MacroArmyProduction);
        citadel.addOrder(Order::MacroProductionFacilities);
        citadel.addOrder(Order::ExpansionManager);
        citadel.addOrder(Order::CanRemoveSquads);
        citadel.addOrder(Order::Scout);

        // Follow Ups
        citadel.setDefaultBuild(BuildOrderID::PvTMidGame, 24*60);
        //citadel.addNextBuild(BuildOrderID::PvTCarrierSwitch, Condition(ConditionType::enemyDoesntHasUnit, BWAPI::UnitTypes::Terran_Goliath, 2));

        // Squads
        citadel.addSquad(SquadType::ReaverDropSquad);

        //Units to Produce
        citadel.addProduce(Protoss_Dragoon, 2);
        citadel.addProduce(Protoss_Zealot, 6);

        // Build Order
        ID_1 =  citadel.addItem(Protoss_Citadel_of_Adun);
                        citadel.addItem(Leg_Enhancements, 1, TaskType::MacroUrgent, CB(ID_1, CallBackType::onDispatched));

        // Add
        mBuildOrders[BuildOrderID::CitadelFirst] = citadel;

        /************************************************************************/
        /* Mid Game Temp                                                        */
        /************************************************************************/

        BuildOrder midGame(Protoss, BuildOrderID::PvTMidGame, "Mid Game");

        // Constants
        midGame.addOrder(Order::TrainWorkers);
        midGame.addOrder(Order::SupplyManager);
        midGame.addOrder(Order::RefineryManager);
        midGame.addOrder(Order::MacroArmyProduction);
        midGame.addOrder(Order::MacroProductionFacilities);
        midGame.addOrder(Order::ExpansionManager);
        midGame.addOrder(Order::CanRemoveSquads);
        midGame.addOrder(Order::Scout);

        // Follow Ups
        midGame.setDefaultBuild(BuildOrderID::PvTEndGame, 24*60);

        // Squads
        midGame.addSquad(SquadType::ReaverDropSquad);

        //Units to Produce
        midGame.addProduce(Protoss_Dragoon, 14);
        midGame.addProduce(Protoss_Zealot, 14);
        midGame.addProduce(Protoss_High_Templar, 1, 100, Condition(ConditionTest::isResearching, Psionic_Storm));

        ID_1 =  midGame.addItem(Protoss_Templar_Archives);
        ID_1 =  midGame.addItem(Psionic_Storm, TaskType::MacroUrgent, CB(ID_1, CallBackType::onCompleted));

        midGame.addOrder(Order::MacroCanTech, CB(ID_1, CallBackType::onCompleted));

        // Add
        mBuildOrders[BuildOrderID::PvTMidGame] = midGame;

        /************************************************************************/
        /* End Game                                                             */
        /************************************************************************/

        BuildOrder endGame(Protoss, BuildOrderID::PvTEndGame, "End Game");

        // Constants
        endGame.addOrder(Order::TrainWorkers);
        endGame.addOrder(Order::SupplyManager);
        endGame.addOrder(Order::RefineryManager);
        endGame.addOrder(Order::MacroArmyProduction);
        endGame.addOrder(Order::MacroProductionFacilities);
        endGame.addOrder(Order::ExpansionManager);
        endGame.addOrder(Order::MacroCanTech);
        endGame.addOrder(Order::CanRemoveSquads);
        endGame.addOrder(Order::Scout);

        // Squads
        endGame.addSquad(SquadType::ReaverDropSquad);

        //Units to Produce
        endGame.addProduce(Protoss_Dragoon, 14);
        endGame.addProduce(Protoss_Zealot, 14);
        endGame.addProduce(Protoss_High_Templar, 3, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
        endGame.addProduce(Protoss_Arbiter, 1);

        // Add
        mBuildOrders[BuildOrderID::PvTEndGame] = endGame;

        /************************************************************************/
        /* Carrier Switch                                                       */
        /************************************************************************/

        BuildOrder carriers(Protoss, BuildOrderID::PvTCarrierSwitch, "Carriers");

        // Constants
        carriers.addOrder(Order::TrainWorkers);
        carriers.addOrder(Order::SupplyManager);
        carriers.addOrder(Order::MacroArmyProduction);
        carriers.addOrder(Order::RefineryManager);
        carriers.addOrder(Order::MacroProductionFacilities);
        carriers.addOrder(Order::MacroCanTech);
        carriers.addOrder(Order::ExpansionManager);
        carriers.addOrder(Order::CanRemoveSquads);
        carriers.addOrder(Order::Scout);

        // Squads
        carriers.addSquad(SquadType::ReaverDropSquad);

        //Units to Produce
        carriers.addProduce(Protoss_Dragoon, 1);
        carriers.addProduce(Protoss_Zealot, 1);
        carriers.addProduce(Protoss_Carrier, 12);

        // Add
        mBuildOrders[BuildOrderID::PvTCarrierSwitch] = carriers;

        /************************************************************************/
        /* Four Gate Goon                                                       */
        /************************************************************************/

        BuildOrder gatewayGoon(Protoss, BuildOrderID::FourGateGoon, "Four Gate Goon");

        // Constants
        gatewayGoon.addOrder(Order::TrainWorkers);
        gatewayGoon.addOrder(Order::SupplyManager);
        gatewayGoon.addOrder(Order::Scout);
        gatewayGoon.addOrder(Order::MacroArmyProduction);
        gatewayGoon.addOrder(Order::RefineryManager);

        gatewayGoon.setArmyBehaviour(ArmyBehaviour::Default);

        // Follow Ups
        gatewayGoon.setDefaultBuild(BuildOrderID::Nexus, 24*60*3);

        //Units to Produce
        gatewayGoon.addProduce(Protoss_Dragoon, 8);
        gatewayGoon.addProduce(Protoss_Zealot, 1);

        // Build Order
        ID_1 =  gatewayGoon.addItem(Protoss_Cybernetics_Core);
                        gatewayGoon.addItem(Singularity_Charge, 1, TaskType::MacroUrgent, CB(ID_1, CallBackType::onDispatched));

                        gatewayGoon.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));

        // Add
        mBuildOrders[BuildOrderID::FourGateGoon] = gatewayGoon;

        /************************************************************************/
        /* Robo First                                                           */
        /************************************************************************/

        BuildOrder robo(Protoss, BuildOrderID::RoboVsProtoss, "Robotics Facility");

        // Constants
        robo.addOrder(Order::TrainWorkers);
        robo.addOrder(Order::SupplyManager);
        robo.addOrder(Order::RefineryManager);
        robo.addOrder(Order::MacroArmyProduction);
        robo.addOrder(Order::Scout);

        robo.setArmyBehaviour(ArmyBehaviour::Defensive);

        robo.addNextBuild(BuildOrderID::PvPMidGame, Condition(ConditionTest::myPlannedUnitTotalGreaterEqualThan, Protoss_Reaver, 1) /* && Condition(ConditionType::myUnitCount, Protoss_Shuttle, 1) */);

        // Follow Ups
        robo.setDefaultBuild(BuildOrderID::PvPMidGame, 24*60);

        // Squads
        robo.addSquad(SquadType::ReaverDropSquad);

        //Units to Produce
        robo.addProduce(Protoss_Zealot, 1);
        robo.addProduce(Protoss_Dragoon, 14);
        robo.addProduce(Protoss_Reaver, 1, 100, Condition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Reaver, 3), Condition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Robotics_Facility, 1));

        // Build Order
                        robo.addItem(Protoss_Dragoon, 4, TaskType::Army);
        ID_1 =  robo.addItem(Protoss_Gateway, 1, TaskType::MacroExtraProduction);
        ID_1 =  robo.addItem(Protoss_Robotics_Facility, CB(ID_1, CallBackType::onDispatched));
                        robo.addItem(Singularity_Charge, 1, CB(ID_1, CallBackType::onDispatched));
        ID_1 =  robo.addItem(Protoss_Observatory, CB(ID_1, CallBackType::onStarted));
        ID_2 =  robo.addItem(Protoss_Observer, TaskType::Highest, CB(ID_1, CallBackType::onStarted));
        //ID_2 =        robo.addItem(Protoss_Shuttle, TaskType::Highest, CB(ID_2, CallBackType::onStarted));
        ID_2 =  robo.addItem(Protoss_Robotics_Support_Bay, TaskType::Highest, CB(ID_2, CallBackType::onDispatched));
                        robo.addItem(Protoss_Reaver, TaskType::Highest, CB(ID_2, CallBackType::onDispatched), 2);

        ID_1 =  robo.addItem(Protoss_Gateway, TaskType::MacroExtraProduction, CB(ID_1, CallBackType::onDispatched));
                        robo.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));

        // Add
        mBuildOrders[BuildOrderID::RoboVsProtoss] = robo;

        /************************************************************************/
        /* PvP Mid Game                                                         */
        /************************************************************************/

        BuildOrder PvPMid(Protoss, BuildOrderID::PvPMidGame, "Mid Game");

        // Constants
        PvPMid.addOrder(Order::TrainWorkers);
        PvPMid.addOrder(Order::SupplyManager);
        PvPMid.addOrder(Order::ExpansionManager);
        PvPMid.addOrder(Order::RefineryManager);
        PvPMid.addOrder(Order::MacroArmyProduction);
        PvPMid.addOrder(Order::MacroProductionFacilities);
        PvPMid.addOrder(Order::MacroCanTech);
        PvPMid.addOrder(Order::CanRemoveSquads);
        PvPMid.addOrder(Order::Scout);

        PvPMid.setArmyBehaviour(ArmyBehaviour::Default);

        PvPMid.setDefaultBuild(BuildOrderID::PvPEndGame, 24*60*2);

        // Squads
        PvPMid.addSquad(SquadType::ReaverDropSquad);

        //Units to Produce
        PvPMid.addProduce(Protoss_Zealot, 1);
        PvPMid.addProduce(Protoss_Dragoon, 14);
        PvPMid.addProduce(Protoss_High_Templar, 1, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
        PvPMid.addProduce(Protoss_Reaver, 1, 100, Condition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Reaver, 3), Condition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Robotics_Facility, 1));

        // Add
        mBuildOrders[BuildOrderID::PvPMidGame] = PvPMid;

        /************************************************************************/
        /* PVP End Game                                                         */
        /************************************************************************/

        BuildOrder PVPEnd(Protoss, BuildOrderID::PvPEndGame, "End Game");

        // Constants
        PVPEnd.addOrder(Order::TrainWorkers);
        PVPEnd.addOrder(Order::SupplyManager);
        PVPEnd.addOrder(Order::ExpansionManager);
        PVPEnd.addOrder(Order::RefineryManager);
        PVPEnd.addOrder(Order::MacroArmyProduction);
        PVPEnd.addOrder(Order::MacroProductionFacilities);
        PVPEnd.addOrder(Order::MacroCanTech);
        PVPEnd.addOrder(Order::CanRemoveSquads);
        PVPEnd.addOrder(Order::Scout);

        PVPEnd.setArmyBehaviour(ArmyBehaviour::Default);

        // Squads
        PVPEnd.addSquad(SquadType::ReaverDropSquad);

        //Units to Produce
        PVPEnd.addProduce(Protoss_Zealot, 1);
        PVPEnd.addProduce(Protoss_Dragoon, 14);
        PVPEnd.addProduce(Protoss_High_Templar, 1, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
        PVPEnd.addProduce(Protoss_Arbiter, 1);

        // Add
        mBuildOrders[BuildOrderID::PvPEndGame] = PVPEnd;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 3 of file LoadTerranBuilds.cpp.

Referenced by onBegin().

{
        int ID_1 = 0;
        int ID_2 = 0;
        int ID_3 = 0;
}

Here is the caller graph for this function:

Definition at line 3 of file LoadZergBuilds.cpp.

Referenced by onBegin().

{
        int ID_1 = 0;
        int ID_2 = 0;
        int ID_3 = 0;
}

Here is the caller graph for this function:

Definition at line 17 of file BuildOrderManager.cpp.

References LoadOtherBuilds(), LoadProtossBuilds(), LoadTerranBuilds(), and LoadZergBuilds().

Here is the call graph for this function:

Definition at line 22 of file BuildOrderManager.h.

References mShowDebugInfo.

void BuildOrderManagerClass::toggleOrder ( Order  type) [private]

Definition at line 181 of file BuildOrderManager.cpp.

References mControlValues.

Referenced by handleOrderItem().

{
        if(mControlValues.find(type) != mControlValues.end())
        {
                mControlValues[type] = !mControlValues[type];
        }
        else
                mControlValues[type] = true;
}

Here is the caller graph for this function:

Definition at line 37 of file BuildOrderManager.cpp.

References BWAPI::Broodwar, BuildOrderFinished(), changeCurrentBuild(), checkBuildStatus(), BWAPI::Game::drawTextScreen(), BWAPI::Game::getFrameCount(), getOrderName(), BWAPI::Player::getRace(), getRandomBuild(), mBuildFinishTime, mBuildOrders, mControlValues, mCurrentBuild, mFinishedBuild, mShowDebugInfo, BuildOrderIDDef::None, and BWAPI::Game::self().

{
        if(mCurrentBuild == BuildOrderID::None)
        {
                std::vector<BuildOrderID> viableBuilds;
                for each(std::pair<BuildOrderID, BuildOrder> build in mBuildOrders)
                {
                        if(build.second.getRace() != BWAPI::Broodwar->self()->getRace())
                                continue;

                        if(build.second.isStartBuild())
                                viableBuilds.push_back(build.first);
                }

                changeCurrentBuild(getRandomBuild(viableBuilds));
        }

        if(BuildOrderFinished())
        {
                if(!mFinishedBuild)
                {
                        mBuildFinishTime = BWAPI::Broodwar->getFrameCount();
                        mFinishedBuild = true;
                }

                std::vector<BuildOrderID> viableBuilds;
                for(std::map<BuildOrderID, Condition>::const_iterator i = mBuildOrders[mCurrentBuild].getNextBuilds().begin(); i != mBuildOrders[mCurrentBuild].getNextBuilds().end(); ++i)
                {
                        if(i->second.evauluate())
                                viableBuilds.push_back(i->first);
                }

                if(!viableBuilds.empty())
                        changeCurrentBuild(getRandomBuild(viableBuilds));
                else if(mBuildOrders[mCurrentBuild].getFallbackBuild() != BuildOrderID::None && mBuildOrders[mCurrentBuild].getFallbackTime() < BWAPI::Broodwar->getFrameCount() - mBuildFinishTime)
                        changeCurrentBuild(mBuildOrders[mCurrentBuild].getFallbackBuild());
        }
        checkBuildStatus();

        if(mShowDebugInfo)
        {
                int y = 25;
                BWAPI::Broodwar->drawTextScreen(5, 5, "Build: %s", mBuildOrders[mCurrentBuild].getName().c_str());
                BWAPI::Broodwar->drawTextScreen(5, 15, "Orders:");
                for(std::map<Order, bool>::iterator it = mControlValues.begin(); it != mControlValues.end(); ++it)
                {
                        if(it->second)
                        {
                                BWAPI::Broodwar->drawTextScreen(5, y, "%s", getOrderName(it->first).c_str());
                                y += 10;
                        }
                }
        }
}

Here is the call graph for this function:


Member Data Documentation

Definition at line 56 of file BuildOrderManager.h.

Referenced by update().

std::map<Order, bool> BuildOrderManagerClass::mControlValues [private]

Definition at line 51 of file BuildOrderManager.h.

Referenced by changeCurrentBuild(), getOrder(), toggleOrder(), and update().

Definition at line 49 of file BuildOrderManager.h.

Referenced by changeCurrentBuild(), getCurrentBuild(), and update().

Definition at line 55 of file BuildOrderManager.h.

Referenced by changeCurrentBuild(), and update().

Definition at line 45 of file BuildOrderManager.h.

Referenced by BuildCallback(), BuildOrderFinished(), and changeCurrentBuild().

Definition at line 46 of file BuildOrderManager.h.

Referenced by BuildCallback(), BuildOrderFinished(), and changeCurrentBuild().

Definition at line 53 of file BuildOrderManager.h.

Referenced by toggleDebugInfo(), and update().

std::map<CallBackType, std::map<TaskPointer, int> > BuildOrderManagerClass::mWaitingItems [private]

Definition at line 43 of file BuildOrderManager.h.

Referenced by checkBuildStatus(), and handleBuildItem().


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