#ifndef MESSAGE_H #define MESSAGE_H #include #include using boost::make_shared; using boost::dynamic_pointer_cast; #include #include #include #include "action.h" #include "tile.h" namespace Message { namespace Types { //! Message types. enum Type { Undefined, Hello, Login, LoginResponse, LobbyStatus, LobbyAction, GameStart, Ready, RoundStart, RoundState, RoundAction, RoundEnd, GameEnd }; } using Types::Type; class Base { protected: Base(Type t) : type(t) {} virtual ~Base() {} public: const Type type; }; class Hello : public Base { public: typedef boost::shared_ptr p; Hello(const std::string& v = "") : Base(Types::Hello), version(v) {} std::string version; template void serialize(Archive & ar, const unsigned int v) { ar & version; } }; class Login : public Base { public: typedef boost::shared_ptr p; Login(const std::string& n = "") : Base(Types::Login), nick(n) {} std::string nick; template void serialize(Archive & ar, const unsigned int v) { ar & nick; } }; class LoginResponse : public Base { public: typedef boost::shared_ptr p; LoginResponse(bool ok = false) : Base(Types::LoginResponse), login_ok(ok) {} bool login_ok; template void serialize(Archive & ar, const unsigned int v) { ar & login_ok; } }; class LobbyStatus : public Base { public: typedef boost::shared_ptr p; LobbyStatus() : Base(Types::LobbyStatus) {} std::vector game_modes; template void serialize(Archive & ar, const unsigned int v) { ar & game_modes; } }; class LobbyAction : public Base { public: typedef boost::shared_ptr p; LobbyAction(int i = 0) : Base(Types::LobbyAction), index(i) {} int index; template void serialize(Archive & ar, const unsigned int v) { ar & index; } }; class GameStart : public Base { public: typedef boost::shared_ptr p; GameStart() : Base(Types::GameStart) {} std::vector players; int player_id; template void serialize(Archive & ar, const unsigned int v) { ar & players; ar & player_id; } }; class Ready : public Base { public: typedef boost::shared_ptr p; Ready() : Base(Types::Ready) {} template void serialize(Archive & ar, const unsigned int v) { } }; class RoundStart : public Base { public: typedef boost::shared_ptr p; RoundStart() : Base(Types::RoundStart) {} template void serialize(Archive & ar, const unsigned int v) { } }; class RoundState : public Base { public: typedef boost::shared_ptr p; // Player contents. struct Player { //! Concealed tiles in hand. Tiles hand; //! Open tiles in hand. Tilegroups open; //! Discarded tiles. Tiles pond; template void serialize(Archive & ar, const unsigned int v) { ar & hand; ar & open; ar & pond; } }; RoundState() : Base(Types::RoundState) {} RoundState(const Player& pl_d, const Player& pl_r, const Player& pl_u, const Player& pl_l, const Tiles& d, const Actions& a, int p) : Base(Types::RoundState), dora(d), possible_actions(a), current_player(p) { players[0] = pl_d; players[1] = pl_r; players[2] = pl_u; players[3] = pl_l; } //! Players. Player players[4]; //! List of dora/kandora. Tiles dora; //! List of actions client must return one of. Actions possible_actions; //! Current player, relative to client. 0 = self, 1 = shimocha and so on. int current_player; template void serialize(Archive & ar, const unsigned int v) { ar & players; ar & dora; ar & possible_actions; ar & current_player; } }; class RoundAction : public Base { public: typedef boost::shared_ptr p; RoundAction() : Base(Types::RoundAction) {} Action action; template void serialize(Archive & ar, const unsigned int v) { ar & action; } }; class RoundEnd : public Base { public: typedef boost::shared_ptr p; RoundEnd() : Base(Types::RoundEnd) {} template void serialize(Archive & ar, const unsigned int v) { } }; typedef boost::shared_ptr p; }; #endif