#ifndef GAME_H #define GAME_H #include #include #include #include "wall.h" #include "client.h" #include "../common/action.h" #include "../common/state.h" #include "gamevariant.h" #include "standard.h" class Game : public boost::enable_shared_from_this { public: typedef boost::shared_ptr p; static p create(Client::p player_1, Client::p player_2, Client::p player_3, Client::p player_4); ~Game(); private: std::vector players; class Player { public: Client::p client; Tiles hand; Tiles open; Tiles pond; bool riichi; //! Prepare for a new round. void round_start(); //! Get a state snapshot. State::Player get_state(); //! Get a state snapshot, with concealed tiles filtered. State::Player get_state_filtered(); //! Get possible actions after a draw. Actions get_actions_draw(); //! Get possible actions on discarded tile. Actions get_actions_discard(Tile tile); typedef std::vector Targets; //! Check if tile can be called for a chi. Targets can_chi(Tile tile); //! Check if tile can be called for a pon. int can_pon(Tile tile); //! Check if it's possible to make a concealed kan or extend an open kan. Targets can_kan(); // Check if tile can be called to kan target. bool can_kan(Tile tile, int target); //! Draw tile. void draw(Tile tile); //! Discard tile. void discard(int target); //! Look at last discard in pond. Tile last_discard(); //! Claim last discard from pond. Tile claim(); }; int waiting_players; Game(Client::p player_1, Client::p player_2, Client::p player_3, Client::p player_4); GameVariant *ruleset; //! Handle Ready message from player. void handle_ready(); //! Start the game. void start(); void round_start(); void round_update(); void handle_action(Action action); void round_end(); }; #endif