BWAPI
Skynet/Skynet/BuildOrder.h
Go to the documentation of this file.
00001 #pragma once
00002 
00003 #include "Interface.h"
00004 #include <deque>
00005 
00006 #include "TypeSafeEnum.h"
00007 #include "Condition.h"
00008 #include "TaskManager.h"
00009 #include "ReservedLocation.h"
00010 
00011 struct SquadTypeDef
00012 {
00013         enum type
00014         {
00015                 DefaultSquad,
00016                 DefenseSquad,
00017                 ReaverDropSquad,
00018                 DarkTemplerSquad,
00019                 CorsairSquad
00020         };
00021 };
00022 typedef SafeEnum<SquadTypeDef> SquadType;
00023 
00024 struct ArmyBehaviourDef
00025 {
00026         enum type
00027         {
00028                 AllIn = 0, //fkit just attack
00029                 Aggresive, //pressure
00030                 Contain, //siege contain etc
00031                 Default, //Attack when it knows its ahead, roughtly
00032                 Defensive //defensive
00033         };
00034 };
00035 typedef SafeEnum<ArmyBehaviourDef> ArmyBehaviour;
00036 
00037 struct OrderDef
00038 {
00039         enum type
00040         {
00041                 None,
00042                 TrainWorkers,
00043                 Scout,
00044                 SupplyManager,
00045                 RefineryManager,
00046                 MacroArmyProduction,
00047                 CanRemoveSquads,
00048                 ExpansionManager,
00049                 MacroProductionFacilities,
00050                 MacroCanTech
00051         };
00052 };
00053 typedef SafeEnum<OrderDef> Order;
00054 
00055 struct CallBackTypeDef
00056 {
00057         enum type
00058         {
00059                 None,
00060                 onDispatched,
00061                 onCompleted,
00062                 onStarted
00063         };
00064 };
00065 typedef SafeEnum<CallBackTypeDef> CallBackType;
00066 
00067 class CallBack
00068 {
00069 public:
00070         CallBack() : mBuildID(0), mCallbackType(CallBackType::None) {}
00071         CallBack(int buildID, CallBackType callbackType) : mBuildID(buildID), mCallbackType(callbackType) {}
00072 
00073         int getID() const { return mBuildID; }
00074         CallBackType getType() const { return mCallbackType; }
00075 
00076 private:
00077         int mBuildID;
00078         CallBackType mCallbackType;
00079 };
00080 
00081 class BuildItem
00082 {
00083 public:
00084         BuildItem(BWAPI::UnitType unitType, int count, int buildID, TaskType taskType, BuildingLocation location, const std::list<CallBack> &callBacks)
00085                 : mUnitType(unitType)
00086                 , mTechType(BWAPI::TechTypes::None)
00087                 , mUpgradeType(BWAPI::UpgradeTypes::None)
00088                 , mLocation(location)
00089                 , mNumber(count)
00090                 , mID(buildID)
00091                 , mTaskType(taskType)
00092                 , mCallBacks(callBacks)
00093         {}
00094 
00095         BuildItem(BWAPI::TechType techType, int buildID, TaskType taskType, const std::list<CallBack> &callBacks)
00096                 : mUnitType(BWAPI::UnitTypes::None)
00097                 , mTechType(techType)
00098                 , mUpgradeType(BWAPI::UpgradeTypes::None)
00099                 , mLocation()
00100                 , mNumber()
00101                 , mID(buildID)
00102                 , mTaskType(taskType)
00103                 , mCallBacks(callBacks)
00104         {}
00105 
00106         BuildItem(BWAPI::UpgradeType upgradeType, int level, int buildID, TaskType taskType, const std::list<CallBack> &callBacks)
00107                 : mUnitType(BWAPI::UnitTypes::None)
00108                 , mTechType(BWAPI::TechTypes::None)
00109                 , mUpgradeType(upgradeType)
00110                 , mLocation()
00111                 , mNumber(level)
00112                 , mID(buildID)
00113                 , mTaskType(taskType)
00114                 , mCallBacks(callBacks)
00115         {}
00116 
00117         bool isFulfilled() const { return mCallBacks.empty(); }
00118 
00119         void removeCallback(int buildID, CallBackType callbackType)
00120         {
00121                 for(std::list<CallBack>::iterator callback = mCallBacks.begin(); callback != mCallBacks.end();)
00122                 {
00123                         if(callback->getID() == buildID && callback->getType() == callbackType)
00124                                 mCallBacks.erase(callback++);
00125                         else
00126                                 ++callback;
00127                 }
00128         }
00129 
00130         TaskPointer createTask() const
00131         {
00132                 if(mUnitType != BWAPI::UnitTypes::None)
00133                 {
00134                         for(int i = 0; i < mNumber-1; ++i)
00135                                 TaskManager::Instance().build(mUnitType, mTaskType, mLocation);
00136 
00137                         return TaskManager::Instance().build(mUnitType, mTaskType, mLocation);
00138                 }
00139                 else if(mTechType != BWAPI::TechTypes::None)
00140                         return TaskManager::Instance().research(mTechType, mTaskType);
00141                 else if(mUpgradeType != BWAPI::UpgradeTypes::None)
00142                         return TaskManager::Instance().upgrade(mUpgradeType, mNumber, mTaskType);
00143 
00144                 return TaskPointer();
00145         }
00146 
00147         int getID() const { return mID; }
00148 
00149 private:
00150         BWAPI::UnitType mUnitType;
00151         BWAPI::TechType mTechType;
00152         BWAPI::UpgradeType mUpgradeType;
00153         BuildingLocation mLocation;
00154         int mNumber;
00155         int mID;
00156         TaskType mTaskType;
00157 
00158         std::list<CallBack> mCallBacks;
00159 };
00160 
00161 class OrderItem
00162 {
00163 public:
00164         OrderItem(Order type, int ID, const std::list<CallBack> &callBacks)
00165                 : mType(type)
00166                 , mID(ID)
00167                 , mCallbacks(callBacks)
00168         {}
00169 
00170         Order getType() const { return mType; }
00171         int getID() const { return mID; }
00172 
00173         bool isFulfilled() const { return mCallbacks.empty(); }
00174 
00175         void removeCallback(int buildID, CallBackType callbackType)
00176         {
00177                 for(std::list<CallBack>::iterator callback = mCallbacks.begin(); callback != mCallbacks.end();)
00178                 {
00179                         if(callback->getID() == buildID && callback->getType() == callbackType)
00180                                 mCallbacks.erase(callback++);
00181                         else
00182                                 ++callback;
00183                 }
00184         }
00185 
00186 private:
00187         Order mType;
00188         int mID;
00189 
00190         std::list<CallBack> mCallbacks;
00191 };
00192 
00193 struct BuildOrderIDDef
00194 {
00195         enum type
00196         {
00197                 None,
00198                 Unknown,
00199                 ForgeExpand,
00200                 StargateArcon,
00201                 ArconTiming,
00202                 PvZEndGame,
00203                 TwoGate,
00204                 CoreIntoStargate,
00205                 FourteenNexus,
00206                 OneGateCore,
00207                 AdditionalGateWays,
00208                 FourGateGoon,
00209                 Nexus,
00210                 CitadelFirst,
00211                 PvTMidGame,
00212                 PvTCarrierSwitch,
00213                 PvTEndGame,
00214                 RoboVsProtoss,
00215                 RoboVsTerran,
00216                 PvPMidGame,
00217                 PvPEndGame,
00218                 FourPool,
00219                 Test,
00220                 BGHProtoss,
00221                 T3Protoss
00222         };
00223 };
00224 typedef SafeEnum<BuildOrderIDDef> BuildOrderID;
00225 
00226 std::list<CallBack> CB(int buildID, CallBackType type, std::list<CallBack> &cb = std::list<CallBack>());
00227 
00228 class UnitToProduce
00229 {
00230 public:
00231         //************************************
00232         // BWAPI::UnitType unitType: Type of unit to produce
00233         // int weight: Used for the ratio of how many of this unit to create compared to others
00234         // int priority: Used for how important teching to this unit is
00235         // Condition unitCond: Condition required to be true to build this unit
00236         // Condition factoryCond: Condition required to be true to build addition of what builds this unit
00237         //************************************
00238         UnitToProduce(BWAPI::UnitType unitType, int weight, int priority = 100, const Condition &unitCond = Condition(ConditionTest::None, true), const Condition &factoryCond = Condition(ConditionTest::None, true))
00239                 : mUnitType(unitType)
00240                 , mWeight(weight)
00241                 , mCreateUnitCondition(unitCond)
00242                 , mCreateFactoryCondition(factoryCond)
00243                 , mPriority(priority)
00244         {}
00245 
00246         bool canBuildUnit() const { return mCreateUnitCondition.evauluate(); }
00247         bool canBuildFactory() const { return mCreateFactoryCondition.evauluate(); }
00248 
00249         BWAPI::UnitType getUnitType() const { return mUnitType; }
00250         int getUnitWeight() const { return mWeight; }
00251 
00252         int getPriority() const { return mPriority; }
00253 
00254 private:
00255         BWAPI::UnitType mUnitType;
00256         int mWeight;
00257         int mPriority;
00258 
00259         Condition mCreateUnitCondition;
00260         Condition mCreateFactoryCondition;
00261 };
00262 
00263 class BuildOrder
00264 {
00265 public:
00266         BuildOrder(BuildOrderID id = BuildOrderID::None, std::string name = "None");
00267         BuildOrder(BWAPI::Race race, BuildOrderID id, std::string name);
00268 
00269         int addItem(BWAPI::UnitType type, std::list<CallBack> &callBacks = std::list<CallBack>(), int count = 1, BuildingLocation position = BuildingLocation::Base);
00270         int addItem(BWAPI::TechType type, std::list<CallBack> &callBacks = std::list<CallBack>());
00271         int addItem(BWAPI::UpgradeType type, int level = 1, std::list<CallBack> &callBacks = std::list<CallBack>());
00272 
00273         int addItem(BWAPI::UnitType type, int count, BuildingLocation position = BuildingLocation::Base, TaskType taskType = TaskType::BuildOrder);
00274         int addItem(BWAPI::UnitType type, int count, TaskType taskType, BuildingLocation position = BuildingLocation::Base);
00275 
00276         int addItem(BWAPI::UnitType type, TaskType taskType, std::list<CallBack> &callBacks = std::list<CallBack>(), int count = 1, BuildingLocation position = BuildingLocation::Base);
00277         int addItem(BWAPI::TechType type, TaskType taskType, std::list<CallBack> &callBacks = std::list<CallBack>());
00278         int addItem(BWAPI::UpgradeType type, int level, TaskType taskType, std::list<CallBack> &callBacks = std::list<CallBack>());
00279 
00280         int addOrder(Order orderType, std::list<CallBack> &callBacks = std::list<CallBack>());
00281 
00282         void addProduce(BWAPI::UnitType type, int weight, int priority = 100, const Condition &unitCond = Condition(ConditionTest::None, true), const Condition &factoryCond = Condition(ConditionTest::None, true));
00283 
00284         void addNextBuild(BuildOrderID id, Condition condition);
00285 
00286         void addSquad(SquadType type, int count = 1);
00287 
00288         void setDefaultBuild(BuildOrderID fallbackBuild, int fallbackTime = 0);
00289 
00290         void setArmyBehaviour(ArmyBehaviour armyBehaiour);
00291 
00292         void setStartingCondition(Condition condition);
00293 
00294         BWAPI::Race getRace() const { return mRace; }
00295         BuildOrderID getID() const { return mID; }
00296         const std::string &getName() const { return mName; }
00297 
00298         const std::deque<BuildItem> &getBuildItems() const { return mItems; }
00299         const std::deque<OrderItem> &getOrderItems() const { return mOrders; }
00300         const std::list<UnitToProduce> &getUnitsToProduce() const { return mProduces; }
00301         const std::map<SquadType, int> &getSquads() const { return mSquads; }
00302 
00303         bool isStartBuild() const { return mStartingCondition.evauluate(); }
00304 
00305         ArmyBehaviour getArmyBehaiour() const { return mArmyBehaiour; }
00306 
00307         BuildOrderID getFallbackBuild() const { return mFallbackBuild; }
00308         int getFallbackTime() const { return mFallbackTime; }
00309         const std::map<BuildOrderID, Condition> &getNextBuilds() const { return mNextBuilds; }
00310 
00311 private:
00312         BWAPI::Race mRace;
00313         BuildOrderID mID;
00314         std::string mName;
00315 
00316         std::deque<BuildItem> mItems;
00317         std::deque<OrderItem> mOrders;
00318         std::list<UnitToProduce> mProduces;
00319         std::map<SquadType, int> mSquads;
00320 
00321         Condition mStartingCondition;
00322 
00323         ArmyBehaviour mArmyBehaiour;
00324 
00325         BuildOrderID mFallbackBuild;
00326         int mFallbackTime;
00327         std::map<BuildOrderID, Condition> mNextBuilds;
00328 
00329         int mItemCounter;
00330 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines