From da7c7fb6354f7bc8f2cb18b4874fcd7f63c1a419 Mon Sep 17 00:00:00 2001 From: marie3003 <marie.viktoria.becker@gmail.com> Date: Sun, 15 Dec 2024 00:32:24 +0100 Subject: [PATCH] leave game early works now --- src/common/game_state/game_state.cpp | 37 +++++++++------------------- src/server/game_instance.cpp | 12 ++++++++- src/server/request_handler.cpp | 31 +++++++++++------------ 3 files changed, 37 insertions(+), 43 deletions(-) diff --git a/src/common/game_state/game_state.cpp b/src/common/game_state/game_state.cpp index 458294a..78a0dd9 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 9c844c0..38d1ad6 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 c28844c..081e78c 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); } } -- GitLab