BWAPI
Undermind/proxy/cpp/ClientModule/ClientModule.h
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines