BWAPI
|
00001 #pragma once 00002 00003 #include "aimodule.pb.h" 00004 #include <BWAPI.h> 00005 #include <boost/format.hpp> 00006 #include <set> 00007 #include <BWTA.h> 00008 #include <google/protobuf/repeated_field.h> 00009 #include <hash_map> 00010 #include <hash_set> 00011 #include <string> 00012 #include "netstream.h" 00013 00014 #include <fstream> 00015 00016 #include <google/protobuf/io/zero_copy_stream_impl.h> 00017 #include "terrainanalysis.h" 00018 00019 00020 class ClientModule : public BWAPI::AIModule 00021 { 00022 messages::FrameMessage frameMessage; 00023 NetStream* proxyBotSocket; 00024 TerrainAnalysis terrain; 00025 stdext::hash_map<int,BWAPI::Unit*> unitMap; 00026 std::set<BWAPI::Unit*> registeredUnits; 00027 00028 std::string stringbuf; 00029 std::ofstream log_; 00030 00031 void log(const std::string& out) { log(boost::format(out)); } 00032 void log(const boost::format& format); 00033 00034 bool writeMessageToStream(std::ostream& out, const google::protobuf::Message& message); 00035 bool readMessageFromStream(std::istream& out, google::protobuf::Message& message); 00036 void handleCommands(const messages::FrameCommands& commands); 00037 void registerUnit(messages::FrameMessage& frameMessage, BWAPI::Unit* u); 00038 void handleBotDefeated(const std::string& botName, const std::string& botCode, const std::string& playerName); 00039 public: 00040 ClientModule(); 00041 virtual void onStart(); 00042 virtual void onFrame(); 00043 virtual void onEnd(bool isWinner); 00044 virtual void onUnitCreate(BWAPI::Unit* unit); 00045 virtual void onUnitDestroy(BWAPI::Unit* unit); 00046 virtual void onSendText(std::string text); 00047 00048 00050 virtual void onReceiveText(BWAPI::Player* player, std::string text); 00051 00053 virtual void onPlayerLeft(BWAPI::Player* player); 00054 00059 virtual void onNukeDetect(BWAPI::Position target); 00060 00064 virtual void onUnitMorph(BWAPI::Unit* unit); 00065 00068 virtual void onUnitShow(BWAPI::Unit* unit); 00069 00073 virtual void onUnitHide(BWAPI::Unit* unit); 00074 00076 virtual void onUnitRenegade(BWAPI::Unit* unit); 00077 00078 // TODO: Add Doxygen documentation 00079 virtual void onSaveGame(std::string gameName); 00080 00081 }; 00082 00083 00084 // needs to be a macro to get laziness 00085 #define SET_ID(source, target) if( (source) != 0) target->set_id( (source)->getID()) 00086 00087 template<typename Container, typename P2> 00088 void set_ids(const Container& c, google::protobuf::RepeatedPtrField<P2>* ptr) { 00089 ptr->Reserve(c.size()); 00090 for(typename Container::const_iterator iter = c.begin(); iter != c.end(); ++iter) { 00091 SET_ID(*iter, ptr->Add()); 00092 } 00093 }