#ifndef CLIENT_H #define CLIENT_H #include #include #include #include #include #include "connection.h" //! Abstract client base class. class ClientBase { public: typedef boost::shared_ptr p; virtual ~ClientBase() {} //! Return client's id. virtual unsigned int id() = 0; //! Return client's nick. virtual std::string nick() = 0; //! Notify client of a game start. virtual void game_start(boost::function callback, std::vector players) = 0; //! Notify client of a round start. virtual void round_start() = 0; //! Send round state. virtual void round_state(const PlayerState& pl_d, const PlayerState& pl_r, const PlayerState& pl_u, const PlayerState& pl_l, const GameState& g, const Actions& a) = 0; //! Send round end. virtual void round_end(boost::function callback) = 0; //! Get action. Upon connection error, last element of expected_actions will be provided. virtual void get_action(boost::function callback, Actions expected_actions) = 0; }; //! Class implementing ClientBase for real clients. class Client : public ClientBase, public boost::enable_shared_from_this { public: typedef boost::shared_ptr p; static p create(Connection::p c, boost::function f); private: Connection::p connection; boost::asio::deadline_timer timer; unsigned int id_; std::string nick_; Client(Connection::p c); //! Start communicating. void start(boost::function f); //! Handle Login-message. void handle_login(Message::p msg, boost::function login_callback); //! Handle LobbyAction-message. void handle_lobby(Message::p msg, boost::function lobby_callback); //! Handle Ready-message. void handle_ready(Message::p msg, boost::function ready_callback); //! Handle Action-message. void handle_action(Message::p msg, boost::function action_callback, Actions expected_actions); public: //! Inform client of lobby status (available game modes). void lobby_status(const std::vector& game_modes, boost::function callback); //! Return client's id. virtual unsigned int id(); //! Return client's nick. virtual std::string nick(); //! Notify client of a game start. virtual void game_start(boost::function callback, std::vector players); //! Notify client of a round start. virtual void round_start(); //! Send round state. virtual void round_state(const PlayerState& pl_d, const PlayerState& pl_r, const PlayerState& pl_u, const PlayerState& pl_l, const GameState& g, const Actions& a); //! Send round end. virtual void round_end(boost::function callback); //! Get action. Upon connection error, last element of expected_actions will be provided. virtual void get_action(boost::function callback, Actions expected_actions); //! Dis-connect a player. virtual void disconnect(); //! Re-connect a player. virtual void reconnect(Connection::p c); }; typedef std::vector Clients; class ClientDumb : public ClientBase { public: virtual unsigned int id(); virtual std::string nick(); virtual void game_start(boost::function callback, std::vector players); virtual void round_start(); virtual void round_state(const PlayerState& pl_d, const PlayerState& pl_r, const PlayerState& pl_u, const PlayerState& pl_l, const GameState& g, const Actions& a); virtual void round_end(boost::function callback); virtual void get_action(boost::function callback, Actions expected_actions); }; #endif