BWAPI
|
00001 #pragma once 00002 #include "Macro/Arbitrator.h" 00003 #include <BWAPI.h> 00004 #include <set> 00005 #include <map> 00006 00007 struct ProducingUnit 00008 { 00009 int lastAction; 00010 BWAPI::Unit* unit; 00011 ProducingUnit(BWAPI::Unit* u); 00012 explicit ProducingUnit(const ProducingUnit& pu); 00013 BWAPI::Unit* operator->() const; 00014 bool train(BWAPI::UnitType t); 00015 }; 00016 00017 class Producer : public Arbitrator::Controller<BWAPI::Unit*, double> 00018 { 00019 public: 00020 static Producer* create(); 00021 static void destroy(); 00022 inline bool checkCanProduce(BWAPI::UnitType t); 00023 inline bool checkCanTech(BWAPI::TechType t); 00024 inline bool checkCanUpgrade(BWAPI::UpgradeType t); 00025 inline bool checkHaveTech(BWAPI::UnitType ut); 00026 int willProduce(BWAPI::UnitType t); 00027 void produce(int number, BWAPI::UnitType t, int priority=20, int increment=1); 00028 void produceAlways(int number, BWAPI::UnitType t, int increment=1); 00029 void produceAdditional(int number, BWAPI::UnitType t, int priority=20, int increment=1); 00030 void researchTech(BWAPI::TechType t); 00031 void researchUpgrade(BWAPI::UpgradeType t); 00032 void update(); 00033 00034 void onUnitCreate(BWAPI::Unit* unit); 00035 void onUnitDestroy(BWAPI::Unit* unit); 00036 00037 virtual void onOffer(std::set<BWAPI::Unit*> units); 00038 virtual void onRevoke(BWAPI::Unit* unit, double bid); 00039 virtual std::string getName() const; 00040 private: 00041 std::multimap<BWAPI::UnitType, BWAPI::Unit*> _techStructures; 00042 std::multimap<BWAPI::UnitType, ProducingUnit> _producingStructures; 00043 std::list<BWAPI::Unit*> _techStructuresInConstruction; 00044 std::list<BWAPI::Unit*> _producingStructuresInConstruction; 00045 std::multimap<int, BWAPI::UnitType> _productionQueue; 00046 std::map<BWAPI::UnitType, std::pair<int, int> > _wantedNumbers; // UnitType->(minimum number, increment) 00047 std::list<BWAPI::TechType> _techsQueue; 00048 std::list<BWAPI::UpgradeType> _upgradesQueue; 00049 std::map<BWAPI::Unit*, BWAPI::TechType> _researchingTech; 00050 std::map<BWAPI::Unit*, BWAPI::UpgradeType> _researchingUpgrade; 00051 std::set<BWAPI::UnitType> _neededProductionBuildings; 00052 int additionalUnitsSupply(int frames=30*24); // UnitTypes::Protoss_Pylon.buildTime() 00053 const BWAPI::UnitType& mostSaturatedUT(); 00054 Producer(); 00055 ~Producer(); 00056 00057 inline void addToProducingStructures(BWAPI::Unit* u); 00058 inline void mergeArchons(); 00059 inline void freeMerging(); 00060 int _nbArchons; 00061 int _nbDarkArchons; 00062 std::map<BWAPI::Unit*, int> _htsMerging; 00063 std::map<BWAPI::Unit*, int> _dtsMerging; 00064 std::list<BWAPI::Unit*> _hts; 00065 std::list<BWAPI::Unit*> _dts; 00066 }; 00067 00068 extern Producer* TheProducer;