diff --git a/src/common/game_state/game_state.cpp b/src/common/game_state/game_state.cpp index 458294a4bb5273ae1ad047cc674215780d960f4f..78a0dd9152ef756c7389568bcea4a55e5ce80463 100644 --- a/src/common/game_state/game_state.cpp +++ b/src/common/game_state/game_state.cpp @@ -453,35 +453,22 @@ bool game_state::play_card(player* player, const std::string& card_id, std::stri bool game_state::remove_player(player *player_ptr, std::string &err) { - // only called when game hasn't been started yet - // get pointer of leaving player by id - if(player_ptr == nullptr) - { - std::cout << "Player does not exist." << std::endl; - } - std::cout << "Player" << player_ptr->get_id() << std::endl; - player* leaving_player = nullptr; - std::cout << "Loop started" << std::endl; - for (player* p : _players){ - if (player_ptr->get_player_name() == p->get_player_name()) { - leaving_player = p; + if (const int idx = get_player_index(player_ptr); idx != -1) { + // Case 1: Game has not been started yet. + if (_is_started->get_value() == false) { + if (idx < _current_player_idx->get_value()) { + // reduce current_player_idx if the player who left had a lower index + _current_player_idx->set_value(_current_player_idx->get_value() - 1); + } + _players.erase(_players.begin() + idx); + return true; + } else { + return finish_game(err); } - } - std::cout << "Loop ended" << std::endl; - - if (leaving_player == nullptr) { + } else { err = "Could not leave game, as the requested player was not found in that game."; return false; } - - const int idx = get_player_index(leaving_player); - - if (idx < _current_player_idx->get_value()) { - // reduce current_player_idx if the player who left had a lower index - _current_player_idx->set_value(_current_player_idx->get_value() - 1); - } - _players.erase(_players.begin() + idx); - return true; } bool game_state::add_player(player* player, std::string& err) diff --git a/src/server/game_instance.cpp b/src/server/game_instance.cpp index 9c844c0284e8d3409a51813efa05a4a6fd61f579..38d1ad651f7697b170f816d8c8ee83560cad0119 100644 --- a/src/server/game_instance.cpp +++ b/src/server/game_instance.cpp @@ -75,6 +75,15 @@ bool game_instance::start_game(player* player, std::string &err) { bool game_instance::try_remove_player(player *player, std::string &err) { modification_lock.lock(); + if(_game_state->remove_player(player, err)) + { + // player->set_game_id(""); + full_state_response state_update_msg = full_state_response(this->get_id(), *_game_state); + server_network_manager::broadcast_message(state_update_msg, _game_state->get_players(), player); + modification_lock.unlock(); + return true; + } + /* if (_game_state->is_started()) { // send state update to all other players _game_state->finish_game(err); @@ -82,7 +91,8 @@ bool game_instance::try_remove_player(player *player, std::string &err) { server_network_manager::broadcast_message(state_update_msg, _game_state->get_players(), player); modification_lock.unlock(); return true; - }// else if (_game_state->remove_player(player, err)){ + */ + //}// else if (_game_state->remove_player(player, err)){ // player->set_game_id(""); // send state update to all other players // full_state_response state_update_msg = full_state_response(this->get_id(), *_game_state); diff --git a/src/server/request_handler.cpp b/src/server/request_handler.cpp index c28844c990de5919d3e15b9da6b5fe91c07077a7..081e78c901f0926ed53a945a12ec252b12fe8e3c 100644 --- a/src/server/request_handler.cpp +++ b/src/server/request_handler.cpp @@ -129,26 +129,23 @@ request_response* request_handler::handle_request(const client_request* const re // ##################### LEAVE GAME ##################### // case RequestType::leave_game: { - - // Case 1: player is in a game //remove player from game via game instance manager -> game instance -> game state - std::cout << "Leave game request reached request handler." << std::endl; - if (game_instance_manager::try_remove_player(player, game_id, err)) { - std::cout << "Player successfully removed from the game " << std::endl; - return new request_response(game_instance_ptr->get_id(), req_id, true, - game_instance_ptr->get_game_state()->to_json(), err); + if (game_instance_manager::try_get_player_and_game_instance(player_id, player, game_instance_ptr, err)) { + if (game_instance_manager::try_remove_player(player, game_id, err)) { + std::cout << "Player successfully removed from the game " << std::endl; + if (player_manager::remove_player(player_id, player)){ + return new request_response(game_instance_ptr->get_id(), req_id, true, + game_instance_ptr->get_game_state()->to_json(), err); + } - //remove player from list of active players (delete from LUT table) - //if (player_manager::remove_player(player_id, player)){ - //} - } - // player not in game instance yet but already in LUT - //else if (player_manager::remove_player(player_id, player)) { - // return new request_response("", req_id, true, nullptr, err); - //} - else { - err = "Player was found neither in any game nor in lookup table."; + } + } // Case 2: player not in game yet but already in LUT + else if(player_manager::remove_player(player_id, player)) { + return new request_response(game_instance_ptr->get_id(), req_id, true, + game_instance_ptr->get_game_state()->to_json(), err); + } else { + err = "Player or game instance were not found."; return new request_response("", req_id, false, nullptr, err); } }