BWAPI
Skynet/Skynet/LoadProtossBuilds.cpp
Go to the documentation of this file.
00001 #include "BuildOrderManager.h"
00002 
00003 void BuildOrderManagerClass::LoadProtossBuilds()
00004 {
00005         using namespace BWAPI::Races;
00006         using namespace BWAPI::UnitTypes;
00007         using namespace BWAPI::UpgradeTypes;
00008         using namespace BWAPI::TechTypes;
00009 
00010         int ID_1 = 0;
00011         int ID_2 = 0;
00012         int ID_3 = 0;
00013 
00014         /**************************************************************************************************/
00015         /* Against Zerg                                                                                   */
00016         /**************************************************************************************************/
00017 
00018         Condition corsairBuildCondition(Condition(ConditionTest::myUnitTotalBuildCountLessThan, Protoss_Corsair, 12) || (Condition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Corsair, 12) && Condition(ConditionTest::enemyUnitCountGreaterEqualThan, Zerg_Mutalisk, 12)));
00019         Condition corsairStargateCondition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Stargate, 2);
00020 
00021         /************************************************************************/
00022         /* Forge Expand                                                         */
00023         /************************************************************************/
00024 
00025         BuildOrder forgeExpand(Protoss, BuildOrderID::ForgeExpand, "Forge Expand");
00026 
00027         //Starting Conditions
00028         forgeExpand.setStartingCondition(Condition(ConditionTest::numberOfEnemies, 1) && Condition(ConditionTest::isEnemyZerg) && Condition(ConditionTest::canForgeExpand));
00029         //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
00030 
00031         forgeExpand.setArmyBehaviour(ArmyBehaviour::Defensive);
00032 
00033         forgeExpand.setDefaultBuild(BuildOrderID::StargateArcon);
00034 
00035         //Units to Produce
00036         forgeExpand.addProduce(Protoss_Zealot, 1);
00037 
00038         // Build Order
00039                         forgeExpand.addItem(Protoss_Probe, 4, TaskType::Highest);
00040         ID_1 =  forgeExpand.addItem(Protoss_Pylon, 1, BuildingLocation::BaseChoke, TaskType::Highest); //Pylon on 8
00041                         forgeExpand.addOrder(Order::Scout, CB(ID_1, CallBackType::onStarted));
00042 
00043                         forgeExpand.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
00044         ID_1 =  forgeExpand.addItem(Protoss_Forge, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::BaseChoke); //Forge on 10
00045                         forgeExpand.addOrder(Order::TrainWorkers, CB(ID_1, CallBackType::onDispatched));
00046                         forgeExpand.addOrder(Order::SupplyManager, CB(ID_1, CallBackType::onDispatched));
00047 
00048         ID_1 =  forgeExpand.addItem(Protoss_Photon_Cannon, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::BaseChoke);
00049         ID_1 =  forgeExpand.addItem(Protoss_Photon_Cannon, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::BaseChoke);
00050         ID_1 =  forgeExpand.addItem(Protoss_Nexus, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::ExpansionGas);
00051         ID_1 =  forgeExpand.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::BaseChoke);
00052 
00053         // Add
00054         // TODO: don't forge ecpand for competition, doesn't force army / defense at all and if they go mass muta it wont always get
00055         // enough anti air out in time
00056         //mBuildOrders[BuildOrderID::ForgeExpand] = forgeExpand;
00057 
00058         /************************************************************************/
00059         /* Stargate Arcon                                                       */
00060         /************************************************************************/
00061 
00062         BuildOrder starArcon(Protoss, BuildOrderID::StargateArcon, "Stargate into Arcon");
00063 
00064         starArcon.addNextBuild(BuildOrderID::ArconTiming, Condition(ConditionTest::myPlannedUnitTotalGreaterEqualThan, Protoss_Archon, 3));//go to timing attack if i have 2 arcons
00065         starArcon.setDefaultBuild(BuildOrderID::ArconTiming, 24*60*4);//or 4 mins have passed
00066 
00067         starArcon.setArmyBehaviour(ArmyBehaviour::Defensive);
00068 
00069         // Constants
00070         starArcon.addOrder(Order::TrainWorkers);
00071         starArcon.addOrder(Order::MacroArmyProduction);
00072         starArcon.addOrder(Order::SupplyManager);
00073         starArcon.addOrder(Order::Scout);
00074 
00075         // Squads
00076         starArcon.addSquad(SquadType::CorsairSquad);
00077 
00078         //Units to Produce
00079         starArcon.addProduce(Protoss_High_Templar, 2, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
00080         starArcon.addProduce(Protoss_Corsair, 3, 100, corsairBuildCondition, corsairStargateCondition);
00081         starArcon.addProduce(Protoss_Zealot, 1);
00082         starArcon.addProduce(Protoss_Dragoon, 1);
00083 
00084         // Build Order
00085                         starArcon.addItem(Protoss_Zealot, 6, TaskType::Army);
00086                         starArcon.addItem(Protoss_Assimilator);
00087         ID_1 =  starArcon.addItem(Protoss_Cybernetics_Core);
00088                         starArcon.addItem(Protoss_Stargate, 1, TaskType::Highest);
00089                         starArcon.addItem(Protoss_Corsair, 2, TaskType::Highest);
00090 
00091                         starArcon.addOrder(Order::RefineryManager, CB(ID_1, CallBackType::onDispatched));
00092                         starArcon.addItem(Protoss_Ground_Weapons, 1, CB(ID_1, CallBackType::onDispatched));
00093                         starArcon.addItem(Protoss_Gateway, TaskType::MacroExtraProduction, CB(ID_1, CallBackType::onDispatched));
00094         ID_1 =  starArcon.addItem(Protoss_Citadel_of_Adun, TaskType::Army, CB(ID_1, CallBackType::onDispatched));
00095                         starArcon.addItem(Protoss_Photon_Cannon, TaskType::Army, CB(ID_1, CallBackType::onDispatched), 4);
00096                         
00097 
00098                         starArcon.addItem(Leg_Enhancements, 1, TaskType::MacroUrgent, CB(ID_1, CallBackType::onDispatched));
00099                         starArcon.addItem(Protoss_Templar_Archives, TaskType::Army, CB(ID_1, CallBackType::onDispatched));
00100                         starArcon.addItem(Psionic_Storm, TaskType::MacroUrgent, CB(ID_1, CallBackType::onDispatched));
00101 
00102                         starArcon.addOrder(Order::MacroProductionFacilities,  CB(ID_1, CallBackType::onDispatched));
00103         
00104 
00105         // Add
00106         mBuildOrders[BuildOrderID::StargateArcon] = starArcon;
00107 
00108         /************************************************************************/
00109         /* Arcon Timing                                                         */
00110         /************************************************************************/
00111 
00112         BuildOrder ArconTiming(Protoss, BuildOrderID::ArconTiming, "Arcon Timing Attack");
00113 
00114         // Constants
00115         ArconTiming.addOrder(Order::TrainWorkers);
00116         ArconTiming.addOrder(Order::SupplyManager);
00117         ArconTiming.addOrder(Order::MacroArmyProduction);
00118         ArconTiming.addOrder(Order::RefineryManager);
00119         ArconTiming.addOrder(Order::MacroProductionFacilities);
00120         ArconTiming.addOrder(Order::MacroCanTech);
00121         ArconTiming.addOrder(Order::ExpansionManager);
00122         ArconTiming.addOrder(Order::Scout);
00123 
00124         ArconTiming.setDefaultBuild(BuildOrderID::PvZEndGame, 24*60*1);
00125 
00126         // Squads
00127         ArconTiming.addSquad(SquadType::CorsairSquad);
00128 
00129         //Units to Produce
00130         ArconTiming.addProduce(Protoss_High_Templar, 2, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
00131         ArconTiming.addProduce(Protoss_Corsair, 3, 100, corsairBuildCondition, corsairStargateCondition);
00132         ArconTiming.addProduce(Protoss_Zealot, 1);
00133         ArconTiming.addProduce(Protoss_Dragoon, 1);
00134 
00135         ArconTiming.setArmyBehaviour(ArmyBehaviour::Aggresive);
00136 
00137         // Add
00138         mBuildOrders[BuildOrderID::ArconTiming] = ArconTiming;
00139 
00140         /************************************************************************/
00141         /* PvZ End Game                                                         */
00142         /************************************************************************/
00143 
00144         BuildOrder pvzEnd(Protoss, BuildOrderID::PvZEndGame, "PvZ End Game");
00145 
00146         // Constants
00147         pvzEnd.addOrder(Order::TrainWorkers);
00148         pvzEnd.addOrder(Order::SupplyManager);
00149         pvzEnd.addOrder(Order::MacroArmyProduction);
00150         pvzEnd.addOrder(Order::RefineryManager);
00151         pvzEnd.addOrder(Order::MacroProductionFacilities);
00152         pvzEnd.addOrder(Order::MacroCanTech);
00153         pvzEnd.addOrder(Order::ExpansionManager);
00154         pvzEnd.addOrder(Order::Scout);
00155 
00156         pvzEnd.setArmyBehaviour(ArmyBehaviour::Default);
00157 
00158         // Squads
00159         pvzEnd.addSquad(SquadType::CorsairSquad);
00160 
00161         //Units to Produce
00162         pvzEnd.addProduce(Protoss_High_Templar, 2, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
00163         pvzEnd.addProduce(Protoss_Corsair, 3, 100, corsairBuildCondition, corsairStargateCondition);
00164         pvzEnd.addProduce(Protoss_Zealot, 1);
00165         pvzEnd.addProduce(Protoss_Dragoon, 1);
00166 
00167         // Add
00168         mBuildOrders[BuildOrderID::PvZEndGame] = pvzEnd;
00169 
00170         /************************************************************************/
00171         /* Two Gate                                                             */
00172         /************************************************************************/
00173 
00174         BuildOrder twoGate(Protoss, BuildOrderID::TwoGate, "2 Gate");
00175 
00176         //Starting Conditions
00177         twoGate.setStartingCondition(Condition(ConditionTest::isEnemyZerg) || Condition(ConditionTest::isEnemyProtoss));
00178 
00179         // Follow Ups
00180         twoGate.addNextBuild(BuildOrderID::CoreIntoStargate, Condition(ConditionTest::isEnemyZerg));
00181         twoGate.addNextBuild(BuildOrderID::FourGateGoon, Condition(ConditionTest::isEnemyProtoss));
00182 
00183         //Units to Produce
00184         twoGate.addProduce(Protoss_Zealot, 1);
00185 
00186         //Army Behaviour
00187         twoGate.setArmyBehaviour(ArmyBehaviour::Aggresive);
00188 
00189         // Build Order
00190         ID_1 =  twoGate.addItem(Protoss_Probe, 4);
00191         ID_1 =  twoGate.addItem(Protoss_Pylon, CB(ID_1, CallBackType::onDispatched)); //Pylon on 8
00192                         twoGate.addOrder(Order::Scout, CB(ID_1, CallBackType::onStarted));
00193 
00194         ID_1 =  twoGate.addItem(Protoss_Probe, CB(ID_1, CallBackType::onDispatched), 2);
00195         ID_1 =  twoGate.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched)); //Gateway on 10
00196         ID_1 =  twoGate.addItem(Protoss_Probe, CB(ID_1, CallBackType::onDispatched), 2);
00197         ID_1 =  twoGate.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched)); //Gateway on 12
00198         ID_1 =  twoGate.addItem(Protoss_Probe, CB(ID_1, CallBackType::onDispatched));
00199         ID_1 =  twoGate.addItem(Protoss_Zealot, CB(ID_1, CallBackType::onDispatched));//Zealot on 13
00200         ID_1 =  twoGate.addItem(Protoss_Pylon, CB(ID_1, CallBackType::onDispatched));
00201         ID_1 =  twoGate.addItem(Protoss_Probe, CB(ID_1, CallBackType::onDispatched), 2);
00202         ID_1 =  twoGate.addItem(Protoss_Zealot, CB(ID_1, CallBackType::onDispatched), 2);
00203 
00204         twoGate.addOrder(Order::TrainWorkers, CB(ID_1, CallBackType::onDispatched));
00205         twoGate.addOrder(Order::SupplyManager, CB(ID_1, CallBackType::onDispatched));
00206 
00207         // Add
00208         mBuildOrders[BuildOrderID::TwoGate] = twoGate;
00209 
00210         /************************************************************************/
00211         /* Core into Stargate                                                   */
00212         /************************************************************************/
00213 
00214         BuildOrder coreStar(Protoss, BuildOrderID::CoreIntoStargate, "Cybernetics Core into Stargate");
00215 
00216         // Follow Ups
00217         coreStar.setDefaultBuild(BuildOrderID::PvZEndGame, 24*60*1);
00218 
00219         // Constants
00220         coreStar.addOrder(Order::TrainWorkers);
00221         coreStar.addOrder(Order::SupplyManager);
00222         coreStar.addOrder(Order::MacroArmyProduction);
00223         coreStar.addOrder(Order::Scout);
00224 
00225         // Squads
00226         coreStar.addSquad(SquadType::CorsairSquad);
00227 
00228         //Units to Produce
00229         coreStar.addProduce(Protoss_Zealot, 1);
00230         coreStar.addProduce(Protoss_Dragoon, 1);
00231         coreStar.addProduce(Protoss_Corsair, 2, 100, corsairBuildCondition, corsairStargateCondition);
00232 
00233         //Army Behaviour
00234         coreStar.setArmyBehaviour(ArmyBehaviour::Aggresive);
00235 
00236         // Build Order
00237         ID_1 =  coreStar.addItem(Protoss_Assimilator);
00238                         coreStar.addOrder(Order::RefineryManager, CB(ID_1, CallBackType::onDispatched));
00239 
00240         ID_1 =  coreStar.addItem(Protoss_Cybernetics_Core);
00241                         coreStar.addItem(Protoss_Stargate, CB(ID_1, CallBackType::onDispatched));
00242 
00243         coreStar.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));
00244         
00245 
00246         // Add
00247         mBuildOrders[BuildOrderID::CoreIntoStargate] = coreStar;
00248 
00249         /**************************************************************************************************/
00250         /* Against Terran                                                                                 */
00251         /**************************************************************************************************/
00252 
00253         /************************************************************************/
00254         /* 14 Nexus                                                             */
00255         /************************************************************************/
00256 
00257         BuildOrder fourteenNexus(Protoss, BuildOrderID::FourteenNexus, "14 Nexus");
00258 
00259         //Starting Conditions
00260         fourteenNexus.setStartingCondition(Condition(ConditionTest::isEnemyTerran) && Condition(ConditionTest::numberOfEnemies, 1) && Condition(ConditionTest::mapSize, 4));
00261 
00262         fourteenNexus.setDefaultBuild(BuildOrderID::CitadelFirst, 24*60*2);
00263 
00264         //Units to Produce
00265         fourteenNexus.addProduce(Protoss_Dragoon, 6);
00266         fourteenNexus.addProduce(Protoss_Zealot, 1);
00267 
00268         //Army Behaviour
00269         fourteenNexus.setArmyBehaviour(ArmyBehaviour::Defensive);
00270 
00271         // Build Order
00272         ID_1 =  fourteenNexus.addItem(Protoss_Probe, 4, TaskType::Highest);
00273         ID_1 =  fourteenNexus.addItem(Protoss_Pylon, TaskType::Supply, CB(ID_1, CallBackType::onDispatched)); //Pylon on 8
00274                         fourteenNexus.addOrder(Order::Scout, CB(ID_1, CallBackType::onStarted));
00275         ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 5);
00276         ID_1 =  fourteenNexus.addItem(Protoss_Nexus, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::Expansion);
00277         ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched));
00278         ID_1 =  fourteenNexus.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched)); //Gateway on 14
00279         ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched));
00280         ID_1 =  fourteenNexus.addItem(Protoss_Assimilator, CB(ID_1, CallBackType::onDispatched)); //Gas on 15
00281         ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
00282         ID_1 =  fourteenNexus.addItem(Protoss_Cybernetics_Core, CB(ID_1, CallBackType::onDispatched)); //core on 17
00283         ID_1 =  fourteenNexus.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched)); //gate on 17
00284         ID_1 =  fourteenNexus.addItem(Protoss_Zealot, TaskType::Army, CB(ID_1, CallBackType::onDispatched)); //zealot on 17
00285         ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
00286         ID_1 =  fourteenNexus.addItem(Protoss_Pylon, TaskType::Supply, CB(ID_1, CallBackType::onDispatched)); //pylon on 21
00287         ID_1 =  fourteenNexus.addItem(Protoss_Dragoon, TaskType::Army, CB(ID_1, CallBackType::onDispatched), 2);//2 Dragoon on 21
00288         ID_1 =  fourteenNexus.addItem(Singularity_Charge, 1, CB(ID_1, CallBackType::onDispatched));//range on 25
00289         ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
00290         ID_1 =  fourteenNexus.addItem(Protoss_Pylon, TaskType::Supply, CB(ID_1, CallBackType::onDispatched)); //pylon on 27
00291         ID_1 =  fourteenNexus.addItem(Protoss_Dragoon, TaskType::Army, CB(ID_1, CallBackType::onDispatched), 2);//2 Dragoon on 27
00292         ID_1 =  fourteenNexus.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
00293         ID_1 =  fourteenNexus.addItem(Protoss_Pylon, TaskType::Supply, CB(ID_1, CallBackType::onDispatched)); //pylon on 33
00294         ID_1 =  fourteenNexus.addItem(Protoss_Dragoon, TaskType::Army, CB(ID_1, CallBackType::onDispatched), 2);//2 Dragoon on 35
00295 
00296         fourteenNexus.addOrder(Order::TrainWorkers, CB(ID_1, CallBackType::onDispatched));
00297         fourteenNexus.addOrder(Order::SupplyManager, CB(ID_1, CallBackType::onDispatched));
00298         fourteenNexus.addOrder(Order::MacroArmyProduction, CB(ID_1, CallBackType::onDispatched));
00299         fourteenNexus.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));
00300 
00301         // Add
00302         mBuildOrders[BuildOrderID::FourteenNexus] = fourteenNexus;
00303 
00304         /************************************************************************/
00305         /* One Gate Core                                                        */
00306         /************************************************************************/
00307 
00308         BuildOrder oneGateCore(Protoss, BuildOrderID::OneGateCore, "1 Gate Core");
00309 
00310         //Starting Conditions
00311         oneGateCore.setStartingCondition(Condition(ConditionTest::isEnemyTerran) || Condition(ConditionTest::isEnemyProtoss));
00312 
00313         //oneGateCore.addNextBuild(buildRoboVsTerran, Condition(ConditionType::isEnemyTerran));
00314         oneGateCore.addNextBuild(BuildOrderID::AdditionalGateWays, Condition(ConditionTest::isEnemyTerran));
00315         oneGateCore.addNextBuild(BuildOrderID::RoboVsProtoss, Condition(ConditionTest::isEnemyProtoss));
00316 
00317         //Army Behaviour
00318         oneGateCore.setArmyBehaviour(ArmyBehaviour::Aggresive);
00319 
00320         // Build Order
00321                         oneGateCore.addItem(Protoss_Probe, 4, TaskType::Highest);
00322         ID_1 =  oneGateCore.addItem(Protoss_Pylon, 1); //Pylon on 8
00323                         oneGateCore.addOrder(Order::TrainWorkers, CB(ID_1, CallBackType::onDispatched));
00324                         oneGateCore.addOrder(Order::Scout, CB(ID_1, CallBackType::onStarted));
00325         ID_1 =  oneGateCore.addItem(Protoss_Gateway, CB(ID_1, CallBackType::onDispatched)); //Gateway on 10
00326         //ID_1 =        oneGateCore.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 2);
00327         ID_1 =  oneGateCore.addItem(Protoss_Assimilator, CB(ID_1, CallBackType::onDispatched)); //gas on 12
00328         //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
00329         //ID_1 =        oneGateCore.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched), 1);
00330         ID_1 =  oneGateCore.addItem(Protoss_Cybernetics_Core, CB(ID_1, CallBackType::onDispatched)); //core on 14
00331         //ID_1 =        oneGateCore.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched));
00332         ID_1 =  oneGateCore.addItem(Protoss_Pylon, TaskType::Supply, CB(ID_1, CallBackType::onDispatched)); //pylon on 15
00333         //ID_1 =        oneGateCore.addItem(Protoss_Probe, TaskType::Worker, CB(ID_1, CallBackType::onDispatched));
00334 
00335         oneGateCore.addOrder(Order::SupplyManager, CB(ID_1, CallBackType::onDispatched));
00336         oneGateCore.addOrder(Order::RefineryManager, CB(ID_1, CallBackType::onDispatched));
00337 
00338         // Add
00339         mBuildOrders[BuildOrderID::OneGateCore] = oneGateCore;
00340 
00341         /************************************************************************/
00342         /* Robo First                                                           */
00343         /************************************************************************/
00344 
00345         BuildOrder roboPvT(Protoss, BuildOrderID::RoboVsTerran, "Robotics Facility First");
00346 
00347         // Constants
00348         roboPvT.addOrder(Order::TrainWorkers);
00349         roboPvT.addOrder(Order::RefineryManager);
00350         roboPvT.addOrder(Order::Scout);
00351 
00352         roboPvT.setArmyBehaviour(ArmyBehaviour::Defensive);
00353 
00354         roboPvT.addNextBuild(BuildOrderID::CitadelFirst, Condition(ConditionTest::myPlannedUnitTotalGreaterEqualThan, Protoss_Reaver, 1) && Condition(ConditionTest::myPlannedUnitTotalGreaterEqualThan, Protoss_Shuttle, 1));
00355 
00356         // Follow Ups
00357         roboPvT.setDefaultBuild(BuildOrderID::CitadelFirst, 24*60*2);
00358 
00359         // Squads
00360         roboPvT.addSquad(SquadType::ReaverDropSquad);
00361 
00362         //Units to Produce
00363         roboPvT.addProduce(Protoss_Dragoon, 1);
00364 
00365         // Build Order
00366         ID_3 =  roboPvT.addItem(Protoss_Dragoon, 4, TaskType::Army);
00367                         roboPvT.addOrder(Order::MacroArmyProduction, CB(ID_3, CallBackType::onDispatched));
00368         ID_1 =  roboPvT.addItem(Protoss_Pylon, 1, TaskType::Supply);
00369         ID_1 =  roboPvT.addItem(Protoss_Robotics_Facility, CB(ID_1, CallBackType::onStarted));
00370                         roboPvT.addItem(Singularity_Charge, 1, CB(ID_1, CallBackType::onDispatched));
00371         ID_1 =  roboPvT.addItem(Protoss_Observatory, CB(ID_1, CallBackType::onCompleted));
00372         ID_2 =  roboPvT.addItem(Protoss_Observer, CB(ID_1, CallBackType::onStarted));
00373         ID_1 =  roboPvT.addItem(Protoss_Nexus, TaskType::Expansion, CB(ID_1, CallBackType::onDispatched), 1, BuildingLocation::Expansion);
00374                         roboPvT.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));
00375                         roboPvT.addOrder(Order::SupplyManager, CB(ID_1, CallBackType::onDispatched));
00376         ID_2 =  roboPvT.addItem(Protoss_Shuttle, CB(ID_2, CallBackType::onDispatched));
00377                         roboPvT.addItem(Protoss_Reaver, CB(ID_2, CallBackType::onDispatched));
00378         ID_1 =  roboPvT.addItem(Protoss_Robotics_Support_Bay, CB(ID_1, CallBackType::onDispatched));
00379 
00380         // Add
00381         mBuildOrders[BuildOrderID::RoboVsTerran] = roboPvT;
00382 
00383         /************************************************************************/
00384         /* Branch 1: Additional Gateways                                        */
00385         /************************************************************************/
00386 
00387         BuildOrder gateways(Protoss, BuildOrderID::AdditionalGateWays, "Additional Gateways");
00388 
00389         // Constants
00390         gateways.addOrder(Order::TrainWorkers);
00391         gateways.addOrder(Order::SupplyManager);
00392         gateways.addOrder(Order::Scout);
00393 
00394         gateways.setArmyBehaviour(ArmyBehaviour::Aggresive);
00395 
00396         // Follow Ups
00397         gateways.setDefaultBuild(BuildOrderID::Nexus, 24*60*4);
00398 
00399         gateways.addNextBuild(BuildOrderID::Nexus, Condition(ConditionTest::enemyHasResearched, BWAPI::TechTypes::Tank_Siege_Mode));
00400 
00401         //Units to Produce
00402         gateways.addProduce(Protoss_Dragoon, 1);
00403 
00404         // Build Order
00405         ID_1 =  gateways.addItem(Protoss_Dragoon, 1, TaskType::Army);
00406                         gateways.addOrder(Order::MacroArmyProduction, CB(ID_1, CallBackType::onDispatched, CB(ID_1, CallBackType::onDispatched)));
00407                         
00408         ID_1 =  gateways.addItem(Protoss_Gateway, 1, TaskType::MacroExtraProduction);
00409                         gateways.addItem(Singularity_Charge, 1, TaskType::MacroUrgent, CB(ID_1, CallBackType::onDispatched));
00410                         gateways.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));
00411 
00412         // Add
00413         mBuildOrders[BuildOrderID::AdditionalGateWays] = gateways;
00414 
00415         /************************************************************************/
00416         /* Branch 2: Nexus                                                      */
00417         /************************************************************************/
00418 
00419         BuildOrder nexus(Protoss, BuildOrderID::Nexus, "Nexus");
00420 
00421         // Constants
00422         nexus.addOrder(Order::TrainWorkers);
00423         nexus.addOrder(Order::SupplyManager);
00424         nexus.addOrder(Order::MacroArmyProduction);
00425         nexus.addOrder(Order::MacroProductionFacilities);
00426         nexus.addOrder(Order::Scout);
00427 
00428         // Follow Ups
00429         nexus.addNextBuild(BuildOrderID::PvPMidGame, Condition(ConditionTest::isEnemyProtoss));
00430         
00431         nexus.setDefaultBuild(BuildOrderID::CitadelFirst, 24*50*2);
00432 
00433         //Units to Produce
00434         nexus.addProduce(Protoss_Dragoon, 6);
00435         nexus.addProduce(Protoss_Zealot, 1);
00436 
00437         // Build Order
00438         ID_1 =  nexus.addItem(Protoss_Nexus, 1, TaskType::Expansion, BuildingLocation::Expansion);
00439 
00440         // Add
00441         mBuildOrders[BuildOrderID::Nexus] = nexus;
00442 
00443         /************************************************************************/
00444         /* Citadel First                                                        */
00445         /************************************************************************/
00446 
00447         BuildOrder citadel(Protoss, BuildOrderID::CitadelFirst, "Citadel First");
00448 
00449         // Constants
00450         citadel.addOrder(Order::TrainWorkers);
00451         citadel.addOrder(Order::SupplyManager);
00452         citadel.addOrder(Order::RefineryManager);
00453         citadel.addOrder(Order::MacroArmyProduction);
00454         citadel.addOrder(Order::MacroProductionFacilities);
00455         citadel.addOrder(Order::ExpansionManager);
00456         citadel.addOrder(Order::CanRemoveSquads);
00457         citadel.addOrder(Order::Scout);
00458 
00459         // Follow Ups
00460         citadel.setDefaultBuild(BuildOrderID::PvTMidGame, 24*60);
00461         //citadel.addNextBuild(BuildOrderID::PvTCarrierSwitch, Condition(ConditionType::enemyDoesntHasUnit, BWAPI::UnitTypes::Terran_Goliath, 2));
00462 
00463         // Squads
00464         citadel.addSquad(SquadType::ReaverDropSquad);
00465 
00466         //Units to Produce
00467         citadel.addProduce(Protoss_Dragoon, 2);
00468         citadel.addProduce(Protoss_Zealot, 6);
00469 
00470         // Build Order
00471         ID_1 =  citadel.addItem(Protoss_Citadel_of_Adun);
00472                         citadel.addItem(Leg_Enhancements, 1, TaskType::MacroUrgent, CB(ID_1, CallBackType::onDispatched));
00473 
00474         // Add
00475         mBuildOrders[BuildOrderID::CitadelFirst] = citadel;
00476 
00477         /************************************************************************/
00478         /* Mid Game Temp                                                        */
00479         /************************************************************************/
00480 
00481         BuildOrder midGame(Protoss, BuildOrderID::PvTMidGame, "Mid Game");
00482 
00483         // Constants
00484         midGame.addOrder(Order::TrainWorkers);
00485         midGame.addOrder(Order::SupplyManager);
00486         midGame.addOrder(Order::RefineryManager);
00487         midGame.addOrder(Order::MacroArmyProduction);
00488         midGame.addOrder(Order::MacroProductionFacilities);
00489         midGame.addOrder(Order::ExpansionManager);
00490         midGame.addOrder(Order::CanRemoveSquads);
00491         midGame.addOrder(Order::Scout);
00492 
00493         // Follow Ups
00494         midGame.setDefaultBuild(BuildOrderID::PvTEndGame, 24*60);
00495 
00496         // Squads
00497         midGame.addSquad(SquadType::ReaverDropSquad);
00498 
00499         //Units to Produce
00500         midGame.addProduce(Protoss_Dragoon, 14);
00501         midGame.addProduce(Protoss_Zealot, 14);
00502         midGame.addProduce(Protoss_High_Templar, 1, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
00503 
00504         ID_1 =  midGame.addItem(Protoss_Templar_Archives);
00505         ID_1 =  midGame.addItem(Psionic_Storm, TaskType::MacroUrgent, CB(ID_1, CallBackType::onCompleted));
00506 
00507         midGame.addOrder(Order::MacroCanTech, CB(ID_1, CallBackType::onCompleted));
00508 
00509         // Add
00510         mBuildOrders[BuildOrderID::PvTMidGame] = midGame;
00511 
00512         /************************************************************************/
00513         /* End Game                                                             */
00514         /************************************************************************/
00515 
00516         BuildOrder endGame(Protoss, BuildOrderID::PvTEndGame, "End Game");
00517 
00518         // Constants
00519         endGame.addOrder(Order::TrainWorkers);
00520         endGame.addOrder(Order::SupplyManager);
00521         endGame.addOrder(Order::RefineryManager);
00522         endGame.addOrder(Order::MacroArmyProduction);
00523         endGame.addOrder(Order::MacroProductionFacilities);
00524         endGame.addOrder(Order::ExpansionManager);
00525         endGame.addOrder(Order::MacroCanTech);
00526         endGame.addOrder(Order::CanRemoveSquads);
00527         endGame.addOrder(Order::Scout);
00528 
00529         // Squads
00530         endGame.addSquad(SquadType::ReaverDropSquad);
00531 
00532         //Units to Produce
00533         endGame.addProduce(Protoss_Dragoon, 14);
00534         endGame.addProduce(Protoss_Zealot, 14);
00535         endGame.addProduce(Protoss_High_Templar, 3, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
00536         endGame.addProduce(Protoss_Arbiter, 1);
00537 
00538         // Add
00539         mBuildOrders[BuildOrderID::PvTEndGame] = endGame;
00540 
00541         /************************************************************************/
00542         /* Carrier Switch                                                       */
00543         /************************************************************************/
00544 
00545         BuildOrder carriers(Protoss, BuildOrderID::PvTCarrierSwitch, "Carriers");
00546 
00547         // Constants
00548         carriers.addOrder(Order::TrainWorkers);
00549         carriers.addOrder(Order::SupplyManager);
00550         carriers.addOrder(Order::MacroArmyProduction);
00551         carriers.addOrder(Order::RefineryManager);
00552         carriers.addOrder(Order::MacroProductionFacilities);
00553         carriers.addOrder(Order::MacroCanTech);
00554         carriers.addOrder(Order::ExpansionManager);
00555         carriers.addOrder(Order::CanRemoveSquads);
00556         carriers.addOrder(Order::Scout);
00557 
00558         // Squads
00559         carriers.addSquad(SquadType::ReaverDropSquad);
00560 
00561         //Units to Produce
00562         carriers.addProduce(Protoss_Dragoon, 1);
00563         carriers.addProduce(Protoss_Zealot, 1);
00564         carriers.addProduce(Protoss_Carrier, 12);
00565 
00566         // Add
00567         mBuildOrders[BuildOrderID::PvTCarrierSwitch] = carriers;
00568 
00569         /************************************************************************/
00570         /* Four Gate Goon                                                       */
00571         /************************************************************************/
00572 
00573         BuildOrder gatewayGoon(Protoss, BuildOrderID::FourGateGoon, "Four Gate Goon");
00574 
00575         // Constants
00576         gatewayGoon.addOrder(Order::TrainWorkers);
00577         gatewayGoon.addOrder(Order::SupplyManager);
00578         gatewayGoon.addOrder(Order::Scout);
00579         gatewayGoon.addOrder(Order::MacroArmyProduction);
00580         gatewayGoon.addOrder(Order::RefineryManager);
00581 
00582         gatewayGoon.setArmyBehaviour(ArmyBehaviour::Default);
00583 
00584         // Follow Ups
00585         gatewayGoon.setDefaultBuild(BuildOrderID::Nexus, 24*60*3);
00586 
00587         //Units to Produce
00588         gatewayGoon.addProduce(Protoss_Dragoon, 8);
00589         gatewayGoon.addProduce(Protoss_Zealot, 1);
00590 
00591         // Build Order
00592         ID_1 =  gatewayGoon.addItem(Protoss_Cybernetics_Core);
00593                         gatewayGoon.addItem(Singularity_Charge, 1, TaskType::MacroUrgent, CB(ID_1, CallBackType::onDispatched));
00594 
00595                         gatewayGoon.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));
00596 
00597         // Add
00598         mBuildOrders[BuildOrderID::FourGateGoon] = gatewayGoon;
00599 
00600         /************************************************************************/
00601         /* Robo First                                                           */
00602         /************************************************************************/
00603 
00604         BuildOrder robo(Protoss, BuildOrderID::RoboVsProtoss, "Robotics Facility");
00605 
00606         // Constants
00607         robo.addOrder(Order::TrainWorkers);
00608         robo.addOrder(Order::SupplyManager);
00609         robo.addOrder(Order::RefineryManager);
00610         robo.addOrder(Order::MacroArmyProduction);
00611         robo.addOrder(Order::Scout);
00612 
00613         robo.setArmyBehaviour(ArmyBehaviour::Defensive);
00614 
00615         robo.addNextBuild(BuildOrderID::PvPMidGame, Condition(ConditionTest::myPlannedUnitTotalGreaterEqualThan, Protoss_Reaver, 1) /* && Condition(ConditionType::myUnitCount, Protoss_Shuttle, 1) */);
00616 
00617         // Follow Ups
00618         robo.setDefaultBuild(BuildOrderID::PvPMidGame, 24*60);
00619 
00620         // Squads
00621         robo.addSquad(SquadType::ReaverDropSquad);
00622 
00623         //Units to Produce
00624         robo.addProduce(Protoss_Zealot, 1);
00625         robo.addProduce(Protoss_Dragoon, 14);
00626         robo.addProduce(Protoss_Reaver, 1, 100, Condition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Reaver, 3), Condition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Robotics_Facility, 1));
00627 
00628         // Build Order
00629                         robo.addItem(Protoss_Dragoon, 4, TaskType::Army);
00630         ID_1 =  robo.addItem(Protoss_Gateway, 1, TaskType::MacroExtraProduction);
00631         ID_1 =  robo.addItem(Protoss_Robotics_Facility, CB(ID_1, CallBackType::onDispatched));
00632                         robo.addItem(Singularity_Charge, 1, CB(ID_1, CallBackType::onDispatched));
00633         ID_1 =  robo.addItem(Protoss_Observatory, CB(ID_1, CallBackType::onStarted));
00634         ID_2 =  robo.addItem(Protoss_Observer, TaskType::Highest, CB(ID_1, CallBackType::onStarted));
00635         //ID_2 =        robo.addItem(Protoss_Shuttle, TaskType::Highest, CB(ID_2, CallBackType::onStarted));
00636         ID_2 =  robo.addItem(Protoss_Robotics_Support_Bay, TaskType::Highest, CB(ID_2, CallBackType::onDispatched));
00637                         robo.addItem(Protoss_Reaver, TaskType::Highest, CB(ID_2, CallBackType::onDispatched), 2);
00638 
00639         ID_1 =  robo.addItem(Protoss_Gateway, TaskType::MacroExtraProduction, CB(ID_1, CallBackType::onDispatched));
00640                         robo.addOrder(Order::MacroProductionFacilities, CB(ID_1, CallBackType::onDispatched));
00641 
00642         // Add
00643         mBuildOrders[BuildOrderID::RoboVsProtoss] = robo;
00644 
00645         /************************************************************************/
00646         /* PvP Mid Game                                                         */
00647         /************************************************************************/
00648 
00649         BuildOrder PvPMid(Protoss, BuildOrderID::PvPMidGame, "Mid Game");
00650 
00651         // Constants
00652         PvPMid.addOrder(Order::TrainWorkers);
00653         PvPMid.addOrder(Order::SupplyManager);
00654         PvPMid.addOrder(Order::ExpansionManager);
00655         PvPMid.addOrder(Order::RefineryManager);
00656         PvPMid.addOrder(Order::MacroArmyProduction);
00657         PvPMid.addOrder(Order::MacroProductionFacilities);
00658         PvPMid.addOrder(Order::MacroCanTech);
00659         PvPMid.addOrder(Order::CanRemoveSquads);
00660         PvPMid.addOrder(Order::Scout);
00661 
00662         PvPMid.setArmyBehaviour(ArmyBehaviour::Default);
00663 
00664         PvPMid.setDefaultBuild(BuildOrderID::PvPEndGame, 24*60*2);
00665 
00666         // Squads
00667         PvPMid.addSquad(SquadType::ReaverDropSquad);
00668 
00669         //Units to Produce
00670         PvPMid.addProduce(Protoss_Zealot, 1);
00671         PvPMid.addProduce(Protoss_Dragoon, 14);
00672         PvPMid.addProduce(Protoss_High_Templar, 1, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
00673         PvPMid.addProduce(Protoss_Reaver, 1, 100, Condition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Reaver, 3), Condition(ConditionTest::myPlannedUnitTotalLessThan, Protoss_Robotics_Facility, 1));
00674 
00675         // Add
00676         mBuildOrders[BuildOrderID::PvPMidGame] = PvPMid;
00677 
00678         /************************************************************************/
00679         /* PVP End Game                                                         */
00680         /************************************************************************/
00681 
00682         BuildOrder PVPEnd(Protoss, BuildOrderID::PvPEndGame, "End Game");
00683 
00684         // Constants
00685         PVPEnd.addOrder(Order::TrainWorkers);
00686         PVPEnd.addOrder(Order::SupplyManager);
00687         PVPEnd.addOrder(Order::ExpansionManager);
00688         PVPEnd.addOrder(Order::RefineryManager);
00689         PVPEnd.addOrder(Order::MacroArmyProduction);
00690         PVPEnd.addOrder(Order::MacroProductionFacilities);
00691         PVPEnd.addOrder(Order::MacroCanTech);
00692         PVPEnd.addOrder(Order::CanRemoveSquads);
00693         PVPEnd.addOrder(Order::Scout);
00694 
00695         PVPEnd.setArmyBehaviour(ArmyBehaviour::Default);
00696 
00697         // Squads
00698         PVPEnd.addSquad(SquadType::ReaverDropSquad);
00699 
00700         //Units to Produce
00701         PVPEnd.addProduce(Protoss_Zealot, 1);
00702         PVPEnd.addProduce(Protoss_Dragoon, 14);
00703         PVPEnd.addProduce(Protoss_High_Templar, 1, 100, Condition(ConditionTest::isResearching, Psionic_Storm));
00704         PVPEnd.addProduce(Protoss_Arbiter, 1);
00705 
00706         // Add
00707         mBuildOrders[BuildOrderID::PvPEndGame] = PVPEnd;
00708 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines