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