#include "lobby.h" #include #include #include "game.h" void Lobby::handle_connect(Connection::p connection) { // Send Hello. connection->send(make_shared("aotenjoud git")); // Wait for Login. connection->recv(boost::bind(&Lobby::handle_login, this, connection, _1)); // Get another connection. server.get_connection(boost::bind(&Lobby::handle_connect, this, _1)); } void Lobby::handle_login(Connection::p connection, Message::p msg) { if(msg->type != Message::Types::Login) { return; } Message::Login::p login_msg = dynamic_pointer_cast(msg); Client::p client; // Check if this is a reconnection attempt and whether a reconnection is possible. if(login_msg->cookie && (client = Client::exists(login_msg))) { client->reconnect(connection); return; } // Validate nick. if(login_msg->nick.size() == 0) { connection->send(make_shared(Message::LoginResponse::Invalid)); connection->recv(boost::bind(&Lobby::handle_login, this, connection, _1)); return; } // Create a new client. client = Client::create(connection, login_msg->nick); std::vector game_modes; game_modes.push_back("1p test mode"); game_modes.push_back("4p test mode"); client->lobby_status(game_modes, boost::bind(&Lobby::handle_action, this, client, _1)); } void Lobby::handle_action(Client::p client, int game_mode) { std::cout << "Client " << client->nick() << " joined a game." << std::endl; switch(game_mode) { case 0: { Game::create(client, make_shared(), make_shared(), make_shared()); } break; case 1: { if(waiting.size() >= 3) { Game::create(waiting[0], waiting[1], waiting[2], client); waiting.clear(); } else { waiting.push_back(client); } } break; } } Lobby::Lobby() : server(io_service) { } void Lobby::run() { // Get a connection. server.get_connection(boost::bind(&Lobby::handle_connect, this, _1)); io_service.run(); }