|
BWAPI
|
#include <BuildOrderManager.h>

Public Member Functions | |
| BuildOrderManagerClass () | |
| void | onBegin () |
| void | update () |
| bool | BuildOrderFinished () |
| bool | getOrder (Order type) const |
| const BuildOrder & | getCurrentBuild () |
| 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< BuildItem > | mItemsWaiting |
| std::list< OrderItem > | mOrdersWaiting |
| std::map< BuildOrderID, BuildOrder > | mBuildOrders |
| BuildOrderID | mCurrentBuild |
| std::map< Order, bool > | mControlValues |
| bool | mShowDebugInfo |
| bool | mFinishedBuild |
| int | mBuildFinishTime |
Definition at line 8 of file BuildOrderManager.h.
Definition at line 10 of file BuildOrderManager.cpp.
: mCurrentBuild(BuildOrderID::None) , mFinishedBuild(false) , mBuildFinishTime(0) { }
| 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;
}
}


Definition at line 121 of file BuildOrderManager.cpp.
References mItemsWaiting, and mOrdersWaiting.
Referenced by update().
{
return mItemsWaiting.empty() && mOrdersWaiting.empty();
}

| void BuildOrderManagerClass::changeCurrentBuild | ( | BuildOrderID | ID | ) | [private] |
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();
}


| void BuildOrderManagerClass::checkBuildStatus | ( | ) | [private] |
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;
}
}


| const BuildOrder& BuildOrderManagerClass::getCurrentBuild | ( | ) | [inline] |
Definition at line 20 of file BuildOrderManager.h.
References mBuildOrders, and mCurrentBuild.
{ return mBuildOrders[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); }

| std::string BuildOrderManagerClass::getOrderName | ( | Order | type | ) |
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";
}

| 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);
}
}


| 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() );
}


| void BuildOrderManagerClass::LoadOtherBuilds | ( | ) | [private] |
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;
}

| void BuildOrderManagerClass::LoadProtossBuilds | ( | ) | [private] |
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;
}

| void BuildOrderManagerClass::LoadTerranBuilds | ( | ) | [private] |
Definition at line 3 of file LoadTerranBuilds.cpp.
Referenced by onBegin().
{
int ID_1 = 0;
int ID_2 = 0;
int ID_3 = 0;
}
| void BuildOrderManagerClass::LoadZergBuilds | ( | ) | [private] |
Definition at line 3 of file LoadZergBuilds.cpp.
Referenced by onBegin().
{
int ID_1 = 0;
int ID_2 = 0;
int ID_3 = 0;
}
| void BuildOrderManagerClass::onBegin | ( | ) |
Definition at line 17 of file BuildOrderManager.cpp.
References LoadOtherBuilds(), LoadProtossBuilds(), LoadTerranBuilds(), and LoadZergBuilds().
{
LoadOtherBuilds();
LoadProtossBuilds();
LoadTerranBuilds();
LoadZergBuilds();
}

| void BuildOrderManagerClass::toggleDebugInfo | ( | ) | [inline] |
Definition at line 22 of file BuildOrderManager.h.
References mShowDebugInfo.
{ mShowDebugInfo = !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;
}

| void BuildOrderManagerClass::update | ( | ) |
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;
}
}
}
}

int BuildOrderManagerClass::mBuildFinishTime [private] |
Definition at line 56 of file BuildOrderManager.h.
Referenced by update().
std::map<BuildOrderID, BuildOrder> BuildOrderManagerClass::mBuildOrders [private] |
Definition at line 48 of file BuildOrderManager.h.
Referenced by changeCurrentBuild(), getCurrentBuild(), LoadOtherBuilds(), LoadProtossBuilds(), and 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().
bool BuildOrderManagerClass::mFinishedBuild [private] |
Definition at line 55 of file BuildOrderManager.h.
Referenced by changeCurrentBuild(), and update().
std::list<BuildItem> BuildOrderManagerClass::mItemsWaiting [private] |
Definition at line 45 of file BuildOrderManager.h.
Referenced by BuildCallback(), BuildOrderFinished(), and changeCurrentBuild().
std::list<OrderItem> BuildOrderManagerClass::mOrdersWaiting [private] |
Definition at line 46 of file BuildOrderManager.h.
Referenced by BuildCallback(), BuildOrderFinished(), and changeCurrentBuild().
bool BuildOrderManagerClass::mShowDebugInfo [private] |
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().
1.7.6.1