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